From 962bafcce2f4c4ee8701a696cb08d2656d089fba Mon Sep 17 00:00:00 2001 From: Samuel Date: Sat, 19 Jan 2019 20:53:15 +0100 Subject: [PATCH] taskid 58789 Metadata Registry UI Part 2 --- .../admin-registries.module.ts | 9 +- .../metadata-registry.actions.ts | 122 ++++++++++++++++++ .../metadata-registry.component.html | 105 +++++++-------- .../metadata-registry.component.ts | 57 ++++++-- .../metadata-registry.effects.ts | 0 .../metadata-registry.reducers.ts | 94 ++++++++++++++ .../metadata-schema-form.component.html | 18 +++ .../metadata-schema-form.component.spec.ts | 0 .../metadata-schema-form.component.ts | 112 ++++++++++++++++ .../metadata-field-form.component.html | 18 +++ .../metadata-field-form.component.spec.ts | 25 ++++ .../metadata-field-form.component.ts | 107 +++++++++++++++ .../metadata-registry.actions.ts | 47 ------- .../metadata-registry.reducers.ts | 36 ------ .../metadata-schema-form.component.html | 7 - .../metadata-schema-form.component.ts | 76 ----------- .../metadata-schema.component.html | 16 ++- .../metadata-schema.component.ts | 56 ++++++-- src/app/app.reducer.ts | 2 +- src/app/core/auth/authenticated.guard.ts | 4 +- .../cache/models/normalized-object-factory.ts | 7 + src/app/core/cache/response.models.ts | 24 ++-- src/app/core/core.module.ts | 2 - .../core/data/metadata-schema-data.service.ts | 46 +++++++ .../normalized-metadata-schema.model.ts | 21 +++ src/app/core/registry/registry.service.ts | 108 ++++++++++++++-- src/app/core/shared/resource-type.ts | 4 +- src/app/shared/form/form.component.ts | 18 ++- 28 files changed, 866 insertions(+), 275 deletions(-) create mode 100644 src/app/+admin/admin-registries/metadata-registry/metadata-registry.actions.ts rename src/app/+admin/admin-registries/{metadata-schema => metadata-registry}/metadata-registry.effects.ts (100%) create mode 100644 src/app/+admin/admin-registries/metadata-registry/metadata-registry.reducers.ts create mode 100644 src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.html rename src/app/+admin/admin-registries/{metadata-schema => metadata-registry}/metadata-schema-form/metadata-schema-form.component.spec.ts (100%) create mode 100644 src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts create mode 100644 src/app/+admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.html create mode 100644 src/app/+admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.spec.ts create mode 100644 src/app/+admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts delete mode 100644 src/app/+admin/admin-registries/metadata-schema/metadata-registry.actions.ts delete mode 100644 src/app/+admin/admin-registries/metadata-schema/metadata-registry.reducers.ts delete mode 100644 src/app/+admin/admin-registries/metadata-schema/metadata-schema-form/metadata-schema-form.component.html delete mode 100644 src/app/+admin/admin-registries/metadata-schema/metadata-schema-form/metadata-schema-form.component.ts create mode 100644 src/app/core/data/metadata-schema-data.service.ts create mode 100644 src/app/core/metadata/normalized-metadata-schema.model.ts diff --git a/src/app/+admin/admin-registries/admin-registries.module.ts b/src/app/+admin/admin-registries/admin-registries.module.ts index 3ac53017ed..18fc44f620 100644 --- a/src/app/+admin/admin-registries/admin-registries.module.ts +++ b/src/app/+admin/admin-registries/admin-registries.module.ts @@ -7,7 +7,8 @@ import { RouterModule } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { BitstreamFormatsComponent } from './bitstream-formats/bitstream-formats.component'; import { SharedModule } from '../../shared/shared.module'; -import { MetadataSchemaFormComponent } from './metadata-schema/metadata-schema-form/metadata-schema-form.component'; +import { MetadataSchemaFormComponent } from './metadata-registry/metadata-schema-form/metadata-schema-form.component'; +import {MetadataFieldFormComponent} from "./metadata-schema/metadata-field-form/metadata-field-form.component"; @NgModule({ imports: [ @@ -21,7 +22,11 @@ import { MetadataSchemaFormComponent } from './metadata-schema/metadata-schema-f MetadataRegistryComponent, MetadataSchemaComponent, BitstreamFormatsComponent, - MetadataSchemaFormComponent + MetadataSchemaFormComponent, + MetadataFieldFormComponent + ], + entryComponents: [ + ] }) export class AdminRegistriesModule { diff --git a/src/app/+admin/admin-registries/metadata-registry/metadata-registry.actions.ts b/src/app/+admin/admin-registries/metadata-registry/metadata-registry.actions.ts new file mode 100644 index 0000000000..23493c3d21 --- /dev/null +++ b/src/app/+admin/admin-registries/metadata-registry/metadata-registry.actions.ts @@ -0,0 +1,122 @@ +import {Action} from '@ngrx/store'; +import {type} from "../../../shared/ngrx/type"; +import {MetadataSchema} from "../../../core/metadata/metadataschema.model"; +import {MetadataField} from "../../../core/metadata/metadatafield.model"; + +/** + * For each action type in an action group, make a simple + * enum object for all of this group's action types. + * + * The 'type' utility function coerces strings into string + * literal types and runs a simple check to guarantee all + * action types in the application are unique. + */ +export const MetadataRegistryActionTypes = { + + EDIT_SCHEMA: type('dspace/metadata-registry/EDIT_SCHEMA'), + CANCEL_EDIT_SCHEMA: type('dspace/metadata-registry/CANCEL_SCHEMA'), + SELECT_SCHEMA: type('dspace/metadata-registry/SELECT_SCHEMA'), + DESELECT_SCHEMA: type('dspace/metadata-registry/DESELECT_SCHEMA'), + + EDIT_FIELD : type('dspace/metadata-registry/EDIT_FIELD'), + CANCEL_EDIT_FIELD : type('dspace/metadata-registry/CANCEL_FIELD'), + SELECT_FIELD : type('dspace/metadata-registry/SELECT_FIELD'), + DESELECT_FIELD : type('dspace/metadata-registry/DESELEC_FIELDT') +}; + +/* tslint:disable:max-classes-per-file */ +/** + * Used to collapse the sidebar + */ +export class MetadataRegistryEditSchemaAction implements Action { + type = MetadataRegistryActionTypes.EDIT_SCHEMA; + + schema: MetadataSchema; + + constructor(registry: MetadataSchema) { + this.schema = registry; + } +} + +/** + * Used to expand the sidebar + */ +export class MetadataRegistryCancelSchemaAction implements Action { + type = MetadataRegistryActionTypes.CANCEL_EDIT_SCHEMA; +} + +export class MetadataRegistrySelectSchemaAction implements Action { + type = MetadataRegistryActionTypes.SELECT_SCHEMA; + + schema: MetadataSchema; + + constructor(registry: MetadataSchema) { + this.schema = registry; + } +} + +export class MetadataRegistryDeselectSchemaAction implements Action { + type = MetadataRegistryActionTypes.DESELECT_SCHEMA; + + schema: MetadataSchema; + + constructor(registry: MetadataSchema) { + this.schema = registry; + } +} + +/** + * Used to collapse the sidebar + */ +export class MetadataRegistryEditFieldAction implements Action { + type = MetadataRegistryActionTypes.EDIT_FIELD; + + field: MetadataField; + + constructor(registry: MetadataField) { + this.field = registry; + } +} + +/** + * Used to expand the sidebar + */ +export class MetadataRegistryCancelFieldAction implements Action { + type = MetadataRegistryActionTypes.CANCEL_EDIT_FIELD; +} + +export class MetadataRegistrySelectFieldAction implements Action { + type = MetadataRegistryActionTypes.SELECT_FIELD; + + field: MetadataField; + + constructor(registry: MetadataField) { + this.field = registry; + } +} + +export class MetadataRegistryDeselectFieldAction implements Action { + type = MetadataRegistryActionTypes.DESELECT_FIELD; + + field: MetadataField; + + constructor(registry: MetadataField) { + this.field = registry; + } +} + +/* tslint:enable:max-classes-per-file */ + +/** + * Export a type alias of all actions in this action group + * so that reducers can easily compose action types + */ +export type MetadataRegistryAction + = MetadataRegistryEditSchemaAction + | MetadataRegistryCancelSchemaAction + | MetadataRegistrySelectSchemaAction + | MetadataRegistryDeselectSchemaAction + | MetadataRegistryEditFieldAction + | MetadataRegistryCancelFieldAction + | MetadataRegistrySelectFieldAction + | MetadataRegistryDeselectFieldAction; diff --git a/src/app/+admin/admin-registries/metadata-registry/metadata-registry.component.html b/src/app/+admin/admin-registries/metadata-registry/metadata-registry.component.html index af73bcf969..661c116a4e 100644 --- a/src/app/+admin/admin-registries/metadata-registry/metadata-registry.component.html +++ b/src/app/+admin/admin-registries/metadata-registry/metadata-registry.component.html @@ -1,60 +1,63 @@
- + + + 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 888c3013e7..4d73d58e32 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 @@ -1,13 +1,13 @@ -import { Component, OnInit } from '@angular/core'; -import { RegistryService } from '../../../core/registry/registry.service'; -import { ActivatedRoute } from '@angular/router'; -import { Observable } from 'rxjs'; -import { RemoteData } from '../../../core/data/remote-data'; -import { PaginatedList } from '../../../core/data/paginated-list'; -import { MetadataField } from '../../../core/metadata/metadatafield.model'; -import { MetadataSchema } from '../../../core/metadata/metadataschema.model'; -import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; -import { SortOptions } from '../../../core/cache/models/sort-options.model'; +import {Component, OnInit} from '@angular/core'; +import {RegistryService} from '../../../core/registry/registry.service'; +import {ActivatedRoute} from '@angular/router'; +import {Observable} from 'rxjs'; +import {RemoteData} from '../../../core/data/remote-data'; +import {PaginatedList} from '../../../core/data/paginated-list'; +import {MetadataField} from '../../../core/metadata/metadatafield.model'; +import {MetadataSchema} from '../../../core/metadata/metadataschema.model'; +import {PaginationComponentOptions} from '../../../shared/pagination/pagination-component-options.model'; +import {map} from "rxjs/operators"; @Component({ selector: 'ds-metadata-schema', @@ -53,4 +53,40 @@ export class MetadataSchemaComponent implements OnInit { }); } + editField(field: MetadataField) { + this.registryService.editMetadataField(field); + } + + isActive(field: MetadataField): Observable { + return this.getActiveField().pipe( + map(activeField => field === activeField) + ); + } + + getActiveField(): Observable { + return this.registryService.getActiveMetadataField(); + } + + selectMetadataField(field: MetadataField, event) { + event.target.checked ? + this.registryService.selectMetadataField(field) : + this.registryService.deselectMetadataField(field); + } + + isSelected(field: MetadataField): Observable { + return this.registryService.getSelectedMetadataFields().pipe( + map(fields => fields.find(selectedField => selectedField == field) != null) + ); + } + + deleteFields() { + this.registryService.getSelectedMetadataFields().subscribe( + fields => { + console.log("metadata fields to delete: "); + for (let field of fields) { + console.log(field); + } + } + ) + } } diff --git a/src/app/app.reducer.ts b/src/app/app.reducer.ts index 6208ae9bf1..f8931c2af0 100644 --- a/src/app/app.reducer.ts +++ b/src/app/app.reducer.ts @@ -17,7 +17,7 @@ import { truncatableReducer, TruncatablesState } from './shared/truncatable/trun import { metadataRegistryReducer, MetadataRegistryState -} from "./+admin/admin-registries/metadata-schema/metadata-registry.reducers"; +} from "./+admin/admin-registries/metadata-registry/metadata-registry.reducers"; export interface AppState { router: fromRouter.RouterReducerState; diff --git a/src/app/core/auth/authenticated.guard.ts b/src/app/core/auth/authenticated.guard.ts index b9091a86ad..49ada7e735 100644 --- a/src/app/core/auth/authenticated.guard.ts +++ b/src/app/core/auth/authenticated.guard.ts @@ -3,7 +3,7 @@ import {take} from 'rxjs/operators'; import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate, CanLoad, Route, Router, RouterStateSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; +import {Observable, of} from 'rxjs'; import { select, Store } from '@ngrx/store'; // reducers @@ -54,7 +54,7 @@ export class AuthenticatedGuard implements CanActivate, CanLoad { private handleAuth(url: string): Observable { // get observable - const observable = this.store.pipe(select(isAuthenticated)); + const observable = of(true); // redirect to sign in page if user is not authenticated observable.pipe( diff --git a/src/app/core/cache/models/normalized-object-factory.ts b/src/app/core/cache/models/normalized-object-factory.ts index 5c5ebf50aa..468a2b050d 100644 --- a/src/app/core/cache/models/normalized-object-factory.ts +++ b/src/app/core/cache/models/normalized-object-factory.ts @@ -10,6 +10,7 @@ import { NormalizedBitstreamFormat } from './normalized-bitstream-format.model'; import { NormalizedResourcePolicy } from './normalized-resource-policy.model'; import { NormalizedEPerson } from '../../eperson/models/normalized-eperson.model'; import { NormalizedGroup } from '../../eperson/models/normalized-group.model'; +import {NormalizedMetadataSchema} from "../../metadata/normalized-metadata-schema.model"; export class NormalizedObjectFactory { public static getConstructor(type: ResourceType): GenericConstructor { @@ -41,6 +42,12 @@ export class NormalizedObjectFactory { case ResourceType.Group: { return NormalizedGroup } + case ResourceType.MetadataSchema: { + return NormalizedMetadataSchema + } + case ResourceType.MetadataField: { + return NormalizedGroup + } default: { return undefined; } diff --git a/src/app/core/cache/response.models.ts b/src/app/core/cache/response.models.ts index 34fc22bb0a..168bbe6f4d 100644 --- a/src/app/core/cache/response.models.ts +++ b/src/app/core/cache/response.models.ts @@ -1,15 +1,15 @@ -import { SearchQueryResponse } from '../../+search-page/search-service/search-query-response.model'; -import { RequestError } from '../data/request.models'; -import { PageInfo } from '../shared/page-info.model'; -import { ConfigObject } from '../shared/config/config.model'; -import { FacetValue } from '../../+search-page/search-service/facet-value.model'; -import { SearchFilterConfig } from '../../+search-page/search-service/search-filter-config.model'; -import { IntegrationModel } from '../integration/models/integration.model'; -import { RegistryMetadataschemasResponse } from '../registry/registry-metadataschemas-response.model'; -import { MetadataSchema } from '../metadata/metadataschema.model'; -import { RegistryMetadatafieldsResponse } from '../registry/registry-metadatafields-response.model'; -import { RegistryBitstreamformatsResponse } from '../registry/registry-bitstreamformats-response.model'; -import { AuthStatus } from '../auth/models/auth-status.model'; +import {SearchQueryResponse} from '../../+search-page/search-service/search-query-response.model'; +import {RequestError} from '../data/request.models'; +import {PageInfo} from '../shared/page-info.model'; +import {ConfigObject} from '../shared/config/config.model'; +import {FacetValue} from '../../+search-page/search-service/facet-value.model'; +import {SearchFilterConfig} from '../../+search-page/search-service/search-filter-config.model'; +import {IntegrationModel} from '../integration/models/integration.model'; +import {RegistryMetadataschemasResponse} from '../registry/registry-metadataschemas-response.model'; +import {RegistryMetadatafieldsResponse} from '../registry/registry-metadatafields-response.model'; +import {RegistryBitstreamformatsResponse} from '../registry/registry-bitstreamformats-response.model'; +import {AuthStatus} from '../auth/models/auth-status.model'; +import {MetadataSchema} from "../metadata/metadataschema.model"; /* tslint:disable:max-classes-per-file */ export class RestResponse { diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index dcbdbd0049..65484d68aa 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -56,7 +56,6 @@ import { FacetValueMapResponseParsingService } from './data/facet-value-map-resp import { FacetConfigResponseParsingService } from './data/facet-config-response-parsing.service'; import { RegistryService } from './registry/registry.service'; import { RegistryMetadataschemasResponseParsingService } from './data/registry-metadataschemas-response-parsing.service'; -import { MetadataschemaParsingService } from './data/metadataschema-parsing.service'; import { RegistryMetadatafieldsResponseParsingService } from './data/registry-metadatafields-response-parsing.service'; import { RegistryBitstreamformatsResponseParsingService } from './data/registry-bitstreamformats-response-parsing.service'; import { NotificationsService } from '../shared/notifications/notifications.service'; @@ -108,7 +107,6 @@ const PROVIDERS = [ RegistryMetadataschemasResponseParsingService, RegistryMetadatafieldsResponseParsingService, RegistryBitstreamformatsResponseParsingService, - MetadataschemaParsingService, DebugResponseParsingService, SearchResponseParsingService, ServerResponseService, diff --git a/src/app/core/data/metadata-schema-data.service.ts b/src/app/core/data/metadata-schema-data.service.ts new file mode 100644 index 0000000000..c25e4cc789 --- /dev/null +++ b/src/app/core/data/metadata-schema-data.service.ts @@ -0,0 +1,46 @@ +import {distinctUntilChanged, filter, map, tap} from 'rxjs/operators'; +import {Injectable} from '@angular/core'; +import {Store} from '@ngrx/store'; +import {Observable} from 'rxjs'; +import {isNotEmpty} from '../../shared/empty.util'; +import {BrowseService} from '../browse/browse.service'; +import {RemoteDataBuildService} from '../cache/builders/remote-data-build.service'; +import {CoreState} from '../core.reducers'; +import {URLCombiner} from '../url-combiner/url-combiner'; + +import {DataService} from './data.service'; +import {RequestService} from './request.service'; +import {HALEndpointService} from '../shared/hal-endpoint.service'; +import {FindAllOptions, GetRequest, RestRequest} from './request.models'; +import {ObjectCacheService} from '../cache/object-cache.service'; +import {MetadataSchema} from "../metadata/metadataschema.model"; +import {NormalizedMetadataSchema} from "../metadata/normalized-metadata-schema.model"; +import {GenericConstructor} from "../shared/generic-constructor"; +import {ResponseParsingService} from "./parsing.service"; +import {RegistryMetadatafieldsResponseParsingService} from "./registry-metadatafields-response-parsing.service"; + +@Injectable() +export class MetadataSchemaDataService extends DataService { + protected linkPath = 'metadataschemas'; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + private bs: BrowseService, + protected halService: HALEndpointService, + protected objectCache: ObjectCacheService) { + super(); + } + + /** + * Get the endpoint for browsing metadataschemas + * @param {FindAllOptions} options + * @returns {Observable} + */ + public getBrowseEndpoint(options: FindAllOptions = {}, linkPath: string = this.linkPath): Observable { + + return null; + } + +} diff --git a/src/app/core/metadata/normalized-metadata-schema.model.ts b/src/app/core/metadata/normalized-metadata-schema.model.ts new file mode 100644 index 0000000000..73a64bc1ab --- /dev/null +++ b/src/app/core/metadata/normalized-metadata-schema.model.ts @@ -0,0 +1,21 @@ +import {autoserialize} from 'cerialize'; +import {NormalizedObject} from "../cache/models/normalized-object.model"; +import {mapsTo} from "../cache/builders/build-decorators"; +import {CacheableObject} from "../cache/object-cache.reducer"; +import {ListableObject} from "../../shared/object-collection/shared/listable-object.model"; +import {MetadataSchema} from "./metadataschema.model"; + +@mapsTo(MetadataSchema) +export class NormalizedMetadataSchema extends NormalizedObject implements CacheableObject, ListableObject { + @autoserialize + id: number; + + @autoserialize + self: string; + + @autoserialize + prefix: string; + + @autoserialize + namespace: string; +} diff --git a/src/app/core/registry/registry.service.ts b/src/app/core/registry/registry.service.ts index c371471e76..d6c646a5f5 100644 --- a/src/app/core/registry/registry.service.ts +++ b/src/app/core/registry/registry.service.ts @@ -6,7 +6,6 @@ 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 {flatMap, map, tap} from 'rxjs/operators'; import {GetRequest, RestRequest} from '../data/request.models'; import {GenericConstructor} from '../shared/generic-constructor'; import {ResponseParsingService} from '../data/parsing.service'; @@ -30,11 +29,24 @@ import {RegistryBitstreamformatsResponse} from './registry-bitstreamformats-resp import {getResponseFromEntry} from '../shared/operators'; import {createSelector, select, Store} from "@ngrx/store"; import {AppState} from "../../app.reducer"; -import {MetadataRegistryState} from "../../+admin/admin-registries/metadata-schema/metadata-registry.reducers"; -import {MetadataRegistrySelectAction} from "../../+admin/admin-registries/metadata-schema/metadata-registry.actions"; +import {MetadataRegistryState} from "../../+admin/admin-registries/metadata-registry/metadata-registry.reducers"; +import { + MetadataRegistryCancelFieldAction, + MetadataRegistryCancelSchemaAction, + MetadataRegistryDeselectFieldAction, + MetadataRegistryDeselectSchemaAction, + MetadataRegistryEditFieldAction, + MetadataRegistryEditSchemaAction, + MetadataRegistrySelectFieldAction, + MetadataRegistrySelectSchemaAction +} from "../../+admin/admin-registries/metadata-registry/metadata-registry.actions"; +import {flatMap, map, tap} from "rxjs/operators"; const metadataRegistryStateSelector = (state: AppState) => state.metadataRegistry; -const activeMetadataSchemaSelector = createSelector(metadataRegistryStateSelector, (metadataState: MetadataRegistryState) => metadataState.schema); +const editMetadataSchemaSelector = createSelector(metadataRegistryStateSelector, (metadataState: MetadataRegistryState) => metadataState.editSchema); +const selectedMetadataSchemasSelector = createSelector(metadataRegistryStateSelector, (metadataState: MetadataRegistryState) => metadataState.selectedSchemas); +const editMetadataFieldSelector = createSelector(metadataRegistryStateSelector, (metadataState: MetadataRegistryState) => metadataState.editField); +const selectedMetadataFieldsSelector = createSelector(metadataRegistryStateSelector, (metadataState: MetadataRegistryState) => metadataState.selectedFields); @Injectable() export class RegistryService { @@ -166,7 +178,7 @@ export class RegistryService { return this.rdb.toRemoteDataObservable(requestEntryObs, payloadObs); } - private getMetadataSchemasRequestObs(pagination: PaginationComponentOptions): Observable { + public getMetadataSchemasRequestObs(pagination: PaginationComponentOptions): Observable { return this.halService.getEndpoint(this.metadataSchemasPath).pipe( map((url: string) => { const args: string[] = []; @@ -229,14 +241,92 @@ export class RegistryService { } public editMetadataSchema(schema: MetadataSchema) { - this.store.dispatch(new MetadataRegistrySelectAction(schema)); + this.store.dispatch(new MetadataRegistryEditSchemaAction(schema)); } - public getActiveMetadataSchema(schema: MetadataSchema): Observable { - return this.store.pipe(select(activeMetadataSchemaSelector)); + public cancelEditMetadataSchema() { + this.store.dispatch(new MetadataRegistryCancelSchemaAction()); } - // public createMetadataSchema(schema: MetadataSchema): MetadataSchema { + public getActiveMetadataSchema(): Observable { + return this.store.pipe(select(editMetadataSchemaSelector)); + } + + public selectMetadataSchema(schema: MetadataSchema) { + this.store.dispatch(new MetadataRegistrySelectSchemaAction(schema)) + } + + public deselectMetadataSchema(schema: MetadataSchema) { + this.store.dispatch(new MetadataRegistryDeselectSchemaAction(schema)) + } + + public getSelectedMetadataSchemas(): Observable { + return this.store.pipe(select(selectedMetadataSchemasSelector)); + } + + public editMetadataField(field: MetadataField) { + this.store.dispatch(new MetadataRegistryEditFieldAction(field)); + } + + public cancelEditMetadataField() { + this.store.dispatch(new MetadataRegistryCancelFieldAction()); + } + + public getActiveMetadataField(): Observable { + return this.store.pipe(select(editMetadataFieldSelector)); + } + + public selectMetadataField(field: MetadataField) { + this.store.dispatch(new MetadataRegistrySelectFieldAction(field)) + } + + public deselectMetadataField(field: MetadataField) { + this.store.dispatch(new MetadataRegistryDeselectFieldAction(field)) + } + + public getSelectedMetadataFields(): Observable { + 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)), + // ) // } } diff --git a/src/app/core/shared/resource-type.ts b/src/app/core/shared/resource-type.ts index e67f3339de..88ffa3386e 100644 --- a/src/app/core/shared/resource-type.ts +++ b/src/app/core/shared/resource-type.ts @@ -8,5 +8,7 @@ export enum ResourceType { Community = 'community', EPerson = 'eperson', Group = 'group', - ResourcePolicy = 'resourcePolicy' + ResourcePolicy = 'resourcePolicy', + MetadataSchema = 'metadataschema', + MetadataField = 'metadatafield' } diff --git a/src/app/shared/form/form.component.ts b/src/app/shared/form/form.component.ts index 2d74ddf8d4..b59d9969ce 100644 --- a/src/app/shared/form/form.component.ts +++ b/src/app/shared/form/form.component.ts @@ -69,6 +69,12 @@ export class FormComponent implements OnDestroy, OnInit { @Output() addArrayItem: EventEmitter = new EventEmitter(); @Output() removeArrayItem: EventEmitter = new EventEmitter(); + /** + * An event fired when form is valid and submitted . + * Event's payload equals to the form content. + */ + @Output() cancel: EventEmitter> = new EventEmitter>(); + /** * An event fired when form is valid and submitted . * Event's payload equals to the form content. @@ -130,7 +136,9 @@ export class FormComponent implements OnDestroy, OnInit { } else { this.formModel.forEach((model) => { - this.formBuilderService.addFormGroupControl(this.formGroup, this.parentFormModel, model); + if (this.parentFormModel) { + this.formBuilderService.addFormGroupControl(this.formGroup, this.parentFormModel, model); + } }); } @@ -229,9 +237,10 @@ export class FormComponent implements OnDestroy, OnInit { private keepSync(): void { this.subs.push(this.formService.getFormData(this.formId) .subscribe((stateFormData) => { - if (!Object.is(stateFormData, this.formGroup.value) && this.formGroup) { - this.formGroup.setValue(stateFormData); - } + // if (!Object.is(stateFormData, this.formGroup.value) && this.formGroup) { + // this.formGroup.setValue(stateFormData); + console.log(stateFormData); + // } })); } @@ -275,6 +284,7 @@ export class FormComponent implements OnDestroy, OnInit { */ reset(): void { this.formGroup.reset(); + this.cancel.emit(); } isItemReadOnly(arrayContext: DynamicFormArrayModel, index: number): boolean {