geonetwork-ui 2.3.0-dev.c22cb78a → 2.3.0-dev.c4b41b40

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 +3 -3
  2. package/esm2022/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.mjs +1 -1
  3. package/esm2022/libs/api/repository/src/lib/gn4/auth/gravatar.service.mjs +12 -1
  4. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +36 -3
  5. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +19 -7
  6. package/esm2022/libs/common/domain/src/lib/model/record/index.mjs +2 -1
  7. package/esm2022/libs/common/domain/src/lib/model/record/user-feedbacks.model.mjs +2 -0
  8. package/esm2022/libs/common/domain/src/lib/model/user/index.mjs +2 -0
  9. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  10. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +53 -2
  11. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +64 -0
  12. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +15 -0
  13. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +20 -6
  14. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
  15. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +16 -1
  16. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +1 -1
  17. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
  18. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
  19. package/esm2022/libs/feature/record/src/lib/feature-record.module.mjs +4 -4
  20. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +3 -2
  21. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +22 -4
  22. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +37 -10
  23. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +22 -7
  24. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +52 -17
  25. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +18 -3
  26. package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +2 -2
  27. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
  28. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +2 -2
  29. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +34 -7
  30. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -7
  31. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.mjs +59 -0
  32. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +62 -0
  33. package/esm2022/libs/ui/inputs/src/index.mjs +16 -15
  34. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +22 -0
  35. package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +7 -5
  36. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +17 -8
  37. package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
  38. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +27 -4
  39. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +19 -3
  40. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +11 -9
  41. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  42. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
  43. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
  44. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
  45. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
  46. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
  47. package/esm2022/translations/de.json +26 -0
  48. package/esm2022/translations/en.json +26 -0
  49. package/esm2022/translations/es.json +26 -0
  50. package/esm2022/translations/fr.json +26 -0
  51. package/esm2022/translations/it.json +26 -0
  52. package/esm2022/translations/nl.json +26 -0
  53. package/esm2022/translations/pt.json +26 -0
  54. package/fesm2022/geonetwork-ui.mjs +1588 -747
  55. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  56. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts +1 -0
  57. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts.map +1 -1
  58. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts +1 -0
  59. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts.map +1 -1
  60. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +6 -2
  61. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  62. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -6
  63. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  64. package/libs/common/domain/src/lib/model/record/index.d.ts +1 -0
  65. package/libs/common/domain/src/lib/model/record/index.d.ts.map +1 -1
  66. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts +15 -0
  67. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts.map +1 -0
  68. package/libs/common/domain/src/lib/model/user/index.d.ts +2 -0
  69. package/libs/common/domain/src/lib/model/user/index.d.ts.map +1 -0
  70. package/libs/common/domain/src/lib/platform.service.interface.d.ts +3 -0
  71. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  72. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +3 -1
  73. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  74. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +39 -0
  75. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -0
  76. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +8 -0
  77. 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
  78. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +4 -1
  79. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  80. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  81. package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
  82. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  83. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +40 -6
  84. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  85. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +24 -4
  86. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  87. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +14 -4
  88. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  89. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +8 -5
  90. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  91. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +12 -9
  92. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  93. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  94. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
  95. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  96. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +4 -2
  97. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  98. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +16 -15
  99. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  100. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts +11 -0
  101. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts.map +1 -0
  102. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +22 -0
  103. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -0
  104. package/libs/ui/inputs/src/index.d.ts +15 -14
  105. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  106. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +9 -0
  107. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -0
  108. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts +1 -1
  109. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
  110. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +1 -1
  111. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  112. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
  113. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
  114. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +7 -1
  115. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  116. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +4 -1
  117. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  118. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -35
  119. package/libs/ui/layout/src/index.d.ts +1 -0
  120. package/libs/ui/layout/src/index.d.ts.map +1 -1
  121. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
  122. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
  123. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
  124. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
  125. package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
  126. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  127. package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
  128. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  129. package/package.json +1 -1
  130. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
  131. package/src/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.ts +1 -0
  132. package/src/libs/api/repository/src/lib/gn4/auth/gravatar.service.ts +12 -1
  133. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +51 -1
  134. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +34 -7
  135. package/src/libs/common/domain/src/lib/model/record/index.ts +1 -0
  136. package/src/libs/common/domain/src/lib/model/record/user-feedbacks.model.ts +15 -0
  137. package/src/libs/common/domain/src/lib/platform.service.interface.ts +3 -0
  138. package/src/libs/common/fixtures/src/index.ts +8 -6
  139. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +3 -3
  140. package/src/libs/common/fixtures/src/lib/user-feedbacks.fixtures.ts +83 -0
  141. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +68 -1
  142. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css +0 -0
  143. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +8 -0
  144. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +64 -0
  145. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css +0 -0
  146. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +4 -0
  147. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +15 -0
  148. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +33 -33
  149. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +16 -0
  150. package/src/libs/feature/editor/src/lib/fields.config.ts +15 -0
  151. package/src/libs/feature/record/src/lib/feature-record.module.ts +5 -2
  152. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +2 -1
  153. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +51 -6
  154. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +82 -7
  155. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +48 -8
  156. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +81 -24
  157. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +40 -10
  158. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +2 -2
  159. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
  160. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
  161. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +1 -1
  162. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +40 -4
  163. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +5 -2
  164. package/src/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.ts +54 -0
  165. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.css +0 -0
  166. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +75 -0
  167. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +63 -0
  168. package/src/libs/ui/inputs/src/index.ts +15 -14
  169. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +3 -0
  170. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +11 -0
  171. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +16 -0
  172. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +8 -1
  173. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +13 -0
  174. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
  175. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
  176. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
  177. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.html +2 -1
  178. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +29 -0
  179. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +1 -1
  180. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +16 -1
  181. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
  182. package/src/libs/ui/layout/src/index.ts +1 -0
  183. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
  184. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
  185. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
  186. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +7 -4
  187. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
  188. package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
  189. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
  190. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
  191. package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
  192. package/translations/de.json +26 -0
  193. package/translations/en.json +26 -0
  194. package/translations/es.json +26 -0
  195. package/translations/fr.json +26 -0
  196. package/translations/it.json +26 -0
  197. package/translations/nl.json +26 -0
  198. package/translations/pt.json +26 -0
  199. package/translations/sk.json +26 -0
@@ -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
  ]
@@ -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
  }
@@ -5,7 +5,11 @@ import * as MdViewActions from './mdview.actions'
5
5
  import * as MdViewSelectors from './mdview.selectors'
6
6
  import { LinkClassifierService, LinkUsage } from '../../../../../../libs/util/shared/src'
7
7
  import { DatavizConfigurationModel } from '../../../../../../libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model'
8
- import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
8
+ import {
9
+ CatalogRecord,
10
+ UserFeedback,
11
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
12
+ import { AvatarServiceInterface } from '../../../../../../libs/api/repository/src'
9
13
 
10
14
  @Injectable()
11
15
  /**
@@ -15,19 +19,31 @@ import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/mode
15
19
  * To clear the current record use the `close()` method.
16
20
  */
17
21
  export class MdViewFacade {
22
+ constructor(
23
+ private store: Store,
24
+ private linkClassifier: LinkClassifierService,
25
+ private avatarService: AvatarServiceInterface
26
+ ) {}
27
+
18
28
  isPresent$ = this.store.pipe(
19
29
  select(MdViewSelectors.getMetadataUuid),
20
30
  map((uuid) => !!uuid)
21
31
  )
22
- isLoading$ = this.store.pipe(select(MdViewSelectors.getMetadataIsLoading))
32
+
33
+ isMetadataLoading$ = this.store.pipe(
34
+ select(MdViewSelectors.getMetadataIsLoading)
35
+ )
36
+
23
37
  metadata$ = this.store.pipe(
24
38
  select(MdViewSelectors.getMetadata),
25
39
  filter((md) => !!md)
26
40
  )
41
+
27
42
  isIncomplete$ = this.store.pipe(
28
43
  select(MdViewSelectors.getMetadataIsIncomplete),
29
44
  filter((incomplete) => incomplete !== null)
30
45
  )
46
+
31
47
  error$ = this.store.pipe(select(MdViewSelectors.getMetadataError))
32
48
 
33
49
  related$ = this.store.pipe(select(MdViewSelectors.getRelated))
@@ -37,11 +53,13 @@ export class MdViewFacade {
37
53
  allLinks$ = this.metadata$.pipe(
38
54
  map((record) => ('distributions' in record ? record.distributions : []))
39
55
  )
56
+
40
57
  apiLinks$ = this.allLinks$.pipe(
41
58
  map((links) =>
42
59
  links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))
43
60
  )
44
61
  )
62
+
45
63
  mapApiLinks$ = this.allLinks$.pipe(
46
64
  map((links) =>
47
65
  links.filter((link) =>
@@ -49,6 +67,7 @@ export class MdViewFacade {
49
67
  )
50
68
  )
51
69
  )
70
+
52
71
  downloadLinks$ = this.allLinks$.pipe(
53
72
  map((links) =>
54
73
  links.filter((link) =>
@@ -56,11 +75,13 @@ export class MdViewFacade {
56
75
  )
57
76
  )
58
77
  )
78
+
59
79
  dataLinks$ = this.allLinks$.pipe(
60
80
  map((links) =>
61
81
  links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.DATA))
62
82
  )
63
83
  )
84
+
64
85
  geoDataLinks$ = this.allLinks$.pipe(
65
86
  map((links) =>
66
87
  links.filter((link) =>
@@ -68,9 +89,11 @@ export class MdViewFacade {
68
89
  )
69
90
  )
70
91
  )
92
+
71
93
  landingPageLinks$ = this.metadata$.pipe(
72
94
  map((record) => ('landingPage' in record ? [record.landingPage] : []))
73
95
  )
96
+
74
97
  otherLinks$ = this.allLinks$.pipe(
75
98
  map((links) =>
76
99
  links.filter((link) =>
@@ -79,10 +102,13 @@ export class MdViewFacade {
79
102
  )
80
103
  )
81
104
 
82
- constructor(
83
- private store: Store,
84
- private linkClassifier: LinkClassifierService
85
- ) {}
105
+ userFeedbacks$ = this.store.pipe(select(MdViewSelectors.getUserFeedbacks))
106
+ isAllUserFeedbackLoading$ = this.store.pipe(
107
+ select(MdViewSelectors.getAllUserFeedbacksLoading)
108
+ )
109
+ isAddUserFeedbackLoading$ = this.store.pipe(
110
+ select(MdViewSelectors.getAddUserFeedbacksLoading)
111
+ )
86
112
 
87
113
  /**
88
114
  * This will show an incomplete record (e.g. from a search result) as a preview
@@ -91,16 +117,30 @@ export class MdViewFacade {
91
117
  setIncompleteMetadata(incomplete: CatalogRecord) {
92
118
  this.store.dispatch(MdViewActions.setIncompleteMetadata({ incomplete }))
93
119
  }
120
+
94
121
  /**
95
122
  * This will trigger the load of a full metadata record
96
123
  */
97
124
  loadFull(uuid: string) {
98
125
  this.store.dispatch(MdViewActions.loadFullMetadata({ uuid }))
99
126
  }
100
- close() {
101
- this.store.dispatch(MdViewActions.close())
127
+
128
+ closeMetadata() {
129
+ this.store.dispatch(MdViewActions.closeMetadata())
102
130
  }
131
+
103
132
  setChartConfig(chartConfig: DatavizConfigurationModel) {
104
133
  this.store.dispatch(MdViewActions.setChartConfig({ chartConfig }))
105
134
  }
135
+
136
+ /**
137
+ * UserFeedbacks
138
+ */
139
+ addUserFeedback(userFeedback: UserFeedback) {
140
+ this.store.dispatch(MdViewActions.addUserFeedback({ userFeedback }))
141
+ }
142
+
143
+ loadUserFeedbacks(datasetUuid: string) {
144
+ this.store.dispatch(MdViewActions.loadUserFeedbacks({ datasetUuid }))
145
+ }
106
146
  }
@@ -1,61 +1,118 @@
1
1
  import { Action, createReducer, on } from '@ngrx/store'
2
- import * as MdViewActions from './mdview.actions'
2
+ import * as MetadataViewActions from './mdview.actions'
3
3
  import { DatavizConfigurationModel } from '../../../../../../libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model'
4
- import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
4
+ import {
5
+ CatalogRecord,
6
+ UserFeedback,
7
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
5
8
 
6
- export const MD_VIEW_FEATURE_STATE_KEY = 'mdView'
9
+ export const METADATA_VIEW_FEATURE_STATE_KEY = 'metadataView'
7
10
 
8
- export interface MdViewState {
11
+ export interface MetadataViewState {
9
12
  loadingFull: boolean
10
13
  error: { notFound?: boolean; otherError?: string } | null
11
14
  metadata?: Partial<CatalogRecord>
12
15
  related?: CatalogRecord[]
16
+ userFeedbacks?: UserFeedback[]
17
+ allUserFeedbacksLoading: boolean
18
+ addUserFeedbackLoading: boolean
13
19
  chartConfig?: DatavizConfigurationModel
14
20
  }
15
21
 
16
- export const initialMdviewState: MdViewState = {
22
+ export const initialMetadataViewState: MetadataViewState = {
17
23
  error: null,
18
24
  loadingFull: false,
25
+ allUserFeedbacksLoading: false,
26
+ addUserFeedbackLoading: false,
19
27
  }
20
28
 
21
- const mdViewReducer = createReducer(
22
- initialMdviewState,
23
- on(MdViewActions.loadFullMetadata, (state) => ({
29
+ const metadataViewReducer = createReducer(
30
+ initialMetadataViewState,
31
+
32
+ /*
33
+ Metadata reducers
34
+ */
35
+ on(MetadataViewActions.loadFullMetadata, (state) => ({
24
36
  ...state,
25
37
  error: null,
26
38
  loadingFull: true,
27
39
  })),
28
- on(MdViewActions.setIncompleteMetadata, (state, { incomplete }) => ({
40
+ on(MetadataViewActions.setIncompleteMetadata, (state, { incomplete }) => ({
29
41
  ...state,
30
42
  error: null,
31
43
  metadata: incomplete,
32
44
  })),
33
- on(MdViewActions.loadFullSuccess, (state, { full }) => ({
45
+ on(MetadataViewActions.loadFullMetadataSuccess, (state, { full }) => ({
34
46
  ...state,
35
47
  error: null,
36
48
  metadata: full,
37
49
  loadingFull: false,
38
50
  })),
39
- on(MdViewActions.loadFullFailure, (state, { otherError, notFound }) => ({
40
- ...state,
41
- error: { otherError, notFound },
42
- loadingFull: false,
43
- })),
44
- on(MdViewActions.setRelated, (state, { related }) => ({
51
+ on(
52
+ MetadataViewActions.loadFullMetadataFailure,
53
+ (state, { otherError, notFound }) => ({
54
+ ...state,
55
+ error: { otherError, notFound },
56
+ loadingFull: false,
57
+ })
58
+ ),
59
+ on(MetadataViewActions.closeMetadata, (state) => {
60
+ const { metadata, related, userFeedbacks, ...stateWithoutMetadata } = state
61
+ return stateWithoutMetadata
62
+ }),
63
+
64
+ /*
65
+ Related reducers
66
+ */
67
+ on(MetadataViewActions.setRelated, (state, { related }) => ({
45
68
  ...state,
46
69
  related,
47
70
  })),
48
- on(MdViewActions.setChartConfig, (state, { chartConfig }) => ({
71
+
72
+ /*
73
+ ChartConfig reducers
74
+ */
75
+ on(MetadataViewActions.setChartConfig, (state, { chartConfig }) => ({
49
76
  ...state,
50
77
  chartConfig,
51
78
  })),
52
- on(MdViewActions.close, (state) => {
53
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
54
- const { metadata, related, ...stateWithoutMd } = state
55
- return stateWithoutMd
56
- })
79
+
80
+ /*
81
+ UserFeedbacks reducers
82
+ */
83
+ on(MetadataViewActions.loadUserFeedbacks, (state) => ({
84
+ ...state,
85
+ error: null,
86
+ allUserFeedbacksLoading: true,
87
+ })),
88
+ on(MetadataViewActions.addUserFeedback, (state) => ({
89
+ ...state,
90
+ addUserFeedbackLoading: true,
91
+ })),
92
+ on(
93
+ MetadataViewActions.loadUserFeedbacksSuccess,
94
+ (state, { userFeedbacks }) => ({
95
+ ...state,
96
+ error: null,
97
+ userFeedbacks: userFeedbacks,
98
+ addUserFeedbackLoading: false,
99
+ allUserFeedbacksLoading: false,
100
+ })
101
+ ),
102
+ on(
103
+ MetadataViewActions.loadUserFeedbacksFailure,
104
+ (state, { otherError, notFound }) => ({
105
+ ...state,
106
+ error: { otherError, notFound },
107
+ addUserFeedbackLoading: false,
108
+ allUserFeedbacksLoading: false,
109
+ })
110
+ )
57
111
  )
58
112
 
59
- export function reducer(state: MdViewState | undefined, action: Action) {
60
- return mdViewReducer(state, action)
113
+ export function reducer(
114
+ metadataViewState: MetadataViewState | undefined,
115
+ action: Action
116
+ ) {
117
+ return metadataViewReducer(metadataViewState, action)
61
118
  }
@@ -1,36 +1,66 @@
1
1
  import { createFeatureSelector, createSelector } from '@ngrx/store'
2
- import { MD_VIEW_FEATURE_STATE_KEY, MdViewState } from './mdview.reducer'
2
+ import {
3
+ METADATA_VIEW_FEATURE_STATE_KEY,
4
+ MetadataViewState,
5
+ } from './mdview.reducer'
3
6
 
4
- export const getMdViewState = createFeatureSelector<MdViewState>(
5
- MD_VIEW_FEATURE_STATE_KEY
7
+ export const getMdViewState = createFeatureSelector<MetadataViewState>(
8
+ METADATA_VIEW_FEATURE_STATE_KEY
6
9
  )
7
10
 
11
+ /*
12
+ Metadata selectors
13
+ */
8
14
  export const getMetadataUuid = createSelector(
9
15
  getMdViewState,
10
- (state: MdViewState) =>
16
+ (state: MetadataViewState) =>
11
17
  state.metadata ? state.metadata.uniqueIdentifier : null
12
18
  )
13
19
  export const getMetadata = createSelector(
14
20
  getMdViewState,
15
- (state: MdViewState) => state.metadata
21
+ (state: MetadataViewState) => state.metadata
16
22
  )
17
23
  export const getMetadataIsIncomplete = createSelector(
18
24
  getMdViewState,
19
- (state: MdViewState) => (state.metadata ? state.loadingFull : null)
25
+ (state: MetadataViewState) => (state.metadata ? state.loadingFull : null)
20
26
  )
21
27
  export const getMetadataIsLoading = createSelector(
22
28
  getMdViewState,
23
- (state: MdViewState) => state.loadingFull
29
+ (state: MetadataViewState) => state.loadingFull
24
30
  )
25
31
  export const getMetadataError = createSelector(
26
32
  getMdViewState,
27
- (state: MdViewState) => state.error
33
+ (state: MetadataViewState) => state.error
28
34
  )
35
+
36
+ /*
37
+ Related selectors
38
+ */
29
39
  export const getRelated = createSelector(
30
40
  getMdViewState,
31
- (state: MdViewState) => state.related
41
+ (state: MetadataViewState) => state.related
32
42
  )
43
+
44
+ /*
45
+ Metadata selectors
46
+ */
33
47
  export const getChartConfig = createSelector(
34
48
  getMdViewState,
35
- (state: MdViewState) => state.chartConfig
49
+ (state: MetadataViewState) => state.chartConfig
50
+ )
51
+
52
+ /*
53
+ UserFeedback selectors
54
+ */
55
+ export const getUserFeedbacks = createSelector(
56
+ getMdViewState,
57
+ (state: MetadataViewState) => state.userFeedbacks
58
+ )
59
+ export const getAllUserFeedbacksLoading = createSelector(
60
+ getMdViewState,
61
+ (state: MetadataViewState) => state.allUserFeedbacksLoading
62
+ )
63
+ export const getAddUserFeedbacksLoading = createSelector(
64
+ getMdViewState,
65
+ (state: MetadataViewState) => state.addUserFeedbackLoading
36
66
  )
@@ -15,7 +15,7 @@ import {
15
15
  } from '../../../../../../../libs/common/domain/src/lib/model/search'
16
16
  import { Actions, createEffect, ofType } from '@ngrx/effects'
17
17
  import { navigation } from '@ngrx/router-store/data-persistence'
18
- import { of, pairwise, startWith, withLatestFrom } from 'rxjs'
18
+ import { of, pairwise, startWith } from 'rxjs'
19
19
  import { map, mergeMap, tap } from 'rxjs/operators'
20
20
  import * as RouterActions from './router.actions'
21
21
  import { RouterFacade } from './router.facade'
@@ -141,7 +141,7 @@ export class RouterEffects {
141
141
  navigateToSearch$ = createEffect(() =>
142
142
  this._actions$.pipe(
143
143
  navigation(this.routerConfig.searchRouteComponent, {
144
- run: () => MdViewActions.close(),
144
+ run: () => MdViewActions.closeMetadata(),
145
145
  })
146
146
  )
147
147
  )