- + { let component: ToggleFavoriteComponent; @@ -50,7 +51,11 @@ describe('ToggleFavoriteComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [TranslateModule.forRoot(), CoreModule.forRoot()], + imports: [ + TranslateModule.forRoot(), + CoreModule.forRoot(), + AppTestingModule + ], declarations: [ToggleFavoriteComponent], providers: [ ExtensionService, @@ -78,7 +83,7 @@ describe('ToggleFavoriteComponent', () => { fixture.detectChanges(); component.onToggleEvent(); - expect(mockStore.dispatch).not.toHaveBeenCalled(); + expect(mockStore.dispatch).toHaveBeenCalled(); }); it('should dispatch reload if route is specified', () => { diff --git a/src/app/dialogs/node-version-upload/node-version-upload.dialog.html b/src/app/dialogs/node-version-upload/node-version-upload.dialog.html deleted file mode 100644 index 42a4d0b9a..000000000 --- a/src/app/dialogs/node-version-upload/node-version-upload.dialog.html +++ /dev/null @@ -1,20 +0,0 @@ -

- {{ 'VERSION.DIALOG.TITLE' | translate }} -

- -
- -
- -
- - -
diff --git a/src/app/dialogs/node-version-upload/node-version-upload.dialog.scss b/src/app/dialogs/node-version-upload/node-version-upload.dialog.scss deleted file mode 100644 index a0dfe344e..000000000 --- a/src/app/dialogs/node-version-upload/node-version-upload.dialog.scss +++ /dev/null @@ -1,15 +0,0 @@ -.aca-node-version-upload-dialog { - overflow: unset; - - .dialog-actions { - justify-content: flex-end; - - button { - text-transform: uppercase; - } - } - - .node-version-dialog__title { - padding-left: 8px; - } -} diff --git a/src/app/dialogs/node-version-upload/node-version-upload.dialog.spec.ts b/src/app/dialogs/node-version-upload/node-version-upload.dialog.spec.ts deleted file mode 100644 index 7328afd9c..000000000 --- a/src/app/dialogs/node-version-upload/node-version-upload.dialog.spec.ts +++ /dev/null @@ -1,83 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2020 Alfresco Software Limited - * - * This file is part of the Alfresco Example Content Application. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * The Alfresco Example Content Application is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The Alfresco Example Content Application is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ - -import { NodeVersionUploadDialogComponent } from './node-version-upload.dialog'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { AppTestingModule } from '../../testing/app-testing.module'; -import { AppNodeVersionModule } from '../../components/node-version/node-version.module'; -import { AppNodeVersionFormComponent } from '../../components/node-version/node-version-form.component'; -import { By } from '@angular/platform-browser'; -import { CoreModule } from '@alfresco/adf-core'; -import { TranslateModule } from '@ngx-translate/core'; - -describe('NodeVersionsDialogComponent', () => { - let fixture: ComponentFixture; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - TranslateModule.forRoot(), - CoreModule.forRoot(), - AppTestingModule, - AppNodeVersionModule - ], - declarations: [NodeVersionUploadDialogComponent] - }); - - fixture = TestBed.createComponent(NodeVersionUploadDialogComponent); - fixture.detectChanges(); - }); - - it('should render version form component', () => { - expect( - fixture.debugElement.nativeElement.querySelector('app-node-version-form') - ).not.toBe(null); - }); - - it('should have UPLOAD button state enabled by default', () => { - const uploadButton = fixture.debugElement.nativeElement.querySelectorAll( - 'button' - )[1] as HTMLElement; - - expect(uploadButton.textContent.includes('VERSION.DIALOG.UPLOAD')).toBe( - true - ); - expect(uploadButton.getAttribute('disabled')).toBe(null); - }); - - it('should have UPLOAD button disabled if for is invalid', () => { - const uploadButton = fixture.debugElement.nativeElement.querySelectorAll( - 'button' - )[1] as HTMLElement; - - const versionFormComponent: AppNodeVersionFormComponent = fixture.debugElement.query( - By.directive(AppNodeVersionFormComponent) - ).componentInstance; - versionFormComponent.form.setErrors({ invalid: true }); - fixture.detectChanges(); - - expect(uploadButton.getAttribute('disabled')).not.toBe(null); - }); -}); diff --git a/src/app/dialogs/node-version-upload/node-version-upload.dialog.ts b/src/app/dialogs/node-version-upload/node-version-upload.dialog.ts deleted file mode 100644 index 902ef3cfe..000000000 --- a/src/app/dialogs/node-version-upload/node-version-upload.dialog.ts +++ /dev/null @@ -1,34 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2020 Alfresco Software Limited - * - * This file is part of the Alfresco Example Content Application. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * The Alfresco Example Content Application is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The Alfresco Example Content Application is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ - -import { Component, ViewEncapsulation } from '@angular/core'; - -@Component({ - templateUrl: './node-version-upload.dialog.html', - encapsulation: ViewEncapsulation.None, - styleUrls: ['./node-version-upload.dialog.scss'], - host: { class: 'aca-node-version-upload-dialog' } -}) -export class NodeVersionUploadDialogComponent {} diff --git a/src/app/dialogs/node-versions/node-versions.dialog.html b/src/app/dialogs/node-versions/node-versions.dialog.html index 48a3c7d81..17a844563 100644 --- a/src/app/dialogs/node-versions/node-versions.dialog.html +++ b/src/app/dialogs/node-versions/node-versions.dialog.html @@ -1,17 +1,37 @@ -
+
{{ 'VERSION.DIALOG_ADF.TITLE' | translate }}
-
- + {{ 'VERSION.DIALOG.TITLE' | translate }} +
+
+ - +
-
- -
+ +
+
+
+ +
+
+
+
+ +
+
diff --git a/src/app/dialogs/node-versions/node-versions.dialog.spec.ts b/src/app/dialogs/node-versions/node-versions.dialog.spec.ts index be717614c..f9a86ffaf 100644 --- a/src/app/dialogs/node-versions/node-versions.dialog.spec.ts +++ b/src/app/dialogs/node-versions/node-versions.dialog.spec.ts @@ -24,9 +24,122 @@ */ import { NodeVersionsDialogComponent } from './node-versions.dialog'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { + AlfrescoApiService, + AlfrescoApiServiceMock, + CoreModule, + TranslationMock +} from '@alfresco/adf-core'; +import { AppTestingModule } from '../../testing/app-testing.module'; +import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef +} from '@angular/material/dialog'; +import { Store } from '@ngrx/store'; +import { + NodeEntityEvent, + UploadVersionButtonComponent, + VersionListComponent, + VersionUploadComponent +} from '@alfresco/adf-content-services'; +import { + TranslateFakeLoader, + TranslateLoader, + TranslateModule +} from '@ngx-translate/core'; +import { MinimalNodeEntryEntity } from '@alfresco/js-api'; +import { AppStore, UnlockWriteAction } from '@alfresco/aca-shared/store'; describe('NodeVersionsDialogComponent', () => { - it('should be defined', () => { - expect(NodeVersionsDialogComponent).toBeDefined(); + let fixture: ComponentFixture; + let component: NodeVersionsDialogComponent; + let store: Store; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + CoreModule.forRoot(), + AppTestingModule, + MatDialogModule, + TranslateModule.forRoot({ + loader: { provide: TranslateLoader, useClass: TranslateFakeLoader } + }) + ], + declarations: [ + NodeVersionsDialogComponent, + VersionListComponent, + VersionUploadComponent, + UploadVersionButtonComponent + ], + providers: [ + { + provide: AlfrescoApiService, + useClass: AlfrescoApiServiceMock + }, + { + provide: MatDialogRef, + useValue: { + close: jasmine.createSpy('close'), + open: jasmine.createSpy('open') + } + }, + { + provide: TranslationMock, + useValue: { + instant: jasmine.createSpy('instant') + } + }, + { + provide: Store, + useValue: { + dispatch: jasmine.createSpy('dispatch') + } + }, + { provide: MAT_DIALOG_DATA, useValue: {} } + ] + }); + + store = TestBed.get(Store); + fixture = TestBed.createComponent(NodeVersionsDialogComponent); + component = fixture.componentInstance; + component.node = { + id: 'file1', + properties: {} + } as MinimalNodeEntryEntity; + }); + + it('should display adf upload version if isTypeList is passed as false from parent component', () => { + component.isTypeList = false; + fixture.detectChanges(); + const adfVersionComponent = document.querySelector( + '#adf-version-upload-button' + ); + expect(adfVersionComponent).toBeDefined(); + }); + + it('should unlock node if is locked when uploading a file', () => { + component.isTypeList = false; + const nodeEvent: NodeEntityEvent = new NodeEntityEvent({ + entry: { + id: 'a8b2caff-a58c-40f1-8c47-0b8e63ceaa0e', + isFavorite: false, + isFile: true, + isFolder: false, + name: '84348838_3451105884918116_7819187244555567104_o.jpg', + nodeType: 'cm:content', + parentId: '72c65b52-b856-4a5c-b028-42ce03adb4fe', + modifiedAt: null, + createdByUser: null, + createdAt: null, + modifiedByUser: null, + properties: { 'cm:lockType': 'WRITE_LOCK' } + } + }); + component.handleUpload(nodeEvent); + expect(store.dispatch).toHaveBeenCalledWith( + new UnlockWriteAction(nodeEvent.value) + ); }); }); diff --git a/src/app/dialogs/node-versions/node-versions.dialog.theme.scss b/src/app/dialogs/node-versions/node-versions.dialog.theme.scss index 1f3cfb3db..c1aba7367 100644 --- a/src/app/dialogs/node-versions/node-versions.dialog.theme.scss +++ b/src/app/dialogs/node-versions/node-versions.dialog.theme.scss @@ -2,10 +2,14 @@ $foreground: map-get($theme, foreground); $accent: map-get($theme, accent); - .adf-version-manager-dialog-panel { + .adf-version-manager-dialog-panel-list { height: 400px; } + .adf-version-manager-dialog-panel-upload { + height: 280px; + } + .aca-node-versions-dialog { .mat-dialog-title { flex: 0 0 auto; @@ -68,7 +72,7 @@ .adf-version-list-container { .adf-version-list { - height: 180px; + height: 250px; overflow: hidden; padding: 0; } diff --git a/src/app/dialogs/node-versions/node-versions.dialog.ts b/src/app/dialogs/node-versions/node-versions.dialog.ts index 6966e5de8..1efd491c6 100644 --- a/src/app/dialogs/node-versions/node-versions.dialog.ts +++ b/src/app/dialogs/node-versions/node-versions.dialog.ts @@ -23,11 +23,22 @@ * along with Alfresco. If not, see . */ -import { SnackbarErrorAction } from '@alfresco/aca-shared/store'; -import { MinimalNodeEntryEntity } from '@alfresco/js-api'; -import { Component, Inject, ViewEncapsulation } from '@angular/core'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { + AppStore, + SnackbarErrorAction, + UnlockWriteAction +} from '@alfresco/aca-shared/store'; +import { MinimalNodeEntryEntity, Node } from '@alfresco/js-api'; +import { + Component, + EventEmitter, + Inject, + Output, + ViewEncapsulation +} from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { Store } from '@ngrx/store'; +import { NodeEntityEvent } from '@alfresco/adf-content-services'; @Component({ templateUrl: './node-versions.dialog.html', @@ -36,12 +47,39 @@ import { Store } from '@ngrx/store'; }) export class NodeVersionsDialogComponent { node: MinimalNodeEntryEntity; + file: File; + isTypeList = true; - constructor(@Inject(MAT_DIALOG_DATA) data: any, private store: Store) { + /** Emitted when a version is restored or deleted. */ + @Output() + refreshEvent: EventEmitter = new EventEmitter(); + + constructor( + @Inject(MAT_DIALOG_DATA) data: any, + private store: Store, + private dialogRef: MatDialogRef + ) { this.node = data.node; + this.file = data.file; + this.isTypeList = data.isTypeList !== undefined ? data.isTypeList : true; } - uploadError(errorMessage: string) { + onUploadError(errorMessage: string) { this.store.dispatch(new SnackbarErrorAction(errorMessage)); } + + handleUpload(nodeEvent: NodeEntityEvent) { + if (nodeEvent.value.entry.properties['cm:lockType'] === 'WRITE_LOCK') { + this.store.dispatch(new UnlockWriteAction(nodeEvent.value)); + } + this.dialogRef.close(); + } + + handleCancel() { + this.dialogRef.close(); + } + + refresh(node: Node) { + this.refreshEvent.emit(node); + } } diff --git a/src/app/services/content-management.service.spec.ts b/src/app/services/content-management.service.spec.ts index 4f26878c9..478ce9d0c 100644 --- a/src/app/services/content-management.service.spec.ts +++ b/src/app/services/content-management.service.spec.ts @@ -51,7 +51,11 @@ import { ContentApiService } from '@alfresco/aca-shared'; import { Store } from '@ngrx/store'; import { ContentManagementService } from './content-management.service'; import { NodeActionsService } from './node-actions.service'; -import { TranslationService, AlfrescoApiService } from '@alfresco/adf-core'; +import { + TranslationService, + AlfrescoApiService, + FileModel +} from '@alfresco/adf-core'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { MatSnackBar, @@ -1582,23 +1586,46 @@ describe('ContentManagementService', () => { })); }); - describe('versionUploadDialog', () => { + describe('versionUpdateDialog', () => { it('should open dialog with NodeVersionUploadDialogComponent instance', () => { spyOn(dialog, 'open'); + const fakeNode = { + name: 'lights.jpg', + id: 'f5e5cb54-200e-41a8-9c21-b5ee77da3992' + }; + const fakeFile = new FileModel( + { name: 'file1.png', size: 10 } as File, + null, + 'file1' + ); - contentManagementService.versionUploadDialog(); + contentManagementService.versionUpdateDialog(fakeNode, fakeFile); expect(dialog.open['calls'].argsFor(0)[0].name).toBe( - 'NodeVersionUploadDialogComponent' + 'NodeVersionsDialogComponent' ); }); it('should return dialog instance reference', () => { - const mockDialogInstance: any = { afterClose: () => {} }; + const mockDialogInstance: any = { + afterClose: () => {} + }; + const fakeNode = { + name: 'lights.jpg', + id: 'f5e5cb54-200e-41a8-9c21-b5ee77da3992' + }; + const fakeFile = new FileModel( + { name: 'file1.png', size: 10 } as File, + null, + 'file1' + ); spyOn(dialog, 'open').and.returnValue(mockDialogInstance); - const dialogRef = contentManagementService.versionUploadDialog(); + const dialogRef = contentManagementService.versionUpdateDialog( + fakeNode, + fakeFile + ); expect(dialogRef).toBe(mockDialogInstance); }); diff --git a/src/app/services/content-management.service.ts b/src/app/services/content-management.service.ts index 195a0a664..19c2740f6 100644 --- a/src/app/services/content-management.service.ts +++ b/src/app/services/content-management.service.ts @@ -66,7 +66,6 @@ import { Store } from '@ngrx/store'; import { forkJoin, Observable, of, Subject, zip } from 'rxjs'; import { catchError, flatMap, map, mergeMap, take, tap } from 'rxjs/operators'; import { NodePermissionsDialogComponent } from '../components/permissions/permission-dialog/node-permissions.dialog'; -import { NodeVersionUploadDialogComponent } from '../dialogs/node-version-upload/node-version-upload.dialog'; import { NodeVersionsDialogComponent } from '../dialogs/node-versions/node-versions.dialog'; import { NodeActionsService } from './node-actions.service'; @@ -164,11 +163,14 @@ export class ContentManagementService { private openVersionManagerDialog(node: any) { // workaround Shared if (node.isFile || node.nodeId) { - this.dialogRef.open(NodeVersionsDialogComponent, { + const dialogRef = this.dialogRef.open(NodeVersionsDialogComponent, { data: { node }, panelClass: 'adf-version-manager-dialog-panel', width: '630px' }); + dialogRef.componentInstance.refreshEvent.subscribe(() => { + this.store.dispatch(new ReloadDocumentListAction()); + }); } else { this.store.dispatch( new SnackbarErrorAction('APP.MESSAGES.ERRORS.PERMISSION') @@ -176,9 +178,11 @@ export class ContentManagementService { } } - versionUploadDialog() { - return this.dialogRef.open(NodeVersionUploadDialogComponent, { - panelClass: 'aca-node-version-dialog' + versionUpdateDialog(node, file) { + return this.dialogRef.open(NodeVersionsDialogComponent, { + data: { node, file, isTypeList: false }, + panelClass: 'adf-version-manager-dialog-panel-upload', + width: '600px' }); } diff --git a/src/app/store/effects/upload.effects.spec.ts b/src/app/store/effects/upload.effects.spec.ts index 24d0c12da..495762936 100644 --- a/src/app/store/effects/upload.effects.spec.ts +++ b/src/app/store/effects/upload.effects.spec.ts @@ -34,29 +34,11 @@ import { FileUploadCompleteEvent, FileModel } from '@alfresco/adf-core'; -import { MinimalNodeEntryEntity } from '@alfresco/js-api'; import { UnlockWriteAction, - SnackbarErrorAction + UploadFileVersionAction } from '@alfresco/aca-shared/store'; import { ContentManagementService } from '../../services/content-management.service'; -import { of, throwError } from 'rxjs'; -import { MatDialogRef } from '@angular/material'; -import { NodeVersionUploadDialogComponent } from '../../dialogs/node-version-upload/node-version-upload.dialog'; - -function createFileList(fileName, type = 'text/plain') { - const data = new Blob([''], { type }); - const arrayOfBlob = new Array(); - arrayOfBlob.push(data); - const file = new File(arrayOfBlob, fileName); - const files = [file]; - - const reducer = (dataTransfer, currentFile) => { - dataTransfer.items.add(currentFile); - return dataTransfer; - }; - return files.reduce(reducer, new DataTransfer()).files; -} describe('UploadEffects', () => { let store: Store; @@ -64,7 +46,6 @@ describe('UploadEffects', () => { let effects: UploadEffects; let zone: NgZone; let contentManagementService: ContentManagementService; - let uploadVersionInput: HTMLInputElement; beforeEach(() => { TestBed.configureTestingModule({ @@ -83,11 +64,8 @@ describe('UploadEffects', () => { }); beforeEach(() => { - uploadVersionInput = document.querySelector('#app-upload-file-version'); - }); - - afterEach(() => { - uploadVersionInput.remove(); + spyOn(effects['fileVersionInput'], 'click'); + spyOn(effects, 'uploadVersion').and.callThrough(); }); describe('uploadAndUnlock()', () => { @@ -200,41 +178,66 @@ describe('UploadEffects', () => { }); describe('upload file version', () => { - beforeEach(() => { - const dialog = { afterClosed: () => of({}) } as MatDialogRef< - NodeVersionUploadDialogComponent - >; - spyOn(contentManagementService, 'versionUploadDialog').and.returnValue( - dialog - ); - spyOn(effects, 'uploadAndUnlock').and.stub(); + it('should trigger upload file from context menu', () => { + store.dispatch({ type: 'UPLOAD_FILE_VERSION' }); + expect(effects['fileVersionInput'].click).toHaveBeenCalled(); }); - it('should upload file', () => { - spyOn(contentManagementService, 'getNodeInfo').and.returnValue( - of({ - id: 'file1', - properties: {} - } as MinimalNodeEntryEntity) + it('should upload file from dropping another file', () => { + spyOn(contentManagementService, 'versionUpdateDialog'); + const fakeEvent = new CustomEvent('upload-files', { + detail: { + files: [ + { + file: new FileModel({ + name: 'Fake New file', + type: 'image/png', + lastModified: 1589273450599, + size: 1351, + slice: null + }), + entry: new FileModel({ + name: 'Fake New file', + type: 'image/png', + lastModified: 1589273450599, + size: 1351, + slice: null + }) + } + ], + data: { + node: { + entry: { + isFile: true, + createdByUser: { + id: 'admin.adf@alfresco.com', + displayName: 'Administrator' + }, + modifiedAt: '2020-06-09T08:13:40.569Z', + nodeType: 'cm:content', + content: { + mimeType: 'image/jpeg', + mimeTypeName: 'JPEG Image', + sizeInBytes: 175540, + encoding: 'UTF-8' + }, + parentId: 'dff2bc1e-d092-42ac-82d1-87c82f6e56cb', + createdAt: '2020-05-14T08:52:03.868Z', + isFolder: false, + name: 'GoqZhm.jpg', + id: '1bf8a8f7-18ac-4eef-919d-61d952eaa179', + allowableOperations: ['delete', 'update', 'updatePermissions'], + isFavorite: false + } + } + } + } + }); + store.dispatch(new UploadFileVersionAction(fakeEvent)); + expect(contentManagementService.versionUpdateDialog).toHaveBeenCalledWith( + fakeEvent.detail.data.node.entry, + fakeEvent.detail.files[0].file ); - - uploadVersionInput.files = createFileList('bogus.txt'); - uploadVersionInput.dispatchEvent(new CustomEvent('change')); - expect(effects.uploadAndUnlock).toHaveBeenCalled(); - }); - - it('should raise error when getNodeInfo fails', () => { - spyOn(store, 'dispatch').and.stub(); - spyOn(contentManagementService, 'getNodeInfo').and.returnValue( - throwError('error') - ); - - uploadVersionInput.files = createFileList('bogus.txt'); - uploadVersionInput.dispatchEvent(new CustomEvent('change')); - expect(store.dispatch).toHaveBeenCalledWith( - new SnackbarErrorAction('VERSION.ERROR.GENERIC') - ); - expect(effects.uploadAndUnlock).not.toHaveBeenCalled(); }); }); }); diff --git a/src/app/store/effects/upload.effects.ts b/src/app/store/effects/upload.effects.ts index 65067d90b..83a896f5d 100644 --- a/src/app/store/effects/upload.effects.ts +++ b/src/app/store/effects/upload.effects.ts @@ -37,9 +37,10 @@ import { FileModel, FileUtils, UploadService } from '@alfresco/adf-core'; import { Injectable, NgZone, RendererFactory2 } from '@angular/core'; import { Actions, Effect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; -import { forkJoin, of } from 'rxjs'; -import { tap, filter, catchError, flatMap, map, take } from 'rxjs/operators'; +import { of } from 'rxjs'; +import { catchError, map, take } from 'rxjs/operators'; import { ContentManagementService } from '../../services/content-management.service'; +import { MinimalNodeEntryEntity } from '@alfresco/js-api'; @Injectable() export class UploadEffects { @@ -69,9 +70,9 @@ export class UploadEffects { this.fileVersionInput.id = 'app-upload-file-version'; this.fileVersionInput.type = 'file'; this.fileVersionInput.style.display = 'none'; - this.fileVersionInput.addEventListener('change', () => - this.uploadVersion() - ); + this.fileVersionInput.addEventListener('change', () => { + this.uploadVersion(); + }); renderer.appendChild(document.body, this.fileVersionInput); this.folderInput = renderer.createElement('input') as HTMLInputElement; @@ -103,55 +104,34 @@ export class UploadEffects { @Effect({ dispatch: false }) uploadVersion$ = this.actions$.pipe( ofType(UploadActionTypes.UploadFileVersion), - map(() => { - this.fileVersionInput.click(); + map(action => { + if (action && action.payload) { + const node = action.payload.detail.data.node.entry; + const file: any = action.payload.detail.files[0].file; + this.contentService.versionUpdateDialog(node, file); + } else if (!action.payload) { + this.fileVersionInput.click(); + } }) ); - private uploadVersion() { + uploadVersion() { this.contentService - .versionUploadDialog() - .afterClosed() + .getNodeInfo() .pipe( - tap(form => { - if (!form) { - this.fileVersionInput.value = ''; - } - }), - filter(form => !!form), - flatMap(form => - forkJoin( - of(form), - this.contentService.getNodeInfo().pipe( - catchError(_ => { - this.store.dispatch( - new SnackbarErrorAction('VERSION.ERROR.GENERIC') - ); - return of(null); - }) - ) - ) - ) + catchError(_ => { + this.store.dispatch(new SnackbarErrorAction('VERSION.ERROR.GENERIC')); + return of(null); + }) ) - .subscribe(([form, node]) => { - if (form && node) { - const file: any = this.fileVersionInput.files[0]; - const fileModel = new FileModel( - file, - { - comment: form.comment, - majorVersion: form.version, - parentId: node.parentId, - path: (file.webkitRelativePath || '').replace(/\/[^\/]*$/, ''), - newVersion: true, - nodeType: 'cm:content' - }, - node.id + .subscribe((node: MinimalNodeEntryEntity) => { + if (node) { + this.contentService.versionUpdateDialog( + node, + this.fileVersionInput.files[0] ); - this.uploadAndUnlock(fileModel); + this.fileVersionInput.value = ''; } - - this.fileVersionInput.value = ''; }); }