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
@@ -1,18 +1,25 @@
1
- import { AfterViewInit, ChangeDetectorRef, ElementRef } from '@angular/core';
1
+ import { AfterViewInit, ChangeDetectorRef, ElementRef, EventEmitter } from '@angular/core';
2
2
  import { EmblaCarouselType } from 'embla-carousel';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class CarouselComponent implements AfterViewInit {
5
5
  private changeDetector;
6
+ carouselOverflowContainer: ElementRef;
6
7
  containerClass: string;
7
8
  stepsContainerClass: string;
8
- carouselOverflowContainer: ElementRef;
9
- steps: number[];
10
- selectedStep: number;
11
- emblaApi: EmblaCarouselType;
9
+ currentStepChange: EventEmitter<number>;
10
+ protected steps: number[];
11
+ protected emblaApi: EmblaCarouselType;
12
+ protected currentStep: number;
13
+ protected refreshSteps: () => void;
14
+ get isFirstStep(): boolean;
15
+ get isLastStep(): boolean;
16
+ get stepsCount(): number;
12
17
  constructor(changeDetector: ChangeDetectorRef);
13
18
  ngAfterViewInit(): void;
14
19
  scrollToStep(stepIndex: number): void;
20
+ slideToPrevious(): void;
21
+ slideToNext(): void;
15
22
  static ɵfac: i0.ɵɵFactoryDeclaration<CarouselComponent, never>;
16
- static ɵcmp: i0.ɵɵComponentDeclaration<CarouselComponent, "gn-ui-carousel", never, { "containerClass": { "alias": "containerClass"; "required": false; }; "stepsContainerClass": { "alias": "stepsContainerClass"; "required": false; }; }, {}, never, ["*"], false, never>;
23
+ static ɵcmp: i0.ɵɵComponentDeclaration<CarouselComponent, "gn-ui-carousel", never, { "containerClass": { "alias": "containerClass"; "required": false; }; "stepsContainerClass": { "alias": "stepsContainerClass"; "required": false; }; }, { "currentStepChange": "currentStepChange"; }, never, ["*"], true, never>;
17
24
  }
18
25
  //# sourceMappingURL=carousel.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"carousel.component.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/ui/layout/src/lib/carousel/carousel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEb,iBAAiB,EAEjB,UAAU,EAGX,MAAM,eAAe,CAAA;AACtB,OAAsB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;;AAEjE,qBAMa,iBAAkB,YAAW,aAAa;IASzC,OAAO,CAAC,cAAc;IARzB,cAAc,SAAK;IACnB,mBAAmB,SAAK;IAEjC,yBAAyB,EAAE,UAAU,CAAA;IACrC,KAAK,EAAE,MAAM,EAAE,CAAK;IACpB,YAAY,SAAK;IACjB,QAAQ,EAAE,iBAAiB,CAAA;gBAEP,cAAc,EAAE,iBAAiB;IAErD,eAAe;IAkBf,YAAY,CAAC,SAAS,EAAE,MAAM;yCA7BnB,iBAAiB;2CAAjB,iBAAiB;CAgC7B"}
1
+ {"version":3,"file":"carousel.component.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/ui/layout/src/lib/carousel/carousel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEb,iBAAiB,EAEjB,UAAU,EACV,YAAY,EAIb,MAAM,eAAe,CAAA;AACtB,OAAsB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;;AAGjE,qBAQa,iBAAkB,YAAW,aAAa;IA4BzC,OAAO,CAAC,cAAc;IA3BM,yBAAyB,EAAE,UAAU,CAAA;IAEpE,cAAc,SAAK;IACnB,mBAAmB,SAA6B;IAC/C,iBAAiB,uBAA6B;IAExD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,CAAK;IAC9B,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAA;IACrC,SAAS,CAAC,WAAW,SAAI;IAEzB,SAAS,CAAC,YAAY,aAKrB;IAED,IAAI,WAAW,YAEd;IACD,IAAI,UAAU,YAEb;IACD,IAAI,UAAU,WAEb;gBAEmB,cAAc,EAAE,iBAAiB;IAErD,eAAe;IAcR,YAAY,CAAC,SAAS,EAAE,MAAM;IAI9B,eAAe;IAKf,WAAW;yCArDP,iBAAiB;2CAAjB,iBAAiB;CAyD7B"}
@@ -3,13 +3,12 @@ import * as i1 from "./expandable-panel/expandable-panel.component";
3
3
  import * as i2 from "./sticky-header/sticky-header.component";
4
4
  import * as i3 from "./anchor-link/anchor-link.directive";
5
5
  import * as i4 from "./expandable-panel-button/expandable-panel-button.component";
6
- import * as i5 from "./carousel/carousel.component";
7
- import * as i6 from "@angular/common";
8
- import * as i7 from "@angular/material/icon";
9
- import * as i8 from "@ngx-translate/core";
6
+ import * as i5 from "@angular/common";
7
+ import * as i6 from "@angular/material/icon";
8
+ import * as i7 from "@ngx-translate/core";
10
9
  export declare class UiLayoutModule {
11
10
  static ɵfac: i0.ɵɵFactoryDeclaration<UiLayoutModule, never>;
12
- static ɵmod: i0.ɵɵNgModuleDeclaration<UiLayoutModule, [typeof i1.ExpandablePanelComponent, typeof i2.StickyHeaderComponent, typeof i3.AnchorLinkDirective, typeof i4.ExpandablePanelButtonComponent, typeof i5.CarouselComponent], [typeof i6.CommonModule, typeof i7.MatIconModule, typeof i8.TranslateModule], [typeof i1.ExpandablePanelComponent, typeof i2.StickyHeaderComponent, typeof i3.AnchorLinkDirective, typeof i4.ExpandablePanelButtonComponent, typeof i5.CarouselComponent]>;
11
+ static ɵmod: i0.ɵɵNgModuleDeclaration<UiLayoutModule, [typeof i1.ExpandablePanelComponent, typeof i2.StickyHeaderComponent, typeof i3.AnchorLinkDirective, typeof i4.ExpandablePanelButtonComponent], [typeof i5.CommonModule, typeof i6.MatIconModule, typeof i7.TranslateModule], [typeof i1.ExpandablePanelComponent, typeof i2.StickyHeaderComponent, typeof i3.AnchorLinkDirective, typeof i4.ExpandablePanelButtonComponent]>;
13
12
  static ɵinj: i0.ɵɵInjectorDeclaration<UiLayoutModule>;
14
13
  }
15
14
  //# sourceMappingURL=ui-layout.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui-layout.module.d.ts","sourceRoot":"","sources":["../../../../../src/libs/ui/layout/src/lib/ui-layout.module.ts"],"names":[],"mappings":";;;;;;;;;AAUA,qBAiBa,cAAc;yCAAd,cAAc;0CAAd,cAAc;0CAAd,cAAc;CAAG"}
1
+ {"version":3,"file":"ui-layout.module.d.ts","sourceRoot":"","sources":["../../../../../src/libs/ui/layout/src/lib/ui-layout.module.ts"],"names":[],"mappings":";;;;;;;;AAUA,qBAea,cAAc;yCAAd,cAAc;0CAAd,cAAc;0CAAd,cAAc;CAAG"}
@@ -78,6 +78,24 @@ export declare const FORMATS: {
78
78
  readonly color: "#de630b";
79
79
  readonly mimeTypes: readonly ["application/x-dxf", "image/x-dxf"];
80
80
  };
81
+ readonly html: {
82
+ readonly extensions: readonly ["html", "htm"];
83
+ readonly priority: 12;
84
+ readonly color: "#f2bb3a";
85
+ readonly mimeTypes: readonly ["text/html"];
86
+ };
87
+ readonly fgb: {
88
+ readonly extensions: readonly ["fgb", "flatgeobuf"];
89
+ readonly priority: 13;
90
+ readonly color: "#f2bb3a";
91
+ readonly mimeTypes: readonly ["application/flatgeobuf"];
92
+ };
93
+ readonly jsonfg: {
94
+ readonly extensions: readonly ["jsonfg", "jsonfgc"];
95
+ readonly priority: 14;
96
+ readonly color: "#f2bb3a";
97
+ readonly mimeTypes: readonly ["application/vnd.ogc.fg+json", "application/vnd.ogc.fg+json;compatibility=geojson"];
98
+ };
81
99
  };
82
100
  export type FileFormat = keyof typeof FORMATS;
83
101
  export declare function getFormatPriority(linkFormat: FileFormat): number;
@@ -1 +1 @@
1
- {"version":3,"file":"link-utils.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/util/shared/src/lib/links/link-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2DAA2D,CAAA;AAI/F,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FV,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,CAAA;AAE7C,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAUhE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAEjE;AAED,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GACpB,UAAU,GAAG,IAAI,CAgBnB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG,UAAU,CAcnE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE,MAAM,GACZ,OAAO,CAQT;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAO7D;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,UAAU,GACjB,OAAO,CAMT;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAQ5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CA0B9D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAEtE"}
1
+ {"version":3,"file":"link-utils.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/util/shared/src/lib/links/link-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2DAA2D,CAAA;AAI/F,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgHV,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,CAAA;AAE7C,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAUhE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAEjE;AAED,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GACpB,UAAU,GAAG,IAAI,CAgBnB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG,UAAU,CAcnE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE,MAAM,GACZ,OAAO,CAQT;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAO7D;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,UAAU,GACjB,OAAO,CAMT;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAQ5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CA0B9D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAEtE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "geonetwork-ui",
3
- "version": "2.3.0-dev.139106e0",
3
+ "version": "2.3.0-dev.22f4da74",
4
4
  "engines": {
5
5
  "node": ">=14.17.0"
6
6
  },
@@ -3,4 +3,5 @@ import { Observable } from 'rxjs'
3
3
  export abstract class AvatarServiceInterface {
4
4
  public abstract getPlaceholder(): Observable<string>
5
5
  public abstract getProfileIcon(...args): Observable<string>
6
+ public abstract getProfileIconUrl(userId: string): Promise<string>
6
7
  }
@@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'
2
2
  import { AvatarServiceInterface } from './avatar.service.interface'
3
3
  import { Gn4SettingsService } from '../settings/gn4-settings.service'
4
4
  import { map } from 'rxjs/operators'
5
- import { Observable } from 'rxjs'
5
+ import { firstValueFrom, Observable } from 'rxjs'
6
6
 
7
7
  @Injectable({
8
8
  providedIn: 'root',
@@ -14,6 +14,7 @@ export class GravatarService implements AvatarServiceInterface {
14
14
  private readonly identicon$ = this.gn4SettingsService.identicon$.pipe(
15
15
  map((identicon) => identicon?.replace('gravatar:', ''))
16
16
  )
17
+
17
18
  constructor(private gn4SettingsService: Gn4SettingsService) {}
18
19
 
19
20
  getPlaceholder(): Observable<string> {
@@ -26,4 +27,14 @@ export class GravatarService implements AvatarServiceInterface {
26
27
  map((identicon) => `${this.GRAVATAR_URL}${hash}?d=${identicon}`)
27
28
  )
28
29
  }
30
+
31
+ async getProfileIconUrl(userId: string) {
32
+ let iconUrl = ''
33
+ try {
34
+ iconUrl = await firstValueFrom(this.getProfileIcon(userId))
35
+ } catch (error) {
36
+ return ''
37
+ }
38
+ return iconUrl
39
+ }
29
40
  }
@@ -1,17 +1,23 @@
1
1
  import {
2
2
  MeResponseApiModel,
3
3
  UserApiModel,
4
+ UserFeedbackDTOApiModel,
4
5
  } from '../../../../../../../libs/data-access/gn4/src'
5
6
  import { UserModel } from '../../../../../../../libs/common/domain/src/lib/model/user/user.model'
6
7
  import { Injectable } from '@angular/core'
7
- import { AvatarServiceInterface } from '../auth/avatar.service.interface'
8
+ import { AvatarServiceInterface } from '../auth'
8
9
  import { map } from 'rxjs/operators'
9
10
  import { Observable, of } from 'rxjs'
10
11
  import { ThesaurusModel } from '../../../../../../../libs/common/domain/src/lib/model/thesaurus/thesaurus.model'
12
+ import {
13
+ UserFeedback,
14
+ UserFeedbackViewModel,
15
+ } from '../../../../../../../libs/common/domain/src/lib/model/record'
11
16
 
12
17
  @Injectable()
13
18
  export class Gn4PlatformMapper {
14
19
  constructor(private avatarService: AvatarServiceInterface) {}
20
+
15
21
  userFromMeApi(apiUser: MeResponseApiModel): Observable<UserModel | null> {
16
22
  if (!apiUser) return of(null)
17
23
  const {
@@ -28,6 +34,7 @@ export class Gn4PlatformMapper {
28
34
  .getProfileIcon(hash)
29
35
  .pipe(map((profileIcon) => ({ ...user, profileIcon } as UserModel)))
30
36
  }
37
+
31
38
  userFromApi(apiUser: UserApiModel): UserModel {
32
39
  if (!apiUser) return null
33
40
  const {
@@ -65,4 +72,47 @@ export class Gn4PlatformMapper {
65
72
  }
66
73
  })
67
74
  }
75
+
76
+ userFeedbacksFromApi(userFeedback: any): UserFeedback {
77
+ return {
78
+ uuid: userFeedback.uuid,
79
+ metadataUUID: userFeedback.metadataUUID,
80
+ comment: userFeedback.comment,
81
+ authorUserId: userFeedback.authorUserId.toString(),
82
+ authorName: userFeedback.authorName,
83
+ authorEmail: userFeedback.authorEmail,
84
+ published: userFeedback.published,
85
+ parentUuid: userFeedback.parentUuid ?? undefined,
86
+ date: new Date(userFeedback.date),
87
+ }
88
+ }
89
+
90
+ userFeedbacksToApi(
91
+ userFeedback: UserFeedback
92
+ ): Partial<UserFeedbackDTOApiModel> {
93
+ return {
94
+ uuid: userFeedback.uuid,
95
+ metadataUUID: userFeedback.metadataUUID,
96
+ comment: userFeedback.comment,
97
+ authorUserId: Number.parseInt(userFeedback.authorUserId),
98
+ authorName: userFeedback.authorName,
99
+ authorEmail: userFeedback.authorEmail,
100
+ published: userFeedback.published,
101
+ parentUuid: userFeedback.parentUuid,
102
+ date: userFeedback.date.getTime().toString(),
103
+ }
104
+ }
105
+
106
+ async createUserFeedbackViewModel(
107
+ baseUserFeedback: UserFeedback
108
+ ): Promise<UserFeedbackViewModel> {
109
+ const userAvatarUrl = await this.avatarService.getProfileIconUrl(
110
+ baseUserFeedback.authorUserId?.toString()
111
+ )
112
+
113
+ return {
114
+ ...baseUserFeedback,
115
+ avatarUrl: userAvatarUrl,
116
+ }
117
+ }
68
118
  }
@@ -6,11 +6,15 @@ import {
6
6
  RegistriesApiService,
7
7
  SiteApiService,
8
8
  ToolsApiService,
9
+ UserfeedbackApiService,
9
10
  UsersApiService,
10
11
  } from '../../../../../../../libs/data-access/gn4/src'
11
12
  import { PlatformServiceInterface } from '../../../../../../../libs/common/domain/src/lib/platform.service.interface'
12
13
  import { UserModel } from '../../../../../../../libs/common/domain/src/lib/model/user/user.model'
13
- import { Organization } from '../../../../../../../libs/common/domain/src/lib/model/record'
14
+ import {
15
+ Organization,
16
+ UserFeedback,
17
+ } from '../../../../../../../libs/common/domain/src/lib/model/record'
14
18
  import { Gn4PlatformMapper } from './gn4-platform.mapper'
15
19
  import { ltr } from 'semver'
16
20
  import { ThesaurusModel } from '../../../../../../../libs/common/domain/src/lib/model/thesaurus/thesaurus.model'
@@ -21,9 +25,9 @@ const minApiVersion = '4.2.2'
21
25
  @Injectable()
22
26
  export class Gn4PlatformService implements PlatformServiceInterface {
23
27
  private readonly type = 'GeoNetwork'
24
- private me$: Observable<UserModel>
25
- private users$: Observable<UserModel[]>
26
- private isAnonymous$: Observable<boolean>
28
+ private readonly me$: Observable<UserModel>
29
+ private readonly users$: Observable<UserModel[]>
30
+ private readonly isUserAnonymous$: Observable<boolean>
27
31
 
28
32
  private keyTranslations$ = this.toolsApiService
29
33
  .getTranslationsPackage1('gnui')
@@ -65,13 +69,18 @@ export class Gn4PlatformService implements PlatformServiceInterface {
65
69
  private mapper: Gn4PlatformMapper,
66
70
  private toolsApiService: ToolsApiService,
67
71
  private registriesApiService: RegistriesApiService,
68
- private langService: LangService
72
+ private langService: LangService,
73
+ private userfeedbackApiService: UserfeedbackApiService
69
74
  ) {
70
75
  this.me$ = this.meApi.getMe().pipe(
71
76
  switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)),
72
77
  shareReplay({ bufferSize: 1, refCount: true })
73
78
  )
74
- this.isAnonymous$ = this.me$.pipe(map((user) => !user || !('id' in user)))
79
+
80
+ this.isUserAnonymous$ = this.me$.pipe(
81
+ map((user) => !user || !('id' in user))
82
+ )
83
+
75
84
  this.users$ = this.usersApi.getUsers().pipe(
76
85
  map((users) => users.map((user) => this.mapper.userFromApi(user))),
77
86
  shareReplay()
@@ -91,7 +100,7 @@ export class Gn4PlatformService implements PlatformServiceInterface {
91
100
  }
92
101
 
93
102
  isAnonymous(): Observable<boolean> {
94
- return this.isAnonymous$
103
+ return this.isUserAnonymous$
95
104
  }
96
105
 
97
106
  getOrganizations(): Observable<Organization[]> {
@@ -148,6 +157,24 @@ export class Gn4PlatformService implements PlatformServiceInterface {
148
157
  ),
149
158
  shareReplay(1)
150
159
  )
160
+
151
161
  return this.thesauri[uri]
152
162
  }
163
+
164
+ getUserFeedbacks(uuid: string): Observable<UserFeedback[]> {
165
+ return this.userfeedbackApiService
166
+ .getUserComments(uuid)
167
+ .pipe(
168
+ map((userFeedbacks) =>
169
+ userFeedbacks.map(this.mapper.userFeedbacksFromApi)
170
+ )
171
+ )
172
+ }
173
+
174
+ postUserFeedbacks(userFeedback: UserFeedback): Observable<void> {
175
+ const mappedUserFeedBack = this.mapper.userFeedbacksToApi(userFeedback)
176
+ return this.userfeedbackApiService
177
+ .newUserFeedback(mappedUserFeedBack)
178
+ .pipe(map(() => undefined))
179
+ }
153
180
  }
@@ -1,3 +1,4 @@
1
1
  export * from './contact.model'
2
2
  export * from './organization.model'
3
3
  export * from './metadata.model'
4
+ export * from './user-feedbacks.model'
@@ -0,0 +1,15 @@
1
+ export interface UserFeedback {
2
+ uuid: string
3
+ comment: string
4
+ metadataUUID: string
5
+ authorUserId: string
6
+ authorName: string
7
+ authorEmail: string
8
+ published: boolean
9
+ parentUuid?: string
10
+ date: Date
11
+ }
12
+
13
+ export interface UserFeedbackViewModel extends UserFeedback {
14
+ avatarUrl: string
15
+ }
@@ -2,6 +2,7 @@ import type { Observable } from 'rxjs'
2
2
  import type { UserModel } from './model/user/user.model'
3
3
  import type { Organization } from './model/record/organization.model'
4
4
  import type { ThesaurusModel } from './model/thesaurus/'
5
+ import { UserFeedback } from './model/record'
5
6
 
6
7
  export abstract class PlatformServiceInterface {
7
8
  abstract getType(): string
@@ -16,4 +17,6 @@ export abstract class PlatformServiceInterface {
16
17
  abstract getOrganizations(): Observable<Organization[]>
17
18
  abstract translateKey(key: string): Observable<string>
18
19
  abstract getThesaurusByUri(uri: string): Observable<ThesaurusModel>
20
+ abstract getUserFeedbacks(recordUuid: string): Observable<UserFeedback[]>
21
+ abstract postUserFeedbacks(recordUuid: UserFeedback): Observable<void>
19
22
  }
@@ -1,11 +1,13 @@
1
+ export * from './lib/elasticsearch'
2
+ export * from './lib/gn4'
3
+ export * from './lib/search'
4
+
1
5
  export * from './lib/geojson.fixtures'
6
+ export * from './lib/link.fixtures'
2
7
  export * from './lib/ol-feature.fixture'
8
+ export * from './lib/organisations.fixture'
3
9
  export * from './lib/record-link.fixtures'
4
- export * from './lib/link.fixtures'
5
10
  export * from './lib/records.fixtures'
6
- export * from './lib/organisations.fixture'
7
- export * from './lib/elasticsearch'
8
- export * from './lib/search'
9
- export * from './lib/user.fixtures'
10
11
  export * from './lib/repository.fixtures'
11
- export * from './lib/gn4'
12
+ export * from './lib/user.fixtures'
13
+ export * from './lib/user-feedbacks.fixtures'
@@ -110,6 +110,14 @@ export const LINK_FIXTURES: Record<string, DatasetDistribution> = deepFreeze({
110
110
  url: new URL('https://my.ogc.server/wfs'),
111
111
  accessServiceProtocol: 'wfs',
112
112
  },
113
+ geodataWfsDownload: {
114
+ name: 'mylayer',
115
+ type: 'download',
116
+ url: new URL(
117
+ 'https://my.ogc.server/wfs?GetFeature&FeatureType=surval_parametre_ligne&format=csv'
118
+ ),
119
+ accessServiceProtocol: 'wfs',
120
+ },
113
121
  geodataWms2: {
114
122
  name: 'myotherlayer',
115
123
  type: 'service',
@@ -1,5 +1,5 @@
1
1
  import { DatasetRecord } from '../../../../../libs/common/domain/src/lib/model/record'
2
- import { deepFreeze } from './utils/freeze'
2
+ import { deepFreeze } from './utils'
3
3
 
4
4
  export const DATASET_RECORDS: DatasetRecord[] = deepFreeze([
5
5
  {
@@ -49,8 +49,8 @@ export const DATASET_RECORDS: DatasetRecord[] = deepFreeze([
49
49
  status: 'ongoing',
50
50
  recordCreated: new Date('2022-02-01T15:12:00'),
51
51
  recordUpdated: new Date('2022-02-01T15:12:00'),
52
- datasetCreated: new Date('2022-09-01T14:18:19'),
53
- datasetUpdated: new Date('2022-12-04T15:12:00'),
52
+ resourceCreated: new Date('2022-09-01T14:18:19'),
53
+ resourceUpdated: new Date('2022-12-04T15:12:00'),
54
54
  title: 'A very interesting dataset (un jeu de données très intéressant)',
55
55
  abstract: `# Introduction
56
56
  This dataset has been established for testing purposes.
@@ -0,0 +1,83 @@
1
+ import { UserFeedback } from '../../../../../libs/common/domain/src/lib/model/record'
2
+ import { deepFreeze } from './utils'
3
+
4
+ export const SOME_USER_FEEDBACKS: UserFeedback[] = deepFreeze([
5
+ {
6
+ uuid: '4ad03fb7-1728-424c-bdaa-aedd531b07a8',
7
+ comment: 'A nice comment.',
8
+ metadataUUID: 'my-dataset-001',
9
+ authorUserId: '46798',
10
+ authorName: 'Arnaud De Maison',
11
+ authorEmail: 'a.demaison@geo2france.fr',
12
+ published: true,
13
+ parentUuid: undefined,
14
+ date: new Date('2023-01-01T08:00:00Z'),
15
+ },
16
+ {
17
+ uuid: '52cbd0f1-9cb9-4409-8e85-bc608f049af4',
18
+ comment: 'A very nice comment that is a reply.',
19
+ metadataUUID: 'my-dataset-001',
20
+ authorUserId: '46798',
21
+ authorName: 'Arnaud De Maison',
22
+ authorEmail: 'a.demaison@geo2france.fr',
23
+ published: true,
24
+ parentUuid: '4ad03fb7-1728-424c-bdaa-aedd531b07a8',
25
+ date: new Date('2023-01-01T09:00:00Z'),
26
+ },
27
+ {
28
+ uuid: 'b48f62ec-b5e6-4d27-a396-2c2b44f6dcb5',
29
+ comment: 'Another nice comment.',
30
+ metadataUUID: 'my-dataset-001',
31
+ authorUserId: '46798',
32
+ authorName: 'Arnaud De Maison',
33
+ authorEmail: 'a.demaison@geo2france.fr',
34
+ published: true,
35
+ parentUuid: undefined,
36
+ date: new Date('2023-01-01T10:00:00Z'),
37
+ },
38
+ {
39
+ uuid: '1f12a3be-fc8a-4e83-968f-9b88ffbcab02',
40
+ comment: 'Another very nice reply.',
41
+ metadataUUID: 'my-dataset-001',
42
+ authorUserId: '46798',
43
+ authorName: 'Arnaud De Maison',
44
+ authorEmail: 'a.demaison@geo2france.fr',
45
+ published: true,
46
+ parentUuid: '4ad03fb7-1728-424c-bdaa-aedd531b07a8',
47
+ date: new Date('2023-01-01T11:00:00Z'),
48
+ },
49
+ {
50
+ uuid: 'f8dd778d-e93c-4b3c-ba9b-9574be070f46',
51
+ comment: 'Another nice comment.',
52
+ metadataUUID: 'my-dataset-001',
53
+ authorUserId: '46798',
54
+ authorName: 'Arnaud De Maison',
55
+ authorEmail: 'a.demaison@geo2france.fr',
56
+ published: true,
57
+ parentUuid: undefined,
58
+ date: new Date('2023-01-01T10:00:00Z'),
59
+ },
60
+ {
61
+ uuid: 'df3b8872-61d1-4ae9-8822-bb070b94d7d1',
62
+ comment: 'Another nice comment.',
63
+ metadataUUID: 'my-dataset-001',
64
+ authorUserId: '46798',
65
+ authorName: 'Arnaud De Maison',
66
+ authorEmail: 'a.demaison@geo2france.fr',
67
+ published: true,
68
+ parentUuid: undefined,
69
+ date: new Date('2023-01-01T11:00:00Z'),
70
+ },
71
+ ])
72
+
73
+ export const A_USER_FEEDBACK: UserFeedback = deepFreeze({
74
+ uuid: '4ad03fb7-1728-424c-bdaa-aedd531b07a8',
75
+ comment: 'A nice comment.',
76
+ metadataUUID: 'my-dataset-001',
77
+ authorUserId: '46798',
78
+ authorName: 'Arnaud De Maison',
79
+ authorEmail: 'a.demaison@geo2france.fr',
80
+ published: true,
81
+ parentUuid: undefined,
82
+ date: new Date('2023-01-01T08:00:00Z'),
83
+ })
@@ -1,6 +1,11 @@
1
1
  import { Injectable } from '@angular/core'
2
2
  import { marker } from '@biesbjerg/ngx-translate-extract-marker'
3
- import { WfsEndpoint, WfsVersion } from '@camptocamp/ogc-client'
3
+ import {
4
+ OgcApiCollectionInfo,
5
+ OgcApiEndpoint,
6
+ WfsEndpoint,
7
+ WfsVersion,
8
+ } from '@camptocamp/ogc-client'
4
9
  import {
5
10
  BaseReader,
6
11
  FetchError,
@@ -27,6 +32,7 @@ marker('wfs.unreachable.http')
27
32
  marker('wfs.unreachable.unknown')
28
33
  marker('wfs.featuretype.notfound')
29
34
  marker('wfs.geojsongml.notsupported')
35
+ marker('ogc.unreachable.unknown')
30
36
  marker('dataset.error.network')
31
37
  marker('dataset.error.http')
32
38
  marker('dataset.error.parse')
@@ -148,6 +154,35 @@ export class DataService {
148
154
  )
149
155
  }
150
156
 
157
+ async getDownloadLinksFromOgcApiFeatures(
158
+ ogcApiLink: DatasetServiceDistribution
159
+ ): Promise<DatasetDistribution[]> {
160
+ const collectionInfo = await this.getDownloadUrlsFromOgcApi(
161
+ ogcApiLink.url.href
162
+ )
163
+ return Object.keys(collectionInfo.bulkDownloadLinks).map((downloadLink) => {
164
+ return {
165
+ ...ogcApiLink,
166
+ type: 'download',
167
+ url: new URL(collectionInfo.bulkDownloadLinks[downloadLink]),
168
+ mimeType: getMimeTypeForFormat(
169
+ getFileFormatFromServiceOutput(downloadLink)
170
+ ),
171
+ }
172
+ })
173
+ }
174
+
175
+ async getDownloadUrlsFromOgcApi(url: string): Promise<OgcApiCollectionInfo> {
176
+ const endpoint = new OgcApiEndpoint(this.proxy.getProxiedUrl(url))
177
+ return await endpoint.featureCollections
178
+ .then((collections) => {
179
+ return endpoint.getCollectionInfo(collections[0])
180
+ })
181
+ .catch((error) => {
182
+ throw new Error(`ogc.unreachable.unknown`)
183
+ })
184
+ }
185
+
151
186
  getDownloadLinksFromEsriRest(
152
187
  esriRestLink: DatasetServiceDistribution
153
188
  ): DatasetDistribution[] {
@@ -205,6 +240,21 @@ export class DataService {
205
240
  'geojson'
206
241
  )
207
242
  return from(openDataset(url, 'geojson')).pipe()
243
+ } else if (
244
+ link.type === 'service' &&
245
+ link.accessServiceProtocol === 'ogcFeatures'
246
+ ) {
247
+ return from(this.getDownloadUrlsFromOgcApi(link.url.href)).pipe(
248
+ switchMap((collectionInfo) => {
249
+ const geojsonUrl = collectionInfo.jsonDownloadLink
250
+ return openDataset(geojsonUrl, 'geojson')
251
+ }),
252
+ tap((url) => {
253
+ if (url === null) {
254
+ throw new Error('wfs.geojsongml.notsupported')
255
+ }
256
+ })
257
+ )
208
258
  }
209
259
  return throwError(() => 'protocol not supported')
210
260
  }
@@ -0,0 +1,8 @@
1
+ <gn-ui-dropdown-selector
2
+ [title]="label"
3
+ [showTitle]="false"
4
+ [choices]="choices"
5
+ [selected]="selected"
6
+ (selectValue)="onSelectValue($event)"
7
+ >
8
+ </gn-ui-dropdown-selector>
@@ -0,0 +1,64 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'
2
+ import { FormControl } from '@angular/forms'
3
+ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
4
+ import { DropdownSelectorComponent } from '../../../../../../../../../libs/ui/inputs/src'
5
+
6
+ @Component({
7
+ selector: 'gn-ui-form-field-license',
8
+ templateUrl: './form-field-license.component.html',
9
+ styleUrls: ['./form-field-license.component.css'],
10
+ changeDetection: ChangeDetectionStrategy.OnPush,
11
+ standalone: true,
12
+ imports: [DropdownSelectorComponent],
13
+ })
14
+ export class FormFieldLicenseComponent {
15
+ @Input() control!: FormControl
16
+ @Input() label: string
17
+
18
+ get selected() {
19
+ return this.control.value[0]?.text
20
+ }
21
+
22
+ onSelectValue(value: unknown) {
23
+ this.control.setValue([{ text: value }])
24
+ }
25
+
26
+ choices = [
27
+ {
28
+ value: 'cc-by',
29
+ label: marker('editor.record.form.license.cc-by'),
30
+ },
31
+ {
32
+ value: 'cc-by-sa',
33
+ label: marker('editor.record.form.license.cc-by-sa'),
34
+ },
35
+ {
36
+ value: 'cc-zero',
37
+ label: marker('editor.record.form.license.cc-zero'),
38
+ },
39
+ {
40
+ value: 'etalab',
41
+ label: marker('editor.record.form.license.etalab'),
42
+ },
43
+ {
44
+ value: 'etalab-v2',
45
+ label: marker('editor.record.form.license.etalab-v2'),
46
+ },
47
+ {
48
+ value: 'odbl',
49
+ label: marker('editor.record.form.license.odbl'),
50
+ },
51
+ {
52
+ value: 'odc-by',
53
+ label: marker('editor.record.form.license.odc-by'),
54
+ },
55
+ {
56
+ value: 'pddl',
57
+ label: marker('editor.record.form.license.pddl'),
58
+ },
59
+ {
60
+ value: 'unknown',
61
+ label: marker('editor.record.form.license.unknown'),
62
+ },
63
+ ]
64
+ }
@@ -0,0 +1,4 @@
1
+ <gn-ui-date-picker
2
+ [date]="control.value"
3
+ (dateChange)="control.setValue($event)"
4
+ ></gn-ui-date-picker>