diff --git a/src/app/core/data/version-data.service.ts b/src/app/core/data/version-data.service.ts index b1e27fde9a..1c6bc9e702 100644 --- a/src/app/core/data/version-data.service.ts +++ b/src/app/core/data/version-data.service.ts @@ -11,7 +11,7 @@ import { NotificationsService } from '../../shared/notifications/notifications.s import { HttpClient } from '@angular/common/http'; import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; import { FindListOptions } from './request.models'; -import { Observable } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { dataService } from '../cache/builders/build-decorators'; import { VERSION } from '../shared/version.resource-type'; import { VersionHistory } from '../shared/version-history.model'; @@ -51,11 +51,11 @@ export class VersionDataService extends DataService { * @param version */ getHistoryFromVersion$(version: Version): Observable { - return this.findById(version.id, false, true, followLink('versionhistory')).pipe( + return version ? this.findById(version.id, false, true, followLink('versionhistory')).pipe( getFirstSucceededRemoteDataPayload(), switchMap((res) => res.versionhistory), getFirstSucceededRemoteDataPayload(), - ); + ) : of(null); } /** diff --git a/src/app/core/data/version-history-data.service.ts b/src/app/core/data/version-history-data.service.ts index a18ef984ff..66a166d764 100644 --- a/src/app/core/data/version-history-data.service.ts +++ b/src/app/core/data/version-history-data.service.ts @@ -16,7 +16,7 @@ import { PaginatedSearchOptions } from '../../shared/search/paginated-search-opt import { RemoteData } from './remote-data'; import { PaginatedList } from './paginated-list.model'; import { Version } from '../shared/version.model'; -import { filter, map, startWith, switchMap, take } from 'rxjs/operators'; +import { filter, map, switchMap, take } from 'rxjs/operators'; import { dataService } from '../cache/builders/build-decorators'; import { VERSION_HISTORY } from '../shared/version-history.resource-type'; import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; @@ -138,40 +138,50 @@ export class VersionHistoryDataService extends DataService { } /** - * Get the latest version + * Get the latest version (return null if the specified version is null) * @param version */ getLatestVersion$(version: Version): Observable { // retrieve again version, including with versionHistory - return this.versionDataService.findById(version.id, false, true, followLink('versionhistory')).pipe( + return version.id ? this.versionDataService.findById(version.id, false, true, followLink('versionhistory')).pipe( getFirstSucceededRemoteDataPayload(), switchMap((res) => res.versionhistory), getFirstSucceededRemoteDataPayload(), switchMap((versionHistoryRD) => this.getLatestVersionFromHistory$(versionHistoryRD)), - ); + ) : of(null); } /** - * Check if the given version is the latest + * Check if the given version is the latest (return null if `version` is null) * @param version + * @returns `true` if the specified version is the latest one, `false` otherwise, or `null` if the specified version is null */ isLatest$(version: Version): Observable { - return this.getLatestVersion$(version).pipe( + return version ? this.getLatestVersion$(version).pipe( take(1), switchMap((latestVersion) => of(version.version === latestVersion.version)) - ); + ) : of(null); } /** - * Check if a worskpace item exists in the version history + * Check if a worskpace item exists in the version history (return null if there is no version history) * @param versionHref the href of the version + * @returns `true` if a workspace item exists, `false` otherwise, or `null` if a version history does not exist */ hasDraftVersion$(versionHref: string): Observable { return this.versionDataService.findByHref(versionHref, true, true, followLink('versionhistory')).pipe( - getFirstSucceededRemoteDataPayload(), - switchMap((version) => this.versionDataService.getHistoryFromVersion$(version)), - map((versionHistory) => versionHistory.draftVersion), - startWith(false), + take(1), + switchMap((res) => { + if (res.hasSucceeded && !res.hasNoContent) { + return of(res).pipe( + getFirstSucceededRemoteDataPayload(), + switchMap((version) => this.versionDataService.getHistoryFromVersion$(version)), + map((versionHistory) => versionHistory ? versionHistory.draftVersion : false), + ); + } else { + return of(false); + } + }), ); } diff --git a/src/app/core/submission/workspaceitem-data.service.ts b/src/app/core/submission/workspaceitem-data.service.ts index 2fc95bdd00..8ed2aa2788 100644 --- a/src/app/core/submission/workspaceitem-data.service.ts +++ b/src/app/core/submission/workspaceitem-data.service.ts @@ -12,6 +12,11 @@ import { NotificationsService } from '../../shared/notifications/notifications.s import { ObjectCacheService } from '../cache/object-cache.service'; import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service'; import { WorkspaceItem } from './models/workspaceitem.model'; +import { Observable } from 'rxjs'; +import { RemoteData } from '../data/remote-data'; +import { FindListOptions } from '../data/request.models'; +import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; +import { RequestParam } from '../cache/models/request-param.model'; /** * A service that provides methods to make REST requests with workspaceitems endpoint. @@ -20,6 +25,7 @@ import { WorkspaceItem } from './models/workspaceitem.model'; @dataService(WorkspaceItem.type) export class WorkspaceitemDataService extends DataService { protected linkPath = 'workspaceitems'; + protected searchByItemLinkPath = 'item'; constructor( protected comparator: DSOChangeAnalyzer, @@ -33,4 +39,18 @@ export class WorkspaceitemDataService extends DataService { super(); } + /** + * Return the WorkspaceItem object found through the UUID of an item + * + * @param uuid The uuid of the item + * @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> { + 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); + } + } 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 13cab84902..5ea0b13b29 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 @@ -1,15 +1,21 @@ import { Component } from '@angular/core'; import { ItemComponent } from '../shared/item.component'; import { ItemVersionsSummaryModalComponent } from '../../../../shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component'; -import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; +import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../../../core/shared/operators'; import { RemoteData } from '../../../../core/data/remote-data'; import { Version } from '../../../../core/shared/version.model'; -import { switchMap, take } from 'rxjs/operators'; +import { switchMap } 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'; import { VersionDataService } from '../../../../core/data/version-data.service'; import { ItemVersionsSharedService } from '../../../../shared/item/item-versions/item-versions-shared.service'; +import { Router } from '@angular/router'; +import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service'; +import { SearchService } from '../../../../core/shared/search/search.service'; +import { Item } from '../../../../core/shared/item.model'; +import { ItemDataService } from '../../../../core/data/item-data.service'; +import { WorkspaceItem } from '../../../../core/submission/models/workspaceitem.model'; @Component({ selector: 'ds-versioned-item', @@ -24,6 +30,10 @@ export class VersionedItemComponent extends ItemComponent { private translateService: TranslateService, private versionService: VersionDataService, private itemVersionShared: ItemVersionsSharedService, + private router: Router, + private workspaceitemDataService: WorkspaceitemDataService, + private searchService: SearchService, + private itemService: ItemDataService, ) { super(); } @@ -49,7 +59,17 @@ 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)), - take(1) - ).subscribe(); + getFirstSucceededRemoteDataPayload(), + switchMap((newVersion: Version) => this.itemService.findByHref(newVersion._links.item.href)), + getFirstSucceededRemoteDataPayload(), + switchMap((newVersionItem: Item) => this.workspaceitemDataService.findByItem(newVersionItem.uuid)), + getFirstSucceededRemoteDataPayload(), + ).subscribe((wsItem) => { + const wsiId = wsItem.id; + console.log(wsiId); + const route = 'workspaceitems/' + wsiId + '/edit'; + this.router.navigateByUrl(route); + }); + } } diff --git a/src/app/shared/dso-page/dso-page-version-button/dso-page-version-button.component.html b/src/app/shared/dso-page/dso-page-version-button/dso-page-version-button.component.html index a46b48244a..0e2e35dcb7 100644 --- a/src/app/shared/dso-page/dso-page-version-button/dso-page-version-button.component.html +++ b/src/app/shared/dso-page/dso-page-version-button/dso-page-version-button.component.html @@ -1,7 +1,7 @@