mirror of
https://github.com/Alfresco/alfresco-content-app.git
synced 2025-07-31 17:38:28 +00:00
refactor layout component (#716)
* refactor layout component * test fixes
This commit is contained in:
@@ -1,23 +1,21 @@
|
|||||||
<div class="layout">
|
<div class="layout">
|
||||||
<adf-upload-drag-area
|
<adf-upload-drag-area
|
||||||
[parentId]="node?.id"
|
[parentId]="currentFolderId"
|
||||||
[disabled]="!canUpload">
|
[disabled]="!canUpload">
|
||||||
|
|
||||||
<adf-sidenav-layout
|
<adf-sidenav-layout
|
||||||
#layout
|
#layout
|
||||||
#sidenavManager="acaSidenavManager"
|
|
||||||
acaSidenavManager
|
|
||||||
[sidenavMin]="70"
|
[sidenavMin]="70"
|
||||||
[sidenavMax]="320"
|
[sidenavMax]="320"
|
||||||
[stepOver]="600"
|
[stepOver]="600"
|
||||||
[hideSidenav]="sidenavManager.hideSidenav"
|
[hideSidenav]="hideSidenav"
|
||||||
[expandedSidenav]="expandedSidenav"
|
[expandedSidenav]="expandedSidenav"
|
||||||
(expanded)="sidenavManager.setState($event)">
|
(expanded)="onExpanded($event)">
|
||||||
|
|
||||||
<adf-sidenav-layout-header>
|
<adf-sidenav-layout-header>
|
||||||
<ng-template>
|
<ng-template>
|
||||||
<app-header
|
<app-header
|
||||||
*ngIf="!sidenavManager.hideSidenav"
|
*ngIf="!hideSidenav"
|
||||||
(toggleClicked)="layout.toggleMenu($event)">
|
(toggleClicked)="layout.toggleMenu($event)">
|
||||||
</app-header>
|
</app-header>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@@ -27,7 +27,6 @@ import { NO_ERRORS_SCHEMA } from '@angular/core';
|
|||||||
import { TestBed, ComponentFixture } from '@angular/core/testing';
|
import { TestBed, ComponentFixture } from '@angular/core/testing';
|
||||||
import { AppConfigService, UserPreferencesService } from '@alfresco/adf-core';
|
import { AppConfigService, UserPreferencesService } from '@alfresco/adf-core';
|
||||||
import { LayoutComponent } from './layout.component';
|
import { LayoutComponent } from './layout.component';
|
||||||
import { SidenavViewsManagerDirective } from './sidenav-views-manager.directive';
|
|
||||||
import { AppTestingModule } from '../../testing/app-testing.module';
|
import { AppTestingModule } from '../../testing/app-testing.module';
|
||||||
|
|
||||||
describe('LayoutComponent', () => {
|
describe('LayoutComponent', () => {
|
||||||
@@ -39,7 +38,7 @@ describe('LayoutComponent', () => {
|
|||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
imports: [AppTestingModule],
|
imports: [AppTestingModule],
|
||||||
declarations: [LayoutComponent, SidenavViewsManagerDirective],
|
declarations: [LayoutComponent],
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -23,21 +23,25 @@
|
|||||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import {
|
||||||
|
AppConfigService,
|
||||||
|
SidenavLayoutComponent,
|
||||||
|
UserPreferencesService
|
||||||
|
} from '@alfresco/adf-core';
|
||||||
import {
|
import {
|
||||||
Component,
|
Component,
|
||||||
OnInit,
|
|
||||||
OnDestroy,
|
OnDestroy,
|
||||||
|
OnInit,
|
||||||
ViewChild,
|
ViewChild,
|
||||||
ViewEncapsulation
|
ViewEncapsulation
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import { Subject } from 'rxjs';
|
import { NavigationEnd, Router } from '@angular/router';
|
||||||
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
|
|
||||||
import { NodePermissionService } from '../../services/node-permission.service';
|
|
||||||
import { SidenavViewsManagerDirective } from './sidenav-views-manager.directive';
|
|
||||||
import { Store } from '@ngrx/store';
|
import { Store } from '@ngrx/store';
|
||||||
import { AppStore } from '../../store/states';
|
import { Subject } from 'rxjs';
|
||||||
|
import { filter, takeUntil } from 'rxjs/operators';
|
||||||
|
import { NodePermissionService } from '../../services/node-permission.service';
|
||||||
import { currentFolder } from '../../store/selectors/app.selectors';
|
import { currentFolder } from '../../store/selectors/app.selectors';
|
||||||
import { takeUntil } from 'rxjs/operators';
|
import { AppStore } from '../../store/states';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-layout',
|
selector: 'app-layout',
|
||||||
@@ -47,39 +51,105 @@ import { takeUntil } from 'rxjs/operators';
|
|||||||
host: { class: 'app-layout' }
|
host: { class: 'app-layout' }
|
||||||
})
|
})
|
||||||
export class LayoutComponent implements OnInit, OnDestroy {
|
export class LayoutComponent implements OnInit, OnDestroy {
|
||||||
@ViewChild(SidenavViewsManagerDirective)
|
@ViewChild('layout')
|
||||||
manager: SidenavViewsManagerDirective;
|
layout: SidenavLayoutComponent;
|
||||||
|
|
||||||
onDestroy$: Subject<boolean> = new Subject<boolean>();
|
onDestroy$: Subject<boolean> = new Subject<boolean>();
|
||||||
expandedSidenav: boolean;
|
expandedSidenav: boolean;
|
||||||
node: MinimalNodeEntryEntity;
|
currentFolderId: string;
|
||||||
canUpload = false;
|
canUpload = false;
|
||||||
|
|
||||||
|
minimizeSidenav = false;
|
||||||
|
hideSidenav = false;
|
||||||
|
|
||||||
|
private minimizeConditions: string[] = ['search'];
|
||||||
|
private hideConditions: string[] = ['preview'];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
protected store: Store<AppStore>,
|
protected store: Store<AppStore>,
|
||||||
private permission: NodePermissionService
|
private permission: NodePermissionService,
|
||||||
|
private router: Router,
|
||||||
|
private userPreferenceService: UserPreferencesService,
|
||||||
|
private appConfigService: AppConfigService
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
if (!this.manager.minimizeSidenav) {
|
if (!this.minimizeSidenav) {
|
||||||
this.expandedSidenav = this.manager.sidenavState;
|
this.expandedSidenav = this.getSidenavState();
|
||||||
} else {
|
} else {
|
||||||
this.expandedSidenav = false;
|
this.expandedSidenav = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.manager.run(true);
|
|
||||||
|
|
||||||
this.store
|
this.store
|
||||||
.select(currentFolder)
|
.select(currentFolder)
|
||||||
.pipe(takeUntil(this.onDestroy$))
|
.pipe(takeUntil(this.onDestroy$))
|
||||||
.subscribe(node => {
|
.subscribe(node => {
|
||||||
this.node = node;
|
this.currentFolderId = node ? node.id : null;
|
||||||
this.canUpload = node && this.permission.check(node, ['create']);
|
this.canUpload = node && this.permission.check(node, ['create']);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.router.events
|
||||||
|
.pipe(
|
||||||
|
filter(event => event instanceof NavigationEnd),
|
||||||
|
takeUntil(this.onDestroy$)
|
||||||
|
)
|
||||||
|
.subscribe((event: any) => {
|
||||||
|
this.minimizeSidenav = this.minimizeConditions.some(el =>
|
||||||
|
event.urlAfterRedirects.includes(el)
|
||||||
|
);
|
||||||
|
this.hideSidenav = this.hideConditions.some(el =>
|
||||||
|
event.urlAfterRedirects.includes(el)
|
||||||
|
);
|
||||||
|
|
||||||
|
this.updateState();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnDestroy() {
|
ngOnDestroy() {
|
||||||
this.onDestroy$.next(true);
|
this.onDestroy$.next(true);
|
||||||
this.onDestroy$.complete();
|
this.onDestroy$.complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private updateState() {
|
||||||
|
if (this.minimizeSidenav && !this.layout.isMenuMinimized) {
|
||||||
|
this.layout.isMenuMinimized = true;
|
||||||
|
this.layout.container.toggleMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.minimizeSidenav) {
|
||||||
|
if (this.getSidenavState() && this.layout.isMenuMinimized) {
|
||||||
|
this.layout.isMenuMinimized = false;
|
||||||
|
this.layout.container.toggleMenu();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onExpanded(state) {
|
||||||
|
if (
|
||||||
|
!this.minimizeSidenav &&
|
||||||
|
this.appConfigService.get('sideNav.preserveState')
|
||||||
|
) {
|
||||||
|
this.userPreferenceService.set('expandedSidenav', state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private getSidenavState(): boolean {
|
||||||
|
const expand = this.appConfigService.get<boolean>(
|
||||||
|
'sideNav.expandedSidenav',
|
||||||
|
true
|
||||||
|
);
|
||||||
|
const preserveState = this.appConfigService.get<boolean>(
|
||||||
|
'sideNav.preserveState',
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
|
if (preserveState) {
|
||||||
|
return (
|
||||||
|
this.userPreferenceService.get('expandedSidenav', expand.toString()) ===
|
||||||
|
'true'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return expand;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -27,7 +27,6 @@ import { NgModule } from '@angular/core';
|
|||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
import { CoreModule } from '@alfresco/adf-core';
|
import { CoreModule } from '@alfresco/adf-core';
|
||||||
import { LayoutComponent } from './layout.component';
|
import { LayoutComponent } from './layout.component';
|
||||||
import { SidenavViewsManagerDirective } from './sidenav-views-manager.directive';
|
|
||||||
import { ContentModule } from '@alfresco/adf-content-services';
|
import { ContentModule } from '@alfresco/adf-content-services';
|
||||||
import { RouterModule } from '@angular/router';
|
import { RouterModule } from '@angular/router';
|
||||||
import { AppSidenavModule } from '../sidenav/sidenav.module';
|
import { AppSidenavModule } from '../sidenav/sidenav.module';
|
||||||
@@ -44,7 +43,7 @@ import { AppHeaderModule } from '../header/header.module';
|
|||||||
AppSidenavModule,
|
AppSidenavModule,
|
||||||
AppHeaderModule
|
AppHeaderModule
|
||||||
],
|
],
|
||||||
declarations: [LayoutComponent, SidenavViewsManagerDirective],
|
declarations: [LayoutComponent],
|
||||||
exports: [LayoutComponent]
|
exports: [LayoutComponent]
|
||||||
})
|
})
|
||||||
export class AppLayoutModule {}
|
export class AppLayoutModule {}
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
import { SidenavViewsManagerDirective } from './sidenav-views-manager.directive';
|
import { SidenavViewsManagerDirective } from './sidenav-views-manager.directive';
|
||||||
import { NavigationEnd } from '@angular/router';
|
import { NavigationEnd } from '@angular/router';
|
||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
@@ -78,3 +79,4 @@ describe('SidenavViewsManagerDirective', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
@@ -1,92 +0,0 @@
|
|||||||
import { Directive, ContentChild } from '@angular/core';
|
|
||||||
import { Router, NavigationEnd } from '@angular/router';
|
|
||||||
import {
|
|
||||||
UserPreferencesService,
|
|
||||||
AppConfigService,
|
|
||||||
SidenavLayoutComponent
|
|
||||||
} from '@alfresco/adf-core';
|
|
||||||
import { filter } from 'rxjs/operators';
|
|
||||||
|
|
||||||
@Directive({
|
|
||||||
selector: '[acaSidenavManager]',
|
|
||||||
exportAs: 'acaSidenavManager'
|
|
||||||
})
|
|
||||||
export class SidenavViewsManagerDirective {
|
|
||||||
@ContentChild(SidenavLayoutComponent)
|
|
||||||
sidenavLayout: SidenavLayoutComponent;
|
|
||||||
|
|
||||||
minimizeSidenav = false;
|
|
||||||
hideSidenav = false;
|
|
||||||
|
|
||||||
private _run = false;
|
|
||||||
private minimizeConditions: string[] = ['search'];
|
|
||||||
private hideConditions: string[] = ['preview'];
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private router: Router,
|
|
||||||
private userPreferenceService: UserPreferencesService,
|
|
||||||
private appConfigService: AppConfigService
|
|
||||||
) {
|
|
||||||
this.router.events
|
|
||||||
.pipe(filter(event => event instanceof NavigationEnd))
|
|
||||||
.subscribe((event: any) => {
|
|
||||||
this.minimizeSidenav = this.minimizeConditions.some(el =>
|
|
||||||
event.urlAfterRedirects.includes(el)
|
|
||||||
);
|
|
||||||
this.hideSidenav = this.hideConditions.some(el =>
|
|
||||||
event.urlAfterRedirects.includes(el)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (this._run) {
|
|
||||||
this.manageSidenavState();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
run(shouldRun) {
|
|
||||||
this._run = shouldRun;
|
|
||||||
}
|
|
||||||
|
|
||||||
manageSidenavState() {
|
|
||||||
if (this.minimizeSidenav && !this.sidenavLayout.isMenuMinimized) {
|
|
||||||
this.sidenavLayout.isMenuMinimized = true;
|
|
||||||
this.sidenavLayout.container.toggleMenu();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.minimizeSidenav) {
|
|
||||||
if (this.sidenavState && this.sidenavLayout.isMenuMinimized) {
|
|
||||||
this.sidenavLayout.isMenuMinimized = false;
|
|
||||||
this.sidenavLayout.container.toggleMenu();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setState(state) {
|
|
||||||
if (
|
|
||||||
!this.minimizeSidenav &&
|
|
||||||
this.appConfigService.get('sideNav.preserveState')
|
|
||||||
) {
|
|
||||||
this.userPreferenceService.set('expandedSidenav', state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get sidenavState(): boolean {
|
|
||||||
const expand = this.appConfigService.get<boolean>(
|
|
||||||
'sideNav.expandedSidenav',
|
|
||||||
true
|
|
||||||
);
|
|
||||||
const preserveState = this.appConfigService.get<boolean>(
|
|
||||||
'sideNav.preserveState',
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
if (preserveState) {
|
|
||||||
return (
|
|
||||||
this.userPreferenceService.get('expandedSidenav', expand.toString()) ===
|
|
||||||
'true'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return expand;
|
|
||||||
}
|
|
||||||
}
|
|
Reference in New Issue
Block a user