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

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 (159) 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/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 +1 -1
  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/record/src/lib/feature-record.module.mjs +4 -4
  19. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +22 -4
  20. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +37 -10
  21. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +22 -7
  22. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +52 -17
  23. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +18 -3
  24. package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +2 -2
  25. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +2 -2
  26. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +34 -7
  27. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -2
  28. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.mjs +59 -0
  29. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +62 -0
  30. package/esm2022/libs/ui/inputs/src/index.mjs +15 -15
  31. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +22 -0
  32. package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +7 -5
  33. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +17 -8
  34. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +27 -4
  35. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +19 -3
  36. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +11 -9
  37. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
  38. package/esm2022/translations/de.json +26 -0
  39. package/esm2022/translations/en.json +26 -0
  40. package/esm2022/translations/es.json +26 -0
  41. package/esm2022/translations/fr.json +26 -0
  42. package/esm2022/translations/it.json +26 -0
  43. package/esm2022/translations/nl.json +26 -0
  44. package/esm2022/translations/pt.json +26 -0
  45. package/fesm2022/geonetwork-ui.mjs +1384 -717
  46. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  47. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts +1 -0
  48. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts.map +1 -1
  49. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts +1 -0
  50. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts.map +1 -1
  51. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +6 -2
  52. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  53. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -6
  54. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  55. package/libs/common/domain/src/lib/model/record/index.d.ts +1 -0
  56. package/libs/common/domain/src/lib/model/record/index.d.ts.map +1 -1
  57. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts +15 -0
  58. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts.map +1 -0
  59. package/libs/common/domain/src/lib/model/user/index.d.ts +2 -0
  60. package/libs/common/domain/src/lib/model/user/index.d.ts.map +1 -0
  61. package/libs/common/domain/src/lib/platform.service.interface.d.ts +3 -0
  62. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  63. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +39 -0
  64. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -0
  65. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +8 -0
  66. 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
  67. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +4 -1
  68. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  69. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  70. package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
  71. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +40 -6
  72. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  73. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +24 -4
  74. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  75. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +14 -4
  76. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  77. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +8 -5
  78. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  79. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +12 -9
  80. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  81. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  82. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +4 -2
  83. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  84. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +16 -14
  85. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  86. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts +11 -0
  87. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts.map +1 -0
  88. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +22 -0
  89. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -0
  90. package/libs/ui/inputs/src/index.d.ts +14 -14
  91. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  92. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +9 -0
  93. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -0
  94. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts +1 -1
  95. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
  96. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +1 -1
  97. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  98. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +7 -1
  99. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  100. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +4 -1
  101. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  102. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -35
  103. package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
  104. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  105. package/package.json +1 -1
  106. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
  107. package/src/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.ts +1 -0
  108. package/src/libs/api/repository/src/lib/gn4/auth/gravatar.service.ts +12 -1
  109. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +51 -1
  110. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +34 -7
  111. package/src/libs/common/domain/src/lib/model/record/index.ts +1 -0
  112. package/src/libs/common/domain/src/lib/model/record/user-feedbacks.model.ts +15 -0
  113. package/src/libs/common/domain/src/lib/platform.service.interface.ts +3 -0
  114. package/src/libs/common/fixtures/src/index.ts +8 -6
  115. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +3 -3
  116. package/src/libs/common/fixtures/src/lib/user-feedbacks.fixtures.ts +83 -0
  117. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css +0 -0
  118. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +8 -0
  119. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +64 -0
  120. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css +0 -0
  121. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +4 -0
  122. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +15 -0
  123. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +33 -33
  124. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +16 -0
  125. package/src/libs/feature/editor/src/lib/fields.config.ts +15 -0
  126. package/src/libs/feature/record/src/lib/feature-record.module.ts +5 -2
  127. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +51 -6
  128. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +82 -7
  129. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +49 -8
  130. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +81 -24
  131. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +40 -10
  132. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +2 -2
  133. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +1 -1
  134. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +40 -4
  135. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +5 -0
  136. package/src/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.ts +54 -0
  137. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.css +0 -0
  138. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +75 -0
  139. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +63 -0
  140. package/src/libs/ui/inputs/src/index.ts +14 -14
  141. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +3 -0
  142. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +11 -0
  143. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +16 -0
  144. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +8 -1
  145. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +13 -0
  146. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.html +2 -1
  147. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +29 -0
  148. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +1 -1
  149. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +16 -1
  150. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
  151. package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
  152. package/translations/de.json +26 -0
  153. package/translations/en.json +26 -0
  154. package/translations/es.json +26 -0
  155. package/translations/fr.json +26 -0
  156. package/translations/it.json +26 -0
  157. package/translations/nl.json +26 -0
  158. package/translations/pt.json +26 -0
  159. package/translations/sk.json +26 -0
@@ -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'
@@ -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
+ })
@@ -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>
@@ -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
  ]
@@ -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,
@@ -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
  }