diff --git a/src/app/+admin/admin-registries/metadata-registry/metadata-registry.component.ts b/src/app/+admin/admin-registries/metadata-registry/metadata-registry.component.ts index ed5cefeab2..cd845329c6 100644 --- a/src/app/+admin/admin-registries/metadata-registry/metadata-registry.component.ts +++ b/src/app/+admin/admin-registries/metadata-registry/metadata-registry.component.ts @@ -4,7 +4,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 { filter, 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,6 +13,7 @@ import { Route, Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { MetadataSchema } from '../../../core/metadata/metadata-schema.model'; import { toFindListOptions } from '../../../shared/pagination/pagination.utils'; +import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; @Component({ selector: 'ds-metadata-registry', @@ -38,6 +39,11 @@ export class MetadataRegistryComponent { pageSize: 25 }); + /** + * Whether or not the list of MetadataSchemas needs an update + */ + needsUpdate$: BehaviorSubject = new BehaviorSubject(true); + constructor(private registryService: RegistryService, private notificationsService: NotificationsService, private router: Router, @@ -51,14 +57,17 @@ export class MetadataRegistryComponent { */ onPageChange(event) { this.config.currentPage = event; - this.updateSchemas(); + this.forceUpdateSchemas(); } /** * Update the list of schemas by fetching it from the rest api or cache */ private updateSchemas() { - this.metadataSchemas = this.registryService.getMetadataSchemas(toFindListOptions(this.config)); + this.metadataSchemas = this.needsUpdate$.pipe( + filter((update) => update === true), + switchMap(() => this.registryService.getMetadataSchemas(toFindListOptions(this.config))) + ); } /** @@ -66,8 +75,7 @@ export class MetadataRegistryComponent { * a new REST call */ public forceUpdateSchemas() { - this.registryService.clearMetadataSchemaRequests().subscribe(); - this.updateSchemas(); + this.needsUpdate$.next(true); } /** @@ -126,6 +134,7 @@ export class MetadataRegistryComponent { * Delete all the selected metadata schemas */ deleteSchemas() { + this.registryService.clearMetadataSchemaRequests().subscribe(); this.registryService.getSelectedMetadataSchemas().pipe(take(1)).subscribe( (schemas) => { const tasks$ = []; diff --git a/src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts b/src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts index 23e7309a00..78290ee9f0 100644 --- a/src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts +++ b/src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts @@ -128,6 +128,7 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { * Emit the updated/created schema using the EventEmitter submitForm */ onSubmit() { + this.registryService.clearMetadataSchemaRequests().subscribe(); this.registryService.getActiveMetadataSchema().pipe(take(1)).subscribe( (schema) => { const values = { @@ -148,6 +149,7 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy { }); } this.clearFields(); + this.registryService.cancelEditMetadataSchema(); } ); } 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 52fee16473..e19b4fe3b7 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 @@ -153,6 +153,7 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy { * Emit the updated/created field using the EventEmitter submitForm */ onSubmit() { + this.registryService.clearMetadataFieldRequests().subscribe(); this.registryService.getActiveMetadataField().pipe(take(1)).subscribe( (field) => { const values = { 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 2e956e56cf..96872573b9 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 @@ -50,7 +50,7 @@ export class MetadataSchemaComponent implements OnInit { /** * Whether or not the list of MetadataFields needs an update */ - needsUpdate: BehaviorSubject = new BehaviorSubject(true); + needsUpdate$: BehaviorSubject = new BehaviorSubject(true); constructor(private registryService: RegistryService, private route: ActivatedRoute, @@ -81,17 +81,16 @@ export class MetadataSchemaComponent implements OnInit { */ onPageChange(event) { this.config.currentPage = event; - this.needsUpdate.next(true); + this.forceUpdateFields(); } /** * Update the list of fields by fetching it from the rest api or cache */ private updateFields() { - this.metadataFields$ = combineLatest(this.metadataSchema$, this.needsUpdate).pipe( + 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)); } }) @@ -103,7 +102,7 @@ export class MetadataSchemaComponent implements OnInit { * a new REST call */ public forceUpdateFields() { - this.registryService.clearMetadataFieldRequests().subscribe(() => this.needsUpdate.next(true)); + this.needsUpdate$.next(true); } /** @@ -162,6 +161,7 @@ export class MetadataSchemaComponent implements OnInit { * Delete all the selected metadata fields */ deleteFields() { + this.registryService.clearMetadataFieldRequests().subscribe(); this.registryService.getSelectedMetadataFields().pipe(take(1)).subscribe( (fields) => { const tasks$ = []; diff --git a/src/app/core/data/metadata-schema-data.service.ts b/src/app/core/data/metadata-schema-data.service.ts index f75f1e453f..bc9270dca4 100644 --- a/src/app/core/data/metadata-schema-data.service.ts +++ b/src/app/core/data/metadata-schema-data.service.ts @@ -42,6 +42,14 @@ export class MetadataSchemaDataService extends DataService { super(); } + /** + * Create or Update a MetadataSchema + * If the MetadataSchema contains an id, it is assumed the schema 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 CreateMetadataSchemaRequest is used + * - On update, a UpdateMetadataSchemaRequest is used + * @param schema The MetadataSchema to create or update + */ createOrUpdateMetadataSchema(schema: MetadataSchema): Observable { const isUpdate = hasValue(schema.id); const requestId = this.requestService.generateRequestId(); @@ -89,6 +97,10 @@ export class MetadataSchemaDataService extends DataService { ); } + /** + * Clear all metadata schema requests + * Used for refreshing lists after adding/updating/removing a metadata schema in the registry + */ clearRequests(): Observable { return this.getBrowseEndpoint().pipe( tap((href: string) => this.requestService.removeByHrefSubstring(href))