diff --git a/src/app/core/data/version-history-data.service.ts b/src/app/core/data/version-history-data.service.ts index 9bcedd6372..65bef94c6c 100644 --- a/src/app/core/data/version-history-data.service.ts +++ b/src/app/core/data/version-history-data.service.ts @@ -11,18 +11,26 @@ import { NotificationsService } from '../../shared/notifications/notifications.s import { HttpClient, HttpHeaders } from '@angular/common/http'; import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; import { FindListOptions, PostRequest, RestRequest } from './request.models'; -import { Observable } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { PaginatedSearchOptions } from '../../shared/search/paginated-search-options.model'; import { RemoteData } from './remote-data'; import { PaginatedList } from './paginated-list.model'; import { Version } from '../shared/version.model'; -import { map, 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 { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; +import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { VersionDataService } from './version-data.service'; import { HttpOptions } from '../dspace-rest/dspace-rest.service'; -import { getFirstCompletedRemoteData, sendRequest } from '../shared/operators'; +import { + getAllSucceededRemoteData, + getFirstCompletedRemoteData, + getFirstSucceededRemoteDataPayload, + getRemoteDataPayload, + sendRequest +} from '../shared/operators'; +import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; +import { hasValueOperator } from '../../shared/empty.util'; /** * Service responsible for handling requests related to the VersionHistory object @@ -97,4 +105,42 @@ export class VersionHistoryDataService extends DataService { getFirstCompletedRemoteData() ) as Observable>; } + + getLatestVersionFromHistory$(versionHistory: VersionHistory): Observable { + + // Pagination options to fetch a single version on the first page (this is the latest version in the history) + const latestVersionOptions = Object.assign(new PaginationComponentOptions(), { + id: 'item-newest-version-options', + currentPage: 1, + pageSize: 1 + }); + + const latestVersionSearch = new PaginatedSearchOptions({pagination: latestVersionOptions}); + + return this.getVersions(versionHistory.id, latestVersionSearch, true, true, followLink('item')).pipe( + getAllSucceededRemoteData(), + getRemoteDataPayload(), + hasValueOperator(), + filter((versions) => versions.page.length > 0), + map((versions) => versions.page[0]) + ); + + } + + getLatestVersion$(version: Version): Observable { + return version.versionhistory.pipe( + getFirstSucceededRemoteDataPayload(), + switchMap((versionHistoryRD) => + this.getLatestVersionFromHistory$(versionHistoryRD) + ), + ); + } + + isLatest$(version: Version): Observable { + return this.getLatestVersion$(version).pipe( + take(1), + switchMap((latestVersion) => of(version.version === latestVersion.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 2e26695d82..4fe56622d6 100644 --- a/src/app/shared/item/item-versions/item-versions.component.ts +++ b/src/app/shared/item/item-versions/item-versions.component.ts @@ -233,7 +233,7 @@ export class ItemVersionsComponent implements OnInit { * Deletes the specified version * @param version the version to be deleted */ - deleteVersion(version) { + deleteVersion(version: Version) { const successMessageKey = 'item.version.delete.notification.success'; const failureMessageKey = 'item.version.delete.notification.failure'; const versionNumber = version.version; @@ -245,8 +245,49 @@ export class ItemVersionsComponent implements OnInit { // On modal submit/dismiss activeModal.result.then(() => { - version.item.pipe(getFirstSucceededRemoteDataPayload()).subscribe((getItemRes) => { - this.itemService.delete(getItemRes.id).pipe(getFirstCompletedRemoteData()).subscribe( + console.log('Deleting item...'); + + version.item.pipe( + getFirstSucceededRemoteDataPayload(), + map((item) => item.id), + switchMap((itemId) => this.itemService.delete(itemId)), + getFirstCompletedRemoteData() + ).subscribe( + (deleteItemRes) => { + console.log('DELETE: ' + JSON.stringify(deleteItemRes)); + if (deleteItemRes.hasSucceeded) { + this.notificationsService.success(null, this.translateService.get(successMessageKey, {'version': versionNumber})); + this.refreshSubject.next(null); + } else { + this.notificationsService.error(null, this.translateService.get(failureMessageKey, {'version': versionNumber})); + } + } + ); + + + /* + const itemVersion$ = item.version; + const isLatest$ = item.version.pipe( + getFirstSucceededRemoteDataPayload(), + map( (itemVersion) => this.versionHistoryService.isLatest$(itemVersion)) + ); + + */ + + + // FUNZIONANTE: + + /*version.item.pipe(getFirstSucceededRemoteDataPayload()).subscribe((getItemRes) => { + const itemId = getItemRes.id; + + const isLatest$ = this.itemService.findById(itemId, true,true, followLink('version')).pipe( + getFirstSucceededRemoteDataPayload(), + switchMap( (item) => item.version ), + getFirstSucceededRemoteDataPayload(), + map( (itemVersion) => this.versionHistoryService.isLatest$(itemVersion)) + ); + + this.itemService.delete(itemId).pipe(getFirstCompletedRemoteData()).subscribe( (deleteItemRes) => { console.log(JSON.stringify(deleteItemRes)); if (deleteItemRes.hasSucceeded) { @@ -257,23 +298,8 @@ export class ItemVersionsComponent implements OnInit { } } ); - }); - // TODO non usare subscribe annidate - /*version.item.pipe( - getFirstSucceededRemoteDataPayload(), - switchMap((getItemRes) => this.itemService.delete(getItemRes.id)) - ).subscribe( - getFirstCompletedRemoteData(), - map((deleteItemRes) => { - console.log(JSON.stringify(deleteItemRes)); - if (deleteItemRes.hasSucceeded) { - this.notificationsService.success(null, this.translateService.get(successMessageKey, {'version': versionNumber})); - } else { - this.notificationsService.warning(null, this.translateService.get(failureMessageKey, {'version': versionNumber})); - } - } - ) - );*/ + });*/ + }); } diff --git a/src/app/shared/item/item-versions/notice/item-versions-notice.component.ts b/src/app/shared/item/item-versions/notice/item-versions-notice.component.ts index 2fd39b661c..001d5ad97d 100644 --- a/src/app/shared/item/item-versions/notice/item-versions-notice.component.ts +++ b/src/app/shared/item/item-versions/notice/item-versions-notice.component.ts @@ -2,13 +2,17 @@ import { Component, Input, OnInit } from '@angular/core'; import { Item } from '../../../../core/shared/item.model'; import { PaginationComponentOptions } from '../../../pagination/pagination-component-options.model'; import { PaginatedSearchOptions } from '../../../search/paginated-search-options.model'; -import { combineLatest as observableCombineLatest, Observable } from 'rxjs'; +import { Observable } from 'rxjs'; import { RemoteData } from '../../../../core/data/remote-data'; import { VersionHistory } from '../../../../core/shared/version-history.model'; import { Version } from '../../../../core/shared/version.model'; import { hasValue, hasValueOperator } from '../../../empty.util'; -import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../core/shared/operators'; -import { filter, map, startWith, switchMap } from 'rxjs/operators'; +import { + getAllSucceededRemoteData, getFirstSucceededRemoteData, + getFirstSucceededRemoteDataPayload, + getRemoteDataPayload +} from '../../../../core/shared/operators'; +import { filter, map, switchMap, take } from 'rxjs/operators'; import { followLink } from '../../../utils/follow-link-config.model'; import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service'; import { AlertType } from '../../../alert/aletr-type'; @@ -52,11 +56,11 @@ export class ItemVersionsNoticeComponent implements OnInit { /** * Pagination options to fetch a single version on the first page (this is the latest version in the history) */ - latestVersionOptions = Object.assign(new PaginationComponentOptions(),{ - id: 'item-newest-version-options', - currentPage: 1, - pageSize: 1 - }); + // latestVersionOptions = Object.assign(new PaginationComponentOptions(),{ + // id: 'item-newest-version-options', + // currentPage: 1, + // pageSize: 1 + // }); /** * The AlertType enumeration @@ -71,7 +75,7 @@ export class ItemVersionsNoticeComponent implements OnInit { * Initialize the component's observables */ ngOnInit(): void { - const latestVersionSearch = new PaginatedSearchOptions({pagination: this.latestVersionOptions}); + // const latestVersionSearch = new PaginatedSearchOptions({pagination: this.latestVersionOptions}); if (hasValue(this.item.version)) { this.versionRD$ = this.item.version; this.versionHistoryRD$ = this.versionRD$.pipe( @@ -80,10 +84,12 @@ export class ItemVersionsNoticeComponent implements OnInit { hasValueOperator(), switchMap((version: Version) => version.versionhistory) ); - const versionHistory$ = this.versionHistoryRD$.pipe( + + /*const versionHistory$ = this.versionHistoryRD$.pipe( getAllSucceededRemoteData(), getRemoteDataPayload(), ); + this.latestVersion$ = versionHistory$.pipe( switchMap((versionHistory: VersionHistory) => this.versionHistoryService.getVersions(versionHistory.id, latestVersionSearch, true, true, followLink('item'))), @@ -92,13 +98,23 @@ export class ItemVersionsNoticeComponent implements OnInit { hasValueOperator(), filter((versions) => versions.page.length > 0), map((versions) => versions.page[0]) + );*/ + + this.latestVersion$ = this.versionHistoryRD$.pipe( + getFirstSucceededRemoteDataPayload(), + switchMap((vh) => this.versionHistoryService.getLatestVersionFromHistory$(vh)) ); - this.isLatestVersion$ = observableCombineLatest( + /*this.isLatestVersion$ = observableCombineLatest( this.versionRD$.pipe(getAllSucceededRemoteData(), getRemoteDataPayload()), this.latestVersion$ ).pipe( map(([itemVersion, latestVersion]: [Version, Version]) => itemVersion.id === latestVersion.id), startWith(true) + );*/ + + this.isLatestVersion$ = this.versionRD$.pipe( + getFirstSucceededRemoteDataPayload(), + switchMap((version) => this.versionHistoryService.isLatest$(version)) ); } } @@ -113,3 +129,5 @@ export class ItemVersionsNoticeComponent implements OnInit { } } } + +// TODO code cleanup