geonetwork-ui 2.4.0-dev.a1bcfe22 → 2.4.0-dev.a9a61288
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.
- package/esm2022/libs/api/metadata-converter/src/index.mjs +1 -2
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +5 -5
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +30 -2
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.mjs +31 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +23 -1
- package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +6 -1
- package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +21 -4
- package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
- package/esm2022/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.mjs +138 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.mjs +21 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +19 -9
- package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +2 -1
- package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +12 -2
- package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +10 -5
- package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +35 -7
- package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +6 -2
- package/esm2022/libs/ui/elements/src/index.mjs +2 -1
- package/esm2022/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.mjs +27 -0
- package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +4 -3
- package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
- package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
- package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +11 -5
- package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +3 -3
- package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +3 -3
- package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +49 -11
- package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +18 -6
- package/esm2022/translations/de.json +17 -17
- package/esm2022/translations/en.json +10 -10
- package/esm2022/translations/es.json +9 -9
- package/esm2022/translations/fr.json +19 -19
- package/esm2022/translations/it.json +10 -10
- package/esm2022/translations/nl.json +9 -9
- package/esm2022/translations/pt.json +9 -9
- package/fesm2022/geonetwork-ui.mjs +620 -250
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/libs/api/metadata-converter/src/index.d.ts +0 -1
- package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +8 -1
- package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts +5 -0
- package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -1
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +1 -0
- package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +6 -1
- package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +2 -1
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +8 -0
- package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts +27 -0
- package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts +11 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +5 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/fields.config.d.ts +1 -0
- package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
- package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
- package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +11 -3
- package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
- package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -0
- package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
- package/libs/ui/elements/src/index.d.ts +1 -0
- package/libs/ui/elements/src/index.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.d.ts +18 -0
- package/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.d.ts.map +1 -0
- package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +1 -1
- package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +4 -2
- package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -1
- package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +10 -1
- package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
- package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +6 -2
- package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/libs/api/metadata-converter/src/index.ts +0 -1
- package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -1
- package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +37 -12
- package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +5 -1
- package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +4 -2
- package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +72 -2
- package/src/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.ts +39 -0
- package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +70 -1
- package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +8 -0
- package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +24 -4
- package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -1
- package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +10 -0
- package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +3 -1
- package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +117 -21
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.css +0 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.html +5 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.ts +22 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +6 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +13 -1
- package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +1 -0
- package/src/libs/feature/editor/src/lib/fields.config.ts +12 -1
- package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +8 -4
- package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +2 -1
- package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +40 -3
- package/src/libs/feature/search/src/lib/state/search.facade.ts +6 -0
- package/src/libs/ui/elements/src/index.ts +1 -0
- package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.css +0 -0
- package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.html +12 -0
- package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.ts +37 -0
- package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +4 -1
- package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -1
- package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +12 -8
- package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +1 -1
- package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +7 -2
- package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +1 -1
- package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +1 -0
- package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +10 -1
- package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +55 -3
- package/src/libs/ui/search/src/lib/results-table/results-table.component.html +7 -2
- package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +9 -9
- package/translations/de.json +17 -17
- package/translations/en.json +10 -10
- package/translations/es.json +9 -9
- package/translations/fr.json +19 -19
- package/translations/it.json +10 -10
- package/translations/nl.json +9 -9
- package/translations/pt.json +9 -9
- package/translations/sk.json +10 -10
|
@@ -7,10 +7,13 @@ export declare class ResultsTableComponent {
|
|
|
7
7
|
records: CatalogRecord[];
|
|
8
8
|
selectedRecordsIdentifiers: string[];
|
|
9
9
|
sortOrder: SortByField;
|
|
10
|
-
|
|
10
|
+
hasDraft: (record: CatalogRecord) => boolean;
|
|
11
|
+
canDuplicate: (record: CatalogRecord) => boolean;
|
|
12
|
+
canDelete: (record: CatalogRecord) => boolean;
|
|
11
13
|
sortByChange: EventEmitter<[string, "asc" | "desc"]>;
|
|
12
14
|
recordClick: EventEmitter<CatalogRecord>;
|
|
13
15
|
duplicateRecord: EventEmitter<CatalogRecord>;
|
|
16
|
+
deleteRecord: EventEmitter<CatalogRecord>;
|
|
14
17
|
recordsSelectedChange: EventEmitter<[CatalogRecord[], boolean]>;
|
|
15
18
|
dateToString(date: Date): string;
|
|
16
19
|
getStatus(isPublishedToAll: boolean | unknown): "published" | "not published";
|
|
@@ -19,6 +22,7 @@ export declare class ResultsTableComponent {
|
|
|
19
22
|
getBadgeColor(format: FileFormat): string;
|
|
20
23
|
handleRecordClick(item: unknown): void;
|
|
21
24
|
handleDuplicate(item: unknown): void;
|
|
25
|
+
handleDelete(item: unknown): void;
|
|
22
26
|
setSortBy(col: string, order: 'asc' | 'desc'): void;
|
|
23
27
|
isSortedBy(col: string): 'desc' | 'asc' | null;
|
|
24
28
|
isChecked(record: CatalogRecord): boolean;
|
|
@@ -27,6 +31,6 @@ export declare class ResultsTableComponent {
|
|
|
27
31
|
isAllSelected(): boolean;
|
|
28
32
|
isSomeSelected(): boolean;
|
|
29
33
|
static ɵfac: i0.ɵɵFactoryDeclaration<ResultsTableComponent, never>;
|
|
30
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ResultsTableComponent, "gn-ui-results-table", never, { "records": { "alias": "records"; "required": false; }; "selectedRecordsIdentifiers": { "alias": "selectedRecordsIdentifiers"; "required": false; }; "sortOrder": { "alias": "sortOrder"; "required": false; }; "
|
|
34
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ResultsTableComponent, "gn-ui-results-table", never, { "records": { "alias": "records"; "required": false; }; "selectedRecordsIdentifiers": { "alias": "selectedRecordsIdentifiers"; "required": false; }; "sortOrder": { "alias": "sortOrder"; "required": false; }; "hasDraft": { "alias": "hasDraft"; "required": false; }; "canDuplicate": { "alias": "canDuplicate"; "required": false; }; "canDelete": { "alias": "canDelete"; "required": false; }; }, { "sortByChange": "sortByChange"; "recordClick": "recordClick"; "duplicateRecord": "duplicateRecord"; "deleteRecord": "deleteRecord"; "recordsSelectedChange": "recordsSelectedChange"; }, never, never, true, never>;
|
|
31
35
|
}
|
|
32
36
|
//# sourceMappingURL=results-table.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"results-table.component.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/ui/search/src/lib/results-table/results-table.component.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"results-table.component.d.ts","sourceRoot":"","sources":["../../../../../../src/libs/ui/search/src/lib/results-table/results-table.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAA;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,2DAA2D,CAAA;AACzF,OAAO,EAEL,WAAW,EACZ,MAAM,2DAA2D,CAAA;AAMlE,OAAO,EACL,UAAU,EAIX,MAAM,wCAAwC,CAAA;;AAI/C,qBAgBa,qBAAqB;IACvB,OAAO,EAAE,aAAa,EAAE,CAAK;IAC7B,0BAA0B,EAAE,MAAM,EAAE,CAAK;IACzC,SAAS,EAAE,WAAW,CAAO;IAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAc;IAC1D,YAAY,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAa;IAC7D,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAa;IAGzD,YAAY,yCAA+C;IAC3D,WAAW,8BAAoC;IAC/C,eAAe,8BAAoC;IACnD,YAAY,8BAAoC;IAChD,qBAAqB,2CAE5B;IAEH,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,eAAe,CAAC,IAAI,EAAE,OAAO;IAI7B,YAAY,CAAC,IAAI,EAAE,OAAO;IAI1B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM;IAI5C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI;IAe9C,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO;IAIzC,0BAA0B,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa;IAI7D,eAAe;IAIrB,aAAa,IAAI,OAAO;IAMxB,cAAc,IAAI,OAAO;yCAxGd,qBAAqB;2CAArB,qBAAqB;CAiHjC"}
|
package/package.json
CHANGED
|
@@ -122,7 +122,11 @@ Ce lot de données produit en 2019, a été numérisé à partir du PCI Vecteur
|
|
|
122
122
|
securityConstraints: [],
|
|
123
123
|
otherConstraints: [],
|
|
124
124
|
// data quality?
|
|
125
|
-
spatialExtents: [
|
|
125
|
+
spatialExtents: [
|
|
126
|
+
{
|
|
127
|
+
bbox: [2.5587, 49.3677, 2.5934, 49.4051],
|
|
128
|
+
},
|
|
129
|
+
],
|
|
126
130
|
temporalExtents: [],
|
|
127
131
|
status: 'completed',
|
|
128
132
|
updateFrequency: 'unknown',
|
|
@@ -94,7 +94,7 @@ export const GEOCAT_CH_DATASET_RECORD: DatasetRecord = {
|
|
|
94
94
|
id: 'geonetwork.thesaurus.external.theme.gemet',
|
|
95
95
|
name: 'GEMET',
|
|
96
96
|
url: new URL(
|
|
97
|
-
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/
|
|
97
|
+
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/external.theme.gemet'
|
|
98
98
|
),
|
|
99
99
|
},
|
|
100
100
|
type: 'theme',
|
|
@@ -105,7 +105,7 @@ export const GEOCAT_CH_DATASET_RECORD: DatasetRecord = {
|
|
|
105
105
|
id: 'geonetwork.thesaurus.external.theme.gemet',
|
|
106
106
|
name: 'GEMET',
|
|
107
107
|
url: new URL(
|
|
108
|
-
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/
|
|
108
|
+
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/external.theme.gemet'
|
|
109
109
|
),
|
|
110
110
|
},
|
|
111
111
|
type: 'theme',
|
|
@@ -116,7 +116,7 @@ export const GEOCAT_CH_DATASET_RECORD: DatasetRecord = {
|
|
|
116
116
|
id: 'geonetwork.thesaurus.external.theme.gemet',
|
|
117
117
|
name: 'GEMET',
|
|
118
118
|
url: new URL(
|
|
119
|
-
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/
|
|
119
|
+
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/external.theme.gemet'
|
|
120
120
|
),
|
|
121
121
|
},
|
|
122
122
|
type: 'theme',
|
|
@@ -127,7 +127,7 @@ export const GEOCAT_CH_DATASET_RECORD: DatasetRecord = {
|
|
|
127
127
|
id: 'geonetwork.thesaurus.external.theme.gemet',
|
|
128
128
|
name: 'GEMET',
|
|
129
129
|
url: new URL(
|
|
130
|
-
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/
|
|
130
|
+
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/external.theme.gemet'
|
|
131
131
|
),
|
|
132
132
|
},
|
|
133
133
|
type: 'theme',
|
|
@@ -138,7 +138,7 @@ export const GEOCAT_CH_DATASET_RECORD: DatasetRecord = {
|
|
|
138
138
|
id: 'geonetwork.thesaurus.external.theme.gemet',
|
|
139
139
|
name: 'GEMET',
|
|
140
140
|
url: new URL(
|
|
141
|
-
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/
|
|
141
|
+
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/external.theme.gemet'
|
|
142
142
|
),
|
|
143
143
|
},
|
|
144
144
|
type: 'theme',
|
|
@@ -149,7 +149,7 @@ export const GEOCAT_CH_DATASET_RECORD: DatasetRecord = {
|
|
|
149
149
|
id: 'geonetwork.thesaurus.external.theme.gemet',
|
|
150
150
|
name: 'GEMET',
|
|
151
151
|
url: new URL(
|
|
152
|
-
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/
|
|
152
|
+
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/external.theme.gemet'
|
|
153
153
|
),
|
|
154
154
|
},
|
|
155
155
|
type: 'theme',
|
|
@@ -160,7 +160,7 @@ export const GEOCAT_CH_DATASET_RECORD: DatasetRecord = {
|
|
|
160
160
|
id: 'geonetwork.thesaurus.external.theme.gemet',
|
|
161
161
|
name: 'GEMET',
|
|
162
162
|
url: new URL(
|
|
163
|
-
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/
|
|
163
|
+
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/external.theme.gemet'
|
|
164
164
|
),
|
|
165
165
|
},
|
|
166
166
|
type: 'theme',
|
|
@@ -171,7 +171,7 @@ export const GEOCAT_CH_DATASET_RECORD: DatasetRecord = {
|
|
|
171
171
|
id: 'geonetwork.thesaurus.external.theme.gemet',
|
|
172
172
|
name: 'GEMET',
|
|
173
173
|
url: new URL(
|
|
174
|
-
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/
|
|
174
|
+
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/external.theme.gemet'
|
|
175
175
|
),
|
|
176
176
|
},
|
|
177
177
|
type: 'theme',
|
|
@@ -182,7 +182,7 @@ export const GEOCAT_CH_DATASET_RECORD: DatasetRecord = {
|
|
|
182
182
|
id: 'geonetwork.thesaurus.external.theme.gemet',
|
|
183
183
|
name: 'GEMET',
|
|
184
184
|
url: new URL(
|
|
185
|
-
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/
|
|
185
|
+
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/external.theme.gemet'
|
|
186
186
|
),
|
|
187
187
|
},
|
|
188
188
|
type: 'theme',
|
|
@@ -193,7 +193,7 @@ export const GEOCAT_CH_DATASET_RECORD: DatasetRecord = {
|
|
|
193
193
|
id: 'geonetwork.thesaurus.external.theme.inspire-theme',
|
|
194
194
|
name: 'GEMET - INSPIRE themes, version 1.0',
|
|
195
195
|
url: new URL(
|
|
196
|
-
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/
|
|
196
|
+
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/external.theme.inspire-theme'
|
|
197
197
|
),
|
|
198
198
|
},
|
|
199
199
|
type: 'theme',
|
|
@@ -204,7 +204,7 @@ export const GEOCAT_CH_DATASET_RECORD: DatasetRecord = {
|
|
|
204
204
|
id: 'geonetwork.thesaurus.external.theme.inspire-theme',
|
|
205
205
|
name: 'GEMET - INSPIRE themes, version 1.0',
|
|
206
206
|
url: new URL(
|
|
207
|
-
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/
|
|
207
|
+
'https://geocat-dev.dev.bgdi.ch/geonetwork/srv/api/registries/vocabularies/external.theme.inspire-theme'
|
|
208
208
|
),
|
|
209
209
|
},
|
|
210
210
|
type: 'theme',
|
|
@@ -332,7 +332,32 @@ Die Quelle ist zu bezeichnen: „Quelle: Stadt Zürich“.`,
|
|
|
332
332
|
securityConstraints: [],
|
|
333
333
|
otherConstraints: [],
|
|
334
334
|
// data quality?
|
|
335
|
-
spatialExtents: [
|
|
335
|
+
spatialExtents: [
|
|
336
|
+
{
|
|
337
|
+
description: 'AK',
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
bbox: [
|
|
341
|
+
6.75599105586694, 45.7887442565203, 10.5418236945627, 47.5175655551557,
|
|
342
|
+
],
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
geometry: {
|
|
346
|
+
type: 'MultiPolygon',
|
|
347
|
+
coordinates: [
|
|
348
|
+
[
|
|
349
|
+
[
|
|
350
|
+
[6.777075, 45.827119, 0],
|
|
351
|
+
[6.755991, 47.517566, 0],
|
|
352
|
+
[10.541824, 47.477984, 0],
|
|
353
|
+
[10.446252, 45.788744, 0],
|
|
354
|
+
[6.777075, 45.827119, 0],
|
|
355
|
+
],
|
|
356
|
+
],
|
|
357
|
+
],
|
|
358
|
+
},
|
|
359
|
+
},
|
|
360
|
+
],
|
|
336
361
|
temporalExtents: [],
|
|
337
362
|
status: 'completed',
|
|
338
363
|
updateFrequency: 'asNeeded',
|
|
@@ -388,7 +388,11 @@ Depuis, ce sont les Districts routiers qui assurent la tenue à jour de ces info
|
|
|
388
388
|
name: 'Direction Asset Management (SPW - Mobilité et Infrastructures - Direction Asset Management)',
|
|
389
389
|
},
|
|
390
390
|
securityConstraints: [],
|
|
391
|
-
spatialExtents: [
|
|
391
|
+
spatialExtents: [
|
|
392
|
+
{
|
|
393
|
+
bbox: [2.75, 49.45, 6.5, 50.85],
|
|
394
|
+
},
|
|
395
|
+
],
|
|
392
396
|
spatialRepresentation: 'vector',
|
|
393
397
|
status: 'ongoing',
|
|
394
398
|
temporalExtents: [],
|
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
readResourcePublished,
|
|
35
35
|
readResourceUpdated,
|
|
36
36
|
readSecurityConstraints,
|
|
37
|
+
readSpatialExtents,
|
|
37
38
|
readSpatialRepresentation,
|
|
38
39
|
readStatus,
|
|
39
40
|
readTemporalExtents,
|
|
@@ -60,6 +61,7 @@ import {
|
|
|
60
61
|
writeResourcePublished,
|
|
61
62
|
writeResourceUpdated,
|
|
62
63
|
writeSecurityConstraints,
|
|
64
|
+
writeSpatialExtents,
|
|
63
65
|
writeSpatialRepresentation,
|
|
64
66
|
writeStatus,
|
|
65
67
|
writeTemporalExtents,
|
|
@@ -101,8 +103,8 @@ export class Iso19139Converter extends BaseConverter<string> {
|
|
|
101
103
|
distributions: readDistributions,
|
|
102
104
|
onlineResources: readOnlineResources,
|
|
103
105
|
temporalExtents: readTemporalExtents,
|
|
106
|
+
spatialExtents: readSpatialExtents,
|
|
104
107
|
// TODO
|
|
105
|
-
spatialExtents: () => [],
|
|
106
108
|
extras: () => undefined,
|
|
107
109
|
landingPage: () => undefined,
|
|
108
110
|
languages: () => [],
|
|
@@ -139,8 +141,8 @@ export class Iso19139Converter extends BaseConverter<string> {
|
|
|
139
141
|
distributions: writeDistributions,
|
|
140
142
|
onlineResources: writeOnlineResources,
|
|
141
143
|
temporalExtents: writeTemporalExtents,
|
|
144
|
+
spatialExtents: () => writeSpatialExtents,
|
|
142
145
|
// TODO
|
|
143
|
-
spatialExtents: () => undefined,
|
|
144
146
|
extras: () => undefined,
|
|
145
147
|
landingPage: () => undefined,
|
|
146
148
|
languages: () => undefined,
|
|
@@ -13,6 +13,8 @@ import {
|
|
|
13
13
|
UpdateFrequency,
|
|
14
14
|
UpdateFrequencyCustom,
|
|
15
15
|
} from '../../../../../../libs/common/domain/src/lib/model/record'
|
|
16
|
+
import { ThesaurusModel } from '../../../../../../libs/common/domain/src/lib/model/thesaurus'
|
|
17
|
+
import { Geometry } from 'geojson'
|
|
16
18
|
import { matchMimeType, matchProtocol } from '../common/distribution.mapper'
|
|
17
19
|
import {
|
|
18
20
|
ChainableFunction,
|
|
@@ -26,21 +28,22 @@ import {
|
|
|
26
28
|
pipe,
|
|
27
29
|
} from '../function-utils'
|
|
28
30
|
import {
|
|
29
|
-
XmlElement,
|
|
30
31
|
findChildElement,
|
|
31
32
|
findChildrenElement,
|
|
32
33
|
findNestedElement,
|
|
33
34
|
findNestedElements,
|
|
34
35
|
findParent,
|
|
36
|
+
firstChildElement,
|
|
35
37
|
readAttribute,
|
|
36
38
|
readText,
|
|
39
|
+
XmlElement,
|
|
37
40
|
} from '../xml-utils'
|
|
41
|
+
import { readGeometry } from './utils/geometry'
|
|
38
42
|
import { fullNameToParts } from './utils/individual-name'
|
|
39
43
|
import { getKeywordTypeFromKeywordTypeCode } from './utils/keyword.mapper'
|
|
40
44
|
import { getRoleFromRoleCode } from './utils/role.mapper'
|
|
41
45
|
import { getStatusFromStatusCode } from './utils/status.mapper'
|
|
42
46
|
import { getUpdateFrequencyFromFrequencyCode } from './utils/update-frequency.mapper'
|
|
43
|
-
import { ThesaurusModel } from '../../../../../../libs/common/domain/src/lib/model/thesaurus'
|
|
44
47
|
|
|
45
48
|
export function extractCharacterString(): ChainableFunction<
|
|
46
49
|
XmlElement,
|
|
@@ -66,6 +69,14 @@ export function extractDateTime(): ChainableFunction<XmlElement, Date> {
|
|
|
66
69
|
)
|
|
67
70
|
}
|
|
68
71
|
|
|
72
|
+
export function extractDecimal(): ChainableFunction<XmlElement, number> {
|
|
73
|
+
return pipe(
|
|
74
|
+
findChildElement('gco:Decimal', false),
|
|
75
|
+
readText(),
|
|
76
|
+
map((numberStr) => (numberStr ? Number(numberStr) : null))
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
69
80
|
export function extractUrl(): ChainableFunction<XmlElement, URL> {
|
|
70
81
|
const getUrl = pipe(findChildElement('gmd:URL', false), readText())
|
|
71
82
|
const getCharacterString = pipe(
|
|
@@ -895,3 +906,62 @@ export function readTemporalExtents(rootEl: XmlElement) {
|
|
|
895
906
|
})
|
|
896
907
|
)(rootEl)
|
|
897
908
|
}
|
|
909
|
+
|
|
910
|
+
export function readSpatialExtents(rootEl: XmlElement) {
|
|
911
|
+
const extractGeometry = (rootEl: XmlElement): Geometry => {
|
|
912
|
+
if (!rootEl) return null
|
|
913
|
+
return pipe(
|
|
914
|
+
findChildElement('gmd:polygon', false),
|
|
915
|
+
firstChildElement,
|
|
916
|
+
map((el) => readGeometry(el))
|
|
917
|
+
)(rootEl)
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
const extractBBox = (
|
|
921
|
+
rootEl: XmlElement
|
|
922
|
+
): [number, number, number, number] => {
|
|
923
|
+
if (!rootEl) return null
|
|
924
|
+
return pipe(
|
|
925
|
+
combine(
|
|
926
|
+
pipe(findChildElement('gmd:westBoundLongitude'), extractDecimal()),
|
|
927
|
+
pipe(findChildElement('gmd:southBoundLatitude'), extractDecimal()),
|
|
928
|
+
pipe(findChildElement('gmd:eastBoundLongitude'), extractDecimal()),
|
|
929
|
+
pipe(findChildElement('gmd:northBoundLatitude'), extractDecimal())
|
|
930
|
+
)
|
|
931
|
+
)(rootEl)
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
const extractDescription = (rootEl: XmlElement): string => {
|
|
935
|
+
if (!rootEl) return null
|
|
936
|
+
return pipe(
|
|
937
|
+
findNestedElement(
|
|
938
|
+
'gmd:geographicIdentifier',
|
|
939
|
+
'gmd:MD_Identifier',
|
|
940
|
+
'gmd:code'
|
|
941
|
+
),
|
|
942
|
+
extractCharacterString()
|
|
943
|
+
)(rootEl)
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
return pipe(
|
|
947
|
+
findIdentification(),
|
|
948
|
+
findNestedElements('gmd:extent', 'gmd:EX_Extent', 'gmd:geographicElement'),
|
|
949
|
+
mapArray(
|
|
950
|
+
combine(
|
|
951
|
+
pipe(findChildElement('gmd:EX_BoundingPolygon'), extractGeometry),
|
|
952
|
+
pipe(findChildElement('gmd:EX_GeographicBoundingBox'), extractBBox),
|
|
953
|
+
pipe(
|
|
954
|
+
findChildElement('gmd:EX_GeographicDescription'),
|
|
955
|
+
extractDescription
|
|
956
|
+
)
|
|
957
|
+
)
|
|
958
|
+
),
|
|
959
|
+
mapArray(([geometry, bbox, description]) => {
|
|
960
|
+
return {
|
|
961
|
+
...(geometry && { geometry }),
|
|
962
|
+
...(bbox && { bbox }),
|
|
963
|
+
...(description && { description }),
|
|
964
|
+
}
|
|
965
|
+
})
|
|
966
|
+
)(rootEl)
|
|
967
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { XmlElement } from '@rgrove/parse-xml'
|
|
2
|
+
import { Geometry } from 'geojson'
|
|
3
|
+
import GML32 from 'ol/format/GML32'
|
|
4
|
+
import GeoJSON from 'ol/format/GeoJSON'
|
|
5
|
+
import { parse } from 'ol/xml'
|
|
6
|
+
import {
|
|
7
|
+
createDocument,
|
|
8
|
+
getRootElement,
|
|
9
|
+
parseXmlString,
|
|
10
|
+
xmlToString,
|
|
11
|
+
} from '../../xml-utils'
|
|
12
|
+
|
|
13
|
+
export function readGeometry(el: XmlElement): Geometry {
|
|
14
|
+
const xmlDoc = createDocument(el)
|
|
15
|
+
xmlDoc.root.attributes['xmlns'] = 'http://www.opengis.net/gml/3.2'
|
|
16
|
+
const gmlString = xmlToString(xmlDoc)
|
|
17
|
+
const doc = parse(gmlString)
|
|
18
|
+
// we need an intermediate node to be able to parse the GML
|
|
19
|
+
const node = document.createElement('pre')
|
|
20
|
+
node.appendChild(doc.documentElement)
|
|
21
|
+
const gml32Format = new GML32()
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
23
|
+
// @ts-ignore
|
|
24
|
+
const geometry = gml32Format.readGeometryFromNode(node)
|
|
25
|
+
const geojsonFormat = new GeoJSON()
|
|
26
|
+
return geojsonFormat.writeGeometryObject(geometry)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function writeGeometry(geometryObject: Geometry): XmlElement {
|
|
30
|
+
const geojsonFormat = new GeoJSON()
|
|
31
|
+
const geometry = geojsonFormat.readGeometry(geometryObject)
|
|
32
|
+
const gml32Format = new GML32()
|
|
33
|
+
const node = gml32Format.writeGeometryNode(geometry)
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
35
|
+
// @ts-ignore
|
|
36
|
+
const element = node.firstElementChild as HTMLElement
|
|
37
|
+
const gmlString = new XMLSerializer().serializeToString(element)
|
|
38
|
+
return getRootElement(parseXmlString(gmlString))
|
|
39
|
+
}
|
|
@@ -14,7 +14,9 @@ import {
|
|
|
14
14
|
UpdateFrequencyCode,
|
|
15
15
|
UpdateFrequencyCustom,
|
|
16
16
|
} from '../../../../../../libs/common/domain/src/lib/model/record'
|
|
17
|
+
import { ThesaurusModel } from '../../../../../../libs/common/domain/src/lib/model/thesaurus'
|
|
17
18
|
import format from 'date-fns/format'
|
|
19
|
+
import { Geometry } from 'geojson'
|
|
18
20
|
import {
|
|
19
21
|
ChainableFunction,
|
|
20
22
|
fallback,
|
|
@@ -44,8 +46,8 @@ import {
|
|
|
44
46
|
setTextContent,
|
|
45
47
|
} from '../xml-utils'
|
|
46
48
|
import { readKind } from './read-parts'
|
|
49
|
+
import { writeGeometry } from './utils/geometry'
|
|
47
50
|
import { namePartsToFull } from './utils/individual-name'
|
|
48
|
-
import { ThesaurusModel } from '../../../../../../libs/common/domain/src/lib/model/thesaurus'
|
|
49
51
|
|
|
50
52
|
export function writeCharacterString(
|
|
51
53
|
text: string
|
|
@@ -101,6 +103,14 @@ export function writeDate(
|
|
|
101
103
|
)
|
|
102
104
|
}
|
|
103
105
|
|
|
106
|
+
export function writeDecimal(
|
|
107
|
+
decimal: number
|
|
108
|
+
): ChainableFunction<XmlElement, XmlElement> {
|
|
109
|
+
return tap(
|
|
110
|
+
pipe(findChildOrCreate('gco:Decimal'), setTextContent(decimal.toString()))
|
|
111
|
+
)
|
|
112
|
+
}
|
|
113
|
+
|
|
104
114
|
export function getProgressCode(status: RecordStatus): string {
|
|
105
115
|
switch (status) {
|
|
106
116
|
case 'completed':
|
|
@@ -1184,3 +1194,62 @@ export function writeTemporalExtents(
|
|
|
1184
1194
|
)
|
|
1185
1195
|
)(rootEl)
|
|
1186
1196
|
}
|
|
1197
|
+
|
|
1198
|
+
export function writeSpatialExtents(record: DatasetRecord, rootEl: XmlElement) {
|
|
1199
|
+
const appendBoundingPolygon = (geometry?: Geometry) => {
|
|
1200
|
+
if (!geometry) return null
|
|
1201
|
+
return pipe(
|
|
1202
|
+
createElement('gmd:EX_BoundingPolygon'),
|
|
1203
|
+
appendChildren(
|
|
1204
|
+
pipe(
|
|
1205
|
+
createElement('gmd:polygon'),
|
|
1206
|
+
appendChildren(() => writeGeometry(geometry))
|
|
1207
|
+
)
|
|
1208
|
+
)
|
|
1209
|
+
)
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
const appendGeographicBoundingBox = (
|
|
1213
|
+
bbox?: [number, number, number, number]
|
|
1214
|
+
) => {
|
|
1215
|
+
if (!bbox) return null
|
|
1216
|
+
return pipe(
|
|
1217
|
+
createElement('gmd:EX_GeographicBoundingBox'),
|
|
1218
|
+
appendChildren(
|
|
1219
|
+
pipe(createElement('gmd:westBoundLongitude'), writeDecimal(bbox[0])),
|
|
1220
|
+
pipe(createElement('gmd:eastBoundLongitude'), writeDecimal(bbox[2])),
|
|
1221
|
+
pipe(createElement('gmd:southBoundLatitude'), writeDecimal(bbox[1])),
|
|
1222
|
+
pipe(createElement('gmd:northBoundLatitude'), writeDecimal(bbox[3]))
|
|
1223
|
+
)
|
|
1224
|
+
)
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
const appendGeographicDescription = (description?: string) => {
|
|
1228
|
+
if (!description) return null
|
|
1229
|
+
return pipe(
|
|
1230
|
+
createElement('gmd:EX_GeographicDescription'),
|
|
1231
|
+
createChild('gmd:geographicIdentifier'),
|
|
1232
|
+
createChild('gmd:MD_Identifier'),
|
|
1233
|
+
createChild('gmd:code'),
|
|
1234
|
+
writeCharacterString(description)
|
|
1235
|
+
)
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
pipe(
|
|
1239
|
+
findOrCreateIdentification(),
|
|
1240
|
+
findNestedChildOrCreate('gmd:extent', 'gmd:EX_Extent'),
|
|
1241
|
+
removeChildrenByName('gmd:geographicElement'),
|
|
1242
|
+
appendChildren(
|
|
1243
|
+
...record.spatialExtents.map((extent) =>
|
|
1244
|
+
pipe(
|
|
1245
|
+
createElement('gmd:geographicElement'),
|
|
1246
|
+
appendChildren(
|
|
1247
|
+
appendBoundingPolygon(extent.geometry),
|
|
1248
|
+
appendGeographicBoundingBox(extent.bbox),
|
|
1249
|
+
appendGeographicDescription(extent.description)
|
|
1250
|
+
)
|
|
1251
|
+
)
|
|
1252
|
+
)
|
|
1253
|
+
)
|
|
1254
|
+
)(rootEl)
|
|
1255
|
+
}
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
XmlText,
|
|
7
7
|
} from '@rgrove/parse-xml'
|
|
8
8
|
import { ChainableFunction, fallback } from './function-utils'
|
|
9
|
+
|
|
9
10
|
export { XmlDocument, XmlElement } from '@rgrove/parse-xml'
|
|
10
11
|
|
|
11
12
|
export class XmlParseError extends Error {
|
|
@@ -115,6 +116,10 @@ export function allChildrenElement(element: XmlElement): Array<XmlElement> {
|
|
|
115
116
|
] as Array<XmlElement>
|
|
116
117
|
}
|
|
117
118
|
|
|
119
|
+
export function firstChildElement(element: XmlElement): XmlElement {
|
|
120
|
+
return allChildrenElement(element)[0] ?? null
|
|
121
|
+
}
|
|
122
|
+
|
|
118
123
|
/**
|
|
119
124
|
* Will return all matching elements nested according to the given
|
|
120
125
|
* names (similar to a path), starting form the input element;
|
|
@@ -228,6 +233,7 @@ export function xmlToString(
|
|
|
228
233
|
${padding}<${el.name}${attrs}/>
|
|
229
234
|
${parentPadding}`
|
|
230
235
|
}
|
|
236
|
+
|
|
231
237
|
return `
|
|
232
238
|
${padding}<${el.name}${attrs}>${children}</${el.name}>
|
|
233
239
|
${parentPadding}`
|
|
@@ -307,11 +313,13 @@ function getTreeRoot(element: XmlElement): XmlElement {
|
|
|
307
313
|
|
|
308
314
|
// stays on the parent element
|
|
309
315
|
// if the given elements are part of a subtree, will add the root of subtree
|
|
316
|
+
// will filter out falsy elements
|
|
310
317
|
export function appendChildren(
|
|
311
318
|
...childrenFns: Array<ChainableFunction<void, XmlElement>>
|
|
312
319
|
): ChainableFunction<XmlElement, XmlElement> {
|
|
313
320
|
return (element) => {
|
|
314
321
|
if (!element) return null
|
|
322
|
+
childrenFns = childrenFns.filter((fn) => fn)
|
|
315
323
|
element.children.push(...childrenFns.map((fn) => fn()).map(getTreeRoot))
|
|
316
324
|
element.children.forEach((el) => (el.parent = element))
|
|
317
325
|
return element
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
from,
|
|
10
10
|
Observable,
|
|
11
11
|
of,
|
|
12
|
+
Subject,
|
|
12
13
|
switchMap,
|
|
13
14
|
throwError,
|
|
14
15
|
} from 'rxjs'
|
|
@@ -24,7 +25,6 @@ import {
|
|
|
24
25
|
} from '../../../../../../libs/common/domain/src/lib/model/search'
|
|
25
26
|
import { catchError, map, tap } from 'rxjs/operators'
|
|
26
27
|
import {
|
|
27
|
-
BaseConverter,
|
|
28
28
|
findConverterForDocument,
|
|
29
29
|
Gn4Converter,
|
|
30
30
|
Gn4SearchResults,
|
|
@@ -33,8 +33,13 @@ import {
|
|
|
33
33
|
import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
|
|
34
34
|
import { HttpErrorResponse } from '@angular/common/http'
|
|
35
35
|
|
|
36
|
+
const TEMPORARY_ID_PREFIX = 'TEMP-ID-'
|
|
37
|
+
|
|
36
38
|
@Injectable()
|
|
37
39
|
export class Gn4Repository implements RecordsRepositoryInterface {
|
|
40
|
+
_draftsChanged = new Subject<void>()
|
|
41
|
+
draftsChanged$ = this._draftsChanged.asObservable()
|
|
42
|
+
|
|
38
43
|
constructor(
|
|
39
44
|
private gn4SearchApi: SearchApiService,
|
|
40
45
|
private gn4SearchHelper: ElasticsearchService,
|
|
@@ -238,13 +243,14 @@ export class Gn4Repository implements RecordsRepositoryInterface {
|
|
|
238
243
|
switchMap(async (recordAsXml) => {
|
|
239
244
|
const converter = findConverterForDocument(recordAsXml)
|
|
240
245
|
const record = await converter.readRecord(recordAsXml)
|
|
241
|
-
record.uniqueIdentifier =
|
|
246
|
+
record.uniqueIdentifier = `${TEMPORARY_ID_PREFIX}${Date.now()}`
|
|
242
247
|
record.title = `${record.title} (Copy)`
|
|
243
248
|
const xml = await converter.writeRecord(record, recordAsXml)
|
|
244
249
|
window.localStorage.setItem(
|
|
245
250
|
this.getLocalStorageKeyForRecord(record.uniqueIdentifier),
|
|
246
251
|
xml
|
|
247
252
|
)
|
|
253
|
+
this._draftsChanged.next()
|
|
248
254
|
return [record, xml, false] as [CatalogRecord, string, false]
|
|
249
255
|
})
|
|
250
256
|
)
|
|
@@ -295,17 +301,26 @@ export class Gn4Repository implements RecordsRepositoryInterface {
|
|
|
295
301
|
)
|
|
296
302
|
}
|
|
297
303
|
|
|
304
|
+
deleteRecord(uniqueIdentifier: string): Observable<void> {
|
|
305
|
+
return this.gn4RecordsApi.deleteRecord(uniqueIdentifier)
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
generateTemporaryId(): string {
|
|
309
|
+
return `${TEMPORARY_ID_PREFIX}${Date.now()}`
|
|
310
|
+
}
|
|
311
|
+
|
|
298
312
|
saveRecordAsDraft(
|
|
299
313
|
record: CatalogRecord,
|
|
300
314
|
referenceRecordSource?: string
|
|
301
315
|
): Observable<string> {
|
|
302
316
|
return this.serializeRecordToXml(record, referenceRecordSource).pipe(
|
|
303
|
-
tap((recordXml) =>
|
|
317
|
+
tap((recordXml) => {
|
|
304
318
|
window.localStorage.setItem(
|
|
305
319
|
this.getLocalStorageKeyForRecord(record.uniqueIdentifier),
|
|
306
320
|
recordXml
|
|
307
321
|
)
|
|
308
|
-
|
|
322
|
+
this._draftsChanged.next()
|
|
323
|
+
})
|
|
309
324
|
)
|
|
310
325
|
}
|
|
311
326
|
|
|
@@ -313,6 +328,7 @@ export class Gn4Repository implements RecordsRepositoryInterface {
|
|
|
313
328
|
window.localStorage.removeItem(
|
|
314
329
|
this.getLocalStorageKeyForRecord(uniqueIdentifier)
|
|
315
330
|
)
|
|
331
|
+
this._draftsChanged.next()
|
|
316
332
|
}
|
|
317
333
|
|
|
318
334
|
recordHasDraft(uniqueIdentifier: string): boolean {
|
|
@@ -323,6 +339,10 @@ export class Gn4Repository implements RecordsRepositoryInterface {
|
|
|
323
339
|
)
|
|
324
340
|
}
|
|
325
341
|
|
|
342
|
+
isRecordNotYetSaved(uniqueIdentifier: string): boolean {
|
|
343
|
+
return uniqueIdentifier.startsWith(TEMPORARY_ID_PREFIX)
|
|
344
|
+
}
|
|
345
|
+
|
|
326
346
|
// generated by copilot
|
|
327
347
|
getAllDrafts(): Observable<CatalogRecord[]> {
|
|
328
348
|
const items = { ...window.localStorage }
|
|
@@ -52,6 +52,14 @@ export abstract class RecordsRepositoryInterface {
|
|
|
52
52
|
referenceRecordSource?: string
|
|
53
53
|
): Observable<string>
|
|
54
54
|
|
|
55
|
+
/**
|
|
56
|
+
* @param uniqueIdentifier
|
|
57
|
+
* @returns Observable<void> Returns when record is deleted
|
|
58
|
+
*/
|
|
59
|
+
abstract deleteRecord(uniqueIdentifier: string): Observable<void>
|
|
60
|
+
|
|
61
|
+
abstract generateTemporaryId(): string
|
|
62
|
+
|
|
55
63
|
/**
|
|
56
64
|
* @param record
|
|
57
65
|
* @param referenceRecordSource
|
|
@@ -64,7 +72,9 @@ export abstract class RecordsRepositoryInterface {
|
|
|
64
72
|
|
|
65
73
|
abstract clearRecordDraft(uniqueIdentifier: string): void
|
|
66
74
|
abstract recordHasDraft(uniqueIdentifier: string): boolean
|
|
75
|
+
abstract isRecordNotYetSaved(uniqueIdentifier: string): boolean
|
|
67
76
|
|
|
68
77
|
/** will return all pending drafts, both published and not published */
|
|
69
78
|
abstract getAllDrafts(): Observable<CatalogRecord[]>
|
|
79
|
+
abstract draftsChanged$: Observable<void>
|
|
70
80
|
}
|