[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

@@ -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);
}
}