geonetwork-ui 2.4.0-dev.a2f3bb9f → 2.4.0-dev.cd525aa1

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 (79) hide show
  1. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +57 -9
  2. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  3. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +2 -2
  4. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +1 -1
  5. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +11 -3
  6. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +5 -3
  7. package/esm2022/libs/feature/editor/src/lib/+state/editor.reducer.mjs +6 -2
  8. package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +3 -1
  9. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +20 -40
  10. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +2 -2
  11. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +18 -10
  12. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +7 -7
  13. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +7 -4
  14. package/esm2022/libs/ui/widgets/src/lib/badge/badge.component.mjs +4 -3
  15. package/esm2022/libs/ui/widgets/src/lib/ui-widgets.module.mjs +1 -6
  16. package/esm2022/translations/de.json +5 -1
  17. package/esm2022/translations/en.json +5 -1
  18. package/esm2022/translations/es.json +5 -1
  19. package/esm2022/translations/fr.json +5 -1
  20. package/esm2022/translations/it.json +5 -1
  21. package/esm2022/translations/nl.json +5 -1
  22. package/esm2022/translations/pt.json +5 -1
  23. package/fesm2022/geonetwork-ui.mjs +156 -77
  24. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  25. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +15 -3
  26. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  27. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +24 -1
  28. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  29. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts +6 -6
  30. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  31. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +4 -0
  32. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -1
  33. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts +5 -0
  34. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts.map +1 -1
  35. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +9 -8
  36. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
  37. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +10 -0
  38. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -1
  39. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +2 -0
  40. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -1
  41. package/libs/feature/editor/src/lib/services/editor.service.d.ts +6 -9
  42. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  43. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  44. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +4 -1
  45. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  46. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  47. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  48. package/libs/ui/widgets/src/lib/badge/badge.component.d.ts +2 -2
  49. package/libs/ui/widgets/src/lib/badge/badge.component.d.ts.map +1 -1
  50. package/libs/ui/widgets/src/lib/ui-widgets.module.d.ts +10 -11
  51. package/libs/ui/widgets/src/lib/ui-widgets.module.d.ts.map +1 -1
  52. package/package.json +1 -1
  53. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +145 -7
  54. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +36 -3
  55. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +203 -0
  56. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +9 -9
  57. package/src/libs/data-access/gn4/src/spec.yaml +4 -5
  58. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +5 -1
  59. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +31 -3
  60. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +13 -3
  61. package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +22 -5
  62. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +10 -0
  63. package/src/libs/feature/editor/src/lib/services/editor.service.ts +17 -52
  64. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +1 -3
  65. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +12 -1
  66. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +9 -1
  67. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -1
  68. package/src/libs/ui/widgets/src/lib/badge/badge.component.html +1 -1
  69. package/src/libs/ui/widgets/src/lib/badge/badge.component.ts +4 -1
  70. package/src/libs/ui/widgets/src/lib/ui-widgets.module.ts +0 -3
  71. package/tailwind.base.css +21 -1
  72. package/translations/de.json +5 -1
  73. package/translations/en.json +5 -1
  74. package/translations/es.json +5 -1
  75. package/translations/fr.json +5 -1
  76. package/translations/it.json +5 -1
  77. package/translations/nl.json +5 -1
  78. package/translations/pt.json +5 -1
  79. package/translations/sk.json +5 -1
@@ -3,8 +3,18 @@ import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/mode
3
3
  import { SaveRecordError } from './editor.models';
4
4
  import { EditorFieldsConfig } from '../models/fields.model';
5
5
  export declare const EDITOR_FEATURE_KEY = "editor";
6
+ /**
7
+ * @property record The record being edited
8
+ * @property recordSource Original representation of the record as text, used as a reference; null means the record hasn't be serialized yet
9
+ * @property saving
10
+ * @property saveError
11
+ * @property changedSinceSave
12
+ * @property fieldsConfig Configuration for the fields in the editor
13
+ */
6
14
  export interface EditorState {
7
15
  record: CatalogRecord | null;
16
+ recordSource: string | null;
17
+ alreadySavedOnce: boolean;
8
18
  saving: boolean;
9
19
  saveError: SaveRecordError | null;
10
20
  changedSinceSave: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"editor.reducer.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/feature/editor/src/lib/+state/editor.reducer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,aAAa,CAAA;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,2DAA2D,CAAA;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAG3D,eAAO,MAAM,kBAAkB,WAAW,CAAA;AAE1C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5B,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,eAAe,GAAG,IAAI,CAAA;IACjC,gBAAgB,EAAE,OAAO,CAAA;IACzB,YAAY,EAAE,kBAAkB,CAAA;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAA;CAC3C;AAED,eAAO,MAAM,kBAAkB,EAAE,WAMhC,CAAA;AAsCD,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,eAE3E"}
1
+ {"version":3,"file":"editor.reducer.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/feature/editor/src/lib/+state/editor.reducer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,aAAa,CAAA;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,2DAA2D,CAAA;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAG3D,eAAO,MAAM,kBAAkB,WAAW,CAAA;AAE1C;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,gBAAgB,EAAE,OAAO,CAAA;IACzB,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,eAAe,GAAG,IAAI,CAAA;IACjC,gBAAgB,EAAE,OAAO,CAAA;IACzB,YAAY,EAAE,kBAAkB,CAAA;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAA;CAC3C;AAED,eAAO,MAAM,kBAAkB,EAAE,WAQhC,CAAA;AA2CD,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,eAE3E"}
@@ -1,9 +1,11 @@
1
1
  import { EditorState } from './editor.reducer';
2
2
  export declare const selectEditorState: import("@ngrx/store").MemoizedSelector<object, EditorState, import("@ngrx/store").DefaultProjectorFn<EditorState>>;
3
3
  export declare const selectRecord: import("@ngrx/store").MemoizedSelector<object, import("../../../../../common/domain/src/lib/model/record").CatalogRecord, (s1: EditorState) => import("../../../../../common/domain/src/lib/model/record").CatalogRecord>;
4
+ export declare const selectRecordSource: import("@ngrx/store").MemoizedSelector<object, string, (s1: EditorState) => string>;
4
5
  export declare const selectRecordSaving: import("@ngrx/store").MemoizedSelector<object, boolean, (s1: EditorState) => boolean>;
5
6
  export declare const selectRecordSaveError: import("@ngrx/store").MemoizedSelector<object, string, (s1: EditorState) => string>;
6
7
  export declare const selectRecordChangedSinceSave: import("@ngrx/store").MemoizedSelector<object, boolean, (s1: EditorState) => boolean>;
8
+ export declare const selectRecordAlreadySavedOnce: import("@ngrx/store").MemoizedSelector<object, boolean, (s1: EditorState) => boolean>;
7
9
  export declare const selectRecordFieldsConfig: import("@ngrx/store").MemoizedSelector<object, import("../models/fields.model").EditorFieldsConfig, (s1: EditorState) => import("../models/fields.model").EditorFieldsConfig>;
8
10
  export declare const selectRecordFields: import("@ngrx/store").MemoizedSelector<object, {
9
11
  config: import("../models/fields.model").EditorFieldConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"editor.selectors.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/feature/editor/src/lib/+state/editor.selectors.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAElE,eAAO,MAAM,iBAAiB,oHAC0B,CAAA;AAExD,eAAO,MAAM,YAAY,2NAGxB,CAAA;AAED,eAAO,MAAM,kBAAkB,uFAG9B,CAAA;AAED,eAAO,MAAM,qBAAqB,qFAGjC,CAAA;AAED,eAAO,MAAM,4BAA4B,uFAGxC,CAAA;AAED,eAAO,MAAM,wBAAwB,+KAGpC,CAAA;AAED,eAAO,MAAM,kBAAkB;;;;;;IAO9B,CAAA"}
1
+ {"version":3,"file":"editor.selectors.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/feature/editor/src/lib/+state/editor.selectors.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAElE,eAAO,MAAM,iBAAiB,oHAC0B,CAAA;AAExD,eAAO,MAAM,YAAY,2NAGxB,CAAA;AAED,eAAO,MAAM,kBAAkB,qFAG9B,CAAA;AAED,eAAO,MAAM,kBAAkB,uFAG9B,CAAA;AAED,eAAO,MAAM,qBAAqB,qFAGjC,CAAA;AAED,eAAO,MAAM,4BAA4B,uFAGxC,CAAA;AAED,eAAO,MAAM,4BAA4B,uFAGxC,CAAA;AAED,eAAO,MAAM,wBAAwB,+KAGpC,CAAA;AAED,eAAO,MAAM,kBAAkB;;;;;;IAO9B,CAAA"}
@@ -1,17 +1,14 @@
1
- import { Configuration } from '../../../../../../libs/data-access/gn4/src';
2
1
  import { Observable } from 'rxjs';
3
- import { HttpClient } from '@angular/common/http';
4
2
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record';
5
3
  import { EditorFieldsConfig } from '../models/fields.model';
4
+ import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain/src/lib/repository/records-repository.interface';
6
5
  import * as i0 from "@angular/core";
7
6
  export declare class EditorService {
8
- private http;
9
- private apiConfiguration;
10
- private apiUrl;
11
- constructor(http: HttpClient, apiConfiguration: Configuration);
12
- loadRecordByUuid(uuid: string): Observable<CatalogRecord>;
13
- saveRecord(record: CatalogRecord, fieldsConfig: EditorFieldsConfig): Observable<CatalogRecord>;
14
- static ɵfac: i0.ɵɵFactoryDeclaration<EditorService, [null, { optional: true; }]>;
7
+ private recordsRepository;
8
+ constructor(recordsRepository: RecordsRepositoryInterface);
9
+ saveRecord(record: CatalogRecord, fieldsConfig: EditorFieldsConfig): Observable<[CatalogRecord, string]>;
10
+ saveRecordAsDraft(record: CatalogRecord): Observable<void>;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<EditorService, never>;
15
12
  static ɵprov: i0.ɵɵInjectableDeclaration<EditorService>;
16
13
  }
17
14
  //# sourceMappingURL=editor.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"editor.service.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/feature/editor/src/lib/services/editor.service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAA;AAC1E,OAAO,EAAQ,UAAU,EAAE,MAAM,MAAM,CAAA;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,2DAA2D,CAAA;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;;AAG3D,qBAGa,aAAa;IAItB,OAAO,CAAC,IAAI;IAGZ,OAAO,CAAC,gBAAgB;IAN1B,OAAO,CAAC,MAAM,CAAgE;gBAGpE,IAAI,EAAE,UAAU,EAGhB,gBAAgB,EAAE,aAAa;IAIzC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC;IAgBzD,UAAU,CACR,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,kBAAkB,GAC/B,UAAU,CAAC,aAAa,CAAC;yCA9BjB,aAAa;6CAAb,aAAa;CA8DzB"}
1
+ {"version":3,"file":"editor.service.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/feature/editor/src/lib/services/editor.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,2DAA2D,CAAA;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAE3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sFAAsF,CAAA;;AAEjI,qBAGa,aAAa;IACZ,OAAO,CAAC,iBAAiB;gBAAjB,iBAAiB,EAAE,0BAA0B;IAGjE,UAAU,CACR,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,kBAAkB,GAC/B,UAAU,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAoBtC,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC;yCA3B/C,aAAa;6CAAb,aAAa;CAgCzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"mdview.effects.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/feature/record/src/lib/state/mdview.effects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAwB,MAAM,eAAe,CAAA;AAI7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sFAAsF,CAAA;AACjI,OAAO,EAAE,wBAAwB,EAAE,MAAM,yEAAyE,CAAA;;AAElH,qBACa,aAAa;IAEtB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,wBAAwB;gBAFxB,QAAQ,EAAE,OAAO,EACjB,iBAAiB,EAAE,0BAA0B,EAC7C,wBAAwB,EAAE,wBAAwB;IAM5D,iBAAiB;;;;;oJAgBhB;IAKD,mBAAmB;;4IASlB;IAKD,kBAAkB;;;;;oJAkBjB;IAED,oBAAoB;;;;;oJAkBnB;IAED,gBAAgB;;;;;kJAsBf;yCA3GU,aAAa;6CAAb,aAAa;CA4GzB"}
1
+ {"version":3,"file":"mdview.effects.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/feature/record/src/lib/state/mdview.effects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAwB,MAAM,eAAe,CAAA;AAI7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sFAAsF,CAAA;AACjI,OAAO,EAAE,wBAAwB,EAAE,MAAM,yEAAyE,CAAA;;AAElH,qBACa,aAAa;IAEtB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,wBAAwB;gBAFxB,QAAQ,EAAE,OAAO,EACjB,iBAAiB,EAAE,0BAA0B,EAC7C,wBAAwB,EAAE,wBAAwB;IAM5D,iBAAiB;;;;;oJAchB;IAKD,mBAAmB;;4IASlB;IAKD,kBAAkB;;;;;oJAkBjB;IAED,oBAAoB;;;;;oJAkBnB;IAED,gBAAgB;;;;;kJAsBf;yCAzGU,aAAa;6CAAb,aAAa;CA0GzB"}
@@ -5,15 +5,17 @@ import { SearchFacade } from '../state/search.facade';
5
5
  import { SelectionService } from '../../../../../../libs/api/repository/src';
6
6
  import { Observable } from 'rxjs';
7
7
  import { SearchService } from '../utils/service/search.service';
8
+ import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain/src/lib/repository/records-repository.interface';
8
9
  import * as i0 from "@angular/core";
9
10
  export declare class ResultsTableComponent {
10
11
  private searchFacade;
11
12
  private searchService;
12
13
  private selectionService;
14
+ private recordsRepository;
13
15
  recordClick: EventEmitter<CatalogRecord>;
14
16
  records$: Observable<CatalogRecord[]>;
15
17
  selectedRecords$: import("rxjs").BehaviorSubject<string[]>;
16
- constructor(searchFacade: SearchFacade, searchService: SearchService, selectionService: SelectionService);
18
+ constructor(searchFacade: SearchFacade, searchService: SearchService, selectionService: SelectionService, recordsRepository: RecordsRepositoryInterface);
17
19
  dateToString(date: Date): string;
18
20
  getStatus(isPublishedToAll: boolean | unknown): "published" | "not published";
19
21
  getRecordFormats(record: CatalogRecord): FileFormat[];
@@ -27,6 +29,7 @@ export declare class ResultsTableComponent {
27
29
  toggleSelectAll(): Promise<void>;
28
30
  isAllSelected(): Observable<boolean>;
29
31
  isSomeSelected(): Observable<boolean>;
32
+ hasDraft(record: CatalogRecord): boolean;
30
33
  static ɵfac: i0.ɵɵFactoryDeclaration<ResultsTableComponent, never>;
31
34
  static ɵcmp: i0.ɵɵComponentDeclaration<ResultsTableComponent, "gn-ui-results-table", never, {}, { "recordClick": "recordClick"; }, never, never, true, never>;
32
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"results-table.component.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/feature/search/src/lib/results-table/results-table.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAU,MAAM,eAAe,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,2DAA2D,CAAA;AACzF,OAAO,EACL,UAAU,EAIX,MAAM,wCAAwC,CAAA;AAQ/C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAA;AAC5E,OAAO,EAAiC,UAAU,EAAE,MAAM,MAAM,CAAA;AAIhE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;;AAE/D,qBAca,qBAAqB;IAO9B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,gBAAgB;IARhB,WAAW,8BAAoC;IAEzD,QAAQ,8BAA6B;IACrC,gBAAgB,2CAAoD;gBAG1D,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB;IAG5C,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAShC,SAAS,CAAC,gBAAgB,EAAE,OAAO,GAAG,OAAO;IAI7C,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,EAAE;IAarD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM;IAQlD,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAIzC,iBAAiB,CAAC,IAAI,EAAE,OAAO;IAI/B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM;IAI5C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IAiB1D,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC;IASrD,0BAA0B,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa;IAQ7D,eAAe;IASrB,aAAa,IAAI,UAAU,CAAC,OAAO,CAAC;IAWpC,cAAc,IAAI,UAAU,CAAC,OAAO,CAAC;yCAhH1B,qBAAqB;2CAArB,qBAAqB;CA8HjC"}
1
+ {"version":3,"file":"results-table.component.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/feature/search/src/lib/results-table/results-table.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAU,MAAM,eAAe,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,2DAA2D,CAAA;AACzF,OAAO,EACL,UAAU,EAIX,MAAM,wCAAwC,CAAA;AAQ/C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAA;AAC5E,OAAO,EAAiC,UAAU,EAAE,MAAM,MAAM,CAAA;AAIhE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAE/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sFAAsF,CAAA;;AAEjI,qBAea,qBAAqB;IAO9B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,iBAAiB;IATjB,WAAW,8BAAoC;IAEzD,QAAQ,8BAA6B;IACrC,gBAAgB,2CAAoD;gBAG1D,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,0BAA0B;IAGvD,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAShC,SAAS,CAAC,gBAAgB,EAAE,OAAO,GAAG,OAAO;IAI7C,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,EAAE;IAarD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM;IAQlD,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAIzC,iBAAiB,CAAC,IAAI,EAAE,OAAO;IAI/B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM;IAI5C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IAiB1D,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC;IASrD,0BAA0B,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa;IAQ7D,eAAe;IASrB,aAAa,IAAI,UAAU,CAAC,OAAO,CAAC;IAWpC,cAAc,IAAI,UAAU,CAAC,OAAO,CAAC;IAerC,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO;yCAhI7B,qBAAqB;2CAArB,qBAAqB;CAmIjC"}
@@ -32,9 +32,10 @@ import * as i30 from "@angular/forms";
32
32
  import * as i31 from "./markdown-parser/markdown-parser.component";
33
33
  import * as i32 from "./thumbnail/thumbnail.component";
34
34
  import * as i33 from "./user-feedback-item/time-since.pipe";
35
+ import * as i34 from "../../../widgets/src/lib/badge/badge.component";
35
36
  export declare class UiElementsModule {
36
37
  static ɵfac: i0.ɵɵFactoryDeclaration<UiElementsModule, never>;
37
- static ɵmod: i0.ɵɵNgModuleDeclaration<UiElementsModule, [typeof i1.MetadataInfoComponent, typeof i2.ContentGhostComponent, typeof i3.DownloadItemComponent, typeof i4.DownloadsListComponent, typeof i5.ApiCardComponent, typeof i6.RelatedRecordCardComponent, typeof i7.MetadataContactComponent, typeof i8.MetadataCatalogComponent, typeof i9.MetadataQualityComponent, typeof i10.MetadataQualityItemComponent, typeof i11.ErrorComponent, typeof i12.PaginationComponent, typeof i13.AvatarComponent, typeof i14.UserPreviewComponent, typeof i15.GnUiLinkifyDirective, typeof i16.PaginationButtonsComponent, typeof i17.MaxLinesComponent, typeof i18.RecordApiFormComponent, typeof i19.UserFeedbackItemComponent, typeof i20.ImageOverlayPreviewComponent], [typeof i21.CommonModule, typeof i22.MatIconModule, typeof i23.MatTooltipModule, typeof i24.UiWidgetsModule, typeof i25.UiLayoutModule, typeof i26.TranslateModule, typeof i27.UtilSharedModule, typeof i28.RouterModule, typeof i29.UiInputsModule, typeof i30.FormsModule, typeof i21.NgOptimizedImage, typeof i31.MarkdownParserComponent, typeof i32.ThumbnailComponent, typeof i33.TimeSincePipe], [typeof i1.MetadataInfoComponent, typeof i2.ContentGhostComponent, typeof i3.DownloadItemComponent, typeof i4.DownloadsListComponent, typeof i5.ApiCardComponent, typeof i6.RelatedRecordCardComponent, typeof i7.MetadataContactComponent, typeof i8.MetadataCatalogComponent, typeof i9.MetadataQualityComponent, typeof i10.MetadataQualityItemComponent, typeof i11.ErrorComponent, typeof i12.PaginationComponent, typeof i32.ThumbnailComponent, typeof i13.AvatarComponent, typeof i14.UserPreviewComponent, typeof i16.PaginationButtonsComponent, typeof i17.MaxLinesComponent, typeof i18.RecordApiFormComponent, typeof i31.MarkdownParserComponent, typeof i19.UserFeedbackItemComponent, typeof i20.ImageOverlayPreviewComponent]>;
38
+ static ɵmod: i0.ɵɵNgModuleDeclaration<UiElementsModule, [typeof i1.MetadataInfoComponent, typeof i2.ContentGhostComponent, typeof i3.DownloadItemComponent, typeof i4.DownloadsListComponent, typeof i5.ApiCardComponent, typeof i6.RelatedRecordCardComponent, typeof i7.MetadataContactComponent, typeof i8.MetadataCatalogComponent, typeof i9.MetadataQualityComponent, typeof i10.MetadataQualityItemComponent, typeof i11.ErrorComponent, typeof i12.PaginationComponent, typeof i13.AvatarComponent, typeof i14.UserPreviewComponent, typeof i15.GnUiLinkifyDirective, typeof i16.PaginationButtonsComponent, typeof i17.MaxLinesComponent, typeof i18.RecordApiFormComponent, typeof i19.UserFeedbackItemComponent, typeof i20.ImageOverlayPreviewComponent], [typeof i21.CommonModule, typeof i22.MatIconModule, typeof i23.MatTooltipModule, typeof i24.UiWidgetsModule, typeof i25.UiLayoutModule, typeof i26.TranslateModule, typeof i27.UtilSharedModule, typeof i28.RouterModule, typeof i29.UiInputsModule, typeof i30.FormsModule, typeof i21.NgOptimizedImage, typeof i31.MarkdownParserComponent, typeof i32.ThumbnailComponent, typeof i33.TimeSincePipe, typeof i34.BadgeComponent], [typeof i1.MetadataInfoComponent, typeof i2.ContentGhostComponent, typeof i3.DownloadItemComponent, typeof i4.DownloadsListComponent, typeof i5.ApiCardComponent, typeof i6.RelatedRecordCardComponent, typeof i7.MetadataContactComponent, typeof i8.MetadataCatalogComponent, typeof i9.MetadataQualityComponent, typeof i10.MetadataQualityItemComponent, typeof i11.ErrorComponent, typeof i12.PaginationComponent, typeof i32.ThumbnailComponent, typeof i13.AvatarComponent, typeof i14.UserPreviewComponent, typeof i16.PaginationButtonsComponent, typeof i17.MaxLinesComponent, typeof i18.RecordApiFormComponent, typeof i31.MarkdownParserComponent, typeof i19.UserFeedbackItemComponent, typeof i20.ImageOverlayPreviewComponent]>;
38
39
  static ɵinj: i0.ɵɵInjectorDeclaration<UiElementsModule>;
39
40
  }
40
41
  //# sourceMappingURL=ui-elements.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui-elements.module.d.ts","sourceRoot":"","sources":["../../../../../src/libs/ui/elements/src/lib/ui-elements.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,qBA+Da,gBAAgB;yCAAhB,gBAAgB;0CAAhB,gBAAgB;0CAAhB,gBAAgB;CAAG"}
1
+ {"version":3,"file":"ui-elements.module.d.ts","sourceRoot":"","sources":["../../../../../src/libs/ui/elements/src/lib/ui-elements.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,qBAgEa,gBAAgB;yCAAhB,gBAAgB;0CAAhB,gBAAgB;0CAAhB,gBAAgB;CAAG"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from "@angular/core";
2
2
  export declare class BadgeComponent {
3
- clickable?: boolean;
3
+ clickable: boolean;
4
4
  static ɵfac: i0.ɵɵFactoryDeclaration<BadgeComponent, never>;
5
- static ɵcmp: i0.ɵɵComponentDeclaration<BadgeComponent, "gn-ui-badge", never, { "clickable": { "alias": "clickable"; "required": false; }; }, {}, never, ["*"], false, never>;
5
+ static ɵcmp: i0.ɵɵComponentDeclaration<BadgeComponent, "gn-ui-badge", never, { "clickable": { "alias": "clickable"; "required": false; }; }, {}, never, ["*"], true, never>;
6
6
  }
7
7
  //# sourceMappingURL=badge.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"badge.component.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/ui/widgets/src/lib/badge/badge.component.ts"],"names":[],"mappings":";AAEA,qBAMa,cAAc;IAChB,SAAS,CAAC,UAAQ;yCADhB,cAAc;2CAAd,cAAc;CAE1B"}
1
+ {"version":3,"file":"badge.component.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/ui/widgets/src/lib/badge/badge.component.ts"],"names":[],"mappings":";AAGA,qBAQa,cAAc;IAChB,SAAS,UAAQ;yCADf,cAAc;2CAAd,cAAc;CAE1B"}
@@ -4,19 +4,18 @@ import * as i2 from "./progress-bar/progress-bar.component";
4
4
  import * as i3 from "./step-bar/step-bar.component";
5
5
  import * as i4 from "./loading-mask/loading-mask.component";
6
6
  import * as i5 from "./popup-alert/popup-alert.component";
7
- import * as i6 from "./badge/badge.component";
8
- import * as i7 from "./spinning-loader/spinning-loader.component";
9
- import * as i8 from "@angular/common";
10
- import * as i9 from "@ngx-translate/core";
11
- import * as i10 from "ngx-dropzone";
12
- import * as i11 from "@angular/forms";
13
- import * as i12 from "ngx-chips";
14
- import * as i13 from "../../../../util/shared/src/lib/util-shared.module";
15
- import * as i14 from "@angular/material/progress-spinner";
16
- import * as i15 from "@angular/material/icon";
7
+ import * as i6 from "./spinning-loader/spinning-loader.component";
8
+ import * as i7 from "@angular/common";
9
+ import * as i8 from "@ngx-translate/core";
10
+ import * as i9 from "ngx-dropzone";
11
+ import * as i10 from "@angular/forms";
12
+ import * as i11 from "ngx-chips";
13
+ import * as i12 from "../../../../util/shared/src/lib/util-shared.module";
14
+ import * as i13 from "@angular/material/progress-spinner";
15
+ import * as i14 from "@angular/material/icon";
17
16
  export declare class UiWidgetsModule {
18
17
  static ɵfac: i0.ɵɵFactoryDeclaration<UiWidgetsModule, never>;
19
- static ɵmod: i0.ɵɵNgModuleDeclaration<UiWidgetsModule, [typeof i1.ColorScaleComponent, typeof i2.ProgressBarComponent, typeof i3.StepBarComponent, typeof i4.LoadingMaskComponent, typeof i5.PopupAlertComponent, typeof i6.BadgeComponent, typeof i7.SpinningLoaderComponent], [typeof i8.CommonModule, typeof i9.TranslateModule, typeof i10.NgxDropzoneModule, typeof i11.FormsModule, typeof i11.ReactiveFormsModule, typeof i12.TagInputModule, typeof i13.UtilSharedModule, typeof i14.MatProgressSpinnerModule, typeof i15.MatIconModule], [typeof i2.ProgressBarComponent, typeof i3.StepBarComponent, typeof i4.LoadingMaskComponent, typeof i5.PopupAlertComponent, typeof i6.BadgeComponent, typeof i7.SpinningLoaderComponent]>;
18
+ static ɵmod: i0.ɵɵNgModuleDeclaration<UiWidgetsModule, [typeof i1.ColorScaleComponent, typeof i2.ProgressBarComponent, typeof i3.StepBarComponent, typeof i4.LoadingMaskComponent, typeof i5.PopupAlertComponent, typeof i6.SpinningLoaderComponent], [typeof i7.CommonModule, typeof i8.TranslateModule, typeof i9.NgxDropzoneModule, typeof i10.FormsModule, typeof i10.ReactiveFormsModule, typeof i11.TagInputModule, typeof i12.UtilSharedModule, typeof i13.MatProgressSpinnerModule, typeof i14.MatIconModule], [typeof i2.ProgressBarComponent, typeof i3.StepBarComponent, typeof i4.LoadingMaskComponent, typeof i5.PopupAlertComponent, typeof i6.SpinningLoaderComponent]>;
20
19
  static ɵinj: i0.ɵɵInjectorDeclaration<UiWidgetsModule>;
21
20
  }
22
21
  //# sourceMappingURL=ui-widgets.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui-widgets.module.d.ts","sourceRoot":"","sources":["../../../../../src/libs/ui/widgets/src/lib/ui-widgets.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAiBA,qBA8Ba,eAAe;yCAAf,eAAe;0CAAf,eAAe;0CAAf,eAAe;CAAG"}
1
+ {"version":3,"file":"ui-widgets.module.d.ts","sourceRoot":"","sources":["../../../../../src/libs/ui/widgets/src/lib/ui-widgets.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgBA,qBA4Ba,eAAe;yCAAf,eAAe;0CAAf,eAAe;0CAAf,eAAe;CAAG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "geonetwork-ui",
3
- "version": "2.4.0-dev.a2f3bb9f",
3
+ "version": "2.4.0-dev.cd525aa1",
4
4
  "engines": {
5
5
  "node": ">=14.17.0"
6
6
  },
@@ -1,7 +1,17 @@
1
1
  import { Injectable } from '@angular/core'
2
- import { SearchApiService } from '../../../../../../libs/data-access/gn4/src'
2
+ import {
3
+ RecordsApiService,
4
+ SearchApiService,
5
+ } from '../../../../../../libs/data-access/gn4/src'
3
6
  import { ElasticsearchService } from './elasticsearch'
4
- import { Observable, of, switchMap } from 'rxjs'
7
+ import {
8
+ combineLatest,
9
+ from,
10
+ Observable,
11
+ of,
12
+ switchMap,
13
+ throwError,
14
+ } from 'rxjs'
5
15
  import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
6
16
  import {
7
17
  SearchParams,
@@ -12,19 +22,23 @@ import {
12
22
  AggregationsParams,
13
23
  FieldFilters,
14
24
  } from '../../../../../../libs/common/domain/src/lib/model/search'
15
- import { map } from 'rxjs/operators'
25
+ import { catchError, map, tap } from 'rxjs/operators'
16
26
  import {
27
+ findConverterForDocument,
17
28
  Gn4Converter,
18
29
  Gn4SearchResults,
30
+ Iso19139Converter,
19
31
  } from '../../../../../../libs/api/metadata-converter/src'
20
32
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
33
+ import { HttpErrorResponse } from '@angular/common/http'
21
34
 
22
35
  @Injectable()
23
36
  export class Gn4Repository implements RecordsRepositoryInterface {
24
37
  constructor(
25
38
  private gn4SearchApi: SearchApiService,
26
39
  private gn4SearchHelper: ElasticsearchService,
27
- private gn4Mapper: Gn4Converter
40
+ private gn4Mapper: Gn4Converter,
41
+ private gn4RecordsApi: RecordsApiService
28
42
  ) {}
29
43
 
30
44
  search({
@@ -84,9 +98,7 @@ export class Gn4Repository implements RecordsRepositoryInterface {
84
98
  .pipe(map((results: Gn4SearchResults) => results.hits.total?.value || 0))
85
99
  }
86
100
 
87
- getByUniqueIdentifier(
88
- uniqueIdentifier: string
89
- ): Observable<CatalogRecord | null> {
101
+ getRecord(uniqueIdentifier: string): Observable<CatalogRecord | null> {
90
102
  return this.gn4SearchApi
91
103
  .search(
92
104
  'bucket',
@@ -165,4 +177,130 @@ export class Gn4Repository implements RecordsRepositoryInterface {
165
177
  )
166
178
  )
167
179
  }
180
+
181
+ /**
182
+ * Returns null if the record is not found
183
+ */
184
+ private loadRecordAsXml(uniqueIdentifier: string): Observable<string | null> {
185
+ return this.gn4RecordsApi
186
+ .getRecordAs(
187
+ uniqueIdentifier,
188
+ undefined,
189
+ false,
190
+ undefined,
191
+ undefined,
192
+ undefined,
193
+ 'application/xml',
194
+ 'response',
195
+ undefined,
196
+ { httpHeaderAccept: 'text/xml,application/xml' as 'application/xml' } // this is to make sure that the response is parsed as text
197
+ )
198
+ .pipe(
199
+ map((response) => response.body),
200
+ catchError((error: HttpErrorResponse) =>
201
+ error.status === 404 ? of(null) : throwError(() => error)
202
+ )
203
+ )
204
+ }
205
+
206
+ private getLocalStorageKeyForRecord(uniqueIdentifier: string) {
207
+ return `geonetwork-ui-draft-${uniqueIdentifier}`
208
+ }
209
+
210
+ openRecordForEdition(
211
+ uniqueIdentifier: string
212
+ ): Observable<[CatalogRecord, string, boolean] | null> {
213
+ const draft$ = of(
214
+ window.localStorage.getItem(
215
+ this.getLocalStorageKeyForRecord(uniqueIdentifier)
216
+ )
217
+ )
218
+ const recordAsXml$ = this.loadRecordAsXml(uniqueIdentifier)
219
+ return combineLatest([draft$, recordAsXml$]).pipe(
220
+ switchMap(([draft, recordAsXml]) => {
221
+ const xml = draft ?? recordAsXml
222
+ const isSavedAlready = recordAsXml !== null
223
+ return findConverterForDocument(xml)
224
+ .readRecord(xml)
225
+ .then(
226
+ (record) =>
227
+ [record, xml, isSavedAlready] as [CatalogRecord, string, boolean]
228
+ )
229
+ })
230
+ )
231
+ }
232
+
233
+ private serializeRecordToXml(
234
+ record: CatalogRecord,
235
+ referenceRecordSource?: string
236
+ ): Observable<string> {
237
+ // if there's a reference record, use that standard; otherwise, use iso19139
238
+ const converter = referenceRecordSource
239
+ ? findConverterForDocument(referenceRecordSource)
240
+ : new Iso19139Converter()
241
+ return from(converter.writeRecord(record, referenceRecordSource))
242
+ }
243
+
244
+ saveRecord(
245
+ record: CatalogRecord,
246
+ referenceRecordSource?: string
247
+ ): Observable<string> {
248
+ return this.serializeRecordToXml(record, referenceRecordSource).pipe(
249
+ switchMap((recordXml) =>
250
+ this.gn4RecordsApi
251
+ .insert(
252
+ 'METADATA',
253
+ undefined,
254
+ undefined,
255
+ undefined,
256
+ true,
257
+ undefined,
258
+ 'OVERWRITE',
259
+ undefined,
260
+ undefined,
261
+ undefined,
262
+ '_none_',
263
+ undefined,
264
+ undefined,
265
+ undefined,
266
+ recordXml
267
+ )
268
+ .pipe(map(() => recordXml))
269
+ ),
270
+ tap(() => {
271
+ // if saving was successful, the associated draft can be discarded
272
+ window.localStorage.removeItem(
273
+ this.getLocalStorageKeyForRecord(record.uniqueIdentifier)
274
+ )
275
+ })
276
+ )
277
+ }
278
+
279
+ saveRecordAsDraft(
280
+ record: CatalogRecord,
281
+ referenceRecordSource?: string
282
+ ): Observable<string> {
283
+ return this.serializeRecordToXml(record, referenceRecordSource).pipe(
284
+ tap((recordXml) =>
285
+ window.localStorage.setItem(
286
+ this.getLocalStorageKeyForRecord(record.uniqueIdentifier),
287
+ recordXml
288
+ )
289
+ )
290
+ )
291
+ }
292
+
293
+ clearRecordDraft(uniqueIdentifier: string): void {
294
+ window.localStorage.removeItem(
295
+ this.getLocalStorageKeyForRecord(uniqueIdentifier)
296
+ )
297
+ }
298
+
299
+ recordHasDraft(uniqueIdentifier: string): boolean {
300
+ return (
301
+ window.localStorage.getItem(
302
+ this.getLocalStorageKeyForRecord(uniqueIdentifier)
303
+ ) !== null
304
+ )
305
+ }
168
306
  }
@@ -11,12 +11,45 @@ import { CatalogRecord } from '../model/record'
11
11
  export abstract class RecordsRepositoryInterface {
12
12
  abstract search(params: SearchParams): Observable<SearchResults>
13
13
  abstract getMatchesCount(filters: FieldFilters): Observable<number>
14
- abstract getByUniqueIdentifier(
15
- uniqueIdentifier: string
16
- ): Observable<CatalogRecord | null>
14
+ abstract getRecord(uniqueIdentifier: string): Observable<CatalogRecord | null>
17
15
  abstract aggregate(params: AggregationsParams): Observable<Aggregations>
18
16
  abstract getSimilarRecords(
19
17
  similarTo: CatalogRecord
20
18
  ): Observable<CatalogRecord[]>
21
19
  abstract fuzzySearch(query: string): Observable<SearchResults>
20
+
21
+ /**
22
+ * This emits once:
23
+ * - record object; if a draft exists, this will return it
24
+ * - serialized representation of the record as text
25
+ * - boolean indicating if the record has been saved at least once in a final version (i.e. not only as draft)
26
+ * @param uniqueIdentifier
27
+ * @returns Observable<[CatalogRecord, string, boolean] | null>
28
+ */
29
+ abstract openRecordForEdition(
30
+ uniqueIdentifier: string
31
+ ): Observable<[CatalogRecord, string, boolean] | null>
32
+
33
+ /**
34
+ * @param record
35
+ * @param referenceRecordSource
36
+ * @returns Observable<string> Returns the source of the record as it was serialized when saved
37
+ */
38
+ abstract saveRecord(
39
+ record: CatalogRecord,
40
+ referenceRecordSource?: string
41
+ ): Observable<string>
42
+
43
+ /**
44
+ * @param record
45
+ * @param referenceRecordSource
46
+ * @returns Observable<string> Returns the source of the record as it was serialized when saved
47
+ */
48
+ abstract saveRecordAsDraft(
49
+ record: CatalogRecord,
50
+ referenceRecordSource?: string
51
+ ): Observable<string>
52
+
53
+ abstract clearRecordDraft(uniqueIdentifier: string): void
54
+ abstract recordHasDraft(uniqueIdentifier: string): boolean
22
55
  }