diff --git a/src/app/+admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts b/src/app/+admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts index 0811530343..52fee16473 100644 --- a/src/app/+admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts +++ b/src/app/+admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts @@ -177,6 +177,7 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy { }); } this.clearFields(); + this.registryService.cancelEditMetadataField(); } ); } diff --git a/src/app/+admin/admin-registries/metadata-schema/metadata-schema.component.html b/src/app/+admin/admin-registries/metadata-schema/metadata-schema.component.html index 4a7a4cf34d..49ef748349 100644 --- a/src/app/+admin/admin-registries/metadata-schema/metadata-schema.component.html +++ b/src/app/+admin/admin-registries/metadata-schema/metadata-schema.component.html @@ -1,36 +1,37 @@
-
+
- + -

{{'admin.registries.schema.description' | translate:namespace }}

+

{{'admin.registries.schema.description' | translate:{ namespace: schema?.namespace } }}

{{'admin.registries.schema.fields.head' | translate}}

- -
- - + + +
+
+ - - - + + - + - -
{{'admin.registries.schema.fields.table.field' | translate}} {{'admin.registries.schema.fields.table.scopenote' | translate}}
{{(metadataSchema | async)?.payload?.prefix}}.{{field.element}}{{field.qualifier}}{{schema?.prefix}}.{{field.element}}{{field.qualifier}} {{field.scopeNote}}
+ + +
+
+ + - - - -
- - -
+
+ + +
+
diff --git a/src/app/+admin/admin-registries/metadata-schema/metadata-schema.component.ts b/src/app/+admin/admin-registries/metadata-schema/metadata-schema.component.ts index 5712cde0e7..2e956e56cf 100644 --- a/src/app/+admin/admin-registries/metadata-schema/metadata-schema.component.ts +++ b/src/app/+admin/admin-registries/metadata-schema/metadata-schema.component.ts @@ -5,7 +5,7 @@ import { Observable, combineLatest as observableCombineLatest } from 'rxjs'; import { RemoteData } from '../../../core/data/remote-data'; import { PaginatedList } from '../../../core/data/paginated-list'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; -import { map, take } from 'rxjs/operators'; +import { map, switchMap, take } from 'rxjs/operators'; import { hasValue } from '../../../shared/empty.util'; import { RestResponse } from '../../../core/cache/response.models'; import { zip } from 'rxjs/internal/observable/zip'; @@ -13,8 +13,10 @@ import { NotificationsService } from '../../../shared/notifications/notification import { TranslateService } from '@ngx-translate/core'; import { MetadataField } from '../../../core/metadata/metadata-field.model'; import { MetadataSchema } from '../../../core/metadata/metadata-schema.model'; -import { getSucceededRemoteData } from '../../../core/shared/operators'; +import { getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; import { toFindListOptions } from '../../../shared/pagination/pagination.utils'; +import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; +import { combineLatest } from 'rxjs/internal/observable/combineLatest'; @Component({ selector: 'ds-metadata-schema', @@ -26,21 +28,15 @@ import { toFindListOptions } from '../../../shared/pagination/pagination.utils'; * The admin can create, edit or delete metadata fields here. */ export class MetadataSchemaComponent implements OnInit { - - /** - * The namespace of the metadata schema - */ - namespace; - /** * The metadata schema */ - metadataSchema: Observable>; + metadataSchema$: Observable; /** * A list of all the fields attached to this metadata schema */ - metadataFields: Observable>>; + metadataFields$: Observable>>; /** * Pagination config used to display the list of metadata fields @@ -51,6 +47,11 @@ export class MetadataSchemaComponent implements OnInit { pageSizeOptions: [25, 50, 100, 200] }); + /** + * Whether or not the list of MetadataFields needs an update + */ + needsUpdate: BehaviorSubject = new BehaviorSubject(true); + constructor(private registryService: RegistryService, private route: ActivatedRoute, private notificationsService: NotificationsService, @@ -70,7 +71,7 @@ export class MetadataSchemaComponent implements OnInit { * @param params */ initialize(params) { - this.metadataSchema = this.registryService.getMetadataSchemaByName(params.schemaName); + this.metadataSchema$ = this.registryService.getMetadataSchemaByName(params.schemaName).pipe(getFirstSucceededRemoteDataPayload()); this.updateFields(); } @@ -80,18 +81,21 @@ export class MetadataSchemaComponent implements OnInit { */ onPageChange(event) { this.config.currentPage = event; - this.updateFields(); + this.needsUpdate.next(true); } /** * Update the list of fields by fetching it from the rest api or cache */ private updateFields() { - this.metadataSchema.pipe(getSucceededRemoteData()).subscribe((schemaData) => { - const schema = schemaData.payload; - this.metadataFields = this.registryService.getMetadataFieldsBySchema(schema, toFindListOptions(this.config)); - this.namespace = {namespace: schemaData.payload.namespace}; - }); + this.metadataFields$ = combineLatest(this.metadataSchema$, this.needsUpdate).pipe( + switchMap(([schema, update]: [MetadataSchema, boolean]) => { + if (update) { + console.log('reloaded list'); + return this.registryService.getMetadataFieldsBySchema(schema, toFindListOptions(this.config)); + } + }) + ); } /** @@ -99,8 +103,7 @@ export class MetadataSchemaComponent implements OnInit { * a new REST call */ public forceUpdateFields() { - this.registryService.clearMetadataFieldRequests().subscribe(); - this.updateFields(); + this.registryService.clearMetadataFieldRequests().subscribe(() => this.needsUpdate.next(true)); } /** diff --git a/src/app/core/data/metadata-field-data.service.ts b/src/app/core/data/metadata-field-data.service.ts index 9d1298dced..00ec3c10d1 100644 --- a/src/app/core/data/metadata-field-data.service.ts +++ b/src/app/core/data/metadata-field-data.service.ts @@ -45,6 +45,12 @@ export class MetadataFieldDataService extends DataService { super(); } + /** + * Find metadata fields belonging to a metadata schema + * @param schema The metadata schema to list fields for + * @param options The options info used to retrieve the fields + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ findBySchema(schema: MetadataSchema, options: FindListOptions = {}, ...linksToFollow: Array>) { const optionsWithSchema = Object.assign(new FindListOptions(), options, { searchParams: [new SearchParam('schema', schema.prefix)] @@ -52,6 +58,14 @@ export class MetadataFieldDataService extends DataService { return this.searchBy(this.searchBySchemaLinkPath, optionsWithSchema, ...linksToFollow); } + /** + * Create or Update a MetadataField + * If the MetadataField contains an id, it is assumed the field already exists and is updated instead + * Since creating or updating is nearly identical, the only real difference is the request (and slight difference in endpoint): + * - On creation, a CreateMetadataFieldRequest is used + * - On update, a UpdateMetadataFieldRequest is used + * @param field The MetadataField to create or update + */ createOrUpdateMetadataField(field: MetadataField): Observable { const isUpdate = hasValue(field.id); const requestId = this.requestService.generateRequestId(); @@ -97,9 +111,15 @@ export class MetadataFieldDataService extends DataService { ); } + /** + * Clear all metadata field requests + * Used for refreshing lists after adding/updating/removing a metadata field from a metadata schema + */ clearRequests(): Observable { return this.getBrowseEndpoint().pipe( - tap((href: string) => this.requestService.removeByHrefSubstring(href)) + tap((href: string) => { + this.requestService.removeByHrefSubstring(href); + }) ); }