mirror of
https://github.com/Alfresco/alfresco-content-app.git
synced 2025-09-17 14:21:14 +00:00
[ACA-1455] universal Viewer @effect (#412)
* viewer @effect * universal preview effect * remove router where not needed * update tests * update tests
This commit is contained in:
committed by
Cilibiu Bogdan
parent
d1e5353d7a
commit
f8fe664f1f
@@ -87,6 +87,7 @@ import { RouterEffects } from './store/effects/router.effects';
|
|||||||
import { CreateFolderDirective } from './directives/create-folder.directive';
|
import { CreateFolderDirective } from './directives/create-folder.directive';
|
||||||
import { DownloadEffects } from './store/effects/download.effects';
|
import { DownloadEffects } from './store/effects/download.effects';
|
||||||
import { DownloadNodesDirective } from './directives/download-nodes.directive';
|
import { DownloadNodesDirective } from './directives/download-nodes.directive';
|
||||||
|
import { ViewerEffects } from './store/effects/viewer.effects';
|
||||||
|
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
@@ -110,7 +111,13 @@ import { DownloadNodesDirective } from './directives/download-nodes.directive';
|
|||||||
|
|
||||||
StoreModule.forRoot({ app: appReducer }, { initialState: INITIAL_STATE }),
|
StoreModule.forRoot({ app: appReducer }, { initialState: INITIAL_STATE }),
|
||||||
StoreRouterConnectingModule.forRoot({ stateKey: 'router' }),
|
StoreRouterConnectingModule.forRoot({ stateKey: 'router' }),
|
||||||
EffectsModule.forRoot([SnackbarEffects, NodeEffects, RouterEffects, DownloadEffects]),
|
EffectsModule.forRoot([
|
||||||
|
SnackbarEffects,
|
||||||
|
NodeEffects,
|
||||||
|
RouterEffects,
|
||||||
|
DownloadEffects,
|
||||||
|
ViewerEffects
|
||||||
|
]),
|
||||||
!environment.production ? StoreDevtoolsModule.instrument({ maxAge: 25 }) : []
|
!environment.production ? StoreDevtoolsModule.instrument({ maxAge: 25 }) : []
|
||||||
],
|
],
|
||||||
declarations: [
|
declarations: [
|
||||||
|
@@ -191,32 +191,6 @@ describe('FavoritesComponent', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('onNodeDoubleClick', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
spyOn(nodesApi, 'getNode').and.returnValue(Observable.of(node));
|
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('navigates if node is a folder', () => {
|
|
||||||
node.isFolder = true;
|
|
||||||
spyOn(router, 'navigate');
|
|
||||||
|
|
||||||
component.onNodeDoubleClick({ entry: node });
|
|
||||||
|
|
||||||
expect(router.navigate).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('opens preview if node is a file', () => {
|
|
||||||
node.isFolder = false;
|
|
||||||
node.isFile = true;
|
|
||||||
spyOn(router, 'navigate').and.stub();
|
|
||||||
|
|
||||||
component.onNodeDoubleClick({ entry: node });
|
|
||||||
|
|
||||||
expect(router.navigate['calls'].argsFor(0)[0]).toEqual(['./preview', 'folder-node']);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('refresh', () => {
|
describe('refresh', () => {
|
||||||
it('should call document list reload', () => {
|
it('should call document list reload', () => {
|
||||||
spyOn(component.documentList, 'reload');
|
spyOn(component.documentList, 'reload');
|
||||||
|
@@ -39,14 +39,14 @@ import { AppStore } from '../../store/states/app.state';
|
|||||||
})
|
})
|
||||||
export class FavoritesComponent extends PageComponent implements OnInit {
|
export class FavoritesComponent extends PageComponent implements OnInit {
|
||||||
|
|
||||||
constructor(router: Router,
|
constructor(private router: Router,
|
||||||
route: ActivatedRoute,
|
route: ActivatedRoute,
|
||||||
store: Store<AppStore>,
|
store: Store<AppStore>,
|
||||||
private nodesApi: NodesApiService,
|
private nodesApi: NodesApiService,
|
||||||
private content: ContentManagementService,
|
private content: ContentManagementService,
|
||||||
public permission: NodePermissionService,
|
public permission: NodePermissionService,
|
||||||
preferences: UserPreferencesService) {
|
preferences: UserPreferencesService) {
|
||||||
super(preferences, router, route, store);
|
super(preferences, route, store);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
@@ -112,7 +112,7 @@
|
|||||||
[allowDropFiles]="true"
|
[allowDropFiles]="true"
|
||||||
[navigate]="false"
|
[navigate]="false"
|
||||||
[imageResolver]="imageResolver"
|
[imageResolver]="imageResolver"
|
||||||
(node-dblclick)="onNodeDoubleClick($event)"
|
(node-dblclick)="onNodeDoubleClick($event.detail?.node)"
|
||||||
(ready)="onDocumentListReady($event, documentList)"
|
(ready)="onDocumentListReady($event, documentList)"
|
||||||
(node-select)="onNodeSelect($event, documentList)"
|
(node-select)="onNodeSelect($event, documentList)"
|
||||||
(node-unselect)="onNodeUnselect($event, documentList)">
|
(node-unselect)="onNodeUnselect($event, documentList)">
|
||||||
|
@@ -335,49 +335,6 @@ describe('FilesComponent', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('onNodeDoubleClick()', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
spyOn(component, 'fetchNode').and.returnValue(Observable.of(node));
|
|
||||||
spyOn(component, 'fetchNodes').and.returnValue(Observable.of(page));
|
|
||||||
|
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should open preview if node is file', () => {
|
|
||||||
spyOn(router, 'navigate').and.stub();
|
|
||||||
node.isFile = true;
|
|
||||||
node.isFolder = false;
|
|
||||||
|
|
||||||
const event: any = {
|
|
||||||
detail: {
|
|
||||||
node: {
|
|
||||||
entry: node
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
component.onNodeDoubleClick(event);
|
|
||||||
|
|
||||||
expect(router.navigate['calls'].argsFor(0)[0]).toEqual(['./preview', node.id]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should navigate if node is folder', () => {
|
|
||||||
spyOn(component, 'navigate').and.stub();
|
|
||||||
node.isFolder = true;
|
|
||||||
|
|
||||||
|
|
||||||
const event: any = {
|
|
||||||
detail: {
|
|
||||||
node: {
|
|
||||||
entry: node
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
component.onNodeDoubleClick(event);
|
|
||||||
|
|
||||||
expect(component.navigate).toHaveBeenCalledWith(node.id);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('onBreadcrumbNavigate()', () => {
|
describe('onBreadcrumbNavigate()', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
spyOn(component, 'fetchNode').and.returnValue(Observable.of(node));
|
spyOn(component, 'fetchNode').and.returnValue(Observable.of(node));
|
||||||
|
@@ -50,7 +50,7 @@ export class FilesComponent extends PageComponent implements OnInit, OnDestroy {
|
|||||||
|
|
||||||
private nodePath: PathElement[];
|
private nodePath: PathElement[];
|
||||||
|
|
||||||
constructor(router: Router,
|
constructor(private router: Router,
|
||||||
route: ActivatedRoute,
|
route: ActivatedRoute,
|
||||||
store: Store<AppStore>,
|
store: Store<AppStore>,
|
||||||
private nodesApi: NodesApiService,
|
private nodesApi: NodesApiService,
|
||||||
@@ -61,7 +61,7 @@ export class FilesComponent extends PageComponent implements OnInit, OnDestroy {
|
|||||||
private apiService: AlfrescoApiService,
|
private apiService: AlfrescoApiService,
|
||||||
public permission: NodePermissionService,
|
public permission: NodePermissionService,
|
||||||
preferences: UserPreferencesService) {
|
preferences: UserPreferencesService) {
|
||||||
super(preferences, router, route, store);
|
super(preferences, route, store);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
@@ -139,24 +139,21 @@ export class FilesComponent extends PageComponent implements OnInit, OnDestroy {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onNodeDoubleClick(event: CustomEvent) {
|
onNodeDoubleClick(node: MinimalNodeEntity) {
|
||||||
if (!!event.detail && !!event.detail.node) {
|
if (node && node.entry) {
|
||||||
|
const { id, isFolder } = node.entry;
|
||||||
|
|
||||||
const node: MinimalNodeEntryEntity = event.detail.node.entry;
|
if (isFolder) {
|
||||||
if (node) {
|
this.navigate(id);
|
||||||
|
return;
|
||||||
if (node.isFolder) {
|
|
||||||
this.navigate(node.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PageComponent.isLockedNode(node)) {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
} else if (node.isFile) {
|
|
||||||
this.router.navigate(['./preview', node.id], { relativeTo: this.route });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (PageComponent.isLockedNode(node.entry)) {
|
||||||
|
event.preventDefault();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.showPreview(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -40,9 +40,9 @@ export class LibrariesComponent extends PageComponent {
|
|||||||
constructor(private nodesApi: NodesApiService,
|
constructor(private nodesApi: NodesApiService,
|
||||||
route: ActivatedRoute,
|
route: ActivatedRoute,
|
||||||
store: Store<AppStore>,
|
store: Store<AppStore>,
|
||||||
router: Router,
|
private router: Router,
|
||||||
preferences: UserPreferencesService) {
|
preferences: UserPreferencesService) {
|
||||||
super(preferences, router, route, store);
|
super(preferences, route, store);
|
||||||
}
|
}
|
||||||
|
|
||||||
makeLibraryTooltip(library: any): string {
|
makeLibraryTooltip(library: any): string {
|
||||||
|
@@ -34,7 +34,7 @@ class TestClass extends PageComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super(null, null, null, null);
|
super(null, null, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -26,7 +26,7 @@
|
|||||||
import { MinimalNodeEntity, MinimalNodeEntryEntity, Pagination } from 'alfresco-js-api';
|
import { MinimalNodeEntity, MinimalNodeEntryEntity, Pagination } from 'alfresco-js-api';
|
||||||
import { UserPreferencesService, FileUploadErrorEvent } from '@alfresco/adf-core';
|
import { UserPreferencesService, FileUploadErrorEvent } from '@alfresco/adf-core';
|
||||||
import { ShareDataRow, DocumentListComponent } from '@alfresco/adf-content-services';
|
import { ShareDataRow, DocumentListComponent } from '@alfresco/adf-content-services';
|
||||||
import { ActivatedRoute, Router } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
import { OnDestroy, ViewChild, OnInit } from '@angular/core';
|
import { OnDestroy, ViewChild, OnInit } from '@angular/core';
|
||||||
import { Subscription, Subject } from 'rxjs/Rx';
|
import { Subscription, Subject } from 'rxjs/Rx';
|
||||||
import { Store } from '@ngrx/store';
|
import { Store } from '@ngrx/store';
|
||||||
@@ -35,6 +35,7 @@ import { SetSelectedNodesAction } from '../store/actions/node.action';
|
|||||||
import { selectedNodes } from '../store/selectors/app.selectors';
|
import { selectedNodes } from '../store/selectors/app.selectors';
|
||||||
import { takeUntil } from 'rxjs/operators';
|
import { takeUntil } from 'rxjs/operators';
|
||||||
import { SnackbarErrorAction } from '../store/actions';
|
import { SnackbarErrorAction } from '../store/actions';
|
||||||
|
import { ViewNodeAction } from '../store/actions/viewer.action';
|
||||||
|
|
||||||
|
|
||||||
export abstract class PageComponent implements OnInit, OnDestroy {
|
export abstract class PageComponent implements OnInit, OnDestroy {
|
||||||
@@ -66,7 +67,6 @@ export abstract class PageComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constructor(protected preferences: UserPreferencesService,
|
constructor(protected preferences: UserPreferencesService,
|
||||||
protected router: Router,
|
|
||||||
protected route: ActivatedRoute,
|
protected route: ActivatedRoute,
|
||||||
protected store: Store<AppStore>) {
|
protected store: Store<AppStore>) {
|
||||||
}
|
}
|
||||||
@@ -103,8 +103,17 @@ export abstract class PageComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
showPreview(node: MinimalNodeEntity) {
|
showPreview(node: MinimalNodeEntity) {
|
||||||
if (node && node.entry && node.entry.isFile) {
|
if (node && node.entry) {
|
||||||
this.router.navigate(['./preview', node.entry.id], { relativeTo: this.route });
|
const { id, nodeId, name, isFile, isFolder } = node.entry;
|
||||||
|
const parentId = this.node ? this.node.id : null;
|
||||||
|
|
||||||
|
this.store.dispatch(new ViewNodeAction({
|
||||||
|
parentId,
|
||||||
|
id: nodeId || id,
|
||||||
|
name,
|
||||||
|
isFile,
|
||||||
|
isFolder
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -61,11 +61,11 @@ export class PreviewComponent extends PageComponent implements OnInit {
|
|||||||
private apiService: AlfrescoApiService,
|
private apiService: AlfrescoApiService,
|
||||||
preferences: UserPreferencesService,
|
preferences: UserPreferencesService,
|
||||||
route: ActivatedRoute,
|
route: ActivatedRoute,
|
||||||
router: Router,
|
private router: Router,
|
||||||
store: Store<AppStore>,
|
store: Store<AppStore>,
|
||||||
public permission: NodePermissionService) {
|
public permission: NodePermissionService) {
|
||||||
|
|
||||||
super(preferences, router, route, store);
|
super(preferences, route, store);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
@@ -92,7 +92,7 @@
|
|||||||
[sorting]="[ 'modifiedAt', 'desc' ]"
|
[sorting]="[ 'modifiedAt', 'desc' ]"
|
||||||
[acaSortingPreferenceKey]="sortingPreferenceKey"
|
[acaSortingPreferenceKey]="sortingPreferenceKey"
|
||||||
[imageResolver]="imageResolver"
|
[imageResolver]="imageResolver"
|
||||||
(node-dblclick)="onNodeDoubleClick($event.detail?.node?.entry)"
|
(node-dblclick)="onNodeDoubleClick($event.detail?.node)"
|
||||||
(ready)="onDocumentListReady($event, documentList)"
|
(ready)="onDocumentListReady($event, documentList)"
|
||||||
(node-select)="onNodeSelect($event, documentList)"
|
(node-select)="onNodeSelect($event, documentList)"
|
||||||
(node-unselect)="onNodeUnselect($event, documentList)">
|
(node-unselect)="onNodeUnselect($event, documentList)">
|
||||||
|
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
import { TestBed, async, ComponentFixture } from '@angular/core/testing';
|
import { TestBed, async, ComponentFixture } from '@angular/core/testing';
|
||||||
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||||
import { Router } from '@angular/router';
|
|
||||||
import { RouterTestingModule } from '@angular/router/testing';
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
import { HttpClientModule } from '@angular/common/http';
|
import { HttpClientModule } from '@angular/common/http';
|
||||||
import {
|
import {
|
||||||
@@ -51,7 +50,6 @@ import { INITIAL_STATE } from '../../store/states/app.state';
|
|||||||
describe('RecentFiles Routed Component', () => {
|
describe('RecentFiles Routed Component', () => {
|
||||||
let fixture: ComponentFixture<RecentFilesComponent>;
|
let fixture: ComponentFixture<RecentFilesComponent>;
|
||||||
let component: RecentFilesComponent;
|
let component: RecentFilesComponent;
|
||||||
let router: Router;
|
|
||||||
let alfrescoApi: AlfrescoApiService;
|
let alfrescoApi: AlfrescoApiService;
|
||||||
let contentService: ContentManagementService;
|
let contentService: ContentManagementService;
|
||||||
let page;
|
let page;
|
||||||
@@ -108,7 +106,6 @@ describe('RecentFiles Routed Component', () => {
|
|||||||
fixture = TestBed.createComponent(RecentFilesComponent);
|
fixture = TestBed.createComponent(RecentFilesComponent);
|
||||||
component = fixture.componentInstance;
|
component = fixture.componentInstance;
|
||||||
|
|
||||||
router = TestBed.get(Router);
|
|
||||||
contentService = TestBed.get(ContentManagementService);
|
contentService = TestBed.get(ContentManagementService);
|
||||||
alfrescoApi = TestBed.get(AlfrescoApiService);
|
alfrescoApi = TestBed.get(AlfrescoApiService);
|
||||||
alfrescoApi.reset();
|
alfrescoApi.reset();
|
||||||
@@ -153,28 +150,6 @@ describe('RecentFiles Routed Component', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('onNodeDoubleClick()', () => {
|
|
||||||
it('open preview if node is file', () => {
|
|
||||||
spyOn(router, 'navigate').and.stub();
|
|
||||||
const node: any = { id: 'node-id', isFile: true };
|
|
||||||
|
|
||||||
component.onNodeDoubleClick(node);
|
|
||||||
fixture.detectChanges();
|
|
||||||
|
|
||||||
expect(router.navigate['calls'].argsFor(0)[0]).toEqual(['./preview', node.id]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('does not open preview if node is folder', () => {
|
|
||||||
spyOn(router, 'navigate').and.stub();
|
|
||||||
const node: any = { isFolder: true };
|
|
||||||
|
|
||||||
component.onNodeDoubleClick(node);
|
|
||||||
fixture.detectChanges();
|
|
||||||
|
|
||||||
expect(router.navigate).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('refresh', () => {
|
describe('refresh', () => {
|
||||||
it('should call document list reload', () => {
|
it('should call document list reload', () => {
|
||||||
spyOn(component.documentList, 'reload');
|
spyOn(component.documentList, 'reload');
|
||||||
|
@@ -24,8 +24,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { Router, ActivatedRoute } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
|
import { MinimalNodeEntity } from 'alfresco-js-api';
|
||||||
import { UserPreferencesService, UploadService } from '@alfresco/adf-core';
|
import { UserPreferencesService, UploadService } from '@alfresco/adf-core';
|
||||||
|
|
||||||
import { ContentManagementService } from '../../common/services/content-management.service';
|
import { ContentManagementService } from '../../common/services/content-management.service';
|
||||||
@@ -40,14 +40,13 @@ import { AppStore } from '../../store/states/app.state';
|
|||||||
export class RecentFilesComponent extends PageComponent implements OnInit {
|
export class RecentFilesComponent extends PageComponent implements OnInit {
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
router: Router,
|
|
||||||
route: ActivatedRoute,
|
route: ActivatedRoute,
|
||||||
store: Store<AppStore>,
|
store: Store<AppStore>,
|
||||||
private uploadService: UploadService,
|
private uploadService: UploadService,
|
||||||
private content: ContentManagementService,
|
private content: ContentManagementService,
|
||||||
public permission: NodePermissionService,
|
public permission: NodePermissionService,
|
||||||
preferences: UserPreferencesService) {
|
preferences: UserPreferencesService) {
|
||||||
super(preferences, router, route, store);
|
super(preferences, route, store);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
@@ -61,12 +60,14 @@ export class RecentFilesComponent extends PageComponent implements OnInit {
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
onNodeDoubleClick(node: MinimalNodeEntryEntity) {
|
onNodeDoubleClick(node: MinimalNodeEntity) {
|
||||||
if (node && PageComponent.isLockedNode(node)) {
|
if (node && node.entry) {
|
||||||
event.preventDefault();
|
if (PageComponent.isLockedNode(node.entry)) {
|
||||||
|
event.preventDefault();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (node && node.isFile) {
|
this.showPreview(node);
|
||||||
this.router.navigate(['./preview', node.id], { relativeTo: this.route });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -96,7 +96,7 @@
|
|||||||
[sortingMode]="'server'"
|
[sortingMode]="'server'"
|
||||||
[sorting]="sorting"
|
[sorting]="sorting"
|
||||||
[node]="data"
|
[node]="data"
|
||||||
(node-dblclick)="onNodeDoubleClick($event.detail?.node?.entry)"
|
(node-dblclick)="onNodeDoubleClick($event.detail?.node)"
|
||||||
(ready)="onDocumentListReady($event, documentList)"
|
(ready)="onDocumentListReady($event, documentList)"
|
||||||
(node-select)="onNodeSelect($event, documentList)"
|
(node-select)="onNodeSelect($event, documentList)"
|
||||||
(node-unselect)="onNodeUnselect($event, documentList)">
|
(node-unselect)="onNodeUnselect($event, documentList)">
|
||||||
|
@@ -24,8 +24,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit, ViewChild } from '@angular/core';
|
import { Component, OnInit, ViewChild } from '@angular/core';
|
||||||
import { MinimalNodeEntryEntity, NodePaging, Pagination } from 'alfresco-js-api';
|
import { NodePaging, Pagination, MinimalNodeEntity } from 'alfresco-js-api';
|
||||||
import { Router, ActivatedRoute, Params } from '@angular/router';
|
import { ActivatedRoute, Params } from '@angular/router';
|
||||||
import { SearchQueryBuilderService, SearchComponent as AdfSearchComponent, NodePermissionService } from '@alfresco/adf-content-services';
|
import { SearchQueryBuilderService, SearchComponent as AdfSearchComponent, NodePermissionService } from '@alfresco/adf-content-services';
|
||||||
import { SearchConfigurationService, UserPreferencesService, SearchService } from '@alfresco/adf-core';
|
import { SearchConfigurationService, UserPreferencesService, SearchService } from '@alfresco/adf-core';
|
||||||
import { PageComponent } from '../page.component';
|
import { PageComponent } from '../page.component';
|
||||||
@@ -57,10 +57,9 @@ export class SearchComponent extends PageComponent implements OnInit {
|
|||||||
private queryBuilder: SearchQueryBuilderService,
|
private queryBuilder: SearchQueryBuilderService,
|
||||||
private searchConfiguration: SearchConfigurationService,
|
private searchConfiguration: SearchConfigurationService,
|
||||||
store: Store<AppStore>,
|
store: Store<AppStore>,
|
||||||
router: Router,
|
|
||||||
preferences: UserPreferencesService,
|
preferences: UserPreferencesService,
|
||||||
route: ActivatedRoute) {
|
route: ActivatedRoute) {
|
||||||
super(preferences, router, route, store);
|
super(preferences, route, store);
|
||||||
|
|
||||||
queryBuilder.paging = {
|
queryBuilder.paging = {
|
||||||
skipCount: 0,
|
skipCount: 0,
|
||||||
@@ -123,16 +122,19 @@ export class SearchComponent extends PageComponent implements OnInit {
|
|||||||
return ['name', 'asc'];
|
return ['name', 'asc'];
|
||||||
}
|
}
|
||||||
|
|
||||||
onNodeDoubleClick(node: MinimalNodeEntryEntity) {
|
onNodeDoubleClick(node: MinimalNodeEntity) {
|
||||||
if (node && node.isFolder) {
|
if (node && node.entry) {
|
||||||
this.store.dispatch(new NavigateToLocationAction(node));
|
if (node.entry.isFolder) {
|
||||||
}
|
this.store.dispatch(new NavigateToLocationAction(node));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (node && PageComponent.isLockedNode(node)) {
|
if (PageComponent.isLockedNode(node.entry)) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (node && node.isFile) {
|
this.showPreview(node);
|
||||||
this.router.navigate(['./preview', node.id], { relativeTo: this.route });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -98,7 +98,7 @@
|
|||||||
selectionMode="multiple"
|
selectionMode="multiple"
|
||||||
[sorting]="[ 'modifiedAt', 'desc' ]"
|
[sorting]="[ 'modifiedAt', 'desc' ]"
|
||||||
[acaSortingPreferenceKey]="sortingPreferenceKey"
|
[acaSortingPreferenceKey]="sortingPreferenceKey"
|
||||||
(node-dblclick)="onNodeDoubleClick($event.detail?.node?.entry)"
|
(node-dblclick)="showPreview($event.detail?.node)"
|
||||||
(ready)="onDocumentListReady($event, documentList)"
|
(ready)="onDocumentListReady($event, documentList)"
|
||||||
(node-select)="onNodeSelect($event, documentList)"
|
(node-select)="onNodeSelect($event, documentList)"
|
||||||
(node-unselect)="onNodeUnselect($event, documentList)">
|
(node-unselect)="onNodeUnselect($event, documentList)">
|
||||||
|
@@ -23,9 +23,8 @@
|
|||||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { TestBed, async, fakeAsync, tick, ComponentFixture } from '@angular/core/testing';
|
import { TestBed, async, ComponentFixture } from '@angular/core/testing';
|
||||||
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||||
import { Router } from '@angular/router';
|
|
||||||
import { RouterTestingModule } from '@angular/router/testing';
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
import { HttpClientModule } from '@angular/common/http';
|
import { HttpClientModule } from '@angular/common/http';
|
||||||
import {
|
import {
|
||||||
@@ -52,9 +51,7 @@ describe('SharedFilesComponent', () => {
|
|||||||
let fixture: ComponentFixture<SharedFilesComponent>;
|
let fixture: ComponentFixture<SharedFilesComponent>;
|
||||||
let component: SharedFilesComponent;
|
let component: SharedFilesComponent;
|
||||||
let contentService: ContentManagementService;
|
let contentService: ContentManagementService;
|
||||||
let nodeService;
|
|
||||||
let alfrescoApi: AlfrescoApiService;
|
let alfrescoApi: AlfrescoApiService;
|
||||||
let router: Router;
|
|
||||||
let page;
|
let page;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
@@ -114,8 +111,6 @@ describe('SharedFilesComponent', () => {
|
|||||||
contentService = TestBed.get(ContentManagementService);
|
contentService = TestBed.get(ContentManagementService);
|
||||||
alfrescoApi = TestBed.get(AlfrescoApiService);
|
alfrescoApi = TestBed.get(AlfrescoApiService);
|
||||||
alfrescoApi.reset();
|
alfrescoApi.reset();
|
||||||
nodeService = alfrescoApi.getInstance().nodes;
|
|
||||||
router = TestBed.get(Router);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
}));
|
}));
|
||||||
@@ -154,33 +149,6 @@ describe('SharedFilesComponent', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('onNodeDoubleClick()', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('opens viewer if node is file', fakeAsync(() => {
|
|
||||||
spyOn(router, 'navigate').and.stub();
|
|
||||||
const link = { nodeId: 'nodeId' };
|
|
||||||
const node = { entry: { isFile: true, id: 'nodeId' } };
|
|
||||||
|
|
||||||
spyOn(nodeService, 'getNode').and.returnValue(Promise.resolve(node));
|
|
||||||
component.onNodeDoubleClick(link);
|
|
||||||
tick();
|
|
||||||
|
|
||||||
expect(router.navigate['calls'].argsFor(0)[0]).toEqual(['./preview', node.entry.id]);
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('does nothing if link data is not passed', () => {
|
|
||||||
spyOn(router, 'navigate').and.stub();
|
|
||||||
spyOn(nodeService, 'getNode').and.returnValue(Promise.resolve({ entry: { isFile: true } }));
|
|
||||||
|
|
||||||
component.onNodeDoubleClick(null);
|
|
||||||
|
|
||||||
expect(router.navigate).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('refresh', () => {
|
describe('refresh', () => {
|
||||||
it('should call document list reload', () => {
|
it('should call document list reload', () => {
|
||||||
spyOn(component.documentList, 'reload');
|
spyOn(component.documentList, 'reload');
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { Router, ActivatedRoute } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
import { UserPreferencesService, UploadService } from '@alfresco/adf-core';
|
import { UserPreferencesService, UploadService } from '@alfresco/adf-core';
|
||||||
|
|
||||||
import { ContentManagementService } from '../../common/services/content-management.service';
|
import { ContentManagementService } from '../../common/services/content-management.service';
|
||||||
@@ -38,14 +38,13 @@ import { AppStore } from '../../store/states/app.state';
|
|||||||
})
|
})
|
||||||
export class SharedFilesComponent extends PageComponent implements OnInit {
|
export class SharedFilesComponent extends PageComponent implements OnInit {
|
||||||
|
|
||||||
constructor(router: Router,
|
constructor(route: ActivatedRoute,
|
||||||
route: ActivatedRoute,
|
|
||||||
store: Store<AppStore>,
|
store: Store<AppStore>,
|
||||||
private uploadService: UploadService,
|
private uploadService: UploadService,
|
||||||
private content: ContentManagementService,
|
private content: ContentManagementService,
|
||||||
public permission: NodePermissionService,
|
public permission: NodePermissionService,
|
||||||
preferences: UserPreferencesService) {
|
preferences: UserPreferencesService) {
|
||||||
super(preferences, router, route, store);
|
super(preferences, route, store);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
@@ -58,10 +57,4 @@ export class SharedFilesComponent extends PageComponent implements OnInit {
|
|||||||
this.uploadService.fileUploadError.subscribe((error) => this.onFileUploadedError(error))
|
this.uploadService.fileUploadError.subscribe((error) => this.onFileUploadedError(error))
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
onNodeDoubleClick(link: { nodeId?: string }) {
|
|
||||||
if (link && link.nodeId) {
|
|
||||||
this.router.navigate(['./preview', link.nodeId], { relativeTo: this.route });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute, Router } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
import { Pagination } from 'alfresco-js-api';
|
import { Pagination } from 'alfresco-js-api';
|
||||||
import { UserPreferencesService } from '@alfresco/adf-core';
|
import { UserPreferencesService } from '@alfresco/adf-core';
|
||||||
import { ContentManagementService } from '../../common/services/content-management.service';
|
import { ContentManagementService } from '../../common/services/content-management.service';
|
||||||
@@ -40,9 +40,8 @@ export class TrashcanComponent extends PageComponent implements OnInit {
|
|||||||
constructor(private contentManagementService: ContentManagementService,
|
constructor(private contentManagementService: ContentManagementService,
|
||||||
preferences: UserPreferencesService,
|
preferences: UserPreferencesService,
|
||||||
store: Store<AppStore>,
|
store: Store<AppStore>,
|
||||||
router: Router,
|
|
||||||
route: ActivatedRoute) {
|
route: ActivatedRoute) {
|
||||||
super(preferences, router, route, store);
|
super(preferences, route, store);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
@@ -8,6 +8,7 @@ export const PURGE_DELETED_NODES = 'PURGE_DELETED_NODES';
|
|||||||
export const DOWNLOAD_NODES = 'DOWNLOAD_NODES';
|
export const DOWNLOAD_NODES = 'DOWNLOAD_NODES';
|
||||||
|
|
||||||
export interface NodeInfo {
|
export interface NodeInfo {
|
||||||
|
parentId?: string;
|
||||||
id: string;
|
id: string;
|
||||||
name: string;
|
name: string;
|
||||||
isFile?: boolean;
|
isFile?: boolean;
|
||||||
|
9
src/app/store/actions/viewer.action.ts
Normal file
9
src/app/store/actions/viewer.action.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import { Action } from '@ngrx/store';
|
||||||
|
import { NodeInfo } from './node.action';
|
||||||
|
|
||||||
|
export const VIEW_NODE = 'VIEW_NODE';
|
||||||
|
|
||||||
|
export class ViewNodeAction implements Action {
|
||||||
|
readonly type = VIEW_NODE;
|
||||||
|
constructor(public payload: NodeInfo) {}
|
||||||
|
}
|
37
src/app/store/effects/viewer.effects.ts
Normal file
37
src/app/store/effects/viewer.effects.ts
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import { Effect, Actions, ofType } from '@ngrx/effects';
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { map } from 'rxjs/operators';
|
||||||
|
import { ViewNodeAction, VIEW_NODE } from '../actions/viewer.action';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class ViewerEffects {
|
||||||
|
constructor(private actions$: Actions, private router: Router) {}
|
||||||
|
|
||||||
|
@Effect({ dispatch: false })
|
||||||
|
viewNode$ = this.actions$.pipe(
|
||||||
|
ofType<ViewNodeAction>(VIEW_NODE),
|
||||||
|
map(action => {
|
||||||
|
const node = action.payload;
|
||||||
|
if (!node) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let previewLocation = this.router.url;
|
||||||
|
if (previewLocation.lastIndexOf('/') > 0) {
|
||||||
|
previewLocation = previewLocation.substr(
|
||||||
|
0,
|
||||||
|
this.router.url.indexOf('/', 1)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
previewLocation = previewLocation.replace(/\//g, '');
|
||||||
|
|
||||||
|
const path = [previewLocation];
|
||||||
|
if (node.parentId) {
|
||||||
|
path.push(node.parentId);
|
||||||
|
}
|
||||||
|
path.push('preview', node.id);
|
||||||
|
this.router.navigateByUrl(path.join('/'));
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
Reference in New Issue
Block a user