geonetwork-ui 2.4.0-dev.656babc7 → 2.4.0-dev.8f04e899

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 (77) hide show
  1. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +5 -5
  2. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  3. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +4 -4
  4. package/esm2022/libs/feature/dataviz/src/lib/feature-dataviz.module.mjs +7 -4
  5. package/esm2022/libs/feature/dataviz/src/lib/table-view/table-view.component.mjs +1 -1
  6. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +2 -1
  7. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +6 -4
  8. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +2 -1
  9. package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +2 -2
  10. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.mjs +14 -44
  11. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +64 -50
  12. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +12 -35
  13. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +12 -6
  14. package/esm2022/libs/feature/record/src/lib/feature-record.module.mjs +7 -4
  15. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +3 -3
  16. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +7 -4
  17. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +3 -3
  18. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +59 -26
  19. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +2 -7
  20. package/esm2022/libs/ui/widgets/src/lib/popup-alert/popup-alert.component.mjs +5 -3
  21. package/esm2022/libs/ui/widgets/src/lib/ui-widgets.module.mjs +1 -6
  22. package/fesm2022/geonetwork-ui.mjs +397 -396
  23. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  24. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  25. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +1 -1
  26. package/libs/feature/dataviz/src/lib/feature-dataviz.module.d.ts +2 -1
  27. package/libs/feature/dataviz/src/lib/feature-dataviz.module.d.ts.map +1 -1
  28. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +1 -0
  29. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -1
  30. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts +1 -1
  31. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts.map +1 -1
  32. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +1 -0
  33. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
  34. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts +14 -24
  35. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts.map +1 -1
  36. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts +6 -6
  37. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts.map +1 -1
  38. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +5 -10
  39. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  40. package/libs/feature/editor/src/lib/services/editor.service.d.ts +1 -1
  41. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  42. package/libs/feature/record/src/lib/feature-record.module.d.ts +2 -1
  43. package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
  44. package/libs/feature/search/src/lib/feature-search.module.d.ts +2 -1
  45. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  46. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  47. package/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.d.ts +7 -4
  48. package/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.d.ts.map +1 -1
  49. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -36
  50. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  51. package/libs/ui/widgets/src/lib/popup-alert/popup-alert.component.d.ts +1 -1
  52. package/libs/ui/widgets/src/lib/popup-alert/popup-alert.component.d.ts.map +1 -1
  53. package/libs/ui/widgets/src/lib/ui-widgets.module.d.ts +10 -11
  54. package/libs/ui/widgets/src/lib/ui-widgets.module.d.ts.map +1 -1
  55. package/package.json +1 -1
  56. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +7 -8
  57. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +1 -1
  58. package/src/libs/feature/dataviz/src/lib/feature-dataviz.module.ts +2 -1
  59. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +2 -0
  60. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +35 -29
  61. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +1 -0
  62. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +1 -1
  63. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.html +2 -3
  64. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.ts +19 -61
  65. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +95 -86
  66. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +2 -22
  67. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +11 -44
  68. package/src/libs/feature/editor/src/lib/services/editor.service.ts +20 -6
  69. package/src/libs/feature/record/src/lib/feature-record.module.ts +3 -2
  70. package/src/libs/feature/search/src/lib/feature-search.module.ts +2 -1
  71. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +2 -2
  72. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.css +0 -1
  73. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +23 -19
  74. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.ts +79 -27
  75. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +0 -3
  76. package/src/libs/ui/widgets/src/lib/popup-alert/popup-alert.component.ts +4 -0
  77. package/src/libs/ui/widgets/src/lib/ui-widgets.module.ts +0 -3
@@ -5,7 +5,11 @@ import { catchError, map, switchMap } from 'rxjs/operators'
5
5
  import * as EditorActions from './editor.actions'
6
6
  import { EditorService } from '../services/editor.service'
7
7
  import { Store } from '@ngrx/store'
8
- import { selectRecord, selectRecordFieldsConfig } from './editor.selectors'
8
+ import {
9
+ selectRecord,
10
+ selectRecordAlreadySavedOnce,
11
+ selectRecordFieldsConfig,
12
+ } from './editor.selectors'
9
13
  import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
10
14
 
11
15
  @Injectable()
@@ -20,28 +24,31 @@ export class EditorEffects {
20
24
  ofType(EditorActions.saveRecord),
21
25
  withLatestFrom(
22
26
  this.store.select(selectRecord),
23
- this.store.select(selectRecordFieldsConfig)
27
+ this.store.select(selectRecordFieldsConfig),
28
+ this.store.select(selectRecordAlreadySavedOnce)
24
29
  ),
25
- switchMap(([, record, fieldsConfig]) =>
26
- this.editorService.saveRecord(record, fieldsConfig).pipe(
27
- switchMap(([record, recordSource]) =>
28
- of(
29
- EditorActions.saveRecordSuccess(),
30
- EditorActions.openRecord({
31
- record,
32
- alreadySavedOnce: true,
33
- recordSource,
34
- })
35
- )
36
- ),
37
- catchError((error) =>
38
- of(
39
- EditorActions.saveRecordFailure({
40
- error: error.message,
41
- })
30
+ switchMap(([, record, fieldsConfig, alreadySavedOnce]) =>
31
+ this.editorService
32
+ .saveRecord(record, fieldsConfig, !alreadySavedOnce)
33
+ .pipe(
34
+ switchMap(([record, recordSource]) =>
35
+ of(
36
+ EditorActions.saveRecordSuccess(),
37
+ EditorActions.openRecord({
38
+ record,
39
+ alreadySavedOnce: true,
40
+ recordSource,
41
+ })
42
+ )
43
+ ),
44
+ catchError((error) =>
45
+ of(
46
+ EditorActions.saveRecordFailure({
47
+ error: error.message,
48
+ })
49
+ )
42
50
  )
43
51
  )
44
- )
45
52
  )
46
53
  )
47
54
  )
@@ -53,15 +60,14 @@ export class EditorEffects {
53
60
  )
54
61
  )
55
62
 
56
- saveRecordDraft$ = createEffect(
57
- () =>
58
- this.actions$.pipe(
59
- ofType(EditorActions.updateRecordField),
60
- debounceTime(1000),
61
- withLatestFrom(this.store.select(selectRecord)),
62
- switchMap(([, record]) => this.editorService.saveRecordAsDraft(record))
63
- ),
64
- { dispatch: false }
63
+ saveRecordDraft$ = createEffect(() =>
64
+ this.actions$.pipe(
65
+ ofType(EditorActions.updateRecordField),
66
+ debounceTime(1000),
67
+ withLatestFrom(this.store.select(selectRecord)),
68
+ switchMap(([, record]) => this.editorService.saveRecordAsDraft(record)),
69
+ map(() => EditorActions.draftSaveSuccess())
70
+ )
65
71
  )
66
72
 
67
73
  checkHasChangesOnOpen$ = createEffect(() =>
@@ -26,6 +26,7 @@ export class EditorFacade {
26
26
  select(EditorSelectors.selectRecordChangedSinceSave)
27
27
  )
28
28
  recordFields$ = this.store.pipe(select(EditorSelectors.selectRecordFields))
29
+ draftSaveSuccess$ = this.actions$.pipe(ofType(EditorActions.draftSaveSuccess))
29
30
 
30
31
  openRecord(
31
32
  record: CatalogRecord,
@@ -44,6 +44,6 @@ export const selectRecordFields = createSelector(
44
44
  (state: EditorState) =>
45
45
  state.fieldsConfig.map((fieldConfig) => ({
46
46
  config: fieldConfig,
47
- value: state.record?.[fieldConfig.model] || null,
47
+ value: state.record?.[fieldConfig.model] ?? null,
48
48
  }))
49
49
  )
@@ -4,10 +4,9 @@
4
4
  [displayWithFn]="displayWithFn"
5
5
  [action]="autoCompleteAction"
6
6
  (itemSelected)="handleItemSelection($event)"
7
- (inputSubmitted)="handleInputSubmission($event)"
8
- (inputCleared)="handleInputCleared()"
9
- [value]="searchInputValue$ | async"
10
7
  [clearOnSelection]="true"
8
+ [minCharacterCount]="0"
9
+ [allowSubmit]="false"
11
10
  ></gn-ui-autocomplete>
12
11
  <div class="flex gap-2 flex-wrap">
13
12
  <gn-ui-badge
@@ -1,24 +1,17 @@
1
1
  import { CommonModule } from '@angular/common'
2
- import {
3
- ChangeDetectionStrategy,
4
- Component,
5
- EventEmitter,
6
- Input,
7
- OnInit,
8
- Output,
9
- } from '@angular/core'
2
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'
10
3
  import { FormControl } from '@angular/forms'
11
- import {
12
- KeywordType,
13
- ThesaurusModel,
14
- } from '../../../../../../../../../libs/common/domain/src/lib/model/thesaurus'
15
4
  import { PlatformServiceInterface } from '../../../../../../../../../libs/common/domain/src/lib/platform.service.interface'
16
5
  import {
6
+ AutocompleteComponent,
17
7
  DropdownSelectorComponent,
18
8
  UiInputsModule,
19
9
  } from '../../../../../../../../../libs/ui/inputs/src'
20
10
  import { UiWidgetsModule } from '../../../../../../../../../libs/ui/widgets/src'
21
- import { Observable, map } from 'rxjs'
11
+ import { map } from 'rxjs'
12
+ import { Keyword } from '../../../../../../../../../libs/common/domain/src/lib/model/record'
13
+
14
+ type AutocompleteItem = { title: string; value: Keyword }
22
15
 
23
16
  @Component({
24
17
  selector: 'gn-ui-form-field-keywords',
@@ -31,69 +24,34 @@ import { Observable, map } from 'rxjs'
31
24
  UiInputsModule,
32
25
  CommonModule,
33
26
  UiWidgetsModule,
27
+ AutocompleteComponent,
34
28
  ],
35
29
  })
36
- export class FormFieldKeywordsComponent implements OnInit {
37
- @Input() control: FormControl<any>
38
- @Output() itemSelected = new EventEmitter<string>()
39
- @Output() inputSubmitted = new EventEmitter<string>()
40
- searchInputValue$: Observable<void | { title: string }>
41
- allThesaurus$: Observable<any[]>
30
+ export class FormFieldKeywordsComponent {
31
+ @Input() control: FormControl<Keyword[]>
42
32
 
43
- displayWithFn = (item) => {
44
- if (item) {
45
- return `${item?.title} (${item?.value?.name})`
46
- }
47
- return null
33
+ displayWithFn = (item: AutocompleteItem) => {
34
+ return `${item.title} (${item.value.thesaurus?.name})`
48
35
  }
49
36
 
50
37
  autoCompleteAction = (query: string) => {
51
- const keywords$ = this.platformService.searchKeywords(query).pipe(
52
- map((thesaurus) =>
53
- thesaurus.map((thes) => {
54
- return { title: thes.label, value: thes.thesaurus }
38
+ return this.platformService.searchKeywords(query).pipe(
39
+ map((keywords) =>
40
+ keywords.map((keyword) => {
41
+ return { title: keyword.label, value: keyword }
55
42
  })
56
43
  )
57
44
  )
58
-
59
- return keywords$
60
45
  }
61
46
 
62
47
  constructor(private platformService: PlatformServiceInterface) {}
63
48
 
64
- ngOnInit(): void {
65
- this.searchInputValue$ = this.autoCompleteAction('')[0]
66
- }
67
-
68
- // type: { title: string; value: ThesaurusModel }
69
- handleItemSelection(item) {
70
- this.addKeyword({
71
- label: item.title,
72
- thesaurus: item.value,
73
- type: item.value.type,
74
- })
75
- }
76
-
77
- handleInputSubmission(any: string) {
78
- // Should there be an input submission?
79
-
80
- if (this.inputSubmitted.observers.length > 0) {
81
- this.inputSubmitted.emit(any)
82
- } else {
83
- // this.searchService.updateFilters({ any })
84
- }
85
- }
86
-
87
- async handleInputCleared() {
88
- this.autoCompleteAction('')
49
+ handleItemSelection(item: AutocompleteItem) {
50
+ this.addKeyword(item.value)
89
51
  }
90
52
 
91
- addKeyword(item: {
92
- label: string
93
- thesaurus: ThesaurusModel
94
- type: KeywordType
95
- }) {
96
- const addedKeywords = [...this.control.value, item]
53
+ addKeyword(keyword: Keyword) {
54
+ const addedKeywords = [...this.control.value, keyword]
97
55
 
98
56
  // remove duplicates from keyword
99
57
  const filteredKeywords = addedKeywords.filter((value, index, self) => {
@@ -5,12 +5,17 @@ import {
5
5
  OnInit,
6
6
  } from '@angular/core'
7
7
  import { FormControl } from '@angular/forms'
8
- import { marker } from '@biesbjerg/ngx-translate-extract-marker'
9
8
  import {
10
9
  CheckToggleComponent,
10
+ DropdownChoice,
11
11
  DropdownSelectorComponent,
12
12
  } from '../../../../../../../../../libs/ui/inputs/src'
13
13
  import { TranslateModule, TranslateService } from '@ngx-translate/core'
14
+ import {
15
+ UpdateFrequency,
16
+ UpdateFrequencyCustom,
17
+ } from '../../../../../../../../../libs/common/domain/src/lib/model/record'
18
+ import { firstValueFrom } from 'rxjs'
14
19
 
15
20
  @Component({
16
21
  selector: 'gn-ui-form-field-update-frequency',
@@ -21,26 +26,32 @@ import { TranslateModule, TranslateService } from '@ngx-translate/core'
21
26
  imports: [CheckToggleComponent, DropdownSelectorComponent, TranslateModule],
22
27
  })
23
28
  export class FormFieldUpdateFrequencyComponent implements OnInit {
24
- @Input() control: FormControl
29
+ @Input() control: FormControl<UpdateFrequency>
30
+
31
+ protected choices: DropdownChoice[] = []
25
32
 
26
33
  get planned() {
27
- return this.control.value !== 'notPlanned'
34
+ return typeof this.control.value !== 'string'
28
35
  }
29
36
 
30
37
  constructor(private translateService: TranslateService) {}
31
38
 
32
- ngOnInit() {
33
- const updatedTimes = this.control.value?.updatedTimes
34
- const per = this.control.value?.per
39
+ async ngOnInit() {
40
+ this.choices = await this.getInitialChoices()
41
+ if (typeof this.control.value === 'string') {
42
+ return
43
+ }
44
+ const updatedTimes = this.control.value.updatedTimes
45
+ const per = this.control.value.per
46
+ // the update frequency is not in the list; make it appear there
35
47
  if (updatedTimes && updatedTimes !== 1 && updatedTimes !== 2) {
36
48
  this.choices = [
37
49
  {
38
50
  value: `${per}.${updatedTimes}`,
39
- label: this.translateService.instant(
40
- `domain.record.updateFrequency.${per}`,
41
- {
51
+ label: await firstValueFrom(
52
+ this.translateService.get(`domain.record.updateFrequency.${per}`, {
42
53
  count: updatedTimes,
43
- }
54
+ })
44
55
  ),
45
56
  },
46
57
  ...this.choices,
@@ -56,88 +67,86 @@ export class FormFieldUpdateFrequencyComponent implements OnInit {
56
67
  }
57
68
  }
58
69
 
59
- get selectedFrequency() {
70
+ get selectedFrequency(): string {
71
+ if (typeof this.control.value === 'string') return null
60
72
  const { updatedTimes, per } = this.control.value
61
73
  return `${per}.${updatedTimes}`
62
74
  }
63
75
 
64
76
  onSelectFrequencyValue(value: unknown) {
65
77
  const split = (value as string).split('.')
66
- this.control.setValue({ updatedTimes: Number(split[1]), per: split[0] })
78
+ this.control.setValue({
79
+ updatedTimes: Number(split[1]),
80
+ per: split[0] as UpdateFrequencyCustom['per'],
81
+ })
67
82
  }
68
83
 
69
- choices = [
70
- {
71
- value: 'day.1',
72
- label: this.translateService.instant(
73
- 'domain.record.updateFrequency.day',
74
- {
75
- count: 1,
76
- }
77
- ),
78
- },
79
- {
80
- value: 'day.2',
81
- label: this.translateService.instant(
82
- 'domain.record.updateFrequency.day',
83
- {
84
- count: 2,
85
- }
86
- ),
87
- },
88
- {
89
- value: 'week.1',
90
- label: this.translateService.instant(
91
- 'domain.record.updateFrequency.week',
92
- {
93
- count: 1,
94
- }
95
- ),
96
- },
97
- {
98
- value: 'week.2',
99
- label: this.translateService.instant(
100
- 'domain.record.updateFrequency.week',
101
- {
102
- count: 2,
103
- }
104
- ),
105
- },
106
- {
107
- value: 'month.1',
108
- label: this.translateService.instant(
109
- 'domain.record.updateFrequency.month',
110
- {
111
- count: 1,
112
- }
113
- ),
114
- },
115
- {
116
- value: 'month.2',
117
- label: this.translateService.instant(
118
- 'domain.record.updateFrequency.month',
119
- {
120
- count: 2,
121
- }
122
- ),
123
- },
124
- {
125
- value: 'year.1',
126
- label: this.translateService.instant(
127
- 'domain.record.updateFrequency.year',
128
- {
129
- count: 1,
130
- }
131
- ),
132
- },
133
- {
134
- value: 'year.2',
135
- label: this.translateService.instant(
136
- 'domain.record.updateFrequency.year',
137
- {
138
- count: 2,
139
- }
140
- ),
141
- },
142
- ]
84
+ private async getInitialChoices() {
85
+ return [
86
+ {
87
+ value: 'day.1',
88
+ label: await firstValueFrom(
89
+ this.translateService.get('domain.record.updateFrequency.day', {
90
+ count: 1,
91
+ })
92
+ ),
93
+ },
94
+ {
95
+ value: 'day.2',
96
+ label: await firstValueFrom(
97
+ this.translateService.get('domain.record.updateFrequency.day', {
98
+ count: 2,
99
+ })
100
+ ),
101
+ },
102
+ {
103
+ value: 'week.1',
104
+ label: await firstValueFrom(
105
+ this.translateService.get('domain.record.updateFrequency.week', {
106
+ count: 1,
107
+ })
108
+ ),
109
+ },
110
+ {
111
+ value: 'week.2',
112
+ label: await firstValueFrom(
113
+ this.translateService.get('domain.record.updateFrequency.week', {
114
+ count: 2,
115
+ })
116
+ ),
117
+ },
118
+ {
119
+ value: 'month.1',
120
+ label: await firstValueFrom(
121
+ this.translateService.get('domain.record.updateFrequency.month', {
122
+ count: 1,
123
+ })
124
+ ),
125
+ },
126
+ {
127
+ value: 'month.2',
128
+ label: await firstValueFrom(
129
+ this.translateService.get('domain.record.updateFrequency.month', {
130
+ count: 2,
131
+ })
132
+ ),
133
+ },
134
+ {
135
+ value: 'year.1',
136
+ label: await firstValueFrom(
137
+ this.translateService.get('domain.record.updateFrequency.year', {
138
+ count: 1,
139
+ })
140
+ ),
141
+ },
142
+ {
143
+ value: 'year.2',
144
+ label: await firstValueFrom(
145
+ this.translateService.get('domain.record.updateFrequency.year', {
146
+ count: 2,
147
+ })
148
+ ),
149
+ },
150
+ ]
151
+ }
143
152
  }
@@ -68,25 +68,11 @@
68
68
  </ng-container>
69
69
  <ng-container *ngIf="isSimpleField">
70
70
  <gn-ui-form-field-simple
71
- [type]="simpleType"
71
+ type="text"
72
72
  [control]="formControl"
73
- [readonly]="isFieldLocked"
74
- [invalid]="isFieldInvalid"
73
+ [readonly]="isReadOnly"
75
74
  ></gn-ui-form-field-simple>
76
75
  </ng-container>
77
- <ng-container *ngIf="isFileField">
78
- <gn-ui-form-field-file
79
- [control]="formControl"
80
- [readonly]="isFieldLocked"
81
- [invalid]="isFieldInvalid"
82
- ></gn-ui-form-field-file>
83
- </ng-container>
84
- <ng-container *ngIf="isArrayField">
85
- <gn-ui-form-field-array></gn-ui-form-field-array>
86
- </ng-container>
87
- <ng-container *ngIf="isObjectField">
88
- <gn-ui-form-field-object></gn-ui-form-field-object>
89
- </ng-container>
90
76
  <ng-container *ngIf="isSpatialExtentField">
91
77
  <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>
92
78
  </ng-container>
@@ -95,10 +81,4 @@
95
81
  [control]="formControl"
96
82
  ></gn-ui-form-field-keywords>
97
83
  </ng-container>
98
- <div
99
- *ngIf="isFieldInvalid && config.invalidHintKey"
100
- class="mt-2 text-pink-500 text-sm field-invalid-hint"
101
- >
102
- {{ config.invalidHintKey | translate }}
103
- </div>
104
84
  </ng-template>
@@ -27,6 +27,7 @@ import { FormFieldSimpleComponent } from './form-field-simple/form-field-simple.
27
27
  import { FormFieldSpatialExtentComponent } from './form-field-spatial-extent/form-field-spatial-extent.component'
28
28
  import { FormFieldConfig } from './form-field.model'
29
29
  import { FormFieldUpdateFrequencyComponent } from './form-field-update-frequency/form-field-update-frequency.component'
30
+ import { CatalogRecordKeys } from '../../../../../../../../libs/common/domain/src/lib/model/record'
30
31
  import { FormFieldKeywordsComponent } from './form-field-keywords/form-field-keywords.component'
31
32
 
32
33
  @Component({
@@ -57,7 +58,7 @@ import { FormFieldKeywordsComponent } from './form-field-keywords/form-field-key
57
58
  ],
58
59
  })
59
60
  export class FormFieldComponent {
60
- @Input() model: string
61
+ @Input() model: CatalogRecordKeys
61
62
  @Input() config: FormFieldConfig
62
63
  @Input() set value(v: unknown) {
63
64
  this.formControl.setValue(v, {
@@ -78,49 +79,6 @@ export class FormFieldComponent {
78
79
  this.titleInput.nativeElement.children[0].focus()
79
80
  }
80
81
 
81
- get simpleType() {
82
- return this.config.type as
83
- | 'date'
84
- | 'url'
85
- | 'text'
86
- | 'number'
87
- | 'list'
88
- | 'toggle'
89
- }
90
-
91
- get isSimpleField() {
92
- return (
93
- this.config.type === 'text' ||
94
- this.config.type === 'number' ||
95
- this.config.type === 'date' ||
96
- this.config.type === 'list' ||
97
- this.config.type === 'url' ||
98
- this.config.type === 'toggle'
99
- )
100
- }
101
- get isFileField() {
102
- return this.config.type === 'file'
103
- }
104
- get isSpatialExtentField() {
105
- return this.config.type === 'spatial_extent'
106
- }
107
- get isArrayField() {
108
- return this.config.type === 'array'
109
- }
110
- get isObjectField() {
111
- return this.config.type === 'object'
112
- }
113
-
114
- get isFieldOk() {
115
- return !this.config.locked && !this.config.invalid
116
- }
117
- get isFieldLocked() {
118
- return this.config.locked
119
- }
120
- get isFieldInvalid() {
121
- return !this.config.locked && this.config.invalid
122
- }
123
-
124
82
  get isTitle() {
125
83
  return this.model === 'title'
126
84
  }
@@ -139,6 +97,15 @@ export class FormFieldComponent {
139
97
  get isTemporalExtents() {
140
98
  return this.model === 'temporalExtents'
141
99
  }
100
+ get isSpatialExtentField() {
101
+ return this.model === 'spatialExtents'
102
+ }
103
+ get isSimpleField() {
104
+ return this.model === 'uniqueIdentifier' || this.model === 'recordUpdated'
105
+ }
106
+ get isReadOnly() {
107
+ return this.model === 'uniqueIdentifier' || this.model === 'recordUpdated'
108
+ }
142
109
  get isKeywords() {
143
110
  return this.model === 'keywords'
144
111
  }
@@ -1,6 +1,6 @@
1
1
  import { Injectable } from '@angular/core'
2
- import { Observable } from 'rxjs'
3
- import { map } from 'rxjs/operators'
2
+ import { Observable, switchMap } from 'rxjs'
3
+ import { map, tap } from 'rxjs/operators'
4
4
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
5
5
  import { EditorFieldsConfig } from '../models/fields.model'
6
6
  import { evaluate } from '../expressions'
@@ -15,7 +15,8 @@ export class EditorService {
15
15
  // returns the record as it was when saved, alongside its source
16
16
  saveRecord(
17
17
  record: CatalogRecord,
18
- fieldsConfig: EditorFieldsConfig
18
+ fieldsConfig: EditorFieldsConfig,
19
+ generateNewUniqueIdentifier = false
19
20
  ): Observable<[CatalogRecord, string]> {
20
21
  const savedRecord = { ...record }
21
22
 
@@ -29,9 +30,22 @@ export class EditorService {
29
30
  })
30
31
  }
31
32
  }
32
- return this.recordsRepository
33
- .saveRecord(savedRecord)
34
- .pipe(map((recordSource) => [savedRecord, recordSource]))
33
+
34
+ // if we want a new unique identifier, clear the existing one
35
+ if (generateNewUniqueIdentifier) {
36
+ savedRecord.uniqueIdentifier = null
37
+ }
38
+
39
+ return this.recordsRepository.saveRecord(savedRecord).pipe(
40
+ switchMap((uniqueIdentifier) =>
41
+ this.recordsRepository.openRecordForEdition(uniqueIdentifier)
42
+ ),
43
+ tap(() => {
44
+ // if saving was successful, the original draft can be discarded
45
+ this.recordsRepository.clearRecordDraft(record.uniqueIdentifier)
46
+ }),
47
+ map(([record, recordSource]) => [record, recordSource])
48
+ )
35
49
  }
36
50
 
37
51
  // emits and completes once saving is done
@@ -1,4 +1,4 @@
1
- import { InjectionToken, NgModule } from '@angular/core'
1
+ import { NgModule } from '@angular/core'
2
2
  import { CommonModule } from '@angular/common'
3
3
  import { UiMapModule } from '../../../../../libs/ui/map/src'
4
4
  import { StoreModule } from '@ngrx/store'
@@ -17,7 +17,7 @@ import {
17
17
  } from './state/mdview.reducer'
18
18
  import { MatTabsModule } from '@angular/material/tabs'
19
19
  import { MatIconModule } from '@angular/material/icon'
20
- import { UiWidgetsModule } from '../../../../../libs/ui/widgets/src'
20
+ import { PopupAlertComponent, UiWidgetsModule } from '../../../../../libs/ui/widgets/src'
21
21
  import { TranslateModule } from '@ngx-translate/core'
22
22
  import { ExternalViewerButtonComponent } from './external-viewer-button/external-viewer-button.component'
23
23
  import { FeatureCatalogModule } from '../../../../../libs/feature/catalog/src'
@@ -52,6 +52,7 @@ import { DataViewShareComponent } from './data-view-share/data-view-share.compon
52
52
  TranslateModule,
53
53
  TableComponent,
54
54
  FeatureDatavizModule,
55
+ PopupAlertComponent,
55
56
  ],
56
57
  providers: [MdViewFacade],
57
58
  exports: [
@@ -14,7 +14,7 @@ import { SearchEffects } from './state/effects'
14
14
  import { initialState, reducer, SEARCH_FEATURE_KEY } from './state/reducer'
15
15
  import { ResultsHitsContainerComponent } from './results-hits-number/results-hits.container.component'
16
16
  import { SearchStateContainerDirective } from './state/container/search-state.container.directive'
17
- import { UiInputsModule } from '../../../../../libs/ui/inputs/src'
17
+ import { AutocompleteComponent, UiInputsModule } from '../../../../../libs/ui/inputs/src'
18
18
  import { NgModule } from '@angular/core'
19
19
  import { UiElementsModule } from '../../../../../libs/ui/elements/src'
20
20
  import { FavoriteStarComponent } from './favorites/favorite-star/favorite-star.component'
@@ -51,6 +51,7 @@ import { Gn4Repository } from '../../../../../libs/api/repository/src'
51
51
  FacetsModule,
52
52
  MatIconModule,
53
53
  UiWidgetsModule,
54
+ AutocompleteComponent,
54
55
  ],
55
56
  exports: [
56
57
  SortByComponent,