diff --git a/src/app/core/data/version-history-data.service.ts b/src/app/core/data/version-history-data.service.ts index 8f148f168d..d680d0a9dd 100644 --- a/src/app/core/data/version-history-data.service.ts +++ b/src/app/core/data/version-history-data.service.ts @@ -8,19 +8,22 @@ import { CoreState } from '../core.reducers'; import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; -import { FindListOptions } from './request.models'; -import { Observable } from 'rxjs'; +import { FindListOptions, PostRequest } from './request.models'; +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 } from 'rxjs/operators'; +import { 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 { VersionDataService } from './version-data.service'; +import { MetadataMap } from '../shared/metadata.models'; +import { Bundle } from '../shared/bundle.model'; +import { HttpOptions } from '../dspace-rest/dspace-rest.service'; /** * Service responsible for handling requests related to the VersionHistory object @@ -79,4 +82,18 @@ export class VersionHistoryDataService extends DataService { return this.versionDataService.findAllByHref(hrefObs, undefined, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } + + public createVersion(itemHref: string, summary: string): Observable> { + const requestId = this.requestService.generateRequestId(); + const requestOptions: HttpOptions = Object.create({}); + let requestHeaders = new HttpHeaders(); + requestHeaders = requestHeaders.append('Content-Type', 'text/uri-list'); + requestOptions.headers = requestHeaders; + const href = 'BASE' + 'api/versioning/versions?summary=' + summary; // TODO + console.error("MISSING BASE URL"); + const body = itemHref; + const request = new PostRequest(this.requestService.generateRequestId(), href, itemHref, requestOptions); + this.requestService.send(request); + return this.rdbService.buildFromRequestUUID(requestId); + } } diff --git a/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.html b/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.html new file mode 100644 index 0000000000..f517dc105c --- /dev/null +++ b/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.html @@ -0,0 +1 @@ +

item-versions-delete-modal works!

diff --git a/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.scss b/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.spec.ts b/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.spec.ts new file mode 100644 index 0000000000..5ef9ae44d2 --- /dev/null +++ b/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ItemVersionsDeleteModalComponent } from './item-versions-delete-modal.component'; + +describe('ItemVersionsDeleteModalComponent', () => { + let component: ItemVersionsDeleteModalComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ItemVersionsDeleteModalComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ItemVersionsDeleteModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.ts b/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.ts new file mode 100644 index 0000000000..c174d8e595 --- /dev/null +++ b/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'ds-item-versions-delete-modal', + templateUrl: './item-versions-delete-modal.component.html', + styleUrls: ['./item-versions-delete-modal.component.scss'] +}) +export class ItemVersionsDeleteModalComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.html b/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.html index 259a1e76c3..c8919362ed 100644 --- a/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.html +++ b/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.html @@ -1,11 +1,30 @@
- +
diff --git a/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.ts b/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.ts index 8fa4f4c826..c0017d888a 100644 --- a/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.ts +++ b/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.ts @@ -8,13 +8,24 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; }) export class ItemVersionsSummaryModalComponent implements OnInit { - constructor( - protected activeModal: NgbActiveModal,) { } + versionNumber: number; + newVersionSummary: string; - closeModal() { - this.activeModal.close(); + constructor( + protected activeModal: NgbActiveModal, + ) { } + + onModalClose() { + this.activeModal.dismiss('item.version.create.message.failure'); + } + + onModalSubmit() { + this.activeModal.close(this.newVersionSummary); + } + ngOnInit(): void { + // TODO delete if unused } } 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 cad8caabe4..097b42049e 100644 --- a/src/app/shared/item/item-versions/item-versions.component.ts +++ b/src/app/shared/item/item-versions/item-versions.component.ts @@ -2,11 +2,12 @@ import { Component, Input, OnInit } from '@angular/core'; import { Item } from '../../../core/shared/item.model'; import { Version } from '../../../core/shared/version.model'; import { RemoteData } from '../../../core/data/remote-data'; -import { BehaviorSubject, combineLatest as observableCombineLatest, Observable } from 'rxjs'; +import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, Subject } from 'rxjs'; import { VersionHistory } from '../../../core/shared/version-history.model'; import { getAllSucceededRemoteData, - getAllSucceededRemoteDataPayload, + getAllSucceededRemoteDataPayload, getFirstCompletedRemoteData, getFirstSucceededRemoteData, + getFirstSucceededRemoteDataPayload, getRemoteDataPayload } from '../../../core/shared/operators'; import { map, startWith, switchMap } from 'rxjs/operators'; @@ -22,6 +23,8 @@ import { getItemPageRoute } from '../../../item-page/item-page-routing-paths'; import { FormBuilder } from '@angular/forms'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { ItemVersionsSummaryModalComponent } from './item-versions-summary-modal/item-versions-summary-modal.component'; +import { NotificationsService } from '../../notifications/notifications.service'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'ds-item-versions', @@ -90,7 +93,7 @@ export class ItemVersionsComponent implements OnInit { * The page options to use for fetching the versions * Start at page 1 and always use the set page size */ - options = Object.assign(new PaginationComponentOptions(),{ + options = Object.assign(new PaginationComponentOptions(), { id: 'ivo', currentPage: 1, pageSize: this.pageSize @@ -114,14 +117,13 @@ export class ItemVersionsComponent implements OnInit { private paginationService: PaginationService, private formBuilder: FormBuilder, private modalService: NgbModal, - ) { + private notificationsService: NotificationsService, + private translateService: TranslateService, + ) { } - versionBeingEdited: number; - summary = 'test'; // TODO delete - - summaryForm = this.formBuilder.group({summary: 's'}); + // summaryForm = this.formBuilder.group({summary: 's'}); onSummarySubmit() { // TODO submit console.log('SUBMITTING ' + this.summary); @@ -146,7 +148,38 @@ export class ItemVersionsComponent implements OnInit { } createNewVersion(version) { - this.modalService.open(ItemVersionsSummaryModalComponent); + const successMessageKey = 'item.version.create.message.success'; + const failureMessageKey = 'item.version.create.message.failure'; + const activeModal = this.modalService.open(ItemVersionsSummaryModalComponent); + activeModal.componentInstance.versionNumber = version.version; + + activeModal.result.then((modalResult) => { + const summary = modalResult; + version.item.pipe(getFirstSucceededRemoteDataPayload()).subscribe((item) => { + + const itemHref = item._links.self.href; + + // TODO crea versione + + this.versionHistoryService.createVersion(itemHref, summary).pipe(getFirstCompletedRemoteData()).subscribe((postResult) => { + const newVersion = postResult.payload; + const newVersionNumber = newVersion.version; + console.log("SUCCESS " + newVersionNumber); + console.log('RESPONSE = ' + JSON.stringify(postResult)); + this.notificationsService.success(null, this.translateService.get(successMessageKey, {version: newVersionNumber})); + this.refreshSubject.next(); + }); + + // TODO success + + // error + this.notificationsService.error(null, this.translateService.get(failureMessageKey)); + }); + }).catch((msg) => { + this.notificationsService.warning(null, this.translateService.get(failureMessageKey)); + } + ); + } @@ -171,9 +204,14 @@ export class ItemVersionsComponent implements OnInit { this.versionsRD$ = observableCombineLatest(versionHistory$, currentPagination).pipe( switchMap(([versionHistory, options]: [VersionHistory, PaginationComponentOptions]) => this.versionHistoryService.getVersions(versionHistory.id, - new PaginatedSearchOptions({pagination: Object.assign({}, options, { currentPage: options.currentPage })}), + new PaginatedSearchOptions({pagination: Object.assign({}, options, {currentPage: options.currentPage})}), true, true, followLink('item'), followLink('eperson'))) ); + /* TODO fix error and restore refresh + The response for 'http://localhost:8080/server/api/versioning/versionhistories/1/versions?page=0&size=1' + has the self link 'http://localhost:8080/server/api/versioning/versionhistories/1/versions?page=0&embed=item&size=1'. + These don't match. This could mean there's an issue with the REST endpoint + */ this.hasEpersons$ = this.versionsRD$.pipe( getAllSucceededRemoteData(), getRemoteDataPayload(), diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index f28c0320d6..3945fe36e3 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -235,6 +235,7 @@ import { TextMenuItemComponent } from './menu/menu-item/text-menu-item.component import { ThemedConfigurationSearchPageComponent } from '../search-page/themed-configuration-search-page.component'; import { SearchNavbarComponent } from '../search-navbar/search-navbar.component'; import { ItemVersionsSummaryModalComponent } from './item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component'; +import { ItemVersionsDeleteModalComponent } from './item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component'; /** * Declaration needed to make sure all decorator functions are called in time @@ -588,7 +589,8 @@ const DIRECTIVES = [ ...DIRECTIVES, ...SHARED_ITEM_PAGE_COMPONENTS, ...SHARED_SEARCH_PAGE_COMPONENTS, - ItemVersionsSummaryModalComponent + ItemVersionsSummaryModalComponent, + ItemVersionsDeleteModalComponent ], providers: [ ...PROVIDERS diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 97f6246141..d87067cf77 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1995,7 +1995,26 @@ "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", - "item.version.modal.create.header": "Create new version", + + "item.version.create.modal.header": "Create new version", + + "item.version.create.modal.text": "Create a new version for this item starting from version {{version}}", + + "item.version.create.modal.button.create": "Create", + + "item.version.create.modal.button.create.tooltip": "Create new version", + + "item.version.create.modal.button.discard": "Discard", + + "item.version.create.modal.button.discard.tooltip": "Do not create new version", + + "item.version.create.modal.form.summary.label": "Summary", + + "item.version.create.modal.form.summary.placeholder": "Insert the summary for the new version", + + "item.version.create.message.success" : "New version has been created with version number {{version}}", + + "item.version.create.message.failure" : "New version has not been created", "journal.listelement.badge": "Journal",