geonetwork-ui 2.3.0-dev.6e2b8bea → 2.3.0-dev.b46332e6

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 (199) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +5 -1
  2. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +35 -7
  3. package/esm2022/libs/data-access/gn4/src/openapi/model/models.mjs +1 -2
  4. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +2 -2
  5. package/esm2022/libs/feature/editor/src/index.mjs +2 -2
  6. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-array/form-field-array.component.mjs +11 -0
  7. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-file/form-field-file.component.mjs +28 -0
  8. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-object/form-field-object.component.mjs +11 -0
  9. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.mjs +45 -0
  10. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.mjs +50 -0
  11. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +11 -0
  12. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extent/form-field-temporal-extent.component.mjs +11 -0
  13. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +93 -0
  14. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.mjs +2 -0
  15. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +10 -0
  16. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +39 -0
  17. package/esm2022/libs/feature/editor/src/lib/feature-editor.module.mjs +10 -10
  18. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +1 -1
  19. package/esm2022/libs/ui/elements/src/index.mjs +14 -15
  20. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
  21. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +45 -0
  22. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  23. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +4 -3
  24. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +6 -5
  25. package/esm2022/libs/ui/inputs/src/index.mjs +1 -2
  26. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -1
  27. package/esm2022/libs/ui/inputs/src/lib/files-drop/files-drop.directive.mjs +59 -0
  28. package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +183 -0
  29. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +10 -23
  30. package/esm2022/libs/ui/layout/src/index.mjs +6 -5
  31. package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +18 -0
  32. package/esm2022/libs/util/shared/src/lib/utils/bytes-convert.mjs +4 -0
  33. package/esm2022/libs/util/shared/src/lib/utils/image-resize.mjs +60 -0
  34. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +8 -6
  35. package/esm2022/translations/de.json +10 -0
  36. package/esm2022/translations/en.json +10 -0
  37. package/esm2022/translations/es.json +10 -0
  38. package/esm2022/translations/fr.json +10 -0
  39. package/esm2022/translations/it.json +10 -0
  40. package/esm2022/translations/nl.json +10 -0
  41. package/esm2022/translations/pt.json +10 -0
  42. package/fesm2022/geonetwork-ui.mjs +1772 -1317
  43. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  44. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  45. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts +9 -5
  46. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  47. package/libs/data-access/gn4/src/openapi/model/models.d.ts +0 -1
  48. package/libs/data-access/gn4/src/openapi/model/models.d.ts.map +1 -1
  49. package/libs/feature/editor/src/index.d.ts +1 -1
  50. package/libs/feature/editor/src/index.d.ts.map +1 -1
  51. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.d.ts +1 -1
  52. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-array/form-field-array.component.d.ts.map +1 -0
  53. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.d.ts +1 -1
  54. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-file/form-field-file.component.d.ts.map +1 -0
  55. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.d.ts +1 -1
  56. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-object/form-field-object.component.d.ts.map +1 -0
  57. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.d.ts +16 -0
  58. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.d.ts.map +1 -0
  59. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.d.ts +2 -2
  60. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.d.ts.map +1 -0
  61. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts +1 -1
  62. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +1 -0
  63. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.d.ts +1 -1
  64. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extent/form-field-temporal-extent.component.d.ts.map +1 -0
  65. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.component.d.ts +4 -3
  66. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -0
  67. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts.map +1 -0
  68. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -0
  69. package/libs/feature/editor/src/lib/{record-form → components/record-form}/record-form.component.d.ts +3 -3
  70. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -0
  71. package/libs/feature/editor/src/lib/feature-editor.module.d.ts +1 -1
  72. package/libs/feature/editor/src/lib/feature-editor.module.d.ts.map +1 -1
  73. package/libs/feature/editor/src/lib/models/fields.model.d.ts +1 -1
  74. package/libs/ui/elements/src/index.d.ts +13 -14
  75. package/libs/ui/elements/src/index.d.ts.map +1 -1
  76. package/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.d.ts +13 -0
  77. package/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.d.ts.map +1 -0
  78. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +1 -1
  79. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
  80. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +20 -20
  81. package/libs/ui/inputs/src/index.d.ts +0 -1
  82. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  83. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  84. package/libs/ui/inputs/src/lib/files-drop/files-drop.directive.d.ts +14 -0
  85. package/libs/ui/inputs/src/lib/files-drop/files-drop.directive.d.ts.map +1 -0
  86. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +44 -0
  87. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -0
  88. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +26 -33
  89. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  90. package/libs/ui/layout/src/index.d.ts +5 -4
  91. package/libs/ui/layout/src/index.d.ts.map +1 -1
  92. package/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.d.ts +8 -0
  93. package/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.d.ts.map +1 -0
  94. package/libs/util/shared/src/lib/utils/bytes-convert.d.ts +2 -0
  95. package/libs/util/shared/src/lib/utils/bytes-convert.d.ts.map +1 -0
  96. package/libs/util/shared/src/lib/utils/image-resize.d.ts +3 -0
  97. package/libs/util/shared/src/lib/utils/image-resize.d.ts.map +1 -0
  98. package/libs/util/shared/src/lib/utils/index.d.ts +7 -5
  99. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  100. package/package.json +1 -1
  101. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +6 -0
  102. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +43 -12
  103. package/src/libs/data-access/gn4/src/openapi/model/models.ts +0 -1
  104. package/src/libs/data-access/gn4/src/spec.yaml +1 -1
  105. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +1 -1
  106. package/src/libs/feature/editor/src/index.ts +1 -1
  107. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +8 -0
  108. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +70 -0
  109. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.ts +1 -0
  110. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.ts +4 -1
  111. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.ts +1 -0
  112. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.css +5 -0
  113. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.html +20 -0
  114. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.ts +44 -0
  115. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.ts +4 -1
  116. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +1 -0
  117. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.ts +1 -0
  118. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.component.html +4 -4
  119. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.component.ts +31 -5
  120. package/src/libs/feature/editor/src/lib/{record-form → components/record-form}/record-form.component.html +1 -0
  121. package/src/libs/feature/editor/src/lib/{record-form → components/record-form}/record-form.component.ts +23 -4
  122. package/src/libs/feature/editor/src/lib/feature-editor.module.ts +9 -9
  123. package/src/libs/feature/editor/src/lib/models/fields.model.ts +1 -1
  124. package/src/libs/ui/elements/src/index.ts +13 -14
  125. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +0 -5
  126. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +0 -21
  127. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +1 -14
  128. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +5 -3
  129. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +1 -1
  130. package/src/libs/ui/inputs/src/index.ts +0 -1
  131. package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -1
  132. package/src/libs/ui/inputs/src/lib/files-drop/files-drop.directive.ts +45 -0
  133. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.css +0 -0
  134. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +146 -0
  135. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +193 -0
  136. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -19
  137. package/src/libs/ui/layout/src/index.ts +5 -4
  138. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.css +5 -0
  139. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +18 -0
  140. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.ts +16 -0
  141. package/src/libs/util/shared/src/lib/utils/bytes-convert.ts +3 -0
  142. package/src/libs/util/shared/src/lib/utils/image-resize.ts +72 -0
  143. package/src/libs/util/shared/src/lib/utils/index.ts +7 -5
  144. package/translations/de.json +10 -0
  145. package/translations/en.json +10 -0
  146. package/translations/es.json +10 -0
  147. package/translations/fr.json +10 -0
  148. package/translations/it.json +10 -0
  149. package/translations/nl.json +10 -0
  150. package/translations/pt.json +10 -0
  151. package/translations/sk.json +10 -0
  152. package/esm2022/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.mjs +0 -13
  153. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +0 -30
  154. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-array/form-field-array.component.mjs +0 -11
  155. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-file/form-field-file.component.mjs +0 -27
  156. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-object/form-field-object.component.mjs +0 -11
  157. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.mjs +0 -27
  158. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-simple/form-field-simple.component.mjs +0 -49
  159. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +0 -11
  160. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-temporal-extent/form-field-temporal-extent.component.mjs +0 -11
  161. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.component.mjs +0 -76
  162. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.model.mjs +0 -2
  163. package/esm2022/libs/ui/inputs/src/lib/form-field/index.mjs +0 -10
  164. package/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.d.ts +0 -18
  165. package/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.d.ts.map +0 -1
  166. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +0 -1
  167. package/libs/ui/inputs/src/lib/form-field/form-field-array/form-field-array.component.d.ts.map +0 -1
  168. package/libs/ui/inputs/src/lib/form-field/form-field-file/form-field-file.component.d.ts.map +0 -1
  169. package/libs/ui/inputs/src/lib/form-field/form-field-object/form-field-object.component.d.ts.map +0 -1
  170. package/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.d.ts +0 -11
  171. package/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.d.ts.map +0 -1
  172. package/libs/ui/inputs/src/lib/form-field/form-field-simple/form-field-simple.component.d.ts.map +0 -1
  173. package/libs/ui/inputs/src/lib/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +0 -1
  174. package/libs/ui/inputs/src/lib/form-field/form-field-temporal-extent/form-field-temporal-extent.component.d.ts.map +0 -1
  175. package/libs/ui/inputs/src/lib/form-field/form-field.component.d.ts.map +0 -1
  176. package/libs/ui/inputs/src/lib/form-field/form-field.model.d.ts.map +0 -1
  177. package/libs/ui/inputs/src/lib/form-field/index.d.ts.map +0 -1
  178. package/src/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.ts +0 -18
  179. package/src/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.html +0 -11
  180. package/src/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.ts +0 -15
  181. /package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.model.d.ts +0 -0
  182. /package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/index.d.ts +0 -0
  183. /package/src/libs/feature/editor/src/lib/{record-form/record-form.component.css → components/overview-upload/overview-upload.component.css} +0 -0
  184. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.css +0 -0
  185. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.html +0 -0
  186. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.css +0 -0
  187. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.html +0 -0
  188. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.css +0 -0
  189. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.html +0 -0
  190. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.css +0 -0
  191. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.html +0 -0
  192. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.css +0 -0
  193. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +0 -0
  194. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.css +0 -0
  195. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.html +0 -0
  196. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.component.css +0 -0
  197. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.model.ts +0 -0
  198. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/index.ts +0 -0
  199. /package/src/libs/{ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.css → feature/editor/src/lib/components/record-form/record-form.component.css} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { parseXml, XmlDocument, XmlElement, XmlText } from '@rgrove/parse-xml';
2
2
  import format from 'date-fns/format';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ElementRef, ViewChildren, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ContentChildren, inject } 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, inject } from '@angular/core';
5
5
  import * as i1 from '@angular/common/http';
6
6
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpClientXsrfModule } from '@angular/common/http';
7
7
  import * as i1$1 from '@ngx-translate/core';
@@ -70,9 +70,9 @@ import { MatInputModule } from '@angular/material/input';
70
70
  import * as i1$7 from '@angular/router';
71
71
  import { RouterModule, RouterLink, RouteReuseStrategy } from '@angular/router';
72
72
  import Duration from 'duration-relativetimeformat';
73
+ import * as basicLightbox from 'basiclightbox';
73
74
  import { marked } from 'marked';
74
75
  import EmblaCarousel from 'embla-carousel';
75
- import * as basicLightbox from 'basiclightbox';
76
76
  import * as i1$8 from '@ngrx/effects';
77
77
  import { createEffect, ofType, EffectsModule, Actions } from '@ngrx/effects';
78
78
  import tippy from 'tippy.js';
@@ -6008,6 +6008,19 @@ class RecordsApiService {
6008
6008
  }
6009
6009
  this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
6010
6010
  }
6011
+ /**
6012
+ * @param consumes string[] mime-types
6013
+ * @return true: consumes contains 'multipart/form-data', false: otherwise
6014
+ */
6015
+ canConsumeForm(consumes) {
6016
+ const form = 'multipart/form-data';
6017
+ for (const consume of consumes) {
6018
+ if (form === consume) {
6019
+ return true;
6020
+ }
6021
+ }
6022
+ return false;
6023
+ }
6011
6024
  addToHttpParams(httpParams, value, key) {
6012
6025
  if (typeof value === 'object' && value instanceof Date === false) {
6013
6026
  httpParams = this.addToHttpParamsRecursive(httpParams, value);
@@ -8981,10 +8994,13 @@ class RecordsApiService {
8981
8994
  reportProgress: reportProgress,
8982
8995
  });
8983
8996
  }
8984
- putResource(metadataUuid, visibility, approved, inlineObject3ApiModel, observe = 'body', reportProgress = false, options) {
8997
+ putResource(metadataUuid, file, visibility, approved, observe = 'body', reportProgress = false, options) {
8985
8998
  if (metadataUuid === null || metadataUuid === undefined) {
8986
8999
  throw new Error('Required parameter metadataUuid was null or undefined when calling putResource.');
8987
9000
  }
9001
+ if (file === null || file === undefined) {
9002
+ throw new Error('Required parameter file was null or undefined when calling putResource.');
9003
+ }
8988
9004
  let queryParameters = new HttpParams({ encoder: this.encoder });
8989
9005
  if (visibility !== undefined && visibility !== null) {
8990
9006
  queryParameters = this.addToHttpParams(queryParameters, visibility, 'visibility');
@@ -9004,17 +9020,29 @@ class RecordsApiService {
9004
9020
  headers = headers.set('Accept', httpHeaderAcceptSelected);
9005
9021
  }
9006
9022
  // to determine the Content-Type header
9007
- const consumes = ['application/json'];
9008
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
9009
- if (httpContentTypeSelected !== undefined) {
9010
- headers = headers.set('Content-Type', httpContentTypeSelected);
9023
+ const consumes = ['multipart/form-data'];
9024
+ const canConsumeForm = this.canConsumeForm(consumes);
9025
+ let formParams;
9026
+ let useForm = false;
9027
+ let convertFormParamsToString = false;
9028
+ // use FormData to transmit files using content-type "multipart/form-data"
9029
+ // see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
9030
+ useForm = canConsumeForm;
9031
+ if (useForm) {
9032
+ formParams = new FormData();
9033
+ }
9034
+ else {
9035
+ formParams = new HttpParams({ encoder: this.encoder });
9036
+ }
9037
+ if (file !== undefined) {
9038
+ formParams = formParams.append('file', file) || formParams;
9011
9039
  }
9012
9040
  let responseType_ = 'json';
9013
9041
  if (httpHeaderAcceptSelected &&
9014
9042
  httpHeaderAcceptSelected.startsWith('text')) {
9015
9043
  responseType_ = 'text';
9016
9044
  }
9017
- return this.httpClient.post(`${this.configuration.basePath}/records/${encodeURIComponent(String(metadataUuid))}/attachments`, inlineObject3ApiModel, {
9045
+ return this.httpClient.post(`${this.configuration.basePath}/records/${encodeURIComponent(String(metadataUuid))}/attachments`, convertFormParamsToString ? formParams.toString() : formParams, {
9018
9046
  params: queryParameters,
9019
9047
  responseType: responseType_,
9020
9048
  withCredentials: this.configuration.withCredentials,
@@ -16235,303 +16263,291 @@ var GroupPrivilegeApiModel;
16235
16263
  * https://openapi-generator.tech
16236
16264
  * Do not edit the class manually.
16237
16265
  */
16238
-
16239
- /**
16240
- * GeoNetwork 4.2.7 OpenAPI Documentation
16241
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16242
- *
16243
- * The version of the OpenAPI document: 4.2.7
16244
- * Contact: geonetwork-users@lists.sourceforge.net
16245
- *
16246
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16247
- * https://openapi-generator.tech
16248
- * Do not edit the class manually.
16249
- */
16250
-
16251
- /**
16252
- * GeoNetwork 4.2.7 OpenAPI Documentation
16253
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16254
- *
16255
- * The version of the OpenAPI document: 4.2.7
16256
- * Contact: geonetwork-users@lists.sourceforge.net
16257
- *
16258
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16259
- * https://openapi-generator.tech
16260
- * Do not edit the class manually.
16261
- */
16262
- var JsonNodeApiModel;
16263
- (function (JsonNodeApiModel) {
16264
- JsonNodeApiModel.NodeTypeEnum = {
16265
- Array: 'ARRAY',
16266
- Binary: 'BINARY',
16267
- Boolean: 'BOOLEAN',
16268
- Missing: 'MISSING',
16269
- Null: 'NULL',
16270
- Number: 'NUMBER',
16271
- Object: 'OBJECT',
16272
- Pojo: 'POJO',
16273
- String: 'STRING',
16274
- };
16275
- })(JsonNodeApiModel || (JsonNodeApiModel = {}));
16276
-
16277
- /**
16278
- * GeoNetwork 4.2.7 OpenAPI Documentation
16279
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16280
- *
16281
- * The version of the OpenAPI document: 4.2.7
16282
- * Contact: geonetwork-users@lists.sourceforge.net
16283
- *
16284
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16285
- * https://openapi-generator.tech
16286
- * Do not edit the class manually.
16287
- */
16288
-
16289
- var LinkApiModel;
16290
- (function (LinkApiModel) {
16291
- LinkApiModel.LinkTypeEnum = {
16292
- Http: 'HTTP',
16293
- Metadata: 'METADATA',
16294
- };
16295
- })(LinkApiModel || (LinkApiModel = {}));
16296
-
16297
- /**
16298
- * GeoNetwork 4.2.7 OpenAPI Documentation
16299
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16300
- *
16301
- * The version of the OpenAPI document: 4.2.7
16302
- * Contact: geonetwork-users@lists.sourceforge.net
16303
- *
16304
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16305
- * https://openapi-generator.tech
16306
- * Do not edit the class manually.
16307
- */
16308
-
16309
- /**
16310
- * GeoNetwork 4.2.7 OpenAPI Documentation
16311
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16312
- *
16313
- * The version of the OpenAPI document: 4.2.7
16314
- * Contact: geonetwork-users@lists.sourceforge.net
16315
- *
16316
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16317
- * https://openapi-generator.tech
16318
- * Do not edit the class manually.
16319
- */
16320
-
16321
- /**
16322
- * GeoNetwork 4.2.7 OpenAPI Documentation
16323
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16324
- *
16325
- * The version of the OpenAPI document: 4.2.7
16326
- * Contact: geonetwork-users@lists.sourceforge.net
16327
- *
16328
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16329
- * https://openapi-generator.tech
16330
- * Do not edit the class manually.
16331
- */
16332
-
16333
- /**
16334
- * GeoNetwork 4.2.7 OpenAPI Documentation
16335
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16336
- *
16337
- * The version of the OpenAPI document: 4.2.7
16338
- * Contact: geonetwork-users@lists.sourceforge.net
16339
- *
16340
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16341
- * https://openapi-generator.tech
16342
- * Do not edit the class manually.
16343
- */
16344
-
16345
- /**
16346
- * GeoNetwork 4.2.7 OpenAPI Documentation
16347
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16348
- *
16349
- * The version of the OpenAPI document: 4.2.7
16350
- * Contact: geonetwork-users@lists.sourceforge.net
16351
- *
16352
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16353
- * https://openapi-generator.tech
16354
- * Do not edit the class manually.
16355
- */
16356
-
16357
- /**
16358
- * GeoNetwork 4.2.7 OpenAPI Documentation
16359
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16360
- *
16361
- * The version of the OpenAPI document: 4.2.7
16362
- * Contact: geonetwork-users@lists.sourceforge.net
16363
- *
16364
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16365
- * https://openapi-generator.tech
16366
- * Do not edit the class manually.
16367
- */
16368
-
16369
- /**
16370
- * GeoNetwork 4.2.7 OpenAPI Documentation
16371
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16372
- *
16373
- * The version of the OpenAPI document: 4.2.7
16374
- * Contact: geonetwork-users@lists.sourceforge.net
16375
- *
16376
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16377
- * https://openapi-generator.tech
16378
- * Do not edit the class manually.
16379
- */
16380
-
16381
- /**
16382
- * GeoNetwork 4.2.7 OpenAPI Documentation
16383
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16384
- *
16385
- * The version of the OpenAPI document: 4.2.7
16386
- * Contact: geonetwork-users@lists.sourceforge.net
16387
- *
16388
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16389
- * https://openapi-generator.tech
16390
- * Do not edit the class manually.
16391
- */
16392
-
16393
- /**
16394
- * GeoNetwork 4.2.7 OpenAPI Documentation
16395
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16396
- *
16397
- * The version of the OpenAPI document: 4.2.7
16398
- * Contact: geonetwork-users@lists.sourceforge.net
16399
- *
16400
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16401
- * https://openapi-generator.tech
16402
- * Do not edit the class manually.
16403
- */
16404
-
16405
- /**
16406
- * GeoNetwork 4.2.7 OpenAPI Documentation
16407
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16408
- *
16409
- * The version of the OpenAPI document: 4.2.7
16410
- * Contact: geonetwork-users@lists.sourceforge.net
16411
- *
16412
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16413
- * https://openapi-generator.tech
16414
- * Do not edit the class manually.
16415
- */
16416
-
16417
- var MetadataResourceApiModel;
16418
- (function (MetadataResourceApiModel) {
16419
- MetadataResourceApiModel.VisibilityEnum = {
16420
- Public: 'public',
16421
- Private: 'private',
16422
- };
16423
- })(MetadataResourceApiModel || (MetadataResourceApiModel = {}));
16424
-
16425
- /**
16426
- * GeoNetwork 4.2.7 OpenAPI Documentation
16427
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16428
- *
16429
- * The version of the OpenAPI document: 4.2.7
16430
- * Contact: geonetwork-users@lists.sourceforge.net
16431
- *
16432
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16433
- * https://openapi-generator.tech
16434
- * Do not edit the class manually.
16435
- */
16436
- var MetadataResourceExternalManagementPropertiesApiModel;
16437
- (function (MetadataResourceExternalManagementPropertiesApiModel) {
16438
- MetadataResourceExternalManagementPropertiesApiModel.ValidationStatusEnum = {
16439
- Unknown: 'UNKNOWN',
16440
- Valid: 'VALID',
16441
- Incomplete: 'INCOMPLETE',
16442
- };
16443
- })(MetadataResourceExternalManagementPropertiesApiModel || (MetadataResourceExternalManagementPropertiesApiModel = {}));
16444
-
16445
- /**
16446
- * GeoNetwork 4.2.7 OpenAPI Documentation
16447
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16448
- *
16449
- * The version of the OpenAPI document: 4.2.7
16450
- * Contact: geonetwork-users@lists.sourceforge.net
16451
- *
16452
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16453
- * https://openapi-generator.tech
16454
- * Do not edit the class manually.
16455
- */
16456
- var MetadataStatusParameterApiModel;
16457
- (function (MetadataStatusParameterApiModel) {
16458
- MetadataStatusParameterApiModel.TypeEnum = {
16459
- Workflow: 'workflow',
16460
- Task: 'task',
16461
- Event: 'event',
16462
- };
16463
- })(MetadataStatusParameterApiModel || (MetadataStatusParameterApiModel = {}));
16464
-
16465
- /**
16466
- * GeoNetwork 4.2.7 OpenAPI Documentation
16467
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16468
- *
16469
- * The version of the OpenAPI document: 4.2.7
16470
- * Contact: geonetwork-users@lists.sourceforge.net
16471
- *
16472
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16473
- * https://openapi-generator.tech
16474
- * Do not edit the class manually.
16475
- */
16476
- var OperationApiModel;
16477
- (function (OperationApiModel) {
16478
- OperationApiModel.ReservedOperationEnum = {
16479
- View: 'view',
16480
- Download: 'download',
16481
- Editing: 'editing',
16482
- Notify: 'notify',
16483
- Dynamic: 'dynamic',
16484
- Featured: 'featured',
16485
- };
16486
- })(OperationApiModel || (OperationApiModel = {}));
16487
-
16488
- /**
16489
- * GeoNetwork 4.2.7 OpenAPI Documentation
16490
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16491
- *
16492
- * The version of the OpenAPI document: 4.2.7
16493
- * Contact: geonetwork-users@lists.sourceforge.net
16494
- *
16495
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16496
- * https://openapi-generator.tech
16497
- * Do not edit the class manually.
16498
- */
16499
-
16500
- /**
16501
- * GeoNetwork 4.2.7 OpenAPI Documentation
16502
- * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16503
- *
16504
- * The version of the OpenAPI document: 4.2.7
16505
- * Contact: geonetwork-users@lists.sourceforge.net
16506
- *
16507
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16508
- * https://openapi-generator.tech
16509
- * Do not edit the class manually.
16510
- */
16511
- var PagePropertiesApiModel;
16512
- (function (PagePropertiesApiModel) {
16513
- PagePropertiesApiModel.SectionsEnum = {
16514
- Top: 'TOP',
16515
- Footer: 'FOOTER',
16516
- Menu: 'MENU',
16517
- Submenu: 'SUBMENU',
16518
- CustomMenu1: 'CUSTOM_MENU1',
16519
- CustomMenu2: 'CUSTOM_MENU2',
16520
- CustomMenu3: 'CUSTOM_MENU3',
16521
- };
16522
- PagePropertiesApiModel.StatusEnum = {
16523
- Public: 'PUBLIC',
16524
- PublicOnly: 'PUBLIC_ONLY',
16525
- Private: 'PRIVATE',
16526
- Hidden: 'HIDDEN',
16527
- };
16528
- PagePropertiesApiModel.FormatEnum = {
16529
- Link: 'LINK',
16530
- Html: 'HTML',
16531
- Htmlpage: 'HTMLPAGE',
16532
- Text: 'TEXT',
16533
- };
16534
- })(PagePropertiesApiModel || (PagePropertiesApiModel = {}));
16266
+
16267
+ /**
16268
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16269
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16270
+ *
16271
+ * The version of the OpenAPI document: 4.2.7
16272
+ * Contact: geonetwork-users@lists.sourceforge.net
16273
+ *
16274
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16275
+ * https://openapi-generator.tech
16276
+ * Do not edit the class manually.
16277
+ */
16278
+ var JsonNodeApiModel;
16279
+ (function (JsonNodeApiModel) {
16280
+ JsonNodeApiModel.NodeTypeEnum = {
16281
+ Array: 'ARRAY',
16282
+ Binary: 'BINARY',
16283
+ Boolean: 'BOOLEAN',
16284
+ Missing: 'MISSING',
16285
+ Null: 'NULL',
16286
+ Number: 'NUMBER',
16287
+ Object: 'OBJECT',
16288
+ Pojo: 'POJO',
16289
+ String: 'STRING',
16290
+ };
16291
+ })(JsonNodeApiModel || (JsonNodeApiModel = {}));
16292
+
16293
+ /**
16294
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16295
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16296
+ *
16297
+ * The version of the OpenAPI document: 4.2.7
16298
+ * Contact: geonetwork-users@lists.sourceforge.net
16299
+ *
16300
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16301
+ * https://openapi-generator.tech
16302
+ * Do not edit the class manually.
16303
+ */
16304
+
16305
+ var LinkApiModel;
16306
+ (function (LinkApiModel) {
16307
+ LinkApiModel.LinkTypeEnum = {
16308
+ Http: 'HTTP',
16309
+ Metadata: 'METADATA',
16310
+ };
16311
+ })(LinkApiModel || (LinkApiModel = {}));
16312
+
16313
+ /**
16314
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16315
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16316
+ *
16317
+ * The version of the OpenAPI document: 4.2.7
16318
+ * Contact: geonetwork-users@lists.sourceforge.net
16319
+ *
16320
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16321
+ * https://openapi-generator.tech
16322
+ * Do not edit the class manually.
16323
+ */
16324
+
16325
+ /**
16326
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16327
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16328
+ *
16329
+ * The version of the OpenAPI document: 4.2.7
16330
+ * Contact: geonetwork-users@lists.sourceforge.net
16331
+ *
16332
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16333
+ * https://openapi-generator.tech
16334
+ * Do not edit the class manually.
16335
+ */
16336
+
16337
+ /**
16338
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16339
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16340
+ *
16341
+ * The version of the OpenAPI document: 4.2.7
16342
+ * Contact: geonetwork-users@lists.sourceforge.net
16343
+ *
16344
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16345
+ * https://openapi-generator.tech
16346
+ * Do not edit the class manually.
16347
+ */
16348
+
16349
+ /**
16350
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16351
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16352
+ *
16353
+ * The version of the OpenAPI document: 4.2.7
16354
+ * Contact: geonetwork-users@lists.sourceforge.net
16355
+ *
16356
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16357
+ * https://openapi-generator.tech
16358
+ * Do not edit the class manually.
16359
+ */
16360
+
16361
+ /**
16362
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16363
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16364
+ *
16365
+ * The version of the OpenAPI document: 4.2.7
16366
+ * Contact: geonetwork-users@lists.sourceforge.net
16367
+ *
16368
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16369
+ * https://openapi-generator.tech
16370
+ * Do not edit the class manually.
16371
+ */
16372
+
16373
+ /**
16374
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16375
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16376
+ *
16377
+ * The version of the OpenAPI document: 4.2.7
16378
+ * Contact: geonetwork-users@lists.sourceforge.net
16379
+ *
16380
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16381
+ * https://openapi-generator.tech
16382
+ * Do not edit the class manually.
16383
+ */
16384
+
16385
+ /**
16386
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16387
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16388
+ *
16389
+ * The version of the OpenAPI document: 4.2.7
16390
+ * Contact: geonetwork-users@lists.sourceforge.net
16391
+ *
16392
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16393
+ * https://openapi-generator.tech
16394
+ * Do not edit the class manually.
16395
+ */
16396
+
16397
+ /**
16398
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16399
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16400
+ *
16401
+ * The version of the OpenAPI document: 4.2.7
16402
+ * Contact: geonetwork-users@lists.sourceforge.net
16403
+ *
16404
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16405
+ * https://openapi-generator.tech
16406
+ * Do not edit the class manually.
16407
+ */
16408
+
16409
+ /**
16410
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16411
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16412
+ *
16413
+ * The version of the OpenAPI document: 4.2.7
16414
+ * Contact: geonetwork-users@lists.sourceforge.net
16415
+ *
16416
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16417
+ * https://openapi-generator.tech
16418
+ * Do not edit the class manually.
16419
+ */
16420
+
16421
+ /**
16422
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16423
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16424
+ *
16425
+ * The version of the OpenAPI document: 4.2.7
16426
+ * Contact: geonetwork-users@lists.sourceforge.net
16427
+ *
16428
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16429
+ * https://openapi-generator.tech
16430
+ * Do not edit the class manually.
16431
+ */
16432
+
16433
+ var MetadataResourceApiModel;
16434
+ (function (MetadataResourceApiModel) {
16435
+ MetadataResourceApiModel.VisibilityEnum = {
16436
+ Public: 'public',
16437
+ Private: 'private',
16438
+ };
16439
+ })(MetadataResourceApiModel || (MetadataResourceApiModel = {}));
16440
+
16441
+ /**
16442
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16443
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16444
+ *
16445
+ * The version of the OpenAPI document: 4.2.7
16446
+ * Contact: geonetwork-users@lists.sourceforge.net
16447
+ *
16448
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16449
+ * https://openapi-generator.tech
16450
+ * Do not edit the class manually.
16451
+ */
16452
+ var MetadataResourceExternalManagementPropertiesApiModel;
16453
+ (function (MetadataResourceExternalManagementPropertiesApiModel) {
16454
+ MetadataResourceExternalManagementPropertiesApiModel.ValidationStatusEnum = {
16455
+ Unknown: 'UNKNOWN',
16456
+ Valid: 'VALID',
16457
+ Incomplete: 'INCOMPLETE',
16458
+ };
16459
+ })(MetadataResourceExternalManagementPropertiesApiModel || (MetadataResourceExternalManagementPropertiesApiModel = {}));
16460
+
16461
+ /**
16462
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16463
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16464
+ *
16465
+ * The version of the OpenAPI document: 4.2.7
16466
+ * Contact: geonetwork-users@lists.sourceforge.net
16467
+ *
16468
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16469
+ * https://openapi-generator.tech
16470
+ * Do not edit the class manually.
16471
+ */
16472
+ var MetadataStatusParameterApiModel;
16473
+ (function (MetadataStatusParameterApiModel) {
16474
+ MetadataStatusParameterApiModel.TypeEnum = {
16475
+ Workflow: 'workflow',
16476
+ Task: 'task',
16477
+ Event: 'event',
16478
+ };
16479
+ })(MetadataStatusParameterApiModel || (MetadataStatusParameterApiModel = {}));
16480
+
16481
+ /**
16482
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16483
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16484
+ *
16485
+ * The version of the OpenAPI document: 4.2.7
16486
+ * Contact: geonetwork-users@lists.sourceforge.net
16487
+ *
16488
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16489
+ * https://openapi-generator.tech
16490
+ * Do not edit the class manually.
16491
+ */
16492
+ var OperationApiModel;
16493
+ (function (OperationApiModel) {
16494
+ OperationApiModel.ReservedOperationEnum = {
16495
+ View: 'view',
16496
+ Download: 'download',
16497
+ Editing: 'editing',
16498
+ Notify: 'notify',
16499
+ Dynamic: 'dynamic',
16500
+ Featured: 'featured',
16501
+ };
16502
+ })(OperationApiModel || (OperationApiModel = {}));
16503
+
16504
+ /**
16505
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16506
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16507
+ *
16508
+ * The version of the OpenAPI document: 4.2.7
16509
+ * Contact: geonetwork-users@lists.sourceforge.net
16510
+ *
16511
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16512
+ * https://openapi-generator.tech
16513
+ * Do not edit the class manually.
16514
+ */
16515
+
16516
+ /**
16517
+ * GeoNetwork 4.2.7 OpenAPI Documentation
16518
+ * This is the description of the GeoNetwork OpenAPI. Use this API to manage your catalog.
16519
+ *
16520
+ * The version of the OpenAPI document: 4.2.7
16521
+ * Contact: geonetwork-users@lists.sourceforge.net
16522
+ *
16523
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
16524
+ * https://openapi-generator.tech
16525
+ * Do not edit the class manually.
16526
+ */
16527
+ var PagePropertiesApiModel;
16528
+ (function (PagePropertiesApiModel) {
16529
+ PagePropertiesApiModel.SectionsEnum = {
16530
+ Top: 'TOP',
16531
+ Footer: 'FOOTER',
16532
+ Menu: 'MENU',
16533
+ Submenu: 'SUBMENU',
16534
+ CustomMenu1: 'CUSTOM_MENU1',
16535
+ CustomMenu2: 'CUSTOM_MENU2',
16536
+ CustomMenu3: 'CUSTOM_MENU3',
16537
+ };
16538
+ PagePropertiesApiModel.StatusEnum = {
16539
+ Public: 'PUBLIC',
16540
+ PublicOnly: 'PUBLIC_ONLY',
16541
+ Private: 'PRIVATE',
16542
+ Hidden: 'HIDDEN',
16543
+ };
16544
+ PagePropertiesApiModel.FormatEnum = {
16545
+ Link: 'LINK',
16546
+ Html: 'HTML',
16547
+ Htmlpage: 'HTMLPAGE',
16548
+ Text: 'TEXT',
16549
+ };
16550
+ })(PagePropertiesApiModel || (PagePropertiesApiModel = {}));
16535
16551
 
16536
16552
  /**
16537
16553
  * GeoNetwork 4.2.7 OpenAPI Documentation
@@ -17414,6 +17430,16 @@ var de = {
17414
17430
  "facets.block.title.tag.default": "Stichwort",
17415
17431
  "facets.block.title.th_regions_tree.default": "Regionen",
17416
17432
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Anmelden</a>, um auf diese Funktion zuzugreifen</div>",
17433
+ "input.image.altTextPlaceholder": "",
17434
+ "input.image.delete": "",
17435
+ "input.image.displayAltTextInput": "",
17436
+ "input.image.displayUrlInput": "",
17437
+ "input.image.dropFileLabel": "",
17438
+ "input.image.selectFileLabel": "",
17439
+ "input.image.uploadErrorLabel": "",
17440
+ "input.image.uploadErrorRetry": "",
17441
+ "input.image.uploadProgressCancel": "",
17442
+ "input.image.uploadProgressLabel": "",
17417
17443
  "language.ca": "Katalanisch",
17418
17444
  "language.cs": "Tschechisch",
17419
17445
  "language.de": "Deutsch",
@@ -17766,6 +17792,16 @@ var en = {
17766
17792
  "facets.block.title.tag.default": "Tag",
17767
17793
  "facets.block.title.th_regions_tree.default": "Regions",
17768
17794
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> to access this feature</div>",
17795
+ "input.image.altTextPlaceholder": "Image alternate text",
17796
+ "input.image.delete": "Delete",
17797
+ "input.image.displayAltTextInput": "Alternate text",
17798
+ "input.image.displayUrlInput": "Enter a URL",
17799
+ "input.image.dropFileLabel": "or drop it here",
17800
+ "input.image.selectFileLabel": "Select an image",
17801
+ "input.image.uploadErrorLabel": "The image could not be uploaded",
17802
+ "input.image.uploadErrorRetry": "Retry",
17803
+ "input.image.uploadProgressCancel": "Cancel",
17804
+ "input.image.uploadProgressLabel": "Upload in progress...",
17769
17805
  "language.ca": "Catalan",
17770
17806
  "language.cs": "Czech",
17771
17807
  "language.de": "German",
@@ -18118,6 +18154,16 @@ var es = {
18118
18154
  "facets.block.title.tag.default": "",
18119
18155
  "facets.block.title.th_regions_tree.default": "",
18120
18156
  "favorite.not.authenticated.tooltip": "",
18157
+ "input.image.altTextPlaceholder": "",
18158
+ "input.image.delete": "",
18159
+ "input.image.displayAltTextInput": "",
18160
+ "input.image.displayUrlInput": "",
18161
+ "input.image.dropFileLabel": "",
18162
+ "input.image.selectFileLabel": "",
18163
+ "input.image.uploadErrorLabel": "",
18164
+ "input.image.uploadErrorRetry": "",
18165
+ "input.image.uploadProgressCancel": "",
18166
+ "input.image.uploadProgressLabel": "",
18121
18167
  "language.ca": "Catalán",
18122
18168
  "language.cs": "Checo",
18123
18169
  "language.de": "Alemán",
@@ -18470,6 +18516,16 @@ var fr = {
18470
18516
  "facets.block.title.tag.default": "Tag",
18471
18517
  "facets.block.title.th_regions_tree.default": "Régions",
18472
18518
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Connectez-vous</a> pour avoir accès à cette fonctionnalité</div>",
18519
+ "input.image.altTextPlaceholder": "Texte alternatif de l'image",
18520
+ "input.image.delete": "Supprimer",
18521
+ "input.image.displayAltTextInput": "Texte alternatif",
18522
+ "input.image.displayUrlInput": "Saisir une URL",
18523
+ "input.image.dropFileLabel": "ou la glisser ici",
18524
+ "input.image.selectFileLabel": "Sélectionner une image",
18525
+ "input.image.uploadErrorLabel": "L'image n'a pas pu être chargée",
18526
+ "input.image.uploadErrorRetry": "Réessayer",
18527
+ "input.image.uploadProgressCancel": "Annuler",
18528
+ "input.image.uploadProgressLabel": "Chargement en cours...",
18473
18529
  "language.ca": "Catalan",
18474
18530
  "language.cs": "Tchèque",
18475
18531
  "language.de": "Allemand",
@@ -18822,6 +18878,16 @@ var it = {
18822
18878
  "facets.block.title.tag.default": "Tag",
18823
18879
  "facets.block.title.th_regions_tree.default": "Regioni",
18824
18880
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> per accedere a questa funzionalità</div>",
18881
+ "input.image.altTextPlaceholder": "",
18882
+ "input.image.delete": "",
18883
+ "input.image.displayAltTextInput": "",
18884
+ "input.image.displayUrlInput": "",
18885
+ "input.image.dropFileLabel": "",
18886
+ "input.image.selectFileLabel": "",
18887
+ "input.image.uploadErrorLabel": "",
18888
+ "input.image.uploadErrorRetry": "",
18889
+ "input.image.uploadProgressCancel": "",
18890
+ "input.image.uploadProgressLabel": "",
18825
18891
  "language.ca": "Catalano",
18826
18892
  "language.cs": "Ceco",
18827
18893
  "language.de": "Tedesco",
@@ -19174,6 +19240,16 @@ var nl = {
19174
19240
  "facets.block.title.tag.default": "",
19175
19241
  "facets.block.title.th_regions_tree.default": "",
19176
19242
  "favorite.not.authenticated.tooltip": "",
19243
+ "input.image.altTextPlaceholder": "",
19244
+ "input.image.delete": "",
19245
+ "input.image.displayAltTextInput": "",
19246
+ "input.image.displayUrlInput": "",
19247
+ "input.image.dropFileLabel": "",
19248
+ "input.image.selectFileLabel": "",
19249
+ "input.image.uploadErrorLabel": "",
19250
+ "input.image.uploadErrorRetry": "",
19251
+ "input.image.uploadProgressCancel": "",
19252
+ "input.image.uploadProgressLabel": "",
19177
19253
  "language.ca": "Catalaans",
19178
19254
  "language.cs": "Tsjechisch",
19179
19255
  "language.de": "Duits",
@@ -19526,6 +19602,16 @@ var pt = {
19526
19602
  "facets.block.title.tag.default": "",
19527
19603
  "facets.block.title.th_regions_tree.default": "",
19528
19604
  "favorite.not.authenticated.tooltip": "",
19605
+ "input.image.altTextPlaceholder": "",
19606
+ "input.image.delete": "",
19607
+ "input.image.displayAltTextInput": "",
19608
+ "input.image.displayUrlInput": "",
19609
+ "input.image.dropFileLabel": "",
19610
+ "input.image.selectFileLabel": "",
19611
+ "input.image.uploadErrorLabel": "",
19612
+ "input.image.uploadErrorRetry": "",
19613
+ "input.image.uploadProgressCancel": "",
19614
+ "input.image.uploadProgressLabel": "",
19529
19615
  "language.ca": "Catalão",
19530
19616
  "language.cs": "Tcheco",
19531
19617
  "language.de": "Alemão",
@@ -19796,6 +19882,10 @@ class Gn4FieldMapper {
19796
19882
  ...output,
19797
19883
  datasetCreated: toDate(getFirstValue(selectField(source, 'creationDateForResource'))),
19798
19884
  }),
19885
+ revisionDateForResource: (output, source) => ({
19886
+ ...output,
19887
+ datasetUpdated: toDate(getFirstValue(selectField(source, 'revisionDateForResource'))),
19888
+ }),
19799
19889
  createDate: (output, source) => ({
19800
19890
  ...output,
19801
19891
  recordCreated: toDate(selectField(source, 'createDate')),
@@ -21663,6 +21753,130 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21663
21753
  args: [PROXY_PATH]
21664
21754
  }] }]; } });
21665
21755
 
21756
+ function megabytesToBytes(megabytes) {
21757
+ return megabytes * 1048576;
21758
+ }
21759
+
21760
+ /**
21761
+ * This should be called instead of event.stopPropagation()
21762
+ * to make sure that the document receives the event
21763
+ * @param event
21764
+ */
21765
+ function propagateToDocumentOnly(event) {
21766
+ event.stopPropagation();
21767
+ setTimeout(() => {
21768
+ window.document.dispatchEvent(event);
21769
+ }, 0);
21770
+ }
21771
+
21772
+ function normalize(input) {
21773
+ return input
21774
+ .toLowerCase()
21775
+ .normalize('NFD') // explode composite chars (e.g. é) into multiple chars
21776
+ .replace(/[\u0300-\u036f]/g, '') // remove accents
21777
+ .replace(/œ/g, 'oe') // remove accents
21778
+ .replace(/[^a-z0-9\s]/g, ' '); // replace special characters with space
21779
+ }
21780
+ function asNormalizedParts(input) {
21781
+ return normalize(input)
21782
+ .split(/\s+/)
21783
+ .map((part) => part.trim())
21784
+ .filter((part) => part.length > 0);
21785
+ }
21786
+ /**
21787
+ * This creates a filter function based on a pattern (typically a user-input
21788
+ * search text).
21789
+ * @param pattern
21790
+ */
21791
+ function createFuzzyFilter(pattern) {
21792
+ const patternParts = asNormalizedParts(pattern);
21793
+ return (input) => {
21794
+ const inputParts = asNormalizedParts(input);
21795
+ return patternParts.every((patternPart) => inputParts.some((part) => part.includes(patternPart)));
21796
+ };
21797
+ }
21798
+
21799
+ function getGeometryFromGeoJSON(data) {
21800
+ if (data.type === 'FeatureCollection') {
21801
+ return data?.features?.[0]?.geometry || null;
21802
+ }
21803
+ if (data.type === 'Feature') {
21804
+ return data?.geometry || null;
21805
+ }
21806
+ if (data.type === 'GeometryCollection') {
21807
+ return data?.geometries?.[0] || null;
21808
+ }
21809
+ if (data.type === 'Polygon' ||
21810
+ data.type === 'Point' ||
21811
+ data.type === 'LineString' ||
21812
+ data.type === 'MultiPolygon' ||
21813
+ data.type === 'MultiPoint' ||
21814
+ data.type === 'MultiLineString') {
21815
+ return data || null;
21816
+ }
21817
+ return null;
21818
+ }
21819
+
21820
+ function downsizeImage(blob, maxWidth, maxHeight) {
21821
+ return new Promise((resolve, reject) => {
21822
+ const image = new Image();
21823
+ image.src = URL.createObjectURL(blob);
21824
+ image.onload = () => {
21825
+ let width = image.width;
21826
+ let height = image.height;
21827
+ if (width > maxWidth || height > maxHeight) {
21828
+ if (width > height) {
21829
+ height = height * (maxWidth / width);
21830
+ width = maxWidth;
21831
+ }
21832
+ else {
21833
+ width = width * (maxHeight / height);
21834
+ height = maxHeight;
21835
+ }
21836
+ }
21837
+ const canvas = document.createElement('canvas');
21838
+ canvas.width = width;
21839
+ canvas.height = height;
21840
+ const context = canvas.getContext('2d');
21841
+ context.drawImage(image, 0, 0, width, height);
21842
+ canvas.toBlob(resolve, blob.type);
21843
+ };
21844
+ image.onerror = reject;
21845
+ });
21846
+ }
21847
+ function downgradeImage(blob, maxSizeBytes) {
21848
+ return new Promise((resolve, reject) => {
21849
+ const image = new Image();
21850
+ image.src = URL.createObjectURL(blob);
21851
+ image.onload = () => {
21852
+ const width = image.width;
21853
+ const height = image.height;
21854
+ let quality = 1.0;
21855
+ const canvas = document.createElement('canvas');
21856
+ canvas.width = width;
21857
+ canvas.height = height;
21858
+ const context = canvas.getContext('2d');
21859
+ context.drawImage(image, 0, 0, width, height);
21860
+ const compressAndResolveBlob = (blobToCompress) => {
21861
+ if (blobToCompress.size <= maxSizeBytes) {
21862
+ resolve(blobToCompress);
21863
+ }
21864
+ else {
21865
+ quality -= 0.1;
21866
+ if (quality >= 0) {
21867
+ canvas.toBlob(compressAndResolveBlob, blob.type, quality);
21868
+ }
21869
+ else {
21870
+ reject('Unable to compress image below max size');
21871
+ }
21872
+ }
21873
+ };
21874
+ canvas.toBlob(compressAndResolveBlob, blob.type, quality);
21875
+ };
21876
+ image.onerror = reject;
21877
+ });
21878
+ }
21879
+
21666
21880
  /*
21667
21881
  * Implement AngularJS $parse
21668
21882
  * delimiter is `^^^^` cause object properties can contain `.`
@@ -21696,38 +21910,10 @@ const parse = (path) => {
21696
21910
  return fn;
21697
21911
  };
21698
21912
 
21699
- const stripHtml = function (html) {
21700
- if (!html)
21701
- return undefined;
21702
- const doc = new DOMParser().parseFromString(html, 'text/html');
21703
- return doc.body.textContent || '';
21704
- };
21705
-
21706
21913
  const removeWhitespace = function (str) {
21707
21914
  return str?.replace(/\s+/g, ' ').trim();
21708
21915
  };
21709
21916
 
21710
- function getGeometryFromGeoJSON(data) {
21711
- if (data.type === 'FeatureCollection') {
21712
- return data?.features?.[0]?.geometry || null;
21713
- }
21714
- if (data.type === 'Feature') {
21715
- return data?.geometry || null;
21716
- }
21717
- if (data.type === 'GeometryCollection') {
21718
- return data?.geometries?.[0] || null;
21719
- }
21720
- if (data.type === 'Polygon' ||
21721
- data.type === 'Point' ||
21722
- data.type === 'LineString' ||
21723
- data.type === 'MultiPolygon' ||
21724
- data.type === 'MultiPoint' ||
21725
- data.type === 'MultiLineString') {
21726
- return data || null;
21727
- }
21728
- return null;
21729
- }
21730
-
21731
21917
  function sortByToStrings(sortBy) {
21732
21918
  const array = Array.isArray(sortBy[0]) ? sortBy : [sortBy];
21733
21919
  return array.map((param) => `${param[0] === 'desc' ? '-' : ''}${param[1]}`);
@@ -21742,62 +21928,12 @@ function sortByFromString(sortByString) {
21742
21928
  ];
21743
21929
  }
21744
21930
 
21745
- /**
21746
- * Removes the given search params from the URL completely; this is case-insensitive
21747
- * @param url
21748
- * @param searchParams
21749
- */
21750
- function removeSearchParams(url, searchParams) {
21751
- const toDelete = [];
21752
- const urlObj = new URL(url, window.location.toString());
21753
- const keysLower = searchParams.map((p) => p.toLowerCase());
21754
- for (const param of urlObj.searchParams.keys()) {
21755
- if (keysLower.indexOf(param.toLowerCase()) > -1) {
21756
- toDelete.push(param);
21757
- }
21758
- }
21759
- toDelete.map((param) => urlObj.searchParams.delete(param));
21760
- return urlObj.toString();
21761
- }
21762
-
21763
- /**
21764
- * This should be called instead of event.stopPropagation()
21765
- * to make sure that the document receives the event
21766
- * @param event
21767
- */
21768
- function propagateToDocumentOnly(event) {
21769
- event.stopPropagation();
21770
- setTimeout(() => {
21771
- window.document.dispatchEvent(event);
21772
- }, 0);
21773
- }
21774
-
21775
- function normalize(input) {
21776
- return input
21777
- .toLowerCase()
21778
- .normalize('NFD') // explode composite chars (e.g. é) into multiple chars
21779
- .replace(/[\u0300-\u036f]/g, '') // remove accents
21780
- .replace(/œ/g, 'oe') // remove accents
21781
- .replace(/[^a-z0-9\s]/g, ' '); // replace special characters with space
21782
- }
21783
- function asNormalizedParts(input) {
21784
- return normalize(input)
21785
- .split(/\s+/)
21786
- .map((part) => part.trim())
21787
- .filter((part) => part.length > 0);
21788
- }
21789
- /**
21790
- * This creates a filter function based on a pattern (typically a user-input
21791
- * search text).
21792
- * @param pattern
21793
- */
21794
- function createFuzzyFilter(pattern) {
21795
- const patternParts = asNormalizedParts(pattern);
21796
- return (input) => {
21797
- const inputParts = asNormalizedParts(input);
21798
- return patternParts.every((patternPart) => inputParts.some((part) => part.includes(patternPart)));
21799
- };
21800
- }
21931
+ const stripHtml = function (html) {
21932
+ if (!html)
21933
+ return undefined;
21934
+ const doc = new DOMParser().parseFromString(html, 'text/html');
21935
+ return doc.body.textContent || '';
21936
+ };
21801
21937
 
21802
21938
  function getTemporalRangeUnion(ranges) {
21803
21939
  let earliestStartDate = Infinity;
@@ -21831,6 +21967,24 @@ function getTemporalRangeUnion(ranges) {
21831
21967
  }
21832
21968
  }
21833
21969
 
21970
+ /**
21971
+ * Removes the given search params from the URL completely; this is case-insensitive
21972
+ * @param url
21973
+ * @param searchParams
21974
+ */
21975
+ function removeSearchParams(url, searchParams) {
21976
+ const toDelete = [];
21977
+ const urlObj = new URL(url, window.location.toString());
21978
+ const keysLower = searchParams.map((p) => p.toLowerCase());
21979
+ for (const param of urlObj.searchParams.keys()) {
21980
+ if (keysLower.indexOf(param.toLowerCase()) > -1) {
21981
+ toDelete.push(param);
21982
+ }
21983
+ }
21984
+ toDelete.map((param) => urlObj.searchParams.delete(param));
21985
+ return urlObj.toString();
21986
+ }
21987
+
21834
21988
  marker('downloads.wfs.featuretype.not.found');
21835
21989
  const FORMATS = {
21836
21990
  csv: {
@@ -23602,6 +23756,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23602
23756
 
23603
23757
  class ButtonComponent {
23604
23758
  constructor() {
23759
+ this.btnClass = 'gn-ui-btn-default';
23605
23760
  this.disabled = false;
23606
23761
  this.extraClass = '';
23607
23762
  this.buttonClick = new EventEmitter();
@@ -24653,192 +24808,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24653
24808
  }]
24654
24809
  }] });
24655
24810
 
24656
- class FormFieldSimpleComponent {
24657
- constructor() {
24658
- this.readonly = false;
24659
- this.invalid = false;
24660
- this.placeholder = '';
24661
- }
24662
- get inputType() {
24663
- switch (this.type) {
24664
- case 'url':
24665
- case 'text':
24666
- return 'text';
24667
- case 'date':
24668
- return 'datetime-local';
24669
- case 'number':
24670
- return 'number';
24671
- case 'toggle':
24672
- return 'checkbox';
24673
- default:
24674
- return '';
24675
- }
24676
- }
24677
- get isSelect() {
24678
- return this.type === 'list';
24679
- }
24680
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldSimpleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24681
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: { type: "type", control: "control", readonly: "readonly", invalid: "invalid", placeholder: "placeholder", options: "options" }, ngImport: i0, template: "<input\n *ngIf=\"!isSelect\"\n [type]=\"inputType\"\n [readonly]=\"readonly\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n class=\"border rounded-md p-3 w-full bg-white transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n/>\n<select\n *ngIf=\"isSelect\"\n [formControl]=\"control\"\n class=\"border rounded-md p-3 w-full bg-white transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n>\n <option *ngFor=\"let option of options\" [ngValue]=\"option.value\">\n {{ option.label }}\n </option>\n</select>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24682
- }
24683
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldSimpleComponent, decorators: [{
24684
- type: Component,
24685
- args: [{ selector: 'gn-ui-form-field-simple', changeDetection: ChangeDetectionStrategy.OnPush, template: "<input\n *ngIf=\"!isSelect\"\n [type]=\"inputType\"\n [readonly]=\"readonly\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n class=\"border rounded-md p-3 w-full bg-white transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n/>\n<select\n *ngIf=\"isSelect\"\n [formControl]=\"control\"\n class=\"border rounded-md p-3 w-full bg-white transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n>\n <option *ngFor=\"let option of options\" [ngValue]=\"option.value\">\n {{ option.label }}\n </option>\n</select>\n" }]
24686
- }], propDecorators: { type: [{
24687
- type: Input
24688
- }], control: [{
24689
- type: Input
24690
- }], readonly: [{
24691
- type: Input
24692
- }], invalid: [{
24693
- type: Input
24694
- }], placeholder: [{
24695
- type: Input
24696
- }], options: [{
24697
- type: Input
24698
- }] } });
24699
-
24700
- class FormFieldFileComponent {
24701
- constructor() {
24702
- this.readonly = false;
24703
- this.invalid = false;
24704
- this.placeholder = '';
24705
- }
24706
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldFileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24707
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldFileComponent, selector: "gn-ui-form-field-file", inputs: { control: "control", readonly: "readonly", invalid: "invalid", placeholder: "placeholder" }, ngImport: i0, template: "<input\n type=\"file\"\n [readonly]=\"readonly\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n class=\"border rounded-md p-3 w-full bg-white transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n/>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24708
- }
24709
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldFileComponent, decorators: [{
24710
- type: Component,
24711
- args: [{ selector: 'gn-ui-form-field-file', changeDetection: ChangeDetectionStrategy.OnPush, template: "<input\n type=\"file\"\n [readonly]=\"readonly\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n class=\"border rounded-md p-3 w-full bg-white transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n/>\n" }]
24712
- }], propDecorators: { control: [{
24713
- type: Input
24714
- }], readonly: [{
24715
- type: Input
24716
- }], invalid: [{
24717
- type: Input
24718
- }], placeholder: [{
24719
- type: Input
24720
- }] } });
24721
-
24722
- class FormFieldRichComponent {
24723
- constructor() {
24724
- this.readonly = false;
24725
- this.invalid = false;
24726
- this.placeholder = '';
24727
- }
24728
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldRichComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24729
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: { control: "control", readonly: "readonly", invalid: "invalid", placeholder: "placeholder" }, ngImport: i0, template: "<textarea\n [readonly]=\"readonly\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n class=\"border rounded-md p-3 w-full bg-white h-full resize-none transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n></textarea>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24730
- }
24731
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldRichComponent, decorators: [{
24732
- type: Component,
24733
- args: [{ selector: 'gn-ui-form-field-rich', changeDetection: ChangeDetectionStrategy.OnPush, template: "<textarea\n [readonly]=\"readonly\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n class=\"border rounded-md p-3 w-full bg-white h-full resize-none transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n></textarea>\n" }]
24734
- }], propDecorators: { control: [{
24735
- type: Input
24736
- }], readonly: [{
24737
- type: Input
24738
- }], invalid: [{
24739
- type: Input
24740
- }], placeholder: [{
24741
- type: Input
24742
- }] } });
24743
-
24744
- class FormFieldObjectComponent {
24745
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldObjectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24746
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldObjectComponent, selector: "gn-ui-form-field-object", ngImport: i0, template: "<p>form-field-object works!</p>\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24747
- }
24748
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldObjectComponent, decorators: [{
24749
- type: Component,
24750
- args: [{ selector: 'gn-ui-form-field-object', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p>form-field-object works!</p>\n" }]
24751
- }] });
24752
-
24753
- class FormFieldArrayComponent {
24754
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldArrayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24755
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldArrayComponent, selector: "gn-ui-form-field-array", ngImport: i0, template: "<p>form-field-array works!</p>\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24756
- }
24757
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldArrayComponent, decorators: [{
24758
- type: Component,
24759
- args: [{ selector: 'gn-ui-form-field-array', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p>form-field-array works!</p>\n" }]
24760
- }] });
24761
-
24762
- class FormFieldSpatialExtentComponent {
24763
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldSpatialExtentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24764
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent", ngImport: i0, template: "<p>form-field-spatial-extent works!</p>\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24765
- }
24766
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldSpatialExtentComponent, decorators: [{
24767
- type: Component,
24768
- args: [{ selector: 'gn-ui-form-field-spatial-extent', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p>form-field-spatial-extent works!</p>\n" }]
24769
- }] });
24770
-
24771
- class FormFieldTemporalExtentComponent {
24772
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldTemporalExtentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24773
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldTemporalExtentComponent, selector: "gn-ui-form-field-temporal-extent", ngImport: i0, template: "<p>form-field-temporal-extent works!</p>\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24774
- }
24775
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldTemporalExtentComponent, decorators: [{
24776
- type: Component,
24777
- args: [{ selector: 'gn-ui-form-field-temporal-extent', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p>form-field-temporal-extent works!</p>\n" }]
24778
- }] });
24779
-
24780
- class FormFieldComponent {
24781
- set value(v) {
24782
- this.formControl.setValue(v, {
24783
- emitEvent: false,
24784
- });
24785
- }
24786
- constructor() {
24787
- this.formControl = new FormControl();
24788
- this.valueChange = this.formControl.valueChanges;
24789
- }
24790
- get simpleType() {
24791
- return this.config.type;
24792
- }
24793
- get isSimpleField() {
24794
- return (this.config.type === 'text' ||
24795
- this.config.type === 'number' ||
24796
- this.config.type === 'date' ||
24797
- this.config.type === 'list' ||
24798
- this.config.type === 'url' ||
24799
- this.config.type === 'toggle');
24800
- }
24801
- get isRichField() {
24802
- return this.config.type === 'rich';
24803
- }
24804
- get isFileField() {
24805
- return this.config.type === 'file';
24806
- }
24807
- get isSpatialExtentField() {
24808
- return this.config.type === 'spatial_extent';
24809
- }
24810
- get isTemporalExtentField() {
24811
- return this.config.type === 'temporal_extent';
24812
- }
24813
- get isArrayField() {
24814
- return this.config.type === 'array';
24815
- }
24816
- get isObjectField() {
24817
- return this.config.type === 'object';
24818
- }
24819
- get isFieldOk() {
24820
- return !this.config.locked && !this.config.invalid;
24821
- }
24822
- get isFieldLocked() {
24823
- return this.config.locked;
24824
- }
24825
- get isFieldInvalid() {
24826
- return !this.config.locked && this.config.invalid;
24827
- }
24828
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24829
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: { config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div class=\"flex flex-col h-full\">\n <div class=\"mb-2 flex flex-row\">\n <label class=\"grow\">\n <span class=\"font-medium field-label\">{{\n config.labelKey | translate\n }}</span>\n <span *ngIf=\"config.hintKey\" class=\"text-gray-900 text-sm\">\n - {{ config.hintKey | translate }}\n </span>\n </label>\n <mat-icon\n *ngIf=\"isFieldOk\"\n class=\"material-symbols-outlined text-[#c6d950] icon-ok\"\n >check_circle</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldLocked\"\n class=\"material-symbols-outlined text-blue-400 icon-locked\"\n >lock</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldInvalid\"\n class=\"material-symbols-outlined text-pink-500 icon-invalid\"\n >cancel</mat-icon\n >\n </div>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n [type]=\"simpleType\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isFileField\">\n <gn-ui-form-field-file\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-file>\n </ng-container>\n <ng-container *ngIf=\"isRichField\">\n <gn-ui-form-field-rich\n class=\"grow\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isArrayField\">\n <gn-ui-form-field-array></gn-ui-form-field-array>\n </ng-container>\n <ng-container *ngIf=\"isObjectField\">\n <gn-ui-form-field-object></gn-ui-form-field-object>\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=\"isTemporalExtentField\">\n <gn-ui-form-field-temporal-extent></gn-ui-form-field-temporal-extent>\n </ng-container>\n <div\n *ngIf=\"isFieldInvalid && config.invalidHintKey\"\n class=\"mt-2 text-pink-500 text-sm field-invalid-hint\"\n >\n {{ config.invalidHintKey | translate }}\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "control", "readonly", "invalid", "placeholder", "options"] }, { kind: "component", type: FormFieldArrayComponent, selector: "gn-ui-form-field-array" }, { kind: "component", type: FormFieldObjectComponent, selector: "gn-ui-form-field-object" }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["control", "readonly", "invalid", "placeholder"] }, { kind: "component", type: FormFieldFileComponent, selector: "gn-ui-form-field-file", inputs: ["control", "readonly", "invalid", "placeholder"] }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldTemporalExtentComponent, selector: "gn-ui-form-field-temporal-extent" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24830
- }
24831
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, decorators: [{
24832
- type: Component,
24833
- args: [{ selector: 'gn-ui-form-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col h-full\">\n <div class=\"mb-2 flex flex-row\">\n <label class=\"grow\">\n <span class=\"font-medium field-label\">{{\n config.labelKey | translate\n }}</span>\n <span *ngIf=\"config.hintKey\" class=\"text-gray-900 text-sm\">\n - {{ config.hintKey | translate }}\n </span>\n </label>\n <mat-icon\n *ngIf=\"isFieldOk\"\n class=\"material-symbols-outlined text-[#c6d950] icon-ok\"\n >check_circle</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldLocked\"\n class=\"material-symbols-outlined text-blue-400 icon-locked\"\n >lock</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldInvalid\"\n class=\"material-symbols-outlined text-pink-500 icon-invalid\"\n >cancel</mat-icon\n >\n </div>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n [type]=\"simpleType\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isFileField\">\n <gn-ui-form-field-file\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-file>\n </ng-container>\n <ng-container *ngIf=\"isRichField\">\n <gn-ui-form-field-rich\n class=\"grow\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isArrayField\">\n <gn-ui-form-field-array></gn-ui-form-field-array>\n </ng-container>\n <ng-container *ngIf=\"isObjectField\">\n <gn-ui-form-field-object></gn-ui-form-field-object>\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=\"isTemporalExtentField\">\n <gn-ui-form-field-temporal-extent></gn-ui-form-field-temporal-extent>\n </ng-container>\n <div\n *ngIf=\"isFieldInvalid && config.invalidHintKey\"\n class=\"mt-2 text-pink-500 text-sm field-invalid-hint\"\n >\n {{ config.invalidHintKey | translate }}\n </div>\n</div>\n" }]
24834
- }], ctorParameters: function () { return []; }, propDecorators: { config: [{
24835
- type: Input
24836
- }], value: [{
24837
- type: Input
24838
- }], valueChange: [{
24839
- type: Output
24840
- }] } });
24841
-
24842
24811
  class CopyTextButtonComponent {
24843
24812
  constructor() {
24844
24813
  this.displayText = true;
@@ -24983,6 +24952,229 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24983
24952
  type: Input
24984
24953
  }] } });
24985
24954
 
24955
+ class FilesDropDirective {
24956
+ constructor() {
24957
+ this.dragFilesOver = new EventEmitter();
24958
+ this.dropFiles = new EventEmitter();
24959
+ this.dragEnterCounter = 0;
24960
+ }
24961
+ _onDragEnter(event) {
24962
+ event.preventDefault();
24963
+ this.dragEnterCounter++;
24964
+ this.dragFilesOver.emit(true);
24965
+ }
24966
+ _onDragOver(event) {
24967
+ event.preventDefault();
24968
+ }
24969
+ _onDragLeave(event) {
24970
+ event.preventDefault();
24971
+ this.dragEnterCounter = Math.max(0, this.dragEnterCounter - 1);
24972
+ if (this.dragEnterCounter === 0) {
24973
+ this.dragFilesOver.emit(false);
24974
+ }
24975
+ }
24976
+ _onDrop(event) {
24977
+ event.preventDefault();
24978
+ this.dragEnterCounter = 0;
24979
+ this.dragFilesOver.emit(false);
24980
+ const files = Array.from(event.dataTransfer.files);
24981
+ if (files.length > 0) {
24982
+ this.dropFiles.emit(files);
24983
+ }
24984
+ }
24985
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FilesDropDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
24986
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: FilesDropDirective, isStandalone: true, selector: "[gnUiFilesDrop]", outputs: { dragFilesOver: "dragFilesOver", dropFiles: "dropFiles" }, host: { listeners: { "dragenter": "_onDragEnter($event)", "dragover": "_onDragOver($event)", "dragleave": "_onDragLeave($event)", "drop": "_onDrop($event)" } }, ngImport: i0 }); }
24987
+ }
24988
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FilesDropDirective, decorators: [{
24989
+ type: Directive,
24990
+ args: [{
24991
+ selector: '[gnUiFilesDrop]',
24992
+ standalone: true,
24993
+ }]
24994
+ }], propDecorators: { dragFilesOver: [{
24995
+ type: Output
24996
+ }], dropFiles: [{
24997
+ type: Output
24998
+ }], _onDragEnter: [{
24999
+ type: HostListener,
25000
+ args: ['dragenter', ['$event']]
25001
+ }], _onDragOver: [{
25002
+ type: HostListener,
25003
+ args: ['dragover', ['$event']]
25004
+ }], _onDragLeave: [{
25005
+ type: HostListener,
25006
+ args: ['dragleave', ['$event']]
25007
+ }], _onDrop: [{
25008
+ type: HostListener,
25009
+ args: ['drop', ['$event']]
25010
+ }] } });
25011
+
25012
+ class ImageInputComponent {
25013
+ constructor(http, cd) {
25014
+ this.http = http;
25015
+ this.cd = cd;
25016
+ this.fileChange = new EventEmitter();
25017
+ this.urlChange = new EventEmitter();
25018
+ this.uploadCancel = new EventEmitter();
25019
+ this.delete = new EventEmitter();
25020
+ this.altTextChange = new EventEmitter();
25021
+ this.dragFilesOver = false;
25022
+ this.showUrlInput = false;
25023
+ this.downloadError = false;
25024
+ this.showAltTextInput = false;
25025
+ }
25026
+ getPrimaryText() {
25027
+ if (this.uploadError) {
25028
+ return marker('input.image.uploadErrorLabel');
25029
+ }
25030
+ if (this.uploadProgress) {
25031
+ return marker('input.image.uploadProgressLabel');
25032
+ }
25033
+ return marker('input.image.selectFileLabel');
25034
+ }
25035
+ getSecondaryText() {
25036
+ if (this.uploadError) {
25037
+ return marker('input.image.uploadErrorRetry');
25038
+ }
25039
+ if (this.uploadProgress) {
25040
+ return marker('input.image.uploadProgressCancel');
25041
+ }
25042
+ return marker('input.image.dropFileLabel');
25043
+ }
25044
+ handleDragFilesOver(dragFilesOver) {
25045
+ if (!this.showUrlInput) {
25046
+ this.dragFilesOver = dragFilesOver;
25047
+ this.cd.markForCheck();
25048
+ }
25049
+ }
25050
+ handleDropFiles(files) {
25051
+ if (!this.showUrlInput) {
25052
+ const validFiles = this.filterTypeImage(files);
25053
+ if (validFiles.length > 0) {
25054
+ this.resizeAndEmit(validFiles[0]);
25055
+ }
25056
+ }
25057
+ }
25058
+ handleFileInput(event) {
25059
+ const inputFiles = Array.from(event.target.files);
25060
+ const validFiles = this.filterTypeImage(inputFiles);
25061
+ if (validFiles.length > 0) {
25062
+ this.resizeAndEmit(validFiles[0]);
25063
+ }
25064
+ }
25065
+ displayUrlInput() {
25066
+ this.uploadCancel.emit();
25067
+ this.showUrlInput = true;
25068
+ }
25069
+ handleUrlChange(event) {
25070
+ this.downloadError = false;
25071
+ this.urlInputValue = event.target.value;
25072
+ }
25073
+ async downloadUrl() {
25074
+ const name = this.urlInputValue.split('/').pop();
25075
+ try {
25076
+ const response = await firstValueFrom(this.http.head(this.urlInputValue, { observe: 'response' }));
25077
+ if (response.headers.get('content-type')?.startsWith('image/') &&
25078
+ parseInt(response.headers.get('content-length')) <
25079
+ megabytesToBytes(this.maxSizeMB)) {
25080
+ this.http.get(this.urlInputValue, { responseType: 'blob' }).subscribe({
25081
+ next: (blob) => {
25082
+ this.cd.markForCheck();
25083
+ const file = new File([blob], name);
25084
+ this.fileChange.emit(file);
25085
+ },
25086
+ error: () => {
25087
+ this.downloadError = true;
25088
+ this.cd.markForCheck();
25089
+ this.urlChange.emit(this.urlInputValue);
25090
+ },
25091
+ });
25092
+ }
25093
+ }
25094
+ catch {
25095
+ this.downloadError = true;
25096
+ this.cd.markForCheck();
25097
+ return;
25098
+ }
25099
+ }
25100
+ handleSecondaryTextClick() {
25101
+ if (this.uploadError) {
25102
+ this.handleRetry();
25103
+ }
25104
+ else if (this.uploadProgress) {
25105
+ this.handleCancel();
25106
+ }
25107
+ }
25108
+ handleCancel() {
25109
+ this.uploadCancel.emit();
25110
+ }
25111
+ handleRetry() {
25112
+ switch (this.lastUploadType) {
25113
+ case 'file':
25114
+ this.fileChange.emit(this.lastUploadContent);
25115
+ break;
25116
+ case 'url':
25117
+ this.urlChange.emit(this.lastUploadContent);
25118
+ break;
25119
+ }
25120
+ }
25121
+ handleDelete() {
25122
+ this.delete.emit();
25123
+ }
25124
+ toggleAltTextInput() {
25125
+ this.showAltTextInput = !this.showAltTextInput;
25126
+ }
25127
+ handleAltTextChange(event) {
25128
+ const input = event.target;
25129
+ this.altTextChange.emit(input.value);
25130
+ }
25131
+ filterTypeImage(files) {
25132
+ return files.filter((file) => {
25133
+ return file.type.startsWith('image/');
25134
+ });
25135
+ }
25136
+ resizeAndEmit(imageToResize) {
25137
+ const maxSizeBytes = megabytesToBytes(this.maxSizeMB);
25138
+ downgradeImage(imageToResize, maxSizeBytes).then((resizedImage) => {
25139
+ const fileToEmit = new File([resizedImage], imageToResize.name);
25140
+ this.fileChange.emit(fileToEmit);
25141
+ });
25142
+ }
25143
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageInputComponent, deps: [{ token: i1.HttpClient }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
25144
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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$5.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 }); }
25145
+ }
25146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageInputComponent, decorators: [{
25147
+ type: Component,
25148
+ args: [{ selector: 'gn-ui-image-input', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
25149
+ CommonModule,
25150
+ ButtonComponent,
25151
+ MatIconModule,
25152
+ FilesDropDirective,
25153
+ MatProgressSpinnerModule,
25154
+ TranslateModule,
25155
+ ], 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" }]
25156
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { maxSizeMB: [{
25157
+ type: Input
25158
+ }], previewUrl: [{
25159
+ type: Input
25160
+ }], altText: [{
25161
+ type: Input
25162
+ }], uploadProgress: [{
25163
+ type: Input
25164
+ }], uploadError: [{
25165
+ type: Input
25166
+ }], fileChange: [{
25167
+ type: Output
25168
+ }], urlChange: [{
25169
+ type: Output
25170
+ }], uploadCancel: [{
25171
+ type: Output
25172
+ }], delete: [{
25173
+ type: Output
25174
+ }], altTextChange: [{
25175
+ type: Output
25176
+ }] } });
25177
+
24986
25178
  class UiInputsModule {
24987
25179
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
24988
25180
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
@@ -24994,14 +25186,6 @@ class UiInputsModule {
24994
25186
  StarToggleComponent,
24995
25187
  DropdownMultiselectComponent,
24996
25188
  ViewportIntersectorComponent,
24997
- FormFieldComponent,
24998
- FormFieldSimpleComponent,
24999
- FormFieldArrayComponent,
25000
- FormFieldObjectComponent,
25001
- FormFieldRichComponent,
25002
- FormFieldFileComponent,
25003
- FormFieldSpatialExtentComponent,
25004
- FormFieldTemporalExtentComponent,
25005
25189
  CheckToggleComponent,
25006
25190
  CopyTextButtonComponent,
25007
25191
  CheckboxComponent,
@@ -25023,7 +25207,8 @@ class UiInputsModule {
25023
25207
  MatNativeDateModule,
25024
25208
  EditableLabelDirective,
25025
25209
  TextAreaComponent,
25026
- ButtonComponent], exports: [DropdownSelectorComponent,
25210
+ ButtonComponent,
25211
+ ImageInputComponent], exports: [DropdownSelectorComponent,
25027
25212
  AutocompleteComponent,
25028
25213
  ButtonComponent,
25029
25214
  TextInputComponent,
@@ -25034,13 +25219,13 @@ class UiInputsModule {
25034
25219
  StarToggleComponent,
25035
25220
  DropdownMultiselectComponent,
25036
25221
  ViewportIntersectorComponent,
25037
- FormFieldComponent,
25038
25222
  CheckToggleComponent,
25039
25223
  CopyTextButtonComponent,
25040
25224
  CheckboxComponent,
25041
25225
  SearchInputComponent,
25042
25226
  DateRangePickerComponent,
25043
- EditableLabelDirective] }); }
25227
+ EditableLabelDirective,
25228
+ ImageInputComponent] }); }
25044
25229
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, imports: [CommonModule,
25045
25230
  TranslateModule.forChild(),
25046
25231
  NgxDropzoneModule,
@@ -25057,7 +25242,8 @@ class UiInputsModule {
25057
25242
  MatFormFieldModule,
25058
25243
  MatInputModule,
25059
25244
  MatDatepickerModule,
25060
- MatNativeDateModule] }); }
25245
+ MatNativeDateModule,
25246
+ ImageInputComponent] }); }
25061
25247
  }
25062
25248
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, decorators: [{
25063
25249
  type: NgModule,
@@ -25072,14 +25258,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25072
25258
  StarToggleComponent,
25073
25259
  DropdownMultiselectComponent,
25074
25260
  ViewportIntersectorComponent,
25075
- FormFieldComponent,
25076
- FormFieldSimpleComponent,
25077
- FormFieldArrayComponent,
25078
- FormFieldObjectComponent,
25079
- FormFieldRichComponent,
25080
- FormFieldFileComponent,
25081
- FormFieldSpatialExtentComponent,
25082
- FormFieldTemporalExtentComponent,
25083
25261
  CheckToggleComponent,
25084
25262
  CopyTextButtonComponent,
25085
25263
  CheckboxComponent,
@@ -25107,6 +25285,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25107
25285
  EditableLabelDirective,
25108
25286
  TextAreaComponent,
25109
25287
  ButtonComponent,
25288
+ ImageInputComponent,
25110
25289
  ],
25111
25290
  exports: [
25112
25291
  DropdownSelectorComponent,
@@ -25120,13 +25299,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25120
25299
  StarToggleComponent,
25121
25300
  DropdownMultiselectComponent,
25122
25301
  ViewportIntersectorComponent,
25123
- FormFieldComponent,
25124
25302
  CheckToggleComponent,
25125
25303
  CopyTextButtonComponent,
25126
25304
  CheckboxComponent,
25127
25305
  SearchInputComponent,
25128
25306
  DateRangePickerComponent,
25129
25307
  EditableLabelDirective,
25308
+ ImageInputComponent,
25130
25309
  ],
25131
25310
  }]
25132
25311
  }] });
@@ -25620,11 +25799,11 @@ class ThumbnailComponent {
25620
25799
  }
25621
25800
  }
25622
25801
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, deps: [{ token: THUMBNAIL_PLACEHOLDER, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
25623
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: { thumbnailUrl: "thumbnailUrl", fit: "fit" }, outputs: { placeholderShown: "placeholderShown" }, viewQueries: [{ propertyName: "imgElement", first: true, predicate: ["imageElement"], descendants: true }, { propertyName: "containerElement", first: true, predicate: ["containerElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25802
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ThumbnailComponent, isStandalone: true, selector: "gn-ui-thumbnail", inputs: { thumbnailUrl: "thumbnailUrl", fit: "fit" }, outputs: { placeholderShown: "placeholderShown" }, viewQueries: [{ propertyName: "imgElement", first: true, predicate: ["imageElement"], descendants: true }, { propertyName: "containerElement", first: true, predicate: ["containerElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25624
25803
  }
25625
25804
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, decorators: [{
25626
25805
  type: Component,
25627
- args: [{ selector: 'gn-ui-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n" }]
25806
+ args: [{ selector: 'gn-ui-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n" }]
25628
25807
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
25629
25808
  type: Optional
25630
25809
  }, {
@@ -25919,44 +26098,52 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25919
26098
  type: Output
25920
26099
  }] } });
25921
26100
 
25922
- class ExpandablePanelComponent {
26101
+ class ApiCardComponent {
25923
26102
  constructor() {
25924
- this.collapsed = true;
25925
- this.maxHeight = this.setMaxHeight();
26103
+ this.currentlyActive = false;
26104
+ this.openRecordApiForm = new EventEmitter();
25926
26105
  }
25927
- toggle() {
25928
- this.collapsed = !this.collapsed;
25929
- this.maxHeight = this.setMaxHeight();
26106
+ ngOnInit() {
26107
+ this.displayApiFormButton =
26108
+ this.link.accessServiceProtocol === 'ogcFeatures' ? true : false;
25930
26109
  }
25931
- setMaxHeight() {
25932
- return `${this.collapsed ? '0' : this.contentDiv.nativeElement.scrollHeight}px`;
26110
+ ngOnChanges(changes) {
26111
+ this.currentlyActive =
26112
+ changes.currentLink.currentValue === this.link ? true : false;
25933
26113
  }
25934
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ExpandablePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25935
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: { title: "title", collapsed: "collapsed" }, viewQueries: [{ propertyName: "contentDiv", first: true, predicate: ["contentDiv"], descendants: true }], ngImport: i0, template: "<div\n class=\"group flex align-middle title border-b border-gray-100 cursor-pointer pt-2.5\"\n (click)=\"toggle()\"\n>\n <div class=\"grow font-medium text-black text-sm\">\n {{ title }}\n </div>\n <div\n class=\"w-8 opacity-25 text-primary group-hover:opacity-100 transition-opacity\"\n >\n <mat-icon class=\"material-symbols-outlined\" *ngIf=\"collapsed\">add</mat-icon>\n <mat-icon class=\"material-symbols-outlined\" *ngIf=\"!collapsed\"\n >remove</mat-icon\n >\n </div>\n</div>\n<div\n class=\"content overflow-hidden transition-[max-height] duration-300\"\n [ngClass]=\"collapsed ? 'ease-out' : 'ease-in'\"\n [style.maxHeight]=\"maxHeight\"\n #contentDiv\n>\n <ng-content></ng-content>\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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26114
+ openRecordApiFormPanel() {
26115
+ if (this.displayApiFormButton) {
26116
+ this.currentlyActive = !this.currentlyActive;
26117
+ this.openRecordApiForm.emit(this.currentlyActive ? this.link : undefined);
26118
+ }
26119
+ }
26120
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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: 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 }); }
25936
26122
  }
25937
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ExpandablePanelComponent, decorators: [{
26123
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ApiCardComponent, decorators: [{
25938
26124
  type: Component,
25939
- args: [{ selector: 'gn-ui-expandable-panel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"group flex align-middle title border-b border-gray-100 cursor-pointer pt-2.5\"\n (click)=\"toggle()\"\n>\n <div class=\"grow font-medium text-black text-sm\">\n {{ title }}\n </div>\n <div\n class=\"w-8 opacity-25 text-primary group-hover:opacity-100 transition-opacity\"\n >\n <mat-icon class=\"material-symbols-outlined\" *ngIf=\"collapsed\">add</mat-icon>\n <mat-icon class=\"material-symbols-outlined\" *ngIf=\"!collapsed\"\n >remove</mat-icon\n >\n </div>\n</div>\n<div\n class=\"content overflow-hidden transition-[max-height] duration-300\"\n [ngClass]=\"collapsed ? 'ease-out' : 'ease-in'\"\n [style.maxHeight]=\"maxHeight\"\n #contentDiv\n>\n <ng-content></ng-content>\n</div>\n" }]
25940
- }], propDecorators: { title: [{
26125
+ 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" }]
26126
+ }], propDecorators: { link: [{
25941
26127
  type: Input
25942
- }], collapsed: [{
26128
+ }], currentLink: [{
25943
26129
  type: Input
25944
- }], contentDiv: [{
25945
- type: ViewChild,
25946
- args: ['contentDiv']
26130
+ }], openRecordApiForm: [{
26131
+ type: Output
25947
26132
  }] } });
25948
26133
 
25949
- class MarkdownParserComponent {
25950
- get parsedMarkdown() {
25951
- return marked.parse(this.textContent);
26134
+ class AvatarComponent {
26135
+ hideImage() {
26136
+ this.avatarUrl = this.avatarPlaceholder;
25952
26137
  }
25953
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25954
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, isStandalone: true, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26138
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26139
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AvatarComponent, selector: "gn-ui-avatar", inputs: { avatarUrl: "avatarUrl", avatarPlaceholder: "avatarPlaceholder" }, ngImport: i0, template: "<img\n *ngIf=\"avatarUrl\"\n class=\"rounded-full object-cover\"\n [src]=\"avatarUrl\"\n (error)=\"hideImage()\"\n/>\n<div\n *ngIf=\"!avatarUrl\"\n class=\"w-full h-full rounded-full bg-gradient-to-tr from-primary to-slate-200\"\n></div>\n", dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25955
26140
  }
25956
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
26141
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AvatarComponent, decorators: [{
25957
26142
  type: Component,
25958
- args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
25959
- }], propDecorators: { textContent: [{
26143
+ args: [{ selector: 'gn-ui-avatar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<img\n *ngIf=\"avatarUrl\"\n class=\"rounded-full object-cover\"\n [src]=\"avatarUrl\"\n (error)=\"hideImage()\"\n/>\n<div\n *ngIf=\"!avatarUrl\"\n class=\"w-full h-full rounded-full bg-gradient-to-tr from-primary to-slate-200\"\n></div>\n" }]
26144
+ }], propDecorators: { avatarUrl: [{
26145
+ type: Input
26146
+ }], avatarPlaceholder: [{
25960
26147
  type: Input
25961
26148
  }] } });
25962
26149
 
@@ -25976,80 +26163,183 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25976
26163
  type: Input
25977
26164
  }] } });
25978
26165
 
25979
- /* eslint-disable @angular-eslint/directive-selector */
25980
- class GnUiLinkifyDirective {
25981
- constructor(el, renderer) {
25982
- this.el = el;
25983
- this.renderer = renderer;
26166
+ class DownloadItemComponent {
26167
+ constructor() {
26168
+ this.exportUrl = new EventEmitter();
25984
26169
  }
25985
- ngOnInit() {
25986
- setTimeout(() => {
25987
- this.processLinks(this.el.nativeElement);
25988
- }, 0);
26170
+ openUrl() {
26171
+ this.exportUrl.emit(this.link.url.toString());
25989
26172
  }
25990
- processLinks(container) {
25991
- const nodes = Array.from(container.childNodes);
25992
- nodes.forEach((node) => {
25993
- if (node instanceof Text) {
25994
- const textNode = node;
25995
- const linkified = this.linkifyNode(textNode.nodeValue);
25996
- if (linkified) {
25997
- this.createLinkElements(container, linkified, node);
25998
- }
25999
- }
26000
- else if (node instanceof HTMLAnchorElement) {
26001
- const url = node.href;
26002
- const displayValue = node.innerHTML;
26003
- const linkified = this.linkifyNode(displayValue, url);
26004
- if (linkified) {
26005
- this.createLinkElements(container, linkified, node);
26006
- }
26007
- }
26008
- else {
26009
- this.processLinks(node);
26010
- }
26011
- });
26173
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26174
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DownloadItemComponent, selector: "gn-ui-download-item", inputs: { link: "link", color: "color", format: "format", isFromWfs: "isFromWfs" }, outputs: { exportUrl: "exportUrl" }, ngImport: i0, template: "<a\n href=\"{{ link.url }}\"\n target=\"_blank\"\n class=\"group flex justify-between card-shadow px-6 py-5 cursor-pointer\"\n rel=\"noopener\"\n>\n <div class=\"grow-1 w-full overflow-hidden\">\n <div\n class=\"text-21 text-black truncate font-title w-11/12\"\n [title]=\"link.description || link.name\"\n >\n {{ link.description || link.name }}\n </div>\n <div class=\"pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"color\"\n data-cy=\"download-format\"\n >{{ format || ('downloads.format.unknown' | translate) }}</span\n >\n <span\n class=\"pl-2 inline-flex items-center text-gray-800 text-sm\"\n *ngIf=\"isFromWfs\"\n translate=\"\"\n >datahub.search.filter.generatedByWfs</span\n >\n </div>\n </div>\n <div class=\"shrink-1 w-14 flex flex-col justify-center items-center\">\n <mat-icon class=\"!w-8 !h-8 card-icon text-3xl material-symbols-outlined\">\n cloud_download\n </mat-icon>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26175
+ }
26176
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadItemComponent, decorators: [{
26177
+ type: Component,
26178
+ args: [{ selector: 'gn-ui-download-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<a\n href=\"{{ link.url }}\"\n target=\"_blank\"\n class=\"group flex justify-between card-shadow px-6 py-5 cursor-pointer\"\n rel=\"noopener\"\n>\n <div class=\"grow-1 w-full overflow-hidden\">\n <div\n class=\"text-21 text-black truncate font-title w-11/12\"\n [title]=\"link.description || link.name\"\n >\n {{ link.description || link.name }}\n </div>\n <div class=\"pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"color\"\n data-cy=\"download-format\"\n >{{ format || ('downloads.format.unknown' | translate) }}</span\n >\n <span\n class=\"pl-2 inline-flex items-center text-gray-800 text-sm\"\n *ngIf=\"isFromWfs\"\n translate=\"\"\n >datahub.search.filter.generatedByWfs</span\n >\n </div>\n </div>\n <div class=\"shrink-1 w-14 flex flex-col justify-center items-center\">\n <mat-icon class=\"!w-8 !h-8 card-icon text-3xl material-symbols-outlined\">\n cloud_download\n </mat-icon>\n </div>\n</a>\n" }]
26179
+ }], propDecorators: { link: [{
26180
+ type: Input
26181
+ }], color: [{
26182
+ type: Input
26183
+ }], format: [{
26184
+ type: Input
26185
+ }], isFromWfs: [{
26186
+ type: Input
26187
+ }], exportUrl: [{
26188
+ type: Output
26189
+ }] } });
26190
+
26191
+ marker('datahub.search.filter.all');
26192
+ marker('datahub.search.filter.others');
26193
+ const FILTER_FORMATS = ['all', 'csv', 'excel', 'json', 'shp', 'others'];
26194
+ class DownloadsListComponent {
26195
+ constructor(translateService) {
26196
+ this.translateService = translateService;
26197
+ this.activeFilterFormats = ['all'];
26012
26198
  }
26013
- linkifyNode(displayValue, url) {
26014
- if (url) {
26015
- displayValue = this.createLink(displayValue, url);
26199
+ get filteredLinks() {
26200
+ return this.links.filter((link) => this.activeFilterFormats.some((format) => this.isLinkOfFormat(link, format)));
26201
+ }
26202
+ get visibleFormats() {
26203
+ return FILTER_FORMATS.filter((format) => this.links.some((link) => this.isLinkOfFormat(link, format)));
26204
+ }
26205
+ toggleFilterFormat(format) {
26206
+ if (format === 'all') {
26207
+ this.activeFilterFormats = ['all'];
26208
+ return;
26209
+ }
26210
+ if (this.isFilterActive(format)) {
26211
+ this.activeFilterFormats = this.activeFilterFormats.filter((f) => format !== f);
26016
26212
  }
26017
26213
  else {
26018
- const urlRegex = /\bhttps?:\/\/(?:\([^\s()]+\)|[^\s()]+)+/g;
26019
- const matches = displayValue.match(urlRegex);
26020
- if (matches && matches.length > 0) {
26021
- matches.forEach((match) => {
26022
- url = match;
26023
- displayValue = displayValue.replace(match, (match) => {
26024
- return this.createLink(match, url);
26025
- });
26026
- });
26027
- }
26214
+ this.activeFilterFormats = [
26215
+ ...this.activeFilterFormats.filter((f) => f !== 'all'),
26216
+ format,
26217
+ ];
26218
+ }
26219
+ if (this.activeFilterFormats.length === 0) {
26220
+ this.activeFilterFormats = ['all'];
26028
26221
  }
26029
- return displayValue;
26030
26222
  }
26031
- createLinkElements(container, htmlContent, node) {
26032
- const div = this.renderer.createElement('div');
26033
- div.innerHTML = htmlContent;
26034
- const fragment = document.createDocumentFragment();
26035
- Array.from(div.childNodes).forEach((childNode) => {
26036
- fragment.appendChild(childNode);
26037
- });
26038
- container.insertBefore(fragment, node);
26039
- container.removeChild(node);
26223
+ isFilterActive(filter) {
26224
+ return this.activeFilterFormats.includes(filter);
26040
26225
  }
26041
- createLink(displayValue, url) {
26042
- return `<a href="${url}" target="_blank" class="text-primary cursor-pointer hover:underline">${displayValue} <mat-icon class="material-symbols-outlined !w-[12px] !h-[14px] !text-[14px] opacity-75">open_in_new</mat-icon></a>`;
26226
+ getFilterFormatTitle(format) {
26227
+ if (format === 'all' || format === 'others') {
26228
+ return this.translateService.instant(`datahub.search.filter.${format}`);
26229
+ }
26230
+ return format;
26043
26231
  }
26044
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GnUiLinkifyDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
26045
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]", ngImport: i0 }); }
26232
+ isLinkOfFormat(link, format) {
26233
+ if (format === 'all') {
26234
+ return true;
26235
+ }
26236
+ if (getFileFormat(link) === null) {
26237
+ return format === 'others';
26238
+ }
26239
+ if (format === 'others') {
26240
+ const knownFormats = FILTER_FORMATS.filter((format) => format !== 'all' && format !== 'others');
26241
+ return knownFormats.every((knownFormat) => !getFileFormat(link).includes(knownFormat));
26242
+ }
26243
+ return getFileFormat(link).includes(format);
26244
+ }
26245
+ getLinkFormat(link) {
26246
+ return getFileFormat(link);
26247
+ }
26248
+ getLinkColor(link) {
26249
+ return getBadgeColor(getFileFormat(link));
26250
+ }
26251
+ isFromWfs(link) {
26252
+ return link.type === 'service' && link.accessServiceProtocol === 'wfs';
26253
+ }
26254
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, deps: [{ token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
26255
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DownloadsListComponent, selector: "gn-ui-downloads-list", inputs: { links: "links" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: DownloadItemComponent, selector: "gn-ui-download-item", inputs: ["link", "color", "format", "isFromWfs"], outputs: ["exportUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26046
26256
  }
26047
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GnUiLinkifyDirective, decorators: [{
26048
- type: Directive,
26049
- args: [{
26050
- selector: '[gnUiLinkify]',
26051
- }]
26052
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; } });
26257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, decorators: [{
26258
+ type: Component,
26259
+ args: [{ selector: 'gn-ui-downloads-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n" }]
26260
+ }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { links: [{
26261
+ type: Input
26262
+ }] } });
26263
+
26264
+ class ImageOverlayPreviewComponent {
26265
+ constructor() {
26266
+ this.isPlaceholderShown = new EventEmitter();
26267
+ }
26268
+ openLightbox(src) {
26269
+ basicLightbox.create(`<img src="${src}"/>`).show();
26270
+ }
26271
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26272
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ImageOverlayPreviewComponent, selector: "gn-ui-image-overlay-preview", inputs: { imageUrl: "imageUrl" }, outputs: { isPlaceholderShown: "isPlaceholderShown" }, ngImport: i0, template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-48 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n [showContent]=\"imageUrl !== undefined\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }] }); }
26273
+ }
26274
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
26275
+ type: Component,
26276
+ args: [{ selector: 'gn-ui-image-overlay-preview', template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-48 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n [showContent]=\"imageUrl !== undefined\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n" }]
26277
+ }], propDecorators: { imageUrl: [{
26278
+ type: Input
26279
+ }], isPlaceholderShown: [{
26280
+ type: Output
26281
+ }] } });
26282
+
26283
+ class LinkCardComponent {
26284
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26285
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LinkCardComponent, selector: "gn-ui-link-card", inputs: { link: "link" }, ngImport: i0, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group h-40 grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden lg:w-80\"\n>\n <div class=\"max-h-24 overflow-hidden text-ellipsis\">\n <p\n class=\"font-title font-medium text-21 text-black break-words mb-1 line-clamp-2\"\n >\n {{ link.name }}\n </p>\n <p class=\"font-medium text-sm break-words\">\n {{ link.description }}\n </p>\n <p\n *ngIf=\"!link.name && !link.description\"\n class=\"font-medium text-sm break-words truncate\"\n >\n {{ link.url }}\n </p>\n </div>\n <div>\n <mat-icon class=\"material-symbols-outlined card-icon\">open_in_new</mat-icon>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26286
+ }
26287
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, decorators: [{
26288
+ type: Component,
26289
+ args: [{ selector: 'gn-ui-link-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group h-40 grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden lg:w-80\"\n>\n <div class=\"max-h-24 overflow-hidden text-ellipsis\">\n <p\n class=\"font-title font-medium text-21 text-black break-words mb-1 line-clamp-2\"\n >\n {{ link.name }}\n </p>\n <p class=\"font-medium text-sm break-words\">\n {{ link.description }}\n </p>\n <p\n *ngIf=\"!link.name && !link.description\"\n class=\"font-medium text-sm break-words truncate\"\n >\n {{ link.url }}\n </p>\n </div>\n <div>\n <mat-icon class=\"material-symbols-outlined card-icon\">open_in_new</mat-icon>\n </div>\n</a>\n" }]
26290
+ }], propDecorators: { link: [{
26291
+ type: Input
26292
+ }] } });
26293
+
26294
+ class MarkdownParserComponent {
26295
+ get parsedMarkdown() {
26296
+ return marked.parse(this.textContent);
26297
+ }
26298
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26299
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, isStandalone: true, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26300
+ }
26301
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
26302
+ type: Component,
26303
+ args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
26304
+ }], propDecorators: { textContent: [{
26305
+ type: Input
26306
+ }] } });
26307
+
26308
+ class MarkdownEditorComponent {
26309
+ constructor() {
26310
+ this.preview = false;
26311
+ this.textContentChanged = new EventEmitter();
26312
+ }
26313
+ textContentChangedHandler(textContent) {
26314
+ this.textContent = textContent;
26315
+ this.textContentChanged.emit(this.textContent);
26316
+ }
26317
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26318
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownEditorComponent, isStandalone: true, selector: "gn-ui-markdown-editor", inputs: { preview: "preview", helperText: "helperText", placeholder: "placeholder", textContent: "textContent" }, outputs: { textContentChanged: "textContentChanged" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <p class=\"flex-none mb-2 font-medium text-sm text-gray-900\">\n {{ helperText }}\n </p>\n <div class=\"flex-1\" [hidden]=\"preview\">\n <gn-ui-text-area\n [placeholder]=\"placeholder\"\n [value]=\"textContent\"\n (valueChange)=\"textContentChangedHandler($event)\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"flex-1 border border-gray-800 rounded overflow-y-scroll\"\n [hidden]=\"!preview\"\n >\n <gn-ui-markdown-parser [textContent]=\"textContent\"></gn-ui-markdown-parser>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "ngmodule", type: TranslateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26319
+ }
26320
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownEditorComponent, decorators: [{
26321
+ type: Component,
26322
+ args: [{ selector: 'gn-ui-markdown-editor', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
26323
+ CommonModule,
26324
+ FormsModule,
26325
+ MatIconModule,
26326
+ MatTooltipModule,
26327
+ ButtonComponent,
26328
+ TextAreaComponent,
26329
+ MarkdownParserComponent,
26330
+ TranslateModule,
26331
+ ], template: "<div class=\"h-full flex flex-col\">\n <p class=\"flex-none mb-2 font-medium text-sm text-gray-900\">\n {{ helperText }}\n </p>\n <div class=\"flex-1\" [hidden]=\"preview\">\n <gn-ui-text-area\n [placeholder]=\"placeholder\"\n [value]=\"textContent\"\n (valueChange)=\"textContentChangedHandler($event)\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"flex-1 border border-gray-800 rounded overflow-y-scroll\"\n [hidden]=\"!preview\"\n >\n <gn-ui-markdown-parser [textContent]=\"textContent\"></gn-ui-markdown-parser>\n </div>\n</div>\n" }]
26332
+ }], propDecorators: { preview: [{
26333
+ type: Input
26334
+ }], helperText: [{
26335
+ type: Input
26336
+ }], placeholder: [{
26337
+ type: Input
26338
+ }], textContent: [{
26339
+ type: Input
26340
+ }], textContentChanged: [{
26341
+ type: Output
26342
+ }] } });
26053
26343
 
26054
26344
  class MaxLinesComponent {
26055
26345
  constructor(cdr) {
@@ -26116,6 +26406,155 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26116
26406
  args: ['container']
26117
26407
  }] } });
26118
26408
 
26409
+ class MetadataCatalogComponent {
26410
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataCatalogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26411
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataCatalogComponent, selector: "gn-ui-metadata-catalog", inputs: { sourceLabel: "sourceLabel" }, ngImport: i0, template: "<div>\n <p class=\"text-gray-700 text-xs mb-3 uppercase\" translate>\n record.metadata.catalog\n </p>\n <p class=\"text-primary font-title text-21 mb-1\">\n {{ sourceLabel }}\n </p>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26412
+ }
26413
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataCatalogComponent, decorators: [{
26414
+ type: Component,
26415
+ args: [{ selector: 'gn-ui-metadata-catalog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n <p class=\"text-gray-700 text-xs mb-3 uppercase\" translate>\n record.metadata.catalog\n </p>\n <p class=\"text-primary font-title text-21 mb-1\">\n {{ sourceLabel }}\n </p>\n</div>\n" }]
26416
+ }], propDecorators: { sourceLabel: [{
26417
+ type: Input
26418
+ }] } });
26419
+
26420
+ class MetadataContactComponent {
26421
+ constructor() {
26422
+ this.organizationClick = new EventEmitter();
26423
+ this.contactClick = new EventEmitter();
26424
+ }
26425
+ get shownOrganization() {
26426
+ return this.metadata.ownerOrganization;
26427
+ }
26428
+ get contacts() {
26429
+ return ((this.metadata.kind === 'dataset'
26430
+ ? this.metadata.contactsForResource
26431
+ : this.metadata.contacts) || []);
26432
+ }
26433
+ get address() {
26434
+ const addressParts = this.contacts[0].address
26435
+ .split(',')
26436
+ .map((part) => part.trim());
26437
+ return addressParts;
26438
+ }
26439
+ onOrganizationClick() {
26440
+ this.organizationClick.emit(this.shownOrganization);
26441
+ }
26442
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26443
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataContactComponent, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26444
+ }
26445
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
26446
+ type: Component,
26447
+ args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
26448
+ }], propDecorators: { metadata: [{
26449
+ type: Input
26450
+ }], organizationClick: [{
26451
+ type: Output
26452
+ }], contactClick: [{
26453
+ type: Output
26454
+ }] } });
26455
+
26456
+ class ExpandablePanelComponent {
26457
+ constructor() {
26458
+ this.collapsed = true;
26459
+ this.maxHeight = this.setMaxHeight();
26460
+ }
26461
+ toggle() {
26462
+ this.collapsed = !this.collapsed;
26463
+ this.maxHeight = this.setMaxHeight();
26464
+ }
26465
+ setMaxHeight() {
26466
+ return `${this.collapsed ? '0' : this.contentDiv.nativeElement.scrollHeight}px`;
26467
+ }
26468
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ExpandablePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26469
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: { title: "title", collapsed: "collapsed" }, viewQueries: [{ propertyName: "contentDiv", first: true, predicate: ["contentDiv"], descendants: true }], ngImport: i0, template: "<div\n class=\"group flex align-middle title border-b border-gray-100 cursor-pointer pt-2.5\"\n (click)=\"toggle()\"\n>\n <div class=\"grow font-medium text-black text-sm\">\n {{ title }}\n </div>\n <div\n class=\"w-8 opacity-25 text-primary group-hover:opacity-100 transition-opacity\"\n >\n <mat-icon class=\"material-symbols-outlined\" *ngIf=\"collapsed\">add</mat-icon>\n <mat-icon class=\"material-symbols-outlined\" *ngIf=\"!collapsed\"\n >remove</mat-icon\n >\n </div>\n</div>\n<div\n class=\"content overflow-hidden transition-[max-height] duration-300\"\n [ngClass]=\"collapsed ? 'ease-out' : 'ease-in'\"\n [style.maxHeight]=\"maxHeight\"\n #contentDiv\n>\n <ng-content></ng-content>\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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26470
+ }
26471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ExpandablePanelComponent, decorators: [{
26472
+ type: Component,
26473
+ args: [{ selector: 'gn-ui-expandable-panel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"group flex align-middle title border-b border-gray-100 cursor-pointer pt-2.5\"\n (click)=\"toggle()\"\n>\n <div class=\"grow font-medium text-black text-sm\">\n {{ title }}\n </div>\n <div\n class=\"w-8 opacity-25 text-primary group-hover:opacity-100 transition-opacity\"\n >\n <mat-icon class=\"material-symbols-outlined\" *ngIf=\"collapsed\">add</mat-icon>\n <mat-icon class=\"material-symbols-outlined\" *ngIf=\"!collapsed\"\n >remove</mat-icon\n >\n </div>\n</div>\n<div\n class=\"content overflow-hidden transition-[max-height] duration-300\"\n [ngClass]=\"collapsed ? 'ease-out' : 'ease-in'\"\n [style.maxHeight]=\"maxHeight\"\n #contentDiv\n>\n <ng-content></ng-content>\n</div>\n" }]
26474
+ }], propDecorators: { title: [{
26475
+ type: Input
26476
+ }], collapsed: [{
26477
+ type: Input
26478
+ }], contentDiv: [{
26479
+ type: ViewChild,
26480
+ args: ['contentDiv']
26481
+ }] } });
26482
+
26483
+ /* eslint-disable @angular-eslint/directive-selector */
26484
+ class GnUiLinkifyDirective {
26485
+ constructor(el, renderer) {
26486
+ this.el = el;
26487
+ this.renderer = renderer;
26488
+ }
26489
+ ngOnInit() {
26490
+ setTimeout(() => {
26491
+ this.processLinks(this.el.nativeElement);
26492
+ }, 0);
26493
+ }
26494
+ processLinks(container) {
26495
+ const nodes = Array.from(container.childNodes);
26496
+ nodes.forEach((node) => {
26497
+ if (node instanceof Text) {
26498
+ const textNode = node;
26499
+ const linkified = this.linkifyNode(textNode.nodeValue);
26500
+ if (linkified) {
26501
+ this.createLinkElements(container, linkified, node);
26502
+ }
26503
+ }
26504
+ else if (node instanceof HTMLAnchorElement) {
26505
+ const url = node.href;
26506
+ const displayValue = node.innerHTML;
26507
+ const linkified = this.linkifyNode(displayValue, url);
26508
+ if (linkified) {
26509
+ this.createLinkElements(container, linkified, node);
26510
+ }
26511
+ }
26512
+ else {
26513
+ this.processLinks(node);
26514
+ }
26515
+ });
26516
+ }
26517
+ linkifyNode(displayValue, url) {
26518
+ if (url) {
26519
+ displayValue = this.createLink(displayValue, url);
26520
+ }
26521
+ else {
26522
+ const urlRegex = /\bhttps?:\/\/(?:\([^\s()]+\)|[^\s()]+)+/g;
26523
+ const matches = displayValue.match(urlRegex);
26524
+ if (matches && matches.length > 0) {
26525
+ matches.forEach((match) => {
26526
+ url = match;
26527
+ displayValue = displayValue.replace(match, (match) => {
26528
+ return this.createLink(match, url);
26529
+ });
26530
+ });
26531
+ }
26532
+ }
26533
+ return displayValue;
26534
+ }
26535
+ createLinkElements(container, htmlContent, node) {
26536
+ const div = this.renderer.createElement('div');
26537
+ div.innerHTML = htmlContent;
26538
+ const fragment = document.createDocumentFragment();
26539
+ Array.from(div.childNodes).forEach((childNode) => {
26540
+ fragment.appendChild(childNode);
26541
+ });
26542
+ container.insertBefore(fragment, node);
26543
+ container.removeChild(node);
26544
+ }
26545
+ createLink(displayValue, url) {
26546
+ return `<a href="${url}" target="_blank" class="text-primary cursor-pointer hover:underline">${displayValue} <mat-icon class="material-symbols-outlined !w-[12px] !h-[14px] !text-[14px] opacity-75">open_in_new</mat-icon></a>`;
26547
+ }
26548
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GnUiLinkifyDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
26549
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]", ngImport: i0 }); }
26550
+ }
26551
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GnUiLinkifyDirective, decorators: [{
26552
+ type: Directive,
26553
+ args: [{
26554
+ selector: '[gnUiLinkify]',
26555
+ }]
26556
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; } });
26557
+
26119
26558
  class MetadataInfoComponent {
26120
26559
  constructor() {
26121
26560
  this.keyword = new EventEmitter();
@@ -26180,7 +26619,7 @@ class MetadataInfoComponent {
26180
26619
  this.keyword.emit(keyword);
26181
26620
  }
26182
26621
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26183
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"mt-6 mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26622
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"mt-6 mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26184
26623
  }
26185
26624
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
26186
26625
  type: Component,
@@ -26193,210 +26632,210 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26193
26632
  type: Output
26194
26633
  }] } });
26195
26634
 
26196
- class DownloadItemComponent {
26635
+ class PaginationButtonsComponent {
26197
26636
  constructor() {
26198
- this.exportUrl = new EventEmitter();
26199
- }
26200
- openUrl() {
26201
- this.exportUrl.emit(this.link.url.toString());
26202
- }
26203
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26204
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DownloadItemComponent, selector: "gn-ui-download-item", inputs: { link: "link", color: "color", format: "format", isFromWfs: "isFromWfs" }, outputs: { exportUrl: "exportUrl" }, ngImport: i0, template: "<a\n href=\"{{ link.url }}\"\n target=\"_blank\"\n class=\"group flex justify-between card-shadow px-6 py-5 cursor-pointer\"\n rel=\"noopener\"\n>\n <div class=\"grow-1 w-full overflow-hidden\">\n <div\n class=\"text-21 text-black truncate font-title w-11/12\"\n [title]=\"link.description || link.name\"\n >\n {{ link.description || link.name }}\n </div>\n <div class=\"pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"color\"\n data-cy=\"download-format\"\n >{{ format || ('downloads.format.unknown' | translate) }}</span\n >\n <span\n class=\"pl-2 inline-flex items-center text-gray-800 text-sm\"\n *ngIf=\"isFromWfs\"\n translate=\"\"\n >datahub.search.filter.generatedByWfs</span\n >\n </div>\n </div>\n <div class=\"shrink-1 w-14 flex flex-col justify-center items-center\">\n <mat-icon class=\"!w-8 !h-8 card-icon text-3xl material-symbols-outlined\">\n cloud_download\n </mat-icon>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26205
- }
26206
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadItemComponent, decorators: [{
26207
- type: Component,
26208
- args: [{ selector: 'gn-ui-download-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<a\n href=\"{{ link.url }}\"\n target=\"_blank\"\n class=\"group flex justify-between card-shadow px-6 py-5 cursor-pointer\"\n rel=\"noopener\"\n>\n <div class=\"grow-1 w-full overflow-hidden\">\n <div\n class=\"text-21 text-black truncate font-title w-11/12\"\n [title]=\"link.description || link.name\"\n >\n {{ link.description || link.name }}\n </div>\n <div class=\"pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"color\"\n data-cy=\"download-format\"\n >{{ format || ('downloads.format.unknown' | translate) }}</span\n >\n <span\n class=\"pl-2 inline-flex items-center text-gray-800 text-sm\"\n *ngIf=\"isFromWfs\"\n translate=\"\"\n >datahub.search.filter.generatedByWfs</span\n >\n </div>\n </div>\n <div class=\"shrink-1 w-14 flex flex-col justify-center items-center\">\n <mat-icon class=\"!w-8 !h-8 card-icon text-3xl material-symbols-outlined\">\n cloud_download\n </mat-icon>\n </div>\n</a>\n" }]
26209
- }], propDecorators: { link: [{
26210
- type: Input
26211
- }], color: [{
26212
- type: Input
26213
- }], format: [{
26214
- type: Input
26215
- }], isFromWfs: [{
26216
- type: Input
26217
- }], exportUrl: [{
26218
- type: Output
26219
- }] } });
26220
-
26221
- marker('datahub.search.filter.all');
26222
- marker('datahub.search.filter.others');
26223
- const FILTER_FORMATS = ['all', 'csv', 'excel', 'json', 'shp', 'others'];
26224
- class DownloadsListComponent {
26225
- constructor(translateService) {
26226
- this.translateService = translateService;
26227
- this.activeFilterFormats = ['all'];
26228
- }
26229
- get filteredLinks() {
26230
- return this.links.filter((link) => this.activeFilterFormats.some((format) => this.isLinkOfFormat(link, format)));
26637
+ this.visiblePages = [];
26638
+ this.newCurrentPageEvent = new EventEmitter();
26231
26639
  }
26232
- get visibleFormats() {
26233
- return FILTER_FORMATS.filter((format) => this.links.some((link) => this.isLinkOfFormat(link, format)));
26640
+ ngOnChanges() {
26641
+ this.calculateVisiblePages();
26234
26642
  }
26235
- toggleFilterFormat(format) {
26236
- if (format === 'all') {
26237
- this.activeFilterFormats = ['all'];
26238
- return;
26239
- }
26240
- if (this.isFilterActive(format)) {
26241
- this.activeFilterFormats = this.activeFilterFormats.filter((f) => format !== f);
26242
- }
26243
- else {
26244
- this.activeFilterFormats = [
26245
- ...this.activeFilterFormats.filter((f) => f !== 'all'),
26246
- format,
26247
- ];
26643
+ calculateVisiblePages() {
26644
+ const maxVisiblePages = 5;
26645
+ const halfVisible = Math.floor(maxVisiblePages / 2);
26646
+ const startPage = Math.max(this.currentPage - halfVisible, 1);
26647
+ const endPage = Math.min(this.currentPage + halfVisible, this.totalPages);
26648
+ const visiblePages = [];
26649
+ if (startPage > 1) {
26650
+ visiblePages.push(1);
26651
+ if (startPage > 2) {
26652
+ visiblePages.push('...');
26653
+ }
26248
26654
  }
26249
- if (this.activeFilterFormats.length === 0) {
26250
- this.activeFilterFormats = ['all'];
26655
+ for (let page = startPage; page <= endPage; page++) {
26656
+ visiblePages.push(page);
26251
26657
  }
26252
- }
26253
- isFilterActive(filter) {
26254
- return this.activeFilterFormats.includes(filter);
26255
- }
26256
- getFilterFormatTitle(format) {
26257
- if (format === 'all' || format === 'others') {
26258
- return this.translateService.instant(`datahub.search.filter.${format}`);
26658
+ if (endPage < this.totalPages) {
26659
+ if (endPage < this.totalPages - 1) {
26660
+ visiblePages.push('...');
26661
+ }
26662
+ visiblePages.push(this.totalPages);
26259
26663
  }
26260
- return format;
26664
+ this.visiblePages = visiblePages;
26261
26665
  }
26262
- isLinkOfFormat(link, format) {
26263
- if (format === 'all') {
26264
- return true;
26265
- }
26266
- if (getFileFormat(link) === null) {
26267
- return format === 'others';
26268
- }
26269
- if (format === 'others') {
26270
- const knownFormats = FILTER_FORMATS.filter((format) => format !== 'all' && format !== 'others');
26271
- return knownFormats.every((knownFormat) => !getFileFormat(link).includes(knownFormat));
26272
- }
26273
- return getFileFormat(link).includes(format);
26666
+ changePage(page) {
26667
+ this.setPage(page);
26274
26668
  }
26275
- getLinkFormat(link) {
26276
- return getFileFormat(link);
26669
+ nextPage() {
26670
+ this.setPage(this.currentPage + 1);
26277
26671
  }
26278
- getLinkColor(link) {
26279
- return getBadgeColor(getFileFormat(link));
26672
+ previousPage() {
26673
+ this.setPage(this.currentPage - 1);
26280
26674
  }
26281
- isFromWfs(link) {
26282
- return link.type === 'service' && link.accessServiceProtocol === 'wfs';
26675
+ setPage(newPage) {
26676
+ if (!Number.isInteger(newPage))
26677
+ return;
26678
+ this.currentPage = newPage;
26679
+ this.calculateVisiblePages();
26680
+ this.newCurrentPageEvent.emit(this.currentPage);
26283
26681
  }
26284
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, deps: [{ token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
26285
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DownloadsListComponent, selector: "gn-ui-downloads-list", inputs: { links: "links" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: DownloadItemComponent, selector: "gn-ui-download-item", inputs: ["link", "color", "format", "isFromWfs"], outputs: ["exportUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26682
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginationButtonsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26683
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: PaginationButtonsComponent, selector: "gn-ui-pagination-buttons", inputs: { currentPage: "currentPage", totalPages: "totalPages" }, outputs: { newCurrentPageEvent: "newCurrentPageEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <div class=\"flex flex-row gap-[5px] items-center\">\n <gn-ui-button\n type=\"light\"\n [disabled]=\"currentPage === 1\"\n (buttonClick)=\"previousPage()\"\n extraClass=\"!px-[3px]\"\n >\n <mat-icon class=\"material-symbols-outlined\">chevron_left</mat-icon>\n </gn-ui-button>\n <ng-container *ngFor=\"let page of visiblePages\">\n <ng-container *ngIf=\"page === '...'\">\n <span class=\"mx-[5px]\">{{ page }}</span>\n </ng-container>\n <ng-container *ngIf=\"page !== '...'\">\n <gn-ui-button\n [type]=\"page === currentPage ? 'primary' : 'light'\"\n [disabled]=\"page === currentPage\"\n (buttonClick)=\"changePage(page)\"\n >{{ page }}</gn-ui-button\n >\n </ng-container>\n </ng-container>\n <gn-ui-button\n type=\"light\"\n [disabled]=\"currentPage === totalPages\"\n (buttonClick)=\"nextPage()\"\n extraClass=\"!px-[3px]\"\n >\n <mat-icon class=\"material-symbols-outlined\">chevron_right</mat-icon>\n </gn-ui-button>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }] }); }
26286
26684
  }
26287
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, decorators: [{
26685
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginationButtonsComponent, decorators: [{
26288
26686
  type: Component,
26289
- args: [{ selector: 'gn-ui-downloads-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n" }]
26290
- }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { links: [{
26687
+ args: [{ selector: 'gn-ui-pagination-buttons', template: "<div class=\"relative\">\n <div class=\"flex flex-row gap-[5px] items-center\">\n <gn-ui-button\n type=\"light\"\n [disabled]=\"currentPage === 1\"\n (buttonClick)=\"previousPage()\"\n extraClass=\"!px-[3px]\"\n >\n <mat-icon class=\"material-symbols-outlined\">chevron_left</mat-icon>\n </gn-ui-button>\n <ng-container *ngFor=\"let page of visiblePages\">\n <ng-container *ngIf=\"page === '...'\">\n <span class=\"mx-[5px]\">{{ page }}</span>\n </ng-container>\n <ng-container *ngIf=\"page !== '...'\">\n <gn-ui-button\n [type]=\"page === currentPage ? 'primary' : 'light'\"\n [disabled]=\"page === currentPage\"\n (buttonClick)=\"changePage(page)\"\n >{{ page }}</gn-ui-button\n >\n </ng-container>\n </ng-container>\n <gn-ui-button\n type=\"light\"\n [disabled]=\"currentPage === totalPages\"\n (buttonClick)=\"nextPage()\"\n extraClass=\"!px-[3px]\"\n >\n <mat-icon class=\"material-symbols-outlined\">chevron_right</mat-icon>\n </gn-ui-button>\n </div>\n</div>\n" }]
26688
+ }], propDecorators: { currentPage: [{
26291
26689
  type: Input
26690
+ }], totalPages: [{
26691
+ type: Input
26692
+ }], newCurrentPageEvent: [{
26693
+ type: Output
26292
26694
  }] } });
26293
26695
 
26294
- class ApiCardComponent {
26696
+ class PaginationComponent {
26295
26697
  constructor() {
26296
- this.currentlyActive = false;
26297
- this.openRecordApiForm = new EventEmitter();
26698
+ this.currentPage = 1;
26699
+ this.nPages = 1;
26700
+ this.hideButton = false;
26701
+ this.newCurrentPageEvent = new EventEmitter();
26298
26702
  }
26299
- ngOnInit() {
26300
- this.displayApiFormButton =
26301
- this.link.accessServiceProtocol === 'ogcFeatures' ? true : false;
26703
+ applyPageBounds() {
26704
+ // make sure this works with NaN inputs as well by adding `|| 1`
26705
+ this.nPages = Math.max(1, this.nPages || 1);
26706
+ this.currentPage = Math.max(1, Math.min(this.nPages, this.currentPage || 1));
26302
26707
  }
26303
26708
  ngOnChanges(changes) {
26304
- this.currentlyActive =
26305
- changes.currentLink.currentValue === this.link ? true : false;
26306
- }
26307
- openRecordApiFormPanel() {
26308
- if (this.displayApiFormButton) {
26309
- this.currentlyActive = !this.currentlyActive;
26310
- this.openRecordApiForm.emit(this.currentlyActive ? this.link : undefined);
26709
+ // make sure the inputs are valid
26710
+ if ('currentPage' in changes || 'nPages' in changes) {
26711
+ this.applyPageBounds();
26311
26712
  }
26312
26713
  }
26313
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26314
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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: 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 }); }
26714
+ setPage(newPage) {
26715
+ if (!Number.isInteger(newPage))
26716
+ return;
26717
+ this.currentPage = newPage;
26718
+ this.applyPageBounds();
26719
+ this.newCurrentPageEvent.emit(this.currentPage);
26720
+ }
26721
+ nextPage() {
26722
+ this.setPage(this.currentPage + 1);
26723
+ }
26724
+ previousPage() {
26725
+ this.setPage(this.currentPage - 1);
26726
+ }
26727
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26728
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: PaginationComponent, selector: "gn-ui-pagination", inputs: { currentPage: "currentPage", nPages: "nPages", hideButton: "hideButton" }, outputs: { newCurrentPageEvent: "newCurrentPageEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <div class=\"sm:absolute sm:inset-0\" *ngIf=\"!hideButton\">\n <gn-ui-button\n (buttonClick)=\"nextPage()\"\n type=\"secondary\"\n [disabled]=\"currentPage === nPages\"\n extraClass=\"lg:m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >pagination.nextPage</span\n >\n </gn-ui-button>\n </div>\n <div\n class=\"relative pointer-events-none flex flex-row justify-start sm:justify-end\"\n >\n <div class=\"pointer-events-auto flex flex-row items-center py-[13px]\">\n <span class=\"mr-3 capitalize text-sm text-gray-900\" translate\n >pagination.page</span\n >\n <input\n type=\"number\"\n [ngModel]=\"currentPage\"\n [min]=\"1\"\n [max]=\"nPages\"\n (ngModelChange)=\"setPage($event)\"\n class=\"border border-gray-300 rounded w-[54px] h-[34px] pl-[12px] mr-3 text-center\"\n />\n <span class=\"mr-3 text-sm text-gray-900\"\n ><span translate>pagination.pageOf</span> {{ nPages }}</span\n >\n <gn-ui-button\n (buttonClick)=\"previousPage()\"\n id=\"navigate_previous\"\n class=\"mr-2\"\n [disabled]=\"currentPage === 1\"\n [type]=\"'light'\"\n extraClass=\"!px-[3px]\"\n data-cy=\"prev-page\"\n >\n <mat-icon class=\"material-symbols-outlined\">navigate_before</mat-icon>\n </gn-ui-button>\n <gn-ui-button\n (buttonClick)=\"nextPage()\"\n id=\"navigate_next\"\n [disabled]=\"currentPage === nPages\"\n [type]=\"'light'\"\n extraClass=\"!px-[3px]\"\n data-cy=\"next-page\"\n >\n <mat-icon class=\"material-symbols-outlined\">navigate_next</mat-icon>\n </gn-ui-button>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2$1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26315
26729
  }
26316
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ApiCardComponent, decorators: [{
26730
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginationComponent, decorators: [{
26317
26731
  type: Component,
26318
- 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" }]
26319
- }], propDecorators: { link: [{
26732
+ args: [{ selector: 'gn-ui-pagination', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"relative\">\n <div class=\"sm:absolute sm:inset-0\" *ngIf=\"!hideButton\">\n <gn-ui-button\n (buttonClick)=\"nextPage()\"\n type=\"secondary\"\n [disabled]=\"currentPage === nPages\"\n extraClass=\"lg:m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >pagination.nextPage</span\n >\n </gn-ui-button>\n </div>\n <div\n class=\"relative pointer-events-none flex flex-row justify-start sm:justify-end\"\n >\n <div class=\"pointer-events-auto flex flex-row items-center py-[13px]\">\n <span class=\"mr-3 capitalize text-sm text-gray-900\" translate\n >pagination.page</span\n >\n <input\n type=\"number\"\n [ngModel]=\"currentPage\"\n [min]=\"1\"\n [max]=\"nPages\"\n (ngModelChange)=\"setPage($event)\"\n class=\"border border-gray-300 rounded w-[54px] h-[34px] pl-[12px] mr-3 text-center\"\n />\n <span class=\"mr-3 text-sm text-gray-900\"\n ><span translate>pagination.pageOf</span> {{ nPages }}</span\n >\n <gn-ui-button\n (buttonClick)=\"previousPage()\"\n id=\"navigate_previous\"\n class=\"mr-2\"\n [disabled]=\"currentPage === 1\"\n [type]=\"'light'\"\n extraClass=\"!px-[3px]\"\n data-cy=\"prev-page\"\n >\n <mat-icon class=\"material-symbols-outlined\">navigate_before</mat-icon>\n </gn-ui-button>\n <gn-ui-button\n (buttonClick)=\"nextPage()\"\n id=\"navigate_next\"\n [disabled]=\"currentPage === nPages\"\n [type]=\"'light'\"\n extraClass=\"!px-[3px]\"\n data-cy=\"next-page\"\n >\n <mat-icon class=\"material-symbols-outlined\">navigate_next</mat-icon>\n </gn-ui-button>\n </div>\n </div>\n</div>\n" }]
26733
+ }], propDecorators: { currentPage: [{
26320
26734
  type: Input
26321
- }], currentLink: [{
26735
+ }], nPages: [{
26322
26736
  type: Input
26323
- }], openRecordApiForm: [{
26737
+ }], hideButton: [{
26738
+ type: Input
26739
+ }], newCurrentPageEvent: [{
26324
26740
  type: Output
26325
26741
  }] } });
26326
26742
 
26327
- /**
26328
- * This component will make a block that will stay sticky on the top of the page,
26329
- * but will also shrink down to a minimum height when scrolling.
26330
- * The ratio between minimum and nominal height is stored in the shrinkRatio
26331
- * property, and can be used to change e.g. the opacity or size of child elements.
26332
- * This component renders at z-index: 50 by default.
26333
- * The first parent element with an overflow of `scroll` or `overflow` is considered
26334
- * for scroll events.
26335
- */
26336
- class StickyHeaderComponent {
26337
- constructor(changeDetector, hostEl, zone) {
26338
- this.changeDetector = changeDetector;
26339
- this.hostEl = hostEl;
26340
- this.zone = zone;
26743
+ const DEFAULT_PARAMS = {
26744
+ OFFSET: '',
26745
+ LIMIT: '-1',
26746
+ FORMAT: 'json',
26747
+ };
26748
+ class RecordApiFormComponent {
26749
+ constructor() {
26750
+ this.offset$ = new BehaviorSubject('');
26751
+ this.limit$ = new BehaviorSubject('');
26752
+ this.format$ = new BehaviorSubject('');
26753
+ this.formatsList = [
26754
+ { label: 'JSON', value: 'json' },
26755
+ { label: 'CSV', value: 'csv' },
26756
+ ];
26757
+ this.apiQueryUrl$ = combineLatest([this.offset$, this.limit$, this.format$]).pipe(map$2(([offset, limit, format]) => {
26758
+ let outputUrl;
26759
+ if (this.apiBaseUrl) {
26760
+ const url = new URL(this.apiBaseUrl);
26761
+ const params = { offset: offset, limit: limit, f: format };
26762
+ for (const [key, value] of Object.entries(params)) {
26763
+ if (value && value !== '0') {
26764
+ url.searchParams.set(key, value);
26765
+ }
26766
+ else {
26767
+ url.searchParams.delete(key);
26768
+ }
26769
+ }
26770
+ outputUrl = url.toString();
26771
+ }
26772
+ return outputUrl;
26773
+ }));
26774
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
26775
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
26341
26776
  }
26342
- ngAfterViewInit() {
26343
- this.scrollSub = fromEvent(window, 'scroll', {
26344
- passive: true,
26345
- })
26346
- .pipe(throttleTime(0, animationFrameScheduler, {
26347
- leading: true,
26348
- trailing: true,
26349
- }))
26350
- .subscribe(this.updateSize.bind(this));
26777
+ set apiLink(value) {
26778
+ this.apiBaseUrl = value ? value.url.href : undefined;
26779
+ this.resetUrl();
26351
26780
  }
26352
- ngOnInit() {
26353
- this.placeholderEl = document.createElement('div');
26354
- this.placeholderEl.style.position = 'absolute';
26355
- this.placeholderEl.classList.add('sticky-header-placeholder');
26356
- this.hostEl.nativeElement.insertAdjacentElement('beforebegin', this.placeholderEl);
26781
+ setOffset(value) {
26782
+ this.offset$.next(value);
26357
26783
  }
26358
- ngAfterViewChecked() {
26359
- this.updateSize();
26784
+ setLimit(value) {
26785
+ const newLimit = value === '' ? '-1' : value;
26786
+ this.limit$.next(newLimit);
26360
26787
  }
26361
- ngOnDestroy() {
26362
- this.scrollSub.unsubscribe();
26363
- this.placeholderEl.remove();
26788
+ setFormat(value) {
26789
+ this.format$.next(String(value));
26364
26790
  }
26365
- updateSize() {
26366
- this.zone.runOutsideAngular(() => {
26367
- if (window.scrollY === this.parentScroll)
26368
- return;
26369
- this.parentScroll = window.scrollY;
26370
- const offsetTop = Math.max(0, this.parentScroll - this.placeholderEl.offsetTop);
26371
- const newHeightPx = Math.max(this.minHeightPx, this.fullHeightPx - offsetTop);
26372
- this.innerContainer.nativeElement.style.transform = `translate(0, ${newHeightPx - this.fullHeightPx}px)`;
26373
- this.expandRatio =
26374
- (newHeightPx - this.minHeightPx) /
26375
- (this.fullHeightPx - this.minHeightPx);
26376
- this.changeDetector.detectChanges();
26377
- });
26791
+ resetUrl() {
26792
+ this.offset$.next(DEFAULT_PARAMS.OFFSET);
26793
+ this.limit$.next(DEFAULT_PARAMS.LIMIT);
26794
+ this.format$.next(DEFAULT_PARAMS.FORMAT);
26378
26795
  }
26379
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StickyHeaderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef, host: true }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
26380
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: StickyHeaderComponent, selector: "gn-ui-sticky-header", inputs: { minHeightPx: "minHeightPx", fullHeightPx: "fullHeightPx" }, queries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "outerContainer", first: true, predicate: ["outerContainer"], descendants: true }, { propertyName: "innerContainer", first: true, predicate: ["innerContainer"], descendants: true }], ngImport: i0, template: "<div\n #outerContainer\n class=\"sticky pointer-events-none z-50 top-0\"\n [style.height]=\"fullHeightPx + 'px'\"\n>\n <div\n #innerContainer\n class=\"relative pointer-events-auto\"\n [style.height]=\"fullHeightPx + 'px'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: expandRatio }\"\n ></ng-container>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26796
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26797
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26381
26798
  }
26382
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StickyHeaderComponent, decorators: [{
26799
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
26383
26800
  type: Component,
26384
- args: [{ selector: 'gn-ui-sticky-header', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #outerContainer\n class=\"sticky pointer-events-none z-50 top-0\"\n [style.height]=\"fullHeightPx + 'px'\"\n>\n <div\n #innerContainer\n class=\"relative pointer-events-auto\"\n [style.height]=\"fullHeightPx + 'px'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: expandRatio }\"\n ></ng-container>\n </div>\n</div>\n" }]
26385
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef, decorators: [{
26386
- type: Host
26387
- }] }, { type: i0.NgZone }]; }, propDecorators: { minHeightPx: [{
26801
+ args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
26802
+ }], propDecorators: { apiLink: [{
26388
26803
  type: Input
26389
- }], fullHeightPx: [{
26804
+ }] } });
26805
+
26806
+ class RelatedRecordCardComponent {
26807
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26808
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RelatedRecordCardComponent, selector: "gn-ui-related-record-card", inputs: { record: "record" }, ngImport: i0, template: "<a\n class=\"w-72 h-96 overflow-hidden rounded-lg bg-white cursor-pointer block hover:-translate-y-2 duration-[180ms]\"\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 }); }
26809
+ }
26810
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
26811
+ type: Component,
26812
+ args: [{ selector: 'gn-ui-related-record-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<a\n class=\"w-72 h-96 overflow-hidden rounded-lg bg-white cursor-pointer block hover:-translate-y-2 duration-[180ms]\"\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" }]
26813
+ }], propDecorators: { record: [{
26814
+ type: Input
26815
+ }] } });
26816
+
26817
+ var ErrorType;
26818
+ (function (ErrorType) {
26819
+ ErrorType[ErrorType["COULD_NOT_REACH_API"] = 0] = "COULD_NOT_REACH_API";
26820
+ ErrorType[ErrorType["RECEIVED_ERROR"] = 1] = "RECEIVED_ERROR";
26821
+ ErrorType[ErrorType["RECORD_NOT_FOUND"] = 2] = "RECORD_NOT_FOUND";
26822
+ })(ErrorType || (ErrorType = {}));
26823
+ class SearchResultsErrorComponent {
26824
+ constructor() {
26825
+ this.types = ErrorType;
26826
+ }
26827
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchResultsErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26828
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SearchResultsErrorComponent, selector: "gn-ui-search-results-error", inputs: { type: "type", error: "error", recordId: "recordId" }, ngImport: i0, template: "<div\n class=\"p-[1.7em] bg-red-50 text-red-800 text-[1.5em] text-center rounded-lg\"\n>\n <div *ngIf=\"type === types.COULD_NOT_REACH_API\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">face</mat-icon>\n <mat-icon class=\"material-symbols-outlined question-mark1\"\n >question_mark</mat-icon\n >\n <mat-icon class=\"material-symbols-outlined question-mark2\"\n >question_mark</mat-icon\n >\n </div>\n <div translate>search.error.couldNotReachApi</div>\n </div>\n <div *ngIf=\"type === types.RECEIVED_ERROR\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">mood_bad</mat-icon>\n </div>\n <div translate>search.error.receivedError</div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div *ngIf=\"type === types.RECORD_NOT_FOUND\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined computer\">computer</mat-icon>\n <mat-icon class=\"material-symbols-outlined computer-question-mark\"\n >question_mark</mat-icon\n >\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.recordNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n</div>\n", styles: ["mat-icon{width:auto;height:auto}mat-icon.face{font-size:3em}mat-icon.question-mark1{position:absolute;bottom:1.1em;left:calc(50% + .7em);font-size:1.7em}mat-icon.question-mark2{position:absolute;bottom:1.6em;left:calc(50% + 1.6em);font-size:1.4em}.computer{font-size:3em}.computer-question-mark{position:absolute;top:.6em;left:calc(50% - .5em);font-size:1.2em}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26829
+ }
26830
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchResultsErrorComponent, decorators: [{
26831
+ type: Component,
26832
+ args: [{ selector: 'gn-ui-search-results-error', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"p-[1.7em] bg-red-50 text-red-800 text-[1.5em] text-center rounded-lg\"\n>\n <div *ngIf=\"type === types.COULD_NOT_REACH_API\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">face</mat-icon>\n <mat-icon class=\"material-symbols-outlined question-mark1\"\n >question_mark</mat-icon\n >\n <mat-icon class=\"material-symbols-outlined question-mark2\"\n >question_mark</mat-icon\n >\n </div>\n <div translate>search.error.couldNotReachApi</div>\n </div>\n <div *ngIf=\"type === types.RECEIVED_ERROR\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">mood_bad</mat-icon>\n </div>\n <div translate>search.error.receivedError</div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div *ngIf=\"type === types.RECORD_NOT_FOUND\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined computer\">computer</mat-icon>\n <mat-icon class=\"material-symbols-outlined computer-question-mark\"\n >question_mark</mat-icon\n >\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.recordNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n</div>\n", styles: ["mat-icon{width:auto;height:auto}mat-icon.face{font-size:3em}mat-icon.question-mark1{position:absolute;bottom:1.1em;left:calc(50% + .7em);font-size:1.7em}mat-icon.question-mark2{position:absolute;bottom:1.6em;left:calc(50% + 1.6em);font-size:1.4em}.computer{font-size:3em}.computer-question-mark{position:absolute;top:.6em;left:calc(50% - .5em);font-size:1.2em}\n"] }]
26833
+ }], propDecorators: { type: [{
26834
+ type: Input
26835
+ }], error: [{
26836
+ type: Input
26837
+ }], recordId: [{
26390
26838
  type: Input
26391
- }], template: [{
26392
- type: ContentChild,
26393
- args: [TemplateRef]
26394
- }], outerContainer: [{
26395
- type: ViewChild,
26396
- args: ['outerContainer']
26397
- }], innerContainer: [{
26398
- type: ViewChild,
26399
- args: ['innerContainer']
26400
26839
  }] } });
26401
26840
 
26402
26841
  class AnchorLinkDirective {
@@ -26501,39 +26940,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26501
26940
  args: ['carouselOverflowContainer']
26502
26941
  }] } });
26503
26942
 
26504
- class UiLayoutModule {
26505
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26506
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, declarations: [ExpandablePanelComponent,
26507
- StickyHeaderComponent,
26508
- AnchorLinkDirective,
26509
- ExpandablePanelButtonComponent,
26510
- CarouselComponent], imports: [CommonModule, MatIconModule, i1$1.TranslateModule], exports: [ExpandablePanelComponent,
26511
- StickyHeaderComponent,
26512
- AnchorLinkDirective,
26513
- ExpandablePanelButtonComponent,
26514
- CarouselComponent] }); }
26515
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, imports: [CommonModule, MatIconModule, TranslateModule.forChild()] }); }
26943
+ class FormFieldWrapperComponent {
26944
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26945
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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 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: [".icon-small{font-size:16px;height:16px;width:16px}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26516
26946
  }
26517
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, decorators: [{
26518
- type: NgModule,
26519
- args: [{
26520
- imports: [CommonModule, MatIconModule, TranslateModule.forChild()],
26521
- declarations: [
26522
- ExpandablePanelComponent,
26523
- StickyHeaderComponent,
26524
- AnchorLinkDirective,
26525
- ExpandablePanelButtonComponent,
26526
- CarouselComponent,
26527
- ],
26528
- exports: [
26529
- ExpandablePanelComponent,
26530
- StickyHeaderComponent,
26531
- AnchorLinkDirective,
26532
- ExpandablePanelButtonComponent,
26533
- CarouselComponent,
26534
- ],
26535
- }]
26536
- }] });
26947
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
26948
+ type: Component,
26949
+ args: [{ selector: 'gn-ui-form-field-wrapper', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatIconModule, MatTooltipModule], 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 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: [".icon-small{font-size:16px;height:16px;width:16px}\n"] }]
26950
+ }], propDecorators: { label: [{
26951
+ type: Input
26952
+ }], hint: [{
26953
+ type: Input
26954
+ }] } });
26537
26955
 
26538
26956
  class InteractiveTableColumnComponent {
26539
26957
  constructor() {
@@ -26598,161 +27016,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26598
27016
  type: Output
26599
27017
  }] } });
26600
27018
 
26601
- class LinkCardComponent {
26602
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26603
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LinkCardComponent, selector: "gn-ui-link-card", inputs: { link: "link" }, ngImport: i0, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group h-40 grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden lg:w-80\"\n>\n <div class=\"max-h-24 overflow-hidden text-ellipsis\">\n <p\n class=\"font-title font-medium text-21 text-black break-words mb-1 line-clamp-2\"\n >\n {{ link.name }}\n </p>\n <p class=\"font-medium text-sm break-words\">\n {{ link.description }}\n </p>\n <p\n *ngIf=\"!link.name && !link.description\"\n class=\"font-medium text-sm break-words truncate\"\n >\n {{ link.url }}\n </p>\n </div>\n <div>\n <mat-icon class=\"material-symbols-outlined card-icon\">open_in_new</mat-icon>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26604
- }
26605
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, decorators: [{
26606
- type: Component,
26607
- args: [{ selector: 'gn-ui-link-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group h-40 grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden lg:w-80\"\n>\n <div class=\"max-h-24 overflow-hidden text-ellipsis\">\n <p\n class=\"font-title font-medium text-21 text-black break-words mb-1 line-clamp-2\"\n >\n {{ link.name }}\n </p>\n <p class=\"font-medium text-sm break-words\">\n {{ link.description }}\n </p>\n <p\n *ngIf=\"!link.name && !link.description\"\n class=\"font-medium text-sm break-words truncate\"\n >\n {{ link.url }}\n </p>\n </div>\n <div>\n <mat-icon class=\"material-symbols-outlined card-icon\">open_in_new</mat-icon>\n </div>\n</a>\n" }]
26608
- }], propDecorators: { link: [{
26609
- type: Input
26610
- }] } });
26611
-
26612
- class RelatedRecordCardComponent {
26613
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26614
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RelatedRecordCardComponent, selector: "gn-ui-related-record-card", inputs: { record: "record" }, ngImport: i0, template: "<a\n class=\"w-72 h-96 overflow-hidden rounded-lg bg-white cursor-pointer block hover:-translate-y-2 duration-[180ms]\"\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 }); }
26615
- }
26616
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
26617
- type: Component,
26618
- args: [{ selector: 'gn-ui-related-record-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<a\n class=\"w-72 h-96 overflow-hidden rounded-lg bg-white cursor-pointer block hover:-translate-y-2 duration-[180ms]\"\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" }]
26619
- }], propDecorators: { record: [{
26620
- type: Input
26621
- }] } });
26622
-
26623
- class MetadataContactComponent {
26624
- constructor() {
26625
- this.organizationClick = new EventEmitter();
26626
- this.contactClick = new EventEmitter();
26627
- }
26628
- get shownOrganization() {
26629
- return this.metadata.ownerOrganization;
26630
- }
26631
- get contacts() {
26632
- return ((this.metadata.kind === 'dataset'
26633
- ? this.metadata.contactsForResource
26634
- : this.metadata.contacts) || []);
26635
- }
26636
- get address() {
26637
- const addressParts = this.contacts[0].address
26638
- .split(',')
26639
- .map((part) => part.trim());
26640
- return addressParts;
26641
- }
26642
- onOrganizationClick() {
26643
- this.organizationClick.emit(this.shownOrganization);
26644
- }
26645
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26646
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataContactComponent, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26647
- }
26648
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
26649
- type: Component,
26650
- args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
26651
- }], propDecorators: { metadata: [{
26652
- type: Input
26653
- }], organizationClick: [{
26654
- type: Output
26655
- }], contactClick: [{
26656
- type: Output
26657
- }] } });
26658
-
26659
- class MetadataCatalogComponent {
26660
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataCatalogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26661
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataCatalogComponent, selector: "gn-ui-metadata-catalog", inputs: { sourceLabel: "sourceLabel" }, ngImport: i0, template: "<div>\n <p class=\"text-gray-700 text-xs mb-3 uppercase\" translate>\n record.metadata.catalog\n </p>\n <p class=\"text-primary font-title text-21 mb-1\">\n {{ sourceLabel }}\n </p>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26662
- }
26663
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataCatalogComponent, decorators: [{
26664
- type: Component,
26665
- args: [{ selector: 'gn-ui-metadata-catalog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n <p class=\"text-gray-700 text-xs mb-3 uppercase\" translate>\n record.metadata.catalog\n </p>\n <p class=\"text-primary font-title text-21 mb-1\">\n {{ sourceLabel }}\n </p>\n</div>\n" }]
26666
- }], propDecorators: { sourceLabel: [{
26667
- type: Input
26668
- }] } });
26669
-
26670
- var ErrorType;
26671
- (function (ErrorType) {
26672
- ErrorType[ErrorType["COULD_NOT_REACH_API"] = 0] = "COULD_NOT_REACH_API";
26673
- ErrorType[ErrorType["RECEIVED_ERROR"] = 1] = "RECEIVED_ERROR";
26674
- ErrorType[ErrorType["RECORD_NOT_FOUND"] = 2] = "RECORD_NOT_FOUND";
26675
- })(ErrorType || (ErrorType = {}));
26676
- class SearchResultsErrorComponent {
26677
- constructor() {
26678
- this.types = ErrorType;
26679
- }
26680
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchResultsErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26681
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SearchResultsErrorComponent, selector: "gn-ui-search-results-error", inputs: { type: "type", error: "error", recordId: "recordId" }, ngImport: i0, template: "<div\n class=\"p-[1.7em] bg-red-50 text-red-800 text-[1.5em] text-center rounded-lg\"\n>\n <div *ngIf=\"type === types.COULD_NOT_REACH_API\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">face</mat-icon>\n <mat-icon class=\"material-symbols-outlined question-mark1\"\n >question_mark</mat-icon\n >\n <mat-icon class=\"material-symbols-outlined question-mark2\"\n >question_mark</mat-icon\n >\n </div>\n <div translate>search.error.couldNotReachApi</div>\n </div>\n <div *ngIf=\"type === types.RECEIVED_ERROR\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">mood_bad</mat-icon>\n </div>\n <div translate>search.error.receivedError</div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div *ngIf=\"type === types.RECORD_NOT_FOUND\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined computer\">computer</mat-icon>\n <mat-icon class=\"material-symbols-outlined computer-question-mark\"\n >question_mark</mat-icon\n >\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.recordNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n</div>\n", styles: ["mat-icon{width:auto;height:auto}mat-icon.face{font-size:3em}mat-icon.question-mark1{position:absolute;bottom:1.1em;left:calc(50% + .7em);font-size:1.7em}mat-icon.question-mark2{position:absolute;bottom:1.6em;left:calc(50% + 1.6em);font-size:1.4em}.computer{font-size:3em}.computer-question-mark{position:absolute;top:.6em;left:calc(50% - .5em);font-size:1.2em}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26682
- }
26683
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchResultsErrorComponent, decorators: [{
26684
- type: Component,
26685
- args: [{ selector: 'gn-ui-search-results-error', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"p-[1.7em] bg-red-50 text-red-800 text-[1.5em] text-center rounded-lg\"\n>\n <div *ngIf=\"type === types.COULD_NOT_REACH_API\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">face</mat-icon>\n <mat-icon class=\"material-symbols-outlined question-mark1\"\n >question_mark</mat-icon\n >\n <mat-icon class=\"material-symbols-outlined question-mark2\"\n >question_mark</mat-icon\n >\n </div>\n <div translate>search.error.couldNotReachApi</div>\n </div>\n <div *ngIf=\"type === types.RECEIVED_ERROR\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">mood_bad</mat-icon>\n </div>\n <div translate>search.error.receivedError</div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div *ngIf=\"type === types.RECORD_NOT_FOUND\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined computer\">computer</mat-icon>\n <mat-icon class=\"material-symbols-outlined computer-question-mark\"\n >question_mark</mat-icon\n >\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.recordNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n</div>\n", styles: ["mat-icon{width:auto;height:auto}mat-icon.face{font-size:3em}mat-icon.question-mark1{position:absolute;bottom:1.1em;left:calc(50% + .7em);font-size:1.7em}mat-icon.question-mark2{position:absolute;bottom:1.6em;left:calc(50% + 1.6em);font-size:1.4em}.computer{font-size:3em}.computer-question-mark{position:absolute;top:.6em;left:calc(50% - .5em);font-size:1.2em}\n"] }]
26686
- }], propDecorators: { type: [{
26687
- type: Input
26688
- }], error: [{
26689
- type: Input
26690
- }], recordId: [{
26691
- type: Input
26692
- }] } });
26693
-
26694
- class PaginationComponent {
26695
- constructor() {
26696
- this.currentPage = 1;
26697
- this.nPages = 1;
26698
- this.hideButton = false;
26699
- this.newCurrentPageEvent = new EventEmitter();
27019
+ /**
27020
+ * This component will make a block that will stay sticky on the top of the page,
27021
+ * but will also shrink down to a minimum height when scrolling.
27022
+ * The ratio between minimum and nominal height is stored in the shrinkRatio
27023
+ * property, and can be used to change e.g. the opacity or size of child elements.
27024
+ * This component renders at z-index: 50 by default.
27025
+ * The first parent element with an overflow of `scroll` or `overflow` is considered
27026
+ * for scroll events.
27027
+ */
27028
+ class StickyHeaderComponent {
27029
+ constructor(changeDetector, hostEl, zone) {
27030
+ this.changeDetector = changeDetector;
27031
+ this.hostEl = hostEl;
27032
+ this.zone = zone;
26700
27033
  }
26701
- applyPageBounds() {
26702
- // make sure this works with NaN inputs as well by adding `|| 1`
26703
- this.nPages = Math.max(1, this.nPages || 1);
26704
- this.currentPage = Math.max(1, Math.min(this.nPages, this.currentPage || 1));
27034
+ ngAfterViewInit() {
27035
+ this.scrollSub = fromEvent(window, 'scroll', {
27036
+ passive: true,
27037
+ })
27038
+ .pipe(throttleTime(0, animationFrameScheduler, {
27039
+ leading: true,
27040
+ trailing: true,
27041
+ }))
27042
+ .subscribe(this.updateSize.bind(this));
26705
27043
  }
26706
- ngOnChanges(changes) {
26707
- // make sure the inputs are valid
26708
- if ('currentPage' in changes || 'nPages' in changes) {
26709
- this.applyPageBounds();
26710
- }
27044
+ ngOnInit() {
27045
+ this.placeholderEl = document.createElement('div');
27046
+ this.placeholderEl.style.position = 'absolute';
27047
+ this.placeholderEl.classList.add('sticky-header-placeholder');
27048
+ this.hostEl.nativeElement.insertAdjacentElement('beforebegin', this.placeholderEl);
26711
27049
  }
26712
- setPage(newPage) {
26713
- if (!Number.isInteger(newPage))
26714
- return;
26715
- this.currentPage = newPage;
26716
- this.applyPageBounds();
26717
- this.newCurrentPageEvent.emit(this.currentPage);
27050
+ ngAfterViewChecked() {
27051
+ this.updateSize();
26718
27052
  }
26719
- nextPage() {
26720
- this.setPage(this.currentPage + 1);
27053
+ ngOnDestroy() {
27054
+ this.scrollSub.unsubscribe();
27055
+ this.placeholderEl.remove();
26721
27056
  }
26722
- previousPage() {
26723
- this.setPage(this.currentPage - 1);
27057
+ updateSize() {
27058
+ this.zone.runOutsideAngular(() => {
27059
+ if (window.scrollY === this.parentScroll)
27060
+ return;
27061
+ this.parentScroll = window.scrollY;
27062
+ const offsetTop = Math.max(0, this.parentScroll - this.placeholderEl.offsetTop);
27063
+ const newHeightPx = Math.max(this.minHeightPx, this.fullHeightPx - offsetTop);
27064
+ this.innerContainer.nativeElement.style.transform = `translate(0, ${newHeightPx - this.fullHeightPx}px)`;
27065
+ this.expandRatio =
27066
+ (newHeightPx - this.minHeightPx) /
27067
+ (this.fullHeightPx - this.minHeightPx);
27068
+ this.changeDetector.detectChanges();
27069
+ });
26724
27070
  }
26725
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26726
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: PaginationComponent, selector: "gn-ui-pagination", inputs: { currentPage: "currentPage", nPages: "nPages", hideButton: "hideButton" }, outputs: { newCurrentPageEvent: "newCurrentPageEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <div class=\"sm:absolute sm:inset-0\" *ngIf=\"!hideButton\">\n <gn-ui-button\n (buttonClick)=\"nextPage()\"\n type=\"secondary\"\n [disabled]=\"currentPage === nPages\"\n extraClass=\"lg:m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >pagination.nextPage</span\n >\n </gn-ui-button>\n </div>\n <div\n class=\"relative pointer-events-none flex flex-row justify-start sm:justify-end\"\n >\n <div class=\"pointer-events-auto flex flex-row items-center py-[13px]\">\n <span class=\"mr-3 capitalize text-sm text-gray-900\" translate\n >pagination.page</span\n >\n <input\n type=\"number\"\n [ngModel]=\"currentPage\"\n [min]=\"1\"\n [max]=\"nPages\"\n (ngModelChange)=\"setPage($event)\"\n class=\"border border-gray-300 rounded w-[54px] h-[34px] pl-[12px] mr-3 text-center\"\n />\n <span class=\"mr-3 text-sm text-gray-900\"\n ><span translate>pagination.pageOf</span> {{ nPages }}</span\n >\n <gn-ui-button\n (buttonClick)=\"previousPage()\"\n id=\"navigate_previous\"\n class=\"mr-2\"\n [disabled]=\"currentPage === 1\"\n [type]=\"'light'\"\n extraClass=\"!px-[3px]\"\n data-cy=\"prev-page\"\n >\n <mat-icon class=\"material-symbols-outlined\">navigate_before</mat-icon>\n </gn-ui-button>\n <gn-ui-button\n (buttonClick)=\"nextPage()\"\n id=\"navigate_next\"\n [disabled]=\"currentPage === nPages\"\n [type]=\"'light'\"\n extraClass=\"!px-[3px]\"\n data-cy=\"next-page\"\n >\n <mat-icon class=\"material-symbols-outlined\">navigate_next</mat-icon>\n </gn-ui-button>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2$1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27071
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StickyHeaderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef, host: true }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
27072
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: StickyHeaderComponent, selector: "gn-ui-sticky-header", inputs: { minHeightPx: "minHeightPx", fullHeightPx: "fullHeightPx" }, queries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "outerContainer", first: true, predicate: ["outerContainer"], descendants: true }, { propertyName: "innerContainer", first: true, predicate: ["innerContainer"], descendants: true }], ngImport: i0, template: "<div\n #outerContainer\n class=\"sticky pointer-events-none z-50 top-0\"\n [style.height]=\"fullHeightPx + 'px'\"\n>\n <div\n #innerContainer\n class=\"relative pointer-events-auto\"\n [style.height]=\"fullHeightPx + 'px'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: expandRatio }\"\n ></ng-container>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26727
27073
  }
26728
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginationComponent, decorators: [{
27074
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StickyHeaderComponent, decorators: [{
26729
27075
  type: Component,
26730
- args: [{ selector: 'gn-ui-pagination', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"relative\">\n <div class=\"sm:absolute sm:inset-0\" *ngIf=\"!hideButton\">\n <gn-ui-button\n (buttonClick)=\"nextPage()\"\n type=\"secondary\"\n [disabled]=\"currentPage === nPages\"\n extraClass=\"lg:m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >pagination.nextPage</span\n >\n </gn-ui-button>\n </div>\n <div\n class=\"relative pointer-events-none flex flex-row justify-start sm:justify-end\"\n >\n <div class=\"pointer-events-auto flex flex-row items-center py-[13px]\">\n <span class=\"mr-3 capitalize text-sm text-gray-900\" translate\n >pagination.page</span\n >\n <input\n type=\"number\"\n [ngModel]=\"currentPage\"\n [min]=\"1\"\n [max]=\"nPages\"\n (ngModelChange)=\"setPage($event)\"\n class=\"border border-gray-300 rounded w-[54px] h-[34px] pl-[12px] mr-3 text-center\"\n />\n <span class=\"mr-3 text-sm text-gray-900\"\n ><span translate>pagination.pageOf</span> {{ nPages }}</span\n >\n <gn-ui-button\n (buttonClick)=\"previousPage()\"\n id=\"navigate_previous\"\n class=\"mr-2\"\n [disabled]=\"currentPage === 1\"\n [type]=\"'light'\"\n extraClass=\"!px-[3px]\"\n data-cy=\"prev-page\"\n >\n <mat-icon class=\"material-symbols-outlined\">navigate_before</mat-icon>\n </gn-ui-button>\n <gn-ui-button\n (buttonClick)=\"nextPage()\"\n id=\"navigate_next\"\n [disabled]=\"currentPage === nPages\"\n [type]=\"'light'\"\n extraClass=\"!px-[3px]\"\n data-cy=\"next-page\"\n >\n <mat-icon class=\"material-symbols-outlined\">navigate_next</mat-icon>\n </gn-ui-button>\n </div>\n </div>\n</div>\n" }]
26731
- }], propDecorators: { currentPage: [{
26732
- type: Input
26733
- }], nPages: [{
27076
+ args: [{ selector: 'gn-ui-sticky-header', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #outerContainer\n class=\"sticky pointer-events-none z-50 top-0\"\n [style.height]=\"fullHeightPx + 'px'\"\n>\n <div\n #innerContainer\n class=\"relative pointer-events-auto\"\n [style.height]=\"fullHeightPx + 'px'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: expandRatio }\"\n ></ng-container>\n </div>\n</div>\n" }]
27077
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef, decorators: [{
27078
+ type: Host
27079
+ }] }, { type: i0.NgZone }]; }, propDecorators: { minHeightPx: [{
26734
27080
  type: Input
26735
- }], hideButton: [{
27081
+ }], fullHeightPx: [{
26736
27082
  type: Input
26737
- }], newCurrentPageEvent: [{
26738
- type: Output
27083
+ }], template: [{
27084
+ type: ContentChild,
27085
+ args: [TemplateRef]
27086
+ }], outerContainer: [{
27087
+ type: ViewChild,
27088
+ args: ['outerContainer']
27089
+ }], innerContainer: [{
27090
+ type: ViewChild,
27091
+ args: ['innerContainer']
26739
27092
  }] } });
26740
27093
 
26741
- class AvatarComponent {
26742
- hideImage() {
26743
- this.avatarUrl = this.avatarPlaceholder;
26744
- }
26745
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26746
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AvatarComponent, selector: "gn-ui-avatar", inputs: { avatarUrl: "avatarUrl", avatarPlaceholder: "avatarPlaceholder" }, ngImport: i0, template: "<img\n *ngIf=\"avatarUrl\"\n class=\"rounded-full object-cover\"\n [src]=\"avatarUrl\"\n (error)=\"hideImage()\"\n/>\n<div\n *ngIf=\"!avatarUrl\"\n class=\"w-full h-full rounded-full bg-gradient-to-tr from-primary to-slate-200\"\n></div>\n", dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27094
+ class UiLayoutModule {
27095
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
27096
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, declarations: [ExpandablePanelComponent,
27097
+ StickyHeaderComponent,
27098
+ AnchorLinkDirective,
27099
+ ExpandablePanelButtonComponent,
27100
+ CarouselComponent], imports: [CommonModule, MatIconModule, i1$1.TranslateModule], exports: [ExpandablePanelComponent,
27101
+ StickyHeaderComponent,
27102
+ AnchorLinkDirective,
27103
+ ExpandablePanelButtonComponent,
27104
+ CarouselComponent] }); }
27105
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, imports: [CommonModule, MatIconModule, TranslateModule.forChild()] }); }
26747
27106
  }
26748
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AvatarComponent, decorators: [{
26749
- type: Component,
26750
- args: [{ selector: 'gn-ui-avatar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<img\n *ngIf=\"avatarUrl\"\n class=\"rounded-full object-cover\"\n [src]=\"avatarUrl\"\n (error)=\"hideImage()\"\n/>\n<div\n *ngIf=\"!avatarUrl\"\n class=\"w-full h-full rounded-full bg-gradient-to-tr from-primary to-slate-200\"\n></div>\n" }]
26751
- }], propDecorators: { avatarUrl: [{
26752
- type: Input
26753
- }], avatarPlaceholder: [{
26754
- type: Input
26755
- }] } });
27107
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, decorators: [{
27108
+ type: NgModule,
27109
+ args: [{
27110
+ imports: [CommonModule, MatIconModule, TranslateModule.forChild()],
27111
+ declarations: [
27112
+ ExpandablePanelComponent,
27113
+ StickyHeaderComponent,
27114
+ AnchorLinkDirective,
27115
+ ExpandablePanelButtonComponent,
27116
+ CarouselComponent,
27117
+ ],
27118
+ exports: [
27119
+ ExpandablePanelComponent,
27120
+ StickyHeaderComponent,
27121
+ AnchorLinkDirective,
27122
+ ExpandablePanelButtonComponent,
27123
+ CarouselComponent,
27124
+ ],
27125
+ }]
27126
+ }] });
26756
27127
 
26757
27128
  class UserPreviewComponent {
26758
27129
  get userFullName() {
@@ -26770,149 +27141,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26770
27141
  type: Input
26771
27142
  }] } });
26772
27143
 
26773
- class PaginationButtonsComponent {
26774
- constructor() {
26775
- this.visiblePages = [];
26776
- this.newCurrentPageEvent = new EventEmitter();
26777
- }
26778
- ngOnChanges() {
26779
- this.calculateVisiblePages();
26780
- }
26781
- calculateVisiblePages() {
26782
- const maxVisiblePages = 5;
26783
- const halfVisible = Math.floor(maxVisiblePages / 2);
26784
- const startPage = Math.max(this.currentPage - halfVisible, 1);
26785
- const endPage = Math.min(this.currentPage + halfVisible, this.totalPages);
26786
- const visiblePages = [];
26787
- if (startPage > 1) {
26788
- visiblePages.push(1);
26789
- if (startPage > 2) {
26790
- visiblePages.push('...');
26791
- }
26792
- }
26793
- for (let page = startPage; page <= endPage; page++) {
26794
- visiblePages.push(page);
26795
- }
26796
- if (endPage < this.totalPages) {
26797
- if (endPage < this.totalPages - 1) {
26798
- visiblePages.push('...');
26799
- }
26800
- visiblePages.push(this.totalPages);
26801
- }
26802
- this.visiblePages = visiblePages;
26803
- }
26804
- changePage(page) {
26805
- this.setPage(page);
26806
- }
26807
- nextPage() {
26808
- this.setPage(this.currentPage + 1);
26809
- }
26810
- previousPage() {
26811
- this.setPage(this.currentPage - 1);
26812
- }
26813
- setPage(newPage) {
26814
- if (!Number.isInteger(newPage))
26815
- return;
26816
- this.currentPage = newPage;
26817
- this.calculateVisiblePages();
26818
- this.newCurrentPageEvent.emit(this.currentPage);
26819
- }
26820
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginationButtonsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26821
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: PaginationButtonsComponent, selector: "gn-ui-pagination-buttons", inputs: { currentPage: "currentPage", totalPages: "totalPages" }, outputs: { newCurrentPageEvent: "newCurrentPageEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <div class=\"flex flex-row gap-[5px] items-center\">\n <gn-ui-button\n type=\"light\"\n [disabled]=\"currentPage === 1\"\n (buttonClick)=\"previousPage()\"\n extraClass=\"!px-[3px]\"\n >\n <mat-icon class=\"material-symbols-outlined\">chevron_left</mat-icon>\n </gn-ui-button>\n <ng-container *ngFor=\"let page of visiblePages\">\n <ng-container *ngIf=\"page === '...'\">\n <span class=\"mx-[5px]\">{{ page }}</span>\n </ng-container>\n <ng-container *ngIf=\"page !== '...'\">\n <gn-ui-button\n [type]=\"page === currentPage ? 'primary' : 'light'\"\n [disabled]=\"page === currentPage\"\n (buttonClick)=\"changePage(page)\"\n >{{ page }}</gn-ui-button\n >\n </ng-container>\n </ng-container>\n <gn-ui-button\n type=\"light\"\n [disabled]=\"currentPage === totalPages\"\n (buttonClick)=\"nextPage()\"\n extraClass=\"!px-[3px]\"\n >\n <mat-icon class=\"material-symbols-outlined\">chevron_right</mat-icon>\n </gn-ui-button>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }] }); }
26822
- }
26823
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginationButtonsComponent, decorators: [{
26824
- type: Component,
26825
- args: [{ selector: 'gn-ui-pagination-buttons', template: "<div class=\"relative\">\n <div class=\"flex flex-row gap-[5px] items-center\">\n <gn-ui-button\n type=\"light\"\n [disabled]=\"currentPage === 1\"\n (buttonClick)=\"previousPage()\"\n extraClass=\"!px-[3px]\"\n >\n <mat-icon class=\"material-symbols-outlined\">chevron_left</mat-icon>\n </gn-ui-button>\n <ng-container *ngFor=\"let page of visiblePages\">\n <ng-container *ngIf=\"page === '...'\">\n <span class=\"mx-[5px]\">{{ page }}</span>\n </ng-container>\n <ng-container *ngIf=\"page !== '...'\">\n <gn-ui-button\n [type]=\"page === currentPage ? 'primary' : 'light'\"\n [disabled]=\"page === currentPage\"\n (buttonClick)=\"changePage(page)\"\n >{{ page }}</gn-ui-button\n >\n </ng-container>\n </ng-container>\n <gn-ui-button\n type=\"light\"\n [disabled]=\"currentPage === totalPages\"\n (buttonClick)=\"nextPage()\"\n extraClass=\"!px-[3px]\"\n >\n <mat-icon class=\"material-symbols-outlined\">chevron_right</mat-icon>\n </gn-ui-button>\n </div>\n</div>\n" }]
26826
- }], propDecorators: { currentPage: [{
26827
- type: Input
26828
- }], totalPages: [{
26829
- type: Input
26830
- }], newCurrentPageEvent: [{
26831
- type: Output
26832
- }] } });
26833
-
26834
- const DEFAULT_PARAMS = {
26835
- OFFSET: '',
26836
- LIMIT: '-1',
26837
- FORMAT: 'json',
26838
- };
26839
- class RecordApiFormComponent {
26840
- constructor() {
26841
- this.offset$ = new BehaviorSubject('');
26842
- this.limit$ = new BehaviorSubject('');
26843
- this.format$ = new BehaviorSubject('');
26844
- this.formatsList = [
26845
- { label: 'JSON', value: 'json' },
26846
- { label: 'CSV', value: 'csv' },
26847
- ];
26848
- this.apiQueryUrl$ = combineLatest([this.offset$, this.limit$, this.format$]).pipe(map$2(([offset, limit, format]) => {
26849
- let outputUrl;
26850
- if (this.apiBaseUrl) {
26851
- const url = new URL(this.apiBaseUrl);
26852
- const params = { offset: offset, limit: limit, f: format };
26853
- for (const [key, value] of Object.entries(params)) {
26854
- if (value && value !== '0') {
26855
- url.searchParams.set(key, value);
26856
- }
26857
- else {
26858
- url.searchParams.delete(key);
26859
- }
26860
- }
26861
- outputUrl = url.toString();
26862
- }
26863
- return outputUrl;
26864
- }));
26865
- this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
26866
- this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
26867
- }
26868
- set apiLink(value) {
26869
- this.apiBaseUrl = value ? value.url.href : undefined;
26870
- this.resetUrl();
26871
- }
26872
- setOffset(value) {
26873
- this.offset$.next(value);
26874
- }
26875
- setLimit(value) {
26876
- const newLimit = value === '' ? '-1' : value;
26877
- this.limit$.next(newLimit);
26878
- }
26879
- setFormat(value) {
26880
- this.format$.next(String(value));
26881
- }
26882
- resetUrl() {
26883
- this.offset$.next(DEFAULT_PARAMS.OFFSET);
26884
- this.limit$.next(DEFAULT_PARAMS.LIMIT);
26885
- this.format$.next(DEFAULT_PARAMS.FORMAT);
26886
- }
26887
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26888
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26889
- }
26890
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
26891
- type: Component,
26892
- args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
26893
- }], propDecorators: { apiLink: [{
26894
- type: Input
26895
- }] } });
26896
-
26897
- class ImageOverlayPreviewComponent {
26898
- constructor() {
26899
- this.isPlaceholderShown = new EventEmitter();
26900
- }
26901
- openLightbox(src) {
26902
- basicLightbox.create(`<img src="${src}"/>`).show();
26903
- }
26904
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26905
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ImageOverlayPreviewComponent, selector: "gn-ui-image-overlay-preview", inputs: { imageUrl: "imageUrl" }, outputs: { isPlaceholderShown: "isPlaceholderShown" }, ngImport: i0, template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-48 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n [showContent]=\"imageUrl !== undefined\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }] }); }
26906
- }
26907
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
26908
- type: Component,
26909
- args: [{ selector: 'gn-ui-image-overlay-preview', template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-48 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n [showContent]=\"imageUrl !== undefined\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n" }]
26910
- }], propDecorators: { imageUrl: [{
26911
- type: Input
26912
- }], isPlaceholderShown: [{
26913
- type: Output
26914
- }] } });
26915
-
26916
27144
  class UiElementsModule {
26917
27145
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26918
27146
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, declarations: [MetadataInfoComponent,
@@ -26928,7 +27156,6 @@ class UiElementsModule {
26928
27156
  MetadataQualityItemComponent,
26929
27157
  SearchResultsErrorComponent,
26930
27158
  PaginationComponent,
26931
- ThumbnailComponent,
26932
27159
  AvatarComponent,
26933
27160
  UserPreviewComponent,
26934
27161
  GnUiLinkifyDirective,
@@ -26944,7 +27171,8 @@ class UiElementsModule {
26944
27171
  UiInputsModule,
26945
27172
  FormsModule,
26946
27173
  NgOptimizedImage,
26947
- MarkdownParserComponent], exports: [MetadataInfoComponent,
27174
+ MarkdownParserComponent,
27175
+ ThumbnailComponent], exports: [MetadataInfoComponent,
26948
27176
  ContentGhostComponent,
26949
27177
  DownloadItemComponent,
26950
27178
  DownloadsListComponent,
@@ -26974,7 +27202,8 @@ class UiElementsModule {
26974
27202
  UtilSharedModule,
26975
27203
  RouterModule,
26976
27204
  UiInputsModule,
26977
- FormsModule] }); }
27205
+ FormsModule,
27206
+ ThumbnailComponent] }); }
26978
27207
  }
26979
27208
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, decorators: [{
26980
27209
  type: NgModule,
@@ -26992,6 +27221,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26992
27221
  FormsModule,
26993
27222
  NgOptimizedImage,
26994
27223
  MarkdownParserComponent,
27224
+ ThumbnailComponent,
26995
27225
  ],
26996
27226
  declarations: [
26997
27227
  MetadataInfoComponent,
@@ -27007,7 +27237,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27007
27237
  MetadataQualityItemComponent,
27008
27238
  SearchResultsErrorComponent,
27009
27239
  PaginationComponent,
27010
- ThumbnailComponent,
27011
27240
  AvatarComponent,
27012
27241
  UserPreviewComponent,
27013
27242
  GnUiLinkifyDirective,
@@ -31092,7 +31321,7 @@ class DataService {
31092
31321
  }), {}),
31093
31322
  geojson: endpoint.supportsJson(featureType.name)
31094
31323
  ? endpoint.getFeatureUrl(featureType.name, {
31095
- outputFormat: 'application/json',
31324
+ asJson: true,
31096
31325
  outputCrs: 'EPSG:4326',
31097
31326
  })
31098
31327
  : null,
@@ -32428,6 +32657,99 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32428
32657
  type: Injectable
32429
32658
  }] });
32430
32659
 
32660
+ function evaluate(expression) {
32661
+ if (expression.match(/^\${.*}$/)) {
32662
+ return evaluate(expression.slice(2, -1));
32663
+ }
32664
+ const operator = expression.split('(')[0];
32665
+ switch (operator) {
32666
+ case 'dateNow':
32667
+ return () => new Date();
32668
+ default:
32669
+ throw new Error(`Unknown operator: ${operator}`);
32670
+ }
32671
+ }
32672
+
32673
+ class EditorService {
32674
+ constructor(http, apiConfiguration) {
32675
+ this.http = http;
32676
+ this.apiConfiguration = apiConfiguration;
32677
+ this.apiUrl = `${this.apiConfiguration?.basePath || '/geonetwork/srv/api'}`;
32678
+ }
32679
+ // TODO: use the catalog repository instead
32680
+ loadRecordByUuid(uuid) {
32681
+ return this.http
32682
+ .get(`${this.apiUrl}/records/${uuid}/formatters/xml`, {
32683
+ responseType: 'text',
32684
+ headers: {
32685
+ Accept: 'application/xml',
32686
+ },
32687
+ })
32688
+ .pipe(switchMap$1((response) => findConverterForDocument(response).readRecord(response.toString())));
32689
+ }
32690
+ // returns the record as it was when saved
32691
+ saveRecord(record, fieldsConfig) {
32692
+ const savedRecord = { ...record };
32693
+ // run onSave processes
32694
+ for (const field of fieldsConfig) {
32695
+ if (field.onSaveProcess && field.model) {
32696
+ const evaluator = evaluate(field.onSaveProcess);
32697
+ savedRecord[field.model] = evaluator({
32698
+ config: field,
32699
+ value: record[field.model],
32700
+ });
32701
+ }
32702
+ }
32703
+ // TODO: use the catalog repository instead
32704
+ // TODO: use converter based on the format of the record before change
32705
+ return from(new Iso19139Converter().writeRecord(savedRecord)).pipe(switchMap$1((recordXml) => this.http.put(`${this.apiUrl}/records?metadataType=METADATA&uuidProcessing=OVERWRITE&transformWith=_none_&publishToAll=on`, recordXml, {
32706
+ headers: {
32707
+ 'Content-Type': 'application/xml',
32708
+ },
32709
+ withCredentials: true,
32710
+ })), map$1(() => savedRecord));
32711
+ }
32712
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, deps: [{ token: i1.HttpClient }, { token: Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
32713
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, providedIn: 'root' }); }
32714
+ }
32715
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, decorators: [{
32716
+ type: Injectable,
32717
+ args: [{
32718
+ providedIn: 'root',
32719
+ }]
32720
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: Configuration, decorators: [{
32721
+ type: Optional
32722
+ }, {
32723
+ type: Inject,
32724
+ args: [Configuration]
32725
+ }] }]; } });
32726
+
32727
+ class EditorEffects {
32728
+ constructor() {
32729
+ this.actions$ = inject(Actions);
32730
+ this.editorService = inject(EditorService);
32731
+ this.store = inject(Store);
32732
+ this.saveRecord$ = createEffect(() => this.actions$.pipe(ofType(saveRecord), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordFieldsConfig)), switchMap$1(([, record, fieldsConfig]) => this.editorService.saveRecord(record, fieldsConfig).pipe(switchMap$1((newRecord) => of(saveRecordSuccess(), openRecord({ record: newRecord }))), catchError((error) => of(saveRecordFailure({
32733
+ error: error.message,
32734
+ })))))));
32735
+ this.markAsChanged$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField), map$1(() => markRecordAsChanged())));
32736
+ }
32737
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
32738
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorEffects }); }
32739
+ }
32740
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorEffects, decorators: [{
32741
+ type: Injectable
32742
+ }] });
32743
+
32744
+ var WizardFieldType;
32745
+ (function (WizardFieldType) {
32746
+ WizardFieldType[WizardFieldType["TEXT"] = 0] = "TEXT";
32747
+ WizardFieldType[WizardFieldType["TEXT_AREA"] = 1] = "TEXT_AREA";
32748
+ WizardFieldType[WizardFieldType["CHIPS"] = 2] = "CHIPS";
32749
+ WizardFieldType[WizardFieldType["DATA_PICKER"] = 3] = "DATA_PICKER";
32750
+ WizardFieldType[WizardFieldType["DROPDOWN"] = 4] = "DROPDOWN";
32751
+ })(WizardFieldType || (WizardFieldType = {}));
32752
+
32431
32753
  class WizardService {
32432
32754
  constructor(translateService) {
32433
32755
  this.translateService = translateService;
@@ -32511,15 +32833,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32511
32833
  }]
32512
32834
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
32513
32835
 
32514
- var WizardFieldType;
32515
- (function (WizardFieldType) {
32516
- WizardFieldType[WizardFieldType["TEXT"] = 0] = "TEXT";
32517
- WizardFieldType[WizardFieldType["TEXT_AREA"] = 1] = "TEXT_AREA";
32518
- WizardFieldType[WizardFieldType["CHIPS"] = 2] = "CHIPS";
32519
- WizardFieldType[WizardFieldType["DATA_PICKER"] = 3] = "DATA_PICKER";
32520
- WizardFieldType[WizardFieldType["DROPDOWN"] = 4] = "DROPDOWN";
32521
- })(WizardFieldType || (WizardFieldType = {}));
32522
-
32523
32836
  marker('datafeeder.month.january');
32524
32837
  marker('datafeeder.month.february');
32525
32838
  marker('datafeeder.month.march');
@@ -32678,6 +32991,52 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32678
32991
  args: ['dropdown']
32679
32992
  }] } });
32680
32993
 
32994
+ class WizardSummarizeComponent {
32995
+ get title() {
32996
+ return this.wizardService.getWizardFieldData('title') || '';
32997
+ }
32998
+ get abstract() {
32999
+ return this.wizardService.getWizardFieldData('abstract') || '';
33000
+ }
33001
+ get tags() {
33002
+ if (!this.wizardService.getWizardFieldData('tags')) {
33003
+ return '';
33004
+ }
33005
+ return JSON.parse(this.wizardService.getWizardFieldData('tags'))
33006
+ .map((t) => t.display)
33007
+ .join(' - ');
33008
+ }
33009
+ get createdDate() {
33010
+ const time = this.wizardService.getWizardFieldData('datepicker');
33011
+ const locale = this.translateService.currentLang;
33012
+ return new Date(Number(time)).toLocaleDateString(locale, {
33013
+ year: 'numeric',
33014
+ month: 'long',
33015
+ day: 'numeric',
33016
+ });
33017
+ }
33018
+ get scale() {
33019
+ if (!this.wizardService.getWizardFieldData('dropdown')) {
33020
+ return '';
33021
+ }
33022
+ const scaleValue = JSON.parse(this.wizardService.getWizardFieldData('dropdown'));
33023
+ return `1:${scaleValue}`;
33024
+ }
33025
+ get description() {
33026
+ return this.wizardService.getWizardFieldData('description') || '';
33027
+ }
33028
+ constructor(wizardService, translateService) {
33029
+ this.wizardService = wizardService;
33030
+ this.translateService = translateService;
33031
+ }
33032
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: WizardSummarizeComponent, deps: [{ token: WizardService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
33033
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: WizardSummarizeComponent, selector: "gn-ui-wizard-summarize", ngImport: i0, template: "<div>\n <div class=\"text-2xl font-bold title\">\n {{ title | uppercase }}\n </div>\n <div class=\"text-lg font-bold pt-2 abstract\">\n {{ abstract }}\n </div>\n <div class=\"text-lg font-normal\">\n <span translate>datafeeder.wizardSummarize.createdAt</span>\n &nbsp;<span class=\"date\">{{ createdDate }}</span> -\n <span translate>datafeeder.wizardSummarize.scale</span>\n &nbsp;<span class=\"scale\">{{ scale }}</span>\n </div>\n <div class=\"text-lg italic font-normal description\">\n {{ description }}\n </div>\n <div class=\"text-sm font-medium pt-4 tags\">\n <span class=\"icon-tag pr-2\"></span>\n {{ tags }}\n </div>\n</div>\n", styles: [".icon-tag:before{font-size:18px}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i1$3.UpperCasePipe, name: "uppercase" }] }); }
33034
+ }
33035
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: WizardSummarizeComponent, decorators: [{
33036
+ type: Component,
33037
+ args: [{ selector: 'gn-ui-wizard-summarize', template: "<div>\n <div class=\"text-2xl font-bold title\">\n {{ title | uppercase }}\n </div>\n <div class=\"text-lg font-bold pt-2 abstract\">\n {{ abstract }}\n </div>\n <div class=\"text-lg font-normal\">\n <span translate>datafeeder.wizardSummarize.createdAt</span>\n &nbsp;<span class=\"date\">{{ createdDate }}</span> -\n <span translate>datafeeder.wizardSummarize.scale</span>\n &nbsp;<span class=\"scale\">{{ scale }}</span>\n </div>\n <div class=\"text-lg italic font-normal description\">\n {{ description }}\n </div>\n <div class=\"text-sm font-medium pt-4 tags\">\n <span class=\"icon-tag pr-2\"></span>\n {{ tags }}\n </div>\n</div>\n", styles: [".icon-tag:before{font-size:18px}\n"] }]
33038
+ }], ctorParameters: function () { return [{ type: WizardService }, { type: i1$1.TranslateService }]; } });
33039
+
32681
33040
  class WizardComponent {
32682
33041
  constructor(wizardService, translate) {
32683
33042
  this.wizardService = wizardService;
@@ -32743,136 +33102,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32743
33102
  args: ['wizardFields']
32744
33103
  }] } });
32745
33104
 
32746
- class WizardSummarizeComponent {
32747
- get title() {
32748
- return this.wizardService.getWizardFieldData('title') || '';
32749
- }
32750
- get abstract() {
32751
- return this.wizardService.getWizardFieldData('abstract') || '';
32752
- }
32753
- get tags() {
32754
- if (!this.wizardService.getWizardFieldData('tags')) {
32755
- return '';
32756
- }
32757
- return JSON.parse(this.wizardService.getWizardFieldData('tags'))
32758
- .map((t) => t.display)
32759
- .join(' - ');
32760
- }
32761
- get createdDate() {
32762
- const time = this.wizardService.getWizardFieldData('datepicker');
32763
- const locale = this.translateService.currentLang;
32764
- return new Date(Number(time)).toLocaleDateString(locale, {
32765
- year: 'numeric',
32766
- month: 'long',
32767
- day: 'numeric',
32768
- });
32769
- }
32770
- get scale() {
32771
- if (!this.wizardService.getWizardFieldData('dropdown')) {
32772
- return '';
32773
- }
32774
- const scaleValue = JSON.parse(this.wizardService.getWizardFieldData('dropdown'));
32775
- return `1:${scaleValue}`;
32776
- }
32777
- get description() {
32778
- return this.wizardService.getWizardFieldData('description') || '';
32779
- }
32780
- constructor(wizardService, translateService) {
32781
- this.wizardService = wizardService;
32782
- this.translateService = translateService;
32783
- }
32784
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: WizardSummarizeComponent, deps: [{ token: WizardService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
32785
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: WizardSummarizeComponent, selector: "gn-ui-wizard-summarize", ngImport: i0, template: "<div>\n <div class=\"text-2xl font-bold title\">\n {{ title | uppercase }}\n </div>\n <div class=\"text-lg font-bold pt-2 abstract\">\n {{ abstract }}\n </div>\n <div class=\"text-lg font-normal\">\n <span translate>datafeeder.wizardSummarize.createdAt</span>\n &nbsp;<span class=\"date\">{{ createdDate }}</span> -\n <span translate>datafeeder.wizardSummarize.scale</span>\n &nbsp;<span class=\"scale\">{{ scale }}</span>\n </div>\n <div class=\"text-lg italic font-normal description\">\n {{ description }}\n </div>\n <div class=\"text-sm font-medium pt-4 tags\">\n <span class=\"icon-tag pr-2\"></span>\n {{ tags }}\n </div>\n</div>\n", styles: [".icon-tag:before{font-size:18px}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i1$3.UpperCasePipe, name: "uppercase" }] }); }
32786
- }
32787
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: WizardSummarizeComponent, decorators: [{
32788
- type: Component,
32789
- args: [{ selector: 'gn-ui-wizard-summarize', template: "<div>\n <div class=\"text-2xl font-bold title\">\n {{ title | uppercase }}\n </div>\n <div class=\"text-lg font-bold pt-2 abstract\">\n {{ abstract }}\n </div>\n <div class=\"text-lg font-normal\">\n <span translate>datafeeder.wizardSummarize.createdAt</span>\n &nbsp;<span class=\"date\">{{ createdDate }}</span> -\n <span translate>datafeeder.wizardSummarize.scale</span>\n &nbsp;<span class=\"scale\">{{ scale }}</span>\n </div>\n <div class=\"text-lg italic font-normal description\">\n {{ description }}\n </div>\n <div class=\"text-sm font-medium pt-4 tags\">\n <span class=\"icon-tag pr-2\"></span>\n {{ tags }}\n </div>\n</div>\n", styles: [".icon-tag:before{font-size:18px}\n"] }]
32790
- }], ctorParameters: function () { return [{ type: WizardService }, { type: i1$1.TranslateService }]; } });
32791
-
32792
- function evaluate(expression) {
32793
- if (expression.match(/^\${.*}$/)) {
32794
- return evaluate(expression.slice(2, -1));
32795
- }
32796
- const operator = expression.split('(')[0];
32797
- switch (operator) {
32798
- case 'dateNow':
32799
- return () => new Date();
32800
- default:
32801
- throw new Error(`Unknown operator: ${operator}`);
32802
- }
32803
- }
32804
-
32805
- class EditorService {
32806
- constructor(http, apiConfiguration) {
32807
- this.http = http;
32808
- this.apiConfiguration = apiConfiguration;
32809
- this.apiUrl = `${this.apiConfiguration?.basePath || '/geonetwork/srv/api'}`;
32810
- }
32811
- // TODO: use the catalog repository instead
32812
- loadRecordByUuid(uuid) {
32813
- return this.http
32814
- .get(`${this.apiUrl}/records/${uuid}/formatters/xml`, {
32815
- responseType: 'text',
32816
- headers: {
32817
- Accept: 'application/xml',
32818
- },
32819
- })
32820
- .pipe(switchMap$1((response) => findConverterForDocument(response).readRecord(response.toString())));
32821
- }
32822
- // returns the record as it was when saved
32823
- saveRecord(record, fieldsConfig) {
32824
- const savedRecord = { ...record };
32825
- // run onSave processes
32826
- for (const field of fieldsConfig) {
32827
- if (field.onSaveProcess && field.model) {
32828
- const evaluator = evaluate(field.onSaveProcess);
32829
- savedRecord[field.model] = evaluator({
32830
- config: field,
32831
- value: record[field.model],
32832
- });
32833
- }
32834
- }
32835
- // TODO: use the catalog repository instead
32836
- // TODO: use converter based on the format of the record before change
32837
- return from(new Iso19139Converter().writeRecord(savedRecord)).pipe(switchMap$1((recordXml) => this.http.put(`${this.apiUrl}/records?metadataType=METADATA&uuidProcessing=OVERWRITE&transformWith=_none_&publishToAll=on`, recordXml, {
32838
- headers: {
32839
- 'Content-Type': 'application/xml',
32840
- },
32841
- withCredentials: true,
32842
- })), map$1(() => savedRecord));
32843
- }
32844
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, deps: [{ token: i1.HttpClient }, { token: Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
32845
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, providedIn: 'root' }); }
32846
- }
32847
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, decorators: [{
32848
- type: Injectable,
32849
- args: [{
32850
- providedIn: 'root',
32851
- }]
32852
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: Configuration, decorators: [{
32853
- type: Optional
32854
- }, {
32855
- type: Inject,
32856
- args: [Configuration]
32857
- }] }]; } });
32858
-
32859
- class EditorEffects {
32860
- constructor() {
32861
- this.actions$ = inject(Actions);
32862
- this.editorService = inject(EditorService);
32863
- this.store = inject(Store);
32864
- this.saveRecord$ = createEffect(() => this.actions$.pipe(ofType(saveRecord), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordFieldsConfig)), switchMap$1(([, record, fieldsConfig]) => this.editorService.saveRecord(record, fieldsConfig).pipe(switchMap$1((newRecord) => of(saveRecordSuccess(), openRecord({ record: newRecord }))), catchError((error) => of(saveRecordFailure({
32865
- error: error.message,
32866
- })))))));
32867
- this.markAsChanged$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField), map$1(() => markRecordAsChanged())));
32868
- }
32869
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
32870
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorEffects }); }
32871
- }
32872
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorEffects, decorators: [{
32873
- type: Injectable
32874
- }] });
32875
-
32876
33105
  class FeatureEditorModule {
32877
33106
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
32878
33107
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, declarations: [WizardComponent,
@@ -32922,6 +33151,222 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32922
33151
  }]
32923
33152
  }] });
32924
33153
 
33154
+ class FormFieldSimpleComponent {
33155
+ constructor() {
33156
+ this.readonly = false;
33157
+ this.invalid = false;
33158
+ this.placeholder = '';
33159
+ }
33160
+ get inputType() {
33161
+ switch (this.type) {
33162
+ case 'url':
33163
+ case 'text':
33164
+ return 'text';
33165
+ case 'date':
33166
+ return 'datetime-local';
33167
+ case 'number':
33168
+ return 'number';
33169
+ case 'toggle':
33170
+ return 'checkbox';
33171
+ default:
33172
+ return '';
33173
+ }
33174
+ }
33175
+ get isSelect() {
33176
+ return this.type === 'list';
33177
+ }
33178
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldSimpleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33179
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldSimpleComponent, isStandalone: true, selector: "gn-ui-form-field-simple", inputs: { type: "type", control: "control", readonly: "readonly", invalid: "invalid", placeholder: "placeholder", options: "options" }, ngImport: i0, template: "<input\n *ngIf=\"!isSelect\"\n [type]=\"inputType\"\n [readonly]=\"readonly\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n class=\"border rounded-md p-3 w-full bg-white transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n/>\n<select\n *ngIf=\"isSelect\"\n [formControl]=\"control\"\n class=\"border rounded-md p-3 w-full bg-white transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n>\n <option *ngFor=\"let option of options\" [ngValue]=\"option.value\">\n {{ option.label }}\n </option>\n</select>\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: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33180
+ }
33181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldSimpleComponent, decorators: [{
33182
+ type: Component,
33183
+ args: [{ selector: 'gn-ui-form-field-simple', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, ReactiveFormsModule], template: "<input\n *ngIf=\"!isSelect\"\n [type]=\"inputType\"\n [readonly]=\"readonly\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n class=\"border rounded-md p-3 w-full bg-white transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n/>\n<select\n *ngIf=\"isSelect\"\n [formControl]=\"control\"\n class=\"border rounded-md p-3 w-full bg-white transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n>\n <option *ngFor=\"let option of options\" [ngValue]=\"option.value\">\n {{ option.label }}\n </option>\n</select>\n" }]
33184
+ }], propDecorators: { type: [{
33185
+ type: Input
33186
+ }], control: [{
33187
+ type: Input
33188
+ }], readonly: [{
33189
+ type: Input
33190
+ }], invalid: [{
33191
+ type: Input
33192
+ }], placeholder: [{
33193
+ type: Input
33194
+ }], options: [{
33195
+ type: Input
33196
+ }] } });
33197
+
33198
+ class FormFieldFileComponent {
33199
+ constructor() {
33200
+ this.readonly = false;
33201
+ this.invalid = false;
33202
+ this.placeholder = '';
33203
+ }
33204
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldFileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33205
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldFileComponent, isStandalone: true, selector: "gn-ui-form-field-file", inputs: { control: "control", readonly: "readonly", invalid: "invalid", placeholder: "placeholder" }, ngImport: i0, template: "<input\n type=\"file\"\n [readonly]=\"readonly\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n class=\"border rounded-md p-3 w-full bg-white transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n/>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33206
+ }
33207
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldFileComponent, decorators: [{
33208
+ type: Component,
33209
+ args: [{ selector: 'gn-ui-form-field-file', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, ReactiveFormsModule], template: "<input\n type=\"file\"\n [readonly]=\"readonly\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n class=\"border rounded-md p-3 w-full bg-white transition-colors\"\n [ngClass]=\"{\n 'border-pink-500': invalid,\n 'border-gray-200': !invalid,\n 'text-gray-600': readonly\n }\"\n/>\n" }]
33210
+ }], propDecorators: { control: [{
33211
+ type: Input
33212
+ }], readonly: [{
33213
+ type: Input
33214
+ }], invalid: [{
33215
+ type: Input
33216
+ }], placeholder: [{
33217
+ type: Input
33218
+ }] } });
33219
+
33220
+ class FormFieldRichComponent {
33221
+ constructor() {
33222
+ this.placeholder = 'Votre texte ici'; //TODO: translate
33223
+ this.preview = false;
33224
+ }
33225
+ getButtonExtraClass() {
33226
+ return `${this.preview ? 'text-gray-200 bg-gray-900' : 'text-gray-900 bg-gray-200'} rounded-[1.25rem] p-[0.375rem] text-xs font-medium w-24`;
33227
+ }
33228
+ togglePreview() {
33229
+ this.preview = !this.preview;
33230
+ }
33231
+ handleTextContentChanged(textContent) {
33232
+ this.control.setValue(textContent);
33233
+ }
33234
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldRichComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33235
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldRichComponent, isStandalone: true, selector: "gn-ui-form-field-rich", inputs: { control: "control", label: "label", hint: "hint", helperText: "helperText", placeholder: "placeholder" }, ngImport: i0, template: "<gn-ui-form-field-wrapper [label]=\"label\" [hint]=\"hint\">\n <gn-ui-button\n form-field-interaction\n [extraClass]=\"getButtonExtraClass()\"\n (buttonClick)=\"togglePreview()\"\n >\n <span class=\"material-symbols-outlined mr-1 icon-small\">{{\n preview ? 'visibility' : 'visibility_off'\n }}</span>\n {{ preview ? 'WYSIWYG' : 'Markdown' }}\n </gn-ui-button>\n <gn-ui-markdown-editor\n class=\"h-full\"\n [preview]=\"preview\"\n [helperText]=\"helperText\"\n [placeholder]=\"placeholder\"\n [textContent]=\"control.value\"\n (textContentChanged)=\"handleTextContentChanged($event)\"\n ></gn-ui-markdown-editor>\n</gn-ui-form-field-wrapper>\n", styles: [".icon-small{font-size:16px;height:16px;width:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: MarkdownEditorComponent, selector: "gn-ui-markdown-editor", inputs: ["preview", "helperText", "placeholder", "textContent"], outputs: ["textContentChanged"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33236
+ }
33237
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldRichComponent, decorators: [{
33238
+ type: Component,
33239
+ args: [{ selector: 'gn-ui-form-field-rich', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
33240
+ CommonModule,
33241
+ ReactiveFormsModule,
33242
+ MarkdownEditorComponent,
33243
+ FormFieldWrapperComponent,
33244
+ ButtonComponent,
33245
+ ], template: "<gn-ui-form-field-wrapper [label]=\"label\" [hint]=\"hint\">\n <gn-ui-button\n form-field-interaction\n [extraClass]=\"getButtonExtraClass()\"\n (buttonClick)=\"togglePreview()\"\n >\n <span class=\"material-symbols-outlined mr-1 icon-small\">{{\n preview ? 'visibility' : 'visibility_off'\n }}</span>\n {{ preview ? 'WYSIWYG' : 'Markdown' }}\n </gn-ui-button>\n <gn-ui-markdown-editor\n class=\"h-full\"\n [preview]=\"preview\"\n [helperText]=\"helperText\"\n [placeholder]=\"placeholder\"\n [textContent]=\"control.value\"\n (textContentChanged)=\"handleTextContentChanged($event)\"\n ></gn-ui-markdown-editor>\n</gn-ui-form-field-wrapper>\n", styles: [".icon-small{font-size:16px;height:16px;width:16px}\n"] }]
33246
+ }], propDecorators: { control: [{
33247
+ type: Input
33248
+ }], label: [{
33249
+ type: Input
33250
+ }], hint: [{
33251
+ type: Input
33252
+ }], helperText: [{
33253
+ type: Input
33254
+ }], placeholder: [{
33255
+ type: Input
33256
+ }] } });
33257
+
33258
+ class FormFieldObjectComponent {
33259
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldObjectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33260
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldObjectComponent, isStandalone: true, selector: "gn-ui-form-field-object", ngImport: i0, template: "<p>form-field-object works!</p>\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33261
+ }
33262
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldObjectComponent, decorators: [{
33263
+ type: Component,
33264
+ args: [{ selector: 'gn-ui-form-field-object', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-object works!</p>\n" }]
33265
+ }] });
33266
+
33267
+ class FormFieldArrayComponent {
33268
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldArrayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33269
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldArrayComponent, isStandalone: true, selector: "gn-ui-form-field-array", ngImport: i0, template: "<p>form-field-array works!</p>\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33270
+ }
33271
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldArrayComponent, decorators: [{
33272
+ type: Component,
33273
+ args: [{ selector: 'gn-ui-form-field-array', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-array works!</p>\n" }]
33274
+ }] });
33275
+
33276
+ class FormFieldSpatialExtentComponent {
33277
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldSpatialExtentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33278
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldSpatialExtentComponent, isStandalone: true, selector: "gn-ui-form-field-spatial-extent", ngImport: i0, template: "<p>form-field-spatial-extent works!</p>\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33279
+ }
33280
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldSpatialExtentComponent, decorators: [{
33281
+ type: Component,
33282
+ args: [{ selector: 'gn-ui-form-field-spatial-extent', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-spatial-extent works!</p>\n" }]
33283
+ }] });
33284
+
33285
+ class FormFieldTemporalExtentComponent {
33286
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldTemporalExtentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33287
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldTemporalExtentComponent, isStandalone: true, selector: "gn-ui-form-field-temporal-extent", ngImport: i0, template: "<p>form-field-temporal-extent works!</p>\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33288
+ }
33289
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldTemporalExtentComponent, decorators: [{
33290
+ type: Component,
33291
+ args: [{ selector: 'gn-ui-form-field-temporal-extent', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-temporal-extent works!</p>\n" }]
33292
+ }] });
33293
+
33294
+ class FormFieldComponent {
33295
+ set value(v) {
33296
+ this.formControl.setValue(v, {
33297
+ emitEvent: false,
33298
+ });
33299
+ }
33300
+ constructor() {
33301
+ this.formControl = new FormControl();
33302
+ this.valueChange = this.formControl.valueChanges;
33303
+ }
33304
+ get simpleType() {
33305
+ return this.config.type;
33306
+ }
33307
+ get isSimpleField() {
33308
+ return (this.config.type === 'text' ||
33309
+ this.config.type === 'number' ||
33310
+ this.config.type === 'date' ||
33311
+ this.config.type === 'list' ||
33312
+ this.config.type === 'url' ||
33313
+ this.config.type === 'toggle');
33314
+ }
33315
+ get isFileField() {
33316
+ return this.config.type === 'file';
33317
+ }
33318
+ get isSpatialExtentField() {
33319
+ return this.config.type === 'spatial_extent';
33320
+ }
33321
+ get isTemporalExtentField() {
33322
+ return this.config.type === 'temporal_extent';
33323
+ }
33324
+ get isArrayField() {
33325
+ return this.config.type === 'array';
33326
+ }
33327
+ get isObjectField() {
33328
+ return this.config.type === 'object';
33329
+ }
33330
+ get isFieldOk() {
33331
+ return !this.config.locked && !this.config.invalid;
33332
+ }
33333
+ get isFieldLocked() {
33334
+ return this.config.locked;
33335
+ }
33336
+ get isFieldInvalid() {
33337
+ return !this.config.locked && this.config.invalid;
33338
+ }
33339
+ get isAbstract() {
33340
+ return this.model === 'abstract';
33341
+ }
33342
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33343
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { model: "model", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div class=\"flex flex-col h-full\">\n <div class=\"mb-2 flex flex-row\">\n <label class=\"grow\">\n <span class=\"font-medium field-label\">{{\n config.labelKey | translate\n }}</span>\n <span *ngIf=\"config.hintKey\" class=\"text-gray-900 text-sm\">\n - {{ config.hintKey | translate }}\n </span>\n </label>\n <mat-icon\n *ngIf=\"isFieldOk\"\n class=\"material-symbols-outlined text-[#c6d950] icon-ok\"\n >check_circle</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldLocked\"\n class=\"material-symbols-outlined text-blue-400 icon-locked\"\n >lock</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldInvalid\"\n class=\"material-symbols-outlined text-pink-500 icon-invalid\"\n >cancel</mat-icon\n >\n </div>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n [type]=\"simpleType\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isFileField\">\n <gn-ui-form-field-file\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-file>\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=\"isArrayField\">\n <gn-ui-form-field-array></gn-ui-form-field-array>\n </ng-container>\n <ng-container *ngIf=\"isObjectField\">\n <gn-ui-form-field-object></gn-ui-form-field-object>\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=\"isTemporalExtentField\">\n <gn-ui-form-field-temporal-extent></gn-ui-form-field-temporal-extent>\n </ng-container>\n <div\n *ngIf=\"isFieldInvalid && config.invalidHintKey\"\n class=\"mt-2 text-pink-500 text-sm field-invalid-hint\"\n >\n {{ config.invalidHintKey | translate }}\n </div>\n</div>\n", styles: [""], dependencies: [{ 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: FormFieldObjectComponent, selector: "gn-ui-form-field-object" }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldTemporalExtentComponent, selector: "gn-ui-form-field-temporal-extent" }, { kind: "component", type: FormFieldFileComponent, selector: "gn-ui-form-field-file", inputs: ["control", "readonly", "invalid", "placeholder"] }, { kind: "component", type: FormFieldArrayComponent, selector: "gn-ui-form-field-array" }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33344
+ }
33345
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, decorators: [{
33346
+ type: Component,
33347
+ args: [{ selector: 'gn-ui-form-field', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
33348
+ FormFieldSimpleComponent,
33349
+ FormFieldRichComponent,
33350
+ FormFieldObjectComponent,
33351
+ FormFieldSpatialExtentComponent,
33352
+ FormFieldTemporalExtentComponent,
33353
+ FormFieldFileComponent,
33354
+ FormFieldArrayComponent,
33355
+ CommonModule,
33356
+ ReactiveFormsModule,
33357
+ TranslateModule,
33358
+ MatIconModule,
33359
+ ], template: "<div class=\"flex flex-col h-full\">\n <div class=\"mb-2 flex flex-row\">\n <label class=\"grow\">\n <span class=\"font-medium field-label\">{{\n config.labelKey | translate\n }}</span>\n <span *ngIf=\"config.hintKey\" class=\"text-gray-900 text-sm\">\n - {{ config.hintKey | translate }}\n </span>\n </label>\n <mat-icon\n *ngIf=\"isFieldOk\"\n class=\"material-symbols-outlined text-[#c6d950] icon-ok\"\n >check_circle</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldLocked\"\n class=\"material-symbols-outlined text-blue-400 icon-locked\"\n >lock</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldInvalid\"\n class=\"material-symbols-outlined text-pink-500 icon-invalid\"\n >cancel</mat-icon\n >\n </div>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n [type]=\"simpleType\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isFileField\">\n <gn-ui-form-field-file\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-file>\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=\"isArrayField\">\n <gn-ui-form-field-array></gn-ui-form-field-array>\n </ng-container>\n <ng-container *ngIf=\"isObjectField\">\n <gn-ui-form-field-object></gn-ui-form-field-object>\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=\"isTemporalExtentField\">\n <gn-ui-form-field-temporal-extent></gn-ui-form-field-temporal-extent>\n </ng-container>\n <div\n *ngIf=\"isFieldInvalid && config.invalidHintKey\"\n class=\"mt-2 text-pink-500 text-sm field-invalid-hint\"\n >\n {{ config.invalidHintKey | translate }}\n </div>\n</div>\n" }]
33360
+ }], ctorParameters: function () { return []; }, propDecorators: { model: [{
33361
+ type: Input
33362
+ }], config: [{
33363
+ type: Input
33364
+ }], value: [{
33365
+ type: Input
33366
+ }], valueChange: [{
33367
+ type: Output
33368
+ }] } });
33369
+
32925
33370
  class RecordFormComponent {
32926
33371
  constructor(facade) {
32927
33372
  this.facade = facade;
@@ -32937,11 +33382,21 @@ class RecordFormComponent {
32937
33382
  return field.config.model;
32938
33383
  }
32939
33384
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorFacade }], target: i0.ɵɵFactoryTarget.Component }); }
32940
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<div class=\"flex flex-col gap-6 p-6\">\n <ng-container *ngFor=\"let field of fields$ | async; trackBy: fieldTracker\">\n <gn-ui-form-field\n *ngIf=\"field.config.formFieldConfig && !field.config.hidden\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field, $event)\"\n ></gn-ui-form-field>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: ["config", "value"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33385
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<div class=\"flex flex-col gap-6 p-6\">\n <ng-container *ngFor=\"let field of fields$ | async; trackBy: fieldTracker\">\n <gn-ui-form-field\n *ngIf=\"field.config.formFieldConfig && !field.config.hidden\"\n [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 }); }
32941
33386
  }
32942
33387
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
32943
33388
  type: Component,
32944
- args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, UiInputsModule], template: "<div class=\"flex flex-col gap-6 p-6\">\n <ng-container *ngFor=\"let field of fields$ | async; trackBy: fieldTracker\">\n <gn-ui-form-field\n *ngIf=\"field.config.formFieldConfig && !field.config.hidden\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field, $event)\"\n ></gn-ui-form-field>\n </ng-container>\n</div>\n" }]
33389
+ args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
33390
+ CommonModule,
33391
+ FormFieldComponent,
33392
+ FormFieldArrayComponent,
33393
+ FormFieldFileComponent,
33394
+ FormFieldObjectComponent,
33395
+ FormFieldRichComponent,
33396
+ FormFieldSimpleComponent,
33397
+ FormFieldSpatialExtentComponent,
33398
+ FormFieldTemporalExtentComponent,
33399
+ ], 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" }]
32945
33400
  }], ctorParameters: function () { return [{ type: EditorFacade }]; } });
32946
33401
 
32947
33402
  const ROUTER_STATE_KEY = 'router';
@@ -33309,5 +33764,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33309
33764
  * Generated bundle index. Do not edit.
33310
33765
  */
33311
33766
 
33312
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, 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, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, editorReducer, 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, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, openRecord, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$2 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, saveRecord, saveRecordFailure, saveRecordSuccess, selectEditorState, selectFallback, selectFallbackFields, selectField, selectRecord, selectRecordChangedSinceSave, selectRecordFields, selectRecordFieldsConfig, selectRecordSaveError, selectRecordSaving, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, totalPages, updateLayer, updateRecordField };
33767
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldWrapperComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, 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, 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, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, downgradeImage, downsizeImage, 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, 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, selectRecordChangedSinceSave, selectRecordFields, selectRecordFieldsConfig, selectRecordSaveError, selectRecordSaving, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, totalPages, updateLayer, updateRecordField };
33313
33768
  //# sourceMappingURL=geonetwork-ui.mjs.map