debugging issue commit

This commit is contained in:
lotte
2020-04-03 16:00:52 +02:00
parent 258b1228f3
commit 2eb3d11cd2
15 changed files with 233 additions and 32 deletions

View File

@@ -25,8 +25,12 @@ import { Observable } from 'rxjs';
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
import { RemoteData } from '../../../../../core/data/remote-data';
import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators';
import { SearchResult } from '../../../../../shared/search/search-result.model';
import { TaskObject } from '../../../../../core/tasks/models/task-object.model';
import { ClaimedTaskSearchResult } from '../../../../../shared/object-collection/shared/claimed-task-search-result.model';
@listableObjectComponent(PoolTaskSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch)
@listableObjectComponent(ClaimedTaskSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch)
@Component({
selector: 'ds-pool-task-admin-workflow-search-result-grid-element',
styleUrls: ['./pool-task-admin-workflow-search-result-grid-element.component.scss'],
@@ -35,7 +39,7 @@ import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../
/**
* The component for displaying a list element for an pool task search result on the admin search page
*/
export class PoolTaskAdminWorkflowSearchResultGridElementComponent extends SearchResultGridElementComponent<PoolTaskSearchResult, PoolTask> implements OnInit {
export class PoolTaskAdminWorkflowSearchResultGridElementComponent extends SearchResultGridElementComponent<SearchResult<TaskObject>, TaskObject> implements OnInit {
public wfi$: Observable<WorkflowItem>;
ngOnInit(): void {

View File

@@ -1,6 +1,7 @@
<ds-workflow-item-admin-workflow-search-result-list-element
<ds-workflow-item-admin-workflow-list-element
*ngIf="wfi$ | async"
[index]="index"
[object]="wfi$ | async"
[linkType]="linkType"
[listID]="listID"
></ds-workflow-item-admin-workflow-search-result-list-element>
></ds-workflow-item-admin-workflow-list-element>

View File

@@ -4,13 +4,20 @@ import { listableObjectComponent } from '../../../../../shared/object-collection
import { Context } from '../../../../../core/shared/context.model';
import { SearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/search-result-list-element.component';
import { PoolTaskSearchResult } from '../../../../../shared/object-collection/shared/pool-task-search-result.model';
import { PoolTask } from '../../../../../core/tasks/models/pool-task-object.model';
import { Observable, pipe } from 'rxjs';
import { RemoteData } from '../../../../../core/data/remote-data';
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators';
import { ClaimedTaskSearchResult } from '../../../../../shared/object-collection/shared/claimed-task-search-result.model';
import { TaskObject } from '../../../../../core/tasks/models/task-object.model';
import { SearchResult } from '../../../../../shared/search/search-result.model';
import { followLink } from '../../../../../shared/utils/follow-link-config.model';
import { LinkService } from '../../../../../core/cache/builders/link.service';
import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service';
import { tap } from 'rxjs/operators';
@listableObjectComponent(PoolTaskSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch)
@listableObjectComponent(ClaimedTaskSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch)
@Component({
selector: 'ds-pooltask-admin-workflow-search-result-list-element',
styleUrls: ['./pool-task-admin-workflow-search-result-list-element.component.scss'],
@@ -19,11 +26,16 @@ import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../
/**
* The component for displaying a list element for an pool task search result on the admin search page
*/
export class PoolTaskAdminWorkflowSearchResultListElementComponent extends SearchResultListElementComponent<PoolTaskSearchResult, PoolTask> {
export class PoolTaskAdminWorkflowSearchResultListElementComponent extends SearchResultListElementComponent<SearchResult<TaskObject>, TaskObject> {
public wfi$: Observable<WorkflowItem>;
constructor(private linkService: LinkService, protected truncatableService: TruncatableService) {
super(truncatableService);
}
ngOnInit(): void {
super.ngOnInit();
this.dso = this.linkService.resolveLink(this.dso, followLink('workflowitem'));
this.wfi$ = (this.dso.workflowitem as Observable<RemoteData<WorkflowItem>>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload());
}
}

View File

@@ -1,7 +1,8 @@
<div class="workflow-badge">
<span class="badge badge-info">{{ "admin.workflow.item.workflow" | translate }}</span>
</div>
<ds-listable-object-component-loader [object]="object"
<ds-listable-object-component-loader *ngIf="item$ | async"
[object]="item$ | async"
[viewMode]="viewModes.ListElement"
[index]="index"
[linkType]="linkType"

View File

@@ -1,9 +1,15 @@
import { Component } from '@angular/core';
import { Component, OnInit } from '@angular/core';
import { ViewMode } from '../../../../../core/shared/view-mode.model';
import { listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
import { Context } from '../../../../../core/shared/context.model';
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
import { AbstractListableElementComponent } from '../../../../../shared/object-collection/shared/object-collection-element/abstract-listable-element.component';
import { Observable } from 'rxjs';
import { LinkService } from '../../../../../core/cache/builders/link.service';
import { followLink } from '../../../../../shared/utils/follow-link-config.model';
import { RemoteData } from '../../../../../core/data/remote-data';
import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators';
import { Item } from '../../../../../core/shared/item.model';
@listableObjectComponent(WorkflowItem, ViewMode.ListElement, Context.AdminWorkflowSearch)
@Component({
@@ -14,6 +20,15 @@ import { AbstractListableElementComponent } from '../../../../../shared/object-c
/**
* The component for displaying a list element for an workflow item on the admin search page
*/
export class WorkflowItemAdminWorkflowListElementComponent extends AbstractListableElementComponent<WorkflowItem> {
export class WorkflowItemAdminWorkflowListElementComponent extends AbstractListableElementComponent<WorkflowItem> implements OnInit {
public item$: Observable<Item>;
constructor(private linkService: LinkService) {
super();
}
ngOnInit(): void {
this.object = this.linkService.resolveLink(this.object, followLink('item'));
this.item$ = (this.object.item as Observable<RemoteData<Item>>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload());
}
}

View File

@@ -1,7 +1,7 @@
<a [ngClass]="{'btn-sm': small}" class="btn btn-light my-1 delete-link" [routerLink]="[getEditPath()]" [title]="'admin.search.item.delete' | translate">
<a [ngClass]="{'btn-sm': small}" class="btn btn-light my-1 delete-link" [routerLink]="[getDeletePath()]" [title]="'admin.search.item.delete' | translate">
<i class="fa fa-edit"></i><span *ngIf="!small" class="d-none d-sm-inline"> {{"admin.search.item.delete" | translate}}</span>
</a>
<a [ngClass]="{'btn-sm': small}" *ngIf="item && !item.isWithdrawn" class="btn btn-light my-1 send-back-link" [routerLink]="[getWithdrawPath()]" [title]="'admin.search.item.send-back' | translate">
<a [ngClass]="{'btn-sm': small}" class="btn btn-light my-1 send-back-link" [routerLink]="[getSendBackPath()]" [title]="'admin.search.item.send-back' | translate">
<i class="fa fa-ban"></i><span *ngIf="!small" class="d-none d-sm-inline"> {{"admin.search.item.send-back" | translate}}</span>
</a>

View File

@@ -1,8 +1,6 @@
import { Component, Input } from '@angular/core';
import { getItemEditPath } from '../../../+item-page/item-page-routing.module';
import { URLCombiner } from '../../../core/url-combiner/url-combiner';
import { ITEM_EDIT_WITHDRAW_PATH } from '../../../+item-page/edit-item-page/edit-item-page.routing.module';
import { WorkflowItem } from '../../../core/submission/models/workflowitem.model';
import { getWorkflowItemDeletePath, getWorkflowItemSendBackPath } from '../../../+workflowitems-edit-page/workflowitems-edit-page-routing.module';
@Component({
selector: 'ds-workflow-item-admin-workflow-actions-element',
@@ -27,13 +25,13 @@ export class WorkflowItemAdminWorkflowActionsComponent {
* Returns the path to the delete page of this workflow item
*/
getDeletePath(): string {
return getDeletePath(this.wfi.id)
return getWorkflowItemDeletePath(this.wfi.id)
}
/**
* Returns the path to the send back page of this workflow item
*/
getSendBackPath(): string {
return getSendPath(this.wfi.id);
return getWorkflowItemSendBackPath(this.wfi.id);
}
}

View File

@@ -38,7 +38,6 @@ import { ItemVersionHistoryComponent } from './item-version-history/item-version
EditItemPageComponent,
ItemOperationComponent,
AbstractSimpleItemActionComponent,
ModifyItemOverviewComponent,
ItemWithdrawComponent,
ItemReinstateComponent,
ItemPrivateComponent,

View File

@@ -1 +1,6 @@
<ds-modify-item-overview [item]="wfi.item"></ds-modify-item-overview>
<div class="container" *ngVar="item$ | async as item">
<ds-modify-item-overview *ngIf="item" [item]="item"></ds-modify-item-overview>
<button class="btn btn-default" (click)="previousPage()">Cancel</button>
<button class="btn btn-danger" (click)="delete()">Delete</button>
</div>

View File

@@ -1,5 +1,15 @@
import { Component, OnInit } from '@angular/core';
import { WorkflowItem } from '../../core/submission/models/workflowitem.model';
import { Item } from '../../core/shared/item.model';
import { Observable } from 'rxjs';
import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../core/shared/operators';
import { RemoteData } from '../../core/data/remote-data';
import { ActivatedRoute, Data, Router } from '@angular/router';
import { map, switchMap, take } from 'rxjs/operators';
import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service';
import { TranslateService } from '@ngx-translate/core';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { RouteService } from '../../core/services/route.service';
@Component({
selector: 'ds-workflow-item-delete',
@@ -7,10 +17,42 @@ import { WorkflowItem } from '../../core/submission/models/workflowitem.model';
styleUrls: ['./workflow-item-delete.component.scss']
})
export class WorkflowItemDeleteComponent implements OnInit {
wfi: WorkflowItem;
constructor() { }
public wfi$: Observable<WorkflowItem>;
public item$: Observable<Item>;
constructor(private route: ActivatedRoute,
private workflowItemService: WorkflowItemDataService,
private router: Router,
private routeService: RouteService,
private notificationsService: NotificationsService,
private translationService: TranslateService) {
}
ngOnInit() {
this.route.data.subscribe((t) => console.log(t));
this.wfi$ = this.route.data.pipe(map((data: Data) => data.wfi as RemoteData<WorkflowItem>), getRemoteDataPayload());
this.item$ = this.wfi$.pipe(switchMap((wfi: WorkflowItem) => (wfi.item as Observable<RemoteData<Item>>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload())));
}
delete() {
this.wfi$.pipe(
take(1),
switchMap((wfi: WorkflowItem) => this.workflowItemService.delete(wfi.id))
).subscribe((successful: boolean) => {
if (successful) {
const title = this.translationService.get('workflowitem.delete.notification.success.title');
const content = this.translationService.get('workflowitem.delete.notification.success.content');
this.notificationsService.success(title, content)
} else {
const title = this.translationService.get('workflowitem.delete.notification.error.title');
const content = this.translationService.get('workflowitem.delete.notification.error.content');
this.notificationsService.error(title, content)
}
this.previousPage();
})
}
previousPage() {
this.routeService.getPreviousUrl();
}
}

View File

@@ -0,0 +1,35 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { RemoteData } from '../core/data/remote-data';
import { ItemDataService } from '../core/data/item-data.service';
import { Item } from '../core/shared/item.model';
import { hasValue } from '../shared/empty.util';
import { find } from 'rxjs/operators';
import { followLink } from '../shared/utils/follow-link-config.model';
import { WorkflowItemDataService } from '../core/submission/workflowitem-data.service';
import { WorkflowItem } from '../core/submission/models/workflowitem.model';
/**
* This class represents a resolver that requests a specific item before the route is activated
*/
@Injectable()
export class WorkflowItemPageResolver implements Resolve<RemoteData<WorkflowItem>> {
constructor(private workflowItemService: WorkflowItemDataService) {
}
/**
* 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<WorkflowItem>> {
return this.workflowItemService.findById(route.params.id,
followLink('item'),
).pipe(
find((RD) => hasValue(RD.error) || RD.hasSucceeded),
);
}
}

View File

@@ -3,21 +3,64 @@ import { RouterModule } from '@angular/router';
import { AuthenticatedGuard } from '../core/auth/authenticated.guard';
import { SubmissionEditComponent } from '../submission/edit/submission-edit.component';
import { URLCombiner } from '../core/url-combiner/url-combiner';
import { getWorkflowItemModulePath } from '../app-routing.module';
import { WorkflowItemDeleteComponent } from './workflow-item-delete/workflow-item-delete.component';
import { WorkflowItemPageResolver } from './workflow-item-page.resolver';
export function getWorkflowItemPageRoute(wfiId: string) {
return new URLCombiner(getWorkflowItemModulePath(), wfiId).toString();
}
export function getWorkflowItemEditPath(wfiId: string) {
return new URLCombiner(getWorkflowItemModulePath(), wfiId, WORKFLOW_ITEM_EDIT_PATH).toString()
}
export function getWorkflowItemDeletePath(wfiId: string) {
return new URLCombiner(getWorkflowItemModulePath(), wfiId, WORKFLOW_ITEM_DELETE_PATH).toString()
}
export function getWorkflowItemSendBackPath(wfiId: string) {
return new URLCombiner(getWorkflowItemModulePath(), wfiId, WORKFLOW_ITEM_SEND_BACK_PATH).toString()
}
const WORKFLOW_ITEM_EDIT_PATH = 'edit';
const WORKFLOW_ITEM_DELETE_PATH = 'delete';
const WORKFLOW_ITEM_SEND_BACK_PATH = 'sendback';
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', redirectTo: '/home', pathMatch: 'full' },
{
path: ':id',
resolve: { wfi: WorkflowItemPageResolver },
children: [
{
canActivate: [AuthenticatedGuard],
path: ':id/edit',
path: WORKFLOW_ITEM_EDIT_PATH,
component: SubmissionEditComponent,
data: { title: 'submission.edit.title' }
},
{
canActivate: [AuthenticatedGuard],
path: WORKFLOW_ITEM_DELETE_PATH,
component: WorkflowItemDeleteComponent,
data: { title: 'workflow-item.delete.title' }
},
{
canActivate: [AuthenticatedGuard],
path: WORKFLOW_ITEM_SEND_BACK_PATH,
component: WorkflowItemDeleteComponent,
data: { title: 'workflow-item.sendback.title' }
}
])
]
}]
)
],
providers: [WorkflowItemPageResolver]
})
/**
* This module defines the default component to load when navigating to the workflowitems edit page path.
*/
export class WorkflowItemsEditPageRoutingModule { }
export class WorkflowItemsEditPageRoutingModule {
}

View File

@@ -41,6 +41,12 @@ export function getProfileModulePath() {
return `/${PROFILE_MODULE_PATH}`;
}
const WORKFLOW_ITEM_MODULE_PATH = 'workflowitems';
export function getWorkflowItemModulePath() {
return `/${WORKFLOW_ITEM_MODULE_PATH}`;
}
export function getDSOPath(dso: DSpaceObject): string {
switch ((dso as any).type) {
case Community.type.value:
@@ -79,7 +85,7 @@ export function getDSOPath(dso: DSpaceObject): string {
loadChildren: './+workspaceitems-edit-page/workspaceitems-edit-page.module#WorkspaceitemsEditPageModule'
},
{
path: 'workflowitems',
path: WORKFLOW_ITEM_MODULE_PATH,
loadChildren: './+workflowitems-edit-page/workflowitems-edit-page.module#WorkflowItemsEditPageModule'
},
{

View File

@@ -9,10 +9,14 @@ import { DataService } from '../data/data.service';
import { RequestService } from '../data/request.service';
import { WorkflowItem } from './models/workflowitem.model';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { FindListOptions } from '../data/request.models';
import { DeleteByIDRequest, FindListOptions } from '../data/request.models';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { ObjectCacheService } from '../cache/object-cache.service';
import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service';
import { Observable } from 'rxjs';
import { find, map } from 'rxjs/operators';
import { hasValue } from '../../shared/empty.util';
import { RequestEntry } from '../data/request.reducer';
/**
* A service that provides methods to make REST requests with workflowitems endpoint.
@@ -35,4 +39,38 @@ export class WorkflowItemDataService extends DataService<WorkflowItem> {
super();
}
/**
* Delete an existing Workspace Item on the server
* @param id The Workspace Item's id to be removed
* @return an observable that emits true when the deletion was successful, false when it failed
*/
delete(id: string): Observable<boolean> {
return this.deleteWFI(id, true)
}
sendBack(id: string): Observable<boolean> {
return this.deleteWFI(id, false)
}
private deleteWFI(id: string, expunge: boolean): Observable<boolean> {
const requestId = this.requestService.generateRequestId();
const hrefObs = this.halService.getEndpoint(this.linkPath).pipe(
map((endpoint: string) => this.getIDHref(endpoint, id)),
map((endpoint: string) => endpoint + '?expunge=' + expunge)
);
hrefObs.pipe(
find((href: string) => hasValue(href)),
map((href: string) => {
const request = new DeleteByIDRequest(requestId, href, id);
this.requestService.configure(request);
})
).subscribe();
return this.requestService.getByUUID(requestId).pipe(
find((request: RequestEntry) => request.completed),
map((request: RequestEntry) => request.response.isSuccessful)
);
}
}

View File

@@ -186,6 +186,7 @@ import { LogInPasswordComponent } from './log-in/methods/password/log-in-passwor
import { LogInComponent } from './log-in/log-in.component';
import { MissingTranslationHelper } from './translate/missing-translation.helper';
import { ItemVersionsNoticeComponent } from './item/item-versions/notice/item-versions-notice.component';
import { ModifyItemOverviewComponent } from '../+item-page/edit-item-page/modify-item-overview/modify-item-overview.component';
const MODULES = [
// Do NOT include UniversalModule, HttpModule, or JsonpModule here
@@ -357,7 +358,8 @@ const COMPONENTS = [
LogInContainerComponent,
ItemVersionsComponent,
PublicationSearchResultListElementComponent,
ItemVersionsNoticeComponent
ItemVersionsNoticeComponent,
ModifyItemOverviewComponent,
];
const ENTRY_COMPONENTS = [