diff --git a/src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.html b/src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.html index 3f87018b74..c7d1a09fa8 100644 --- a/src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.html +++ b/src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.html @@ -13,6 +13,6 @@ [formGroup]="formGroup" [formLayout]="formLayout" (cancel)="onCancel()" - (submit)="onSubmit()"> + (submitForm)="onSubmit()"> 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 551e249d41..497758ba14 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 @@ -11,6 +11,8 @@ import { FormBuilderService } from '../../../../shared/form/builder/form-builder import { FormService } from '../../../../shared/form/form.service'; import { Store } from '@ngrx/store'; import { AppState } from '../../../../app.reducer'; +import { take } from 'rxjs/operators'; +import { MetadataSchema } from '../../../../core/metadata/metadataschema.model'; @Component({ selector: 'ds-metadata-schema-form', @@ -95,11 +97,13 @@ export class MetadataSchemaFormComponent implements OnInit { onSubmit() { this.registryService.getActiveMetadataSchema().subscribe( (schema) => { - if (schema == null) { - console.log('metadata field to create:'); - console.log('prefix: ' + this.name.value); - console.log('namespace: ' + this.namespace.value); + this.registryService.createMetadataSchema(Object.assign(new MetadataSchema(), { + prefix: this.name.value, + namespace: this.namespace.value + })).subscribe((newSchema) => { + console.log(newSchema); + }); } else { console.log('metadata field to update:'); console.log('prefix: ' + this.name.value); diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 65484d68aa..e8f476d5b8 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -62,6 +62,7 @@ import { NotificationsService } from '../shared/notifications/notifications.serv import { UploaderService } from '../shared/uploader/uploader.service'; import { BrowseItemsResponseParsingService } from './data/browse-items-response-parsing-service'; import { DSpaceObjectDataService } from './data/dspace-object-data.service'; +import { MetadataschemaParsingService } from './data/metadataschema-parsing.service'; const IMPORTS = [ CommonModule, @@ -121,6 +122,7 @@ const PROVIDERS = [ SubmissionSectionsConfigService, AuthorityService, IntegrationResponseParsingService, + MetadataschemaParsingService, UploaderService, UUIDService, DSpaceObjectDataService, diff --git a/src/app/core/data/request.models.ts b/src/app/core/data/request.models.ts index a96d9716b2..601792fdfd 100644 --- a/src/app/core/data/request.models.ts +++ b/src/app/core/data/request.models.ts @@ -11,6 +11,8 @@ import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service'; import { IntegrationResponseParsingService } from '../integration/integration-response-parsing.service'; import { RestRequestMethod } from './rest-request-method'; import { BrowseItemsResponseParsingService } from './browse-items-response-parsing-service'; +import { RegistryMetadataschemasResponseParsingService } from './registry-metadataschemas-response-parsing.service'; +import { MetadataschemaParsingService } from './metadataschema-parsing.service'; /* tslint:disable:max-classes-per-file */ @@ -217,6 +219,16 @@ export class IntegrationRequest extends GetRequest { } } +export class CreateMetadataSchemaRequest extends PostRequest { + constructor(uuid: string, href: string, public body?: any, public options?: HttpOptions) { + super(uuid, href, body, options); + } + + getResponseParser(): GenericConstructor { + return MetadataschemaParsingService; + } +} + export class RequestError extends Error { statusText: string; } diff --git a/src/app/core/registry/registry.service.ts b/src/app/core/registry/registry.service.ts index 6dd76c1066..4e9d27ca23 100644 --- a/src/app/core/registry/registry.service.ts +++ b/src/app/core/registry/registry.service.ts @@ -6,7 +6,7 @@ import { PageInfo } from '../shared/page-info.model'; import { MetadataSchema } from '../metadata/metadataschema.model'; import { MetadataField } from '../metadata/metadatafield.model'; import { BitstreamFormat } from './mock-bitstream-format.model'; -import { GetRequest, RestRequest } from '../data/request.models'; +import { CreateMetadataSchemaRequest, GetRequest, RestRequest } from '../data/request.models'; import { GenericConstructor } from '../shared/generic-constructor'; import { ResponseParsingService } from '../data/parsing.service'; import { RegistryMetadataschemasResponseParsingService } from '../data/registry-metadataschemas-response-parsing.service'; @@ -14,19 +14,20 @@ import { RemoteDataBuildService } from '../cache/builders/remote-data-build.serv import { RequestService } from '../data/request.service'; import { RegistryMetadataschemasResponse } from './registry-metadataschemas-response.model'; import { + ErrorResponse, MetadataschemaSuccessResponse, RegistryBitstreamformatsSuccessResponse, RegistryMetadatafieldsSuccessResponse, - RegistryMetadataschemasSuccessResponse + RegistryMetadataschemasSuccessResponse, RestResponse } from '../cache/response.models'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { RegistryMetadatafieldsResponseParsingService } from '../data/registry-metadatafields-response-parsing.service'; import { RegistryMetadatafieldsResponse } from './registry-metadatafields-response.model'; -import { isNotEmpty } from '../../shared/empty.util'; +import { isNotEmpty, isNotEmptyOperator } from '../../shared/empty.util'; import { URLCombiner } from '../url-combiner/url-combiner'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; import { RegistryBitstreamformatsResponseParsingService } from '../data/registry-bitstreamformats-response-parsing.service'; import { RegistryBitstreamformatsResponse } from './registry-bitstreamformats-response.model'; -import { getResponseFromEntry } from '../shared/operators'; +import { configureRequest, getResponseFromEntry, getSucceededRemoteData } from '../shared/operators'; import { createSelector, select, Store } from '@ngrx/store'; import { AppState } from '../../app.reducer'; import { MetadataRegistryState } from '../../+admin/admin-registries/metadata-registry/metadata-registry.reducers'; @@ -40,7 +41,11 @@ import { MetadataRegistrySelectFieldAction, MetadataRegistrySelectSchemaAction } from '../../+admin/admin-registries/metadata-registry/metadata-registry.actions'; -import { flatMap, map, tap } from 'rxjs/operators'; +import { distinctUntilChanged, flatMap, map, switchMap, take, tap } from 'rxjs/operators'; +import { DSpaceRESTv2Serializer } from '../dspace-rest-v2/dspace-rest-v2.serializer'; +import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory'; +import { ResourceType } from '../shared/resource-type'; +import { NormalizedMetadataSchema } from '../metadata/normalized-metadata-schema.model'; const metadataRegistryStateSelector = (state: AppState) => state.metadataRegistry; const editMetadataSchemaSelector = createSelector(metadataRegistryStateSelector, (metadataState: MetadataRegistryState) => metadataState.editSchema); @@ -288,45 +293,33 @@ export class RegistryService { return this.store.pipe(select(selectedMetadataFieldsSelector)); } - // public createMetadataSchema(schema: MetadataSchema): Observable> { - // const requestId = this.requestService.generateRequestId(); - // const endpoint$ = this.halService.getEndpoint(this.metadataSchemasPath).pipe( - // isNotEmptyOperator(), - // distinctUntilChanged() - // ); - // - // const serializedDso = new DSpaceRESTv2Serializer(NormalizedObjectFactory.getConstructor(MetadataSchema.type)).serialize(normalizedObject); - // - // const request$ = endpoint$.pipe( - // take(1), - // map((endpoint: string) => new CreateRequest(requestId, endpoint, JSON.stringify(serializedDso))) - // ); - // - // // Execute the post request - // request$.pipe( - // configureRequest(this.requestService) - // ).subscribe(); - // - // // Resolve self link for new object - // const selfLink$ = this.requestService.getByUUID(requestId).pipe( - // getResponseFromEntry(), - // map((response: RestResponse) => { - // if (!response.isSuccessful && response instanceof ErrorResponse) { - // this.notificationsService.error('Server Error:', response.errorMessage, new NotificationOptions(-1)); - // } else { - // return response; - // } - // }), - // map((response: any) => { - // if (isNotEmpty(response.resourceSelfLinks)) { - // return response.resourceSelfLinks[0]; - // } - // }), - // distinctUntilChanged() - // ) as Observable; - // - // return selfLink$.pipe( - // switchMap((selfLink: string) => this.findByHref(selfLink)), - // ) - // } + public createMetadataSchema(schema: MetadataSchema): Observable { + const requestId = this.requestService.generateRequestId(); + const endpoint$ = this.halService.getEndpoint(this.metadataSchemasPath).pipe( + isNotEmptyOperator(), + distinctUntilChanged() + ); + + const serializedSchema = new DSpaceRESTv2Serializer(NormalizedObjectFactory.getConstructor(ResourceType.MetadataSchema)).serialize(schema as NormalizedMetadataSchema); + + const request$ = endpoint$.pipe( + take(1), + map((endpoint: string) => new CreateMetadataSchemaRequest(requestId, endpoint, JSON.stringify(serializedSchema))) + ); + + // Execute the post request + request$.pipe( + configureRequest(this.requestService) + ).subscribe(); + + // Return newly created schema + return this.requestService.getByUUID(requestId).pipe( + getResponseFromEntry(), + map((response: MetadataschemaSuccessResponse) => { + if (isNotEmpty(response.metadataschema)) { + return response.metadataschema; + } + }) + ); + } } diff --git a/src/app/shared/form/form.component.ts b/src/app/shared/form/form.component.ts index b59d9969ce..a7561af9d2 100644 --- a/src/app/shared/form/form.component.ts +++ b/src/app/shared/form/form.component.ts @@ -79,7 +79,7 @@ export class FormComponent implements OnDestroy, OnInit { * An event fired when form is valid and submitted . * Event's payload equals to the form content. */ - @Output() submit: EventEmitter> = new EventEmitter>(); + @Output() submitForm: EventEmitter> = new EventEmitter>(); /** * An object of FormGroup type @@ -273,7 +273,7 @@ export class FormComponent implements OnDestroy, OnInit { */ onSubmit(): void { if (this.getFormGroupValidStatus()) { - this.submit.emit(this.formService.getFormData(this.formId)); + this.submitForm.emit(this.formService.getFormData(this.formId)); } else { this.formService.validateAllFormFields(this.formGroup); }