CST-5253] Finished functionalities

This commit is contained in:
Rezart Vata
2022-04-27 20:18:33 +02:00
parent 13dac1af0e
commit aa78a2991c
13 changed files with 183 additions and 81 deletions

View File

@@ -70,6 +70,12 @@ export function getWorkflowItemModuleRoute() {
return `/${WORKFLOW_ITEM_MODULE_PATH}`;
}
export const WORKSPACE_ITEM_MODULE_PATH = 'workspaceitems';
export function getWorkspaceItemModuleRoute() {
return `/${WORKSPACE_ITEM_MODULE_PATH}`;
}
export function getDSORoute(dso: DSpaceObject): string {
if (hasValue(dso)) {
switch ((dso as any).type) {

View File

@@ -0,0 +1,43 @@
import { DSpaceObject } from './../../shared/dspace-object.model';
import { followLink } from './../../../shared/utils/follow-link-config.model';
import { ChildHALResource } from './../../shared/child-hal-resource.model';
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { Store } from '@ngrx/store';
import { switchMap } from 'rxjs/operators';
import { DataService } from '../../data/data.service';
import { RemoteData } from '../../data/remote-data';
import { getFirstCompletedRemoteData } from '../../shared/operators';
/**
* This class represents a resolver that requests a specific item before the route is activated
*/
@Injectable()
export class SubmissionObjectResolver<T> implements Resolve<RemoteData<T>> {
constructor(
protected dataService: DataService<any>,
protected store: Store<any>
) {
}
/**
* Method for resolving an item based on the parameters in the current route
* @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot
* @param {RouterStateSnapshot} state The current RouterStateSnapshot
* @returns Observable<<RemoteData<Item>> Emits the found item based on the parameters in the current route,
* or an error if something went wrong
*/
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<RemoteData<T>> {
const itemRD$ = this.dataService.findById(route.params.id,
true,
false,
followLink('item'),
).pipe(
getFirstCompletedRemoteData(),
switchMap((wfiRD: RemoteData<any>) => wfiRD.payload.item as Observable<RemoteData<T>>),
getFirstCompletedRemoteData()
);
return itemRD$;
}
}

View File

@@ -1,21 +1,17 @@
<ng-container *ngVar="(actionRD$ | async)?.payload as workflowAction">
<div class="mt-1 mb-3 space-children-mr">
<ds-claimed-task-actions-loader *ngFor="let option of workflowAction?.options"
[option]="option"
[object]="object"
<ds-claimed-task-actions-loader *ngFor="let option of workflowAction?.options" [option]="option" [object]="object"
(processCompleted)="this.processCompleted.emit($event)">
</ds-claimed-task-actions-loader>
<ng-container *ngIf="hasViewAction(workflowAction)">
<button class="btn btn-primary workflow-view"
ngbTooltip="{{'submission.workflow.generic.view-help' | translate}}"
<!-- <ng-container *ngIf="hasViewAction(workflowAction)"> -->
<button class="btn btn-primary workflow-view" ngbTooltip="{{'submission.workflow.generic.view-help' | translate}}"
[routerLink]="[getWorkflowItemViewRoute((workflowitem$ | async))]">
<i class="fa fa-info-circle"></i> {{"submission.workflow.generic.view" | translate}}
</button>
</ng-container>
<!-- </ng-container> -->
<ds-claimed-task-actions-loader [option]="returnToPoolOption"
[object]="object"
<ds-claimed-task-actions-loader [option]="returnToPoolOption" [object]="object"
(processCompleted)="this.processCompleted.emit($event)">
</ds-claimed-task-actions-loader>
</div>

View File

@@ -1,8 +1,13 @@
<button type="button"
class="btn btn-info mt-1 mb-3"
ngbTooltip="{{'submission.workflow.tasks.pool.claim_help' | translate}}"
[disabled]="(processing$ | async)"
<button type="button" class="btn btn-info mt-1 mb-3"
ngbTooltip="{{'submission.workflow.tasks.pool.claim_help' | translate}}" [disabled]="(processing$ | async)"
(click)="claim()">
<span *ngIf="(processing$ | async)"><i class='fas fa-circle-notch fa-spin'></i> {{'submission.workflow.tasks.generic.processing' | translate}}</span>
<span *ngIf="!(processing$ | async)"><i class="fas fa-hand-paper"></i> {{'submission.workflow.tasks.pool.claim' | translate}}</span>
<span *ngIf="(processing$ | async)"><i class='fas fa-circle-notch fa-spin'></i>
{{'submission.workflow.tasks.generic.processing' | translate}}</span>
<span *ngIf="!(processing$ | async)"><i class="fas fa-hand-paper"></i> {{'submission.workflow.tasks.pool.claim' |
translate}}</span>
</button>
<button class="btn btn-primary workflow-view ml-1 mt-1 mb-3"
ngbTooltip="{{'submission.workflow.generic.view-help' | translate}}"
[routerLink]="[getWorkflowItemViewRoute((workflowitem$ | async))]">
<i class="fa fa-info-circle"></i> {{"submission.workflow.generic.view" | translate}}
</button>

View File

@@ -2,7 +2,7 @@ import { Component, Injector, Input, OnDestroy } from '@angular/core';
import { Router } from '@angular/router';
import { Observable } from 'rxjs';
import {filter, map, switchMap, take} from 'rxjs/operators';
import { filter, map, switchMap, take } from 'rxjs/operators';
import { TranslateService } from '@ngx-translate/core';
import { WorkflowItem } from '../../../core/submission/models/workflowitem.model';
@@ -19,6 +19,7 @@ import { Item } from '../../../core/shared/item.model';
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { MyDSpaceReloadableActionsComponent } from '../mydspace-reloadable-actions';
import { ProcessTaskResponse } from '../../../core/tasks/models/process-task-response';
import { getWorkflowItemViewRoute } from '../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths';
/**
* This component represents mydspace actions related to PoolTask object.
@@ -115,4 +116,11 @@ export class PoolTaskActionsComponent extends MyDSpaceReloadableActionsComponent
this.subs.forEach((sub) => sub.unsubscribe());
}
/**
* Get the workflowitem view route.
*/
getWorkflowItemViewRoute(workflowitem: WorkflowItem): string {
return getWorkflowItemViewRoute(workflowitem?.id);
}
}

View File

@@ -1,22 +1,28 @@
<div class="space-children-mr">
<a class="btn btn-primary mt-1 mb-3"
id="{{'edit_' + object.id}}"
<button class="btn btn-primary workflow-view mt-1 mb-3"
ngbTooltip="{{'submission.workspace.generic.view-help' | translate}}"
[routerLink]="[getWorkspaceItemViewRoute(object)]">
<i class="fa fa-info-circle"></i> {{"submission.workspace.generic.view" | translate}}
</button>
<a class="btn btn-primary mt-1 mb-3" id="{{'edit_' + object.id}}"
ngbTooltip="{{'submission.workflow.generic.edit-help' | translate}}"
[routerLink]="['/workspaceitems/' + object.id + '/edit']"
role="button">
[routerLink]="['/workspaceitems/' + object.id + '/edit']" role="button">
<i class="fa fa-edit"></i> {{'submission.workflow.generic.edit' | translate}}
</a>
<button type="button"
id="{{'delete_' + object.id}}"
class="btn btn-danger mt-1 mb-3"
<button type="button" id="{{'delete_' + object.id}}" class="btn btn-danger mt-1 mb-3"
ngbTooltip="{{'submission.workflow.generic.delete-help' | translate}}"
(click)="$event.preventDefault();confirmDiscard(content)">
<span *ngIf="(processingDelete$ | async)"><i class='fas fa-circle-notch fa-spin'></i> {{'submission.workflow.tasks.generic.processing' | translate}}</span>
<span *ngIf="!(processingDelete$ | async)"><i class="fa fa-trash"></i> {{'submission.workflow.generic.delete' | translate}}</span>
<span *ngIf="(processingDelete$ | async)"><i class='fas fa-circle-notch fa-spin'></i>
{{'submission.workflow.tasks.generic.processing' | translate}}</span>
<span *ngIf="!(processingDelete$ | async)"><i class="fa fa-trash"></i> {{'submission.workflow.generic.delete' |
translate}}</span>
</button>
</div>
<ng-template #content let-c="close" let-d="dismiss">
<div class="modal-header">
<h4 class="modal-title text-danger">{{'submission.general.discard.confirm.title' | translate}}</h4>
@@ -28,7 +34,9 @@
<p>{{'submission.general.discard.confirm.info' | translate}}</p>
</div>
<div class="modal-footer">
<button type="button" id="delete_cancel" class="btn btn-secondary" (click)="c('cancel')">{{'submission.general.discard.confirm.cancel' | translate}}</button>
<button type="button" id="delete_confirm"class="btn btn-danger" (click)="c('ok')">{{'submission.general.discard.confirm.submit' | translate}}</button>
<button type="button" id="delete_cancel" class="btn btn-secondary"
(click)="c('cancel')">{{'submission.general.discard.confirm.cancel' | translate}}</button>
<button type="button" id="delete_confirm" class="btn btn-danger"
(click)="c('ok')">{{'submission.general.discard.confirm.submit' | translate}}</button>
</div>
</ng-template>

View File

@@ -14,6 +14,7 @@ import { SearchService } from '../../../core/shared/search/search.service';
import { getFirstCompletedRemoteData } from '../../../core/shared/operators';
import { RemoteData } from '../../../core/data/remote-data';
import { NoContent } from '../../../core/shared/NoContent.model';
import { getWorkspaceItemViewRoute } from '../../../workspaceitems-edit-page/workspaceitems-edit-page-routing-paths';
/**
* This component represents actions related to WorkspaceItem object.
@@ -85,4 +86,11 @@ export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent<Work
this.object = object;
}
/**
* Get the workflowitem view route.
*/
getWorkspaceItemViewRoute(workspaceItem: WorkspaceItem): string {
return getWorkspaceItemViewRoute(workspaceItem?.id);
}
}

View File

@@ -1,43 +1,21 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { Resolve } from '@angular/router';
import { RemoteData } from '../core/data/remote-data';
import { Item } from '../core/shared/item.model';
import { followLink } from '../shared/utils/follow-link-config.model';
import { getFirstCompletedRemoteData } from '../core/shared/operators';
import { Store } from '@ngrx/store';
import { WorkflowItemDataService } from '../core/submission/workflowitem-data.service';
import { WorkflowItem } from '../core/submission/models/workflowitem.model';
import { switchMap } from 'rxjs/operators';
import { SubmissionObjectResolver } from '../core/submission/resolver/submission-object.resolver';
/**
* This class represents a resolver that requests a specific item before the route is activated
*/
@Injectable()
export class ItemFromWorkflowResolver implements Resolve<RemoteData<Item>> {
export class ItemFromWorkflowResolver extends SubmissionObjectResolver<Item> implements Resolve<RemoteData<Item>> {
constructor(
private workflowItemService: WorkflowItemDataService,
protected store: Store<any>
) {
super(workflowItemService, store);
}
/**
* Method for resolving an item based on the parameters in the current route
* @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot
* @param {RouterStateSnapshot} state The current RouterStateSnapshot
* @returns Observable<<RemoteData<Item>> Emits the found item based on the parameters in the current route,
* or an error if something went wrong
*/
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<RemoteData<Item>> {
const itemRD$ = this.workflowItemService.findById(route.params.id,
true,
false,
followLink('item'),
).pipe(
getFirstCompletedRemoteData(),
switchMap((wfiRD: RemoteData<WorkflowItem>) => wfiRD.payload.item as Observable<RemoteData<Item>>),
getFirstCompletedRemoteData()
);
return itemRD$;
}
}

View File

@@ -0,0 +1,21 @@
import { Injectable } from '@angular/core';
import { Resolve } from '@angular/router';
import { RemoteData } from '../core/data/remote-data';
import { Item } from '../core/shared/item.model';
import { Store } from '@ngrx/store';
import { SubmissionObjectResolver } from '../core/submission/resolver/submission-object.resolver';
import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service';
/**
* This class represents a resolver that requests a specific item before the route is activated
*/
@Injectable()
export class ItemFromWorkspaceResolver extends SubmissionObjectResolver<Item> implements Resolve<RemoteData<Item>> {
constructor(
private workspaceItemService: WorkspaceitemDataService,
protected store: Store<any>
) {
super(workspaceItemService, store);
}
}

View File

@@ -0,0 +1,8 @@
import { getWorkspaceItemModuleRoute } from '../app-routing-paths';
import { URLCombiner } from '../core/url-combiner/url-combiner';
export function getWorkspaceItemViewRoute(wfiId: string) {
return new URLCombiner(getWorkspaceItemModuleRoute(), wfiId, WORKSPACE_ITEM_VIEW_PATH).toString();
}
export const WORKSPACE_ITEM_VIEW_PATH = 'view';

View File

@@ -4,6 +4,8 @@ import { RouterModule } from '@angular/router';
import { AuthenticatedGuard } from '../core/auth/authenticated.guard';
import { ThemedSubmissionEditComponent } from '../submission/edit/themed-submission-edit.component';
import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver';
import { ThemedFullItemPageComponent } from '../item-page/full/themed-full-item-page.component';
import { ItemFromWorkspaceResolver } from './item-from-workspace.resolver';
@NgModule({
imports: [
@@ -17,7 +19,17 @@ import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.reso
breadcrumb: I18nBreadcrumbResolver
},
data: { title: 'submission.edit.title', breadcrumbKey: 'submission.edit' }
}
},
{
canActivate: [AuthenticatedGuard],
path: ':id/view',
component: ThemedFullItemPageComponent,
resolve: {
dso: ItemFromWorkspaceResolver,
breadcrumb: I18nBreadcrumbResolver
},
data: { title: 'workspace-item.view.title', breadcrumbKey: 'workspace-item.view' }
},
])
]
})

View File

@@ -3,6 +3,7 @@ import { NgModule } from '@angular/core';
import { SharedModule } from '../shared/shared.module';
import { WorkspaceitemsEditPageRoutingModule } from './workspaceitems-edit-page-routing.module';
import { SubmissionModule } from '../submission/submission.module';
import { ItemFromWorkspaceResolver } from './item-from-workspace.resolver';
@NgModule({
imports: [
@@ -11,7 +12,8 @@ import { SubmissionModule } from '../submission/submission.module';
SharedModule,
SubmissionModule,
],
declarations: []
declarations: [],
providers: [ItemFromWorkspaceResolver]
})
/**
* This module handles all modules that need to access the workspaceitems edit page.

View File

@@ -4054,6 +4054,10 @@
"submission.workflow.tasks.pool.show-detail": "Show detail",
"submission.workspace.generic.view": "View",
"submission.workspace.generic.view-help": "Select this option to view the item's metadata.",
"thumbnail.default.alt": "Thumbnail Image",
@@ -4160,6 +4164,9 @@
"workflow-item.view.breadcrumbs": "Workflow View",
"workspace-item.view.breadcrumbs": "Workspace View",
"workspace-item.view.title": "Workspace View",
"idle-modal.header": "Session will expire soon",