[ADF-3177] added general header component (#3537)

* [ADF-3177] added general header component

* [ADF-3177] added documentation and removed user info mobile behaviour

* [ADF-3177] eddited doc file

* [ADF-3177] renamed folder and style changes

* [ADF-3177] style changes

* [ADF-3177] fix tests

* [ADF-3177] fix lint errors and tests

* [APM-3177] css changes

* [ADF-3177] fix pr

* [ADF-3177] updated documentation

* [ADF-3177] expose module with old name

* [ADF-3177] expose module with old name
This commit is contained in:
Georgiana Roman 2018-07-03 14:35:38 +03:00 committed by Eugenio Romano
parent 87d7a6a27f
commit c4d3bf231a
29 changed files with 302 additions and 29 deletions

View File

@ -2,31 +2,29 @@
<adf-sidenav-layout-header>
<ng-template let-toggleMenu="toggleMenu">
<mat-toolbar color="primary" class="adf-app-layout-toolbar mat-elevation-z6">
<button mat-icon-button (click)="toggleMenu()" *ngIf="!hideSidenav">
<mat-icon>menu</mat-icon>
</button>
<adf-layout-header title="{{ 'APP_LAYOUT.APP_NAME' | translate}}" color="primary" (clicked)=toggleMenu($event)>
<span fxFlex="1 1 auto" fxShow fxHide.lt-sm="true">{{'APP_LAYOUT.APP_NAME' | translate }}</span>
<div class="adf-app-layout-menu-spacer"></div>
<div class="adf-app-layout-menu-spacer"></div>
<app-search-bar fxFlex="0 1 auto"></app-search-bar>
<app-search-bar fxFlex="0 1 auto"></app-search-bar>
<div class="adf-header-delimiter"></div>
<adf-userinfo
class="adf-app-layout-user-profile"
[menuPositionX]="'before'"
[menuPositionY]="'above'">
</adf-userinfo>
<adf-userinfo
class="adf-app-layout-user-profile"
[menuPositionX]="'before'"
[menuPositionY]="'above'">
</adf-userinfo>
<app-theme-picker></app-theme-picker>
<button mat-icon-button [matMenuTriggerFor]="langMenu">
<mat-icon>language</mat-icon>
</button>
<mat-menu #langMenu="matMenu" class="adf-menu">
<adf-language-menu></adf-language-menu>
</mat-menu>
</mat-toolbar>
<app-theme-picker></app-theme-picker>
<button mat-icon-button [matMenuTriggerFor]="langMenu">
<mat-icon>language</mat-icon>
</button>
<mat-menu #langMenu="matMenu" class="adf-menu">
<adf-language-menu></adf-language-menu>
</mat-menu>
</adf-layout-header>
</ng-template>
</adf-sidenav-layout-header>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -0,0 +1,42 @@
---
Added: v2.4.0
Status: Experimental
---
## Header component
Reuseble header for Alfresco applications
## Basic usage
```html
<adf-layout-header
title="title"
logo="logo.png"
color="primary"
(toggled)=toggleMenu($event)>
<app-search-bar fxFlex="0 1 auto"></app-search-bar>
<app-theme-picker></app-theme-picker>
<adf-layout>
```
## Class members
### Properties
| Name | Type | Description |
| -- | -- | -- |
| title | string | Title of the application
| logo | string| Path to an image file for the application logo.
| color | string | Primary color for the header
| showSidenavToggle | boolean | Signals if the sidenav button will be displayed in the header or not. By default is true.
### Events
| Name | Type | Description |
| -- | -- | -- |
| clicked | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<boolean>` | Emitted when click on sidenav button
## Details
This component displays a customizable header which can be reused. The left side of the header (title, button) and the primary color for the header can be configured via input parameters.
The right part of the header are existing components which are transcluded in the header component.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -39,7 +39,7 @@ import { ToolbarModule } from './toolbar/toolbar.module';
import { UserInfoModule } from './userinfo/userinfo.module';
import { ViewerModule } from './viewer/viewer.module';
import { FormModule } from './form/form.module';
import { SidenavLayoutModule } from './sidenav-layout/sidenav-layout.module';
import { SidenavLayoutModule } from './layout/layout.module';
import { CommentsModule } from './comments/comments.module';
import { ButtonsMenuModule } from './buttons-menu/buttons-menu.module';
import { TemplateModule } from './templates/template.module';

View File

@ -31,7 +31,7 @@ export * from './collapsable/index';
export * from './card-view/index';
export * from './app-config/index';
export * from './form/index';
export * from './sidenav-layout/index';
export * from './layout/index';
export * from './comments/index';
export * from './buttons-menu/index';
export * from './sorting-picker/index';

View File

@ -0,0 +1,11 @@
<mat-toolbar color="{{color}}">
<button *ngIf="showSidenavToggle" class="mat-icon-button adf-menu-icon" mat-icon-button (click)="toggleMenu()">
<mat-icon class="mat-icon material-icon" role="img" aria-hidden="true">menu</mat-icon>
</button>
<img src="{{logo}}" class="adf-app-logo">
<span fxFlex="1 1 auto" fxShow fxHide.lt-sm="true" class="adf-app-title">{{title}}</span>
<ng-content></ng-content>
</mat-toolbar>

View File

@ -0,0 +1,54 @@
@mixin adf-header-layout-theme($theme) {
$primary: map-get($theme, primary);
$accent: map-get($theme, accent);
$background: map-get($theme, background);
adf-layout-header .mat-toolbar-single-row {
color: mat-color($primary, default-contrast) !important;
position: relative;
padding: 0 24px 0 0;
.adf-menu-icon {
position: relative;
margin-left: 14px;
}
.adf-app-logo {
position: relative;
height: 28px;
width: 28px;
margin-right: 6px;
margin-left: 3px;
}
.adf-header-delimiter {
height: 24px;
width: 2px;
background-color: mat-color($primary, default-contrast);
margin-right: 16px;
}
.adf-app-layout-user-profile {
margin-right: 16px;
}
.adf-userinfo-container {
flex-direction: row;
padding: 0;
}
.adf-userinfo-name{
padding-right: 8px;
}
@media screen and ($mat-xsmall) {
.adf-app-logo,
.adf-app-title {
display: none;
}
}
}
}

View File

@ -0,0 +1,124 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { ComponentFixture, TestBed, async } from '@angular/core/testing';
import { HeaderLayoutComponent } from './header.component';
import { setupTestBed } from '../../../testing/setupTestBed';
import { CoreTestingModule } from '../../../testing/core.testing.module';
import { By } from '@angular/platform-browser';
import { LayoutModule } from '../..';
import { Component } from '@angular/core';
import { MaterialModule } from './../../../material.module';
describe('HeaderLayoutComponent', () => {
let fixture: ComponentFixture<HeaderLayoutComponent>;
let component: HeaderLayoutComponent;
describe('Input parameters', () => {
setupTestBed({
imports: [CoreTestingModule]
});
beforeEach(() => {
fixture = TestBed.createComponent(HeaderLayoutComponent);
component = fixture.componentInstance;
});
afterEach(() => {
fixture.destroy();
});
it('should create instance of HeaderLayoutComponent', () => {
expect(fixture.componentInstance instanceof HeaderLayoutComponent).toBe(true, 'should create HeaderLayoutComponent');
});
it('title element should been displayed', () => {
const titleElement = fixture.debugElement.query(By.css('.adf-app-title'));
expect(titleElement === null).toBeFalsy();
});
it('should show TEST TITLE', () => {
component.title = 'TEST TITLE';
fixture.detectChanges();
const titleElement = fixture.nativeElement.querySelector('.adf-app-title');
expect(titleElement.innerText).toEqual('TEST TITLE');
});
it('color attribute should be present on mat-toolbar', () => {
component.color = 'primary';
fixture.detectChanges();
const toolbar = fixture.nativeElement.querySelector('mat-toolbar');
expect(toolbar.getAttribute('ng-reflect-color') === null).toBeFalsy();
expect(toolbar.getAttribute('ng-reflect-color')).toEqual('primary');
});
it('should display the img element with the expected src if a logo path is set', () => {
component.logo = 'logo.png';
fixture.detectChanges();
const logo = fixture.nativeElement.querySelector('.adf-app-logo');
const src = logo.getAttribute('src');
expect(logo === null).toBeFalsy();
expect(src).toEqual('logo.png');
});
it('test click on sidenav button', () => {
component.showSidenavToggle = true;
fixture.detectChanges();
spyOn(component.clicked, 'emit');
const button = fixture.nativeElement.querySelector('.adf-menu-icon');
button.dispatchEvent(new Event('click'));
fixture.detectChanges();
expect(component.clicked.emit).toHaveBeenCalledWith(true);
});
it('if showSidenavToggle is false the button menu should not be displayed', () => {
component.showSidenavToggle = false;
fixture.detectChanges();
const button = fixture.nativeElement.querySelector('.adf-menu-icon');
expect(button === null).toBeTruthy();
});
});
describe('Template tranclusion', () => {
@Component({
selector: 'adf-test-layout-header',
template: `<adf-layout-header title="test" color="primary"><p>Test text<p></adf-layout-header>`
})
class HeaderLayoutTesterComponent {}
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [HeaderLayoutTesterComponent],
imports: [ LayoutModule, MaterialModule ]
})
.compileComponents();
}));
it('should transclude the provided nodes into the component', () => {
const hostFixture = TestBed.createComponent(HeaderLayoutTesterComponent);
hostFixture.detectChanges();
const innerText = hostFixture.nativeElement.querySelector('mat-toolbar>p').innerText;
expect(innerText).toEqual('Test text');
});
});
});

View File

@ -0,0 +1,39 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, Input, Output, EventEmitter, ViewEncapsulation } from '@angular/core';
@Component({
selector: 'adf-layout-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.scss'],
encapsulation: ViewEncapsulation.None,
host: { 'class': 'adf-layout-header' }
})
export class HeaderLayoutComponent {
@Input() title: string;
@Input() logo: string = '../assets/logo.png';
@Input() color: string;
@Input() showSidenavToggle: boolean = true;
@Output() clicked = new EventEmitter<any>();
toggleMenu() {
this.clicked.emit(true);
}
}

View File

@ -25,7 +25,7 @@ import { SidenavLayoutComponent } from './components/sidenav-layout/sidenav-layo
import { LayoutContainerComponent } from './components/layout-container/layout-container.component';
import { SidebarActionMenuComponent, SidebarMenuDirective,
SidebarMenuExpandIconDirective, SidebarMenuTitleIconDirective } from './components/sidebar-action/sidebar-action-menu.component';
import { HeaderLayoutComponent } from './components/header/header.component';
@NgModule({
imports: [
CommonModule,
@ -40,7 +40,8 @@ import { SidebarActionMenuComponent, SidebarMenuDirective,
SidebarActionMenuComponent,
SidebarMenuDirective,
SidebarMenuExpandIconDirective,
SidebarMenuTitleIconDirective
SidebarMenuTitleIconDirective,
HeaderLayoutComponent
],
declarations: [
SidenavLayoutHeaderDirective,
@ -51,7 +52,9 @@ import { SidebarActionMenuComponent, SidebarMenuDirective,
SidebarActionMenuComponent,
SidebarMenuDirective,
SidebarMenuExpandIconDirective,
SidebarMenuTitleIconDirective
SidebarMenuTitleIconDirective,
HeaderLayoutComponent
]
})
export class SidenavLayoutModule {}
export class LayoutModule {}
export { LayoutModule as SidenavLayoutModule };

View File

@ -17,4 +17,4 @@
export * from './components/sidenav-layout/sidenav-layout.component';
export * from './sidenav-layout.module';
export * from './layout.module';

View File

@ -22,13 +22,14 @@
@import '../viewer/components/txtViewer.component';
@import '../viewer/components/imgViewer.component';
@import '../form/components/form.component';
@import '../sidenav-layout/components/sidebar-action/sidebar-action-menu.component';
@import '../layout/components/sidebar-action/sidebar-action-menu.component';
@import '../comments/comment-list.component';
@import '../comments/comments.component';
@import '../sidenav-layout/components/layout-container/layout-container.component';
@import '../layout/components/layout-container/layout-container.component';
@import "../templates/empty-content/empty-content.component";
@import "../templates/error-content/error-content.component";
@import "../buttons-menu/buttons-menu.component";
@import '../layout/components/header/header.component';
@mixin adf-core-theme($theme) {
@include adf-colors-theme($theme);
@ -60,6 +61,7 @@
@include adf-empty-content-theme($theme);
@include adf-error-content-theme($theme);
@include adf-buttons-menu-theme($theme);
@include adf-header-layout-theme($theme);
}