mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-08 02:24:11 +00:00
[CST-4499] Version history - Code refactoring (WIP) and "Edit workspace item" button
This commit is contained in:
@@ -170,7 +170,7 @@ export class VersionHistoryDataService extends DataService<VersionHistory> {
|
|||||||
*/
|
*/
|
||||||
hasDraftVersion$(versionHref: string): Observable<boolean> {
|
hasDraftVersion$(versionHref: string): Observable<boolean> {
|
||||||
return this.versionDataService.findByHref(versionHref, true, true, followLink('versionhistory')).pipe(
|
return this.versionDataService.findByHref(versionHref, true, true, followLink('versionhistory')).pipe(
|
||||||
take(1),
|
getFirstCompletedRemoteData(),
|
||||||
switchMap((res) => {
|
switchMap((res) => {
|
||||||
if (res.hasSucceeded && !res.hasNoContent) {
|
if (res.hasSucceeded && !res.hasNoContent) {
|
||||||
return of(res).pipe(
|
return of(res).pipe(
|
||||||
|
@@ -43,14 +43,18 @@ export class WorkspaceitemDataService extends DataService<WorkspaceItem> {
|
|||||||
* Return the WorkspaceItem object found through the UUID of an item
|
* Return the WorkspaceItem object found through the UUID of an item
|
||||||
*
|
*
|
||||||
* @param uuid The uuid of the 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 options The {@link FindListOptions} object
|
||||||
* @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved
|
* @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved
|
||||||
*/
|
*/
|
||||||
public findByItem(uuid: string, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig<WorkspaceItem>[]): Observable<RemoteData<WorkspaceItem>> {
|
public findByItem(uuid: string, useCachedVersionIfAvailable = false, reRequestOnStale = true, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig<WorkspaceItem>[]): Observable<RemoteData<WorkspaceItem>> {
|
||||||
const findListOptions = new FindListOptions();
|
const findListOptions = new FindListOptions();
|
||||||
findListOptions.searchParams = [new RequestParam('uuid', encodeURIComponent(uuid))];
|
findListOptions.searchParams = [new RequestParam('uuid', encodeURIComponent(uuid))];
|
||||||
const href$ = this.getSearchByHref(this.searchByItemLinkPath, findListOptions, ...linksToFollow);
|
const href$ = this.getSearchByHref(this.searchByItemLinkPath, findListOptions, ...linksToFollow);
|
||||||
return this.findByHref(href$, false, true, ...linksToFollow);
|
return this.findByHref(href$, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
<p>versioned-item works!</p>
|
|
||||||
|
@@ -4,7 +4,7 @@ import { ItemVersionsSummaryModalComponent } from '../../../../shared/item/item-
|
|||||||
import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../../../core/shared/operators';
|
import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../../../core/shared/operators';
|
||||||
import { RemoteData } from '../../../../core/data/remote-data';
|
import { RemoteData } from '../../../../core/data/remote-data';
|
||||||
import { Version } from '../../../../core/shared/version.model';
|
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 { NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
||||||
import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service';
|
import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
@@ -58,11 +58,15 @@ export class VersionedItemComponent extends ItemComponent {
|
|||||||
|
|
||||||
// On createVersionEvent emitted create new version and notify
|
// On createVersionEvent emitted create new version and notify
|
||||||
activeModal.componentInstance.createVersionEvent.pipe(
|
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<Version>) => { this.itemVersionShared.notifyCreateNewVersion(res); }),
|
||||||
getFirstSucceededRemoteDataPayload<Version>(),
|
getFirstSucceededRemoteDataPayload<Version>(),
|
||||||
|
// get workspace item
|
||||||
switchMap((newVersion: Version) => this.itemService.findByHref(newVersion._links.item.href)),
|
switchMap((newVersion: Version) => this.itemService.findByHref(newVersion._links.item.href)),
|
||||||
getFirstSucceededRemoteDataPayload<Item>(),
|
getFirstSucceededRemoteDataPayload<Item>(),
|
||||||
switchMap((newVersionItem: Item) => this.workspaceitemDataService.findByItem(newVersionItem.uuid)),
|
switchMap((newVersionItem: Item) => this.workspaceitemDataService.findByItem(newVersionItem.uuid, true, false)),
|
||||||
getFirstSucceededRemoteDataPayload<WorkspaceItem>(),
|
getFirstSucceededRemoteDataPayload<WorkspaceItem>(),
|
||||||
).subscribe((wsItem) => {
|
).subscribe((wsItem) => {
|
||||||
const wsiId = wsItem.id;
|
const wsiId = wsItem.id;
|
||||||
|
@@ -35,13 +35,20 @@ export class ItemVersionsSharedService {
|
|||||||
return this.versionHistoryService.createVersion(item._links.self.href, summary).pipe(
|
return this.versionHistoryService.createVersion(item._links.self.href, summary).pipe(
|
||||||
switchMap((postResult: RemoteData<Version>) => {
|
switchMap((postResult: RemoteData<Version>) => {
|
||||||
const newVersionNumber = postResult?.payload?.version;
|
const newVersionNumber = postResult?.payload?.version;
|
||||||
this.notifyCreateNewVersion(postResult.hasSucceeded, postResult.statusCode, newVersionNumber);
|
this.notifyCreateNewVersionBak(postResult.hasSucceeded, postResult.statusCode, newVersionNumber);
|
||||||
return of(postResult);
|
return of(postResult);
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private notifyCreateNewVersion(success: boolean, statusCode: number, newVersionNumber: number) {
|
public notifyCreateNewVersion(newVersionRD: RemoteData<Version>) {
|
||||||
|
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 ?
|
success ?
|
||||||
this.notificationsService.success(null, this.translateService.get(ItemVersionsSharedService.msg('success'), {version: newVersionNumber})) :
|
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')));
|
this.notificationsService.error(null, this.translateService.get(ItemVersionsSharedService.msg(statusCode === 422 ? 'inProgress' : 'failure')));
|
||||||
|
@@ -25,8 +25,20 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr *ngFor="let version of versions?.page" [id]="'version-row-' + version.id">
|
<tr *ngFor="let version of versions?.page" [id]="'version-row-' + version.id">
|
||||||
<td class="version-row-element-version">
|
<td class="version-row-element-version">
|
||||||
|
<div>
|
||||||
|
<div class="left-column">
|
||||||
<a [routerLink]="getVersionRoute(version.id)">{{version.version}}</a>
|
<a [routerLink]="getVersionRoute(version.id)">{{version.version}}</a>
|
||||||
<span *ngIf="version?.id === itemVersion?.id">*</span>
|
<span *ngIf="version?.id === itemVersion?.id">*</span>
|
||||||
|
</div>
|
||||||
|
<div class="right-column">
|
||||||
|
<ng-container *ngVar="getDraftId(version?.item) as draftId$">
|
||||||
|
<button class="btn btn-outline-primary btn-sm version-row-element-edit" *ngIf="draftId$ | async"
|
||||||
|
(click)="editWorkspaceItem(draftId$)">
|
||||||
|
<i class="fas fa-pencil-alt fa-fw"></i> {{ "item.version.history.table.workspaceItem" | translate }}
|
||||||
|
</button>
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td *ngIf="(hasEpersons$ | async)" class="version-row-element-editor">
|
<td *ngIf="(hasEpersons$ | async)" class="version-row-element-editor">
|
||||||
<span *ngVar="(version?.eperson | async)?.payload as eperson">
|
<span *ngVar="(version?.eperson | async)?.payload as eperson">
|
||||||
|
@@ -45,6 +45,8 @@ import { Router } from '@angular/router';
|
|||||||
import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service';
|
import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service';
|
||||||
import { FeatureID } from '../../../core/data/feature-authorization/feature-id';
|
import { FeatureID } from '../../../core/data/feature-authorization/feature-id';
|
||||||
import { ItemVersionsSharedService } from './item-versions-shared.service';
|
import { ItemVersionsSharedService } from './item-versions-shared.service';
|
||||||
|
import { WorkspaceItem } from '../../../core/submission/models/workspaceitem.model';
|
||||||
|
import { WorkspaceitemDataService } from '../../../core/submission/workspaceitem-data.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ds-item-versions',
|
selector: 'ds-item-versions',
|
||||||
@@ -170,6 +172,7 @@ export class ItemVersionsComponent implements OnInit {
|
|||||||
private router: Router,
|
private router: Router,
|
||||||
private itemVersionShared: ItemVersionsSharedService,
|
private itemVersionShared: ItemVersionsSharedService,
|
||||||
private authorizationService: AuthorizationDataService,
|
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<string> {
|
||||||
|
return versionItem.pipe(
|
||||||
|
getFirstSucceededRemoteDataPayload(),
|
||||||
|
map((item: Item) => item.uuid),
|
||||||
|
switchMap((itemUuid: string) => this.workspaceItemDataService.findByItem(itemUuid, true)),
|
||||||
|
getFirstCompletedRemoteData<WorkspaceItem>(),
|
||||||
|
map((res: RemoteData<WorkspaceItem>) => res?.payload?.id ),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* redirect to the edit page of the workspace item
|
||||||
|
* @param id$ the id of the workspace item
|
||||||
|
*/
|
||||||
|
editWorkspaceItem(id$: Observable<string>) {
|
||||||
|
id$.subscribe((id) => {
|
||||||
|
this.router.navigateByUrl('workspaceitems/' + id + '/edit');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize all observables
|
* Initialize all observables
|
||||||
*/
|
*/
|
||||||
@@ -399,6 +426,7 @@ export class ItemVersionsComponent implements OnInit {
|
|||||||
getFirstSucceededRemoteDataPayload(),
|
getFirstSucceededRemoteDataPayload(),
|
||||||
map((res) => Boolean(res?.draftVersion)),
|
map((res) => Boolean(res?.draftVersion)),
|
||||||
);
|
);
|
||||||
|
|
||||||
this.createVersionTitle$ = this.hasDraftVersion$.pipe(
|
this.createVersionTitle$ = this.hasDraftVersion$.pipe(
|
||||||
take(1),
|
take(1),
|
||||||
switchMap((res) => of(res ? 'item.version.history.table.action.hasDraft' : 'item.version.history.table.action.newVersion'))
|
switchMap((res) => of(res ? 'item.version.history.table.action.hasDraft' : 'item.version.history.table.action.newVersion'))
|
||||||
|
@@ -1981,6 +1981,8 @@
|
|||||||
|
|
||||||
"item.version.history.table.summary": "Summary",
|
"item.version.history.table.summary": "Summary",
|
||||||
|
|
||||||
|
"item.version.history.table.workspaceItem": "Workspace item",
|
||||||
|
|
||||||
"item.version.history.table.actions": "Action",
|
"item.version.history.table.actions": "Action",
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user