From 0d70faffaed8fde881bc0874ad0c00eecd297e0a Mon Sep 17 00:00:00 2001 From: Kristof De Langhe <kristof.delanghe@atmire.com> Date: Wed, 4 Apr 2018 13:03:15 +0200 Subject: [PATCH] 50632: Replaced mock registry service with implementation and added pagination --- .../admin-registries.module.ts | 2 + .../bitstream-formats.component.html | 45 +++-- .../bitstream-formats.component.ts | 18 +- .../metadata-registry.component.html | 45 +++-- .../metadata-registry.component.ts | 16 +- .../metadata-schema.component.html | 41 ++-- .../metadata-schema.component.ts | 23 ++- src/app/core/cache/response-cache.models.ts | 22 +++ src/app/core/core.module.ts | 4 + ...tstreamformats-response-parsing.service.ts | 25 +++ ...metadatafields-response-parsing.service.ts | 34 ++++ src/app/core/metadata/metadatafield.model.ts | 15 +- ...egistry-bitstreamformats-response.model.ts | 14 ++ .../registry-metadatafields-response.model.ts | 14 ++ src/app/core/registry/registry.service.ts | 183 ++++++++++++++---- .../shared/pagination/pagination.component.ts | 6 +- 16 files changed, 402 insertions(+), 105 deletions(-) create mode 100644 src/app/core/data/registry-bitstreamformats-response-parsing.service.ts create mode 100644 src/app/core/data/registry-metadatafields-response-parsing.service.ts create mode 100644 src/app/core/registry/registry-bitstreamformats-response.model.ts create mode 100644 src/app/core/registry/registry-metadatafields-response.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 fb9dcdaa63..8ff42646ac 100644 --- a/src/app/+admin/admin-registries/admin-registries.module.ts +++ b/src/app/+admin/admin-registries/admin-registries.module.ts @@ -6,10 +6,12 @@ import { MetadataSchemaComponent } from './metadata-schema/metadata-schema.compo 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'; @NgModule({ imports: [ CommonModule, + SharedModule, RouterModule, TranslateModule, AdminRegistriesRoutingModule diff --git a/src/app/+admin/admin-registries/bitstream-formats/bitstream-formats.component.html b/src/app/+admin/admin-registries/bitstream-formats/bitstream-formats.component.html index 87b3ba85eb..f3d6e47331 100644 --- a/src/app/+admin/admin-registries/bitstream-formats/bitstream-formats.component.html +++ b/src/app/+admin/admin-registries/bitstream-formats/bitstream-formats.component.html @@ -6,24 +6,33 @@ <p id="description" class="pb-2">{{'admin.registries.bitstream-formats.description' | translate}}</p> - <div class="table-responsive"> - <table id="formats" class="table table-striped table-hover"> - <thead> - <tr> - <th scope="col">{{'admin.registries.bitstream-formats.formats.table.name' | translate}}</th> - <th scope="col">{{'admin.registries.bitstream-formats.formats.table.mimetype' | translate}}</th> - <th scope="col">{{'admin.registries.bitstream-formats.formats.table.supportLevel.head' | translate}}</th> - </tr> - </thead> - <tbody> - <tr *ngFor="let bitstreamFormat of (bitstreamFormats | async)?.payload?.page"> - <td>{{bitstreamFormat.shortDescription}}</td> - <td>{{bitstreamFormat.mimetype}} <span *ngIf="bitstreamFormat.internal">({{'admin.registries.bitstream-formats.formats.table.internal' | translate}})</span></td> - <td>{{'admin.registries.bitstream-formats.formats.table.supportLevel.'+bitstreamFormat.supportLevel | translate}}</td> - </tr> - </tbody> - </table> - </div> + <ds-pagination + *ngIf="(bitstreamFormats | async)?.payload" + [paginationOptions]="config" + [pageInfoState]="(bitstreamFormats | async)?.payload" + [collectionSize]="(bitstreamFormats | async)?.payload?.totalElements" + [hideGear]="true" + [hidePagerWhenSinglePage]="false" + (pageChange)="onPageChange($event)"> + <div class="table-responsive"> + <table id="formats" class="table table-striped table-hover"> + <thead> + <tr> + <th scope="col">{{'admin.registries.bitstream-formats.formats.table.name' | translate}}</th> + <th scope="col">{{'admin.registries.bitstream-formats.formats.table.mimetype' | translate}}</th> + <th scope="col">{{'admin.registries.bitstream-formats.formats.table.supportLevel.head' | translate}}</th> + </tr> + </thead> + <tbody> + <tr *ngFor="let bitstreamFormat of (bitstreamFormats | async)?.payload?.page"> + <td>{{bitstreamFormat.shortDescription}}</td> + <td>{{bitstreamFormat.mimetype}} <span *ngIf="bitstreamFormat.internal">({{'admin.registries.bitstream-formats.formats.table.internal' | translate}})</span></td> + <td>{{'admin.registries.bitstream-formats.formats.table.supportLevel.'+bitstreamFormat.supportLevel | translate}}</td> + </tr> + </tbody> + </table> + </div> + </ds-pagination> </div> </div> diff --git a/src/app/+admin/admin-registries/bitstream-formats/bitstream-formats.component.ts b/src/app/+admin/admin-registries/bitstream-formats/bitstream-formats.component.ts index d64b48d4c5..d54d2c5e96 100644 --- a/src/app/+admin/admin-registries/bitstream-formats/bitstream-formats.component.ts +++ b/src/app/+admin/admin-registries/bitstream-formats/bitstream-formats.component.ts @@ -4,6 +4,7 @@ import { Observable } from 'rxjs/Observable'; import { RemoteData } from '../../../core/data/remote-data'; import { PaginatedList } from '../../../core/data/paginated-list'; import { BitstreamFormat } from '../../../core/registry/mock-bitstream-format.model'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; @Component({ selector: 'ds-bitstream-formats', @@ -12,8 +13,21 @@ import { BitstreamFormat } from '../../../core/registry/mock-bitstream-format.mo export class BitstreamFormatsComponent { bitstreamFormats: Observable<RemoteData<PaginatedList<BitstreamFormat>>>; + config: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'registry-bitstreamformats-pagination', + pageSize: 20 + }); - constructor(registryService: RegistryService) { - this.bitstreamFormats = registryService.getBitstreamFormats(); + constructor(private registryService: RegistryService) { + this.updateFormats(); + } + + onPageChange(event) { + this.config.currentPage = event; + this.updateFormats(); + } + + private updateFormats() { + this.bitstreamFormats = this.registryService.getBitstreamFormats(this.config); } } 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 27f761581c..67cfa52601 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 @@ -6,24 +6,33 @@ <p id="description" class="pb-2">{{'admin.registries.metadata.description' | translate}}</p> - <div class="table-responsive"> - <table id="metadata-schemas" class="table table-striped table-hover"> - <thead> - <tr> - <th scope="col">{{'admin.registries.metadata.schemas.table.id' | translate}}</th> - <th scope="col">{{'admin.registries.metadata.schemas.table.namespace' | translate}}</th> - <th scope="col">{{'admin.registries.metadata.schemas.table.name' | translate}}</th> - </tr> - </thead> - <tbody> - <tr *ngFor="let schema of (metadataSchemas | async)?.payload?.page"> - <td><a [routerLink]="[schema.prefix]">{{schema.id}}</a></td> - <td><a [routerLink]="[schema.prefix]">{{schema.namespace}}</a></td> - <td><a [routerLink]="[schema.prefix]">{{schema.prefix}}</a></td> - </tr> - </tbody> - </table> - </div> + <ds-pagination + *ngIf="(metadataSchemas | async)?.payload" + [paginationOptions]="config" + [pageInfoState]="(metadataSchemas | async)?.payload" + [collectionSize]="(metadataSchemas | async)?.payload?.totalElements" + [hideGear]="true" + [hidePagerWhenSinglePage]="false" + (pageChange)="onPageChange($event)"> + <div class="table-responsive"> + <table id="metadata-schemas" class="table table-striped table-hover"> + <thead> + <tr> + <th scope="col">{{'admin.registries.metadata.schemas.table.id' | translate}}</th> + <th scope="col">{{'admin.registries.metadata.schemas.table.namespace' | translate}}</th> + <th scope="col">{{'admin.registries.metadata.schemas.table.name' | translate}}</th> + </tr> + </thead> + <tbody> + <tr *ngFor="let schema of (metadataSchemas | async)?.payload?.page"> + <td><a [routerLink]="[schema.prefix]">{{schema.id}}</a></td> + <td><a [routerLink]="[schema.prefix]">{{schema.namespace}}</a></td> + <td><a [routerLink]="[schema.prefix]">{{schema.prefix}}</a></td> + </tr> + </tbody> + </table> + </div> + </ds-pagination> </div> </div> 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 3158c4bb46..2baed2ef6e 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,6 +4,7 @@ import { Observable } from 'rxjs/Observable'; import { RemoteData } from '../../../core/data/remote-data'; import { PaginatedList } from '../../../core/data/paginated-list'; import { MetadataSchema } from '../../../core/metadata/metadataschema.model'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; @Component({ selector: 'ds-metadata-registry', @@ -12,9 +13,22 @@ import { MetadataSchema } from '../../../core/metadata/metadataschema.model'; export class MetadataRegistryComponent { metadataSchemas: Observable<RemoteData<PaginatedList<MetadataSchema>>>; + config: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'registry-metadataschemas-pagination', + pageSize: 10 + }); constructor(private registryService: RegistryService) { - this.metadataSchemas = this.registryService.getMetadataSchemas(); + this.updateSchemas(); + } + + onPageChange(event) { + this.config.currentPage = event; + this.updateSchemas(); + } + + private updateSchemas() { + this.metadataSchemas = this.registryService.getMetadataSchemas(this.config); } } 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 f07a6cc670..f9e460e717 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 @@ -7,22 +7,31 @@ <p id="description" class="pb-2">{{'admin.registries.schema.description' | translate:namespace }}</p> <h3>{{'admin.registries.schema.fields.head' | translate}}</h3> - <div class="table-responsive"> - <table id="metadata-fields" class="table table-striped table-hover"> - <thead> - <tr> - <th scope="col">{{'admin.registries.schema.fields.table.field' | translate}}</th> - <th scope="col">{{'admin.registries.schema.fields.table.scopenote' | translate}}</th> - </tr> - </thead> - <tbody> - <tr *ngFor="let field of (metadataFields | async)?.payload?.page"> - <td>{{(metadataSchema | async)?.payload?.prefix}}.{{field.element}}<label *ngIf="field.qualifier">.</label>{{field.qualifier}}</td> - <td>{{field.scopenote}}</td> - </tr> - </tbody> - </table> - </div> + <ds-pagination + *ngIf="(metadataFields | async)?.payload" + [paginationOptions]="config" + [pageInfoState]="(metadataFields | async)?.payload" + [collectionSize]="(metadataFields | async)?.payload?.totalElements" + [hideGear]="true" + [hidePagerWhenSinglePage]="false" + (pageChange)="onPageChange($event)"> + <div class="table-responsive"> + <table id="metadata-fields" class="table table-striped table-hover"> + <thead> + <tr> + <th scope="col">{{'admin.registries.schema.fields.table.field' | translate}}</th> + <th scope="col">{{'admin.registries.schema.fields.table.scopenote' | translate}}</th> + </tr> + </thead> + <tbody> + <tr *ngFor="let field of (metadataFields | async)?.payload?.page"> + <td>{{(metadataSchema | async)?.payload?.prefix}}.{{field.element}}<label *ngIf="field.qualifier">.</label>{{field.qualifier}}</td> + <td>{{field.scopeNote}}</td> + </tr> + </tbody> + </table> + </div> + </ds-pagination> </div> </div> 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 7e6085a091..6b0e4b16c6 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 @@ -6,6 +6,8 @@ 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'; @Component({ selector: 'ds-metadata-schema', @@ -17,6 +19,10 @@ export class MetadataSchemaComponent implements OnInit { metadataSchema: Observable<RemoteData<MetadataSchema>>; metadataFields: Observable<RemoteData<PaginatedList<MetadataField>>>; + config: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'registry-metadatafields-pagination', + pageSize: 20 + }); constructor(private registryService: RegistryService, private route: ActivatedRoute) { @@ -30,10 +36,19 @@ export class MetadataSchemaComponent implements OnInit { initialize(params) { this.metadataSchema = this.registryService.getMetadataSchemaByName(params.schemaName); - this.metadataSchema.subscribe((value) => { - const schema = value.payload; - // this.metadataFields = this.registryService.getMetadataFieldsBySchema(schema); - this.namespace = { namespace: value.payload.namespace }; + this.updateFields(); + } + + onPageChange(event) { + this.config.currentPage = event; + this.updateFields(); + } + + private updateFields() { + this.metadataSchema.subscribe((schemaData) => { + const schema = schemaData.payload; + this.metadataFields = this.registryService.getMetadataFieldsBySchema(schema, this.config); + this.namespace = { namespace: schemaData.payload.namespace }; }); } diff --git a/src/app/core/cache/response-cache.models.ts b/src/app/core/cache/response-cache.models.ts index 94c0ccc58c..13987cdf4a 100644 --- a/src/app/core/cache/response-cache.models.ts +++ b/src/app/core/cache/response-cache.models.ts @@ -7,6 +7,8 @@ import { FacetValue } from '../../+search-page/search-service/facet-value.model' import { SearchFilterConfig } from '../../+search-page/search-service/search-filter-config.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'; /* tslint:disable:max-classes-per-file */ export class RestResponse { @@ -36,6 +38,26 @@ export class RegistryMetadataschemasSuccessResponse extends RestResponse { } } +export class RegistryMetadatafieldsSuccessResponse extends RestResponse { + constructor( + public metadatafieldsResponse: RegistryMetadatafieldsResponse, + public statusCode: string, + public pageInfo?: PageInfo + ) { + super(true, statusCode); + } +} + +export class RegistryBitstreamformatsSuccessResponse extends RestResponse { + constructor( + public bitstreamformatsResponse: RegistryBitstreamformatsResponse, + public statusCode: string, + public pageInfo?: PageInfo + ) { + super(true, statusCode); + } +} + export class MetadataschemaSuccessResponse extends RestResponse { constructor( public metadataschema: MetadataSchema, diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 82307921ef..4e99bcdeeb 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -47,6 +47,8 @@ import { FacetConfigResponseParsingService } from './data/facet-config-response- 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'; const IMPORTS = [ CommonModule, @@ -83,6 +85,8 @@ const PROVIDERS = [ FacetValueMapResponseParsingService, FacetConfigResponseParsingService, RegistryMetadataschemasResponseParsingService, + RegistryMetadatafieldsResponseParsingService, + RegistryBitstreamformatsResponseParsingService, MetadataschemaParsingService, DebugResponseParsingService, SearchResponseParsingService, diff --git a/src/app/core/data/registry-bitstreamformats-response-parsing.service.ts b/src/app/core/data/registry-bitstreamformats-response-parsing.service.ts new file mode 100644 index 0000000000..d981a12719 --- /dev/null +++ b/src/app/core/data/registry-bitstreamformats-response-parsing.service.ts @@ -0,0 +1,25 @@ +import { RegistryBitstreamformatsSuccessResponse, RestResponse } from '../cache/response-cache.models'; +import { RegistryBitstreamformatsResponse } from '../registry/registry-bitstreamformats-response.model'; +import { DSpaceRESTv2Serializer } from '../dspace-rest-v2/dspace-rest-v2.serializer'; +import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model'; +import { RestRequest } from './request.models'; +import { DSOResponseParsingService } from './dso-response-parsing.service'; +import { ResponseParsingService } from './parsing.service'; +import { Injectable } from '@angular/core'; + +@Injectable() +export class RegistryBitstreamformatsResponseParsingService implements ResponseParsingService { + constructor(private dsoParser: DSOResponseParsingService) { + } + + parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { + const payload = data.payload; + + const bitstreamformats = payload._embedded.bitstreamformats; + payload.bitstreamformats = bitstreamformats; + + const deserialized = new DSpaceRESTv2Serializer(RegistryBitstreamformatsResponse).deserialize(payload); + return new RegistryBitstreamformatsSuccessResponse(deserialized, data.statusCode, this.dsoParser.processPageInfo(data.payload.page)); + } + +} diff --git a/src/app/core/data/registry-metadatafields-response-parsing.service.ts b/src/app/core/data/registry-metadatafields-response-parsing.service.ts new file mode 100644 index 0000000000..2620916070 --- /dev/null +++ b/src/app/core/data/registry-metadatafields-response-parsing.service.ts @@ -0,0 +1,34 @@ +import { + RegistryMetadatafieldsSuccessResponse, RegistryMetadataschemasSuccessResponse, + RestResponse +} from '../cache/response-cache.models'; +import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model'; +import { RestRequest } from './request.models'; +import { ResponseParsingService } from './parsing.service'; +import { RegistryMetadataschemasResponse } from '../registry/registry-metadataschemas-response.model'; +import { DSpaceRESTv2Serializer } from '../dspace-rest-v2/dspace-rest-v2.serializer'; +import { DSOResponseParsingService } from './dso-response-parsing.service'; +import { Injectable } from '@angular/core'; +import { forEach } from '@angular/router/src/utils/collection'; +import { RegistryMetadatafieldsResponse } from '../registry/registry-metadatafields-response.model'; + +@Injectable() +export class RegistryMetadatafieldsResponseParsingService implements ResponseParsingService { + constructor(private dsoParser: DSOResponseParsingService) { + } + + parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { + const payload = data.payload; + + const metadatafields = payload._embedded.metadatafields; + metadatafields.forEach((field) => { + field.schema = field._embedded.schema; + }); + + payload.metadatafields = metadatafields; + + const deserialized = new DSpaceRESTv2Serializer(RegistryMetadatafieldsResponse).deserialize(payload); + return new RegistryMetadatafieldsSuccessResponse(deserialized, data.statusCode, this.dsoParser.processPageInfo(data.payload.page)); + } + +} diff --git a/src/app/core/metadata/metadatafield.model.ts b/src/app/core/metadata/metadatafield.model.ts index bf9921a1ce..77cecb927e 100644 --- a/src/app/core/metadata/metadatafield.model.ts +++ b/src/app/core/metadata/metadatafield.model.ts @@ -1,9 +1,20 @@ import { MetadataSchema } from './metadataschema.model'; +import { autoserialize } from 'cerialize'; +import { ListableObject } from '../../shared/object-collection/shared/listable-object.model'; -export class MetadataField { +export class MetadataField implements ListableObject { + @autoserialize self: string; + + @autoserialize element: string; + + @autoserialize qualifier: string; - scopenote: string; + + @autoserialize + scopeNote: string; + + @autoserialize schema: MetadataSchema; } diff --git a/src/app/core/registry/registry-bitstreamformats-response.model.ts b/src/app/core/registry/registry-bitstreamformats-response.model.ts new file mode 100644 index 0000000000..81de379e9e --- /dev/null +++ b/src/app/core/registry/registry-bitstreamformats-response.model.ts @@ -0,0 +1,14 @@ +import { autoserialize, autoserializeAs } from 'cerialize'; +import { PageInfo } from '../shared/page-info.model'; +import { BitstreamFormat } from '../shared/bitstream-format.model'; + +export class RegistryBitstreamformatsResponse { + @autoserializeAs(BitstreamFormat) + bitstreamformats: BitstreamFormat[]; + + @autoserialize + page: PageInfo; + + @autoserialize + self: string; +} diff --git a/src/app/core/registry/registry-metadatafields-response.model.ts b/src/app/core/registry/registry-metadatafields-response.model.ts new file mode 100644 index 0000000000..19ec537dfb --- /dev/null +++ b/src/app/core/registry/registry-metadatafields-response.model.ts @@ -0,0 +1,14 @@ +import { PageInfo } from '../shared/page-info.model'; +import { autoserialize, autoserializeAs } from 'cerialize'; +import { MetadataField } from '../metadata/metadatafield.model'; + +export class RegistryMetadatafieldsResponse { + @autoserializeAs(MetadataField) + metadatafields: MetadataField[]; + + @autoserialize + page: PageInfo; + + @autoserialize + self: string; +} diff --git a/src/app/core/registry/registry.service.ts b/src/app/core/registry/registry.service.ts index 0c9ece4a71..4359284158 100644 --- a/src/app/core/registry/registry.service.ts +++ b/src/app/core/registry/registry.service.ts @@ -16,18 +16,27 @@ import { RequestService } from '../data/request.service'; import { ResponseCacheService } from '../cache/response-cache.service'; import { RegistryMetadataschemasResponse } from './registry-metadataschemas-response.model'; import { ResponseCacheEntry } from '../cache/response-cache.reducer'; -import { MetadataschemaSuccessResponse, RegistryMetadataschemasSuccessResponse } from '../cache/response-cache.models'; +import { + MetadataschemaSuccessResponse, RegistryBitstreamformatsSuccessResponse, RegistryMetadatafieldsSuccessResponse, + RegistryMetadataschemasSuccessResponse +} from '../cache/response-cache.models'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { MetadataschemaParsingService } from '../data/metadataschema-parsing.service'; +import { Res } from 'awesome-typescript-loader/dist/checker/protocol'; +import { RegistryMetadatafieldsResponseParsingService } from '../data/registry-metadatafields-response-parsing.service'; +import { RegistryMetadatafieldsResponse } from './registry-metadatafields-response.model'; +import { isNotEmpty } 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'; @Injectable() export class RegistryService { private metadataSchemasPath = 'metadataschemas'; - - metadataSchemas: MetadataSchema[]; - metadataFields: MetadataField[]; - bitstreamFormats: BitstreamFormat[]; + private metadataFieldsPath = 'metadatafields'; + private bitstreamFormatsPath = 'bitstreamformats'; constructor(protected responseCache: ResponseCacheService, protected requestService: RequestService, @@ -36,18 +45,8 @@ export class RegistryService { } - public getMetadataSchemas(): Observable<RemoteData<PaginatedList<MetadataSchema>>> { - const requestObs = this.halService.getEndpoint(this.metadataSchemasPath).pipe( - map((url: string) => { - const request = new GetRequest(this.requestService.generateRequestId(), url); - return Object.assign(request, { - getResponseParser(): GenericConstructor<ResponseParsingService> { - return RegistryMetadataschemasResponseParsingService; - } - }); - }), - tap((request: RestRequest) => this.requestService.configure(request)), - ); + public getMetadataSchemas(pagination: PaginationComponentOptions): Observable<RemoteData<PaginatedList<MetadataSchema>>> { + const requestObs = this.getMetadataSchemasRequestObs(pagination); const requestEntryObs = requestObs.pipe( flatMap((request: RestRequest) => this.requestService.getByHref(request.href)) @@ -79,17 +78,12 @@ export class RegistryService { } public getMetadataSchemaByName(schemaName: string): Observable<RemoteData<MetadataSchema>> { - const requestObs = this.halService.getEndpoint(this.metadataSchemasPath).pipe( - map((url: string) => { - const request = new GetRequest(this.requestService.generateRequestId(), url); - return Object.assign(request, { - getResponseParser(): GenericConstructor<ResponseParsingService> { - return RegistryMetadataschemasResponseParsingService; - } - }); - }), - tap((request: RestRequest) => this.requestService.configure(request)), - ); + // Temporary pagination to get ALL metadataschemas until there's a rest api endpoint for fetching a specific schema + const pagination: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'all-metadatafields-pagination', + pageSize: 10000 + }); + const requestObs = this.getMetadataSchemasRequestObs(pagination); const requestEntryObs = requestObs.pipe( flatMap((request: RestRequest) => this.requestService.getByHref(request.href)) @@ -112,24 +106,129 @@ export class RegistryService { return this.rdb.toRemoteDataObservable(requestEntryObs, responseCacheObs, metadataschemaObs); } - public getMetadataFieldsBySchema(schema: MetadataSchema): Observable<RemoteData<PaginatedList<MetadataField>>> { - const pageInfo = new PageInfo(); - pageInfo.elementsPerPage = 10; - pageInfo.currentPage = 1; + public getMetadataFieldsBySchema(schema: MetadataSchema, pagination: PaginationComponentOptions): Observable<RemoteData<PaginatedList<MetadataField>>> { + const requestObs = this.getMetadataFieldsRequestObs(pagination); + + const requestEntryObs = requestObs.pipe( + flatMap((request: RestRequest) => this.requestService.getByHref(request.href)) + ); + + const responseCacheObs = requestObs.pipe( + flatMap((request: RestRequest) => this.responseCache.get(request.href)) + ); + + const rmrObs: Observable<RegistryMetadatafieldsResponse> = responseCacheObs.pipe( + map((entry: ResponseCacheEntry) => entry.response), + map((response: RegistryMetadatafieldsSuccessResponse) => response.metadatafieldsResponse) + ); + + const metadatafieldsObs: Observable<MetadataField[]> = rmrObs.pipe( + map((rmr: RegistryMetadatafieldsResponse) => rmr.metadatafields), + map((metadataFields: MetadataField[]) => metadataFields.filter((field) => field.schema.id === schema.id)) + ); + + const pageInfoObs: Observable<PageInfo> = responseCacheObs.pipe( + map((entry: ResponseCacheEntry) => entry.response), + map((response: RegistryMetadatafieldsSuccessResponse) => response.pageInfo) + ); + + const payloadObs = Observable.combineLatest(metadatafieldsObs, pageInfoObs, (metadatafields, pageInfo) => { + return new PaginatedList(pageInfo, metadatafields); + }); + + return this.rdb.toRemoteDataObservable(requestEntryObs, responseCacheObs, payloadObs); + } + + public getBitstreamFormats(pagination: PaginationComponentOptions): Observable<RemoteData<PaginatedList<BitstreamFormat>>> { + const requestObs = this.getBitstreamFormatsRequestObs(pagination); + + const requestEntryObs = requestObs.pipe( + flatMap((request: RestRequest) => this.requestService.getByHref(request.href)) + ); + + const responseCacheObs = requestObs.pipe( + flatMap((request: RestRequest) => this.responseCache.get(request.href)) + ); + + const rbrObs: Observable<RegistryBitstreamformatsResponse> = responseCacheObs.pipe( + map((entry: ResponseCacheEntry) => entry.response), + map((response: RegistryBitstreamformatsSuccessResponse) => response.bitstreamformatsResponse) + ); + + const bitstreamformatsObs: Observable<BitstreamFormat[]> = rbrObs.pipe( + map((rbr: RegistryBitstreamformatsResponse) => rbr.bitstreamformats) + ); + + const pageInfoObs: Observable<PageInfo> = responseCacheObs.pipe( + map((entry: ResponseCacheEntry) => entry.response), + map((response: RegistryBitstreamformatsSuccessResponse) => response.pageInfo) + ); + + const payloadObs = Observable.combineLatest(bitstreamformatsObs, pageInfoObs, (bitstreamformats, pageInfo) => { + return new PaginatedList(pageInfo, bitstreamformats); + }); + + return this.rdb.toRemoteDataObservable(requestEntryObs, responseCacheObs, payloadObs); + } - const payload = new PaginatedList(pageInfo, this.metadataFields.filter((value) => value.schema === schema)); - const remoteData = new RemoteData(false, false, true, undefined, payload); - return Observable.of(remoteData); + private getMetadataSchemasRequestObs(pagination: PaginationComponentOptions): Observable<RestRequest> { + return this.halService.getEndpoint(this.metadataSchemasPath).pipe( + map((url: string) => { + const args: string[] = []; + args.push(`size=${pagination.pageSize}`); + args.push(`page=${pagination.currentPage - 1}`); + if (isNotEmpty(args)) { + url = new URLCombiner(url, `?${args.join('&')}`).toString(); + } + const request = new GetRequest(this.requestService.generateRequestId(), url); + return Object.assign(request, { + getResponseParser(): GenericConstructor<ResponseParsingService> { + return RegistryMetadataschemasResponseParsingService; + } + }); + }), + tap((request: RestRequest) => this.requestService.configure(request)), + ); } - public getBitstreamFormats(): Observable<RemoteData<PaginatedList<BitstreamFormat>>> { - const pageInfo = new PageInfo(); - pageInfo.elementsPerPage = 10; - pageInfo.currentPage = 1; + private getMetadataFieldsRequestObs(pagination: PaginationComponentOptions): Observable<RestRequest> { + return this.halService.getEndpoint(this.metadataFieldsPath).pipe( + map((url: string) => { + const args: string[] = []; + args.push(`size=${pagination.pageSize}`); + args.push(`page=${pagination.currentPage - 1}`); + if (isNotEmpty(args)) { + url = new URLCombiner(url, `?${args.join('&')}`).toString(); + } + const request = new GetRequest(this.requestService.generateRequestId(), url); + return Object.assign(request, { + getResponseParser(): GenericConstructor<ResponseParsingService> { + return RegistryMetadatafieldsResponseParsingService; + } + }); + }), + tap((request: RestRequest) => this.requestService.configure(request)), + ); + } - const payload = new PaginatedList(pageInfo, this.bitstreamFormats); - const remoteData = new RemoteData(false, false, true, undefined, payload); - return Observable.of(remoteData); + private getBitstreamFormatsRequestObs(pagination: PaginationComponentOptions): Observable<RestRequest> { + return this.halService.getEndpoint(this.bitstreamFormatsPath).pipe( + map((url: string) => { + const args: string[] = []; + args.push(`size=${pagination.pageSize}`); + args.push(`page=${pagination.currentPage - 1}`); + if (isNotEmpty(args)) { + url = new URLCombiner(url, `?${args.join('&')}`).toString(); + } + const request = new GetRequest(this.requestService.generateRequestId(), url); + return Object.assign(request, { + getResponseParser(): GenericConstructor<ResponseParsingService> { + return RegistryBitstreamformatsResponseParsingService; + } + }); + }), + tap((request: RestRequest) => this.requestService.configure(request)), + ); } } diff --git a/src/app/shared/pagination/pagination.component.ts b/src/app/shared/pagination/pagination.component.ts index 2fa70ddd18..7c7cf69bc7 100644 --- a/src/app/shared/pagination/pagination.component.ts +++ b/src/app/shared/pagination/pagination.component.ts @@ -207,8 +207,10 @@ export class PaginationComponent implements OnDestroy, OnInit { this.pageSizeOptions = this.paginationOptions.pageSizeOptions; this.currentPage = this.paginationOptions.currentPage; this.pageSize = this.paginationOptions.pageSize; - this.sortDirection = this.sortOptions.direction; - this.sortField = this.sortOptions.field; + if (this.sortOptions) { + this.sortDirection = this.sortOptions.direction; + this.sortField = this.sortOptions.field; + } this.currentQueryParams = { pageId: this.id, page: this.currentPage, -- GitLab