diff --git a/src/app/shared/object-collection/object-collection.component.html b/src/app/shared/object-collection/object-collection.component.html index b1d07db876..db2c16e8e0 100644 --- a/src/app/shared/object-collection/object-collection.component.html +++ b/src/app/shared/object-collection/object-collection.component.html @@ -1,6 +1,7 @@ @@ -12,4 +13,11 @@ *ngIf="getViewMode()===viewModeEnum.Grid"> + + + diff --git a/src/app/shared/object-collection/object-collection.component.ts b/src/app/shared/object-collection/object-collection.component.ts index 0018c55c7f..7c0253b121 100644 --- a/src/app/shared/object-collection/object-collection.component.ts +++ b/src/app/shared/object-collection/object-collection.component.ts @@ -1,20 +1,22 @@ - -import {map} from 'rxjs/operators'; -import { Component, EventEmitter, +import { + ChangeDetectorRef, + Component, + EventEmitter, Input, + OnChanges, OnInit, - Output, SimpleChanges, OnChanges, ChangeDetectorRef } from '@angular/core'; + Output, + SimpleChanges +} from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; import { RemoteData } from '../../core/data/remote-data'; import { PageInfo } from '../../core/shared/page-info.model'; - import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; - import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; - import { ListableObject } from './shared/listable-object.model'; import { hasValue, isNotEmpty } from '../empty.util'; import { ViewMode } from '../../core/shared/view-mode.model'; @@ -29,6 +31,7 @@ export class ObjectCollectionComponent implements OnChanges, OnInit { @Input() objects: RemoteData; @Input() config?: PaginationComponentOptions; @Input() sortConfig: SortOptions; + @Input() hasBorder = false; @Input() hideGear = false; pageInfo: Observable; private sub; @@ -80,13 +83,17 @@ export class ObjectCollectionComponent implements OnChanges, OnInit { } /** + * @param cdRef + * ChangeDetectorRef service provided by Angular. * @param route * Route is a singleton service provided by Angular. * @param router * Router is a singleton service provided by Angular. */ - constructor(private cdRef: ChangeDetectorRef, private route: ActivatedRoute, - private router: Router) { + constructor( + private cdRef: ChangeDetectorRef, + private route: ActivatedRoute, + private router: Router) { } getViewMode(): ViewMode { diff --git a/src/app/shared/object-collection/shared/claimed-task-my-dspace-result.model.ts b/src/app/shared/object-collection/shared/claimed-task-my-dspace-result.model.ts new file mode 100644 index 0000000000..7c5fe42a0f --- /dev/null +++ b/src/app/shared/object-collection/shared/claimed-task-my-dspace-result.model.ts @@ -0,0 +1,8 @@ +import { ClaimedTask } from '../../../core/tasks/models/claimed-task-object.model'; +import { SearchResult } from '../../../+search-page/search-result.model'; +import { MyDSpaceConfigurationValueType } from '../../../+my-dspace-page/my-dspace-configuration-value-type'; +import { searchResultFor } from '../../../+search-page/search-service/search-result-element-decorator'; + +@searchResultFor(ClaimedTask, MyDSpaceConfigurationValueType.Workflow) +export class ClaimedTaskMyDSpaceResult extends SearchResult { +} diff --git a/src/app/shared/object-collection/shared/item-my-dspace-result.model.ts b/src/app/shared/object-collection/shared/item-my-dspace-result.model.ts new file mode 100644 index 0000000000..3ccf111337 --- /dev/null +++ b/src/app/shared/object-collection/shared/item-my-dspace-result.model.ts @@ -0,0 +1,8 @@ +import { Item } from '../../../core/shared/item.model'; +import { SearchResult } from '../../../+search-page/search-result.model'; +import { searchResultFor } from '../../../+search-page/search-service/search-result-element-decorator'; +import { MyDSpaceConfigurationValueType } from '../../../+my-dspace-page/my-dspace-configuration-value-type'; + +@searchResultFor(Item, MyDSpaceConfigurationValueType.Workspace) +export class ItemMyDSpaceResult extends SearchResult { +} diff --git a/src/app/shared/object-collection/shared/mydspace-item-status/my-dspace-item-status-type.ts b/src/app/shared/object-collection/shared/mydspace-item-status/my-dspace-item-status-type.ts new file mode 100644 index 0000000000..f6b3cbd7e8 --- /dev/null +++ b/src/app/shared/object-collection/shared/mydspace-item-status/my-dspace-item-status-type.ts @@ -0,0 +1,8 @@ +export enum MyDspaceItemStatusType { + WORKFLOW = 'mydspace.status.workflow', + REJECTED = 'mydspace.status.rejected', + VALIDATION = 'mydspace.status.validation', + WAITING_CONTROLLER = 'mydspace.status.waiting-for-controller', + IN_PROGRESS = 'mydspace.status.in-progress', + ACCEPTED = 'mydspace.status.accepted' +} diff --git a/src/app/shared/object-collection/shared/mydspace-item-status/my-dspace-item-status.component.html b/src/app/shared/object-collection/shared/mydspace-item-status/my-dspace-item-status.component.html new file mode 100644 index 0000000000..848dd502a4 --- /dev/null +++ b/src/app/shared/object-collection/shared/mydspace-item-status/my-dspace-item-status.component.html @@ -0,0 +1,5 @@ +
+ + {{badgeContent | translate}} + +
diff --git a/src/app/shared/object-collection/shared/mydspace-item-status/my-dspace-item-status.component.scss b/src/app/shared/object-collection/shared/mydspace-item-status/my-dspace-item-status.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/object-collection/shared/mydspace-item-status/my-dspace-item-status.component.ts b/src/app/shared/object-collection/shared/mydspace-item-status/my-dspace-item-status.component.ts new file mode 100644 index 0000000000..2ae1bc2ef5 --- /dev/null +++ b/src/app/shared/object-collection/shared/mydspace-item-status/my-dspace-item-status.component.ts @@ -0,0 +1,41 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { MyDspaceItemStatusType } from './my-dspace-item-status-type'; + +@Component({ + selector: 'ds-mydspace-item-status', + styleUrls: ['./my-dspace-item-status.component.scss'], + templateUrl: './my-dspace-item-status.component.html' +}) + +export class MyDSpaceItemStatusComponent implements OnInit { + + @Input() status: MyDspaceItemStatusType; + public badgeClass: string; + public badgeContent: string; + + ngOnInit() { + this.badgeContent = this.status; + this.badgeClass = 'text-light badge '; + switch (this.status) { + case MyDspaceItemStatusType.REJECTED: + this.badgeClass += 'badge-danger'; + break; + case MyDspaceItemStatusType.VALIDATION: + this.badgeClass += 'badge-warning'; + break; + case MyDspaceItemStatusType.WAITING_CONTROLLER: + this.badgeClass += 'badge-info'; + break; + case MyDspaceItemStatusType.IN_PROGRESS: + this.badgeClass += 'badge-primary'; + break; + case MyDspaceItemStatusType.ACCEPTED: + this.badgeClass += 'badge-success'; + break; + case MyDspaceItemStatusType.WORKFLOW: + this.badgeClass += 'badge-info'; + break; + } + } + +} diff --git a/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.html b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.html new file mode 100644 index 0000000000..1f13fbfa2c --- /dev/null +++ b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.html @@ -0,0 +1,3 @@ +
+ {{'submission.workflow.tasks.generic.submitter' | translate}} : {{(submitter | async)?.name}} +
diff --git a/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.scss b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.ts b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.ts new file mode 100644 index 0000000000..b800686714 --- /dev/null +++ b/src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.ts @@ -0,0 +1,29 @@ +import { Component, Input, OnInit } from '@angular/core'; + +import { Observable } from 'rxjs'; +import { filter, find, flatMap, map } from 'rxjs/operators'; + +import { EPerson } from '../../../../core/eperson/models/eperson.model'; +import { RemoteData } from '../../../../core/data/remote-data'; +import { isNotEmpty, isNotUndefined } from '../../../empty.util'; +import { Workflowitem } from '../../../../core/submission/models/workflowitem.model'; + +@Component({ + selector: 'ds-item-submitter', + styleUrls: ['./item-submitter.component.scss'], + templateUrl: './item-submitter.component.html' +}) + +export class ItemSubmitterComponent implements OnInit { + @Input() object: any; + + submitter: Observable; + + ngOnInit() { + this.submitter = (this.object.workflowitem as Observable>).pipe( + filter((rd: RemoteData) => (rd.hasSucceeded && isNotUndefined(rd.payload))), + flatMap((rd: RemoteData) => rd.payload.submitter as Observable>), + find((rd: RemoteData) => rd.hasSucceeded && isNotEmpty(rd.payload)), + map((rd: RemoteData) => rd.payload)); + } +} diff --git a/src/app/shared/object-collection/shared/pool-task-my-dspace-result.model.ts b/src/app/shared/object-collection/shared/pool-task-my-dspace-result.model.ts new file mode 100644 index 0000000000..04352b5b4c --- /dev/null +++ b/src/app/shared/object-collection/shared/pool-task-my-dspace-result.model.ts @@ -0,0 +1,8 @@ +import { PoolTask } from '../../../core/tasks/models/pool-task-object.model'; +import { SearchResult } from '../../../+search-page/search-result.model'; +import { MyDSpaceConfigurationValueType } from '../../../+my-dspace-page/my-dspace-configuration-value-type'; +import { searchResultFor } from '../../../+search-page/search-service/search-result-element-decorator'; + +@searchResultFor(PoolTask, MyDSpaceConfigurationValueType.Workflow) +export class PoolTaskMyDSpaceResult extends SearchResult { +} diff --git a/src/app/shared/object-collection/shared/workflowitem-my-dspace-result.model.ts b/src/app/shared/object-collection/shared/workflowitem-my-dspace-result.model.ts new file mode 100644 index 0000000000..d60fabc04c --- /dev/null +++ b/src/app/shared/object-collection/shared/workflowitem-my-dspace-result.model.ts @@ -0,0 +1,8 @@ +import { Workflowitem } from '../../../core/submission/models/workflowitem.model'; +import { SearchResult } from '../../../+search-page/search-result.model'; +import { MyDSpaceConfigurationValueType } from '../../../+my-dspace-page/my-dspace-configuration-value-type'; +import { searchResultFor } from '../../../+search-page/search-service/search-result-element-decorator'; + +@searchResultFor(Workflowitem, MyDSpaceConfigurationValueType.Workspace) +export class WorkflowitemMyDSpaceResult extends SearchResult { +} diff --git a/src/app/shared/object-collection/shared/workspaceitem-my-dspace-result.model.ts b/src/app/shared/object-collection/shared/workspaceitem-my-dspace-result.model.ts new file mode 100644 index 0000000000..381b8cd3c4 --- /dev/null +++ b/src/app/shared/object-collection/shared/workspaceitem-my-dspace-result.model.ts @@ -0,0 +1,8 @@ +import { Workspaceitem } from '../../../core/submission/models/workspaceitem.model'; +import { MyDSpaceConfigurationValueType } from '../../../+my-dspace-page/my-dspace-configuration-value-type'; +import { searchResultFor } from '../../../+search-page/search-service/search-result-element-decorator'; +import { SearchResult } from '../../../+search-page/search-result.model'; + +@searchResultFor(Workspaceitem, MyDSpaceConfigurationValueType.Workspace) +export class WorkspaceitemMyDSpaceResult extends SearchResult { +} diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/ct-my-dspace-result/ct-my-dspace-result-detail-element.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/ct-my-dspace-result/ct-my-dspace-result-detail-element.component.html new file mode 100644 index 0000000000..134b85523e --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/ct-my-dspace-result/ct-my-dspace-result-detail-element.component.html @@ -0,0 +1,6 @@ + + + diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/ct-my-dspace-result/ct-my-dspace-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/ct-my-dspace-result/ct-my-dspace-result-detail-element.component.ts new file mode 100644 index 0000000000..90531af2b0 --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/ct-my-dspace-result/ct-my-dspace-result-detail-element.component.ts @@ -0,0 +1,58 @@ +import { Component, Inject } from '@angular/core'; + +import { Observable } from 'rxjs'; +import { find } from 'rxjs/operators'; + +import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator'; +import { RemoteData } from '../../../../core/data/remote-data'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { isNotUndefined } from '../../../empty.util'; +import { ListableObject } from '../../../object-collection/shared/listable-object.model'; +import { Workflowitem } from '../../../../core/submission/models/workflowitem.model'; +import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; +import { ClaimedTaskMyDSpaceResult } from '../../../object-collection/shared/claimed-task-my-dspace-result.model'; +import { ClaimedTaskDataService } from '../../../../core/tasks/claimed-task-data.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { Location, LocationStrategy, PathLocationStrategy } from '@angular/common'; +import { MyDSpaceResultDetailElementComponent } from '../my-dspace-result-detail-element.component'; +import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; + +@Component({ + selector: 'ds-claimtask-my-dspace-result-detail-element', + styleUrls: ['../my-dspace-result-detail-element.component.scss'], + templateUrl: './ct-my-dspace-result-detail-element.component.html', + providers: [Location, {provide: LocationStrategy, useClass: PathLocationStrategy}] +}) + +@renderElementsFor(ClaimedTaskMyDSpaceResult, ViewMode.Detail) +@renderElementsFor(ClaimedTask, ViewMode.Detail) +export class ClaimedTaskMyDSpaceResultDetailElementComponent extends MyDSpaceResultDetailElementComponent { + public status = MyDspaceItemStatusType.VALIDATION; + public workFlow: Workflowitem; + public rejectForm: FormGroup; + + constructor(private ctDataService: ClaimedTaskDataService, + private modalService: NgbModal, + private formBuilder: FormBuilder, + @Inject('objectElementProvider') public listable: ListableObject) { + super(listable); + + this.rejectForm = this.formBuilder.group({ + reason: ['', Validators.required] + }); + } + + ngOnInit() { + this.initWorkflowItem(this.dso.workflowitem as Observable>); + } + + initWorkflowItem(wfi$: Observable>) { + wfi$.pipe( + find((rd: RemoteData) => (rd.hasSucceeded && isNotUndefined(rd.payload))) + ).subscribe((rd: RemoteData) => { + this.workFlow = rd.payload; + }); + } + +} diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html new file mode 100644 index 0000000000..4f9d8f3e94 --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html @@ -0,0 +1,58 @@ +
+ + + +
+ +
+
+ + + + + + +
+
+ + + +
+ +
+
+
+
+
+ + + + + + diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.scss b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts new file mode 100644 index 0000000000..9b42bb2268 --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts @@ -0,0 +1,32 @@ +import { Component, Input } from '@angular/core'; + +import { Observable } from 'rxjs'; + +import { Item } from '../../../../core/shared/item.model'; +import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; +import { fadeInOut } from '../../../animations/fade'; +import { Bitstream } from '../../../../core/shared/bitstream.model'; + +@Component({ + selector: 'ds-item-detail-preview', + styleUrls: ['./item-detail-preview.component.scss'], + templateUrl: './item-detail-preview.component.html', + animations: [fadeInOut] +}) +export class ItemDetailPreviewComponent { + + @Input() item: Item; + @Input() object: any; + @Input() status: MyDspaceItemStatusType; + + public ALL_STATUS = []; + public thumbnail$: Observable; + + ngOnInit() { + Object.keys(MyDspaceItemStatusType).forEach((s) => { + this.ALL_STATUS.push(MyDspaceItemStatusType[s]); + }); + this.thumbnail$ = this.item.getThumbnail(); + } + +} diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.html new file mode 100644 index 0000000000..2b687960ab --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.html @@ -0,0 +1,8 @@ + + + + + + diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.scss b/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.scss new file mode 100644 index 0000000000..1d0786105c --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.scss @@ -0,0 +1 @@ +@import '../../../../../styles/variables'; diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.ts new file mode 100644 index 0000000000..75bfb30939 --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.ts @@ -0,0 +1,21 @@ +import { Component } from '@angular/core'; + +import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { Item } from '../../../../core/shared/item.model'; +import { ItemMyDSpaceResult } from '../../../object-collection/shared/item-my-dspace-result.model'; +import { MyDSpaceResultDetailElementComponent } from '../my-dspace-result-detail-element.component'; +import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; + +@Component({ + selector: 'ds-workspaceitem-my-dspace-result-detail-element', + styleUrls: ['../my-dspace-result-detail-element.component.scss', './item-my-dspace-result-detail-element.component.scss'], + templateUrl: './item-my-dspace-result-detail-element.component.html' +}) + +@renderElementsFor(ItemMyDSpaceResult, ViewMode.Detail) +export class ItemMyDSpaceResultDetailElementComponent extends MyDSpaceResultDetailElementComponent { + + public status = MyDspaceItemStatusType.ACCEPTED; + +} diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/my-dspace-result-detail-element.component.scss b/src/app/shared/object-detail/my-dspace-result-detail-element/my-dspace-result-detail-element.component.scss new file mode 100644 index 0000000000..9a442f84e1 --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/my-dspace-result-detail-element.component.scss @@ -0,0 +1 @@ +@import '../../object-grid/search-result-grid-element/search-result-grid-element.component'; diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/my-dspace-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/my-dspace-result-detail-element.component.ts new file mode 100644 index 0000000000..f5c2cd0897 --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/my-dspace-result-detail-element.component.ts @@ -0,0 +1,41 @@ +import { Component, Inject } from '@angular/core'; + +import { MyDSpaceResult } from '../../../+my-dspace-page/my-dspace-result.model'; +import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; +import { ListableObject } from '../../object-collection/shared/listable-object.model'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { Metadata } from '../../../core/shared/metadata.model'; + +@Component({ + selector: 'ds-my-dspace-result-detail-element', + template: `` +}) + +export class MyDSpaceResultDetailElementComponent, K extends DSpaceObject> extends AbstractListableElementComponent { + dso: K; + + public constructor(@Inject('objectElementProvider') public gridable: ListableObject) { + super(gridable); + this.dso = this.object.dspaceObject; + } + + /** + * Gets all matching metadata string values from hitHighlights or dso metadata, preferring hitHighlights. + * + * @param {string|string[]} keyOrKeys The metadata key(s) in scope. Wildcards are supported; see [[Metadata]]. + * @returns {string[]} the matching string values or an empty array. + */ + allMetadataValues(keyOrKeys: string | string[]): string[] { + return Metadata.allValues([this.object.hitHighlights, this.dso.metadata], keyOrKeys); + } + + /** + * Gets the first matching metadata string value from hitHighlights or dso metadata, preferring hitHighlights. + * + * @param {string|string[]} keyOrKeys The metadata key(s) in scope. Wildcards are supported; see [[Metadata]]. + * @returns {string} the first matching string value, or `undefined`. + */ + firstMetadataValue(keyOrKeys: string | string[]): string { + return Metadata.firstValue([this.object.hitHighlights, this.dso.metadata], keyOrKeys); + } +} diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/pt-my-dspace-result/pt-my-dspace-result-detail-element.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/pt-my-dspace-result/pt-my-dspace-result-detail-element.component.html new file mode 100644 index 0000000000..8d808815c2 --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/pt-my-dspace-result/pt-my-dspace-result-detail-element.component.html @@ -0,0 +1,6 @@ + + + diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/pt-my-dspace-result/pt-my-dspace-result-detail-lement.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/pt-my-dspace-result/pt-my-dspace-result-detail-lement.component.ts new file mode 100644 index 0000000000..28ebefe633 --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/pt-my-dspace-result/pt-my-dspace-result-detail-lement.component.ts @@ -0,0 +1,46 @@ +import { Component, Inject } from '@angular/core'; + +import { Observable } from 'rxjs'; +import { find } from 'rxjs/operators'; + +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator'; +import { RemoteData } from '../../../../core/data/remote-data'; +import { isNotUndefined } from '../../../empty.util'; +import { ListableObject } from '../../../object-collection/shared/listable-object.model'; +import { Workflowitem } from '../../../../core/submission/models/workflowitem.model'; +import { PoolTask } from '../../../../core/tasks/models/pool-task-object.model'; +import { PoolTaskMyDSpaceResult } from '../../../object-collection/shared/pool-task-my-dspace-result.model'; +import { MyDSpaceResultDetailElementComponent } from '../my-dspace-result-detail-element.component'; +import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; + +@Component({ + selector: 'ds-pooltask-my-dspace-result-detail-element', + styleUrls: ['../my-dspace-result-detail-element.component.scss'], + templateUrl: './pt-my-dspace-result-detail-element.component.html', +}) + +@renderElementsFor(PoolTaskMyDSpaceResult, ViewMode.Detail) +@renderElementsFor(PoolTask, ViewMode.Detail) +export class PoolTaskMyDSpaceResultDetailElementComponent extends MyDSpaceResultDetailElementComponent { + public status = MyDspaceItemStatusType.WAITING_CONTROLLER; + public workFlow: Workflowitem; + + constructor(@Inject('objectElementProvider') public listable: ListableObject) { + + super(listable); + } + + ngOnInit() { + this.initWorkflowItem(this.dso.workflowitem as Observable>); + } + + initWorkflowItem(wfi$: Observable>) { + wfi$.pipe( + find((rd: RemoteData) => (rd.hasSucceeded && isNotUndefined(rd.payload))) + ).subscribe((rd: RemoteData) => { + this.workFlow = rd.payload; + }); + } + +} diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/wfi-my-dspace-result/wfi-my-dspace-result-detail-element.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/wfi-my-dspace-result/wfi-my-dspace-result-detail-element.component.html new file mode 100644 index 0000000000..7ff1a9bf72 --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/wfi-my-dspace-result/wfi-my-dspace-result-detail-element.component.html @@ -0,0 +1,6 @@ + + + + diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/wfi-my-dspace-result/wfi-my-dspace-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/wfi-my-dspace-result/wfi-my-dspace-result-detail-element.component.ts new file mode 100644 index 0000000000..398e758896 --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/wfi-my-dspace-result/wfi-my-dspace-result-detail-element.component.ts @@ -0,0 +1,45 @@ +import { Component, Inject } from '@angular/core'; + +import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { Item } from '../../../../core/shared/item.model'; +import { ListableObject } from '../../../object-collection/shared/listable-object.model'; +import { WorkflowitemMyDSpaceResult } from '../../../object-collection/shared/workflowitem-my-dspace-result.model'; +import { Workflowitem } from '../../../../core/submission/models/workflowitem.model'; +import { MyDSpaceResultDetailElementComponent } from '../my-dspace-result-detail-element.component'; +import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; +import { Observable } from 'rxjs/internal/Observable'; +import { RemoteData } from '../../../../core/data/remote-data'; +import { find } from 'rxjs/operators'; +import { isNotUndefined } from '../../../empty.util'; + +@Component({ + selector: 'ds-workflowitem-my-dspace-result-detail-element', + styleUrls: ['../my-dspace-result-detail-element.component.scss'], + templateUrl: './wfi-my-dspace-result-detail-element.component.html', +}) + +@renderElementsFor(WorkflowitemMyDSpaceResult, ViewMode.Detail) +@renderElementsFor(Workflowitem, ViewMode.Detail) +export class WorkflowitemMyDSpaceResultDetailElementComponent extends MyDSpaceResultDetailElementComponent { + + public item: Item; + public status = MyDspaceItemStatusType.WORKFLOW; + + constructor(@Inject('objectElementProvider') public listable: ListableObject) { + super(listable); + } + + ngOnInit() { + this.initItem(this.dso.item as Observable>); + } + + initItem(itemObs: Observable>) { + itemObs.pipe( + find((rd: RemoteData) => rd.hasSucceeded && isNotUndefined(rd.payload)) + ).subscribe((rd: RemoteData) => { + this.item = rd.payload[0]; + }); + } + +} diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/wsi-my-dspace-result/wsi-my-dspace-result-detail-element.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/wsi-my-dspace-result/wsi-my-dspace-result-detail-element.component.html new file mode 100644 index 0000000000..8d4eee6ba9 --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/wsi-my-dspace-result/wsi-my-dspace-result-detail-element.component.html @@ -0,0 +1,5 @@ + + + diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/wsi-my-dspace-result/wsi-my-dspace-result-detail-element.component.scss b/src/app/shared/object-detail/my-dspace-result-detail-element/wsi-my-dspace-result/wsi-my-dspace-result-detail-element.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/wsi-my-dspace-result/wsi-my-dspace-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/wsi-my-dspace-result/wsi-my-dspace-result-detail-element.component.ts new file mode 100644 index 0000000000..4c2c47eae3 --- /dev/null +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/wsi-my-dspace-result/wsi-my-dspace-result-detail-element.component.ts @@ -0,0 +1,44 @@ +import { Component, Inject } from '@angular/core'; + +import { Observable } from 'rxjs'; +import { find } from 'rxjs/operators'; + +import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { Workspaceitem } from '../../../../core/submission/models/workspaceitem.model'; +import { WorkspaceitemMyDSpaceResult } from '../../../object-collection/shared/workspaceitem-my-dspace-result.model'; +import { Item } from '../../../../core/shared/item.model'; +import { RemoteData } from '../../../../core/data/remote-data'; +import { isNotUndefined } from '../../../empty.util'; +import { ListableObject } from '../../../object-collection/shared/listable-object.model'; +import { MyDSpaceResultDetailElementComponent } from '../my-dspace-result-detail-element.component'; +import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; + +@Component({ + selector: 'ds-workspaceitem-my-dspace-result-detail-element', + styleUrls: ['../my-dspace-result-detail-element.component.scss', './wsi-my-dspace-result-detail-element.component.scss'], + templateUrl: './wsi-my-dspace-result-detail-element.component.html', +}) + +@renderElementsFor(WorkspaceitemMyDSpaceResult, ViewMode.Detail) +@renderElementsFor(Workspaceitem, ViewMode.Detail) +export class WorkspaceitemMyDSpaceResultDetailElementComponent extends MyDSpaceResultDetailElementComponent { + public item: Item; + status = MyDspaceItemStatusType.IN_PROGRESS; + + constructor(@Inject('objectElementProvider') public listable: ListableObject) { + super(listable); + } + + ngOnInit() { + this.initItem(this.dso.item as Observable>); + } + + initItem(itemObs: Observable>) { + itemObs.pipe( + find((rd: RemoteData) => rd.hasSucceeded && isNotUndefined(rd.payload)) + ).subscribe((rd: RemoteData) => { + this.item = rd.payload[0]; + }); + } +} diff --git a/src/app/shared/object-detail/object-detail.component.html b/src/app/shared/object-detail/object-detail.component.html new file mode 100644 index 0000000000..fc2f3abae1 --- /dev/null +++ b/src/app/shared/object-detail/object-detail.component.html @@ -0,0 +1,21 @@ + +
+
+ +
+
+ + +
diff --git a/src/app/shared/object-detail/object-detail.component.scss b/src/app/shared/object-detail/object-detail.component.scss new file mode 100644 index 0000000000..19de7e6b30 --- /dev/null +++ b/src/app/shared/object-detail/object-detail.component.scss @@ -0,0 +1,28 @@ +@import '../../../styles/variables'; +@import '../../../styles/mixins'; + +ds-wrapper-detail-element ::ng-deep { + div.thumbnail > img { + height: $card-thumbnail-height; + width: 100%; + } + .card-title { + line-height: $headings-line-height; + height: ($headings-line-height*3) +em; + overflow: hidden; + text-overflow: ellipsis; + } + .item-abstract { + line-height: $line-height-base; + height: ($line-height-base*5)+em; + overflow: hidden; + text-overflow: ellipsis; + } + .item-authors{ + line-height: $line-height-base; + height: ($line-height-base*1.5)+em; + } + div.card { + margin-bottom: 20px; + } +} diff --git a/src/app/shared/object-detail/object-detail.component.spec.ts b/src/app/shared/object-detail/object-detail.component.spec.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/object-detail/object-detail.component.ts b/src/app/shared/object-detail/object-detail.component.ts new file mode 100644 index 0000000000..bdbb360be6 --- /dev/null +++ b/src/app/shared/object-detail/object-detail.component.ts @@ -0,0 +1,100 @@ +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + Input, + Output, + ViewEncapsulation +} from '@angular/core'; + +import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { PaginatedList } from '../../core/data/paginated-list'; + +import { RemoteData } from '../../core/data/remote-data'; +import { fadeIn } from '../animations/fade'; +import { ListableObject } from '../object-collection/shared/listable-object.model'; + +import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; + +@Component({ + changeDetection: ChangeDetectionStrategy.Default, + encapsulation: ViewEncapsulation.Emulated, + selector: 'ds-object-detail', + styleUrls: [ './object-detail.component.scss' ], + templateUrl: './object-detail.component.html', + animations: [fadeIn] +}) + +export class ObjectDetailComponent { + + @Input() config: PaginationComponentOptions; + @Input() sortConfig: SortOptions; + @Input() hideGear = false; + @Input() hidePagerWhenSinglePage = true; + private _objects: RemoteData>; + @Input() set objects(objects: RemoteData>) { + this._objects = objects; + } + get objects() { + return this._objects; + } + + /** + * An event fired when the page is changed. + * Event's payload equals to the newly selected page. + */ + @Output() change: EventEmitter<{ + pagination: PaginationComponentOptions, + sort: SortOptions + }> = new EventEmitter<{ + pagination: PaginationComponentOptions, + sort: SortOptions + }>(); + + /** + * An event fired when the page is changed. + * Event's payload equals to the newly selected page. + */ + @Output() pageChange: EventEmitter = new EventEmitter(); + + /** + * An event fired when the page wsize is changed. + * Event's payload equals to the newly selected page size. + */ + @Output() pageSizeChange: EventEmitter = new EventEmitter(); + + /** + * An event fired when the sort direction is changed. + * Event's payload equals to the newly selected sort direction. + */ + @Output() sortDirectionChange: EventEmitter = new EventEmitter(); + + @Output() paginationChange: EventEmitter = new EventEmitter(); + + /** + * An event fired when the sort field is changed. + * Event's payload equals to the newly selected sort field. + */ + @Output() sortFieldChange: EventEmitter = new EventEmitter(); + data: any = {}; + onPageChange(event) { + this.pageChange.emit(event); + } + + onPageSizeChange(event) { + this.pageSizeChange.emit(event); + } + + onSortDirectionChange(event) { + this.sortDirectionChange.emit(event); + } + + onSortFieldChange(event) { + this.sortFieldChange.emit(event); + } + + onPaginationChange(event) { + this.paginationChange.emit(event); + } + +} diff --git a/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.html b/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.html new file mode 100644 index 0000000000..00a8ed2dc8 --- /dev/null +++ b/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.html @@ -0,0 +1 @@ + diff --git a/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.scss b/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.scss new file mode 100644 index 0000000000..51a7fc6a55 --- /dev/null +++ b/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.scss @@ -0,0 +1,2 @@ +@import '../../../../styles/variables'; + diff --git a/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.spec.ts b/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.spec.ts new file mode 100644 index 0000000000..3f28d5e76b --- /dev/null +++ b/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.spec.ts @@ -0,0 +1,46 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { By } from '@angular/platform-browser'; + +import { of as observableOf } from 'rxjs'; + +import { ActivatedRoute, Router } from '@angular/router'; +import { RouterStub } from '../../testing/router-stub'; + +import { WrapperGridElementComponent } from '../../object-grid/wrapper-grid-element/wrapper-grid-element.component'; + +let wrapperGridElementComponent: WrapperGridElementComponent; +let fixture: ComponentFixture; +const queryParam = 'test query'; +const scopeParam = '7669c72a-3f2a-451f-a3b9-9210e7a4c02f'; +const activatedRouteStub = { + queryParams: observableOf({ + query: queryParam, + scope: scopeParam + }) +}; + +describe('WrapperGridElementComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ WrapperGridElementComponent ], + providers: [ + { provide: ActivatedRoute, useValue: activatedRouteStub }, + { provide: Router, useClass: RouterStub }, + { provide: 'objectElementProvider', useFactory: (wrapperGridElementComponent)} + ], + + schemas: [ NO_ERRORS_SCHEMA ] + }).compileComponents(); // compile template and css + })); + + beforeEach(async(() => { + fixture = TestBed.createComponent(WrapperGridElementComponent); + wrapperGridElementComponent = fixture.componentInstance; + + })); + + it('should show the wrapper element containing the cards',() => { + expect(fixture.debugElement.query(By.css('ds-collection-grid-element'))).toBeDefined(); + }) +}); diff --git a/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.ts b/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.ts new file mode 100644 index 0000000000..0d3bfef3fe --- /dev/null +++ b/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.ts @@ -0,0 +1,32 @@ +import { Component, Injector, Input, OnInit } from '@angular/core'; + +import { ViewMode } from '../../../core/shared/view-mode.model'; +import { GenericConstructor } from '../../../core/shared/generic-constructor'; +import { rendersDSOType } from '../../object-collection/shared/dso-element-decorator'; +import { ListableObject } from '../../object-collection/shared/listable-object.model'; + +@Component({ + selector: 'ds-wrapper-detail-element', + styleUrls: ['./wrapper-detail-element.component.scss'], + templateUrl: './wrapper-detail-element.component.html' +}) +export class WrapperDetailElementComponent implements OnInit { + @Input() object: ListableObject; + objectInjector: Injector; + + constructor(private injector: Injector) { + } + + ngOnInit(): void { + this.objectInjector = Injector.create({ + providers: [{ provide: 'objectElementProvider', useFactory: () => (this.object), deps:[] }], + parent: this.injector + }); + + } + + getDetailElement(): string { + const f: GenericConstructor = this.object.constructor as GenericConstructor; + return rendersDSOType(f, ViewMode.Detail); + } +} diff --git a/src/app/shared/object-list/item-list-preview/item-list-preview.component.html b/src/app/shared/object-list/item-list-preview/item-list-preview.component.html new file mode 100644 index 0000000000..0aa93ab711 --- /dev/null +++ b/src/app/shared/object-list/item-list-preview/item-list-preview.component.html @@ -0,0 +1,32 @@ + + + + + +

+
+ + + ( + ) + + {{'mydspace.results.no-authors' | translate}} + + + + + + + + + + + + +
+
+ +
diff --git a/src/app/shared/object-list/item-list-preview/item-list-preview.component.scss b/src/app/shared/object-list/item-list-preview/item-list-preview.component.scss new file mode 100644 index 0000000000..8d0339f264 --- /dev/null +++ b/src/app/shared/object-list/item-list-preview/item-list-preview.component.scss @@ -0,0 +1,5 @@ +@import '../../../../styles/_variables.scss'; + +.h3-title { + color: $link-color; +} diff --git a/src/app/shared/object-list/item-list-preview/item-list-preview.component.ts b/src/app/shared/object-list/item-list-preview/item-list-preview.component.ts new file mode 100644 index 0000000000..83b8d8fd92 --- /dev/null +++ b/src/app/shared/object-list/item-list-preview/item-list-preview.component.ts @@ -0,0 +1,41 @@ +import { Component, Input } from '@angular/core'; + +import { Item } from '../../../core/shared/item.model'; +import { fadeInOut } from '../../animations/fade'; +import { MyDspaceItemStatusType } from '../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; +import { Metadata } from '../../../core/shared/metadata.model'; + +@Component({ + selector: 'ds-item-list-preview', + styleUrls: ['item-list-preview.component.scss'], + templateUrl: 'item-list-preview.component.html', + animations: [fadeInOut] +}) + +export class ItemListPreviewComponent { + @Input() item: Item; + @Input() object: any; + @Input() status: MyDspaceItemStatusType; + @Input() showSubmitter = false; + + /** + * Gets all matching metadata string values from hitHighlights or dso metadata, preferring hitHighlights. + * + * @param {string|string[]} keyOrKeys The metadata key(s) in scope. Wildcards are supported; see [[Metadata]]. + * @returns {string[]} the matching string values or an empty array. + */ + allMetadataValues(keyOrKeys: string | string[]): string[] { + return Metadata.allValues([this.object.hitHighlights, this.item.metadata], keyOrKeys); + } + + /** + * Gets the first matching metadata string value from hitHighlights or dso metadata, preferring hitHighlights. + * + * @param {string|string[]} keyOrKeys The metadata key(s) in scope. Wildcards are supported; see [[Metadata]]. + * @returns {string} the first matching string value, or `undefined`. + */ + firstMetadataValue(keyOrKeys: string | string[]): string { + return Metadata.firstValue([this.object.hitHighlights, this.item.metadata], keyOrKeys); + } + +} diff --git a/src/app/shared/object-list/my-dspace-result-list-element/ct-my-dspace-result/ct-my-dspace-result-list-element.component.html b/src/app/shared/object-list/my-dspace-result-list-element/ct-my-dspace-result/ct-my-dspace-result-list-element.component.html new file mode 100644 index 0000000000..5ec6e59f95 --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/ct-my-dspace-result/ct-my-dspace-result-list-element.component.html @@ -0,0 +1,7 @@ + + + diff --git a/src/app/shared/object-list/my-dspace-result-list-element/ct-my-dspace-result/ct-my-dspace-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/ct-my-dspace-result/ct-my-dspace-result-list-element.component.ts new file mode 100644 index 0000000000..36626e1968 --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/ct-my-dspace-result/ct-my-dspace-result-list-element.component.ts @@ -0,0 +1,42 @@ +import { Component } from '@angular/core'; +import { Location, LocationStrategy, PathLocationStrategy } from '@angular/common'; + +import { Observable } from 'rxjs'; +import { find } from 'rxjs/operators'; + +import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator'; +import { MyDSpaceResultListElementComponent, } from '../my-dspace-result-list-element.component'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { RemoteData } from '../../../../core/data/remote-data'; +import { isNotUndefined } from '../../../empty.util'; +import { Workflowitem } from '../../../../core/submission/models/workflowitem.model'; +import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; +import { ClaimedTaskMyDSpaceResult } from '../../../object-collection/shared/claimed-task-my-dspace-result.model'; +import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; + +@Component({ + selector: 'ds-claimtask-my-dspace-result-list-element', + styleUrls: ['../my-dspace-result-list-element.component.scss'], + templateUrl: './ct-my-dspace-result-list-element.component.html', + providers: [Location, { provide: LocationStrategy, useClass: PathLocationStrategy }] +}) + +@renderElementsFor(ClaimedTaskMyDSpaceResult, ViewMode.List) +@renderElementsFor(ClaimedTask, ViewMode.List) +export class ClaimedTaskMyDSpaceResultListElementComponent extends MyDSpaceResultListElementComponent { + public showSubmitter = true; + public status = MyDspaceItemStatusType.VALIDATION; + public workFlow: Workflowitem; + + ngOnInit() { + this.initWorkflowItem(this.dso.workflowitem as Observable>); + } + + initWorkflowItem(wfi$: Observable>) { + wfi$.pipe( + find((rd: RemoteData) => (rd.hasSucceeded && isNotUndefined(rd.payload))) + ).subscribe((rd: RemoteData) => { + this.workFlow = rd.payload; + }); + } +} diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.html b/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.html new file mode 100644 index 0000000000..e1b1435481 --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.html @@ -0,0 +1,5 @@ + + + diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.scss b/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.scss new file mode 100644 index 0000000000..1d0786105c --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.scss @@ -0,0 +1 @@ +@import '../../../../../styles/variables'; diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.ts new file mode 100644 index 0000000000..484ca9af11 --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.ts @@ -0,0 +1,21 @@ +import { Component } from '@angular/core'; + +import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator'; +import { MyDSpaceResultListElementComponent, } from '../my-dspace-result-list-element.component'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { Item } from '../../../../core/shared/item.model'; +import { ItemMyDSpaceResult } from '../../../object-collection/shared/item-my-dspace-result.model'; +import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; + +@Component({ + selector: 'ds-workspaceitem-my-dspace-result-list-element', + styleUrls: ['../my-dspace-result-list-element.component.scss', './item-my-dspace-result-list-element.component.scss'], + templateUrl: './item-my-dspace-result-list-element.component.html' +}) + +@renderElementsFor(ItemMyDSpaceResult, ViewMode.List) +export class ItemMyDSpaceResultListElementComponent extends MyDSpaceResultListElementComponent { + + public status = MyDspaceItemStatusType.ACCEPTED; + +} diff --git a/src/app/shared/object-list/my-dspace-result-list-element/my-dspace-result-list-element.component.scss b/src/app/shared/object-list/my-dspace-result-list-element/my-dspace-result-list-element.component.scss new file mode 100644 index 0000000000..4cd8a2b697 --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/my-dspace-result-list-element.component.scss @@ -0,0 +1 @@ +@import '../search-result-list-element/search-result-list-element.component.scss'; diff --git a/src/app/shared/object-list/my-dspace-result-list-element/my-dspace-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/my-dspace-result-list-element.component.ts new file mode 100644 index 0000000000..6c759f8946 --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/my-dspace-result-list-element.component.ts @@ -0,0 +1,46 @@ +import { Component, Inject } from '@angular/core'; + +import { MyDSpaceResult } from '../../../+my-dspace-page/my-dspace-result.model'; +import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; +import { ListableObject } from '../../object-collection/shared/listable-object.model'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { Metadata } from '../../../core/shared/metadata.model'; +import { TruncatableService } from '../../truncatable/truncatable.service'; + +@Component({ + selector: 'ds-my-dspace-result-list-element', + template: `` +}) + +export class MyDSpaceResultListElementComponent, K extends DSpaceObject> extends AbstractListableElementComponent { + dso: K; + dsoIndex: number; + + public constructor(@Inject('objectElementProvider') public listable: ListableObject, + @Inject('indexElementProvider') public index: number) { + super(listable); + this.dso = this.object.dspaceObject; + this.dsoIndex = this.index; + } + + /** + * Gets all matching metadata string values from hitHighlights or dso metadata, preferring hitHighlights. + * + * @param {string|string[]} keyOrKeys The metadata key(s) in scope. Wildcards are supported; see [[Metadata]]. + * @returns {string[]} the matching string values or an empty array. + */ + allMetadataValues(keyOrKeys: string | string[]): string[] { + return Metadata.allValues([this.object.hitHighlights, this.dso.metadata], keyOrKeys); + } + + /** + * Gets the first matching metadata string value from hitHighlights or dso metadata, preferring hitHighlights. + * + * @param {string|string[]} keyOrKeys The metadata key(s) in scope. Wildcards are supported; see [[Metadata]]. + * @returns {string} the first matching string value, or `undefined`. + */ + firstMetadataValue(keyOrKeys: string | string[]): string { + return Metadata.firstValue([this.object.hitHighlights, this.dso.metadata], keyOrKeys); + } + +} diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pt-my-dspace-result/pt-my-dspace-result-list-element.component.html b/src/app/shared/object-list/my-dspace-result-list-element/pt-my-dspace-result/pt-my-dspace-result-list-element.component.html new file mode 100644 index 0000000000..b5018615e0 --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/pt-my-dspace-result/pt-my-dspace-result-list-element.component.html @@ -0,0 +1,14 @@ + + + + + + diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pt-my-dspace-result/pt-my-dspace-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/pt-my-dspace-result/pt-my-dspace-result-list-element.component.ts new file mode 100644 index 0000000000..c3c27a53ae --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/pt-my-dspace-result/pt-my-dspace-result-list-element.component.ts @@ -0,0 +1,81 @@ +import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; + +import { Observable, Subscription } from 'rxjs'; +import { find, first } from 'rxjs/operators'; + +import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator'; +import { MyDSpaceResultListElementComponent, } from '../my-dspace-result-list-element.component'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { RemoteData } from '../../../../core/data/remote-data'; +import { hasValue, isNotUndefined } from '../../../empty.util'; +import { ListableObject } from '../../../object-collection/shared/listable-object.model'; +import { Workflowitem } from '../../../../core/submission/models/workflowitem.model'; +import { PoolTask } from '../../../../core/tasks/models/pool-task-object.model'; +import { PoolTaskMyDSpaceResult } from '../../../object-collection/shared/pool-task-my-dspace-result.model'; +import { ActivatedRoute, NavigationExtras, Router } from '@angular/router'; +import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; +import { MYDSPACE_ROUTE } from '../../../../+my-dspace-page/my-dspace-page.component'; + +@Component({ + selector: 'ds-pooltask-my-dspace-result-list-element', + styleUrls: ['../my-dspace-result-list-element.component.scss'], + templateUrl: './pt-my-dspace-result-list-element.component.html', +}) + +@renderElementsFor(PoolTaskMyDSpaceResult, ViewMode.List) +@renderElementsFor(PoolTask, ViewMode.List) +export class PoolTaskMyDSpaceResultListElementComponent extends MyDSpaceResultListElementComponent implements OnDestroy, OnInit { + public status = MyDspaceItemStatusType.WAITING_CONTROLLER; + public workFlow: Workflowitem; + public viewMode: ViewMode = ViewMode.List; + private sub: Subscription; + + constructor(@Inject('objectElementProvider') public listable: ListableObject, + @Inject('indexElementProvider') public index: number, + private route: ActivatedRoute, + private router: Router) { + super(listable, index); + } + + ngOnInit() { + this.initWorkflowItem(this.dso.workflowitem as Observable>); + } + + initWorkflowItem(wfi$: Observable>) { + wfi$.pipe( + find((rd: RemoteData) => (rd.hasSucceeded && isNotUndefined(rd.payload))) + ).subscribe((rd: RemoteData) => { + this.workFlow = rd.payload; + }); + } + + switchView() { + this.viewMode = (this.viewMode === ViewMode.List) ? ViewMode.Detail : ViewMode.List; + } + + view() { + this.sub = this.route.queryParams.pipe( + first() + ).subscribe((params) => { + const pageSize = params.pageSize || 1; + const page = (pageSize * this.dsoIndex ) + 1; + + const navigationExtras: NavigationExtras = { + queryParams: { + view: ViewMode.Detail, + page, + pageSize + }, + queryParamsHandling: 'merge' + }; + this.router.navigate([MYDSPACE_ROUTE], navigationExtras); + }); + } + + ngOnDestroy() { + if (hasValue(this.sub)) { + this.sub.unsubscribe(); + } + } + +} diff --git a/src/app/shared/object-list/my-dspace-result-list-element/wfi-my-dspace-result/wfi-my-dspace-result-list-element.component.html b/src/app/shared/object-list/my-dspace-result-list-element/wfi-my-dspace-result/wfi-my-dspace-result-list-element.component.html new file mode 100644 index 0000000000..782c5f9e56 --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/wfi-my-dspace-result/wfi-my-dspace-result-list-element.component.html @@ -0,0 +1,6 @@ + + + + diff --git a/src/app/shared/object-list/my-dspace-result-list-element/wfi-my-dspace-result/wfi-my-dspace-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/wfi-my-dspace-result/wfi-my-dspace-result-list-element.component.ts new file mode 100644 index 0000000000..a0f1e8decd --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/wfi-my-dspace-result/wfi-my-dspace-result-list-element.component.ts @@ -0,0 +1,40 @@ +import { Component } from '@angular/core'; + +import { Observable } from 'rxjs'; +import { find } from 'rxjs/operators'; + +import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator'; +import { MyDSpaceResultListElementComponent, } from '../my-dspace-result-list-element.component'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { RemoteData } from '../../../../core/data/remote-data'; +import { isNotUndefined } from '../../../empty.util'; +import { WorkflowitemMyDSpaceResult } from '../../../object-collection/shared/workflowitem-my-dspace-result.model'; +import { Workflowitem } from '../../../../core/submission/models/workflowitem.model'; +import { Item } from '../../../../core/shared/item.model'; +import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; + +@Component({ + selector: 'ds-workflowitem-my-dspace-result-list-element', + styleUrls: ['../my-dspace-result-list-element.component.scss'], + templateUrl: './wfi-my-dspace-result-list-element.component.html', +}) + +@renderElementsFor(WorkflowitemMyDSpaceResult, ViewMode.List) +@renderElementsFor(Workflowitem, ViewMode.List) +export class WorkflowitemMyDSpaceResultListElementComponent extends MyDSpaceResultListElementComponent { + public item: Item; + public status = MyDspaceItemStatusType.WORKFLOW; + + ngOnInit() { + this.initItem(this.dso.item as Observable>); + } + + initItem(item$: Observable>) { + item$.pipe( + find((rd: RemoteData) => rd.hasSucceeded && isNotUndefined(rd.payload)) + ).subscribe((rd: RemoteData) => { + this.item = rd.payload; + }); + } + +} diff --git a/src/app/shared/object-list/my-dspace-result-list-element/wsi-my-dspace-result/wsi-my-dspace-result-list-element.component.html b/src/app/shared/object-list/my-dspace-result-list-element/wsi-my-dspace-result/wsi-my-dspace-result-list-element.component.html new file mode 100644 index 0000000000..79a31770d6 --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/wsi-my-dspace-result/wsi-my-dspace-result-list-element.component.html @@ -0,0 +1,7 @@ + + + diff --git a/src/app/shared/object-list/my-dspace-result-list-element/wsi-my-dspace-result/wsi-my-dspace-result-list-element.component.scss b/src/app/shared/object-list/my-dspace-result-list-element/wsi-my-dspace-result/wsi-my-dspace-result-list-element.component.scss new file mode 100644 index 0000000000..a32ecc6925 --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/wsi-my-dspace-result/wsi-my-dspace-result-list-element.component.scss @@ -0,0 +1,20 @@ +@import '../../../../../styles/variables'; + +::-webkit-scrollbar-track +{ + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); + background-color: #F5F5F5; +} + +::-webkit-scrollbar +{ + width: 12px; + background-color: #F5F5F5; +} + +::-webkit-scrollbar-thumb +{ + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3); + background-color: #555; +} + diff --git a/src/app/shared/object-list/my-dspace-result-list-element/wsi-my-dspace-result/wsi-my-dspace-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/wsi-my-dspace-result/wsi-my-dspace-result-list-element.component.ts new file mode 100644 index 0000000000..7a19f54a10 --- /dev/null +++ b/src/app/shared/object-list/my-dspace-result-list-element/wsi-my-dspace-result/wsi-my-dspace-result-list-element.component.ts @@ -0,0 +1,39 @@ +import { Component } from '@angular/core'; + +import { Observable } from 'rxjs'; +import { find } from 'rxjs/operators'; + +import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator'; +import { MyDSpaceResultListElementComponent, } from '../my-dspace-result-list-element.component'; +import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { Workspaceitem } from '../../../../core/submission/models/workspaceitem.model'; +import { WorkspaceitemMyDSpaceResult } from '../../../object-collection/shared/workspaceitem-my-dspace-result.model'; +import { RemoteData } from '../../../../core/data/remote-data'; +import { isNotUndefined } from '../../../empty.util'; +import { Item } from '../../../../core/shared/item.model'; +import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; + +@Component({ + selector: 'ds-workspaceitem-my-dspace-result-list-element', + styleUrls: ['../my-dspace-result-list-element.component.scss', './wsi-my-dspace-result-list-element.component.scss'], + templateUrl: './wsi-my-dspace-result-list-element.component.html', +}) + +@renderElementsFor(WorkspaceitemMyDSpaceResult, ViewMode.List) +export class WorkspaceitemMyDSpaceResultListElementComponent extends MyDSpaceResultListElementComponent { + + item: Item; + status = MyDspaceItemStatusType.IN_PROGRESS; + + ngOnInit() { + this.initItem(this.dso.item as Observable>); + } + + initItem(item$: Observable>) { + item$.pipe( + find((rd: RemoteData) => rd.hasSucceeded && isNotUndefined(rd.payload)) + ).subscribe((rd: RemoteData) => { + this.item = rd.payload; + }); + } +} diff --git a/src/app/shared/object-list/object-list.component.html b/src/app/shared/object-list/object-list.component.html index 420886668a..3249434921 100644 --- a/src/app/shared/object-list/object-list.component.html +++ b/src/app/shared/object-list/object-list.component.html @@ -11,8 +11,8 @@ (sortFieldChange)="onSortFieldChange($event)" (paginationChange)="onPaginationChange($event)">
    -
  • - +
  • +
diff --git a/src/app/shared/object-list/object-list.component.ts b/src/app/shared/object-list/object-list.component.ts index b0296d5ae1..afc376034f 100644 --- a/src/app/shared/object-list/object-list.component.ts +++ b/src/app/shared/object-list/object-list.component.ts @@ -25,6 +25,7 @@ export class ObjectListComponent { @Input() config: PaginationComponentOptions; @Input() sortConfig: SortOptions; + @Input() hasBorder = false; @Input() hideGear = false; @Input() hidePagerWhenSinglePage = true; private _objects: RemoteData>; diff --git a/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.ts b/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.ts index e95def7cf7..708c143282 100644 --- a/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.ts +++ b/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.ts @@ -1,4 +1,5 @@ import { Component, Injector, Input, OnInit } from '@angular/core'; + import { GenericConstructor } from '../../../core/shared/generic-constructor'; import { rendersDSOType } from '../../object-collection/shared/dso-element-decorator' import { ListableObject } from '../../object-collection/shared/listable-object.model'; @@ -11,13 +12,17 @@ import { ViewMode } from '../../../core/shared/view-mode.model'; }) export class WrapperListElementComponent implements OnInit { @Input() object: ListableObject; + @Input() index: number; objectInjector: Injector; constructor(private injector: Injector) {} ngOnInit(): void { this.objectInjector = Injector.create({ - providers: [{ provide: 'objectElementProvider', useFactory: () => (this.object), deps:[] }], + providers: [ + { provide: 'objectElementProvider', useFactory: () => (this.object), deps:[] }, + { provide: 'indexElementProvider', useFactory: () => (this.index), deps:[] } + ], parent: this.injector }); }