geonetwork-ui 2.3.0-dev.139106e0 → 2.3.0-dev.22f4da74

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 (215) hide show
  1. package/esm2022/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.mjs +1 -1
  2. package/esm2022/libs/api/repository/src/lib/gn4/auth/gravatar.service.mjs +12 -1
  3. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +36 -3
  4. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +19 -7
  5. package/esm2022/libs/common/domain/src/lib/model/record/index.mjs +2 -1
  6. package/esm2022/libs/common/domain/src/lib/model/record/user-feedbacks.model.mjs +2 -0
  7. package/esm2022/libs/common/domain/src/lib/model/user/index.mjs +2 -0
  8. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  9. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +35 -2
  10. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +64 -0
  11. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +15 -0
  12. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +20 -6
  13. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
  14. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +16 -1
  15. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +73 -20
  16. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
  17. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
  18. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +1 -1
  19. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +29 -8
  20. package/esm2022/libs/feature/record/src/lib/feature-record.module.mjs +4 -4
  21. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +3 -2
  22. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +22 -4
  23. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +37 -10
  24. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +22 -7
  25. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +52 -17
  26. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +18 -3
  27. package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +2 -2
  28. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -2
  29. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +2 -2
  30. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
  31. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +2 -2
  32. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +77 -15
  33. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -7
  34. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.mjs +59 -0
  35. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +62 -0
  36. package/esm2022/libs/ui/inputs/src/index.mjs +16 -15
  37. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +22 -0
  38. package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +7 -5
  39. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +17 -8
  40. package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
  41. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +27 -4
  42. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +21 -3
  43. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +11 -9
  44. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  45. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
  46. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
  47. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
  48. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
  49. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
  50. package/esm2022/translations/de.json +21 -0
  51. package/esm2022/translations/en.json +21 -0
  52. package/esm2022/translations/es.json +21 -0
  53. package/esm2022/translations/fr.json +21 -0
  54. package/esm2022/translations/it.json +21 -0
  55. package/esm2022/translations/nl.json +21 -0
  56. package/esm2022/translations/pt.json +21 -0
  57. package/fesm2022/geonetwork-ui.mjs +1705 -808
  58. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  59. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts +1 -0
  60. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts.map +1 -1
  61. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts +1 -0
  62. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts.map +1 -1
  63. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +6 -2
  64. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  65. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -6
  66. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  67. package/libs/common/domain/src/lib/model/record/index.d.ts +1 -0
  68. package/libs/common/domain/src/lib/model/record/index.d.ts.map +1 -1
  69. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts +15 -0
  70. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts.map +1 -0
  71. package/libs/common/domain/src/lib/model/user/index.d.ts +2 -0
  72. package/libs/common/domain/src/lib/model/user/index.d.ts.map +1 -0
  73. package/libs/common/domain/src/lib/platform.service.interface.d.ts +3 -0
  74. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  75. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +3 -1
  76. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  77. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +39 -0
  78. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -0
  79. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +8 -0
  80. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts.map +1 -0
  81. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +4 -1
  82. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  83. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  84. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +10 -5
  85. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -1
  86. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +1 -0
  87. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
  88. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  89. package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
  90. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  91. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +40 -6
  92. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  93. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +24 -4
  94. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  95. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +14 -4
  96. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  97. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +8 -5
  98. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  99. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +12 -9
  100. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  101. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
  102. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  103. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
  104. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  105. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +12 -3
  106. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  107. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +16 -15
  108. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  109. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts +11 -0
  110. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts.map +1 -0
  111. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +22 -0
  112. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -0
  113. package/libs/ui/inputs/src/index.d.ts +15 -14
  114. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  115. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +9 -0
  116. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -0
  117. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts +1 -1
  118. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
  119. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +1 -1
  120. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  121. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
  122. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
  123. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +7 -1
  124. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  125. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +5 -1
  126. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  127. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -35
  128. package/libs/ui/layout/src/index.d.ts +1 -0
  129. package/libs/ui/layout/src/index.d.ts.map +1 -1
  130. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
  131. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
  132. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
  133. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
  134. package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
  135. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  136. package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
  137. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  138. package/package.json +1 -1
  139. package/src/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.ts +1 -0
  140. package/src/libs/api/repository/src/lib/gn4/auth/gravatar.service.ts +12 -1
  141. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +51 -1
  142. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +34 -7
  143. package/src/libs/common/domain/src/lib/model/record/index.ts +1 -0
  144. package/src/libs/common/domain/src/lib/model/record/user-feedbacks.model.ts +15 -0
  145. package/src/libs/common/domain/src/lib/platform.service.interface.ts +3 -0
  146. package/src/libs/common/fixtures/src/index.ts +8 -6
  147. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +8 -0
  148. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +3 -3
  149. package/src/libs/common/fixtures/src/lib/user-feedbacks.fixtures.ts +83 -0
  150. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +51 -1
  151. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css +0 -0
  152. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +8 -0
  153. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +64 -0
  154. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css +0 -0
  155. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +4 -0
  156. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +15 -0
  157. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +33 -33
  158. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +16 -0
  159. package/src/libs/feature/editor/src/lib/fields.config.ts +15 -0
  160. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +7 -0
  161. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +32 -18
  162. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +72 -17
  163. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +1 -0
  164. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +26 -8
  165. package/src/libs/feature/record/src/lib/feature-record.module.ts +5 -2
  166. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +2 -1
  167. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +51 -6
  168. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +82 -7
  169. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +48 -8
  170. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +81 -24
  171. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +40 -10
  172. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +2 -2
  173. package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +2 -1
  174. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +1 -1
  175. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
  176. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
  177. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +26 -10
  178. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +87 -8
  179. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +5 -2
  180. package/src/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.ts +54 -0
  181. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.css +0 -0
  182. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +75 -0
  183. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +63 -0
  184. package/src/libs/ui/inputs/src/index.ts +15 -14
  185. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +3 -0
  186. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +11 -0
  187. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +16 -0
  188. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +8 -1
  189. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +13 -0
  190. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
  191. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
  192. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
  193. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.html +2 -1
  194. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +29 -0
  195. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +2 -1
  196. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +17 -1
  197. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
  198. package/src/libs/ui/layout/src/index.ts +1 -0
  199. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
  200. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
  201. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
  202. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +7 -4
  203. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
  204. package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
  205. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
  206. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
  207. package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
  208. package/translations/de.json +21 -0
  209. package/translations/en.json +21 -0
  210. package/translations/es.json +21 -0
  211. package/translations/fr.json +21 -0
  212. package/translations/it.json +21 -0
  213. package/translations/nl.json +21 -0
  214. package/translations/pt.json +21 -0
  215. package/translations/sk.json +21 -0
@@ -0,0 +1,15 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'
2
+ import { FormControl } from '@angular/forms'
3
+ import { DatePickerComponent } from '../../../../../../../../../libs/ui/inputs/src'
4
+
5
+ @Component({
6
+ selector: 'gn-ui-form-field-resource-updated',
7
+ templateUrl: './form-field-resource-updated.component.html',
8
+ styleUrls: ['./form-field-resource-updated.component.css'],
9
+ changeDetection: ChangeDetectionStrategy.OnPush,
10
+ standalone: true,
11
+ imports: [DatePickerComponent],
12
+ })
13
+ export class FormFieldResourceUpdatedComponent {
14
+ @Input() control!: FormControl
15
+ }
@@ -1,29 +1,18 @@
1
1
  <div class="flex flex-col h-full">
2
- <div class="mb-2 flex flex-row">
3
- <label class="grow">
4
- <span class="font-medium field-label">{{
5
- config.labelKey | translate
6
- }}</span>
7
- <span *ngIf="config.hintKey" class="text-gray-900 text-sm">
8
- - {{ config.hintKey | translate }}
9
- </span>
10
- </label>
11
- <mat-icon
12
- *ngIf="isFieldOk"
13
- class="material-symbols-outlined text-[#c6d950] icon-ok"
14
- >check_circle</mat-icon
15
- >
16
- <mat-icon
17
- *ngIf="isFieldLocked"
18
- class="material-symbols-outlined text-blue-400 icon-locked"
19
- >lock</mat-icon
20
- >
21
- <mat-icon
22
- *ngIf="isFieldInvalid"
23
- class="material-symbols-outlined text-pink-500 icon-invalid"
24
- >cancel</mat-icon
2
+ <ng-container *ngIf="withoutWrapper; else withGenericWrapper">
3
+ <ng-container *ngTemplateOutlet="fieldContent"></ng-container>
4
+ </ng-container>
5
+ <ng-template #withGenericWrapper>
6
+ <gn-ui-form-field-wrapper
7
+ [label]="config.labelKey | translate"
8
+ [hint]="config.hintKey | translate"
25
9
  >
26
- </div>
10
+ <ng-container *ngTemplateOutlet="fieldContent"></ng-container>
11
+ </gn-ui-form-field-wrapper>
12
+ </ng-template>
13
+ </div>
14
+
15
+ <ng-template #fieldContent>
27
16
  <ng-container *ngIf="isTitle">
28
17
  <div class="flex justify-between items-center gap-3">
29
18
  <h2
@@ -48,6 +37,25 @@
48
37
  </span>
49
38
  </div>
50
39
  </ng-container>
40
+ <ng-container *ngIf="isAbstract">
41
+ <gn-ui-form-field-rich
42
+ class="h-[8rem]"
43
+ [control]="formControl"
44
+ [label]="config.labelKey | translate"
45
+ [hint]="config.hintKey | translate"
46
+ ></gn-ui-form-field-rich>
47
+ </ng-container>
48
+ <ng-container *ngIf="isLicenses">
49
+ <gn-ui-form-field-license
50
+ [control]="formControl"
51
+ [label]="config.labelKey | translate"
52
+ ></gn-ui-form-field-license>
53
+ </ng-container>
54
+ <ng-container *ngIf="isResourceUpdated">
55
+ <gn-ui-form-field-resource-updated
56
+ [control]="formControl"
57
+ ></gn-ui-form-field-resource-updated>
58
+ </ng-container>
51
59
  <ng-container *ngIf="isSimpleField">
52
60
  <gn-ui-form-field-simple
53
61
  [type]="simpleType"
@@ -63,14 +71,6 @@
63
71
  [invalid]="isFieldInvalid"
64
72
  ></gn-ui-form-field-file>
65
73
  </ng-container>
66
- <ng-container *ngIf="isAbstract">
67
- <gn-ui-form-field-rich
68
- class="h-[8rem]"
69
- [control]="formControl"
70
- [label]="config.labelKey | translate"
71
- [hint]="config.hintKey | translate"
72
- ></gn-ui-form-field-rich>
73
- </ng-container>
74
74
  <ng-container *ngIf="isArrayField">
75
75
  <gn-ui-form-field-array></gn-ui-form-field-array>
76
76
  </ng-container>
@@ -89,4 +89,4 @@
89
89
  >
90
90
  {{ config.invalidHintKey | translate }}
91
91
  </div>
92
- </div>
92
+ </ng-template>
@@ -11,11 +11,14 @@ import { FormControl, ReactiveFormsModule } from '@angular/forms'
11
11
  import { MatIconModule } from '@angular/material/icon'
12
12
  import { MatTooltipModule } from '@angular/material/tooltip'
13
13
  import { EditableLabelDirective } from '../../../../../../../../libs/ui/inputs/src'
14
+ import { FormFieldWrapperComponent } from '../../../../../../../../libs/ui/layout/src'
14
15
  import { TranslateModule } from '@ngx-translate/core'
15
16
  import { Observable } from 'rxjs'
16
17
  import { FormFieldArrayComponent } from './form-field-array/form-field-array.component'
17
18
  import { FormFieldFileComponent } from './form-field-file/form-field-file.component'
19
+ import { FormFieldLicenseComponent } from './form-field-license/form-field-license.component'
18
20
  import { FormFieldObjectComponent } from './form-field-object/form-field-object.component'
21
+ import { FormFieldResourceUpdatedComponent } from './form-field-resource-updated/form-field-resource-updated.component'
19
22
  import { FormFieldRichComponent } from './form-field-rich/form-field-rich.component'
20
23
  import { FormFieldSimpleComponent } from './form-field-simple/form-field-simple.component'
21
24
  import { FormFieldSpatialExtentComponent } from './form-field-spatial-extent/form-field-spatial-extent.component'
@@ -34,6 +37,9 @@ import { FormFieldConfig } from './form-field.model'
34
37
  EditableLabelDirective,
35
38
  MatIconModule,
36
39
  MatTooltipModule,
40
+ FormFieldWrapperComponent,
41
+ FormFieldLicenseComponent,
42
+ FormFieldResourceUpdatedComponent,
37
43
  FormFieldSimpleComponent,
38
44
  FormFieldRichComponent,
39
45
  FormFieldObjectComponent,
@@ -118,4 +124,14 @@ export class FormFieldComponent {
118
124
  get isAbstract() {
119
125
  return this.model === 'abstract'
120
126
  }
127
+ get isLicenses() {
128
+ return this.model === 'licenses'
129
+ }
130
+ get isResourceUpdated() {
131
+ return this.model === 'resourceUpdated'
132
+ }
133
+
134
+ get withoutWrapper() {
135
+ return this.model === 'title' || this.model === 'abstract'
136
+ }
121
137
  }
@@ -1,3 +1,4 @@
1
+ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
1
2
  import { EditorFieldsConfig } from './models/fields.model'
2
3
 
3
4
  export const DEFAULT_FIELDS: EditorFieldsConfig = [
@@ -32,4 +33,18 @@ export const DEFAULT_FIELDS: EditorFieldsConfig = [
32
33
  },
33
34
  onSaveProcess: '${dateNow()}',
34
35
  },
36
+ {
37
+ model: 'licenses',
38
+ formFieldConfig: {
39
+ labelKey: marker('editor.record.form.license'),
40
+ type: 'list',
41
+ },
42
+ },
43
+ {
44
+ model: 'resourceUpdated',
45
+ formFieldConfig: {
46
+ labelKey: marker('editor.record.form.resourceUpdated'),
47
+ type: 'date',
48
+ },
49
+ },
35
50
  ]
@@ -0,0 +1,7 @@
1
+ .dropdown-content {
2
+ display: none;
3
+ }
4
+
5
+ .relative:hover .dropdown-content {
6
+ display: block;
7
+ }
@@ -4,8 +4,7 @@
4
4
  (valueChange)="urlChange.next($event)"
5
5
  [hint]="'map.ogc.urlInput.hint' | translate"
6
6
  class="w-96"
7
- >
8
- </gn-ui-text-input>
7
+ ></gn-ui-text-input>
9
8
  </div>
10
9
 
11
10
  <div *ngIf="errorMessage" class="text-red-500 mt-2">
@@ -16,21 +15,36 @@
16
15
  <p class="loading-message" translate>map.loading.service</p>
17
16
  </div>
18
17
 
19
- <div *ngIf="!loading && layers.length > 0">
20
- <h2 class="font-bold" translate>map.layers.available</h2>
21
- <ng-container *ngFor="let layer of layers">
22
- <div class="flex items-center justify-between my-2 layer-item-tree">
23
- <p class="max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap">
24
- {{ layer }}
25
- </p>
26
- <gn-ui-button
27
- class="layer-add-btn"
28
- type="primary"
29
- (buttonClick)="addLayer(layer)"
30
- extraClass="text-sm !px-2 !py-1"
31
- translate
32
- ><span translate> map.layer.add </span></gn-ui-button
18
+ <ng-container *ngFor="let layer of layers">
19
+ <div
20
+ *ngIf="shouldDisplayLayer(layer)"
21
+ class="flex items-center justify-between my-2 layer-item-tree"
22
+ >
23
+ <div class="flex flex-col items-start w-full">
24
+ <p
25
+ class="max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap"
26
+ [title]="layer.name"
33
27
  >
28
+ {{ layer.name }}
29
+ </p>
30
+ <div class="flex justify-between items-center w-full">
31
+ <gn-ui-dropdown-selector
32
+ [title]="'Add Layer As' | translate"
33
+ [choices]="getLayerChoices(layer)"
34
+ (selectValue)="onLayerTypeSelect(layer.name, $event)"
35
+ [selected]="selectedLayerTypes[layer.name]"
36
+ extraBtnClass="w-6 h-5 !text-sm !px-2 !py-1"
37
+ ></gn-ui-dropdown-selector>
38
+ <gn-ui-button
39
+ class="layer-add-btn"
40
+ type="primary"
41
+ (buttonClick)="addLayer(layer.name, selectedLayerTypes[layer.name])"
42
+ extraClass="text-sm !px-2 !py-1"
43
+ translate
44
+ >
45
+ <span translate>map.layer.add</span>
46
+ </gn-ui-button>
47
+ </div>
34
48
  </div>
35
- </ng-container>
36
- </div>
49
+ </div>
50
+ </ng-container>
@@ -14,7 +14,7 @@ import {
14
14
  MapContextLayerTypeEnum,
15
15
  } from '../map-context/map-context.model'
16
16
  import { TranslateModule } from '@ngx-translate/core'
17
- import { UiInputsModule } from '../../../../../../libs/ui/inputs/src'
17
+ import { DropdownChoice, UiInputsModule } from '../../../../../../libs/ui/inputs/src'
18
18
  import { CommonModule } from '@angular/common'
19
19
  import { MapLayer } from '../+state/map.models'
20
20
 
@@ -30,18 +30,16 @@ export class AddLayerFromOgcApiComponent implements OnInit {
30
30
  @Output() layerAdded = new EventEmitter<MapLayer>()
31
31
 
32
32
  urlChange = new Subject<string>()
33
- layerUrl = ''
34
33
  loading = false
35
- layers: string[] = []
36
- ogcEndpoint: OgcApiEndpoint = null
34
+ layers: any[] = []
37
35
  errorMessage: string | null = null
36
+ selectedLayerTypes: { [key: string]: DropdownChoice['value'] } = {}
38
37
 
39
38
  constructor(private changeDetectorRef: ChangeDetectorRef) {}
40
39
 
41
40
  ngOnInit() {
42
41
  this.urlChange.pipe(debounceTime(700)).subscribe(() => {
43
42
  this.loadLayers()
44
- this.changeDetectorRef.detectChanges() // manually trigger change detection
45
43
  })
46
44
  }
47
45
 
@@ -49,14 +47,13 @@ export class AddLayerFromOgcApiComponent implements OnInit {
49
47
  this.errorMessage = null
50
48
  try {
51
49
  this.loading = true
52
- if (this.ogcUrl.trim() === '') {
50
+ if (!this.ogcUrl.trim()) {
53
51
  this.layers = []
54
52
  return
55
53
  }
56
- this.ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl)
57
-
58
- // Currently only supports feature collections
59
- this.layers = await this.ogcEndpoint.featureCollections
54
+ const ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl)
55
+ this.layers = await ogcEndpoint.allCollections
56
+ this.setDefaultLayerTypes()
60
57
  } catch (error) {
61
58
  const err = error as Error
62
59
  this.layers = []
@@ -67,14 +64,72 @@ export class AddLayerFromOgcApiComponent implements OnInit {
67
64
  }
68
65
  }
69
66
 
70
- async addLayer(layer: string) {
71
- this.layerUrl = await this.ogcEndpoint.getCollectionItemsUrl(layer)
67
+ setDefaultLayerTypes() {
68
+ this.layers.forEach((layer) => {
69
+ const choices = this.getLayerChoices(layer)
70
+ if (choices.length > 0) {
71
+ this.selectedLayerTypes[layer.name] = choices[0].value
72
+ }
73
+ })
74
+ }
72
75
 
73
- const layerToAdd: MapContextLayerModel = {
74
- name: layer,
75
- url: this.layerUrl,
76
- type: MapContextLayerTypeEnum.OGCAPI,
76
+ getLayerChoices(layer: any) {
77
+ const choices = []
78
+ if (layer.hasRecords) {
79
+ choices.push({ label: 'Records', value: 'record' })
80
+ }
81
+ if (layer.hasFeatures) {
82
+ choices.push({ label: 'Features', value: 'features' })
83
+ }
84
+ if (layer.hasVectorTiles) {
85
+ choices.push({ label: 'Vector Tiles', value: 'vectorTiles' })
86
+ }
87
+ if (layer.hasMapTiles) {
88
+ choices.push({ label: 'Map Tiles', value: 'mapTiles' })
89
+ }
90
+ return choices
91
+ }
92
+
93
+ shouldDisplayLayer(layer: any) {
94
+ return (
95
+ layer.hasRecords ||
96
+ layer.hasFeatures ||
97
+ layer.hasVectorTiles ||
98
+ layer.hasMapTiles
99
+ )
100
+ }
101
+
102
+ onLayerTypeSelect(layerName: string, selectedType: any) {
103
+ this.selectedLayerTypes[layerName] = selectedType
104
+ ? selectedType
105
+ : this.getLayerChoices(layerName)[0]?.value
106
+ }
107
+
108
+ async addLayer(layer: string, layerType: any) {
109
+ try {
110
+ const ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl)
111
+ let layerUrl: string
112
+
113
+ if (layerType === 'vectorTiles') {
114
+ layerUrl = await ogcEndpoint.getVectorTilesetUrl(layer)
115
+ } else if (layerType === 'mapTiles') {
116
+ layerUrl = await ogcEndpoint.getMapTilesetUrl(layer)
117
+ } else {
118
+ layerUrl = await ogcEndpoint.getCollectionItemsUrl(layer, {
119
+ outputFormat: 'json',
120
+ })
121
+ }
122
+
123
+ const layerToAdd: MapContextLayerModel = {
124
+ name: layer,
125
+ url: layerUrl,
126
+ type: MapContextLayerTypeEnum.OGCAPI,
127
+ layerType: layerType,
128
+ }
129
+ this.layerAdded.emit({ ...layerToAdd, title: layer })
130
+ } catch (error) {
131
+ const err = error as Error
132
+ console.error('Error adding layer:', err.message)
77
133
  }
78
- this.layerAdded.emit({ ...layerToAdd, title: layer })
79
134
  }
80
135
  }
@@ -38,6 +38,7 @@ export interface MapContextLayerOgcapiModel {
38
38
  type: 'ogcapi'
39
39
  url: string
40
40
  name: string
41
+ layerType: 'feature' | 'vectorTiles' | 'mapTiles' | 'record'
41
42
  }
42
43
 
43
44
  interface LayerXyzModel {
@@ -25,6 +25,10 @@ import WMTS from 'ol/source/WMTS'
25
25
  import { Geometry } from 'ol/geom'
26
26
  import Feature from 'ol/Feature'
27
27
  import { WfsEndpoint, WmtsEndpoint } from '@camptocamp/ogc-client'
28
+ import OGCVectorTile from 'ol/source/OGCVectorTile.js'
29
+ import { MVT } from 'ol/format'
30
+ import VectorTileLayer from 'ol/layer/VectorTile'
31
+ import OGCMapTile from 'ol/source/OGCMapTile.js'
28
32
 
29
33
  export const DEFAULT_BASELAYER_CONTEXT: MapContextLayerXyzModel = {
30
34
  type: MapContextLayerTypeEnum.XYZ,
@@ -78,14 +82,28 @@ export class MapContextService {
78
82
  const style = this.styleService.styles.default
79
83
  switch (type) {
80
84
  case MapContextLayerTypeEnum.OGCAPI:
81
- return new VectorLayer({
82
- source: new VectorSource({
83
- format: new GeoJSON(),
84
- url: layerModel.url,
85
- }),
86
- style,
87
- })
88
-
85
+ if (layerModel.layerType === 'vectorTiles') {
86
+ return new VectorTileLayer({
87
+ source: new OGCVectorTile({
88
+ url: layerModel.url,
89
+ format: new MVT(),
90
+ }),
91
+ })
92
+ } else if (layerModel.layerType === 'mapTiles') {
93
+ return new TileLayer({
94
+ source: new OGCMapTile({
95
+ url: layerModel.url,
96
+ }),
97
+ })
98
+ } else {
99
+ return new VectorLayer({
100
+ source: new VectorSource({
101
+ format: new GeoJSON(),
102
+ url: layerModel.url,
103
+ }),
104
+ style,
105
+ })
106
+ }
89
107
  case MapContextLayerTypeEnum.XYZ:
90
108
  return new TileLayer({
91
109
  source: new XYZ({
@@ -11,7 +11,10 @@ import { MdViewFacade } from './state'
11
11
  import { MdViewEffects } from './state/mdview.effects'
12
12
  import { MapViewComponent } from './map-view/map-view.component'
13
13
  import { DataViewComponent } from './data-view/data-view.component'
14
- import { MD_VIEW_FEATURE_STATE_KEY, reducer } from './state/mdview.reducer'
14
+ import {
15
+ METADATA_VIEW_FEATURE_STATE_KEY,
16
+ reducer,
17
+ } from './state/mdview.reducer'
15
18
  import { MatTabsModule } from '@angular/material/tabs'
16
19
  import { MatIconModule } from '@angular/material/icon'
17
20
  import { UiWidgetsModule } from '../../../../../libs/ui/widgets/src'
@@ -35,7 +38,7 @@ import { DataViewShareComponent } from './data-view-share/data-view-share.compon
35
38
  ],
36
39
  imports: [
37
40
  CommonModule,
38
- StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer),
41
+ StoreModule.forFeature(METADATA_VIEW_FEATURE_STATE_KEY, reducer),
39
42
  EffectsModule.forFeature([MdViewEffects]),
40
43
  UiLayoutModule,
41
44
  FeatureMapModule,
@@ -196,7 +196,8 @@ export class MapViewComponent implements OnInit, OnDestroy {
196
196
  } else if (
197
197
  (link.type === 'service' &&
198
198
  (link.accessServiceProtocol === 'wfs' ||
199
- link.accessServiceProtocol === 'esriRest')) ||
199
+ link.accessServiceProtocol === 'esriRest' ||
200
+ link.accessServiceProtocol === 'ogcFeatures')) ||
200
201
  link.type === 'download'
201
202
  ) {
202
203
  return this.dataService.readAsGeoJson(link).pipe(
@@ -1,7 +1,13 @@
1
1
  import { DatavizConfigurationModel } from '../../../../../../libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model'
2
2
  import { createAction, props } from '@ngrx/store'
3
- import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
3
+ import {
4
+ CatalogRecord,
5
+ UserFeedback,
6
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
4
7
 
8
+ /*
9
+ Metadata actions
10
+ */
5
11
  export const loadFullMetadata = createAction(
6
12
  '[Metadata view] Load full metadata',
7
13
  props<{ uuid: string }>()
@@ -12,24 +18,63 @@ export const setIncompleteMetadata = createAction(
12
18
  props<{ incomplete: Partial<CatalogRecord> }>()
13
19
  )
14
20
 
15
- export const loadFullSuccess = createAction(
16
- '[Metadata view] Load full success',
21
+ export const loadFullMetadataSuccess = createAction(
22
+ '[Metadata view] Load full metadata success',
17
23
  props<{ full: CatalogRecord }>()
18
24
  )
19
25
 
20
- export const loadFullFailure = createAction(
21
- '[Metadata view] Load full failure',
26
+ export const loadFullMetadataFailure = createAction(
27
+ '[Metadata view] Load full metadata failure',
22
28
  props<{ otherError?: string; notFound?: boolean }>()
23
29
  )
24
30
 
31
+ export const closeMetadata = createAction('[Metadata view] close')
32
+
33
+ /*
34
+ Related actions
35
+ */
25
36
  export const setRelated = createAction(
26
37
  '[Metadata view] Set related records',
27
38
  props<{ related: CatalogRecord[] }>()
28
39
  )
29
40
 
41
+ /*
42
+ ChartConfig actions
43
+ */
30
44
  export const setChartConfig = createAction(
31
45
  '[Metadata view] Set chart config',
32
46
  props<{ chartConfig: DatavizConfigurationModel }>()
33
47
  )
34
48
 
35
- export const close = createAction('[Metadata view] close')
49
+ /*
50
+ User Feedbacks actions
51
+ */
52
+ export const addUserFeedback = createAction(
53
+ '[Metadata view] Add UserFeedback',
54
+ props<{ userFeedback: UserFeedback }>()
55
+ )
56
+
57
+ export const addUserFeedbackSuccess = createAction(
58
+ '[Metadata view] Add UserFeedback Success',
59
+ props<{ datasetUuid: string }>()
60
+ )
61
+
62
+ export const addUserFeedbackFailure = createAction(
63
+ '[Metadata view] Add UserFeedback Failure',
64
+ props<{ otherError?: string; notFound?: boolean }>()
65
+ )
66
+
67
+ export const loadUserFeedbacks = createAction(
68
+ '[Metadata view] Load UserFeedbacks',
69
+ props<{ datasetUuid: string }>()
70
+ )
71
+
72
+ export const loadUserFeedbacksSuccess = createAction(
73
+ '[Metadata view] Load UserFeedbacks Success',
74
+ props<{ userFeedbacks: UserFeedback[] }>()
75
+ )
76
+
77
+ export const loadUserFeedbacksFailure = createAction(
78
+ '[Metadata view] Load UserFeedbacks Failure',
79
+ props<{ otherError?: string; notFound?: boolean }>()
80
+ )
@@ -1,18 +1,23 @@
1
1
  import { Injectable } from '@angular/core'
2
2
  import { Actions, createEffect, ofType } from '@ngrx/effects'
3
- import { of } from 'rxjs'
3
+ import { exhaustMap, mergeMap, of } from 'rxjs'
4
4
  import { catchError, map, switchMap } from 'rxjs/operators'
5
5
  import * as MdViewActions from './mdview.actions'
6
6
  import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
7
+ import { PlatformServiceInterface } from '../../../../../../libs/common/domain/src/lib/platform.service.interface'
7
8
 
8
9
  @Injectable()
9
10
  export class MdViewEffects {
10
11
  constructor(
11
12
  private actions$: Actions,
12
- private recordsRepository: RecordsRepositoryInterface
13
+ private recordsRepository: RecordsRepositoryInterface,
14
+ private platformServiceInterface: PlatformServiceInterface
13
15
  ) {}
14
16
 
15
- loadFull$ = createEffect(() =>
17
+ /*
18
+ Metadata effects
19
+ */
20
+ loadFullMetadata$ = createEffect(() =>
16
21
  this.actions$.pipe(
17
22
  ofType(MdViewActions.loadFullMetadata),
18
23
  switchMap(({ uuid }) =>
@@ -20,19 +25,22 @@ export class MdViewEffects {
20
25
  ),
21
26
  map((record) => {
22
27
  if (record === null) {
23
- return MdViewActions.loadFullFailure({ notFound: true })
28
+ return MdViewActions.loadFullMetadataFailure({ notFound: true })
24
29
  }
25
- return MdViewActions.loadFullSuccess({ full: record })
30
+ return MdViewActions.loadFullMetadataSuccess({ full: record })
26
31
  }),
27
32
  catchError((error) =>
28
- of(MdViewActions.loadFullFailure({ otherError: error.message }))
33
+ of(MdViewActions.loadFullMetadataFailure({ otherError: error.message }))
29
34
  )
30
35
  )
31
36
  )
32
37
 
38
+ /*
39
+ Related effects
40
+ */
33
41
  loadRelatedRecords$ = createEffect(() =>
34
42
  this.actions$.pipe(
35
- ofType(MdViewActions.loadFullSuccess),
43
+ ofType(MdViewActions.loadFullMetadataSuccess),
36
44
  switchMap(({ full }) => this.recordsRepository.getSimilarRecords(full)),
37
45
  map((related) => {
38
46
  return MdViewActions.setRelated({ related })
@@ -40,4 +48,71 @@ export class MdViewEffects {
40
48
  catchError((error) => of(MdViewActions.setRelated({ related: null })))
41
49
  )
42
50
  )
51
+
52
+ /*
53
+ UserFeedback effects
54
+ */
55
+ loadUserFeedbacks$ = createEffect(() =>
56
+ this.actions$.pipe(
57
+ ofType(MdViewActions.loadUserFeedbacks),
58
+ exhaustMap(({ datasetUuid }) =>
59
+ this.platformServiceInterface.getUserFeedbacks(datasetUuid).pipe(
60
+ map((userFeedbacks) =>
61
+ MdViewActions.loadUserFeedbacksSuccess({ userFeedbacks })
62
+ ),
63
+ catchError((error) =>
64
+ of(
65
+ MdViewActions.loadUserFeedbacksFailure({
66
+ otherError: error.message,
67
+ })
68
+ )
69
+ )
70
+ )
71
+ )
72
+ )
73
+ )
74
+
75
+ reloadUserFeedbacks$ = createEffect(() =>
76
+ this.actions$.pipe(
77
+ ofType(MdViewActions.addUserFeedbackSuccess),
78
+ exhaustMap(({ datasetUuid }) =>
79
+ this.platformServiceInterface.getUserFeedbacks(datasetUuid).pipe(
80
+ map((userFeedbacks) =>
81
+ MdViewActions.loadUserFeedbacksSuccess({ userFeedbacks })
82
+ ),
83
+ catchError((error) =>
84
+ of(
85
+ MdViewActions.loadUserFeedbacksFailure({
86
+ otherError: error.message,
87
+ })
88
+ )
89
+ )
90
+ )
91
+ )
92
+ )
93
+ )
94
+
95
+ addUserFeedback$ = createEffect(() =>
96
+ this.actions$.pipe(
97
+ ofType(MdViewActions.addUserFeedback),
98
+ mergeMap((action) =>
99
+ this.platformServiceInterface
100
+ .postUserFeedbacks(action.userFeedback)
101
+ .pipe(
102
+ map(() =>
103
+ MdViewActions.addUserFeedbackSuccess({
104
+ datasetUuid: action.userFeedback.metadataUUID,
105
+ })
106
+ ),
107
+ catchError((error) => {
108
+ return of(
109
+ MdViewActions.addUserFeedbackFailure({
110
+ otherError: error.message,
111
+ })
112
+ )
113
+ })
114
+ )
115
+ )
116
+ )
117
+ )
43
118
  }