AMBARI-21312 Provide Log Search UI authorization functionality. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/607c9185 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/607c9185 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/607c9185 Branch: refs/heads/trunk Commit: 607c918595ce85e23adbe4ea2a9b79cb6b8492fa Parents: 70633c5 Author: ababiichuk <ababiic...@hortonworks.com> Authored: Thu Jun 22 15:17:33 2017 +0300 Committer: ababiichuk <ababiic...@hortonworks.com> Committed: Thu Jun 22 15:17:33 2017 +0300 ---------------------------------------------------------------------- .../ambari-logsearch-web-new/.angular-cli.json | 9 +- .../e2e/app.e2e-spec.ts | 6 +- .../ambari-logsearch-web-new/package.json | 4 +- .../src/app/app.component.html | 1 + .../src/app/app.component.spec.ts | 27 +- .../src/app/app.component.ts | 9 + .../src/app/app.module.ts | 12 +- .../src/app/http-client.service.spec.ts | 57 + .../src/app/http-client.service.ts | 97 + .../app/login-form/login-form.component.html | 33 + .../app/login-form/login-form.component.spec.ts | 107 + .../src/app/login-form/login-form.component.ts | 59 + .../src/vendor/css/bootstrap-logsearch.min.css | 18 + .../vendor/css/fonts/Roboto-Regular-webfont.eot | Bin 0 -> 79547 bytes .../vendor/css/fonts/Roboto-Regular-webfont.svg | 7606 ++++++++++++++++++ .../vendor/css/fonts/Roboto-Regular-webfont.ttf | Bin 0 -> 234464 bytes .../css/fonts/Roboto-Regular-webfont.woff | Bin 0 -> 105700 bytes .../src/vendor/js/bootstrap-logsearch.min.js | 19 + 18 files changed, 8043 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json index 03c5382..2f90ebe 100644 --- a/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json +++ b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json @@ -20,9 +20,14 @@ "prefix": "app", "styles": [ "styles.less", - "../node_modules/bootstrap/dist/css/bootstrap.min.css" + "../node_modules/bootstrap/dist/css/bootstrap.min.css", + "../node_modules/font-awesome/css/font-awesome.min.css", + "../src/vendor/css/bootstrap-logsearch.min.css" + ], + "scripts": [ + "../node_modules/jquery/dist/jquery.min.js", + "../src/vendor/js/bootstrap-logsearch.min.js" ], - "scripts": [], "environmentSource": "environments/environment.ts", "environments": { "dev": "environments/environment.ts", http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts index 3813a3d..ebfdcb9 100644 --- a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts +++ b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts @@ -16,7 +16,7 @@ * limitations under the License. */ -import { AmbariLogsearchWebNewPage } from './app.po'; +import {AmbariLogsearchWebNewPage} from './app.po'; describe('ambari-logsearch-web-new App', () => { let page: AmbariLogsearchWebNewPage; @@ -25,8 +25,8 @@ describe('ambari-logsearch-web-new App', () => { page = new AmbariLogsearchWebNewPage(); }); - it('should display message saying app works', () => { + it('should display title', () => { page.navigateTo(); - expect(page.getParagraphText()).toEqual('app works!'); + expect(page.getParagraphText()).toEqual('Ambari Log Search'); }); }); http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/package.json ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/package.json b/ambari-logsearch/ambari-logsearch-web-new/package.json index 01ac4be..feccace 100644 --- a/ambari-logsearch/ambari-logsearch-web-new/package.json +++ b/ambari-logsearch/ambari-logsearch-web-new/package.json @@ -23,7 +23,9 @@ "core-js": "^2.4.1", "ngx-bootstrap": "^1.6.6", "rxjs": "^5.1.0", - "zone.js": "^0.8.4" + "zone.js": "^0.8.4", + "jquery": "^1.12.4", + "font-awesome": "^4.7.0" }, "devDependencies": { "@angular/cli": "1.0.0", http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html index 85b96dc..3ba591e 100644 --- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html +++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html @@ -18,3 +18,4 @@ <h1> {{title}} </h1> +<login-form *ngIf="!httpClient.isAuthorized"></login-form> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts index d57f9c4..f6d229f 100644 --- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts +++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts @@ -16,16 +16,26 @@ * limitations under the License. */ -import { TestBed, async } from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {TestBed, async} from '@angular/core/testing'; +import {HttpClientService} from './http-client.service'; -import { AppComponent } from './app.component'; +import {AppComponent} from './app.component'; describe('AppComponent', () => { beforeEach(async(() => { + const httpClient = { + get: () => {} + }; TestBed.configureTestingModule({ - declarations: [ - AppComponent + declarations: [AppComponent], + providers: [ + { + provide: HttpClientService, + useValue: httpClient + }, ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] }).compileComponents(); })); @@ -35,16 +45,11 @@ describe('AppComponent', () => { expect(app).toBeTruthy(); })); - it(`should have as title 'app works!'`, async(() => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.debugElement.componentInstance; - expect(app.title).toEqual('app works!'); - })); - it('should render title in a h1 tag', async(() => { const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; fixture.detectChanges(); const compiled = fixture.debugElement.nativeElement; - expect(compiled.querySelector('h1').textContent).toContain('app works!'); + expect(compiled.querySelector('h1').textContent).toContain(app.title); })); }); http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts index 5f59b8e..6f88af0 100644 --- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts +++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts @@ -17,6 +17,7 @@ */ import {Component} from '@angular/core'; +import {HttpClientService} from './http-client.service'; @Component({ selector: 'app-root', @@ -25,5 +26,13 @@ import {Component} from '@angular/core'; }) export class AppComponent { + + constructor(private httpClient: HttpClientService) { + } + + ngOnInit() { + this.httpClient.get('status'); + } + title = 'Ambari Log Search'; } http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts index 34b7978..39dc46f 100644 --- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts +++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts @@ -17,18 +17,21 @@ */ import {BrowserModule} from '@angular/platform-browser'; -import {NgModule} from '@angular/core'; +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; import {FormsModule} from '@angular/forms'; import {HttpModule} from '@angular/http'; import {InMemoryWebApiModule} from 'angular-in-memory-web-api'; import {mockApiDataService} from './mock-api-data.service' import {AlertModule} from 'ngx-bootstrap'; +import {HttpClientService} from './http-client.service'; import {AppComponent} from './app.component'; +import {LoginFormComponent} from './login-form/login-form.component'; @NgModule({ declarations: [ - AppComponent + AppComponent, + LoginFormComponent ], imports: [ BrowserModule, @@ -37,8 +40,9 @@ import {AppComponent} from './app.component'; InMemoryWebApiModule.forRoot(mockApiDataService), AlertModule.forRoot() ], - providers: [], - bootstrap: [AppComponent] + providers: [HttpClientService], + bootstrap: [AppComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class AppModule { } http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts new file mode 100644 index 0000000..ec8596d --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts @@ -0,0 +1,57 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 {TestBed, inject} from '@angular/core/testing'; +import {HttpModule, Request} from '@angular/http'; +import {HttpClientService} from './http-client.service'; + +describe('HttpClientService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpModule], + providers: [HttpClientService] + }); + }); + + it('should create service', inject([HttpClientService], (service: HttpClientService) => { + expect(service).toBeTruthy(); + })); + + describe('generateUrlString()', () => { + it('should generate URL from presets', inject([HttpClientService], (service:HttpClientService) => { + expect(service.generateUrlString('status')).toEqual('api/v1/status'); + })); + + it('should return explicit URL', inject([HttpClientService], (service:HttpClientService) => { + expect(service.generateUrlString('login')).toEqual('login'); + })); + }); + + describe('generateUrl()', () => { + it('string parameter', inject([HttpClientService], (service:HttpClientService) => { + expect(service.generateUrl('status')).toEqual('api/v1/status'); + })); + + it('request object parameter', inject([HttpClientService], (service:HttpClientService) => { + let request = new Request({ + url: 'status' + }); + expect(service.generateUrl(request).url).toEqual('api/v1/status'); + })); + }); +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts new file mode 100644 index 0000000..3585600 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts @@ -0,0 +1,97 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 {Injectable} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {Http, XHRBackend, Request, RequestOptions, RequestOptionsArgs, Response} from '@angular/http'; +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/catch'; + +@Injectable() +export class HttpClientService extends Http { + + constructor(backend: XHRBackend, defaultOptions: RequestOptions) { + super(backend, defaultOptions); + } + + readonly apiPrefix = 'api/v1/'; + + readonly urls = { + status: 'status' + }; + + isAuthorized: boolean; + + generateUrlString(url: string): string { + const presetUrl = this.urls[url]; + return presetUrl ? (this.apiPrefix + this.urls[url]) : url; + } + + generateUrl(url: string | Request): string | Request { + if (typeof url === 'string') { + return this.generateUrlString(url); + } + if (url instanceof Request) { + url.url = this.generateUrlString(url.url); + return url; + } + } + + handleError(request: Observable<Response>) { + request.subscribe(null, (error: any) => { + if ([401, 403, 419].indexOf(error.status) > -1) { + this.isAuthorized = false; + } + }); + } + + request(url: string | Request, options?: RequestOptionsArgs):Observable<Response> { + let req = super.request(this.generateUrl(url), options); + this.handleError(req); + return req; + } + + get(url: string, options?: RequestOptionsArgs):Observable<Response> { + return super.get(this.generateUrlString(url), options); + } + + post(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> { + return super.post(this.generateUrlString(url), body, options); + } + + put(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> { + return super.put(this.generateUrlString(url), body, options); + } + + delete(url: string, options?: RequestOptionsArgs):Observable<Response> { + return super.delete(this.generateUrlString(url), options); + } + + patch(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> { + return super.patch(this.generateUrlString(url), body, options); + } + + head(url: string, options?: RequestOptionsArgs):Observable<Response> { + return super.head(this.generateUrlString(url), options); + } + + options(url: string, options?: RequestOptionsArgs):Observable<Response> { + return super.options(this.generateUrlString(url), options); + } + +} http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html new file mode 100644 index 0000000..1cad6b3 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.html @@ -0,0 +1,33 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--> + +<div class="well col-md-4 col-md-offset-4 col-sm-offset-4"> + <div class="alert alert-danger" *ngIf="isLoginAlertDisplayed"> + <strong>Error!</strong> Invalid User credentials.<br>Please try again. + </div> + <form #loginForm="ngForm" (ngSubmit)="login()"> + <div class="form-group"> + <label for="username">Username</label> + <input class="form-control" type="text" id="username" name="username" required [(ngModel)]="username"> + </div> + <div class="form-group"> + <label for="password">Password</label> + <input class="form-control" type="password" id="password" name="password" required [(ngModel)]="password"> + </div> + <button class="btn btn-success" [disabled]="!loginForm.form.valid || isRequestInProgress">Sign In</button> + </form> +</div> http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts new file mode 100644 index 0000000..0a13c1e --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.spec.ts @@ -0,0 +1,107 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 {async, ComponentFixture, TestBed} from '@angular/core/testing'; +import {FormsModule} from '@angular/forms'; +import {HttpModule} from '@angular/http'; +import {HttpClientService} from '../http-client.service'; + +import {LoginFormComponent} from './login-form.component'; + +describe('LoginFormComponent', () => { + let component: LoginFormComponent; + let fixture: ComponentFixture<LoginFormComponent>; + + let authMock = { + isError: false + }; + const httpClient = { + isAuthorized: true, + post: () => { + return { + finally: (callback: () => void) => { + callback(); + return { + subscribe: (success: () => void, error: () => void) => { + authMock.isError ? error() : success(); + } + } + } + } + } + }; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [LoginFormComponent], + imports: [HttpModule, FormsModule], + providers: [ + { + provide: HttpClientService, + useValue: httpClient + } + ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create component', () => { + expect(component).toBeTruthy(); + }); + + describe('login()', () => { + let cases = [ + { + isError: true, + isLoginAlertDisplayed: true, + isAuthorized: false, + title: 'login failure' + }, + { + isError: false, + isLoginAlertDisplayed: false, + isAuthorized: true, + title: 'login success' + } + ]; + + cases.forEach(test => { + describe(test.title, () => { + beforeEach(() => { + authMock.isError = test.isError; + component.login(); + }); + + it('isLoginAlertDisplayed', () => { + expect(component.isLoginAlertDisplayed).toEqual(test.isLoginAlertDisplayed); + }); + + it('isRequestInProgress', () => { + expect(component.isRequestInProgress).toEqual(false); + }) + }); + }); + + }); +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts new file mode 100644 index 0000000..8dfa344 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.ts @@ -0,0 +1,59 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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, OnInit} from '@angular/core'; +import 'rxjs/add/operator/finally'; +import {HttpClientService} from '../http-client.service'; + +@Component({ + selector: 'login-form', + templateUrl: './login-form.component.html' +}) +export class LoginFormComponent implements OnInit { + + constructor(private httpClient: HttpClientService) { + } + + ngOnInit() { + } + + username: string; + + password: string; + + isLoginAlertDisplayed: boolean; + + isRequestInProgress: boolean; + + login() { + this.isRequestInProgress = true; + this.httpClient.post('login', { + username: this.username, + password: this.password + }).finally(() => { + this.isRequestInProgress = false; + }).subscribe(() => { + this.isLoginAlertDisplayed = false; + this.httpClient.isAuthorized = true; + }, () => { + this.isLoginAlertDisplayed = true; + this.httpClient.isAuthorized = false; + }); + } + +} http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/bootstrap-logsearch.min.css ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/bootstrap-logsearch.min.css b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/bootstrap-logsearch.min.css new file mode 100644 index 0000000..177d7df --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/bootstrap-logsearch.min.css @@ -0,0 +1,18 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +.btn-group.open .dropdown-menu,.dropdown.open .dropdown-menu,.font-mixin{font-family:Roboto,sans-serif;font-style:normal;font-weight:400}.pagination-block .pagination-block-item a,.pagination-block .pagination-block-item a:focus,.pagination-block .pagination-block-item a:visited,.table.table-hover .action:hover,a,a:focus,a:visited{text-decoration:none}@font-face{font-family:Roboto;font-weight:400;font-style:normal;src:url(fonts/Roboto-Regular-webfont.eot);src:url(fonts/Roboto-Regular-webfont.eot?#iefix) format('embedded-opentype'),url(fonts/Roboto-Regular-webfont.woff) format('woff'),url(fonts/Roboto-Regular-webfont.ttf) format('truetype'),url(fonts/Roboto-Regular-webfont.svg#robotoregular) format('svg')} .font-mixin{line-height:1;color:#333} .btn,.btn:focus{outline:0;font-family:Roboto,sans-serif;text-transform:uppercase;height:34px;font-size:14px;padding:10px 20px;line-height:14px} .btn .glyphicon,.btn:focus .glyphicon{top:-1px;float:left} .box-shadow{box-shadow:0 0 2px 0 #139 1c1} .btn-default-disabled,.btn-disabled{box-shadow:none;opacity:.6} .btn-default-disabled{color:#FFF;background-color:#808793;border:none} .btn-default,.btn-default:focus{color:#666;background-color:#FFF;border:1px solid #CFD3D7} .btn-default:focus:hover,.btn-default:hover{color:#FFF;background-color:#808793} .btn-default:active,.btn-default:focus:active{color:#666;background-color:#FFF;border:1px solid #CFD3D7;box-shadow:0 0 2px 0 #1391c1} .btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:hover,.btn-default:focus.disabled,.btn-default:focus.disabled.active,.btn-default:focus.disabled:active,.btn-default:focus.disabled:hover,.btn-default:focus[disabled],.btn-default:focus[disabled].active,.btn-default:focus[disabled]:active,.btn-default:focus[disabled]:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:hover{opacity:.6;box-shadow:none;color:#FFF;background-color:#8 08793;border:none} .btn-primary-disabled{opacity:.6;box-shadow:none;color:#D1E8D1;background-color:#3FAE2A;border:1px solid #3FAE2A} .btn-primary,.btn-primary:focus{color:#FFF;background-color:#3FAE2A;border:1px solid #3FAE2A} .btn-primary:focus:hover,.btn-primary:hover{color:#FFF;background-color:#429929;border:1px solid #429929} .btn-primary.active,.btn-primary:active,.btn-primary:focus.active,.btn-primary:focus:active{color:#FFF;background-color:#3FAE2A;border:1px solid #3FAE2A;box-shadow:0 0 2px 0 #1391c1} .btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:hover,.btn-primary:focus.disabled,.btn-primary:focus.disabled.active,.btn-primary:focus.disabled:active,.btn-primary:focus.disabled:hover,.btn-primary:focus[disabled],.btn-primary:focus[disabled].active,.btn-primary:focus[disabled]:active,.btn-primary:focus[disabled]:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disa bled]:hover{opacity:.6;box-shadow:none;color:#D1E8D1;background-color:#3FAE2A;border:1px solid #3FAE2A} .btn-secondary-disabled{opacity:.6;box-shadow:none;color:#D1E8D1;background-color:#429929;border:1px solid #3FAE2A} .btn-secondary,.btn-secondary:focus{color:#429929;background-color:#FFF;border:1px solid #3FAE2A} .btn-secondary:focus:hover,.btn-secondary:hover{color:#FFF;background-color:#429929} .btn-secondary:active,.btn-secondary:focus:active{color:#429929;background-color:#FFF;box-shadow:0 0 2px 0 #1391c1} .btn-secondary.disabled,.btn-secondary.disabled.active,.btn-secondary.disabled:active,.btn-secondary.disabled:hover,.btn-secondary:focus.disabled,.btn-secondary:focus.disabled.active,.btn-secondary:focus.disabled:active,.btn-secondary:focus.disabled:hover,.btn-secondary:focus[disabled],.btn-secondary:focus[disabled].active,.btn-secondary:focus[disabled]:active,.btn-secondary:focus[disabled]:hover,.btn-secondary[disabled],.btn-secondary[disabled].active,.btn-secondary[d isabled]:active,.btn-secondary[disabled]:hover{opacity:.6;box-shadow:none;color:#D1E8D1;background-color:#429929;border:1px solid #3FAE2A} .btn-success{border:none} .btn-regular-default-state{background-color:#FFF;color:#666;border:1px solid #cfd3d7} .btn-primary-default-state{background-color:#3FAE2A;border:1px solid #3FAE2A;color:#FFF} .btn-group.open .btn.dropdown-toggle,.dropdown.open .btn.dropdown-toggle{box-shadow:inset 0 0 3px 0 #1391c1} .btn-group.open .btn.dropdown-toggle,.btn-group.open .btn.dropdown-toggle.btn-default,.btn-group.open .btn.dropdown-toggle.btn-default:hover,.btn-group.open .btn.dropdown-toggle:hover,.dropdown.open .btn.dropdown-toggle,.dropdown.open .btn.dropdown-toggle.btn-default,.dropdown.open .btn.dropdown-toggle.btn-default:hover,.dropdown.open .btn.dropdown-toggle:hover{background-color:#FFF;color:#666;border:1px solid #cfd3d7} .btn-group.open .btn.dropdown-toggle+.dropdown-menu>li>a:hover,.btn-group.open .btn.dropdown-toggle.btn-default+.dropdo wn-menu>li>a:hover,.dropdown.open .btn.dropdown-toggle+.dropdown-menu>li>a:hover,.dropdown.open .btn.dropdown-toggle.btn-default+.dropdown-menu>li>a:hover{background-color:#808793;color:#FFF} .btn-group.open .btn.dropdown-toggle.btn-primary,.btn-group.open .btn.dropdown-toggle.btn-primary:hover,.dropdown.open .btn.dropdown-toggle.btn-primary,.dropdown.open .btn.dropdown-toggle.btn-primary:hover{background-color:#3FAE2A;border:1px solid #3FAE2A;color:#FFF} .btn-group.open .btn.dropdown-toggle.btn-primary+.dropdown-menu>li>a:hover,.dropdown.open .btn.dropdown-toggle.btn-primary+.dropdown-menu>li>a:hover{background-color:#429929;color:#FFF} .btn-group.open .dropdown-menu,.dropdown.open .dropdown-menu{line-height:1;border-radius:2px;font-size:14px;min-width:200px;background:#FFF;color:#666;border:1px solid #cfd3d7} .btn-group.open .dropdown-menu>li,.dropdown.open .dropdown-menu>li{margin-bottom:1px} .btn-group.open .dropdown-menu>li>a,.dropdown.open .dropdown-menu>li>a{height:24px} .btn-group .btn.dropdown-toggle:first-child,.dropdown .btn.dropdown-toggle:first-child{min-width:80px} .btn-group .btn.dropdown-toggle.disabled,.btn-group .btn.dropdown-toggle[disabled],.dropdown .btn.dropdown-toggle.disabled,.dropdown .btn.dropdown-toggle[disabled]{opacity:.6} input.form-control{font-size:14px;border-radius:2px;color:#666;border:1px solid #CFD3D7;height:34px;padding:10px} input.form-control:focus{border-color:#1291c1;box-shadow:none} .help-block{color:#999;font-size:14px} .help-block.validation-block{color:#999;margin-top:10px} .help-block.validation-block::before{position:relative;top:2px;margin-right:5px;font-family:'Glyphicons Halflings'} .wizard .wizard-body .wizard-content .step-description,.wizard .wizard-body .wizard-content .step-title,.wizard .wizard-header h3,h2.table-title{font-family:Roboto,sans-serif;font-style:normal} .has-success input.form-control{color:#666;border:1px solid #1EB475} .has-success input.form-control:focus{border-color:#1EB 475;box-shadow:none} .has-success .help-block.validation-block::before{content:'\e084';color:#1EB475} .has-error input.form-control{color:#666;border:1px solid #EF6162} .has-error input.form-control:focus{border-color:#EF6162;box-shadow:none} .has-error .help-block.validation-block::before{content:'\e083';color:#EF6162} .has-warning input.form-control{color:#666;border:1px solid #E98A40} .has-warning input.form-control:focus{border-color:#E98A40;box-shadow:none} .has-warning .help-block.validation-block::before{content:'\e101';color:#E98A40} .form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{color:#999;border-color:#ccc;background-color:#ddd} h2.table-title{font-weight:400;line-height:1;color:#333;margin-top:10px;font-size:20px} .table{color:#666;font-size:13px} .table tfoot,.table thead{color:#999} .table input[type=checkbox]+label{position:relative;line-height:1.3em;font-size:initial;top:4px;margin-bottom:0} .table thead>tr>th{border-bott om-color:#EEE} .table tfoot>tr:first-of-type>td{border-top-width:2px;border-top-color:#EEE} .table>tbody>tr>td{border-top-color:#EEE} .table>tbody>tr.active,.table>tbody>tr.active>td{background-color:#EEE} .table.table-hover .action{visibility:hidden;padding:0;line-height:1} .table.table-hover>tbody>tr{border-width:0 1px 1px;border-style:solid;border-color:#EEE transparent} .table.table-hover>tbody>tr>td{border-width:0} .table.table-hover>tbody>tr:hover{border-color:#A7DFF2;background-color:#E7F6FC} .table.table-hover>tbody>tr:hover>td{border-top:1px solid #A7DFF2;background-color:#E7F6FC} .table.table-hover>tbody>tr:hover>td .action{visibility:visible} .table.table-hover>tbody>tr:first-of-type>td{border-top:1px solid transparent} .table.table-hover>tbody>tr:first-of-type:hover>td{border-color:#A7DFF2} .pagination-block .pagination-block-item{float:left;padding:0 5px} .pagination-block .pagination-block-item select{border:none;background-color:transparent;color:#1491C1} .nav.nav-tabs{border:none;margin-bottom:20px} .nav.nav-tabs li a{border-width:0;border-radius:0;border-bottom:2px solid transparent;color:#666;text-transform:uppercase} .nav.nav-tabs li a:active,.nav.nav-tabs li a:focus,.nav.nav-tabs li a:hover{color:#333;border-top-width:0;border-left-width:0;border-right-width:0;background:0 0} .nav.nav-tabs li a .badge.badge-important{display:inline} .nav.nav-tabs li.active a{color:#333;border-bottom:2px solid #3FAE2A} .nav-tabs-left li,.nav-tabs-right li{float:none;margin-bottom:2px} .nav-tabs-left li a,.nav-tabs-right li a{margin-right:0} .nav-tabs-left li{margin-right:-1px} .nav-tabs-left li a{border:2px solid transparent!important} .nav-tabs-left li.active a,.nav-tabs-left li.active a:active,.nav-tabs-left li.active a:focus,.nav-tabs-left li.active a:hover{border-right:2px solid #3FAE2A!important} .nav-tabs-right li{margin-left:-1px} .nav-tabs-right li a{border:2px solid transparent!important} .nav-tabs-right li.active a,.nav-ta bs-right li.active a:active,.nav-tabs-right li.active a:focus,.nav-tabs-right li.active a:hover{border-left:2px solid #3FAE2A!important} .wizard{border:2px solid #ebecf1} .wizard .wizard-header h3{font-weight:400;line-height:1;font-size:20px;color:#333;margin:15px 20px} .wizard .wizard-body{overflow:hidden;margin:0} .wizard .wizard-body .wizard-content{background:#ebecf1;padding-top:25px;float:left;margin-bottom:-99999px;padding-bottom:99999px} .wizard .wizard-body .wizard-content .step-title{line-height:1;font-weight:700;font-size:18px;color:#666} .wizard .wizard-body .wizard-content .step-description{font-weight:400;font-size:14px;line-height:1.4;color:#999} .wizard .wizard-body .wizard-content .panel.panel-default{border:none;box-shadow:none;margin-top:20px} .wizard .wizard-body .wizard-content .panel.panel-default .panel-body{padding:30px 20px} .wizard .wizard-body .wizard-nav{min-height:550px;padding-top:25px;background-color:#323544;float:left;margin-bottom:-99999px;p adding-bottom:99999px} .wizard .wizard-body .wizard-nav .nav li{padding:0 15px} .wizard .wizard-body .wizard-nav .nav li a{height:48px;padding:0 5px;display:table-cell;vertical-align:middle} .wizard .wizard-body .wizard-nav .nav li .step-marker{position:absolute;top:9px;line-height:16px;text-align:center;width:20px;height:20px;border:2px solid #1EB475;border-radius:50%;font-size:12px;font-style:inherit;color:#1EB475;background-color:#323544} .wizard .wizard-body .wizard-nav .nav li .step-description,.wizard .wizard-body .wizard-nav .nav li .step-name{font-family:Roboto,sans-serif;font-weight:400;color:#999;margin-left:30px;font-style:normal} .wizard .wizard-body .wizard-nav .nav li .step-name{line-height:1;font-size:14px} .wizard .wizard-body .wizard-nav .nav li .step-index{line-height:18px} .wizard .wizard-body .wizard-nav .nav li .step-description{line-height:1;font-size:12px} .wizard .wizard-body .wizard-nav .nav li.completed .step-marker{background-color:#1EB475;color:#f ff;font-size:10px;padding-left:2px} .wizard .wizard-body .wizard-nav .nav li.completed .step-marker .step-index{display:none} .wizard .wizard-body .wizard-nav .nav li.completed .step-marker:after{font-family:"Glyphicons Halflings";content:"\e013";position:relative;top:1px;left:-1px} .wizard .wizard-body .wizard-nav .nav li.completed:after{width:2px;height:100%;position:absolute;background-color:#1EB475;content:"";top:25px;left:29px} .wizard .wizard-body .wizard-nav .nav li.completed:last-child:after{content:none} .wizard .wizard-body .wizard-nav .nav li.active .step-name{font-weight:700} .wizard .wizard-body .wizard-nav .nav li.disabled .step-marker{color:#666;border-color:#666} .wizard .wizard-body .wizard-nav .nav li.disabled .step-description,.wizard .wizard-body .wizard-nav .nav li.disabled .step-name{color:#666} .wizard .wizard-body .wizard-nav .nav li.disabled.completed .step-marker{background-color:#1EB475;border:2px solid #1EB475;color:#fff} .wizard .wizard-body .wi zard-nav .nav-pills>li.active>a,.wizard .wizard-body .wizard-nav .nav-pills>li.active>a:focus,.wizard .wizard-body .wizard-nav .nav-pills>li.active>a:hover,.wizard .wizard-body .wizard-nav .nav>li>a:focus,.wizard .wizard-body .wizard-nav .nav>li>a:hover{background-color:inherit} .wizard .wizard-body .wizard-footer{background:#fff;padding:15px 20px} .wizard .wizard-body .wizard-footer button{margin:0 10px} .checkbox-disabled-style{background-color:#b2b8c1;border-color:#b2b8c1} input[type=radio]:checked,input[type=radio]:not(:checked),input[type=checkbox]:checked,input[type=checkbox]:not(:checked){display:none} input[type=radio]:checked+label,input[type=radio]:not(:checked)+label,input[type=checkbox]:checked+label,input[type=checkbox]:not(:checked)+label{position:relative;padding-left:20px} input[type=radio]:checked+label:hover:before,input[type=radio]:not(:checked)+label:hover:before,input[type=checkbox]:checked+label:hover:before,input[type=checkbox]:not(:checked)+label:hover: before{border-color:#1491C1;background-color:#1491C1} input[type=radio]:checked+label:before,input[type=checkbox]:checked+label:before{background-color:#1491C1;border-color:#1491C1} input[type=radio].disabled+label:before,input[type=radio].disabled+label:hover:before,input[type=radio][disabled]+label:before,input[type=radio][disabled]+label:hover:before,input[type=checkbox].disabled+label:before,input[type=checkbox].disabled+label:hover:before,input[type=checkbox][disabled]+label:before,input[type=checkbox][disabled]+label:hover:before{background-color:#b2b8c1;border-color:#b2b8c1} input[type=checkbox]+label:before{content:'';position:absolute;left:0;top:4px;width:10px;height:10px;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:2px;border-width:1px;border-style:solid;border-color:#ddd} input[type=checkbox]:checked+label:after{content:'\2714';color:#FFF;position:absolute;top:0;left:2px;font-size:9px} input.radio+label:before,input[type=radio]+label:before{content: '';position:absolute;left:0;top:0;width:12px;height:12px;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:12px;border-width:1px;border-style:solid;border-color:#ddd} input.radio:checked+label:after,input[type=radio]:checked+label:after{content:'';background-color:#FFF;position:absolute;top:3px;left:3px;width:6px;height:6px;border-radius:6px} .navigation-bar-container,.navigation-bar-container ul.nav.side-nav-header{width:230px;transition:width .5s ease-out} .navigation-bar-container{height:auto;background-color:#323544;padding:0;-ms-overflow-style:none;-webkit-font-smoothing:antialiased} .navigation-bar-container ul.nav.side-nav-header li.navigation-header{background:#313d54;padding:15px 5px 15px 25px;height:55px} .navigation-bar-container ul.nav.side-nav-header li.navigation-header>a.ambari-logo{padding:0} .navigation-bar-container ul.nav.side-nav-header li.navigation-header>a.ambari-logo>img{height:25px;float:left;margin-left:-3px} .navigation-bar-container ul .nav.side-nav-header li.navigation-header .btn-group{cursor:pointer;margin-top:3px} .navigation-bar-container ul.nav.side-nav-header li.navigation-header .btn-group:hover span.ambari-header,.navigation-bar-container ul.nav.side-nav-header li.navigation-header .btn-group:hover span.toggle-icon{color:#fff} .navigation-bar-container ul.nav.side-nav-header li.navigation-header .btn-group span.ambari-header{font-family:Roboto,sans-serif;font-weight:400;font-style:normal;line-height:1;font-size:20px;width:55px;display:inline;color:#b8bec4;padding:0 8px 0 10px} .navigation-bar-container ul.nav.side-nav-header li.navigation-header .btn-group span.toggle-icon{margin-bottom:5px;font-size:13px;display:inline-block;vertical-align:middle;color:#b8bec4} .navigation-bar-container ul.nav.side-nav-header li.navigation-header .btn-group.open .dropdown-toggle{box-shadow:none} .navigation-bar-container ul.nav.side-nav-header li.navigation-header ul.dropdown-menu{top:30px} .navigation-bar-containe r ul.nav.side-nav-header li.navigation-header ul.dropdown-menu li>a{font-family:Roboto,sans-serif;font-weight:400;font-style:normal;font-size:14px;color:#666;line-height:1.42;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .navigation-bar-container ul.nav.side-nav-header li.navigation-header ul.dropdown-menu li>a:hover{background:#f5f5f5} .navigation-bar-container ul.nav.side-nav-footer,.navigation-bar-container ul.nav.side-nav-menu{background-color:#323544;width:230px;transition:width .5s ease-out} .navigation-bar-container ul.nav.side-nav-footer li,.navigation-bar-container ul.nav.side-nav-menu li{padding:0;margin:0} .navigation-bar-container ul.nav.side-nav-footer li.mainmenu-li>a,.navigation-bar-container ul.nav.side-nav-footer li.navigation-footer>a,.navigation-bar-container ul.nav.side-nav-footer li.submenu-li>a,.navigation-bar-container ul.nav.side-nav-menu li.mainmenu-li>a,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer>a,.navigation-bar-co ntainer ul.nav.side-nav-menu li.submenu-li>a{display:table-cell;vertical-align:middle;width:230px;border-radius:0;-moz-border-radius:0;-webkit-border-radius:0;white-space:nowrap} .navigation-bar-container ul.nav.side-nav-footer li.mainmenu-li>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-footer li.navigation-footer>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-footer li.submenu-li>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-menu li.mainmenu-li>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-menu li.submenu-li>a .navigation-menu-item{font-family:Roboto,sans-serif;font-weight:400;font-style:normal;line-height:1;font-size:14px;color:#b8bec4;padding-left:8px} .navigation-bar-container ul.nav.side-nav-footer li.mainmenu-li>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-footer li.navigation-footer>a .nav igation-icon,.navigation-bar-container ul.nav.side-nav-footer li.submenu-li>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li.mainmenu-li>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li.submenu-li>a .navigation-icon{line-height:18px;font-size:18px;color:#b8bec4} .navigation-bar-container ul.nav.side-nav-footer li.mainmenu-li>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-footer li.navigation-footer>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-footer li.submenu-li>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li.mainmenu-li>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li.submenu-li>a .toggle-icon{line-height:14px;font-size:14px;color:#b8bec4;padding:3px 5px 3px 10px} .navigation-bar-container ul.nav.side-nav-footer li.mai nmenu-li>a,.navigation-bar-container ul.nav.side-nav-footer li.navigation-footer>a,.navigation-bar-container ul.nav.side-nav-menu li.mainmenu-li>a,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer>a{padding:10px 5px 10px 20px} .navigation-bar-container ul.nav.side-nav-footer li.submenu-li>a,.navigation-bar-container ul.nav.side-nav-menu li.submenu-li>a{padding:10px 5px 10px 25px} .navigation-bar-container ul.nav.side-nav-footer li.navigation-footer,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer{background:#313d54;height:50px} .navigation-bar-container ul.nav.side-nav-footer li.navigation-footer a .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer a .navigation-icon{color:#31823a;font-size:20px;position:relative;padding:0 15px;left:calc(30%)} .navigation-bar-container ul.nav.side-nav-footer li.navigation-footer a .navigation-icon:hover,.navigation-bar-container ul.nav.side-nav-menu li.navigation-footer a .na vigation-icon:hover{color:#fff} .navigation-bar-container ul.nav.side-nav-footer li>ul>li,.navigation-bar-container ul.nav.side-nav-menu li>ul>li{background-color:#323544} .navigation-bar-container ul.nav.side-nav-footer li>ul>li a,.navigation-bar-container ul.nav.side-nav-menu li>ul>li a{font-family:Roboto,sans-serif;font-weight:400;font-style:normal;line-height:1;font-size:14px;color:#999} .navigation-bar-container ul.nav.side-nav-footer li>ul>li a .submenu-icon,.navigation-bar-container ul.nav.side-nav-menu li>ul>li a .submenu-icon{line-height:14px;font-size:14px} .navigation-bar-container ul.nav.side-nav-footer li>a:hover,.navigation-bar-container ul.nav.side-nav-footer li>ul>li>a:hover,.navigation-bar-container ul.nav.side-nav-menu li>a:hover,.navigation-bar-container ul.nav.side-nav-menu li>ul>li>a:hover{background:#404351;cursor:pointer;color:#fff} .navigation-bar-container ul.nav.side-nav-footer li>a:hover .navigation-icon,.navigation-bar-container ul.nav.side-nav-foote r li>a:hover .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-footer li>a:hover .submenu-item,.navigation-bar-container ul.nav.side-nav-footer li>a:hover .toggle-icon,.navigation-bar-container ul.nav.side-nav-footer li>ul>li>a:hover .navigation-icon,.navigation-bar-container ul.nav.side-nav-footer li>ul>li>a:hover .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-footer li>ul>li>a:hover .submenu-item,.navigation-bar-container ul.nav.side-nav-footer li>ul>li>a:hover .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li>a:hover .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li>a:hover .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-menu li>a:hover .submenu-item,.navigation-bar-container ul.nav.side-nav-menu li>a:hover .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li>ul>li>a:hover .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li>ul>li>a:hover .navigation-menu-item,.navigation-bar-cont ainer ul.nav.side-nav-menu li>ul>li>a:hover .submenu-item,.navigation-bar-container ul.nav.side-nav-menu li>ul>li>a:hover .toggle-icon{color:#fff} .navigation-bar-container ul.nav.side-nav-footer li.active.collapsed,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu),.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed,.navigation-bar-container ul.nav.side-nav-menu li.active:not(.has-sub-menu){background:#404351;cursor:pointer} .navigation-bar-container ul.nav.side-nav-footer li.active.collapsed>a,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu)>a,.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed>a,.navigation-bar-container ul.nav.side-nav-menu li.active:not(.has-sub-menu)>a{color:#fff} .navigation-bar-container ul.nav.side-nav-footer li.active.collapsed>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-footer li.active.collapsed>a .navigation-menu-item,.navigation-bar-container ul.na v.side-nav-footer li.active.collapsed>a .submenu-item,.navigation-bar-container ul.nav.side-nav-footer li.active.collapsed>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu)>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu)>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu)>a .submenu-item,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu)>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed>a .navigation-icon,.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed>a .submenu-item,.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed>a .toggle-icon,.navigation-bar-container ul.nav.side-nav-menu li.active:not(.has-sub-menu)>a .navigation-icon,.navigation-bar-container ul.nav.sid e-nav-menu li.active:not(.has-sub-menu)>a .navigation-menu-item,.navigation-bar-container ul.nav.side-nav-menu li.active:not(.has-sub-menu)>a .submenu-item,.navigation-bar-container ul.nav.side-nav-menu li.active:not(.has-sub-menu)>a .toggle-icon{color:#fff} .navigation-bar-container ul.nav.side-nav-footer li.active.collapsed>a:after,.navigation-bar-container ul.nav.side-nav-footer li.active:not(.has-sub-menu)>a:after,.navigation-bar-container ul.nav.side-nav-menu li.active.collapsed>a:after,.navigation-bar-container ul.nav.side-nav-menu li.active:not(.has-sub-menu)>a:after{left:0;top:50%;border:solid transparent;border-width:10px 7px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:transparent transparent transparent #31823a;margin-top:-12px} .navigation-bar-container ul.nav.side-nav-footer .more-actions,.navigation-bar-container ul.nav.side-nav-menu .more-actions{display:none;position:absolute;top:14px;right:33px;line-height:25px;width:20px;text-al ign:center;font-size:14px;cursor:pointer;vertical-align:middle;color:#fff} .navigation-bar-container.collapsed,.navigation-bar-container.collapsed ul.nav.side-nav-footer,.navigation-bar-container.collapsed ul.nav.side-nav-header,.navigation-bar-container.collapsed ul.nav.side-nav-menu{width:50px} .navigation-bar-container ul.nav.side-nav-footer .more-actions .dropdown-menu>li>a,.navigation-bar-container ul.nav.side-nav-footer .more-actions .dropdown-menu>li>a i,.navigation-bar-container ul.nav.side-nav-menu .more-actions .dropdown-menu>li>a,.navigation-bar-container ul.nav.side-nav-menu .more-actions .dropdown-menu>li>a i{color:#666} .navigation-bar-container ul.nav.side-nav-footer .more-actions .dropdown-menu>li>a:hover,.navigation-bar-container ul.nav.side-nav-menu .more-actions .dropdown-menu>li>a:hover{background:#f5f5f5} .navigation-bar-container ul.nav.side-nav-footer .menu-item-name,.navigation-bar-container ul.nav.side-nav-menu .menu-item-name{display:inline-block;vertic al-align:bottom;max-width:100px;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;-ms-text-overflow:ellipsis;white-space:nowrap} .navigation-bar-container.collapsed ul.nav.side-nav-footer .more-actions,.navigation-bar-container.collapsed ul.nav.side-nav-footer li a .navigation-menu-item,.navigation-bar-container.collapsed ul.nav.side-nav-footer li a .toggle-icon,.navigation-bar-container.collapsed ul.nav.side-nav-header li.navigation-header .dropdown-menu,.navigation-bar-container.collapsed ul.nav.side-nav-header li.navigation-header span.ambari-header,.navigation-bar-container.collapsed ul.nav.side-nav-header li.navigation-header span.toggle-icon,.navigation-bar-container.collapsed ul.nav.side-nav-menu .more-actions,.navigation-bar-container.collapsed ul.nav.side-nav-menu li a .navigation-menu-item,.navigation-bar-container.collapsed ul.nav.side-nav-menu li a .toggle-icon{display:none} .navigation-bar-container .nav-pills>li.active>a,.navigation-bar-container .nav- pills>li.active>a:focus,.navigation-bar-container .nav-pills>li.active>a:hover,.navigation-bar-container .nav>li>a:focus,.navigation-bar-container .nav>li>a:hover{background-color:inherit} .navigation-bar-container.collapsed ul.nav.side-nav-header li.navigation-header{padding:15px 0 15px 15px} .navigation-bar-container.collapsed ul.nav.side-nav-footer li a,.navigation-bar-container.collapsed ul.nav.side-nav-menu li a{padding:15px 0 15px 15px;width:50px} .navigation-bar-container.collapsed ul.nav.side-nav-footer li.navigation-footer a .navigation-icon,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.navigation-footer a .navigation-icon{padding:0 5px;left:0} .navigation-bar-container.collapsed ul.nav.side-nav-footer li ul.sub-menu,.navigation-bar-container.collapsed ul.nav.side-nav-menu li ul.sub-menu{display:none;width:230px;position:absolute;z-index:100;top:0;left:50px} .navigation-bar-container.collapsed ul.nav.side-nav-footer li.submenu-li>a,.navigation-bar-contain er.collapsed ul.nav.side-nav-menu li.submenu-li>a{padding:10px 5px 10px 25px;width:230px} .navigation-bar-container.collapsed ul.nav.side-nav-footer li.active,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active{background:#404351;cursor:pointer} .navigation-bar-container.collapsed ul.nav.side-nav-footer li.active>a,.navigation-bar-container.collapsed ul.nav.side-nav-footer li.active>a .navigation-icon,.navigation-bar-container.collapsed ul.nav.side-nav-footer li.active>a .navigation-menu-item,.navigation-bar-container.collapsed ul.nav.side-nav-footer li.active>a .submenu-item,.navigation-bar-container.collapsed ul.nav.side-nav-footer li.active>a .toggle-icon,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active>a,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active>a .navigation-icon,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active>a .navigation-menu-item,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active> a .submenu-item,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active>a .toggle-icon{color:#fff} .navigation-bar-container.collapsed ul.nav.side-nav-footer li.active>a:after,.navigation-bar-container.collapsed ul.nav.side-nav-menu li.active>a:after{left:0;top:50%;border:solid transparent;border-width:12px 6px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:transparent transparent transparent #31823a;margin-top:-12px} .navigation-bar-fit-height{position:fixed;top:0;bottom:0;left:0;z-index:2079} .navigation-bar-fit-height .side-nav-header{position:absolute;top:0} .navigation-bar-fit-height .side-nav-menu{position:absolute;top:55px;bottom:50px} .navigation-bar-fit-height .side-nav-footer{position:absolute;bottom:0} .navigation-bar-fit-height .more-actions .dropdown-menu{position:fixed;top:auto;left:auto} .navigation-bar-fit-height .navigation-bar-container{height:100%} .navigation-bar-fit-height .navigation-bar-container .side-nav-me nu{overflow-y:auto} .notifications-group{position:relative;top:1px} #notifications-dropdown.dropdown-menu{min-width:300px;max-width:300px;min-height:150px;padding:0;z-index:1000;right:-50px;left:auto;top:260%;border:none;box-shadow:0 2px 10px 2px rgba(0,0,0,.29)} #notifications-dropdown.dropdown-menu .popup-arrow-up{position:absolute;right:37px;top:-40px;width:40px;height:40px;overflow:hidden} #notifications-dropdown.dropdown-menu .popup-arrow-up:after{content:"";position:absolute;width:20px;height:20px;background:#fff;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);top:30px;left:10px;box-shadow:-1px -1px 10px -2px rgba(0,0,0,.5)} #notifications-dropdown.dropdown-menu .notifications-header{border-bottom:1px solid #eee;padding:15px 20px} #notifications-dropdown.dropdown-menu .notifications-header .notifications-title{font-family:Roboto,sans-serif;font-weight:400;font-style:normal;line-height:1;color:#333;font-size:16px} #notifications-dropdo wn.dropdown-menu .notifications-body{padding:0 15px;overflow:auto;max-height:500px} #notifications-dropdown.dropdown-menu .notifications-body .no-alert-text{padding:15px 5px} #notifications-dropdown.dropdown-menu .notifications-body .table-controls{padding:10px 0;margin:0;border-bottom:1px solid #eee} #notifications-dropdown.dropdown-menu .notifications-body .table-controls .state-filter{padding:0;font-family:Roboto,sans-serif;font-weight:400;font-style:normal;line-height:1;font-size:12px;color:#666;position:relative} #notifications-dropdown.dropdown-menu .notifications-body .table-controls .state-filter .form-control.filter-select{font-size:12px;color:#666;height:25px} #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table{margin-top:0} #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody tr{cursor:pointer} #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody tr.no-alert-tr:hover{cursor:defa ult;border-color:transparent transparent #eee} #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody tr.no-alert-tr:hover>td{border-color:transparent;background-color:#fff} #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody td.status{width:9%;padding:15px 3px} #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody td.status .alert-state-CRITICAL{color:#EF6162} #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody td.status .alert-state-WARNING{color:#E98A40} #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody td.content{width:90%;padding:15px 3px 10px;font-family:Roboto,sans-serif;font-weight:400;font-style:normal;color:#333;line-height:1.3} #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody td.content .name{font-weight:700;font-size:14px;color:#333;margin-bottom:5px} #notifications-dropdown. dropdown-menu .notifications-body .table.alerts-table tbody td.content .description{font-size:12px;color:#666;margin-bottom:4px;display:block;display:-webkit-box;-webkit-line-clamp:3;max-height:47px;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto} #notifications-dropdown.dropdown-menu .notifications-body .table.alerts-table tbody td.content .timestamp{text-align:right;font-size:11px;color:#999} #notifications-dropdown.dropdown-menu .notifications-footer{border-top:1px solid #eee;padding:15px} .modal-backdrop{background-color:grey} .modal .modal-content{border-radius:2px} .modal .modal-content .modal-body,.modal .modal-content .modal-footer,.modal .modal-content .modal-header{padding-left:20px;padding-right:20px} .modal .modal-content .modal-header{border-bottom:none;padding-top: 20px;color:#666;font-size:20px} .modal .modal-content .modal-header h4{margin:0;color:inherit;font-size:inherit} .modal .modal-content .modal-body{color:#666;font-size:12px} .modal .modal-content .modal-footer{border-top:none;padding-bottom:20px} .modal .modal-content .modal-footer .btn~.btn{margin-left:10px} .accordion .panel-group,.wizard .wizard-body .wizard-content .accordion .panel-group{margin-bottom:0} .accordion .panel-group .panel,.wizard .wizard-body .wizard-content .accordion .panel-group .panel{border-radius:0;border:none;margin-top:0} .accordion .panel-group .panel .panel-heading,.wizard .wizard-body .wizard-content .accordion .panel-group .panel .panel-heading{height:50px;padding:15px 10px;border:1px solid;border-color:#ddd transparent;border-top:none;background:#fff} .accordion .panel-group .panel .panel-heading .panel-title,.wizard .wizard-body .wizard-content .accordion .panel-group .panel .panel-heading .panel-title{font-family:Roboto,sans-serif;font-weight :400;font-style:normal;line-height:1;color:#333} .accordion .panel-group .panel .panel-heading .panel-title>a,.wizard .wizard-body .wizard-content .accordion .panel-group .panel .panel-heading .panel-title>a{font-size:18px;color:#333} .accordion .panel-group .panel .panel-heading .panel-title>i,.wizard .wizard-body .wizard-content .accordion .panel-group .panel .panel-heading .panel-title>i{font-size:20px;color:#1491c1} .accordion .panel-group .panel .panel-heading:hover,.wizard .wizard-body .wizard-content .accordion .panel-group .panel .panel-heading:hover{background:#f3faff;cursor:pointer} .accordion .panel-group .panel .panel-body,.wizard .wizard-body .wizard-content .accordion .panel-group .panel .panel-body{padding:15px 10px 20px 20px} .h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif} .h1,h1{font-size:24px} .h2,h2{font-size:18px} .body,body{font-family:Roboto,sans-serif;font-weight:400;font-style:normal;line-height:1;color:#333;font-size:14px} . description{font-family:Roboto,sans-serif;font-size:12px;color:#000} a,a:focus,a:visited{color:#1491C1} a:focus:hover,a:hover,a:visited:hover{text-decoration:underline} a.disabled:hover,a:active,a:focus.disabled:hover,a:focus:active,a:focus[disabled]:hover,a:visited.disabled:hover,a:visited:active,a:visited[disabled]:hover,a[disabled]:hover{text-decoration:none} a.disabled,a:focus.disabled,a:focus[disabled],a:visited.disabled,a:visited[disabled],a[disabled]{cursor:not-allowed;color:#666;text-decoration:none} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.eot ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.eot b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.eot new file mode 100644 index 0000000..d4e185d Binary files /dev/null and b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.eot differ