diff --git a/src/app/core/tasks/claimed-task-data.service.ts b/src/app/core/tasks/claimed-task-data.service.ts index 99c2f51117..b9c7e9ee54 100644 --- a/src/app/core/tasks/claimed-task-data.service.ts +++ b/src/app/core/tasks/claimed-task-data.service.ts @@ -20,6 +20,7 @@ import { followLink } from '../../shared/utils/follow-link-config.model'; import { FindListOptions } from '../data/request.models'; import { RequestParam } from '../cache/models/request-param.model'; import { HttpOptions } from '../dspace-rest/dspace-rest.service'; +import { getFirstSucceededRemoteData } from '../shared/operators'; /** * The service handling all REST requests for ClaimedTask @@ -28,7 +29,7 @@ import { HttpOptions } from '../dspace-rest/dspace-rest.service'; @dataService(CLAIMED_TASK) export class ClaimedTaskDataService extends TasksService { - protected responseMsToLive = 10 * 1000; + protected responseMsToLive = 1000; /** * The endpoint link name @@ -68,6 +69,8 @@ export class ClaimedTaskDataService extends TasksService { * Emit the server response */ public claimTask(scopeId: string, poolTaskHref: string): Observable { + console.log('=========================================='); + console.log('User ClaimTask request for:', scopeId, poolTaskHref); const options: HttpOptions = Object.create({}); let headers = new HttpHeaders(); headers = headers.append('Content-Type', 'text/uri-list'); @@ -98,6 +101,8 @@ export class ClaimedTaskDataService extends TasksService { * Emit the server response */ public returnToPoolTask(scopeId: string): Observable { + console.log('=========================================='); + console.log('User ReturnToPool request for:', scopeId); return this.deleteById(this.linkPath, scopeId, this.makeHttpOptions()); } @@ -109,11 +114,13 @@ export class ClaimedTaskDataService extends TasksService { * The server response */ public findByItem(uuid: string): Observable> { + console.log('claimedTaskService findByItem', uuid); const options = new FindListOptions(); options.searchParams = [ new RequestParam('uuid', uuid) ]; - return this.searchTask('findByItem', options, followLink('workflowitem')); + return this.searchTask('findByItem', options, followLink('workflowitem')) + .pipe(getFirstSucceededRemoteData()); } } diff --git a/src/app/core/tasks/pool-task-data.service.ts b/src/app/core/tasks/pool-task-data.service.ts index 78348d428f..26eb3e6dad 100644 --- a/src/app/core/tasks/pool-task-data.service.ts +++ b/src/app/core/tasks/pool-task-data.service.ts @@ -18,6 +18,7 @@ import { RemoteData } from '../data/remote-data'; import { followLink } from '../../shared/utils/follow-link-config.model'; import { FindListOptions } from '../data/request.models'; import { RequestParam } from '../cache/models/request-param.model'; +import { getFirstSucceededRemoteData } from '../shared/operators'; /** * The service handling all REST requests for PoolTask @@ -31,7 +32,7 @@ export class PoolTaskDataService extends TasksService { */ protected linkPath = 'pooltasks'; - protected responseMsToLive = 10 * 1000; + protected responseMsToLive = 1000; /** * Initialize instance variables @@ -70,7 +71,8 @@ export class PoolTaskDataService extends TasksService { options.searchParams = [ new RequestParam('uuid', uuid) ]; - return this.searchTask('findByItem', options, followLink('workflowitem')); + return this.searchTask('findByItem', options, followLink('workflowitem')) + .pipe(getFirstSucceededRemoteData()); } /** diff --git a/src/app/core/tasks/tasks.service.ts b/src/app/core/tasks/tasks.service.ts index ed58eb920e..8032238c45 100644 --- a/src/app/core/tasks/tasks.service.ts +++ b/src/app/core/tasks/tasks.service.ts @@ -13,7 +13,7 @@ import { } from '../data/request.models'; import { hasValue, isNotEmpty } from '../../shared/empty.util'; import { ProcessTaskResponse } from './models/process-task-response'; -import { getFirstCompletedRemoteData } from '../shared/operators'; +import {getFirstCompletedRemoteData, getFirstSucceededRemoteData} from '../shared/operators'; import { CacheableObject } from '../cache/object-cache.reducer'; import { RemoteData } from '../data/remote-data'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; @@ -140,7 +140,11 @@ export abstract class TasksService extends DataServic const hrefObs = this.getSearchByHref(searchMethod, options, ...linksToFollow); return hrefObs.pipe( find((href: string) => hasValue(href)), - switchMap((href) => this.findByHref(href)) + switchMap((href) => this.findByHref(href).pipe( + getFirstSucceededRemoteData(), + tap(() => { + this.requestService.setStaleByHrefSubstring(searchMethod) + }))), ); } } diff --git a/src/app/shared/mydspace-actions/claimed-task/abstract/claimed-task-actions-abstract.component.ts b/src/app/shared/mydspace-actions/claimed-task/abstract/claimed-task-actions-abstract.component.ts index b9a424c57f..6b3bf0a20b 100644 --- a/src/app/shared/mydspace-actions/claimed-task/abstract/claimed-task-actions-abstract.component.ts +++ b/src/app/shared/mydspace-actions/claimed-task/abstract/claimed-task-actions-abstract.component.ts @@ -1,4 +1,4 @@ -import { Injector } from '@angular/core'; +import {Injector, OnDestroy} from '@angular/core'; import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; import { ClaimedTaskDataService } from '../../../../core/tasks/claimed-task-data.service'; import { DSpaceObject} from '../../../../core/shared/dspace-object.model'; @@ -10,7 +10,7 @@ import { RequestService} from '../../../../core/data/request.service'; import { Observable} from 'rxjs'; import { RemoteData} from '../../../../core/data/remote-data'; import { WorkflowItem} from '../../../../core/submission/models/workflowitem.model'; -import { switchMap } from 'rxjs/operators'; +import {switchMap, take} from 'rxjs/operators'; import { CLAIMED_TASK } from '../../../../core/tasks/models/claimed-task-object.resource-type'; import { getFirstSucceededRemoteDataPayload } from '../../../../core/shared/operators'; import { Item } from '../../../../core/shared/item.model'; @@ -23,7 +23,7 @@ import { MyDSpaceReloadableActionsComponent } from '../../mydspace-reloadable-ac * - Add a @rendersWorkflowTaskOption annotation to your component providing the same enum value * - Optionally overwrite createBody if the request body requires more than just the option */ -export abstract class ClaimedTaskActionsAbstractComponent extends MyDSpaceReloadableActionsComponent { +export abstract class ClaimedTaskActionsAbstractComponent extends MyDSpaceReloadableActionsComponent implements OnDestroy { /** * The workflow task option the child component represents @@ -37,6 +37,8 @@ export abstract class ClaimedTaskActionsAbstractComponent extends MyDSpaceReload */ itemUuid: string; + subs = []; + protected constructor(protected injector: Injector, protected router: Router, protected notificationsService: NotificationsService, @@ -50,7 +52,7 @@ export abstract class ClaimedTaskActionsAbstractComponent extends MyDSpaceReload * Submit the action on the claimed object. */ submitTask() { - this.startActionExecution().subscribe(); + this.subs.push(this.startActionExecution().pipe(take(1)).subscribe()); } /** @@ -82,13 +84,17 @@ export abstract class ClaimedTaskActionsAbstractComponent extends MyDSpaceReload if (!(this.object as any).workflowitem) { return; } - this.object.workflowitem.pipe( + this.subs.push(this.object.workflowitem.pipe( getFirstSucceededRemoteDataPayload(), switchMap((workflowItem: WorkflowItem) => workflowItem.item.pipe(getFirstSucceededRemoteDataPayload()) )) .subscribe((item: Item) => { this.itemUuid = item.uuid; - }) + })); + } + + ngOnDestroy() { + this.subs.forEach((sub) => sub.unsubscribe()); } } diff --git a/src/app/shared/mydspace-actions/claimed-task/claimed-task-actions.component.ts b/src/app/shared/mydspace-actions/claimed-task/claimed-task-actions.component.ts index c82154af09..ae801c7586 100644 --- a/src/app/shared/mydspace-actions/claimed-task/claimed-task-actions.component.ts +++ b/src/app/shared/mydspace-actions/claimed-task/claimed-task-actions.component.ts @@ -1,8 +1,8 @@ -import { Component, Injector, Input, OnInit } from '@angular/core'; +import {Component, Injector, Input, OnDestroy, OnInit} from '@angular/core'; import { Router } from '@angular/router'; import { Observable } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; +import { filter, map, take } from 'rxjs/operators'; import { TranslateService } from '@ngx-translate/core'; import { ClaimedTaskDataService } from '../../../core/tasks/claimed-task-data.service'; @@ -26,7 +26,7 @@ import { WORKFLOW_TASK_OPTION_RETURN_TO_POOL } from './return-to-pool/claimed-ta styleUrls: ['./claimed-task-actions.component.scss'], templateUrl: './claimed-task-actions.component.html', }) -export class ClaimedTaskActionsComponent extends MyDSpaceActionsComponent implements OnInit { +export class ClaimedTaskActionsComponent extends MyDSpaceActionsComponent implements OnInit, OnDestroy { /** * The ClaimedTask object @@ -87,7 +87,8 @@ export class ClaimedTaskActionsComponent extends MyDSpaceActionsComponent>).pipe( filter((rd: RemoteData) => ((!rd.isRequestPending) && isNotUndefined(rd.payload))), - map((rd: RemoteData) => rd.payload)); + map((rd: RemoteData) => rd.payload), + take(1)); } /** @@ -99,4 +100,8 @@ export class ClaimedTaskActionsComponent extends MyDSpaceActionsComponent | DSpaceObject> { - return this.poolTaskService.findByItem(this.itemUuid); + return this.poolTaskService.findByItem(this.itemUuid).pipe(take(1), tap((value) => { + console.log('The new PoolTask (found by item) is:', value); + })); } actionExecution(): Observable { diff --git a/src/app/shared/mydspace-actions/mydspace-actions.ts b/src/app/shared/mydspace-actions/mydspace-actions.ts index 373cab9d35..2307f8a430 100644 --- a/src/app/shared/mydspace-actions/mydspace-actions.ts +++ b/src/app/shared/mydspace-actions/mydspace-actions.ts @@ -82,6 +82,8 @@ export abstract class MyDSpaceActionsComponent) => rd.hasSucceeded) @@ -115,6 +119,8 @@ export abstract class MyDSpaceActionsComponent { +export class PoolTaskActionsComponent extends MyDSpaceReloadableActionsComponent implements OnDestroy { /** * The PoolTask object @@ -45,6 +46,8 @@ export class PoolTaskActionsComponent extends MyDSpaceReloadableActionsComponent */ public itemUuid: string; + subs = []; + /** * Initialize instance variables * @@ -69,7 +72,7 @@ export class PoolTaskActionsComponent extends MyDSpaceReloadableActionsComponent * Claim the task. */ claim() { - this.startActionExecution().subscribe(); + this.subs.push(this.startActionExecution().pipe(take(1)).subscribe()); } /** @@ -81,7 +84,8 @@ export class PoolTaskActionsComponent extends MyDSpaceReloadableActionsComponent this.object = object; this.workflowitem$ = (this.object.workflowitem as Observable>).pipe( filter((rd: RemoteData) => ((!rd.isRequestPending) && isNotUndefined(rd.payload))), - map((rd: RemoteData) => rd.payload)); + map((rd: RemoteData) => rd.payload), + take(1)); } actionExecution(): Observable { @@ -92,7 +96,9 @@ export class PoolTaskActionsComponent extends MyDSpaceReloadableActionsComponent } reloadObjectExecution(): Observable | DSpaceObject> { - return this.claimedTaskService.findByItem(this.itemUuid); + return this.claimedTaskService.findByItem(this.itemUuid).pipe(take(1), tap((value) => { + console.log('The new ClaimTask (found by item) is:', value); + })); } /** @@ -108,4 +114,9 @@ export class PoolTaskActionsComponent extends MyDSpaceReloadableActionsComponent }) } + ngOnDestroy() { + this.subs.forEach((sub) => sub.unsubscribe()); + console.log('Destroy of PoolTaskActionsComponent', this.object) + } + } diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts index 175bdebbab..ee64c63ca5 100644 --- a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts +++ b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts @@ -135,6 +135,8 @@ export class ListableObjectComponentLoaderComponent implements OnInit, OnDestroy if ((componentRef.instance as any).reloadedObject) { this.subs.push((componentRef.instance as any).reloadedObject.subscribe((reloadedObject: DSpaceObject) => { if (reloadedObject) { + console.log('Reloaded Object from/to', this.object, reloadedObject); + this.object = reloadedObject; this.instantiateComponent(reloadedObject); } }));