diff --git a/src/app/core/data/version-history-data.service.ts b/src/app/core/data/version-history-data.service.ts index 66a166d764..86c678335c 100644 --- a/src/app/core/data/version-history-data.service.ts +++ b/src/app/core/data/version-history-data.service.ts @@ -170,7 +170,7 @@ export class VersionHistoryDataService extends DataService { */ hasDraftVersion$(versionHref: string): Observable { return this.versionDataService.findByHref(versionHref, true, true, followLink('versionhistory')).pipe( - take(1), + getFirstCompletedRemoteData(), switchMap((res) => { if (res.hasSucceeded && !res.hasNoContent) { return of(res).pipe( diff --git a/src/app/core/submission/workspaceitem-data.service.ts b/src/app/core/submission/workspaceitem-data.service.ts index 8ed2aa2788..2813398bb5 100644 --- a/src/app/core/submission/workspaceitem-data.service.ts +++ b/src/app/core/submission/workspaceitem-data.service.ts @@ -43,14 +43,18 @@ export class WorkspaceitemDataService extends DataService { * Return the WorkspaceItem object found through the UUID of an item * * @param uuid The uuid of the item + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale * @param options The {@link FindListOptions} object * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved */ - public findByItem(uuid: string, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable> { + public findByItem(uuid: string, useCachedVersionIfAvailable = false, reRequestOnStale = true, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable> { const findListOptions = new FindListOptions(); findListOptions.searchParams = [new RequestParam('uuid', encodeURIComponent(uuid))]; const href$ = this.getSearchByHref(this.searchByItemLinkPath, findListOptions, ...linksToFollow); - return this.findByHref(href$, false, true, ...linksToFollow); + return this.findByHref(href$, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } } diff --git a/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.html b/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.html index eed81441ab..e69de29bb2 100644 --- a/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.html +++ b/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.html @@ -1 +0,0 @@ -

versioned-item works!

diff --git a/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.ts b/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.ts index ecf7a1119c..5eabf49610 100644 --- a/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.ts +++ b/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.ts @@ -4,7 +4,7 @@ import { ItemVersionsSummaryModalComponent } from '../../../../shared/item/item- import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../../../core/shared/operators'; import { RemoteData } from '../../../../core/data/remote-data'; import { Version } from '../../../../core/shared/version.model'; -import { switchMap } from 'rxjs/operators'; +import { switchMap, tap } from 'rxjs/operators'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service'; import { TranslateService } from '@ngx-translate/core'; @@ -58,11 +58,15 @@ export class VersionedItemComponent extends ItemComponent { // On createVersionEvent emitted create new version and notify activeModal.componentInstance.createVersionEvent.pipe( - switchMap((summary: string) => this.itemVersionShared.createNewVersionAndNotify(item, summary)), + switchMap((summary: string) => this.versionHistoryService.createVersion(item._links.self.href, summary)), + getFirstCompletedRemoteData(), + // show success/failure notification + tap((res: RemoteData) => { this.itemVersionShared.notifyCreateNewVersion(res); }), getFirstSucceededRemoteDataPayload(), + // get workspace item switchMap((newVersion: Version) => this.itemService.findByHref(newVersion._links.item.href)), getFirstSucceededRemoteDataPayload(), - switchMap((newVersionItem: Item) => this.workspaceitemDataService.findByItem(newVersionItem.uuid)), + switchMap((newVersionItem: Item) => this.workspaceitemDataService.findByItem(newVersionItem.uuid, true, false)), getFirstSucceededRemoteDataPayload(), ).subscribe((wsItem) => { const wsiId = wsItem.id; diff --git a/src/app/shared/item/item-versions/item-versions-shared.service.ts b/src/app/shared/item/item-versions/item-versions-shared.service.ts index 352d15c7bd..0b5b247beb 100644 --- a/src/app/shared/item/item-versions/item-versions-shared.service.ts +++ b/src/app/shared/item/item-versions/item-versions-shared.service.ts @@ -35,13 +35,20 @@ export class ItemVersionsSharedService { return this.versionHistoryService.createVersion(item._links.self.href, summary).pipe( switchMap((postResult: RemoteData) => { const newVersionNumber = postResult?.payload?.version; - this.notifyCreateNewVersion(postResult.hasSucceeded, postResult.statusCode, newVersionNumber); + this.notifyCreateNewVersionBak(postResult.hasSucceeded, postResult.statusCode, newVersionNumber); return of(postResult); }) ); } - private notifyCreateNewVersion(success: boolean, statusCode: number, newVersionNumber: number) { + public notifyCreateNewVersion(newVersionRD: RemoteData) { + const newVersionNumber = newVersionRD?.payload?.version; + newVersionRD.hasSucceeded ? + this.notificationsService.success(null, this.translateService.get(ItemVersionsSharedService.msg('success'), {version: newVersionNumber})) : + this.notificationsService.error(null, this.translateService.get(ItemVersionsSharedService.msg(newVersionRD?.statusCode === 422 ? 'inProgress' : 'failure'))); + } + + private notifyCreateNewVersionBak(success: boolean, statusCode: number, newVersionNumber: number) { // TODO delete this success ? this.notificationsService.success(null, this.translateService.get(ItemVersionsSharedService.msg('success'), {version: newVersionNumber})) : this.notificationsService.error(null, this.translateService.get(ItemVersionsSharedService.msg(statusCode === 422 ? 'inProgress' : 'failure'))); diff --git a/src/app/shared/item/item-versions/item-versions.component.html b/src/app/shared/item/item-versions/item-versions.component.html index 2a00606a8d..7e8a376962 100644 --- a/src/app/shared/item/item-versions/item-versions.component.html +++ b/src/app/shared/item/item-versions/item-versions.component.html @@ -25,8 +25,20 @@ - {{version.version}} - * +
+ +
+ + + +
+
diff --git a/src/app/shared/item/item-versions/item-versions.component.ts b/src/app/shared/item/item-versions/item-versions.component.ts index f078640269..a1367c180a 100644 --- a/src/app/shared/item/item-versions/item-versions.component.ts +++ b/src/app/shared/item/item-versions/item-versions.component.ts @@ -45,6 +45,8 @@ import { Router } from '@angular/router'; import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; import { ItemVersionsSharedService } from './item-versions-shared.service'; +import { WorkspaceItem } from '../../../core/submission/models/workspaceitem.model'; +import { WorkspaceitemDataService } from '../../../core/submission/workspaceitem-data.service'; @Component({ selector: 'ds-item-versions', @@ -170,6 +172,7 @@ export class ItemVersionsComponent implements OnInit { private router: Router, private itemVersionShared: ItemVersionsSharedService, private authorizationService: AuthorizationDataService, + private workspaceItemDataService: WorkspaceitemDataService, ) { } @@ -379,6 +382,30 @@ export class ItemVersionsComponent implements OnInit { }); } + /** + * Get the ID of the workspace item, if present, otherwise return undefined + * @param versionItem the item for which retrieve the workspace item id + */ + getDraftId(versionItem): Observable { + return versionItem.pipe( + getFirstSucceededRemoteDataPayload(), + map((item: Item) => item.uuid), + switchMap((itemUuid: string) => this.workspaceItemDataService.findByItem(itemUuid, true)), + getFirstCompletedRemoteData(), + map((res: RemoteData) => res?.payload?.id ), + ); + } + + /** + * redirect to the edit page of the workspace item + * @param id$ the id of the workspace item + */ + editWorkspaceItem(id$: Observable) { + id$.subscribe((id) => { + this.router.navigateByUrl('workspaceitems/' + id + '/edit'); + }); + } + /** * Initialize all observables */ @@ -399,6 +426,7 @@ export class ItemVersionsComponent implements OnInit { getFirstSucceededRemoteDataPayload(), map((res) => Boolean(res?.draftVersion)), ); + this.createVersionTitle$ = this.hasDraftVersion$.pipe( take(1), switchMap((res) => of(res ? 'item.version.history.table.action.hasDraft' : 'item.version.history.table.action.newVersion')) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 7a7b4102dd..bbaa570e8b 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1981,6 +1981,8 @@ "item.version.history.table.summary": "Summary", + "item.version.history.table.workspaceItem": "Workspace item", + "item.version.history.table.actions": "Action",