geonetwork-ui 2.4.0-dev.cec60ff1 → 2.4.0-dev.e079151e

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 (213) hide show
  1. package/esm2022/libs/api/metadata-converter/src/index.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +2 -1
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +5 -5
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +30 -2
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.mjs +31 -0
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +23 -1
  8. package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +6 -1
  9. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +12 -1
  10. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  11. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  12. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +2 -6
  13. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +2 -1
  14. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +3 -3
  15. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +7 -2
  16. package/esm2022/libs/feature/editor/src/lib/+state/editor.models.mjs +1 -1
  17. package/esm2022/libs/feature/editor/src/lib/+state/editor.reducer.mjs +7 -3
  18. package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +16 -6
  19. package/esm2022/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.mjs +138 -0
  20. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.mjs +21 -0
  21. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +19 -9
  22. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +1 -2
  23. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +12 -7
  24. package/esm2022/libs/feature/editor/src/lib/expressions.mjs +1 -1
  25. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +153 -60
  26. package/esm2022/libs/feature/editor/src/lib/models/editor-config.model.mjs +2 -0
  27. package/esm2022/libs/feature/editor/src/lib/models/index.mjs +2 -1
  28. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +4 -3
  29. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +3 -4
  30. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +42 -23
  31. package/esm2022/libs/feature/record/src/lib/data-view-share/data-view-share.component.mjs +13 -5
  32. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +49 -15
  33. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +9 -3
  34. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -3
  35. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +5 -11
  36. package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +3 -3
  37. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +5 -2
  38. package/esm2022/libs/ui/elements/src/lib/user-preview/user-preview.component.mjs +3 -3
  39. package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +11 -5
  40. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +29 -0
  41. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +15 -7
  42. package/esm2022/libs/ui/widgets/src/index.mjs +2 -1
  43. package/esm2022/libs/ui/widgets/src/lib/popover/popover.component.mjs +68 -0
  44. package/esm2022/translations/de.json +58 -32
  45. package/esm2022/translations/en.json +34 -8
  46. package/esm2022/translations/es.json +31 -5
  47. package/esm2022/translations/fr.json +34 -8
  48. package/esm2022/translations/it.json +32 -6
  49. package/esm2022/translations/nl.json +31 -5
  50. package/esm2022/translations/pt.json +31 -5
  51. package/fesm2022/geonetwork-ui.mjs +937 -236
  52. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  53. package/libs/api/metadata-converter/src/index.d.ts +1 -0
  54. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  55. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  56. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +1 -0
  57. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  58. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
  59. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +8 -1
  60. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  61. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts +5 -0
  62. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts.map +1 -0
  63. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -1
  64. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  65. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +1 -0
  66. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  67. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +1 -0
  68. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  69. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +2 -1
  70. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  71. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +9 -0
  72. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  73. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  74. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +5 -0
  75. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -1
  76. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +4 -4
  77. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
  78. package/libs/feature/editor/src/lib/+state/editor.models.d.ts +8 -0
  79. package/libs/feature/editor/src/lib/+state/editor.models.d.ts.map +1 -1
  80. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +4 -3
  81. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -1
  82. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +4 -8
  83. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -1
  84. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts +27 -0
  85. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts.map +1 -0
  86. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts +11 -0
  87. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts.map +1 -0
  88. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +6 -2
  89. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  90. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts +0 -1
  91. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -1
  92. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts +5 -7
  93. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -1
  94. package/libs/feature/editor/src/lib/expressions.d.ts +1 -1
  95. package/libs/feature/editor/src/lib/expressions.d.ts.map +1 -1
  96. package/libs/feature/editor/src/lib/fields.config.d.ts +39 -2
  97. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  98. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts +36 -0
  99. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts.map +1 -0
  100. package/libs/feature/editor/src/lib/models/index.d.ts +1 -0
  101. package/libs/feature/editor/src/lib/models/index.d.ts.map +1 -1
  102. package/libs/feature/editor/src/lib/services/editor.service.d.ts +2 -2
  103. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  104. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  105. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +4 -1
  106. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  107. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts +4 -1
  108. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts.map +1 -1
  109. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +4 -1
  110. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  111. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +3 -1
  112. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  113. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  114. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +0 -3
  115. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  116. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +1 -1
  117. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +7 -6
  118. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  119. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +4 -2
  120. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -1
  121. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +11 -0
  122. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -0
  123. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +4 -2
  124. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  125. package/libs/ui/widgets/src/index.d.ts +1 -0
  126. package/libs/ui/widgets/src/index.d.ts.map +1 -1
  127. package/libs/ui/widgets/src/lib/popover/popover.component.d.ts +19 -0
  128. package/libs/ui/widgets/src/lib/popover/popover.component.d.ts.map +1 -0
  129. package/package.json +1 -1
  130. package/src/libs/api/metadata-converter/src/index.ts +1 -0
  131. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -1
  132. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +37 -12
  133. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +5 -1
  134. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +1 -0
  135. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +1 -0
  136. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +4 -2
  137. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +72 -2
  138. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.ts +39 -0
  139. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +70 -1
  140. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +8 -0
  141. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +20 -0
  142. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -1
  143. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +12 -0
  144. package/src/libs/common/fixtures/src/index.ts +2 -0
  145. package/src/libs/common/fixtures/src/lib/editor/editor.fixtures.ts +156 -0
  146. package/src/libs/common/fixtures/src/lib/editor/index.ts +1 -0
  147. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +1 -5
  148. package/src/libs/data-access/gn4/src/spec.yaml +0 -8
  149. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +5 -0
  150. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +2 -2
  151. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +9 -1
  152. package/src/libs/feature/editor/src/lib/+state/editor.models.ts +11 -0
  153. package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +11 -5
  154. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +22 -8
  155. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +3 -1
  156. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +117 -21
  157. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.css +0 -0
  158. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.html +5 -0
  159. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.ts +22 -0
  160. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +15 -9
  161. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +15 -2
  162. package/src/libs/feature/editor/src/lib/components/record-form/form-field/index.ts +0 -1
  163. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +51 -11
  164. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +16 -8
  165. package/src/libs/feature/editor/src/lib/expressions.ts +1 -1
  166. package/src/libs/feature/editor/src/lib/fields.config.ts +186 -61
  167. package/src/libs/feature/editor/src/lib/models/editor-config.model.ts +53 -0
  168. package/src/libs/feature/editor/src/lib/models/index.ts +1 -0
  169. package/src/libs/feature/editor/src/lib/services/editor.service.ts +8 -4
  170. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +2 -3
  171. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +36 -19
  172. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.html +6 -2
  173. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.ts +11 -0
  174. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +59 -12
  175. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  176. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +5 -0
  177. package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +29 -29
  178. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +14 -20
  179. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +0 -10
  180. package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.html +1 -1
  181. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -1
  182. package/src/libs/ui/elements/src/lib/user-preview/user-preview.component.html +1 -1
  183. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +1 -1
  184. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +7 -2
  185. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.css +31 -0
  186. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.html +15 -0
  187. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.ts +38 -0
  188. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.css +0 -0
  189. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +17 -0
  190. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +22 -0
  191. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +9 -0
  192. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +26 -12
  193. package/src/libs/ui/widgets/src/index.ts +1 -0
  194. package/src/libs/ui/widgets/src/lib/popover/popover.component.css +0 -0
  195. package/src/libs/ui/widgets/src/lib/popover/popover.component.html +3 -0
  196. package/src/libs/ui/widgets/src/lib/popover/popover.component.ts +85 -0
  197. package/tailwind.base.css +2 -1
  198. package/translations/de.json +58 -32
  199. package/translations/en.json +34 -8
  200. package/translations/es.json +31 -5
  201. package/translations/fr.json +34 -8
  202. package/translations/it.json +32 -6
  203. package/translations/nl.json +31 -5
  204. package/translations/pt.json +31 -5
  205. package/translations/sk.json +32 -6
  206. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.mjs +0 -2
  207. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +0 -2
  208. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts +0 -26
  209. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts.map +0 -1
  210. package/libs/feature/editor/src/lib/models/fields.model.d.ts +0 -15
  211. package/libs/feature/editor/src/lib/models/fields.model.d.ts.map +0 -1
  212. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.ts +0 -43
  213. package/src/libs/feature/editor/src/lib/models/fields.model.ts +0 -29
@@ -1,7 +1,10 @@
1
1
  import { parseXml, XmlDocument, XmlElement, XmlText } from '@rgrove/parse-xml';
2
+ import GML32 from 'ol/format/GML32';
3
+ import GeoJSON from 'ol/format/GeoJSON';
4
+ import { parse as parse$1 } from 'ol/xml';
2
5
  import format from 'date-fns/format';
3
6
  import * as i0 from '@angular/core';
4
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ElementRef, ViewChildren, ViewContainerRef, HostBinding, ContentChild, ContentChildren, TemplateRef, Host, Pipe, inject } from '@angular/core';
7
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, TemplateRef, ElementRef, ViewChildren, ViewContainerRef, HostBinding, ContentChild, ContentChildren, Host, Pipe, inject } from '@angular/core';
5
8
  import * as i1 from '@angular/common/http';
6
9
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpClientXsrfModule } from '@angular/common/http';
7
10
  import * as i1$1 from '@ngx-translate/core';
@@ -23,7 +26,6 @@ import 'ol/Feature';
23
26
  import { Circle, Fill, Stroke, Style as Style$1 } from 'ol/style';
24
27
  import Style, { createDefaultStyle } from 'ol/style/Style';
25
28
  import { extend, isEmpty } from 'ol/extent';
26
- import GeoJSON from 'ol/format/GeoJSON';
27
29
  import { transformExtent, fromLonLat } from 'ol/proj';
28
30
  import ImageWMS from 'ol/source/ImageWMS';
29
31
  import TileWMS from 'ol/source/TileWMS';
@@ -54,19 +56,20 @@ import * as i2$2 from '@angular/forms';
54
56
  import { FormsModule, ReactiveFormsModule, UntypedFormControl, FormArray, FormControl } from '@angular/forms';
55
57
  import * as i2$1 from '@angular/material/autocomplete';
56
58
  import { MatAutocompleteTrigger, MatAutocomplete, MatAutocompleteModule } from '@angular/material/autocomplete';
57
- import * as i3$1 from 'ngx-dropzone';
59
+ import * as i3$2 from 'ngx-dropzone';
58
60
  import { NgxDropzoneModule } from 'ngx-dropzone';
59
61
  import * as i5 from 'ngx-chips';
60
62
  import { TagInputModule } from 'ngx-chips';
61
63
  import * as i1$4 from '@angular/material/progress-spinner';
62
64
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
65
+ import tippy from 'tippy.js';
63
66
  import * as i3 from '@angular/material/core';
64
67
  import { MatNativeDateModule, MAT_DATE_LOCALE, DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
65
68
  import * as i1$5 from '@angular/material/checkbox';
66
69
  import { MatCheckboxModule } from '@angular/material/checkbox';
67
- import * as i2$3 from '@angular/material/tooltip';
70
+ import * as i3$1 from '@angular/material/tooltip';
68
71
  import { MatTooltipModule } from '@angular/material/tooltip';
69
- import * as i2$4 from '@angular/material/datepicker';
72
+ import * as i2$3 from '@angular/material/datepicker';
70
73
  import { MatDatepickerModule } from '@angular/material/datepicker';
71
74
  import * as i1$6 from '@angular/cdk/overlay';
72
75
  import { CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';
@@ -81,9 +84,10 @@ import { moveItemInArray, CdkDropList, CdkDrag, CdkDragHandle } from '@angular/c
81
84
  import EmblaCarousel from 'embla-carousel';
82
85
  import { formatDistance } from 'date-fns';
83
86
  import { enUS, sk, pt as pt$1, nl as nl$1, it as it$1, es as es$1, de as de$1, fr as fr$1 } from 'date-fns/locale';
87
+ import * as i2$4 from '@angular/material/menu';
88
+ import { MatMenuTrigger, MatMenuModule } from '@angular/material/menu';
84
89
  import * as i1$8 from '@ngrx/effects';
85
90
  import { createEffect, ofType, EffectsModule, Actions } from '@ngrx/effects';
86
- import tippy from 'tippy.js';
87
91
  import { valid as valid$1 } from 'geojson-validation';
88
92
  import { Polygon } from 'ol/geom';
89
93
  import { queryDataGouvFr, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
@@ -95,13 +99,13 @@ import * as i2$6 from '@angular/material/sort';
95
99
  import { MatSort, MatSortModule } from '@angular/material/sort';
96
100
  import * as i1$9 from '@angular/material/table';
97
101
  import { MatTableModule } from '@angular/material/table';
98
- import * as i3$2 from 'ng-table-virtual-scroll';
102
+ import * as i3$3 from 'ng-table-virtual-scroll';
99
103
  import { TableVirtualScrollDataSource, TableVirtualScrollModule } from 'ng-table-virtual-scroll';
100
104
  import * as Papa from 'papaparse';
101
105
  import parseDate from 'date-fns/parse';
102
106
  import parseIsoDate from 'date-fns/parseISO';
103
107
  import { MomentDateAdapter, MAT_MOMENT_DATE_ADAPTER_OPTIONS } from '@angular/material-moment-adapter';
104
- import * as i3$3 from '@ngrx/router-store';
108
+ import * as i3$4 from '@ngrx/router-store';
105
109
  import { getRouterSelectors, routerReducer, StoreRouterConnectingModule, FullRouterStateSerializer } from '@ngrx/router-store';
106
110
  import { navigation } from '@ngrx/router-store/data-persistence';
107
111
 
@@ -269,6 +273,9 @@ function allChildrenElement(element) {
269
273
  ...element.children.filter((el) => el instanceof XmlElement),
270
274
  ];
271
275
  }
276
+ function firstChildElement(element) {
277
+ return allChildrenElement(element)[0] ?? null;
278
+ }
272
279
  /**
273
280
  * Will return all matching elements nested according to the given
274
281
  * names (similar to a path), starting form the input element;
@@ -427,10 +434,12 @@ function getTreeRoot(element) {
427
434
  }
428
435
  // stays on the parent element
429
436
  // if the given elements are part of a subtree, will add the root of subtree
437
+ // will filter out falsy elements
430
438
  function appendChildren(...childrenFns) {
431
439
  return (element) => {
432
440
  if (!element)
433
441
  return null;
442
+ childrenFns = childrenFns.filter((fn) => fn);
434
443
  element.children.push(...childrenFns.map((fn) => fn()).map(getTreeRoot));
435
444
  element.children.forEach((el) => (el.parent = element));
436
445
  return element;
@@ -559,6 +568,33 @@ function matchMimeType(format) {
559
568
  return format || null;
560
569
  }
561
570
 
571
+ function readGeometry(el) {
572
+ const xmlDoc = createDocument(el);
573
+ xmlDoc.root.attributes['xmlns'] = 'http://www.opengis.net/gml/3.2';
574
+ const gmlString = xmlToString(xmlDoc);
575
+ const doc = parse$1(gmlString);
576
+ // we need an intermediate node to be able to parse the GML
577
+ const node = document.createElement('pre');
578
+ node.appendChild(doc.documentElement);
579
+ const gml32Format = new GML32();
580
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
581
+ // @ts-ignore
582
+ const geometry = gml32Format.readGeometryFromNode(node);
583
+ const geojsonFormat = new GeoJSON();
584
+ return geojsonFormat.writeGeometryObject(geometry);
585
+ }
586
+ function writeGeometry(geometryObject) {
587
+ const geojsonFormat = new GeoJSON();
588
+ const geometry = geojsonFormat.readGeometry(geometryObject);
589
+ const gml32Format = new GML32();
590
+ const node = gml32Format.writeGeometryNode(geometry);
591
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
592
+ // @ts-ignore
593
+ const element = node.firstElementChild;
594
+ const gmlString = new XMLSerializer().serializeToString(element);
595
+ return getRootElement(parseXmlString(gmlString));
596
+ }
597
+
562
598
  /**
563
599
  * Parts are [firstName, lastName]
564
600
  * Second part will be null if no separation could be done
@@ -727,6 +763,9 @@ function extractCharacterString() {
727
763
  function extractDateTime() {
728
764
  return pipe(fallback(findChildElement('gco:DateTime', false), findChildElement('gco:Date', false)), readText(), map((dateStr) => (dateStr ? new Date(dateStr) : null)));
729
765
  }
766
+ function extractDecimal() {
767
+ return pipe(findChildElement('gco:Decimal', false), readText(), map((numberStr) => (numberStr ? Number(numberStr) : null)));
768
+ }
730
769
  function extractUrl() {
731
770
  const getUrl = pipe(findChildElement('gmd:URL', false), readText());
732
771
  const getCharacterString = pipe(findChildElement('gco:CharacterString', false), readText());
@@ -1084,6 +1123,30 @@ function readTemporalExtents(rootEl) {
1084
1123
  }
1085
1124
  }))(rootEl);
1086
1125
  }
1126
+ function readSpatialExtents(rootEl) {
1127
+ const extractGeometry = (rootEl) => {
1128
+ if (!rootEl)
1129
+ return null;
1130
+ return pipe(findChildElement('gmd:polygon', false), firstChildElement, map((el) => readGeometry(el)))(rootEl);
1131
+ };
1132
+ const extractBBox = (rootEl) => {
1133
+ if (!rootEl)
1134
+ return null;
1135
+ return pipe(combine(pipe(findChildElement('gmd:westBoundLongitude'), extractDecimal()), pipe(findChildElement('gmd:southBoundLatitude'), extractDecimal()), pipe(findChildElement('gmd:eastBoundLongitude'), extractDecimal()), pipe(findChildElement('gmd:northBoundLatitude'), extractDecimal())))(rootEl);
1136
+ };
1137
+ const extractDescription = (rootEl) => {
1138
+ if (!rootEl)
1139
+ return null;
1140
+ return pipe(findNestedElement('gmd:geographicIdentifier', 'gmd:MD_Identifier', 'gmd:code'), extractCharacterString())(rootEl);
1141
+ };
1142
+ return pipe(findIdentification(), findNestedElements('gmd:extent', 'gmd:EX_Extent', 'gmd:geographicElement'), mapArray(combine(pipe(findChildElement('gmd:EX_BoundingPolygon'), extractGeometry), pipe(findChildElement('gmd:EX_GeographicBoundingBox'), extractBBox), pipe(findChildElement('gmd:EX_GeographicDescription'), extractDescription))), mapArray(([geometry, bbox, description]) => {
1143
+ return {
1144
+ ...(geometry && { geometry }),
1145
+ ...(bbox && { bbox }),
1146
+ ...(description && { description }),
1147
+ };
1148
+ }))(rootEl);
1149
+ }
1087
1150
 
1088
1151
  function writeCharacterString(text) {
1089
1152
  return tap(pipe(findChildOrCreate('gco:CharacterString'), setTextContent(text)));
@@ -1100,6 +1163,9 @@ function writeDateTime(date) {
1100
1163
  function writeDate(date) {
1101
1164
  return tap(pipe(findChildOrCreate('gco:Date'), setTextContent(format(date, 'yyyy-MM-dd'))));
1102
1165
  }
1166
+ function writeDecimal(decimal) {
1167
+ return tap(pipe(findChildOrCreate('gco:Decimal'), setTextContent(decimal.toString())));
1168
+ }
1103
1169
  function getProgressCode(status) {
1104
1170
  switch (status) {
1105
1171
  case 'completed':
@@ -1493,6 +1559,24 @@ function writeTemporalExtents(record, rootEl) {
1493
1559
  ? setTextContent(format(extent.start, 'yyyy-MM-dd'))
1494
1560
  : addAttribute('indeterminatePosition', 'unknown'))))))))))(rootEl);
1495
1561
  }
1562
+ function writeSpatialExtents(record, rootEl) {
1563
+ const appendBoundingPolygon = (geometry) => {
1564
+ if (!geometry)
1565
+ return null;
1566
+ return pipe(createElement('gmd:EX_BoundingPolygon'), appendChildren(pipe(createElement('gmd:polygon'), appendChildren(() => writeGeometry(geometry)))));
1567
+ };
1568
+ const appendGeographicBoundingBox = (bbox) => {
1569
+ if (!bbox)
1570
+ return null;
1571
+ return pipe(createElement('gmd:EX_GeographicBoundingBox'), appendChildren(pipe(createElement('gmd:westBoundLongitude'), writeDecimal(bbox[0])), pipe(createElement('gmd:eastBoundLongitude'), writeDecimal(bbox[2])), pipe(createElement('gmd:southBoundLatitude'), writeDecimal(bbox[1])), pipe(createElement('gmd:northBoundLatitude'), writeDecimal(bbox[3]))));
1572
+ };
1573
+ const appendGeographicDescription = (description) => {
1574
+ if (!description)
1575
+ return null;
1576
+ return pipe(createElement('gmd:EX_GeographicDescription'), createChild('gmd:geographicIdentifier'), createChild('gmd:MD_Identifier'), createChild('gmd:code'), writeCharacterString(description));
1577
+ };
1578
+ pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:extent', 'gmd:EX_Extent'), removeChildrenByName('gmd:geographicElement'), appendChildren(...record.spatialExtents.map((extent) => pipe(createElement('gmd:geographicElement'), appendChildren(appendBoundingPolygon(extent.geometry), appendGeographicBoundingBox(extent.bbox), appendGeographicDescription(extent.description))))))(rootEl);
1579
+ }
1496
1580
 
1497
1581
  class Iso19139Converter extends BaseConverter {
1498
1582
  constructor() {
@@ -1525,8 +1609,8 @@ class Iso19139Converter extends BaseConverter {
1525
1609
  distributions: readDistributions$1,
1526
1610
  onlineResources: readOnlineResources,
1527
1611
  temporalExtents: readTemporalExtents,
1612
+ spatialExtents: readSpatialExtents,
1528
1613
  // TODO
1529
- spatialExtents: () => [],
1530
1614
  extras: () => undefined,
1531
1615
  landingPage: () => undefined,
1532
1616
  languages: () => [],
@@ -1559,8 +1643,8 @@ class Iso19139Converter extends BaseConverter {
1559
1643
  distributions: writeDistributions$1,
1560
1644
  onlineResources: writeOnlineResources,
1561
1645
  temporalExtents: writeTemporalExtents,
1646
+ spatialExtents: () => writeSpatialExtents,
1562
1647
  // TODO
1563
- spatialExtents: () => undefined,
1564
1648
  extras: () => undefined,
1565
1649
  landingPage: () => undefined,
1566
1650
  languages: () => undefined,
@@ -2176,6 +2260,7 @@ const mapKeywords = (thesauri, language) => {
2176
2260
  keywords.push({
2177
2261
  label: selectTranslatedValue(keyword, language),
2178
2262
  type: getKeywordTypeFromKeywordTypeCode(rawThesaurus.theme),
2263
+ ...(keyword.link && { key: keyword.link }),
2179
2264
  ...(thesaurus && { thesaurus }),
2180
2265
  });
2181
2266
  }
@@ -8641,11 +8726,7 @@ class RecordsApiService {
8641
8726
  headers = headers.set('Accept', httpHeaderAcceptSelected);
8642
8727
  }
8643
8728
  // to determine the Content-Type header
8644
- const consumes = [
8645
- 'application/xml',
8646
- 'application/json',
8647
- 'application/x-www-form-urlencoded',
8648
- ];
8729
+ const consumes = ['application/xml'];
8649
8730
  const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
8650
8731
  if (httpContentTypeSelected !== undefined) {
8651
8732
  headers = headers.set('Content-Type', httpContentTypeSelected);
@@ -17472,38 +17553,63 @@ var de = {
17472
17553
  "downloads.format.unknown": "unbekannt",
17473
17554
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
17474
17555
  dropFile: dropFile$6,
17475
- "editor.record.form.keywords": "Schlagwörter",
17476
- "editor.record.form.license": "Lizenz",
17477
- "editor.record.form.license.cc-by": "",
17478
- "editor.record.form.license.cc-by-sa": "",
17479
- "editor.record.form.license.cc-zero": "",
17480
- "editor.record.form.license.etalab": "",
17481
- "editor.record.form.license.etalab-v2": "",
17482
- "editor.record.form.license.odbl": "",
17483
- "editor.record.form.license.odc-by": "",
17484
- "editor.record.form.license.pddl": "",
17556
+ "editor.record.form.bottomButtons.comeBackLater": "",
17557
+ "editor.record.form.bottomButtons.next": "",
17558
+ "editor.record.form.bottomButtons.previous": "",
17559
+ "editor.record.form.field.abstract": "Kurzbeschreibung",
17560
+ "editor.record.form.field.keywords": "Schlagwörter",
17561
+ "editor.record.form.field.license": "Lizenz",
17562
+ "editor.record.form.field.overviews": "",
17563
+ "editor.record.form.field.recordUpdated": "Datensatz zuletzt aktualisiert",
17564
+ "editor.record.form.field.resourceUpdated": "Letztes Aktualisierungsdatum",
17565
+ "editor.record.form.field.temporalExtents": "Zeitlicher Umfang",
17566
+ "editor.record.form.field.title": "Metadaten-Titel",
17567
+ "editor.record.form.field.uniqueIdentifier": "Eindeutige Kennung (ID)",
17568
+ "editor.record.form.field.updateFrequency": "Aktualisierungshäufigkeit",
17569
+ "editor.record.form.license.cc-by": "Creative Commons CC-BY",
17570
+ "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
17571
+ "editor.record.form.license.cc-zero": "Creative Commons CC-0",
17572
+ "editor.record.form.license.etalab": "Offene Lizenz (Etalab)",
17573
+ "editor.record.form.license.etalab-v2": "Offene Lizenz v2.0 (Etalab)",
17574
+ "editor.record.form.license.odbl": "Open Data Commons ODbL",
17575
+ "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
17576
+ "editor.record.form.license.pddl": "Open Data Commons PDDL",
17485
17577
  "editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
17486
- "editor.record.form.resourceUpdated": "",
17487
- "editor.record.form.temporalExtents": "",
17488
- "editor.record.form.temporalExtents.addDate": "",
17489
- "editor.record.form.temporalExtents.addRange": "",
17490
- "editor.record.form.temporalExtents.date": "",
17491
- "editor.record.form.temporalExtents.range": "",
17492
- "editor.record.form.updateFrequency": "",
17493
- "editor.record.form.updateFrequency.planned": "",
17494
- "editor.record.loadError.body": "",
17495
- "editor.record.loadError.closeMessage": "",
17496
- "editor.record.loadError.title": "",
17497
- "editor.record.publish": "",
17498
- "editor.record.publishError.body": "",
17499
- "editor.record.publishError.closeMessage": "",
17500
- "editor.record.publishError.title": "",
17501
- "editor.record.publishSuccess.body": "",
17502
- "editor.record.publishSuccess.title": "",
17503
- "editor.record.saveStatus.asDraftOnly": "",
17504
- "editor.record.saveStatus.draftWithChangesPending": "",
17505
- "editor.record.saveStatus.recordUpToDate": "",
17506
- "editor.record.upToDate": "",
17578
+ "editor.record.form.page.accessAndContact": "",
17579
+ "editor.record.form.page.description": "",
17580
+ "editor.record.form.page.ressources": "",
17581
+ "editor.record.form.section.about.description": "",
17582
+ "editor.record.form.section.about.label": "",
17583
+ "editor.record.form.section.annexes.label": "",
17584
+ "editor.record.form.section.associatedResources.description": "",
17585
+ "editor.record.form.section.associatedResources.label": "",
17586
+ "editor.record.form.section.classification.description": "",
17587
+ "editor.record.form.section.classification.label": "",
17588
+ "editor.record.form.section.dataManagers.description": "",
17589
+ "editor.record.form.section.dataManagers.label": "",
17590
+ "editor.record.form.section.dataPointOfContact.description": "",
17591
+ "editor.record.form.section.dataPointOfContact.label": "",
17592
+ "editor.record.form.section.geographicalCoverage.label": "",
17593
+ "editor.record.form.section.useAndAccessConditions.label": "",
17594
+ "editor.record.form.temporalExtents.addDate": "Zeitpunkt",
17595
+ "editor.record.form.temporalExtents.addRange": "Zeitraum",
17596
+ "editor.record.form.temporalExtents.date": "Datum",
17597
+ "editor.record.form.temporalExtents.range": "Datumsbereich",
17598
+ "editor.record.form.updateFrequency.planned": "Die Daten sollten regelmäßig aktualisiert werden.",
17599
+ "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
17600
+ "editor.record.loadError.closeMessage": "Verstanden",
17601
+ "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
17602
+ "editor.record.publish": "Diesen Datensatz veröffentlichen",
17603
+ "editor.record.publishError.body": "Der Datensatz konnte nicht veröffentlicht werden:",
17604
+ "editor.record.publishError.closeMessage": "Verstanden",
17605
+ "editor.record.publishError.title": "Fehler beim Veröffentlichen des Datensatzes",
17606
+ "editor.record.publishSuccess.body": "Der Datensatz wurde erfolgreich veröffentlicht!",
17607
+ "editor.record.publishSuccess.title": "Veröffentlichung erfolgreich",
17608
+ "editor.record.saveStatus.asDraftOnly": "Nur als Entwurf gespeichert - noch nicht veröffentlicht",
17609
+ "editor.record.saveStatus.draftWithChangesPending": "Als Entwurf gespeichert - Änderungen stehen aus",
17610
+ "editor.record.saveStatus.recordUpToDate": "Datensatz ist auf dem neuesten Stand",
17611
+ "editor.record.upToDate": "Dieser Datensatz ist auf dem neuesten Stand",
17612
+ "editor.sidebar.menu.editor": "",
17507
17613
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
17508
17614
  "facets.block.title.OrgForResource": "Organisation",
17509
17615
  "facets.block.title.availableInServices": "Verfügbar für",
@@ -17581,6 +17687,7 @@ var de = {
17581
17687
  "pagination.pageOf": "von",
17582
17688
  previous: previous$6,
17583
17689
  "record.action.download": "Herunterladen",
17690
+ "record.action.duplicate": "",
17584
17691
  "record.action.view": "Anzeigen",
17585
17692
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
17586
17693
  "record.metadata.about": "Beschreibung",
@@ -17711,7 +17818,7 @@ var de = {
17711
17818
  "search.filters.resourceType": "Ressourcentyp",
17712
17819
  "search.filters.standard": "Standard",
17713
17820
  "search.filters.title": "Ergebnisse filtern",
17714
- "search.filters.topic": "Thema",
17821
+ "search.filters.topic": "Themen",
17715
17822
  "search.filters.useSpatialFilter": "Zuerst Datensätze im Interessenbereich anzeigen",
17716
17823
  "search.filters.useSpatialFilterHelp": "Wenn diese Option aktiviert ist, werden Datensätze im Bereich des Katalogs zuerst angezeigt. Datensätze außerhalb dieses Bereichs werden nicht angezeigt.",
17717
17824
  "share.tab.permalink": "Teilen",
@@ -17903,8 +18010,19 @@ var en = {
17903
18010
  "downloads.format.unknown": "unknown",
17904
18011
  "downloads.wfs.featuretype.not.found": "The layer was not found",
17905
18012
  dropFile: dropFile$5,
17906
- "editor.record.form.keywords": "Keywords",
17907
- "editor.record.form.license": "License",
18013
+ "editor.record.form.bottomButtons.comeBackLater": "Come back later",
18014
+ "editor.record.form.bottomButtons.next": "Next",
18015
+ "editor.record.form.bottomButtons.previous": "Previous",
18016
+ "editor.record.form.field.abstract": "Abstract",
18017
+ "editor.record.form.field.keywords": "Keywords",
18018
+ "editor.record.form.field.license": "License",
18019
+ "editor.record.form.field.overviews": "Overviews",
18020
+ "editor.record.form.field.recordUpdated": "Record Updated",
18021
+ "editor.record.form.field.resourceUpdated": "Resource Updated",
18022
+ "editor.record.form.field.temporalExtents": "Temporal extents",
18023
+ "editor.record.form.field.title": "Metadata title",
18024
+ "editor.record.form.field.uniqueIdentifier": "Unique identifier",
18025
+ "editor.record.form.field.updateFrequency": "Update frequency",
17908
18026
  "editor.record.form.license.cc-by": "Creative Commons CC-BY",
17909
18027
  "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
17910
18028
  "editor.record.form.license.cc-zero": "Creative Commons CC-0",
@@ -17914,13 +18032,26 @@ var en = {
17914
18032
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
17915
18033
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
17916
18034
  "editor.record.form.license.unknown": "Unknown or absent",
17917
- "editor.record.form.resourceUpdated": "Last update date",
17918
- "editor.record.form.temporalExtents": "Temporal extent",
18035
+ "editor.record.form.page.accessAndContact": "Access and contact",
18036
+ "editor.record.form.page.description": "Resource description",
18037
+ "editor.record.form.page.ressources": "Resources",
18038
+ "editor.record.form.section.about.description": "This section describes the resource.",
18039
+ "editor.record.form.section.about.label": "About the resource",
18040
+ "editor.record.form.section.annexes.label": "Annexes",
18041
+ "editor.record.form.section.associatedResources.description": "Drop files here to associate them with the resource.",
18042
+ "editor.record.form.section.associatedResources.label": "Associated resources",
18043
+ "editor.record.form.section.classification.description": "The classification has an impact on the access to the data.",
18044
+ "editor.record.form.section.classification.label": "Classification",
18045
+ "editor.record.form.section.dataManagers.description": "The data managers are responsible for the data.",
18046
+ "editor.record.form.section.dataManagers.label": "Data managers",
18047
+ "editor.record.form.section.dataPointOfContact.description": "This information concerns the metadata.",
18048
+ "editor.record.form.section.dataPointOfContact.label": "Data point of contact",
18049
+ "editor.record.form.section.geographicalCoverage.label": "Geographical coverage",
18050
+ "editor.record.form.section.useAndAccessConditions.label": "Use and access conditions",
17919
18051
  "editor.record.form.temporalExtents.addDate": "Time instant",
17920
18052
  "editor.record.form.temporalExtents.addRange": "Time period",
17921
18053
  "editor.record.form.temporalExtents.date": "Date",
17922
18054
  "editor.record.form.temporalExtents.range": "Date range",
17923
- "editor.record.form.updateFrequency": "Update frequency",
17924
18055
  "editor.record.form.updateFrequency.planned": "The data should be updated regularly.",
17925
18056
  "editor.record.loadError.body": "The record could not be loaded:",
17926
18057
  "editor.record.loadError.closeMessage": "Understood",
@@ -17935,6 +18066,7 @@ var en = {
17935
18066
  "editor.record.saveStatus.draftWithChangesPending": "Saved as draft - changes are pending",
17936
18067
  "editor.record.saveStatus.recordUpToDate": "Record is up to date",
17937
18068
  "editor.record.upToDate": "This record is up to date",
18069
+ "editor.sidebar.menu.editor": "Editor",
17938
18070
  "externalviewer.dataset.unnamed": "Datahub layer",
17939
18071
  "facets.block.title.OrgForResource": "Organisation",
17940
18072
  "facets.block.title.availableInServices": "Available for",
@@ -18003,8 +18135,8 @@ var en = {
18003
18135
  "organisations.sortBy.nameDesc": "Name Z → A",
18004
18136
  "organisations.sortBy.recordCountAsc": "Publications 0 → 9",
18005
18137
  "organisations.sortBy.recordCountDesc": "Publications 9 → 0",
18006
- "organization.details.lastPublishedDatasets": "Last published datasets",
18007
- "organization.details.lastPublishedDatasets.searchAllButton": "Search all",
18138
+ "organization.details.lastPublishedDatasets": "",
18139
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
18008
18140
  "organization.details.mailContact": "Contact by email",
18009
18141
  "organization.header.recordCount": "{count, plural, =0{data} one{data} other{datas}}",
18010
18142
  "pagination.nextPage": "Next page",
@@ -18012,6 +18144,7 @@ var en = {
18012
18144
  "pagination.pageOf": "of",
18013
18145
  previous: previous$5,
18014
18146
  "record.action.download": "Download",
18147
+ "record.action.duplicate": "Duplicate",
18015
18148
  "record.action.view": "View",
18016
18149
  "record.externalViewer.open": "Open in the external map viewer",
18017
18150
  "record.metadata.about": "Description",
@@ -18142,7 +18275,7 @@ var en = {
18142
18275
  "search.filters.resourceType": "Resource type",
18143
18276
  "search.filters.standard": "Standard",
18144
18277
  "search.filters.title": "Filter your results",
18145
- "search.filters.topic": "Topic",
18278
+ "search.filters.topic": "Topics",
18146
18279
  "search.filters.useSpatialFilter": "Show records in the area of interest first",
18147
18280
  "search.filters.useSpatialFilterHelp": "When this is enabled, records situated in the catalog's area of interest are shown first; records outside of this area will not show up.",
18148
18281
  "share.tab.permalink": "Share",
@@ -18334,8 +18467,19 @@ var es = {
18334
18467
  "downloads.format.unknown": "",
18335
18468
  "downloads.wfs.featuretype.not.found": "",
18336
18469
  dropFile: dropFile$4,
18337
- "editor.record.form.keywords": "",
18338
- "editor.record.form.license": "",
18470
+ "editor.record.form.bottomButtons.comeBackLater": "",
18471
+ "editor.record.form.bottomButtons.next": "",
18472
+ "editor.record.form.bottomButtons.previous": "",
18473
+ "editor.record.form.field.abstract": "",
18474
+ "editor.record.form.field.keywords": "",
18475
+ "editor.record.form.field.license": "",
18476
+ "editor.record.form.field.overviews": "",
18477
+ "editor.record.form.field.recordUpdated": "",
18478
+ "editor.record.form.field.resourceUpdated": "",
18479
+ "editor.record.form.field.temporalExtents": "",
18480
+ "editor.record.form.field.title": "",
18481
+ "editor.record.form.field.uniqueIdentifier": "",
18482
+ "editor.record.form.field.updateFrequency": "",
18339
18483
  "editor.record.form.license.cc-by": "",
18340
18484
  "editor.record.form.license.cc-by-sa": "",
18341
18485
  "editor.record.form.license.cc-zero": "",
@@ -18345,13 +18489,26 @@ var es = {
18345
18489
  "editor.record.form.license.odc-by": "",
18346
18490
  "editor.record.form.license.pddl": "",
18347
18491
  "editor.record.form.license.unknown": "",
18348
- "editor.record.form.resourceUpdated": "",
18349
- "editor.record.form.temporalExtents": "",
18492
+ "editor.record.form.page.accessAndContact": "",
18493
+ "editor.record.form.page.description": "",
18494
+ "editor.record.form.page.ressources": "",
18495
+ "editor.record.form.section.about.description": "",
18496
+ "editor.record.form.section.about.label": "",
18497
+ "editor.record.form.section.annexes.label": "",
18498
+ "editor.record.form.section.associatedResources.description": "",
18499
+ "editor.record.form.section.associatedResources.label": "",
18500
+ "editor.record.form.section.classification.description": "",
18501
+ "editor.record.form.section.classification.label": "",
18502
+ "editor.record.form.section.dataManagers.description": "",
18503
+ "editor.record.form.section.dataManagers.label": "",
18504
+ "editor.record.form.section.dataPointOfContact.description": "",
18505
+ "editor.record.form.section.dataPointOfContact.label": "",
18506
+ "editor.record.form.section.geographicalCoverage.label": "",
18507
+ "editor.record.form.section.useAndAccessConditions.label": "",
18350
18508
  "editor.record.form.temporalExtents.addDate": "",
18351
18509
  "editor.record.form.temporalExtents.addRange": "",
18352
18510
  "editor.record.form.temporalExtents.date": "",
18353
18511
  "editor.record.form.temporalExtents.range": "",
18354
- "editor.record.form.updateFrequency": "",
18355
18512
  "editor.record.form.updateFrequency.planned": "",
18356
18513
  "editor.record.loadError.body": "",
18357
18514
  "editor.record.loadError.closeMessage": "",
@@ -18366,6 +18523,7 @@ var es = {
18366
18523
  "editor.record.saveStatus.draftWithChangesPending": "",
18367
18524
  "editor.record.saveStatus.recordUpToDate": "",
18368
18525
  "editor.record.upToDate": "",
18526
+ "editor.sidebar.menu.editor": "",
18369
18527
  "externalviewer.dataset.unnamed": "",
18370
18528
  "facets.block.title.OrgForResource": "",
18371
18529
  "facets.block.title.availableInServices": "",
@@ -18443,6 +18601,7 @@ var es = {
18443
18601
  "pagination.pageOf": "",
18444
18602
  previous: previous$4,
18445
18603
  "record.action.download": "",
18604
+ "record.action.duplicate": "",
18446
18605
  "record.action.view": "",
18447
18606
  "record.externalViewer.open": "",
18448
18607
  "record.metadata.about": "",
@@ -18765,8 +18924,19 @@ var fr = {
18765
18924
  "downloads.format.unknown": "inconnu",
18766
18925
  "downloads.wfs.featuretype.not.found": "La couche n'a pas été retrouvée",
18767
18926
  dropFile: dropFile$3,
18768
- "editor.record.form.keywords": "Mots-clés",
18769
- "editor.record.form.license": "Licence",
18927
+ "editor.record.form.bottomButtons.comeBackLater": "Revenir plus tard",
18928
+ "editor.record.form.bottomButtons.next": "Suivant",
18929
+ "editor.record.form.bottomButtons.previous": "Précédent",
18930
+ "editor.record.form.field.abstract": "Résumé",
18931
+ "editor.record.form.field.keywords": "Mots-clés",
18932
+ "editor.record.form.field.license": "Licence",
18933
+ "editor.record.form.field.overviews": "Aperçus",
18934
+ "editor.record.form.field.recordUpdated": "Date de dernière révision",
18935
+ "editor.record.form.field.resourceUpdated": "Date de dernière révision",
18936
+ "editor.record.form.field.temporalExtents": "Étendue temporelle",
18937
+ "editor.record.form.field.title": "Titre",
18938
+ "editor.record.form.field.uniqueIdentifier": "Identifiant unique",
18939
+ "editor.record.form.field.updateFrequency": "Fréquence de mise à jour",
18770
18940
  "editor.record.form.license.cc-by": "",
18771
18941
  "editor.record.form.license.cc-by-sa": "",
18772
18942
  "editor.record.form.license.cc-zero": "",
@@ -18776,13 +18946,26 @@ var fr = {
18776
18946
  "editor.record.form.license.odc-by": "",
18777
18947
  "editor.record.form.license.pddl": "",
18778
18948
  "editor.record.form.license.unknown": "Non-reconnue ou absente",
18779
- "editor.record.form.resourceUpdated": "Date de dernière révision",
18780
- "editor.record.form.temporalExtents": "Étendue temporelle",
18949
+ "editor.record.form.page.accessAndContact": "Acces et contact",
18950
+ "editor.record.form.page.description": "Description de la ressource",
18951
+ "editor.record.form.page.ressources": "Ressources",
18952
+ "editor.record.form.section.about.description": "Ces informations concernent la donnée.",
18953
+ "editor.record.form.section.about.label": "A propos de la ressource",
18954
+ "editor.record.form.section.annexes.label": "Annexes",
18955
+ "editor.record.form.section.associatedResources.description": "Déposez les jeux de données associées à cette fiche de métadonnée.",
18956
+ "editor.record.form.section.associatedResources.label": "Ressources associees",
18957
+ "editor.record.form.section.classification.description": "La classification a un impact sur la recherche du jeux de données.",
18958
+ "editor.record.form.section.classification.label": "Classification",
18959
+ "editor.record.form.section.dataManagers.description": "Cette information concerne la donnée.",
18960
+ "editor.record.form.section.dataManagers.label": "Responsables de la donnee",
18961
+ "editor.record.form.section.dataPointOfContact.description": "Cette information concerne la fiche de métadonnée.",
18962
+ "editor.record.form.section.dataPointOfContact.label": "Point de contact de la metadonee",
18963
+ "editor.record.form.section.geographicalCoverage.label": "Couverture geographique",
18964
+ "editor.record.form.section.useAndAccessConditions.label": "Conditions d'acces et usage",
18781
18965
  "editor.record.form.temporalExtents.addDate": "Date déterminée",
18782
18966
  "editor.record.form.temporalExtents.addRange": "Période de temps",
18783
18967
  "editor.record.form.temporalExtents.date": "Date concernée",
18784
18968
  "editor.record.form.temporalExtents.range": "Période concernée",
18785
- "editor.record.form.updateFrequency": "Fréquence de mise à jour",
18786
18969
  "editor.record.form.updateFrequency.planned": "Ces données doivent être mise à jour régulièrement.",
18787
18970
  "editor.record.loadError.body": "",
18788
18971
  "editor.record.loadError.closeMessage": "",
@@ -18797,6 +18980,7 @@ var fr = {
18797
18980
  "editor.record.saveStatus.draftWithChangesPending": "Brouillon enregistré - modifications en cours",
18798
18981
  "editor.record.saveStatus.recordUpToDate": "La fiche publiée est à jour",
18799
18982
  "editor.record.upToDate": "",
18983
+ "editor.sidebar.menu.editor": "",
18800
18984
  "externalviewer.dataset.unnamed": "Couche du datahub",
18801
18985
  "facets.block.title.OrgForResource": "Organisation",
18802
18986
  "facets.block.title.availableInServices": "Disponible pour",
@@ -18865,8 +19049,8 @@ var fr = {
18865
19049
  "organisations.sortBy.nameDesc": "Nom Z → A",
18866
19050
  "organisations.sortBy.recordCountAsc": "Données 0 → 9",
18867
19051
  "organisations.sortBy.recordCountDesc": "Données 9 → 0",
18868
- "organization.details.lastPublishedDatasets": "Dernières données publiées",
18869
- "organization.details.lastPublishedDatasets.searchAllButton": "Rechercher tous",
19052
+ "organization.details.lastPublishedDatasets": "",
19053
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
18870
19054
  "organization.details.mailContact": "Contacter par mail",
18871
19055
  "organization.header.recordCount": "{count, plural, =0{donnée} one{donnée} other{données}}",
18872
19056
  "pagination.nextPage": "Page suivante",
@@ -18874,6 +19058,7 @@ var fr = {
18874
19058
  "pagination.pageOf": "sur",
18875
19059
  previous: previous$3,
18876
19060
  "record.action.download": "Télécharger",
19061
+ "record.action.duplicate": "Dupliquer",
18877
19062
  "record.action.view": "Voir",
18878
19063
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
18879
19064
  "record.metadata.about": "Description",
@@ -19004,7 +19189,7 @@ var fr = {
19004
19189
  "search.filters.resourceType": "Type de ressource",
19005
19190
  "search.filters.standard": "Standard",
19006
19191
  "search.filters.title": "Affiner votre recherche",
19007
- "search.filters.topic": "Thème",
19192
+ "search.filters.topic": "Thèmes",
19008
19193
  "search.filters.useSpatialFilter": "Mettre en avant les résultats sur la zone d'intérêt",
19009
19194
  "search.filters.useSpatialFilterHelp": "Si cette option est activée, les fiches portant sur la zone d'intérêt du catalogue seront montrées en premier; les fiches en dehors de cette zone n'apparaîtront pas dans les résultats.",
19010
19195
  "share.tab.permalink": "Partager",
@@ -19196,8 +19381,19 @@ var it = {
19196
19381
  "downloads.format.unknown": "sconosciuto",
19197
19382
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
19198
19383
  dropFile: dropFile$2,
19199
- "editor.record.form.keywords": "",
19200
- "editor.record.form.license": "Licenza",
19384
+ "editor.record.form.bottomButtons.comeBackLater": "",
19385
+ "editor.record.form.bottomButtons.next": "",
19386
+ "editor.record.form.bottomButtons.previous": "",
19387
+ "editor.record.form.field.abstract": "",
19388
+ "editor.record.form.field.keywords": "",
19389
+ "editor.record.form.field.license": "Licenza",
19390
+ "editor.record.form.field.overviews": "",
19391
+ "editor.record.form.field.recordUpdated": "",
19392
+ "editor.record.form.field.resourceUpdated": "",
19393
+ "editor.record.form.field.temporalExtents": "",
19394
+ "editor.record.form.field.title": "",
19395
+ "editor.record.form.field.uniqueIdentifier": "",
19396
+ "editor.record.form.field.updateFrequency": "",
19201
19397
  "editor.record.form.license.cc-by": "",
19202
19398
  "editor.record.form.license.cc-by-sa": "",
19203
19399
  "editor.record.form.license.cc-zero": "",
@@ -19207,13 +19403,26 @@ var it = {
19207
19403
  "editor.record.form.license.odc-by": "",
19208
19404
  "editor.record.form.license.pddl": "",
19209
19405
  "editor.record.form.license.unknown": "Non riconosciuta o assente",
19210
- "editor.record.form.resourceUpdated": "",
19211
- "editor.record.form.temporalExtents": "",
19406
+ "editor.record.form.page.accessAndContact": "",
19407
+ "editor.record.form.page.description": "",
19408
+ "editor.record.form.page.ressources": "",
19409
+ "editor.record.form.section.about.description": "",
19410
+ "editor.record.form.section.about.label": "",
19411
+ "editor.record.form.section.annexes.label": "",
19412
+ "editor.record.form.section.associatedResources.description": "",
19413
+ "editor.record.form.section.associatedResources.label": "",
19414
+ "editor.record.form.section.classification.description": "",
19415
+ "editor.record.form.section.classification.label": "",
19416
+ "editor.record.form.section.dataManagers.description": "",
19417
+ "editor.record.form.section.dataManagers.label": "",
19418
+ "editor.record.form.section.dataPointOfContact.description": "",
19419
+ "editor.record.form.section.dataPointOfContact.label": "",
19420
+ "editor.record.form.section.geographicalCoverage.label": "",
19421
+ "editor.record.form.section.useAndAccessConditions.label": "",
19212
19422
  "editor.record.form.temporalExtents.addDate": "",
19213
19423
  "editor.record.form.temporalExtents.addRange": "",
19214
19424
  "editor.record.form.temporalExtents.date": "",
19215
19425
  "editor.record.form.temporalExtents.range": "",
19216
- "editor.record.form.updateFrequency": "",
19217
19426
  "editor.record.form.updateFrequency.planned": "",
19218
19427
  "editor.record.loadError.body": "",
19219
19428
  "editor.record.loadError.closeMessage": "",
@@ -19228,6 +19437,7 @@ var it = {
19228
19437
  "editor.record.saveStatus.draftWithChangesPending": "",
19229
19438
  "editor.record.saveStatus.recordUpToDate": "",
19230
19439
  "editor.record.upToDate": "",
19440
+ "editor.sidebar.menu.editor": "",
19231
19441
  "externalviewer.dataset.unnamed": "Layer del datahub",
19232
19442
  "facets.block.title.OrgForResource": "Organizzazione",
19233
19443
  "facets.block.title.availableInServices": "Disponibile per",
@@ -19305,6 +19515,7 @@ var it = {
19305
19515
  "pagination.pageOf": "di",
19306
19516
  previous: previous$2,
19307
19517
  "record.action.download": "Scarica",
19518
+ "record.action.duplicate": "",
19308
19519
  "record.action.view": "Visualizza",
19309
19520
  "record.externalViewer.open": "Apri nell'visualizzatore esterno",
19310
19521
  "record.metadata.about": "Descrizione",
@@ -19435,7 +19646,7 @@ var it = {
19435
19646
  "search.filters.resourceType": "Tipo di risorsa",
19436
19647
  "search.filters.standard": "Standard",
19437
19648
  "search.filters.title": "Affina la sua ricerca",
19438
- "search.filters.topic": "Argomento",
19649
+ "search.filters.topic": "Argomenti",
19439
19650
  "search.filters.useSpatialFilter": "Evidenzia i risultati nell'area di interesse",
19440
19651
  "search.filters.useSpatialFilterHelp": "Se attivata, le schede relative all'area di interesse del catalogo saranno mostrate per prime; le schede al di fuori di questa area non appariranno nei risultati.",
19441
19652
  "share.tab.permalink": "Condividere",
@@ -19627,8 +19838,19 @@ var nl = {
19627
19838
  "downloads.format.unknown": "",
19628
19839
  "downloads.wfs.featuretype.not.found": "",
19629
19840
  dropFile: dropFile$1,
19630
- "editor.record.form.keywords": "",
19631
- "editor.record.form.license": "",
19841
+ "editor.record.form.bottomButtons.comeBackLater": "",
19842
+ "editor.record.form.bottomButtons.next": "",
19843
+ "editor.record.form.bottomButtons.previous": "",
19844
+ "editor.record.form.field.abstract": "",
19845
+ "editor.record.form.field.keywords": "",
19846
+ "editor.record.form.field.license": "",
19847
+ "editor.record.form.field.overviews": "",
19848
+ "editor.record.form.field.recordUpdated": "",
19849
+ "editor.record.form.field.resourceUpdated": "",
19850
+ "editor.record.form.field.temporalExtents": "",
19851
+ "editor.record.form.field.title": "",
19852
+ "editor.record.form.field.uniqueIdentifier": "",
19853
+ "editor.record.form.field.updateFrequency": "",
19632
19854
  "editor.record.form.license.cc-by": "",
19633
19855
  "editor.record.form.license.cc-by-sa": "",
19634
19856
  "editor.record.form.license.cc-zero": "",
@@ -19638,13 +19860,26 @@ var nl = {
19638
19860
  "editor.record.form.license.odc-by": "",
19639
19861
  "editor.record.form.license.pddl": "",
19640
19862
  "editor.record.form.license.unknown": "",
19641
- "editor.record.form.resourceUpdated": "",
19642
- "editor.record.form.temporalExtents": "",
19863
+ "editor.record.form.page.accessAndContact": "",
19864
+ "editor.record.form.page.description": "",
19865
+ "editor.record.form.page.ressources": "",
19866
+ "editor.record.form.section.about.description": "",
19867
+ "editor.record.form.section.about.label": "",
19868
+ "editor.record.form.section.annexes.label": "",
19869
+ "editor.record.form.section.associatedResources.description": "",
19870
+ "editor.record.form.section.associatedResources.label": "",
19871
+ "editor.record.form.section.classification.description": "",
19872
+ "editor.record.form.section.classification.label": "",
19873
+ "editor.record.form.section.dataManagers.description": "",
19874
+ "editor.record.form.section.dataManagers.label": "",
19875
+ "editor.record.form.section.dataPointOfContact.description": "",
19876
+ "editor.record.form.section.dataPointOfContact.label": "",
19877
+ "editor.record.form.section.geographicalCoverage.label": "",
19878
+ "editor.record.form.section.useAndAccessConditions.label": "",
19643
19879
  "editor.record.form.temporalExtents.addDate": "",
19644
19880
  "editor.record.form.temporalExtents.addRange": "",
19645
19881
  "editor.record.form.temporalExtents.date": "",
19646
19882
  "editor.record.form.temporalExtents.range": "",
19647
- "editor.record.form.updateFrequency": "",
19648
19883
  "editor.record.form.updateFrequency.planned": "",
19649
19884
  "editor.record.loadError.body": "",
19650
19885
  "editor.record.loadError.closeMessage": "",
@@ -19659,6 +19894,7 @@ var nl = {
19659
19894
  "editor.record.saveStatus.draftWithChangesPending": "",
19660
19895
  "editor.record.saveStatus.recordUpToDate": "",
19661
19896
  "editor.record.upToDate": "",
19897
+ "editor.sidebar.menu.editor": "",
19662
19898
  "externalviewer.dataset.unnamed": "",
19663
19899
  "facets.block.title.OrgForResource": "",
19664
19900
  "facets.block.title.availableInServices": "",
@@ -19736,6 +19972,7 @@ var nl = {
19736
19972
  "pagination.pageOf": "",
19737
19973
  previous: previous$1,
19738
19974
  "record.action.download": "",
19975
+ "record.action.duplicate": "",
19739
19976
  "record.action.view": "",
19740
19977
  "record.externalViewer.open": "",
19741
19978
  "record.metadata.about": "",
@@ -20058,8 +20295,19 @@ var pt = {
20058
20295
  "downloads.format.unknown": "",
20059
20296
  "downloads.wfs.featuretype.not.found": "",
20060
20297
  dropFile: dropFile,
20061
- "editor.record.form.keywords": "",
20062
- "editor.record.form.license": "",
20298
+ "editor.record.form.bottomButtons.comeBackLater": "",
20299
+ "editor.record.form.bottomButtons.next": "",
20300
+ "editor.record.form.bottomButtons.previous": "",
20301
+ "editor.record.form.field.abstract": "",
20302
+ "editor.record.form.field.keywords": "",
20303
+ "editor.record.form.field.license": "",
20304
+ "editor.record.form.field.overviews": "",
20305
+ "editor.record.form.field.recordUpdated": "",
20306
+ "editor.record.form.field.resourceUpdated": "",
20307
+ "editor.record.form.field.temporalExtents": "",
20308
+ "editor.record.form.field.title": "",
20309
+ "editor.record.form.field.uniqueIdentifier": "",
20310
+ "editor.record.form.field.updateFrequency": "",
20063
20311
  "editor.record.form.license.cc-by": "",
20064
20312
  "editor.record.form.license.cc-by-sa": "",
20065
20313
  "editor.record.form.license.cc-zero": "",
@@ -20069,13 +20317,26 @@ var pt = {
20069
20317
  "editor.record.form.license.odc-by": "",
20070
20318
  "editor.record.form.license.pddl": "",
20071
20319
  "editor.record.form.license.unknown": "",
20072
- "editor.record.form.resourceUpdated": "",
20073
- "editor.record.form.temporalExtents": "",
20320
+ "editor.record.form.page.accessAndContact": "",
20321
+ "editor.record.form.page.description": "",
20322
+ "editor.record.form.page.ressources": "",
20323
+ "editor.record.form.section.about.description": "",
20324
+ "editor.record.form.section.about.label": "",
20325
+ "editor.record.form.section.annexes.label": "",
20326
+ "editor.record.form.section.associatedResources.description": "",
20327
+ "editor.record.form.section.associatedResources.label": "",
20328
+ "editor.record.form.section.classification.description": "",
20329
+ "editor.record.form.section.classification.label": "",
20330
+ "editor.record.form.section.dataManagers.description": "",
20331
+ "editor.record.form.section.dataManagers.label": "",
20332
+ "editor.record.form.section.dataPointOfContact.description": "",
20333
+ "editor.record.form.section.dataPointOfContact.label": "",
20334
+ "editor.record.form.section.geographicalCoverage.label": "",
20335
+ "editor.record.form.section.useAndAccessConditions.label": "",
20074
20336
  "editor.record.form.temporalExtents.addDate": "",
20075
20337
  "editor.record.form.temporalExtents.addRange": "",
20076
20338
  "editor.record.form.temporalExtents.date": "",
20077
20339
  "editor.record.form.temporalExtents.range": "",
20078
- "editor.record.form.updateFrequency": "",
20079
20340
  "editor.record.form.updateFrequency.planned": "",
20080
20341
  "editor.record.loadError.body": "",
20081
20342
  "editor.record.loadError.closeMessage": "",
@@ -20090,6 +20351,7 @@ var pt = {
20090
20351
  "editor.record.saveStatus.draftWithChangesPending": "",
20091
20352
  "editor.record.saveStatus.recordUpToDate": "",
20092
20353
  "editor.record.upToDate": "",
20354
+ "editor.sidebar.menu.editor": "",
20093
20355
  "externalviewer.dataset.unnamed": "",
20094
20356
  "facets.block.title.OrgForResource": "",
20095
20357
  "facets.block.title.availableInServices": "",
@@ -20167,6 +20429,7 @@ var pt = {
20167
20429
  "pagination.pageOf": "",
20168
20430
  previous: previous,
20169
20431
  "record.action.download": "",
20432
+ "record.action.duplicate": "",
20170
20433
  "record.action.view": "",
20171
20434
  "record.externalViewer.open": "",
20172
20435
  "record.metadata.about": "",
@@ -21299,6 +21562,17 @@ class Gn4Repository {
21299
21562
  .then((record) => [record, xml, isSavedAlready]);
21300
21563
  }));
21301
21564
  }
21565
+ openRecordForDuplication(uniqueIdentifier) {
21566
+ return this.loadRecordAsXml(uniqueIdentifier).pipe(switchMap(async (recordAsXml) => {
21567
+ const converter = findConverterForDocument(recordAsXml);
21568
+ const record = await converter.readRecord(recordAsXml);
21569
+ record.uniqueIdentifier = `TEMP-ID-${Date.now()}`;
21570
+ record.title = `${record.title} (Copy)`;
21571
+ const xml = await converter.writeRecord(record, recordAsXml);
21572
+ window.localStorage.setItem(this.getLocalStorageKeyForRecord(record.uniqueIdentifier), xml);
21573
+ return [record, xml, false];
21574
+ }));
21575
+ }
21302
21576
  serializeRecordToXml(record, referenceRecordSource) {
21303
21577
  // if there's a reference record, use that standard; otherwise, use iso19139
21304
21578
  const converter = referenceRecordSource
@@ -23072,10 +23346,9 @@ class MapUtilsService {
23072
23346
  if (!('spatialExtents' in record) || record.spatialExtents.length === 0) {
23073
23347
  return null;
23074
23348
  }
23075
- // transform an array of geojson geometries into a bbox
23349
+ // extend all the spatial extents bbox into an including bbox
23076
23350
  const totalExtent = record.spatialExtents.reduce((prev, curr) => {
23077
- const geom = GEOJSON.readGeometry(curr.geometry);
23078
- return extend(prev, geom.getExtent());
23351
+ return extend(prev, curr.bbox);
23079
23352
  }, [Infinity, Infinity, -Infinity, -Infinity]);
23080
23353
  return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
23081
23354
  }
@@ -24661,6 +24934,70 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
24661
24934
  }]
24662
24935
  }] });
24663
24936
 
24937
+ class PopoverComponent {
24938
+ constructor(viewContainerRef, renderer) {
24939
+ this.viewContainerRef = viewContainerRef;
24940
+ this.renderer = renderer;
24941
+ }
24942
+ getContent() {
24943
+ if (this.content instanceof TemplateRef) {
24944
+ if (this.view) {
24945
+ this.view.destroy();
24946
+ }
24947
+ this.view = this.viewContainerRef.createEmbeddedView(this.content);
24948
+ this.view.detectChanges();
24949
+ const wrapper = this.renderer.createElement('div'); // Create a wrapper div
24950
+ this.view.rootNodes.forEach((node) => {
24951
+ this.renderer.appendChild(wrapper, node); // Append each root node to the wrapper
24952
+ });
24953
+ return wrapper;
24954
+ }
24955
+ return this.content;
24956
+ }
24957
+ ngAfterViewInit() {
24958
+ this.tippyInstance = tippy(this.popoverContent.nativeElement, {
24959
+ content: this.getContent(),
24960
+ allowHTML: true,
24961
+ theme: this.theme,
24962
+ });
24963
+ }
24964
+ ngOnChanges(changes) {
24965
+ if (changes['theme']) {
24966
+ this.theme = changes['theme'].currentValue;
24967
+ if (this.tippyInstance) {
24968
+ this.tippyInstance.setProps({ theme: this.theme });
24969
+ }
24970
+ }
24971
+ if (changes['content']) {
24972
+ this.content = changes['content'].currentValue;
24973
+ if (this.tippyInstance) {
24974
+ this.tippyInstance.setContent(this.getContent());
24975
+ }
24976
+ }
24977
+ }
24978
+ ngOnDestroy() {
24979
+ if (this.tippyInstance) {
24980
+ this.tippyInstance.destroy();
24981
+ }
24982
+ if (this.view) {
24983
+ this.view.destroy();
24984
+ }
24985
+ }
24986
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PopoverComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
24987
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PopoverComponent, isStandalone: true, selector: "gn-ui-popover", inputs: { content: "content", theme: "theme" }, viewQueries: [{ propertyName: "popoverContent", first: true, predicate: ["popoverContent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span #popoverContent>\n <ng-content></ng-content>\n</span>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
24988
+ }
24989
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PopoverComponent, decorators: [{
24990
+ type: Component,
24991
+ args: [{ selector: 'gn-ui-popover', standalone: true, imports: [CommonModule], template: "<span #popoverContent>\n <ng-content></ng-content>\n</span>\n" }]
24992
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.Renderer2 }]; }, propDecorators: { popoverContent: [{
24993
+ type: ViewChild,
24994
+ args: ['popoverContent', { static: false }]
24995
+ }], content: [{
24996
+ type: Input
24997
+ }], theme: [{
24998
+ type: Input
24999
+ }] } });
25000
+
24664
25001
  class PopupAlertComponent {
24665
25002
  constructor(changeDetector) {
24666
25003
  this.changeDetector = changeDetector;
@@ -25065,7 +25402,7 @@ class CopyTextButtonComponent {
25065
25402
  event.target.blur();
25066
25403
  }
25067
25404
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25068
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: { text: "text", tooltipText: "tooltipText", displayText: "displayText", rows: "rows" }, ngImport: i0, template: "<div class=\"flex\">\n <input\n *ngIf=\"displayText && rows <= 1\"\n type=\"text\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 truncate\"\n value=\"{{ text }}\"\n readonly\n />\n <textarea\n *ngIf=\"displayText && rows > 1\"\n [rows]=\"rows\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 overflow-y-auto h-max\"\n readonly\n >{{ text }}</textarea\n >\n <button\n type=\"button\"\n (click)=\"copyText($event)\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"tooltipText\"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n >content_copy</mat-icon\n >\n </button>\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: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25405
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: { text: "text", tooltipText: "tooltipText", displayText: "displayText", rows: "rows" }, ngImport: i0, template: "<div class=\"flex\">\n <input\n *ngIf=\"displayText && rows <= 1\"\n type=\"text\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 truncate\"\n value=\"{{ text }}\"\n readonly\n />\n <textarea\n *ngIf=\"displayText && rows > 1\"\n [rows]=\"rows\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 overflow-y-auto h-max\"\n readonly\n >{{ text }}</textarea\n >\n <button\n type=\"button\"\n (click)=\"copyText($event)\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"tooltipText\"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n >content_copy</mat-icon\n >\n </button>\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: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25069
25406
  }
25070
25407
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
25071
25408
  type: Component,
@@ -25085,7 +25422,7 @@ class DatePickerComponent {
25085
25422
  this.dateChange = new EventEmitter();
25086
25423
  }
25087
25424
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25088
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DatePickerComponent, isStandalone: true, selector: "gn-ui-date-picker", inputs: { date: "date" }, outputs: { dateChange: "dateChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between rounded-lg border border-gray-300 bg-white\"\n>\n <input\n class=\"pl-3\"\n [matDatepicker]=\"picker\"\n [value]=\"date\"\n (dateChange)=\"dateChange.emit($event.value)\"\n />\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n</div>\n<mat-datepicker #picker></mat-datepicker>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$4.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$4.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i2$4.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25425
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DatePickerComponent, isStandalone: true, selector: "gn-ui-date-picker", inputs: { date: "date" }, outputs: { dateChange: "dateChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between rounded-lg border border-gray-300 bg-white\"\n>\n <input\n class=\"pl-3\"\n [matDatepicker]=\"picker\"\n [value]=\"date\"\n (dateChange)=\"dateChange.emit($event.value)\"\n />\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n</div>\n<mat-datepicker #picker></mat-datepicker>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$3.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$3.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i2$3.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25089
25426
  }
25090
25427
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatePickerComponent, decorators: [{
25091
25428
  type: Component,
@@ -25102,7 +25439,7 @@ class DateRangePickerComponent {
25102
25439
  this.endDateChange = new EventEmitter();
25103
25440
  }
25104
25441
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25105
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DateRangePickerComponent, isStandalone: true, selector: "gn-ui-date-range-picker", inputs: { startDate: "startDate", endDate: "endDate" }, outputs: { startDateChange: "startDateChange", endDateChange: "endDateChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between rounded-lg border border-gray-300 bg-white\"\n>\n <div class=\"pl-3 flex justify-center\">\n <mat-date-range-input [rangePicker]=\"picker\" class=\"w-full\">\n <input\n matStartDate\n placeholder=\"Start date\"\n [value]=\"startDate\"\n (dateInput)=\"startDateChange.emit($event.value)\"\n />\n <input\n matEndDate\n placeholder=\"End date\"\n [value]=\"endDate\"\n (dateInput)=\"endDateChange.emit($event.value)\"\n />\n </mat-date-range-input>\n </div>\n <mat-datepicker-toggle matSuffix [for]=\"picker\">\n <mat-icon>calendar_today</mat-icon>\n </mat-datepicker-toggle>\n</div>\n<mat-date-range-picker #picker></mat-date-range-picker>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$4.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i2$4.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i2$4.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i2$4.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i2$4.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25442
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DateRangePickerComponent, isStandalone: true, selector: "gn-ui-date-range-picker", inputs: { startDate: "startDate", endDate: "endDate" }, outputs: { startDateChange: "startDateChange", endDateChange: "endDateChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between rounded-lg border border-gray-300 bg-white\"\n>\n <div class=\"pl-3 flex justify-center\">\n <mat-date-range-input [rangePicker]=\"picker\" class=\"w-full\">\n <input\n matStartDate\n placeholder=\"Start date\"\n [value]=\"startDate\"\n (dateInput)=\"startDateChange.emit($event.value)\"\n />\n <input\n matEndDate\n placeholder=\"End date\"\n [value]=\"endDate\"\n (dateInput)=\"endDateChange.emit($event.value)\"\n />\n </mat-date-range-input>\n </div>\n <mat-datepicker-toggle matSuffix [for]=\"picker\">\n <mat-icon>calendar_today</mat-icon>\n </mat-datepicker-toggle>\n</div>\n<mat-date-range-picker #picker></mat-date-range-picker>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$3.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i2$3.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i2$3.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i2$3.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i2$3.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25106
25443
  }
25107
25444
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateRangePickerComponent, decorators: [{
25108
25445
  type: Component,
@@ -25134,7 +25471,7 @@ class DragAndDropFileInputComponent {
25134
25471
  this.fileChange.emit(this.selectedFile);
25135
25472
  }
25136
25473
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DragAndDropFileInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25137
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DragAndDropFileInputComponent, selector: "gn-ui-drag-and-drop-file-input", inputs: { placeholder: "placeholder", accept: "accept" }, outputs: { fileChange: "fileChange" }, ngImport: i0, template: "<div class=\"flex h-full\">\n <ngx-dropzone\n class=\"flex-1\"\n multiple=\"false\"\n (change)=\"selectFile($event)\"\n [accept]=\"accept\"\n >\n <div *ngIf=\"!fileName\" class=\"text-gray-900 pl-2 py-2\" translate=\"\">\n {{ placeholder }}\n </div>\n\n <div *ngIf=\"fileName\" class=\"text-gray-900 pl-2 py-2\">{{ fileName }}</div>\n </ngx-dropzone>\n</div>\n", styles: ["ngx-dropzone{height:auto;border:none}\n"], 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: i3$1.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }] }); }
25474
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DragAndDropFileInputComponent, selector: "gn-ui-drag-and-drop-file-input", inputs: { placeholder: "placeholder", accept: "accept" }, outputs: { fileChange: "fileChange" }, ngImport: i0, template: "<div class=\"flex h-full\">\n <ngx-dropzone\n class=\"flex-1\"\n multiple=\"false\"\n (change)=\"selectFile($event)\"\n [accept]=\"accept\"\n >\n <div *ngIf=\"!fileName\" class=\"text-gray-900 pl-2 py-2\" translate=\"\">\n {{ placeholder }}\n </div>\n\n <div *ngIf=\"fileName\" class=\"text-gray-900 pl-2 py-2\">{{ fileName }}</div>\n </ngx-dropzone>\n</div>\n", styles: ["ngx-dropzone{height:auto;border:none}\n"], 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: i3$2.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }] }); }
25138
25475
  }
25139
25476
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DragAndDropFileInputComponent, decorators: [{
25140
25477
  type: Component,
@@ -25913,7 +26250,8 @@ class ImageInputComponent {
25913
26250
  const file = new File([blob], name);
25914
26251
  this.fileChange.emit(file);
25915
26252
  },
25916
- error: () => {
26253
+ error: (error) => {
26254
+ console.error(error);
25917
26255
  this.downloadError = true;
25918
26256
  this.cd.markForCheck();
25919
26257
  this.urlChange.emit(this.urlInputValue);
@@ -25949,6 +26287,7 @@ class ImageInputComponent {
25949
26287
  }
25950
26288
  }
25951
26289
  handleDelete() {
26290
+ this.formControl.markAsDirty();
25952
26291
  this.delete.emit();
25953
26292
  }
25954
26293
  toggleAltTextInput() {
@@ -25971,7 +26310,7 @@ class ImageInputComponent {
25971
26310
  });
25972
26311
  }
25973
26312
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ImageInputComponent, deps: [{ token: i1.HttpClient }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
25974
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ImageInputComponent, isStandalone: true, selector: "gn-ui-image-input", inputs: { maxSizeMB: "maxSizeMB", previewUrl: "previewUrl", altText: "altText", uploadProgress: "uploadProgress", uploadError: "uploadError" }, outputs: { fileChange: "fileChange", urlChange: "urlChange", uploadCancel: "uploadCancel", delete: "delete", altTextChange: "altTextChange" }, ngImport: i0, template: "<ng-container *ngIf=\"previewUrl; then withImage; else withoutImage\">\n</ng-container>\n\n<ng-template #withImage>\n <div class=\"w-full h-full flex flex-col gap-2\">\n <div class=\"flex-1 group relative\">\n <img\n class=\"w-full h-full object-cover border-2 border-gray-300 rounded-lg\"\n [alt]=\"altText\"\n loading=\"lazy\"\n [src]=\"previewUrl\"\n />\n <gn-ui-button\n [extraClass]=\"\n 'bg-gray-200 absolute right-2 bottom-2 invisible group-hover:visible'\n \"\n (buttonClick)=\"handleDelete()\"\n >\n <mat-icon class=\"material-symbols-outlined\">delete</mat-icon>\n </gn-ui-button>\n </div>\n <input\n *ngIf=\"showAltTextInput\"\n type=\"text\"\n class=\"py-3 px-2 border-2 border-gray-300 rounded-lg text-sm font-medium\"\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText\"\n (change)=\"handleAltTextChange($event)\"\n />\n <div class=\"flex flex-row gap-2\">\n <gn-ui-button\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"handleDelete()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">delete</mat-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n <gn-ui-button\n *ngIf=\"!showAltTextInput\"\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"toggleAltTextInput()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">add</mat-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #withoutImage>\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"block flex-1 border-2 border-dashed border-gray-300 rounded-lg p-6 flex flex-col items-center justify-center gap-4\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n <div class=\"w-14 h-14 rounded-md bg-gray-200 grid\">\n <mat-icon\n *ngIf=\"!dragFilesOver && !uploadProgress && !uploadError\"\n class=\"material-symbols-outlined place-self-center text-blue-500\"\n >image</mat-icon\n >\n <mat-icon\n *ngIf=\"dragFilesOver && !uploadProgress && !uploadError\"\n class=\"material-symbols-outlined place-self-center text-blue-500\"\n >add_box</mat-icon\n >\n <div *ngIf=\"uploadProgress\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n [mode]=\"'determinate'\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n <span\n class=\"text-sm font-medium relative inline-block width-[30px] bottom-[40px] left-[15px]\"\n >\n {{ uploadProgress }}%\n </span>\n </div>\n <mat-icon\n *ngIf=\"uploadError\"\n class=\"material-symbols-outlined place-self-center text-rose-500\"\n >broken_image</mat-icon\n >\n </div>\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\">{{ getPrimaryText() | translate }}</p>\n <p\n class=\"text-sm\"\n [class]=\"\n uploadProgress || uploadError\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick()\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"showUrlInput || uploadProgress || uploadError\"\n />\n </label>\n <div *ngIf=\"!showUrlInput\" class=\"flex-none\">\n <gn-ui-button\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"displayUrlInput()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">link</mat-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n <div *ngIf=\"showUrlInput\" class=\"flex-none flex flex-col gap-2\">\n <div class=\"h-2\"></div>\n <div class=\"flex gap-2 items-center\">\n <div class=\"flex-1 flex rounded-lg\">\n <span\n class=\"material-symbols-outlined px-4 inline-flex items-center min-w-fit rounded-s-lg border-2 border-e-0 border-gray-300\"\n >link</span\n >\n <input\n type=\"text\"\n class=\"py-3 ps-1 block w-full border-2 border-s-0 border-e-0 border-gray-300 text-sm font-medium\"\n placeholder=\"https://exemple.com/image.jpg\"\n (change)=\"handleUrlChange($event)\"\n />\n <gn-ui-button\n class=\"px-1 inline-flex items-center min-w-fit rounded-e-lg border-2 border-s-0 border-gray-300 text-white\"\n [extraClass]=\"\n urlInputValue && !downloadError ? 'bg-blue-500' : 'bg-gray-500'\n \"\n [disabled]=\"!urlInputValue || downloadError\"\n (buttonClick)=\"downloadUrl()\"\n >\n <mat-icon class=\"material-symbols-outlined\">arrow_upward</mat-icon>\n </gn-ui-button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: FilesDropDirective, selector: "[gnUiFilesDrop]", outputs: ["dragFilesOver", "dropFiles"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i1$4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26313
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ImageInputComponent, isStandalone: true, selector: "gn-ui-image-input", inputs: { formControl: "formControl", maxSizeMB: "maxSizeMB", previewUrl: "previewUrl", altText: "altText", uploadProgress: "uploadProgress", uploadError: "uploadError" }, outputs: { fileChange: "fileChange", urlChange: "urlChange", uploadCancel: "uploadCancel", delete: "delete", altTextChange: "altTextChange" }, ngImport: i0, template: "<ng-container *ngIf=\"previewUrl; then withImage; else withoutImage\">\n</ng-container>\n\n<ng-template #withImage>\n <div class=\"w-full h-full flex flex-col gap-2\">\n <div class=\"flex-1 group relative\">\n <img\n class=\"w-full h-full object-cover border-2 border-gray-300 rounded-lg\"\n [alt]=\"altText\"\n loading=\"lazy\"\n [src]=\"previewUrl\"\n />\n <gn-ui-button\n [extraClass]=\"\n 'bg-gray-200 absolute right-2 bottom-2 invisible group-hover:visible'\n \"\n (buttonClick)=\"handleDelete()\"\n >\n <mat-icon class=\"material-symbols-outlined\">delete</mat-icon>\n </gn-ui-button>\n </div>\n <input\n *ngIf=\"showAltTextInput\"\n type=\"text\"\n class=\"py-3 px-2 border-2 border-gray-300 rounded-lg text-sm font-medium\"\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText\"\n (change)=\"handleAltTextChange($event)\"\n />\n <div class=\"flex flex-row gap-2\">\n <gn-ui-button\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"handleDelete()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">delete</mat-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n <gn-ui-button\n *ngIf=\"!showAltTextInput\"\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"toggleAltTextInput()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">add</mat-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #withoutImage>\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"block flex-1 border-2 border-dashed border-gray-300 rounded-lg p-6 flex flex-col items-center justify-center gap-4 hover:cursor-pointer\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n <div class=\"w-14 h-14 rounded-md bg-gray-200 grid\">\n <mat-icon\n *ngIf=\"!dragFilesOver && !uploadProgress && !uploadError\"\n class=\"material-symbols-outlined place-self-center text-blue-500\"\n >image</mat-icon\n >\n <mat-icon\n *ngIf=\"dragFilesOver && !uploadProgress && !uploadError\"\n class=\"material-symbols-outlined place-self-center text-blue-500\"\n >add_box</mat-icon\n >\n <div *ngIf=\"uploadProgress\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n [mode]=\"'determinate'\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n <span\n class=\"text-sm font-medium relative inline-block width-[30px] bottom-[40px] left-[15px]\"\n >\n {{ uploadProgress }}%\n </span>\n </div>\n <mat-icon\n *ngIf=\"uploadError\"\n class=\"material-symbols-outlined place-self-center text-rose-500\"\n >broken_image</mat-icon\n >\n </div>\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\">{{ getPrimaryText() | translate }}</p>\n <p\n class=\"text-sm\"\n [class]=\"\n uploadProgress || uploadError\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick()\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"showUrlInput || uploadProgress || uploadError\"\n />\n </label>\n <div *ngIf=\"!showUrlInput\" class=\"flex-none\">\n <gn-ui-button\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"displayUrlInput()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">link</mat-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n <div *ngIf=\"showUrlInput\" class=\"flex-none flex flex-col gap-2\">\n <div class=\"h-2\"></div>\n <div class=\"flex gap-2 items-center\">\n <div class=\"flex-1 flex rounded-lg\">\n <span\n class=\"material-symbols-outlined px-4 inline-flex items-center min-w-fit rounded-s-lg border-2 border-e-0 border-gray-300\"\n >link</span\n >\n <input\n type=\"text\"\n class=\"py-3 ps-1 block w-full border-2 border-s-0 border-e-0 border-gray-300 text-sm font-medium\"\n placeholder=\"https://exemple.com/image.jpg\"\n (change)=\"handleUrlChange($event)\"\n />\n <gn-ui-button\n class=\"px-1 inline-flex items-center min-w-fit rounded-e-lg border-2 border-s-0 border-gray-300 text-white\"\n [extraClass]=\"\n urlInputValue && !downloadError ? 'bg-blue-500' : 'bg-gray-500'\n \"\n [disabled]=\"!urlInputValue || downloadError\"\n (buttonClick)=\"downloadUrl()\"\n >\n <mat-icon class=\"material-symbols-outlined\">arrow_upward</mat-icon>\n </gn-ui-button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: FilesDropDirective, selector: "[gnUiFilesDrop]", outputs: ["dragFilesOver", "dropFiles"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i1$4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25975
26314
  }
25976
26315
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ImageInputComponent, decorators: [{
25977
26316
  type: Component,
@@ -25982,8 +26321,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
25982
26321
  FilesDropDirective,
25983
26322
  MatProgressSpinnerModule,
25984
26323
  TranslateModule,
25985
- ], template: "<ng-container *ngIf=\"previewUrl; then withImage; else withoutImage\">\n</ng-container>\n\n<ng-template #withImage>\n <div class=\"w-full h-full flex flex-col gap-2\">\n <div class=\"flex-1 group relative\">\n <img\n class=\"w-full h-full object-cover border-2 border-gray-300 rounded-lg\"\n [alt]=\"altText\"\n loading=\"lazy\"\n [src]=\"previewUrl\"\n />\n <gn-ui-button\n [extraClass]=\"\n 'bg-gray-200 absolute right-2 bottom-2 invisible group-hover:visible'\n \"\n (buttonClick)=\"handleDelete()\"\n >\n <mat-icon class=\"material-symbols-outlined\">delete</mat-icon>\n </gn-ui-button>\n </div>\n <input\n *ngIf=\"showAltTextInput\"\n type=\"text\"\n class=\"py-3 px-2 border-2 border-gray-300 rounded-lg text-sm font-medium\"\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText\"\n (change)=\"handleAltTextChange($event)\"\n />\n <div class=\"flex flex-row gap-2\">\n <gn-ui-button\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"handleDelete()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">delete</mat-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n <gn-ui-button\n *ngIf=\"!showAltTextInput\"\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"toggleAltTextInput()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">add</mat-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #withoutImage>\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"block flex-1 border-2 border-dashed border-gray-300 rounded-lg p-6 flex flex-col items-center justify-center gap-4\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n <div class=\"w-14 h-14 rounded-md bg-gray-200 grid\">\n <mat-icon\n *ngIf=\"!dragFilesOver && !uploadProgress && !uploadError\"\n class=\"material-symbols-outlined place-self-center text-blue-500\"\n >image</mat-icon\n >\n <mat-icon\n *ngIf=\"dragFilesOver && !uploadProgress && !uploadError\"\n class=\"material-symbols-outlined place-self-center text-blue-500\"\n >add_box</mat-icon\n >\n <div *ngIf=\"uploadProgress\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n [mode]=\"'determinate'\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n <span\n class=\"text-sm font-medium relative inline-block width-[30px] bottom-[40px] left-[15px]\"\n >\n {{ uploadProgress }}%\n </span>\n </div>\n <mat-icon\n *ngIf=\"uploadError\"\n class=\"material-symbols-outlined place-self-center text-rose-500\"\n >broken_image</mat-icon\n >\n </div>\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\">{{ getPrimaryText() | translate }}</p>\n <p\n class=\"text-sm\"\n [class]=\"\n uploadProgress || uploadError\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick()\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"showUrlInput || uploadProgress || uploadError\"\n />\n </label>\n <div *ngIf=\"!showUrlInput\" class=\"flex-none\">\n <gn-ui-button\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"displayUrlInput()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">link</mat-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n <div *ngIf=\"showUrlInput\" class=\"flex-none flex flex-col gap-2\">\n <div class=\"h-2\"></div>\n <div class=\"flex gap-2 items-center\">\n <div class=\"flex-1 flex rounded-lg\">\n <span\n class=\"material-symbols-outlined px-4 inline-flex items-center min-w-fit rounded-s-lg border-2 border-e-0 border-gray-300\"\n >link</span\n >\n <input\n type=\"text\"\n class=\"py-3 ps-1 block w-full border-2 border-s-0 border-e-0 border-gray-300 text-sm font-medium\"\n placeholder=\"https://exemple.com/image.jpg\"\n (change)=\"handleUrlChange($event)\"\n />\n <gn-ui-button\n class=\"px-1 inline-flex items-center min-w-fit rounded-e-lg border-2 border-s-0 border-gray-300 text-white\"\n [extraClass]=\"\n urlInputValue && !downloadError ? 'bg-blue-500' : 'bg-gray-500'\n \"\n [disabled]=\"!urlInputValue || downloadError\"\n (buttonClick)=\"downloadUrl()\"\n >\n <mat-icon class=\"material-symbols-outlined\">arrow_upward</mat-icon>\n </gn-ui-button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n" }]
25986
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { maxSizeMB: [{
26324
+ ReactiveFormsModule,
26325
+ ], template: "<ng-container *ngIf=\"previewUrl; then withImage; else withoutImage\">\n</ng-container>\n\n<ng-template #withImage>\n <div class=\"w-full h-full flex flex-col gap-2\">\n <div class=\"flex-1 group relative\">\n <img\n class=\"w-full h-full object-cover border-2 border-gray-300 rounded-lg\"\n [alt]=\"altText\"\n loading=\"lazy\"\n [src]=\"previewUrl\"\n />\n <gn-ui-button\n [extraClass]=\"\n 'bg-gray-200 absolute right-2 bottom-2 invisible group-hover:visible'\n \"\n (buttonClick)=\"handleDelete()\"\n >\n <mat-icon class=\"material-symbols-outlined\">delete</mat-icon>\n </gn-ui-button>\n </div>\n <input\n *ngIf=\"showAltTextInput\"\n type=\"text\"\n class=\"py-3 px-2 border-2 border-gray-300 rounded-lg text-sm font-medium\"\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText\"\n (change)=\"handleAltTextChange($event)\"\n />\n <div class=\"flex flex-row gap-2\">\n <gn-ui-button\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"handleDelete()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">delete</mat-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n <gn-ui-button\n *ngIf=\"!showAltTextInput\"\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"toggleAltTextInput()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">add</mat-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #withoutImage>\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"block flex-1 border-2 border-dashed border-gray-300 rounded-lg p-6 flex flex-col items-center justify-center gap-4 hover:cursor-pointer\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n <div class=\"w-14 h-14 rounded-md bg-gray-200 grid\">\n <mat-icon\n *ngIf=\"!dragFilesOver && !uploadProgress && !uploadError\"\n class=\"material-symbols-outlined place-self-center text-blue-500\"\n >image</mat-icon\n >\n <mat-icon\n *ngIf=\"dragFilesOver && !uploadProgress && !uploadError\"\n class=\"material-symbols-outlined place-self-center text-blue-500\"\n >add_box</mat-icon\n >\n <div *ngIf=\"uploadProgress\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n [mode]=\"'determinate'\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n <span\n class=\"text-sm font-medium relative inline-block width-[30px] bottom-[40px] left-[15px]\"\n >\n {{ uploadProgress }}%\n </span>\n </div>\n <mat-icon\n *ngIf=\"uploadError\"\n class=\"material-symbols-outlined place-self-center text-rose-500\"\n >broken_image</mat-icon\n >\n </div>\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\">{{ getPrimaryText() | translate }}</p>\n <p\n class=\"text-sm\"\n [class]=\"\n uploadProgress || uploadError\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick()\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"showUrlInput || uploadProgress || uploadError\"\n />\n </label>\n <div *ngIf=\"!showUrlInput\" class=\"flex-none\">\n <gn-ui-button\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"displayUrlInput()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">link</mat-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n <div *ngIf=\"showUrlInput\" class=\"flex-none flex flex-col gap-2\">\n <div class=\"h-2\"></div>\n <div class=\"flex gap-2 items-center\">\n <div class=\"flex-1 flex rounded-lg\">\n <span\n class=\"material-symbols-outlined px-4 inline-flex items-center min-w-fit rounded-s-lg border-2 border-e-0 border-gray-300\"\n >link</span\n >\n <input\n type=\"text\"\n class=\"py-3 ps-1 block w-full border-2 border-s-0 border-e-0 border-gray-300 text-sm font-medium\"\n placeholder=\"https://exemple.com/image.jpg\"\n (change)=\"handleUrlChange($event)\"\n />\n <gn-ui-button\n class=\"px-1 inline-flex items-center min-w-fit rounded-e-lg border-2 border-s-0 border-gray-300 text-white\"\n [extraClass]=\"\n urlInputValue && !downloadError ? 'bg-blue-500' : 'bg-gray-500'\n \"\n [disabled]=\"!urlInputValue || downloadError\"\n (buttonClick)=\"downloadUrl()\"\n >\n <mat-icon class=\"material-symbols-outlined\">arrow_upward</mat-icon>\n </gn-ui-button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n" }]
26326
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { formControl: [{
26327
+ type: Input
26328
+ }], maxSizeMB: [{
25987
26329
  type: Input
25988
26330
  }], previewUrl: [{
25989
26331
  type: Input
@@ -26775,11 +27117,11 @@ class MetadataQualityItemComponent {
26775
27117
  return `record.metadata.quality.${this.name}.${this.value ? 'success' : 'failed'}`;
26776
27118
  }
26777
27119
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataQualityItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26778
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: { name: "name", value: "value" }, ngImport: i0, template: "<div class=\"ml-4 flex flex-row\">\n <mat-icon class=\"material-symbols-outlined\">{{ icon }}</mat-icon>\n <p class=\"ml-2 text\">{{ labelKey | translate }}</p>\n</div>\n", dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27120
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: { name: "name", value: "value" }, ngImport: i0, template: "<div class=\"ml-4 flex flex-row\">\n <mat-icon class=\"material-symbols-outlined min-w-fit\">{{ icon }}</mat-icon>\n <p class=\"ml-2 text\">{{ labelKey | translate }}</p>\n</div>\n", dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26779
27121
  }
26780
27122
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataQualityItemComponent, decorators: [{
26781
27123
  type: Component,
26782
- args: [{ selector: 'gn-ui-metadata-quality-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ml-4 flex flex-row\">\n <mat-icon class=\"material-symbols-outlined\">{{ icon }}</mat-icon>\n <p class=\"ml-2 text\">{{ labelKey | translate }}</p>\n</div>\n" }]
27124
+ args: [{ selector: 'gn-ui-metadata-quality-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ml-4 flex flex-row\">\n <mat-icon class=\"material-symbols-outlined min-w-fit\">{{ icon }}</mat-icon>\n <p class=\"ml-2 text\">{{ labelKey | translate }}</p>\n</div>\n" }]
26783
27125
  }], propDecorators: { name: [{
26784
27126
  type: Input
26785
27127
  }], value: [{
@@ -26790,7 +27132,6 @@ class MetadataQualityComponent {
26790
27132
  constructor() {
26791
27133
  this.smaller = false;
26792
27134
  this.items = [];
26793
- this.isMenuShown = false;
26794
27135
  }
26795
27136
  get qualityScore() {
26796
27137
  const qualityScore = this.metadata?.extras?.qualityScore;
@@ -26801,12 +27142,6 @@ class MetadataQualityComponent {
26801
27142
  get calculatedQualityScore() {
26802
27143
  return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
26803
27144
  }
26804
- showMenu() {
26805
- this.isMenuShown = true;
26806
- }
26807
- hideMenu() {
26808
- this.isMenuShown = false;
26809
- }
26810
27145
  add(name, value) {
26811
27146
  if (this.metadataQualityDisplay?.[name] !== false) {
26812
27147
  this.items.push({ name, value });
@@ -26830,11 +27165,11 @@ class MetadataQualityComponent {
26830
27165
  }
26831
27166
  }
26832
27167
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataQualityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26833
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: { metadata: "metadata", smaller: "smaller", metadataQualityDisplay: "metadataQualityDisplay" }, usesOnChanges: true, ngImport: i0, template: "<div\n *ngIf=\"metadataQualityDisplay\"\n class=\"mb-6 metadata-quality\"\n (mouseenter)=\"showMenu()\"\n (mouseleave)=\"hideMenu()\"\n>\n <div class=\"min-w-[200px]\" [class]=\"smaller ? 'leading-[8px]' : ''\">\n <gn-ui-progress-bar\n (focus)=\"showMenu()\"\n (blur)=\"hideMenu()\"\n tabindex=\"0\"\n [value]=\"qualityScore\"\n type=\"primary\"\n ></gn-ui-progress-bar>\n </div>\n <div\n class=\"absolute z-10 bg-white border border-black border-opacity-35 rounded-lg shadow-lg p-5 whitespace-nowrap\"\n [class]=\"isMenuShown ? 'block' : 'hidden'\"\n >\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</div>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\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: ProgressBarComponent, selector: "gn-ui-progress-bar", inputs: ["value", "type"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: ["name", "value"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27168
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: { metadata: "metadata", smaller: "smaller", metadataQualityDisplay: "metadataQualityDisplay" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"metadataQualityDisplay\" class=\"mb-6 metadata-quality\">\n <gn-ui-popover [content]=\"popoverItems\" theme=\"light-border\">\n <div class=\"min-w-[200px]\" [class]=\"smaller ? 'leading-[8px]' : ''\">\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n type=\"primary\"\n ></gn-ui-progress-bar>\n </div>\n </gn-ui-popover>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\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: ProgressBarComponent, selector: "gn-ui-progress-bar", inputs: ["value", "type"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: ["name", "value"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26834
27169
  }
26835
27170
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataQualityComponent, decorators: [{
26836
27171
  type: Component,
26837
- args: [{ selector: 'gn-ui-metadata-quality', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"metadataQualityDisplay\"\n class=\"mb-6 metadata-quality\"\n (mouseenter)=\"showMenu()\"\n (mouseleave)=\"hideMenu()\"\n>\n <div class=\"min-w-[200px]\" [class]=\"smaller ? 'leading-[8px]' : ''\">\n <gn-ui-progress-bar\n (focus)=\"showMenu()\"\n (blur)=\"hideMenu()\"\n tabindex=\"0\"\n [value]=\"qualityScore\"\n type=\"primary\"\n ></gn-ui-progress-bar>\n </div>\n <div\n class=\"absolute z-10 bg-white border border-black border-opacity-35 rounded-lg shadow-lg p-5 whitespace-nowrap\"\n [class]=\"isMenuShown ? 'block' : 'hidden'\"\n >\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</div>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"] }]
27172
+ args: [{ selector: 'gn-ui-metadata-quality', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"metadataQualityDisplay\" class=\"mb-6 metadata-quality\">\n <gn-ui-popover [content]=\"popoverItems\" theme=\"light-border\">\n <div class=\"min-w-[200px]\" [class]=\"smaller ? 'leading-[8px]' : ''\">\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n type=\"primary\"\n ></gn-ui-progress-bar>\n </div>\n </gn-ui-popover>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"] }]
26838
27173
  }], propDecorators: { metadata: [{
26839
27174
  type: Input
26840
27175
  }], smaller: [{
@@ -27029,11 +27364,11 @@ class ApiCardComponent {
27029
27364
  }
27030
27365
  }
27031
27366
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27032
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ApiCardComponent, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden\"\n [ngClass]=\"{ 'cursor-pointer': displayApiFormButton }\"\n (click)=\"openRecordApiFormPanel()\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <gn-ui-copy-text-button\n *ngIf=\"!displayApiFormButton\"\n [text]=\"link.url.toString()\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive\n }\"\n >more_horiz</mat-icon\n >\n </button>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.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: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27367
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ApiCardComponent, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden cursor-default\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <div class=\"flex flex-row gap-2 items-center\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive\n }\"\n >more_horiz</mat-icon\n >\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.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: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27033
27368
  }
27034
27369
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiCardComponent, decorators: [{
27035
27370
  type: Component,
27036
- args: [{ selector: 'gn-ui-api-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden\"\n [ngClass]=\"{ 'cursor-pointer': displayApiFormButton }\"\n (click)=\"openRecordApiFormPanel()\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <gn-ui-copy-text-button\n *ngIf=\"!displayApiFormButton\"\n [text]=\"link.url.toString()\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive\n }\"\n >more_horiz</mat-icon\n >\n </button>\n </div>\n </div>\n</div>\n" }]
27371
+ args: [{ selector: 'gn-ui-api-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden cursor-default\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <div class=\"flex flex-row gap-2 items-center\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive\n }\"\n >more_horiz</mat-icon\n >\n </button>\n </div>\n </div>\n </div>\n</div>\n" }]
27037
27372
  }], propDecorators: { link: [{
27038
27373
  type: Input
27039
27374
  }], currentLink: [{
@@ -27829,7 +28164,7 @@ class RecordApiFormComponent {
27829
28164
  }
27830
28165
  }
27831
28166
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27832
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div\n *ngIf=\"!supportOffset\"\n class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\"\n >\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n </div>\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]=\"outputFormats\"\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$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { 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", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required", "disabled"], 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 }); }
28167
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div\n *ngIf=\"!supportOffset\"\n class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\"\n >\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n </div>\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]=\"outputFormats\"\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$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { 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", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required", "disabled"], 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 }); }
27833
28168
  }
27834
28169
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordApiFormComponent, decorators: [{
27835
28170
  type: Component,
@@ -27857,7 +28192,7 @@ class RelatedRecordCardComponent {
27857
28192
  return `${this.baseClasses} ${this.extraClass}`;
27858
28193
  }
27859
28194
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27860
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RelatedRecordCardComponent, selector: "gn-ui-related-record-card", inputs: { record: "record", extraClass: "extraClass" }, ngImport: i0, template: "<a\n [class]=\"classList\"\n [routerLink]=\"['/dataset', record.uniqueIdentifier]\"\n target=\"_blank\"\n>\n <div class=\"h-52 bg-gray-100\">\n <gn-ui-thumbnail\n class=\"h-52 w-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col justify-between h-44 px-5 pt-4 pb-6\">\n <h4\n class=\"max-h-24 font-title text-21 text-black text-ellipsis overflow-hidden\"\n >\n {{ record.title }}\n </h4>\n <div>\n <button\n mat-raised-button\n [matTooltip]=\"'tooltip.url.open' | translate\"\n matTooltipPosition=\"above\"\n >\n <mat-icon class=\"material-symbols-outlined align-middle text-secondary\"\n >open_in_new</mat-icon\n >\n </button>\n </div>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1$7.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28195
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RelatedRecordCardComponent, selector: "gn-ui-related-record-card", inputs: { record: "record", extraClass: "extraClass" }, ngImport: i0, template: "<a\n [class]=\"classList\"\n [routerLink]=\"['/dataset', record.uniqueIdentifier]\"\n target=\"_blank\"\n>\n <div class=\"h-52 bg-gray-100\">\n <gn-ui-thumbnail\n class=\"h-52 w-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col justify-between h-44 px-5 pt-4 pb-6\">\n <h4\n class=\"max-h-24 font-title text-21 text-black text-ellipsis overflow-hidden\"\n >\n {{ record.title }}\n </h4>\n <div>\n <button\n mat-raised-button\n [matTooltip]=\"'tooltip.url.open' | translate\"\n matTooltipPosition=\"above\"\n >\n <mat-icon class=\"material-symbols-outlined align-middle text-secondary\"\n >open_in_new</mat-icon\n >\n </button>\n </div>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1$7.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27861
28196
  }
27862
28197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
27863
28198
  type: Component,
@@ -28032,7 +28367,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28032
28367
 
28033
28368
  class FormFieldWrapperComponent {
28034
28369
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28035
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldWrapperComponent, isStandalone: true, selector: "gn-ui-form-field-wrapper", inputs: { label: "label", hint: "hint" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28370
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldWrapperComponent, isStandalone: true, selector: "gn-ui-form-field-wrapper", inputs: { label: "label", hint: "hint" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28036
28371
  }
28037
28372
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
28038
28373
  type: Component,
@@ -28288,11 +28623,11 @@ class UserPreviewComponent {
28288
28623
  return (this.user.name + ' ' + this.user.surname).trim();
28289
28624
  }
28290
28625
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28291
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UserPreviewComponent, selector: "gn-ui-user-preview", inputs: { user: "user", avatarPlaceholder: "avatarPlaceholder" }, ngImport: i0, template: "<figure class=\"text-center\">\n <div\n class=\"w-12 h-12 border border-primary rounded-full capitalize\"\n [matTooltip]=\"userFullName\"\n >\n <gn-ui-avatar\n [avatarUrl]=\"user.profileIcon\"\n [avatarPlaceholder]=\"avatarPlaceholder\"\n ></gn-ui-avatar>\n </div>\n</figure>\n", dependencies: [{ kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AvatarComponent, selector: "gn-ui-avatar", inputs: ["avatarUrl", "avatarPlaceholder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28626
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UserPreviewComponent, selector: "gn-ui-user-preview", inputs: { user: "user", avatarPlaceholder: "avatarPlaceholder" }, ngImport: i0, template: "<figure class=\"text-center\">\n <div\n class=\"w-10 h-10 border border-primary rounded-full capitalize\"\n [matTooltip]=\"userFullName\"\n >\n <gn-ui-avatar\n [avatarUrl]=\"user.profileIcon\"\n [avatarPlaceholder]=\"avatarPlaceholder\"\n ></gn-ui-avatar>\n </div>\n</figure>\n", dependencies: [{ kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AvatarComponent, selector: "gn-ui-avatar", inputs: ["avatarUrl", "avatarPlaceholder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28292
28627
  }
28293
28628
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserPreviewComponent, decorators: [{
28294
28629
  type: Component,
28295
- args: [{ selector: 'gn-ui-user-preview', changeDetection: ChangeDetectionStrategy.OnPush, template: "<figure class=\"text-center\">\n <div\n class=\"w-12 h-12 border border-primary rounded-full capitalize\"\n [matTooltip]=\"userFullName\"\n >\n <gn-ui-avatar\n [avatarUrl]=\"user.profileIcon\"\n [avatarPlaceholder]=\"avatarPlaceholder\"\n ></gn-ui-avatar>\n </div>\n</figure>\n" }]
28630
+ args: [{ selector: 'gn-ui-user-preview', changeDetection: ChangeDetectionStrategy.OnPush, template: "<figure class=\"text-center\">\n <div\n class=\"w-10 h-10 border border-primary rounded-full capitalize\"\n [matTooltip]=\"userFullName\"\n >\n <gn-ui-avatar\n [avatarUrl]=\"user.profileIcon\"\n [avatarPlaceholder]=\"avatarPlaceholder\"\n ></gn-ui-avatar>\n </div>\n</figure>\n" }]
28296
28631
  }], propDecorators: { user: [{
28297
28632
  type: Input
28298
28633
  }], avatarPlaceholder: [{
@@ -28432,6 +28767,7 @@ class UiElementsModule {
28432
28767
  UiInputsModule,
28433
28768
  FormsModule,
28434
28769
  NgOptimizedImage,
28770
+ PopoverComponent,
28435
28771
  MarkdownParserComponent,
28436
28772
  ThumbnailComponent,
28437
28773
  TimeSincePipe,
@@ -28466,6 +28802,7 @@ class UiElementsModule {
28466
28802
  RouterModule,
28467
28803
  UiInputsModule,
28468
28804
  FormsModule,
28805
+ PopoverComponent,
28469
28806
  ThumbnailComponent,
28470
28807
  BadgeComponent,
28471
28808
  MaxLinesComponent] }); }
@@ -28485,6 +28822,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28485
28822
  UiInputsModule,
28486
28823
  FormsModule,
28487
28824
  NgOptimizedImage,
28825
+ PopoverComponent,
28488
28826
  MarkdownParserComponent,
28489
28827
  ThumbnailComponent,
28490
28828
  TimeSincePipe,
@@ -28641,6 +28979,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28641
28979
  }]
28642
28980
  }] });
28643
28981
 
28982
+ class ActionMenuComponent {
28983
+ constructor() {
28984
+ this.duplicate = new EventEmitter();
28985
+ }
28986
+ openMenu() {
28987
+ this.trigger.openMenu();
28988
+ }
28989
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ActionMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28990
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ActionMenuComponent, isStandalone: true, selector: "gn-ui-action-menu", outputs: { duplicate: "duplicate" }, viewQueries: [{ propertyName: "trigger", first: true, predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n [matMenuTriggerFor]=\"menu\"\n (buttonClick)=\"openMenu()\"\n data-test=\"record-menu-button\"\n>\n <mat-icon class=\"material-symbols-outlined\">more_vert</mat-icon>\n</gn-ui-button>\n<mat-menu #menu=\"matMenu\">\n <button\n mat-menu-item\n (click)=\"duplicate.emit()\"\n data-test=\"record-menu-duplicate-button\"\n >\n <span translate>record.action.duplicate</span>\n </button>\n</mat-menu>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { 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: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2$4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i2$4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2$4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); }
28991
+ }
28992
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ActionMenuComponent, decorators: [{
28993
+ type: Component,
28994
+ args: [{ selector: 'gn-ui-action-menu', standalone: true, imports: [MatIconModule, ButtonComponent, MatMenuModule, TranslateModule], template: "<gn-ui-button\n type=\"outline\"\n [matMenuTriggerFor]=\"menu\"\n (buttonClick)=\"openMenu()\"\n data-test=\"record-menu-button\"\n>\n <mat-icon class=\"material-symbols-outlined\">more_vert</mat-icon>\n</gn-ui-button>\n<mat-menu #menu=\"matMenu\">\n <button\n mat-menu-item\n (click)=\"duplicate.emit()\"\n data-test=\"record-menu-duplicate-button\"\n >\n <span translate>record.action.duplicate</span>\n </button>\n</mat-menu>\n" }]
28995
+ }], propDecorators: { duplicate: [{
28996
+ type: Output
28997
+ }], trigger: [{
28998
+ type: ViewChild,
28999
+ args: [MatMenuTrigger]
29000
+ }] } });
29001
+
28644
29002
  class ResultsTableComponent {
28645
29003
  constructor() {
28646
29004
  this.records = [];
@@ -28650,6 +29008,7 @@ class ResultsTableComponent {
28650
29008
  // emits the column (field) as well as the order
28651
29009
  this.sortByChange = new EventEmitter();
28652
29010
  this.recordClick = new EventEmitter();
29011
+ this.duplicateRecord = new EventEmitter();
28653
29012
  this.recordsSelectedChange = new EventEmitter();
28654
29013
  }
28655
29014
  dateToString(date) {
@@ -28684,6 +29043,9 @@ class ResultsTableComponent {
28684
29043
  handleRecordClick(item) {
28685
29044
  this.recordClick.emit(item);
28686
29045
  }
29046
+ handleDuplicate(item) {
29047
+ this.duplicateRecord.emit(item);
29048
+ }
28687
29049
  setSortBy(col, order) {
28688
29050
  this.sortByChange.emit([col, order]);
28689
29051
  }
@@ -28719,7 +29081,7 @@ class ResultsTableComponent {
28719
29081
  return !allSelected && someSelected;
28720
29082
  }
28721
29083
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28722
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", inputs: { records: "records", selectedRecordsIdentifiers: "selectedRecordsIdentifiers", sortOrder: "sortOrder", recordHasDraft: "recordHasDraft" }, outputs: { sortByChange: "sortByChange", recordClick: "recordClick", recordsSelectedChange: "recordsSelectedChange" }, ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records\"\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()\"\n [indeterminate]=\"isSomeSelected()\"\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)\"\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')\"\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 <div class=\"flex flex-row items-center gap-2 max-w-full\">\n <span class=\"overflow-hidden text-ellipsis\">{{ item.title }}</span>\n <gn-ui-badge\n *ngIf=\"recordHasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.4em 0.6em'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\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 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 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"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')\"\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')\"\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: "ngmodule", type: UiInputsModule }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { 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"] }] }); }
29084
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", inputs: { records: "records", selectedRecordsIdentifiers: "selectedRecordsIdentifiers", sortOrder: "sortOrder", recordHasDraft: "recordHasDraft" }, outputs: { sortByChange: "sortByChange", recordClick: "recordClick", duplicateRecord: "duplicateRecord", recordsSelectedChange: "recordsSelectedChange" }, ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records\"\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()\"\n [indeterminate]=\"isSomeSelected()\"\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)\"\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')\"\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 <div class=\"flex flex-row items-center gap-2 max-w-full\">\n <span class=\"overflow-hidden text-ellipsis\">{{ item.title }}</span>\n <gn-ui-badge\n *ngIf=\"recordHasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.4em 0.6em'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\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 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 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"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')\"\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')\"\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\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-action-menu (duplicate)=\"handleDuplicate(item)\">\n </gn-ui-action-menu>\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: "ngmodule", type: UiInputsModule }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { 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"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", outputs: ["duplicate"] }] }); }
28723
29085
  }
28724
29086
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableComponent, decorators: [{
28725
29087
  type: Component,
@@ -28731,7 +29093,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28731
29093
  MatIconModule,
28732
29094
  TranslateModule,
28733
29095
  BadgeComponent,
28734
- ], template: "<gn-ui-interactive-table\n [items]=\"records\"\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()\"\n [indeterminate]=\"isSomeSelected()\"\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)\"\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')\"\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 <div class=\"flex flex-row items-center gap-2 max-w-full\">\n <span class=\"overflow-hidden text-ellipsis\">{{ item.title }}</span>\n <gn-ui-badge\n *ngIf=\"recordHasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.4em 0.6em'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\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 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 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"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')\"\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')\"\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" }]
29096
+ ActionMenuComponent,
29097
+ ], template: "<gn-ui-interactive-table\n [items]=\"records\"\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()\"\n [indeterminate]=\"isSomeSelected()\"\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)\"\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')\"\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 <div class=\"flex flex-row items-center gap-2 max-w-full\">\n <span class=\"overflow-hidden text-ellipsis\">{{ item.title }}</span>\n <gn-ui-badge\n *ngIf=\"recordHasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.4em 0.6em'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\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 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 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"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')\"\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')\"\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\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-action-menu (duplicate)=\"handleDuplicate(item)\">\n </gn-ui-action-menu>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
28735
29098
  }], propDecorators: { records: [{
28736
29099
  type: Input
28737
29100
  }], selectedRecordsIdentifiers: [{
@@ -28744,6 +29107,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28744
29107
  type: Output
28745
29108
  }], recordClick: [{
28746
29109
  type: Output
29110
+ }], duplicateRecord: [{
29111
+ type: Output
28747
29112
  }], recordsSelectedChange: [{
28748
29113
  type: Output
28749
29114
  }] } });
@@ -30725,6 +31090,7 @@ class ResultsTableContainerComponent {
30725
31090
  this.selectionService = selectionService;
30726
31091
  this.recordsRepository = recordsRepository;
30727
31092
  this.recordClick = new EventEmitter();
31093
+ this.duplicateRecord = new EventEmitter();
30728
31094
  this.records$ = this.searchFacade.results$;
30729
31095
  this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
30730
31096
  this.sortBy$ = this.searchFacade.sortBy$;
@@ -30733,6 +31099,9 @@ class ResultsTableContainerComponent {
30733
31099
  handleRecordClick(item) {
30734
31100
  this.recordClick.emit(item);
30735
31101
  }
31102
+ handleDuplicateRecord(item) {
31103
+ this.duplicateRecord.emit(item);
31104
+ }
30736
31105
  handleSortByChange(col, order) {
30737
31106
  this.searchService.setSortBy([order, col]);
30738
31107
  }
@@ -30745,13 +31114,15 @@ class ResultsTableContainerComponent {
30745
31114
  }
30746
31115
  }
30747
31116
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableContainerComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: SelectionService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
30748
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ResultsTableContainerComponent, isStandalone: true, selector: "gn-ui-results-table-container", outputs: { recordClick: "recordClick" }, ngImport: i0, template: "<gn-ui-results-table\n [records]=\"records$ | async\"\n [recordHasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n (recordClick)=\"handleRecordClick($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "component", type: ResultsTableComponent, selector: "gn-ui-results-table", inputs: ["records", "selectedRecordsIdentifiers", "sortOrder", "recordHasDraft"], outputs: ["sortByChange", "recordClick", "recordsSelectedChange"] }] }); }
31117
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ResultsTableContainerComponent, isStandalone: true, selector: "gn-ui-results-table-container", outputs: { recordClick: "recordClick", duplicateRecord: "duplicateRecord" }, ngImport: i0, template: "<gn-ui-results-table\n [records]=\"records$ | async\"\n [recordHasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n (recordClick)=\"handleRecordClick($event)\"\n (duplicateRecord)=\"handleDuplicateRecord($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "component", type: ResultsTableComponent, selector: "gn-ui-results-table", inputs: ["records", "selectedRecordsIdentifiers", "sortOrder", "recordHasDraft"], outputs: ["sortByChange", "recordClick", "duplicateRecord", "recordsSelectedChange"] }] }); }
30749
31118
  }
30750
31119
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableContainerComponent, decorators: [{
30751
31120
  type: Component,
30752
- args: [{ selector: 'gn-ui-results-table-container', standalone: true, imports: [CommonModule, ResultsTableComponent], template: "<gn-ui-results-table\n [records]=\"records$ | async\"\n [recordHasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n (recordClick)=\"handleRecordClick($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n" }]
31121
+ args: [{ selector: 'gn-ui-results-table-container', standalone: true, imports: [CommonModule, ResultsTableComponent], template: "<gn-ui-results-table\n [records]=\"records$ | async\"\n [recordHasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n (recordClick)=\"handleRecordClick($event)\"\n (duplicateRecord)=\"handleDuplicateRecord($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n" }]
30753
31122
  }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }]; }, propDecorators: { recordClick: [{
30754
31123
  type: Output
31124
+ }], duplicateRecord: [{
31125
+ type: Output
30755
31126
  }] } });
30756
31127
 
30757
31128
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
@@ -31793,7 +32164,7 @@ class TableComponent {
31793
32164
  return rowIdPrefix + id;
31794
32165
  }
31795
32166
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
31796
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableComponent, isStandalone: true, selector: "gn-ui-table", inputs: { data: "data", activeId: "activeId" }, outputs: { selected: "selected" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], ngImport: i0, template: "<div class=\"border border-gray-300 rounded-lg overflow-hidden bg-white h-full\">\n <cdk-virtual-scroll-viewport\n tvsItemSize=\"48\"\n headerHeight=\"56\"\n style=\"height: calc(100% - 37px)\"\n >\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z8\" matSort>\n <ng-container *ngFor=\"let prop of properties\" [matColumnDef]=\"prop\">\n <th\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n class=\"text-sm text-black bg-white\"\n >\n {{ prop }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n class=\"whitespace-nowrap pr-1 truncate\"\n >\n {{ element[prop] }}\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"properties; sticky: true\"></tr>\n <tr\n [id]=\"getRowEltId(row.id)\"\n mat-row\n *matRowDef=\"let row; columns: properties\"\n (click)=\"selected.emit(row)\"\n [class.active]=\"row.id === activeId\"\n ></tr>\n </table>\n </cdk-virtual-scroll-viewport>\n <div class=\"text-gray-900 border-t border-gray-300 px-4 py-2 text-sm\">\n <span class=\"count font-extrabold text-primary\">{{ count }}</span\n >&nbsp;<span translate>table.object.count</span>.\n </div>\n</div>\n", styles: ["table{width:100%;background:white}th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding-right:20px}tr.mat-mdc-row,tr.mat-mdc-footer-row{height:36px}tr:hover{background:whitesmoke}tr.mat-mdc-header-row{height:48px}[mat-header-cell]{color:#0000008a;font-size:12px;font-weight:500}tr{cursor:pointer}.active .mat-mdc-cell{color:var(--color-primary)}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1$9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i1$9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i1$9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i2$6.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i2$6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: TableVirtualScrollModule }, { kind: "directive", type: i3$2.TableItemSizeDirective, selector: "cdk-virtual-scroll-viewport[tvsItemSize]", inputs: ["tvsItemSize", "headerEnabled", "headerHeight", "footerEnabled", "footerHeight", "bufferMultiplier"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32167
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableComponent, isStandalone: true, selector: "gn-ui-table", inputs: { data: "data", activeId: "activeId" }, outputs: { selected: "selected" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], ngImport: i0, template: "<div class=\"border border-gray-300 rounded-lg overflow-hidden bg-white h-full\">\n <cdk-virtual-scroll-viewport\n tvsItemSize=\"48\"\n headerHeight=\"56\"\n style=\"height: calc(100% - 37px)\"\n >\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z8\" matSort>\n <ng-container *ngFor=\"let prop of properties\" [matColumnDef]=\"prop\">\n <th\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n class=\"text-sm text-black bg-white\"\n >\n {{ prop }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n class=\"whitespace-nowrap pr-1 truncate\"\n >\n {{ element[prop] }}\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"properties; sticky: true\"></tr>\n <tr\n [id]=\"getRowEltId(row.id)\"\n mat-row\n *matRowDef=\"let row; columns: properties\"\n (click)=\"selected.emit(row)\"\n [class.active]=\"row.id === activeId\"\n ></tr>\n </table>\n </cdk-virtual-scroll-viewport>\n <div class=\"text-gray-900 border-t border-gray-300 px-4 py-2 text-sm\">\n <span class=\"count font-extrabold text-primary\">{{ count }}</span\n >&nbsp;<span translate>table.object.count</span>.\n </div>\n</div>\n", styles: ["table{width:100%;background:white}th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding-right:20px}tr.mat-mdc-row,tr.mat-mdc-footer-row{height:36px}tr:hover{background:whitesmoke}tr.mat-mdc-header-row{height:48px}[mat-header-cell]{color:#0000008a;font-size:12px;font-weight:500}tr{cursor:pointer}.active .mat-mdc-cell{color:var(--color-primary)}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1$9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i1$9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i1$9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i2$6.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i2$6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: TableVirtualScrollModule }, { kind: "directive", type: i3$3.TableItemSizeDirective, selector: "cdk-virtual-scroll-viewport[tvsItemSize]", inputs: ["tvsItemSize", "headerEnabled", "headerHeight", "footerEnabled", "footerHeight", "bufferMultiplier"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31797
32168
  }
31798
32169
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableComponent, decorators: [{
31799
32170
  type: Component,
@@ -33939,37 +34310,54 @@ const GN_UI_VERSION = new InjectionToken('gnUiVersion');
33939
34310
 
33940
34311
  const WEB_COMPONENT_EMBEDDER_URL = new InjectionToken('webComponentEmbedderUrl');
33941
34312
  class DataViewPermalinkComponent {
34313
+ set viewType(value) {
34314
+ this.viewType$.next(value);
34315
+ }
33942
34316
  constructor(config, wcEmbedderBaseUrl, version, facade) {
33943
34317
  this.config = config;
33944
34318
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
33945
34319
  this.version = version;
33946
34320
  this.facade = facade;
34321
+ this.viewType$ = new BehaviorSubject('map');
33947
34322
  this.permalinkUrl$ = combineLatest([
34323
+ this.viewType$,
33948
34324
  this.facade.chartConfig$,
33949
34325
  this.facade.metadata$,
33950
- ]).pipe(map$2(([config, metadata]) => {
33951
- if (config) {
33952
- const { aggregation, xProperty, yProperty, chartType } = config;
33953
- const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
33954
- url.searchParams.set('v', `${this.version}`);
33955
- url.searchParams.append('e', `gn-dataset-view-chart`);
33956
- url.searchParams.append('a', `api-url=${this.config.basePath}`);
33957
- url.searchParams.append('a', `dataset-id=${metadata.uniqueIdentifier}`);
33958
- url.searchParams.append('a', `primary-color=#0f4395`);
33959
- url.searchParams.append('a', `secondary-color=#8bc832`);
33960
- url.searchParams.append('a', `main-color=#555`);
33961
- url.searchParams.append('a', `background-color=#fdfbff`);
33962
- url.searchParams.append('a', `aggregation=${aggregation}`);
33963
- url.searchParams.append('a', `x-property=${xProperty}`);
33964
- url.searchParams.append('a', `y-property=${yProperty}`);
33965
- url.searchParams.append('a', `chart-type=${chartType}`);
33966
- return url.toString();
34326
+ ]).pipe(map$2(([viewType, config, metadata]) => {
34327
+ const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
34328
+ url.searchParams.set('v', `${this.version}`);
34329
+ if (viewType === 'chart') {
34330
+ if (config) {
34331
+ const { aggregation, xProperty, yProperty, chartType } = config;
34332
+ url.searchParams.append('e', `gn-dataset-view-chart`);
34333
+ url.searchParams.append('a', `aggregation=${aggregation}`);
34334
+ url.searchParams.append('a', `x-property=${xProperty}`);
34335
+ url.searchParams.append('a', `y-property=${yProperty}`);
34336
+ url.searchParams.append('a', `chart-type=${chartType}`);
34337
+ }
34338
+ else {
34339
+ return '';
34340
+ }
33967
34341
  }
33968
- return '';
34342
+ else if (viewType === 'table') {
34343
+ // table
34344
+ url.searchParams.append('e', `gn-dataset-view-table`);
34345
+ }
34346
+ else {
34347
+ // map
34348
+ url.searchParams.append('e', `gn-dataset-view-map`);
34349
+ }
34350
+ url.searchParams.append('a', `api-url=${this.config.basePath}`);
34351
+ url.searchParams.append('a', `dataset-id=${metadata.uniqueIdentifier}`);
34352
+ url.searchParams.append('a', `primary-color=#0f4395`);
34353
+ url.searchParams.append('a', `secondary-color=#8bc832`);
34354
+ url.searchParams.append('a', `main-color=#555`);
34355
+ url.searchParams.append('a', `background-color=#fdfbff`);
34356
+ return url.toString();
33969
34357
  }));
33970
34358
  }
33971
34359
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewPermalinkComponent, deps: [{ token: Configuration }, { token: WEB_COMPONENT_EMBEDDER_URL, optional: true }, { token: GN_UI_VERSION }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
33972
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataViewPermalinkComponent, selector: "gn-ui-data-view-permalink", ngImport: i0, template: "<gn-ui-copy-text-button\n *ngIf=\"wcEmbedderBaseUrl\"\n [text]=\"permalinkUrl$ | async\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n></gn-ui-copy-text-button>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34360
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataViewPermalinkComponent, selector: "gn-ui-data-view-permalink", inputs: { viewType: "viewType" }, ngImport: i0, template: "<gn-ui-copy-text-button\n *ngIf=\"wcEmbedderBaseUrl\"\n [text]=\"permalinkUrl$ | async\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n></gn-ui-copy-text-button>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33973
34361
  }
33974
34362
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewPermalinkComponent, decorators: [{
33975
34363
  type: Component,
@@ -33985,37 +34373,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
33985
34373
  }] }, { type: undefined, decorators: [{
33986
34374
  type: Inject,
33987
34375
  args: [GN_UI_VERSION]
33988
- }] }, { type: MdViewFacade }]; } });
34376
+ }] }, { type: MdViewFacade }]; }, propDecorators: { viewType: [{
34377
+ type: Input
34378
+ }] } });
33989
34379
 
33990
34380
  class DataViewWebComponentComponent {
34381
+ set viewType(value) {
34382
+ this.viewType$.next(value);
34383
+ }
33991
34384
  constructor(config, version, facade) {
33992
34385
  this.config = config;
33993
34386
  this.version = version;
33994
34387
  this.facade = facade;
33995
- this.webComponentHtml$ = combineLatest(this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([config, metadata]) => {
33996
- if (config) {
33997
- const { aggregation, xProperty, yProperty, chartType } = config;
34388
+ this.viewType$ = new BehaviorSubject('map');
34389
+ this.webComponentHtml$ = combineLatest(this.viewType$, this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([viewType, config, metadata]) => {
34390
+ if (viewType === 'chart') {
34391
+ if (config) {
34392
+ const { aggregation, xProperty, yProperty, chartType } = config;
34393
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
34394
+ <gn-dataset-view-chart
34395
+ api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
34396
+ dataset-id="${metadata.uniqueIdentifier}"
34397
+ aggregation="${aggregation}"
34398
+ x-property="${xProperty}"
34399
+ y-property="${yProperty}"
34400
+ chart-type="${chartType}"
34401
+ primary-color="#0f4395"
34402
+ secondary-color="#8bc832"
34403
+ main-color="#555"
34404
+ background-color="#fdfbff"
34405
+ main-font="'Inter', sans-serif"
34406
+ title-font="'DM Serif Display', serif"
34407
+ ></gn-dataset-view-chart>`;
34408
+ }
34409
+ return '';
34410
+ }
34411
+ else if (viewType === 'table') {
34412
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
34413
+ <gn-dataset-view-table
34414
+ api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
34415
+ dataset-id="${metadata.uniqueIdentifier}"
34416
+ primary-color="#0f4395"
34417
+ secondary-color="#8bc832"
34418
+ main-color="#555"
34419
+ background-color="#fdfbff"
34420
+ main-font="'Inter', sans-serif"
34421
+ title-font="'DM Serif Display', serif"
34422
+ ></gn-dataset-view-table>`;
34423
+ }
34424
+ else {
33998
34425
  return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
33999
- <gn-dataset-view-chart
34426
+ <gn-dataset-view-map
34000
34427
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
34001
34428
  dataset-id="${metadata.uniqueIdentifier}"
34002
- aggregation="${aggregation}"
34003
- x-property="${xProperty}"
34004
- y-property="${yProperty}"
34005
- chart-type="${chartType}"
34006
34429
  primary-color="#0f4395"
34007
34430
  secondary-color="#8bc832"
34008
34431
  main-color="#555"
34009
34432
  background-color="#fdfbff"
34010
34433
  main-font="'Inter', sans-serif"
34011
34434
  title-font="'DM Serif Display', serif"
34012
- ></gn-dataset-view-chart>`;
34435
+ ></gn-dataset-view-map>`;
34013
34436
  }
34014
- return '';
34015
34437
  }));
34016
34438
  }
34017
34439
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewWebComponentComponent, deps: [{ token: Configuration }, { token: GN_UI_VERSION }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
34018
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataViewWebComponentComponent, selector: "gn-ui-data-view-web-component", ngImport: i0, template: "<gn-ui-copy-text-button\n [text]=\"webComponentHtml$ | async\"\n [rows]=\"3\"\n [tooltipText]=\"'tooltip.html.copy' | translate\"\n></gn-ui-copy-text-button>\n", styles: [""], dependencies: [{ kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34440
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataViewWebComponentComponent, selector: "gn-ui-data-view-web-component", inputs: { viewType: "viewType" }, ngImport: i0, template: "<gn-ui-copy-text-button\n [text]=\"webComponentHtml$ | async\"\n [rows]=\"3\"\n [tooltipText]=\"'tooltip.html.copy' | translate\"\n></gn-ui-copy-text-button>\n", styles: [""], dependencies: [{ kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34019
34441
  }
34020
34442
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewWebComponentComponent, decorators: [{
34021
34443
  type: Component,
@@ -34026,24 +34448,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
34026
34448
  }] }, { type: undefined, decorators: [{
34027
34449
  type: Inject,
34028
34450
  args: [GN_UI_VERSION]
34029
- }] }, { type: MdViewFacade }]; } });
34451
+ }] }, { type: MdViewFacade }]; }, propDecorators: { viewType: [{
34452
+ type: Input
34453
+ }] } });
34030
34454
 
34031
34455
  class DataViewShareComponent {
34456
+ set viewType(value) {
34457
+ this._viewType = value;
34458
+ }
34459
+ get viewType() {
34460
+ return this._viewType;
34461
+ }
34032
34462
  constructor(wcEmbedderBaseUrl) {
34033
34463
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
34034
34464
  }
34035
34465
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewShareComponent, deps: [{ token: WEB_COMPONENT_EMBEDDER_URL, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
34036
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataViewShareComponent, selector: "gn-ui-data-view-share", ngImport: i0, template: "<div class=\"container-lg px-5 my-1 lg:mx-auto\">\n <mat-tab-group\n [selectedIndex]=\"0\"\n animationDuration=\"0ms\"\n mat-stretch-tabs=\"false\"\n mat-align-tabs=\"start\"\n [disableRipple]=\"!wcEmbedderBaseUrl\"\n >\n <mat-tab *ngIf=\"wcEmbedderBaseUrl\">\n <ng-template mat-tab-label>\n <span class=\"tab-header-label-gray\" translate>share.tab.permalink</span>\n </ng-template>\n <gn-ui-data-view-permalink></gn-ui-data-view-permalink>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span\n [class]=\"\n wcEmbedderBaseUrl\n ? 'tab-header-label-gray'\n : 'single-tab-header-label-gray'\n \"\n translate\n >share.tab.webComponent</span\n >\n </ng-template>\n <gn-ui-data-view-web-component></gn-ui-data-view-web-component>\n </mat-tab>\n </mat-tab-group>\n</div>\n", styles: ["::ng-deep .mat-mdc-tab.mdc-tab.mdc-tab--active .tab-header-label-gray{opacity:100%;font-weight:700}.tab-header-label-gray{@apply text-sm text-gray-700 opacity-75 hover:text-gray-900;}.single-tab-header-label-gray{@apply text-sm text-gray-900;}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$5.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i2$5.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DataViewPermalinkComponent, selector: "gn-ui-data-view-permalink" }, { kind: "component", type: DataViewWebComponentComponent, selector: "gn-ui-data-view-web-component" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34466
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataViewShareComponent, selector: "gn-ui-data-view-share", inputs: { viewType: "viewType" }, ngImport: i0, template: "<div class=\"container-lg px-5 my-1 lg:mx-auto\">\n <mat-tab-group\n [selectedIndex]=\"0\"\n animationDuration=\"0ms\"\n mat-stretch-tabs=\"false\"\n mat-align-tabs=\"start\"\n [disableRipple]=\"!wcEmbedderBaseUrl\"\n >\n <mat-tab *ngIf=\"wcEmbedderBaseUrl\">\n <ng-template mat-tab-label>\n <span class=\"tab-header-label-gray\" translate>share.tab.permalink</span>\n </ng-template>\n <gn-ui-data-view-permalink\n [viewType]=\"viewType\"\n ></gn-ui-data-view-permalink>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span\n [class]=\"\n wcEmbedderBaseUrl\n ? 'tab-header-label-gray'\n : 'single-tab-header-label-gray'\n \"\n translate\n >share.tab.webComponent</span\n >\n </ng-template>\n <gn-ui-data-view-web-component\n [viewType]=\"viewType\"\n ></gn-ui-data-view-web-component>\n </mat-tab>\n </mat-tab-group>\n</div>\n", styles: ["::ng-deep .mat-mdc-tab.mdc-tab.mdc-tab--active .tab-header-label-gray{opacity:100%;font-weight:700}.tab-header-label-gray{@apply text-sm text-gray-700 opacity-75 hover:text-gray-900;}.single-tab-header-label-gray{@apply text-sm text-gray-900;}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$5.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i2$5.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DataViewPermalinkComponent, selector: "gn-ui-data-view-permalink", inputs: ["viewType"] }, { kind: "component", type: DataViewWebComponentComponent, selector: "gn-ui-data-view-web-component", inputs: ["viewType"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34037
34467
  }
34038
34468
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewShareComponent, decorators: [{
34039
34469
  type: Component,
34040
- args: [{ selector: 'gn-ui-data-view-share', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container-lg px-5 my-1 lg:mx-auto\">\n <mat-tab-group\n [selectedIndex]=\"0\"\n animationDuration=\"0ms\"\n mat-stretch-tabs=\"false\"\n mat-align-tabs=\"start\"\n [disableRipple]=\"!wcEmbedderBaseUrl\"\n >\n <mat-tab *ngIf=\"wcEmbedderBaseUrl\">\n <ng-template mat-tab-label>\n <span class=\"tab-header-label-gray\" translate>share.tab.permalink</span>\n </ng-template>\n <gn-ui-data-view-permalink></gn-ui-data-view-permalink>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span\n [class]=\"\n wcEmbedderBaseUrl\n ? 'tab-header-label-gray'\n : 'single-tab-header-label-gray'\n \"\n translate\n >share.tab.webComponent</span\n >\n </ng-template>\n <gn-ui-data-view-web-component></gn-ui-data-view-web-component>\n </mat-tab>\n </mat-tab-group>\n</div>\n", styles: ["::ng-deep .mat-mdc-tab.mdc-tab.mdc-tab--active .tab-header-label-gray{opacity:100%;font-weight:700}.tab-header-label-gray{@apply text-sm text-gray-700 opacity-75 hover:text-gray-900;}.single-tab-header-label-gray{@apply text-sm text-gray-900;}\n"] }]
34470
+ args: [{ selector: 'gn-ui-data-view-share', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container-lg px-5 my-1 lg:mx-auto\">\n <mat-tab-group\n [selectedIndex]=\"0\"\n animationDuration=\"0ms\"\n mat-stretch-tabs=\"false\"\n mat-align-tabs=\"start\"\n [disableRipple]=\"!wcEmbedderBaseUrl\"\n >\n <mat-tab *ngIf=\"wcEmbedderBaseUrl\">\n <ng-template mat-tab-label>\n <span class=\"tab-header-label-gray\" translate>share.tab.permalink</span>\n </ng-template>\n <gn-ui-data-view-permalink\n [viewType]=\"viewType\"\n ></gn-ui-data-view-permalink>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span\n [class]=\"\n wcEmbedderBaseUrl\n ? 'tab-header-label-gray'\n : 'single-tab-header-label-gray'\n \"\n translate\n >share.tab.webComponent</span\n >\n </ng-template>\n <gn-ui-data-view-web-component\n [viewType]=\"viewType\"\n ></gn-ui-data-view-web-component>\n </mat-tab>\n </mat-tab-group>\n</div>\n", styles: ["::ng-deep .mat-mdc-tab.mdc-tab.mdc-tab--active .tab-header-label-gray{opacity:100%;font-weight:700}.tab-header-label-gray{@apply text-sm text-gray-700 opacity-75 hover:text-gray-900;}.single-tab-header-label-gray{@apply text-sm text-gray-900;}\n"] }]
34041
34471
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
34042
34472
  type: Optional
34043
34473
  }, {
34044
34474
  type: Inject,
34045
34475
  args: [WEB_COMPONENT_EMBEDDER_URL]
34046
- }] }]; } });
34476
+ }] }]; }, propDecorators: { viewType: [{
34477
+ type: Input
34478
+ }] } });
34047
34479
 
34048
34480
  class FeatureRecordModule {
34049
34481
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureRecordModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -34133,75 +34565,169 @@ const saveRecord = createAction('[Editor] Save record');
34133
34565
  const saveRecordSuccess = createAction('[Editor] Save record success');
34134
34566
  const saveRecordFailure = createAction('[Editor] Save record failure', props());
34135
34567
  const draftSaveSuccess = createAction('[Editor] Draft save success');
34568
+ const setCurrentPage = createAction('[Editor] Set current page', props());
34136
34569
 
34137
- const DEFAULT_FIELDS = [
34138
- {
34139
- model: 'title',
34140
- formFieldConfig: {
34141
- labelKey: 'Metadata title',
34142
- type: 'text',
34143
- },
34570
+ /**
34571
+ * This file contains the configuration of the fields that will be displayed in the editor.
34572
+ * To add a new field, you need to create a new EditorField object in the fields part of this file.
34573
+ * Then add it to the corresponding section in the sections part of this file.
34574
+ * Finally, add the section to the corresponding page in the pages part of this file.
34575
+ */
34576
+ /************************************************************
34577
+ *************** FIELDS *****************
34578
+ ************************************************************
34579
+ */
34580
+ const RECORD_LICENSE_FIELD = {
34581
+ model: 'licenses',
34582
+ formFieldConfig: {
34583
+ labelKey: marker('editor.record.form.field.license'),
34144
34584
  },
34145
- {
34146
- model: 'abstract',
34147
- formFieldConfig: {
34148
- labelKey: 'Abstract',
34149
- type: 'rich',
34150
- },
34585
+ };
34586
+ const RECORD_KEYWORDS_FIELD = {
34587
+ model: 'keywords',
34588
+ formFieldConfig: {
34589
+ labelKey: marker('editor.record.form.field.keywords'),
34151
34590
  },
34152
- {
34153
- model: 'uniqueIdentifier',
34154
- formFieldConfig: {
34155
- labelKey: 'Unique identifier',
34156
- type: 'text',
34157
- locked: true,
34158
- },
34591
+ };
34592
+ const RECORD_UNIQUE_IDENTIFIER_FIELD = {
34593
+ model: 'uniqueIdentifier',
34594
+ formFieldConfig: {
34595
+ labelKey: marker('editor.record.form.field.uniqueIdentifier'),
34596
+ locked: true,
34159
34597
  },
34160
- {
34161
- model: 'recordUpdated',
34162
- formFieldConfig: {
34163
- labelKey: 'Record Updated',
34164
- type: 'text',
34165
- locked: true,
34166
- },
34167
- onSaveProcess: '${dateNow()}',
34598
+ };
34599
+ const RECORD_RESOURCE_UPDATED_FIELD = {
34600
+ model: 'resourceUpdated',
34601
+ formFieldConfig: {
34602
+ labelKey: marker('editor.record.form.field.resourceUpdated'),
34168
34603
  },
34169
- {
34170
- model: 'licenses',
34171
- formFieldConfig: {
34172
- labelKey: marker('editor.record.form.license'),
34173
- type: 'list',
34174
- },
34604
+ };
34605
+ const RECORD_UPDATED_FIELD = {
34606
+ model: 'recordUpdated',
34607
+ formFieldConfig: {
34608
+ labelKey: marker('editor.record.form.field.recordUpdated'),
34609
+ locked: true,
34175
34610
  },
34176
- {
34177
- model: 'resourceUpdated',
34178
- formFieldConfig: {
34179
- labelKey: marker('editor.record.form.resourceUpdated'),
34180
- type: 'date',
34181
- },
34611
+ onSaveProcess: '${dateNow()}',
34612
+ };
34613
+ const RECORD_UPDATE_FREQUENCY_FIELD = {
34614
+ model: 'updateFrequency',
34615
+ formFieldConfig: {
34616
+ labelKey: marker('editor.record.form.field.updateFrequency'),
34182
34617
  },
34183
- {
34184
- model: 'updateFrequency',
34185
- formFieldConfig: {
34186
- labelKey: marker('editor.record.form.updateFrequency'),
34187
- type: 'text',
34188
- },
34618
+ };
34619
+ const RECORD_TEMPORAL_EXTENTS_FIELD = {
34620
+ model: 'temporalExtents',
34621
+ formFieldConfig: {
34622
+ labelKey: marker('editor.record.form.field.temporalExtents'),
34189
34623
  },
34190
- {
34191
- model: 'temporalExtents',
34192
- formFieldConfig: {
34193
- labelKey: marker('editor.record.form.temporalExtents'),
34194
- type: 'list',
34195
- },
34624
+ };
34625
+ const RECORD_TITLE_FIELD = {
34626
+ model: 'title',
34627
+ formFieldConfig: {
34628
+ labelKey: marker('editor.record.form.field.title'),
34196
34629
  },
34197
- {
34198
- model: 'keywords',
34199
- formFieldConfig: {
34200
- labelKey: marker('editor.record.form.keywords'),
34201
- type: 'list',
34202
- },
34630
+ };
34631
+ const RECORD_ABSTRACT_FIELD = {
34632
+ model: 'abstract',
34633
+ formFieldConfig: {
34634
+ labelKey: marker('editor.record.form.field.abstract'),
34203
34635
  },
34204
- ];
34636
+ };
34637
+ const RECORD_GRAPHICAL_OVERVIEW_FIELD = {
34638
+ model: 'overviews',
34639
+ formFieldConfig: {
34640
+ labelKey: marker('editor.record.form.field.overviews'),
34641
+ },
34642
+ };
34643
+ /************************************************************
34644
+ *************** SECTIONS *****************
34645
+ ************************************************************
34646
+ */
34647
+ const TITLE_SECTION = {
34648
+ hidden: false,
34649
+ fields: [
34650
+ RECORD_TITLE_FIELD,
34651
+ RECORD_ABSTRACT_FIELD,
34652
+ RECORD_GRAPHICAL_OVERVIEW_FIELD,
34653
+ ],
34654
+ };
34655
+ const ABOUT_SECTION = {
34656
+ labelKey: marker('editor.record.form.section.about.label'),
34657
+ descriptionKey: marker('editor.record.form.section.about.description'),
34658
+ hidden: false,
34659
+ fields: [
34660
+ RECORD_UNIQUE_IDENTIFIER_FIELD,
34661
+ RECORD_RESOURCE_UPDATED_FIELD,
34662
+ RECORD_UPDATED_FIELD,
34663
+ RECORD_UPDATE_FREQUENCY_FIELD,
34664
+ RECORD_TEMPORAL_EXTENTS_FIELD,
34665
+ ],
34666
+ };
34667
+ const GEOGRAPHICAL_COVERAGE_SECTION = {
34668
+ labelKey: marker('editor.record.form.section.geographicalCoverage.label'),
34669
+ hidden: false,
34670
+ fields: [],
34671
+ };
34672
+ const ASSOCIATED_RESOURCES_SECTION = {
34673
+ labelKey: marker('editor.record.form.section.associatedResources.label'),
34674
+ descriptionKey: marker('editor.record.form.section.associatedResources.description'),
34675
+ hidden: false,
34676
+ fields: [],
34677
+ };
34678
+ const ANNEXES_SECTION = {
34679
+ labelKey: marker('editor.record.form.section.annexes.label'),
34680
+ hidden: false,
34681
+ fields: [],
34682
+ };
34683
+ const CLASSIFICATION_SECTION = {
34684
+ labelKey: marker('editor.record.form.section.classification.label'),
34685
+ descriptionKey: marker('editor.record.form.section.classification.description'),
34686
+ hidden: false,
34687
+ fields: [RECORD_KEYWORDS_FIELD],
34688
+ };
34689
+ const USE_AND_ACCESS_CONDITIONS_SECTION = {
34690
+ labelKey: marker('editor.record.form.section.useAndAccessConditions.label'),
34691
+ hidden: false,
34692
+ fields: [RECORD_LICENSE_FIELD],
34693
+ };
34694
+ const DATA_MANAGERS_SECTION = {
34695
+ labelKey: marker('editor.record.form.section.dataManagers.label'),
34696
+ descriptionKey: marker('editor.record.form.section.dataManagers.description'),
34697
+ hidden: false,
34698
+ fields: [],
34699
+ };
34700
+ const DATA_POINT_OF_CONTACT_SECTION = {
34701
+ labelKey: marker('editor.record.form.section.dataPointOfContact.label'),
34702
+ descriptionKey: marker('editor.record.form.section.dataPointOfContact.description'),
34703
+ hidden: false,
34704
+ fields: [],
34705
+ };
34706
+ /************************************************************
34707
+ *************** PAGES *****************
34708
+ ************************************************************
34709
+ */
34710
+ const DEFAULT_CONFIGURATION = {
34711
+ pages: [
34712
+ {
34713
+ labelKey: marker('editor.record.form.page.description'),
34714
+ sections: [TITLE_SECTION, ABOUT_SECTION, GEOGRAPHICAL_COVERAGE_SECTION],
34715
+ },
34716
+ {
34717
+ labelKey: marker('editor.record.form.page.ressources'),
34718
+ sections: [ASSOCIATED_RESOURCES_SECTION, ANNEXES_SECTION],
34719
+ },
34720
+ {
34721
+ labelKey: marker('editor.record.form.page.accessAndContact'),
34722
+ sections: [
34723
+ CLASSIFICATION_SECTION,
34724
+ USE_AND_ACCESS_CONDITIONS_SECTION,
34725
+ DATA_MANAGERS_SECTION,
34726
+ DATA_POINT_OF_CONTACT_SECTION,
34727
+ ],
34728
+ },
34729
+ ],
34730
+ };
34205
34731
 
34206
34732
  const EDITOR_FEATURE_KEY = 'editor';
34207
34733
  const initialEditorState = {
@@ -34211,7 +34737,8 @@ const initialEditorState = {
34211
34737
  saving: false,
34212
34738
  saveError: null,
34213
34739
  changedSinceSave: false,
34214
- fieldsConfig: DEFAULT_FIELDS,
34740
+ editorConfig: DEFAULT_CONFIGURATION,
34741
+ currentPage: 0,
34215
34742
  };
34216
34743
  const reducer = createReducer(initialEditorState, on(openRecord, (state, { record, recordSource, alreadySavedOnce }) => ({
34217
34744
  ...state,
@@ -34241,6 +34768,9 @@ const reducer = createReducer(initialEditorState, on(openRecord, (state, { recor
34241
34768
  })), on(markRecordAsChanged, (state) => ({
34242
34769
  ...state,
34243
34770
  changedSinceSave: true,
34771
+ })), on(setCurrentPage, (state, { page }) => ({
34772
+ ...state,
34773
+ currentPage: page,
34244
34774
  })));
34245
34775
  function editorReducer(state, action) {
34246
34776
  return reducer(state, action);
@@ -34253,11 +34783,21 @@ const selectRecordSaving = createSelector(selectEditorState, (state) => state.sa
34253
34783
  const selectRecordSaveError = createSelector(selectEditorState, (state) => state.saveError);
34254
34784
  const selectRecordChangedSinceSave = createSelector(selectEditorState, (state) => state.changedSinceSave);
34255
34785
  const selectRecordAlreadySavedOnce = createSelector(selectEditorState, (state) => state.alreadySavedOnce);
34256
- const selectRecordFieldsConfig = createSelector(selectEditorState, (state) => state.fieldsConfig);
34257
- const selectRecordFields = createSelector(selectEditorState, (state) => state.fieldsConfig.map((fieldConfig) => ({
34258
- config: fieldConfig,
34259
- value: state.record?.[fieldConfig.model] ?? null,
34260
- })));
34786
+ const selectEditorConfig = createSelector(selectEditorState, (state) => state.editorConfig);
34787
+ const selectCurrentPage = createSelector(selectEditorState, (state) => state.currentPage);
34788
+ const selectRecordSections = createSelector(selectEditorState, (state) => {
34789
+ const currentPage = state.editorConfig.pages[state.currentPage];
34790
+ if (!currentPage) {
34791
+ return [];
34792
+ }
34793
+ return currentPage.sections.map((section) => ({
34794
+ ...section,
34795
+ fieldsWithValues: section.fields.map((fieldConfig) => ({
34796
+ config: fieldConfig,
34797
+ value: state.record?.[fieldConfig.model] ?? null,
34798
+ })),
34799
+ }));
34800
+ });
34261
34801
 
34262
34802
  class EditorFacade {
34263
34803
  constructor() {
@@ -34270,8 +34810,10 @@ class EditorFacade {
34270
34810
  this.saveError$ = this.store.pipe(select(selectRecordSaveError), filter$1((error) => !!error));
34271
34811
  this.saveSuccess$ = this.actions$.pipe(ofType(saveRecordSuccess));
34272
34812
  this.changedSinceSave$ = this.store.pipe(select(selectRecordChangedSinceSave));
34273
- this.recordFields$ = this.store.pipe(select(selectRecordFields));
34813
+ this.currentSections$ = this.store.pipe(select(selectRecordSections));
34274
34814
  this.draftSaveSuccess$ = this.actions$.pipe(ofType(draftSaveSuccess));
34815
+ this.currentPage$ = this.store.pipe(select(selectCurrentPage));
34816
+ this.editorConfig$ = this.store.pipe(select(selectEditorConfig));
34275
34817
  }
34276
34818
  openRecord(record, recordSource, alreadySavedOnce) {
34277
34819
  this.store.dispatch(openRecord({ record, recordSource, alreadySavedOnce }));
@@ -34282,6 +34824,9 @@ class EditorFacade {
34282
34824
  updateRecordField(field, value) {
34283
34825
  this.store.dispatch(updateRecordField({ field, value }));
34284
34826
  }
34827
+ setCurrentPage(page) {
34828
+ this.store.dispatch(setCurrentPage({ page }));
34829
+ }
34285
34830
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
34286
34831
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorFacade }); }
34287
34832
  }
@@ -34309,12 +34854,13 @@ class EditorService {
34309
34854
  // returns the record as it was when saved, alongside its source
34310
34855
  saveRecord(record, fieldsConfig, generateNewUniqueIdentifier = false) {
34311
34856
  const savedRecord = { ...record };
34857
+ const fields = fieldsConfig.pages.flatMap((page) => page.sections.flatMap((section) => section.fields));
34312
34858
  // run onSave processes
34313
- for (const field of fieldsConfig) {
34859
+ for (const field of fields) {
34314
34860
  if (field.onSaveProcess && field.model) {
34315
34861
  const evaluator = evaluate(field.onSaveProcess);
34316
34862
  savedRecord[field.model] = evaluator({
34317
- config: field,
34863
+ model: field.model,
34318
34864
  value: record[field.model],
34319
34865
  });
34320
34866
  }
@@ -34351,7 +34897,7 @@ class EditorEffects {
34351
34897
  this.editorService = inject(EditorService);
34352
34898
  this.recordsRepository = inject(RecordsRepositoryInterface);
34353
34899
  this.store = inject(Store);
34354
- this.saveRecord$ = createEffect(() => this.actions$.pipe(ofType(saveRecord), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordFieldsConfig), this.store.select(selectRecordAlreadySavedOnce)), switchMap$1(([, record, fieldsConfig, alreadySavedOnce]) => this.editorService
34900
+ this.saveRecord$ = createEffect(() => this.actions$.pipe(ofType(saveRecord), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectEditorConfig), this.store.select(selectRecordAlreadySavedOnce)), switchMap$1(([, record, fieldsConfig, alreadySavedOnce]) => this.editorService
34355
34901
  .saveRecord(record, fieldsConfig, !alreadySavedOnce)
34356
34902
  .pipe(switchMap$1(([record, recordSource]) => of(saveRecordSuccess(), openRecord({
34357
34903
  record,
@@ -34592,7 +35138,7 @@ class WizardFieldComponent {
34592
35138
  deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
34593
35139
  },
34594
35140
  { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
34595
- ], viewQueries: [{ propertyName: "searchText", first: true, predicate: ["searchText"], descendants: true }, { propertyName: "chips", first: true, predicate: ["chips"], descendants: true }, { propertyName: "textArea", first: true, predicate: ["textArea"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-1\">\n <span [class]=\"wizardFieldConfig.icon + ' pr-10'\"></span>\n <div class=\"flex flex-col flex-1\">\n <div translate class=\"text-xl font-bold pb-1\">\n {{ wizardFieldConfig.label }}\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.TEXT === wizardFieldConfig.type\"\n >\n <gn-ui-text-input\n #searchText\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n hint=\"\"\n ></gn-ui-text-input>\n </div>\n <div\n class=\"flex-1 w-11/12\"\n *ngIf=\"wizardFieldType.CHIPS === wizardFieldConfig.type\"\n >\n <gn-ui-chips-input\n #chips\n [selectedItems]=\"wizardFieldData\"\n placeholder=\"\"\n [id]=\"wizardFieldConfig.id\"\n [url]=\"wizardFieldConfig.options.url\"\n [loadOnce]=\"wizardFieldConfig.options.loadOnce\"\n ></gn-ui-chips-input>\n </div>\n <div\n class=\"h-32 w-11/12\"\n *ngIf=\"wizardFieldType.TEXT_AREA === wizardFieldConfig.type\"\n >\n <gn-ui-text-area\n #textArea\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n placeholder=\"\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DATA_PICKER === wizardFieldConfig.type\"\n >\n <input\n [id]=\"wizardFieldConfig.id\"\n type=\"text\"\n (click)=\"datepicker.open()\"\n class=\"rounded p-2 text-gray-700 w-full leading-tight focus:outline-none focus:border-primary\"\n [value]=\"wizardFieldData\"\n [matDatepicker]=\"datepicker\"\n (dateChange)=\"onDateChange($event)\"\n />\n <mat-datepicker #datepicker></mat-datepicker>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DROPDOWN === wizardFieldConfig.type\"\n >\n <gn-ui-dropdown-selector\n #dropdown\n [id]=\"wizardFieldConfig.id\"\n [title]=\"''\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n [showTitle]=\"false\"\n [choices]=\"dropdownChoices\"\n [selected]=\"wizardFieldData\"\n ariaName=\"search-sort-by\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex:1}gn-ui-text-input::ng-deep input,input[type=text]{height:100%;background:white;color:#000;font-style:italic;border-width:2px;border-color:var(--color-primary)}gn-ui-text-area::ng-deep textarea{border-width:2px;border-color:var(--color-primary)}gn-ui-dropdown-selector::ng-deep div{height:100%}gn-ui-dropdown-selector::ng-deep select{height:100%;border-width:2px;border-color:var(--color-primary);background-color:#fff}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: ChipsInputComponent, selector: "gn-ui-chips-input", inputs: ["url", "placeholder", "selectedItems", "required", "loadOnce", "autocompleteItems"], outputs: ["itemsChange"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i2$4.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$4.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35141
+ ], viewQueries: [{ propertyName: "searchText", first: true, predicate: ["searchText"], descendants: true }, { propertyName: "chips", first: true, predicate: ["chips"], descendants: true }, { propertyName: "textArea", first: true, predicate: ["textArea"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-1\">\n <span [class]=\"wizardFieldConfig.icon + ' pr-10'\"></span>\n <div class=\"flex flex-col flex-1\">\n <div translate class=\"text-xl font-bold pb-1\">\n {{ wizardFieldConfig.label }}\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.TEXT === wizardFieldConfig.type\"\n >\n <gn-ui-text-input\n #searchText\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n hint=\"\"\n ></gn-ui-text-input>\n </div>\n <div\n class=\"flex-1 w-11/12\"\n *ngIf=\"wizardFieldType.CHIPS === wizardFieldConfig.type\"\n >\n <gn-ui-chips-input\n #chips\n [selectedItems]=\"wizardFieldData\"\n placeholder=\"\"\n [id]=\"wizardFieldConfig.id\"\n [url]=\"wizardFieldConfig.options.url\"\n [loadOnce]=\"wizardFieldConfig.options.loadOnce\"\n ></gn-ui-chips-input>\n </div>\n <div\n class=\"h-32 w-11/12\"\n *ngIf=\"wizardFieldType.TEXT_AREA === wizardFieldConfig.type\"\n >\n <gn-ui-text-area\n #textArea\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n placeholder=\"\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DATA_PICKER === wizardFieldConfig.type\"\n >\n <input\n [id]=\"wizardFieldConfig.id\"\n type=\"text\"\n (click)=\"datepicker.open()\"\n class=\"rounded p-2 text-gray-700 w-full leading-tight focus:outline-none focus:border-primary\"\n [value]=\"wizardFieldData\"\n [matDatepicker]=\"datepicker\"\n (dateChange)=\"onDateChange($event)\"\n />\n <mat-datepicker #datepicker></mat-datepicker>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DROPDOWN === wizardFieldConfig.type\"\n >\n <gn-ui-dropdown-selector\n #dropdown\n [id]=\"wizardFieldConfig.id\"\n [title]=\"''\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n [showTitle]=\"false\"\n [choices]=\"dropdownChoices\"\n [selected]=\"wizardFieldData\"\n ariaName=\"search-sort-by\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex:1}gn-ui-text-input::ng-deep input,input[type=text]{height:100%;background:white;color:#000;font-style:italic;border-width:2px;border-color:var(--color-primary)}gn-ui-text-area::ng-deep textarea{border-width:2px;border-color:var(--color-primary)}gn-ui-dropdown-selector::ng-deep div{height:100%}gn-ui-dropdown-selector::ng-deep select{height:100%;border-width:2px;border-color:var(--color-primary);background-color:#fff}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: ChipsInputComponent, selector: "gn-ui-chips-input", inputs: ["url", "placeholder", "selectedItems", "required", "loadOnce", "autocompleteItems"], outputs: ["itemsChange"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i2$3.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$3.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34596
35142
  }
34597
35143
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WizardFieldComponent, decorators: [{
34598
35144
  type: Component,
@@ -35257,13 +35803,161 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35257
35803
  type: Input
35258
35804
  }] } });
35259
35805
 
35806
+ const extractFileNameFromUrl = (url) => {
35807
+ const pattern = new RegExp(`attachments/([^/?#]+)(?:[/?#]|$)`, 'i');
35808
+ const match = url.match(pattern);
35809
+ return match ? match[1] : '';
35810
+ };
35811
+ class OverviewUploadComponent {
35812
+ constructor(recordsApiService, cd) {
35813
+ this.recordsApiService = recordsApiService;
35814
+ this.cd = cd;
35815
+ this.overviewChange = new EventEmitter();
35816
+ this.altTextChange = new EventEmitter();
35817
+ this.resourceAltText = ''; // = ressourceFileName by default
35818
+ this.resourceFileName = '';
35819
+ this.errorHandle = (error) => {
35820
+ console.error(error);
35821
+ this.resourceUrl = null;
35822
+ this.resourceAltText = '';
35823
+ this.resourceFileName = '';
35824
+ this.overviewChange.emit(null);
35825
+ this.cd.markForCheck();
35826
+ };
35827
+ }
35828
+ ngOnInit() {
35829
+ this.recordsApiService.getAllResources(this.metadataUuid).subscribe({
35830
+ next: (resources) => {
35831
+ if (resources && resources.length > 0) {
35832
+ this.resourceUrl = new URL(resources[0]?.url);
35833
+ this.resourceAltText =
35834
+ this.resourceAltText === ''
35835
+ ? resources[0].filename
35836
+ : this.resourceAltText;
35837
+ this.resourceFileName = extractFileNameFromUrl(resources[0]?.url);
35838
+ }
35839
+ else {
35840
+ this.resourceUrl = null;
35841
+ this.resourceAltText = '';
35842
+ this.resourceFileName = '';
35843
+ }
35844
+ this.cd.markForCheck();
35845
+ },
35846
+ error: this.errorHandle,
35847
+ });
35848
+ }
35849
+ handleFileChange(file) {
35850
+ this.recordsApiService
35851
+ .putResource(this.metadataUuid, file, 'public')
35852
+ .subscribe({
35853
+ next: (resource) => {
35854
+ this.resourceUrl = new URL(resource.url);
35855
+ this.resourceAltText = resource.filename;
35856
+ this.overviewChange.emit({
35857
+ url: new URL(resource.url),
35858
+ description: resource.filename,
35859
+ });
35860
+ this.cd.markForCheck();
35861
+ },
35862
+ error: this.errorHandle,
35863
+ });
35864
+ }
35865
+ handleUrlChange(url) {
35866
+ this.recordsApiService
35867
+ .putResourceFromURL(this.metadataUuid, url, 'public')
35868
+ .subscribe({
35869
+ next: (resource) => {
35870
+ this.resourceUrl = new URL(resource.url);
35871
+ this.resourceAltText = resource.filename;
35872
+ this.overviewChange.emit({
35873
+ url: new URL(resource.url),
35874
+ description: resource.filename,
35875
+ });
35876
+ this.cd.markForCheck();
35877
+ },
35878
+ error: this.errorHandle,
35879
+ });
35880
+ }
35881
+ handleAltTextChange(newAltText) {
35882
+ this.resourceAltText = newAltText;
35883
+ this.overviewChange.emit({
35884
+ url: this.resourceUrl,
35885
+ description: this.resourceAltText,
35886
+ });
35887
+ this.cd.markForCheck();
35888
+ }
35889
+ handleDelete() {
35890
+ this.recordsApiService
35891
+ .delResource(this.metadataUuid, this.resourceFileName)
35892
+ .subscribe({
35893
+ next: () => {
35894
+ this.resourceAltText = null;
35895
+ this.resourceUrl = null;
35896
+ this.overviewChange.emit(null);
35897
+ this.cd.markForCheck();
35898
+ },
35899
+ error: this.errorHandle,
35900
+ });
35901
+ }
35902
+ ngOnChanges(changes) {
35903
+ const overviewChanges = changes['formControl'];
35904
+ if (overviewChanges &&
35905
+ overviewChanges.currentValue !== overviewChanges.previousValue) {
35906
+ let overview;
35907
+ if (overviewChanges.currentValue.value &&
35908
+ overviewChanges.currentValue.value.length > 0) {
35909
+ overview = overviewChanges.currentValue.value[0];
35910
+ }
35911
+ else {
35912
+ return;
35913
+ }
35914
+ if (overview.description && overview.description !== '') {
35915
+ this.resourceAltText = overview.description;
35916
+ this.cd.markForCheck();
35917
+ }
35918
+ }
35919
+ }
35920
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OverviewUploadComponent, deps: [{ token: RecordsApiService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
35921
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: OverviewUploadComponent, isStandalone: true, selector: "gn-ui-overview-upload", inputs: { metadataUuid: "metadataUuid", formControl: "formControl" }, outputs: { overviewChange: "overviewChange", altTextChange: "altTextChange" }, usesOnChanges: true, ngImport: i0, template: "<gn-ui-image-input\n [maxSizeMB]=\"5\"\n [previewUrl]=\"resourceUrl\"\n [altText]=\"resourceAltText\"\n [formControl]=\"formControl\"\n (fileChange)=\"handleFileChange($event)\"\n (urlChange)=\"handleUrlChange($event)\"\n (altTextChange)=\"handleAltTextChange($event)\"\n (delete)=\"handleDelete()\"\n></gn-ui-image-input>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: ImageInputComponent, selector: "gn-ui-image-input", inputs: ["formControl", "maxSizeMB", "previewUrl", "altText", "uploadProgress", "uploadError"], outputs: ["fileChange", "urlChange", "uploadCancel", "delete", "altTextChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35922
+ }
35923
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OverviewUploadComponent, decorators: [{
35924
+ type: Component,
35925
+ args: [{ selector: 'gn-ui-overview-upload', standalone: true, imports: [CommonModule, UiInputsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-image-input\n [maxSizeMB]=\"5\"\n [previewUrl]=\"resourceUrl\"\n [altText]=\"resourceAltText\"\n [formControl]=\"formControl\"\n (fileChange)=\"handleFileChange($event)\"\n (urlChange)=\"handleUrlChange($event)\"\n (altTextChange)=\"handleAltTextChange($event)\"\n (delete)=\"handleDelete()\"\n></gn-ui-image-input>\n" }]
35926
+ }], ctorParameters: function () { return [{ type: RecordsApiService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { metadataUuid: [{
35927
+ type: Input
35928
+ }], formControl: [{
35929
+ type: Input
35930
+ }], overviewChange: [{
35931
+ type: Output
35932
+ }], altTextChange: [{
35933
+ type: Output
35934
+ }] } });
35935
+
35936
+ class FormFieldOverviewsComponent {
35937
+ handleOverviewChange(overView) {
35938
+ this.control.setValue(overView ? [overView] : []);
35939
+ }
35940
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldOverviewsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35941
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldOverviewsComponent, isStandalone: true, selector: "gn-ui-form-field-overviews", inputs: { metadataUuid: "metadataUuid", control: "control" }, ngImport: i0, template: "<gn-ui-overview-upload\n [metadataUuid]=\"metadataUuid\"\n [formControl]=\"control\"\n (overviewChange)=\"handleOverviewChange($event)\"\n></gn-ui-overview-upload>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: OverviewUploadComponent, selector: "gn-ui-overview-upload", inputs: ["metadataUuid", "formControl"], outputs: ["overviewChange", "altTextChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35942
+ }
35943
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldOverviewsComponent, decorators: [{
35944
+ type: Component,
35945
+ args: [{ selector: 'gn-ui-form-field-overviews', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, OverviewUploadComponent], template: "<gn-ui-overview-upload\n [metadataUuid]=\"metadataUuid\"\n [formControl]=\"control\"\n (overviewChange)=\"handleOverviewChange($event)\"\n></gn-ui-overview-upload>\n" }]
35946
+ }], propDecorators: { metadataUuid: [{
35947
+ type: Input
35948
+ }], control: [{
35949
+ type: Input
35950
+ }] } });
35951
+
35260
35952
  class FormFieldComponent {
35261
35953
  set value(v) {
35262
35954
  this.formControl.setValue(v, {
35263
35955
  emitEvent: false,
35264
35956
  });
35265
35957
  }
35266
- constructor() {
35958
+ constructor(facade) {
35959
+ this.facade = facade;
35960
+ this.metadataUuid$ = this.facade.record$.pipe(take(1), map$1((record) => record.uniqueIdentifier));
35267
35961
  this.formControl = new FormControl();
35268
35962
  this.valueChange = this.formControl.valueChanges;
35269
35963
  }
@@ -35291,6 +35985,9 @@ class FormFieldComponent {
35291
35985
  get isSpatialExtentField() {
35292
35986
  return this.model === 'spatialExtents';
35293
35987
  }
35988
+ get isGraphicOverview() {
35989
+ return this.model === 'overviews';
35990
+ }
35294
35991
  get isSimpleField() {
35295
35992
  return this.model === 'uniqueIdentifier' || this.model === 'recordUpdated';
35296
35993
  }
@@ -35303,8 +36000,8 @@ class FormFieldComponent {
35303
36000
  get withoutWrapper() {
35304
36001
  return this.model === 'title' || this.model === 'abstract';
35305
36002
  }
35306
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35307
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { model: "model", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <h2\n #titleInput\n class=\"grow text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </h2>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isUpdateFrequency\">\n <gn-ui-form-field-update-frequency\n [control]=\"formControl\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtents\">\n <gn-ui-form-field-temporal-extents\n [control]=\"formControl\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n type=\"text\"\n [control]=\"formControl\"\n [readonly]=\"isReadOnly\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isKeywords\">\n <gn-ui-form-field-keywords\n [control]=\"formControl\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: EditableLabelDirective, selector: "[gnUiEditableLabel]", inputs: ["gnUiEditableLabel"], outputs: ["editableLabelChanged"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: FormFieldLicenseComponent, selector: "gn-ui-form-field-license", inputs: ["control", "label"] }, { kind: "component", type: FormFieldResourceUpdatedComponent, selector: "gn-ui-form-field-resource-updated", inputs: ["control"] }, { kind: "component", type: FormFieldUpdateFrequencyComponent, selector: "gn-ui-form-field-update-frequency", inputs: ["control"] }, { kind: "component", type: FormFieldTemporalExtentsComponent, selector: "gn-ui-form-field-temporal-extents", inputs: ["control"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "control", "readonly", "invalid", "placeholder", "options"] }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["control", "label", "hint", "helperText", "placeholder"] }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldKeywordsComponent, selector: "gn-ui-form-field-keywords", inputs: ["control"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36003
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldComponent, deps: [{ token: EditorFacade }], target: i0.ɵɵFactoryTarget.Component }); }
36004
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { model: "model", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <span\n #titleInput\n class=\"grow font-title text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </span>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey! | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey! | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isUpdateFrequency\">\n <gn-ui-form-field-update-frequency\n [control]=\"formControl\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtents\">\n <gn-ui-form-field-temporal-extents\n [control]=\"formControl\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n type=\"text\"\n [control]=\"formControl\"\n [readonly]=\"isReadOnly\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isGraphicOverview\">\n <gn-ui-form-field-overviews\n [control]=\"formControl\"\n [metadataUuid]=\"metadataUuid$ | async\"\n ></gn-ui-form-field-overviews>\n </ng-container>\n <ng-container *ngIf=\"isKeywords\">\n <gn-ui-form-field-keywords\n [control]=\"formControl\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: EditableLabelDirective, selector: "[gnUiEditableLabel]", inputs: ["gnUiEditableLabel"], outputs: ["editableLabelChanged"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: FormFieldLicenseComponent, selector: "gn-ui-form-field-license", inputs: ["control", "label"] }, { kind: "component", type: FormFieldResourceUpdatedComponent, selector: "gn-ui-form-field-resource-updated", inputs: ["control"] }, { kind: "component", type: FormFieldUpdateFrequencyComponent, selector: "gn-ui-form-field-update-frequency", inputs: ["control"] }, { kind: "component", type: FormFieldTemporalExtentsComponent, selector: "gn-ui-form-field-temporal-extents", inputs: ["control"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "control", "readonly", "invalid", "placeholder", "options"] }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["control", "label", "hint", "helperText", "placeholder"] }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldKeywordsComponent, selector: "gn-ui-form-field-keywords", inputs: ["control"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "component", type: FormFieldOverviewsComponent, selector: "gn-ui-form-field-overviews", inputs: ["metadataUuid", "control"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35308
36005
  }
35309
36006
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldComponent, decorators: [{
35310
36007
  type: Component,
@@ -35327,8 +36024,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35327
36024
  FormFieldArrayComponent,
35328
36025
  FormFieldKeywordsComponent,
35329
36026
  TranslateModule,
35330
- ], template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <h2\n #titleInput\n class=\"grow text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </h2>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isUpdateFrequency\">\n <gn-ui-form-field-update-frequency\n [control]=\"formControl\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtents\">\n <gn-ui-form-field-temporal-extents\n [control]=\"formControl\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n type=\"text\"\n [control]=\"formControl\"\n [readonly]=\"isReadOnly\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isKeywords\">\n <gn-ui-form-field-keywords\n [control]=\"formControl\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n</ng-template>\n" }]
35331
- }], ctorParameters: function () { return []; }, propDecorators: { model: [{
36027
+ FormFieldOverviewsComponent,
36028
+ ], template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <span\n #titleInput\n class=\"grow font-title text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </span>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey! | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey! | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isUpdateFrequency\">\n <gn-ui-form-field-update-frequency\n [control]=\"formControl\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtents\">\n <gn-ui-form-field-temporal-extents\n [control]=\"formControl\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n type=\"text\"\n [control]=\"formControl\"\n [readonly]=\"isReadOnly\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isGraphicOverview\">\n <gn-ui-form-field-overviews\n [control]=\"formControl\"\n [metadataUuid]=\"metadataUuid$ | async\"\n ></gn-ui-form-field-overviews>\n </ng-container>\n <ng-container *ngIf=\"isKeywords\">\n <gn-ui-form-field-keywords\n [control]=\"formControl\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n</ng-template>\n" }]
36029
+ }], ctorParameters: function () { return [{ type: EditorFacade }]; }, propDecorators: { model: [{
35332
36030
  type: Input
35333
36031
  }], config: [{
35334
36032
  type: Input
@@ -35344,23 +36042,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35344
36042
  class RecordFormComponent {
35345
36043
  constructor(facade) {
35346
36044
  this.facade = facade;
35347
- this.fields$ = this.facade.recordFields$;
35348
36045
  }
35349
- handleFieldValueChange(field, newValue) {
35350
- if (!field.config.model) {
36046
+ handleFieldValueChange(model, newValue) {
36047
+ if (!model) {
35351
36048
  return;
35352
36049
  }
35353
- this.facade.updateRecordField(field.config.model, newValue);
36050
+ console.log(newValue);
36051
+ this.facade.updateRecordField(model, newValue);
35354
36052
  }
35355
36053
  fieldTracker(index, field) {
35356
36054
  return field.config.model;
35357
36055
  }
36056
+ sectionTracker(index, section) {
36057
+ return section.labelKey;
36058
+ }
35358
36059
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorFacade }], target: i0.ɵɵFactoryTarget.Component }); }
35359
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", 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 [model]=\"field.config.model\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field, $event)\"\n ></gn-ui-form-field>\n </ng-container>\n</div>\n", 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: "component", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: ["model", "config", "value"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36060
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<ng-container>\n <div class=\"flex flex-col gap-6 p-8\">\n <ng-container\n *ngFor=\"\n let section of facade.currentSections$ | async;\n trackBy: sectionTracker\n \"\n >\n <ng-container *ngIf=\"!section.hidden\">\n <div class=\"flex flex-col gap-8 border p-8 rounded-[8px] shadow\">\n <div\n class=\"flex flex-col gap-2\"\n [ngClass]=\"section.labelKey ? 'mb-4' : 'hidden'\"\n >\n <div\n *ngIf=\"section.labelKey\"\n class=\"text-2xl font-petrona text-secondary\"\n translate\n >\n {{ section.labelKey }}\n </div>\n <div\n *ngIf=\"section.descriptionKey\"\n class=\"text-secondary-lightest\"\n translate\n >\n {{ section.descriptionKey }}\n </div>\n </div>\n <ng-container\n *ngFor=\"\n let field of section.fieldsWithValues;\n trackBy: fieldTracker\n \"\n >\n <ng-container *ngIf=\"!field.config.hidden\">\n <gn-ui-form-field\n [model]=\"field.config.model!\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"\n handleFieldValueChange(field.config.model!, $event)\n \"\n ></gn-ui-form-field>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</ng-container>\n", styles: [""], 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: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "component", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: ["model", "config", "value"], outputs: ["valueChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35360
36061
  }
35361
36062
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordFormComponent, decorators: [{
35362
36063
  type: Component,
35363
- args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, FormFieldComponent], template: "<div class=\"flex flex-col gap-6 p-6\">\n <ng-container *ngFor=\"let field of fields$ | async; trackBy: fieldTracker\">\n <gn-ui-form-field\n *ngIf=\"field.config.formFieldConfig && !field.config.hidden\"\n [model]=\"field.config.model\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field, $event)\"\n ></gn-ui-form-field>\n </ng-container>\n</div>\n" }]
36064
+ args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, FormFieldComponent, TranslateModule], template: "<ng-container>\n <div class=\"flex flex-col gap-6 p-8\">\n <ng-container\n *ngFor=\"\n let section of facade.currentSections$ | async;\n trackBy: sectionTracker\n \"\n >\n <ng-container *ngIf=\"!section.hidden\">\n <div class=\"flex flex-col gap-8 border p-8 rounded-[8px] shadow\">\n <div\n class=\"flex flex-col gap-2\"\n [ngClass]=\"section.labelKey ? 'mb-4' : 'hidden'\"\n >\n <div\n *ngIf=\"section.labelKey\"\n class=\"text-2xl font-petrona text-secondary\"\n translate\n >\n {{ section.labelKey }}\n </div>\n <div\n *ngIf=\"section.descriptionKey\"\n class=\"text-secondary-lightest\"\n translate\n >\n {{ section.descriptionKey }}\n </div>\n </div>\n <ng-container\n *ngFor=\"\n let field of section.fieldsWithValues;\n trackBy: fieldTracker\n \"\n >\n <ng-container *ngIf=\"!field.config.hidden\">\n <gn-ui-form-field\n [model]=\"field.config.model!\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"\n handleFieldValueChange(field.config.model!, $event)\n \"\n ></gn-ui-form-field>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</ng-container>\n" }]
35364
36065
  }], ctorParameters: function () { return [{ type: EditorFacade }]; } });
35365
36066
 
35366
36067
  const ROUTER_STATE_KEY = 'router';
@@ -35700,7 +36401,7 @@ class DefaultRouterModule {
35700
36401
  };
35701
36402
  }
35702
36403
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DefaultRouterModule, deps: [{ token: RouterService }], target: i0.ɵɵFactoryTarget.NgModule }); }
35703
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: DefaultRouterModule, declarations: [SearchRouterContainerDirective], imports: [i1$2.StoreFeatureModule, i3$3.StoreRouterConnectingModule, i1$8.EffectsFeatureModule], exports: [SearchRouterContainerDirective] }); }
36404
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: DefaultRouterModule, declarations: [SearchRouterContainerDirective], imports: [i1$2.StoreFeatureModule, i3$4.StoreRouterConnectingModule, i1$8.EffectsFeatureModule], exports: [SearchRouterContainerDirective] }); }
35704
36405
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DefaultRouterModule, providers: [
35705
36406
  RouterFacade,
35706
36407
  {
@@ -35743,5 +36444,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35743
36444
  * Generated bundle index. Do not edit.
35744
36445
  */
35745
36446
 
35746
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, BlockListComponent, 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, DatePickerComponent, 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, ErrorComponent, 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, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, 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, LicenseSearchField, 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, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MultilingualSearchField, MyOrgService, NavigationButtonComponent, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, 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, ResultsTableContainerComponent, 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, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, 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, TranslatedSearchField, 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, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, findConverterForDocument, 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, isBeginningOfResults, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, megabytesToBytes, 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, selectRecordAlreadySavedOnce, selectRecordChangedSinceSave, selectRecordFields, selectRecordFieldsConfig, selectRecordSaveError, selectRecordSaving, selectRecordSource, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, totalPages, updateLayer, updateRecordField };
36447
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseConverter, BaseReader, BlockListComponent, 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, DatePickerComponent, 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, ErrorComponent, 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, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, 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, LicenseSearchField, 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, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, MultilingualSearchField, MyOrgService, NavigationButtonComponent, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopoverComponent, PopupAlertComponent, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, 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, ResultsTableContainerComponent, 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, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, 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, TranslatedSearchField, 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, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, findConverterForDocument, 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, isBeginningOfResults, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, megabytesToBytes, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, openRecord, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$2 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, saveRecord, saveRecordFailure, saveRecordSuccess, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectRecord, selectRecordAlreadySavedOnce, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setCurrentPage, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, totalPages, updateLayer, updateRecordField };
35747
36448
  //# sourceMappingURL=geonetwork-ui.mjs.map