You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ab...@apache.org on 2017/06/22 13:16:28 UTC
[01/21] ambari git commit: AMBARI-21309 Create Log Search UI
application skeleton (akovalenko)
Repository: ambari
Updated Branches:
refs/heads/branch-feature-logsearch-ui 5fc8ccc96 -> 4bfc6f13e
AMBARI-21309 Create Log Search UI application skeleton (akovalenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/da6ea9f5
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/da6ea9f5
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/da6ea9f5
Branch: refs/heads/branch-feature-logsearch-ui
Commit: da6ea9f54adc2b274d87d3e38bc8bec737378ea0
Parents: 5fc8ccc
Author: Aleksandr Kovalenko <ak...@hortonworks.com>
Authored: Fri Apr 7 17:37:17 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 14:51:28 2017 +0300
----------------------------------------------------------------------
.../ambari-logsearch-web-new/.angular-cli.json | 57 +++++++++
.../ambari-logsearch-web-new/.editorconfig | 13 +++
.../ambari-logsearch-web-new/.gitignore | 42 +++++++
.../ambari-logsearch-web-new/README.md | 28 +++++
.../e2e/app.e2e-spec.ts | 14 +++
.../ambari-logsearch-web-new/e2e/app.po.ts | 11 ++
.../e2e/tsconfig.e2e.json | 12 ++
.../ambari-logsearch-web-new/karma.conf.js | 44 +++++++
.../ambari-logsearch-web-new/package.json | 45 +++++++
.../ambari-logsearch-web-new/protractor.conf.js | 30 +++++
.../src/app/app.component.html | 3 +
.../src/app/app.component.less | 0
.../src/app/app.component.spec.ts | 32 +++++
.../src/app/app.component.ts | 10 ++
.../src/app/app.module.ts | 20 ++++
.../src/assets/.gitkeep | 0
.../src/environments/environment.prod.ts | 3 +
.../src/environments/environment.ts | 8 ++
.../ambari-logsearch-web-new/src/favicon.ico | Bin 0 -> 1150 bytes
.../ambari-logsearch-web-new/src/index.html | 14 +++
.../ambari-logsearch-web-new/src/main.ts | 11 ++
.../ambari-logsearch-web-new/src/polyfills.ts | 68 +++++++++++
.../ambari-logsearch-web-new/src/styles.less | 1 +
.../ambari-logsearch-web-new/src/test.ts | 32 +++++
.../src/tsconfig.app.json | 13 +++
.../src/tsconfig.spec.json | 20 ++++
.../ambari-logsearch-web-new/src/typings.d.ts | 5 +
.../ambari-logsearch-web-new/tsconfig.json | 20 ++++
.../ambari-logsearch-web-new/tslint.json | 116 +++++++++++++++++++
29 files changed, 672 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/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
new file mode 100644
index 0000000..7b5c13b
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
@@ -0,0 +1,57 @@
+{
+ "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+ "project": {
+ "name": "ambari-logsearch-web-new"
+ },
+ "apps": [
+ {
+ "root": "src",
+ "outDir": "dist",
+ "assets": [
+ "assets",
+ "favicon.ico"
+ ],
+ "index": "index.html",
+ "main": "main.ts",
+ "polyfills": "polyfills.ts",
+ "test": "test.ts",
+ "tsconfig": "tsconfig.app.json",
+ "testTsconfig": "tsconfig.spec.json",
+ "prefix": "app",
+ "styles": [
+ "styles.less"
+ ],
+ "scripts": [],
+ "environmentSource": "environments/environment.ts",
+ "environments": {
+ "dev": "environments/environment.ts",
+ "prod": "environments/environment.prod.ts"
+ }
+ }
+ ],
+ "e2e": {
+ "protractor": {
+ "config": "./protractor.conf.js"
+ }
+ },
+ "lint": [
+ {
+ "project": "src/tsconfig.app.json"
+ },
+ {
+ "project": "src/tsconfig.spec.json"
+ },
+ {
+ "project": "e2e/tsconfig.e2e.json"
+ }
+ ],
+ "test": {
+ "karma": {
+ "config": "./karma.conf.js"
+ }
+ },
+ "defaults": {
+ "styleExt": "less",
+ "component": {}
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/.editorconfig
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/.editorconfig b/ambari-logsearch/ambari-logsearch-web-new/.editorconfig
new file mode 100644
index 0000000..6e87a00
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/.editorconfig
@@ -0,0 +1,13 @@
+# Editor configuration, see http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/.gitignore
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/.gitignore b/ambari-logsearch/ambari-logsearch-web-new/.gitignore
new file mode 100644
index 0000000..54bfd20
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/.gitignore
@@ -0,0 +1,42 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+/out-tsc
+
+# dependencies
+/node_modules
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage
+/libpeerconnection.log
+npm-debug.log
+testem.log
+/typings
+
+# e2e
+/e2e/*.js
+/e2e/*.map
+
+# System Files
+.DS_Store
+Thumbs.db
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/README.md
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/README.md b/ambari-logsearch/ambari-logsearch-web-new/README.md
new file mode 100644
index 0000000..2fb07fb
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/README.md
@@ -0,0 +1,28 @@
+# AmbariLogsearchWebNew
+
+This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.0.0.
+
+## Development server
+
+Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
+
+## Code scaffolding
+
+Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive/pipe/service/class/module`.
+
+## Build
+
+Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
+
+## Running unit tests
+
+Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
+
+## Running end-to-end tests
+
+Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
+Before running the tests make sure you are serving the app via `ng serve`.
+
+## Further help
+
+To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/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
new file mode 100644
index 0000000..a9f0798
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.e2e-spec.ts
@@ -0,0 +1,14 @@
+import { AmbariLogsearchWebNewPage } from './app.po';
+
+describe('ambari-logsearch-web-new App', () => {
+ let page: AmbariLogsearchWebNewPage;
+
+ beforeEach(() => {
+ page = new AmbariLogsearchWebNewPage();
+ });
+
+ it('should display message saying app works', () => {
+ page.navigateTo();
+ expect(page.getParagraphText()).toEqual('app works!');
+ });
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
new file mode 100644
index 0000000..0dab904
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
@@ -0,0 +1,11 @@
+import { browser, element, by } from 'protractor';
+
+export class AmbariLogsearchWebNewPage {
+ navigateTo() {
+ return browser.get('/');
+ }
+
+ getParagraphText() {
+ return element(by.css('app-root h1')).getText();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/e2e/tsconfig.e2e.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/e2e/tsconfig.e2e.json b/ambari-logsearch/ambari-logsearch-web-new/e2e/tsconfig.e2e.json
new file mode 100644
index 0000000..ac7a373
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/e2e/tsconfig.e2e.json
@@ -0,0 +1,12 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../out-tsc/e2e",
+ "module": "commonjs",
+ "target": "es5",
+ "types":[
+ "jasmine",
+ "node"
+ ]
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js b/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
new file mode 100644
index 0000000..84b4cd5
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
@@ -0,0 +1,44 @@
+// Karma configuration file, see link for more information
+// https://karma-runner.github.io/0.13/config/configuration-file.html
+
+module.exports = function (config) {
+ config.set({
+ basePath: '',
+ frameworks: ['jasmine', '@angular/cli'],
+ plugins: [
+ require('karma-jasmine'),
+ require('karma-chrome-launcher'),
+ require('karma-jasmine-html-reporter'),
+ require('karma-coverage-istanbul-reporter'),
+ require('@angular/cli/plugins/karma')
+ ],
+ client:{
+ clearContext: false // leave Jasmine Spec Runner output visible in browser
+ },
+ files: [
+ { pattern: './src/test.ts', watched: false }
+ ],
+ preprocessors: {
+ './src/test.ts': ['@angular/cli']
+ },
+ mime: {
+ 'text/x-typescript': ['ts','tsx']
+ },
+ coverageIstanbulReporter: {
+ reports: [ 'html', 'lcovonly' ],
+ fixWebpackSourcePaths: true
+ },
+ angularCli: {
+ environment: 'dev'
+ },
+ reporters: config.angularCli && config.angularCli.codeCoverage
+ ? ['progress', 'coverage-istanbul']
+ : ['progress', 'kjhtml'],
+ port: 9876,
+ colors: true,
+ logLevel: config.LOG_INFO,
+ autoWatch: true,
+ browsers: ['Chrome'],
+ singleRun: false
+ });
+};
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/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
new file mode 100644
index 0000000..f13d358
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "ambari-logsearch-web",
+ "version": "3.0.0",
+ "license": "Apache 2.0",
+ "scripts": {
+ "ng": "ng",
+ "start": "ng serve",
+ "build": "ng build",
+ "test": "ng test",
+ "lint": "ng lint",
+ "e2e": "ng e2e"
+ },
+ "dependencies": {
+ "@angular/common": "^4.0.0",
+ "@angular/compiler": "^4.0.0",
+ "@angular/core": "^4.0.0",
+ "@angular/forms": "^4.0.0",
+ "@angular/http": "^4.0.0",
+ "@angular/platform-browser": "^4.0.0",
+ "@angular/platform-browser-dynamic": "^4.0.0",
+ "@angular/router": "^4.0.0",
+ "core-js": "^2.4.1",
+ "rxjs": "^5.1.0",
+ "zone.js": "^0.8.4"
+ },
+ "devDependencies": {
+ "@angular/cli": "1.0.0",
+ "@angular/compiler-cli": "^4.0.0",
+ "@types/jasmine": "2.5.38",
+ "@types/node": "~6.0.60",
+ "codelyzer": "~2.0.0",
+ "jasmine-core": "~2.5.2",
+ "jasmine-spec-reporter": "~3.2.0",
+ "karma": "~1.4.1",
+ "karma-chrome-launcher": "~2.0.0",
+ "karma-cli": "~1.0.1",
+ "karma-jasmine": "~1.1.0",
+ "karma-jasmine-html-reporter": "^0.2.2",
+ "karma-coverage-istanbul-reporter": "^0.2.0",
+ "protractor": "~5.1.0",
+ "ts-node": "~2.0.0",
+ "tslint": "~4.5.0",
+ "typescript": "~2.2.0"
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js b/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
new file mode 100644
index 0000000..1c5e1e5
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
@@ -0,0 +1,30 @@
+// Protractor configuration file, see link for more information
+// https://github.com/angular/protractor/blob/master/lib/config.ts
+
+const { SpecReporter } = require('jasmine-spec-reporter');
+
+exports.config = {
+ allScriptsTimeout: 11000,
+ specs: [
+ './e2e/**/*.e2e-spec.ts'
+ ],
+ capabilities: {
+ 'browserName': 'chrome'
+ },
+ directConnect: true,
+ baseUrl: 'http://localhost:4200/',
+ framework: 'jasmine',
+ jasmineNodeOpts: {
+ showColors: true,
+ defaultTimeoutInterval: 30000,
+ print: function() {}
+ },
+ beforeLaunch: function() {
+ require('ts-node').register({
+ project: 'e2e/tsconfig.e2e.json'
+ });
+ },
+ onPrepare() {
+ jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
+ }
+};
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/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
new file mode 100644
index 0000000..b6931b5
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.html
@@ -0,0 +1,3 @@
+<h1>
+ {{title}}
+</h1>
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/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
new file mode 100644
index 0000000..c740bcd
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.spec.ts
@@ -0,0 +1,32 @@
+import { TestBed, async } from '@angular/core/testing';
+
+import { AppComponent } from './app.component';
+
+describe('AppComponent', () => {
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [
+ AppComponent
+ ],
+ }).compileComponents();
+ }));
+
+ it('should create the app', async(() => {
+ const fixture = TestBed.createComponent(AppComponent);
+ const app = fixture.debugElement.componentInstance;
+ 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);
+ fixture.detectChanges();
+ const compiled = fixture.debugElement.nativeElement;
+ expect(compiled.querySelector('h1').textContent).toContain('app works!');
+ }));
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/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
new file mode 100644
index 0000000..3ffdc2e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.ts
@@ -0,0 +1,10 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'app-root',
+ templateUrl: './app.component.html',
+ styleUrls: ['./app.component.less']
+})
+export class AppComponent {
+ title = 'Ambari Log Search';
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/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
new file mode 100644
index 0000000..67ae491
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.module.ts
@@ -0,0 +1,20 @@
+import { BrowserModule } from '@angular/platform-browser';
+import { NgModule } from '@angular/core';
+import { FormsModule } from '@angular/forms';
+import { HttpModule } from '@angular/http';
+
+import { AppComponent } from './app.component';
+
+@NgModule({
+ declarations: [
+ AppComponent
+ ],
+ imports: [
+ BrowserModule,
+ FormsModule,
+ HttpModule
+ ],
+ providers: [],
+ bootstrap: [AppComponent]
+})
+export class AppModule { }
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/assets/.gitkeep
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/assets/.gitkeep b/ambari-logsearch/ambari-logsearch-web-new/src/assets/.gitkeep
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
new file mode 100644
index 0000000..3612073
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
@@ -0,0 +1,3 @@
+export const environment = {
+ production: true
+};
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
new file mode 100644
index 0000000..b7f639a
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
@@ -0,0 +1,8 @@
+// The file contents for the current environment will overwrite these during build.
+// The build system defaults to the dev environment which uses `environment.ts`, but if you do
+// `ng build --env=prod` then `environment.prod.ts` will be used instead.
+// The list of which env maps to which file can be found in `.angular-cli.json`.
+
+export const environment = {
+ production: false
+};
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/favicon.ico
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/favicon.ico b/ambari-logsearch/ambari-logsearch-web-new/src/favicon.ico
new file mode 100644
index 0000000..62604cb
Binary files /dev/null and b/ambari-logsearch/ambari-logsearch-web-new/src/favicon.ico differ
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/index.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/index.html b/ambari-logsearch/ambari-logsearch-web-new/src/index.html
new file mode 100644
index 0000000..b067fe4
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/index.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>LogSearch</title>
+ <base href="/">
+
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="icon" type="image/x-icon" href="favicon.ico">
+</head>
+<body>
+ <app-root>Loading...</app-root>
+</body>
+</html>
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/main.ts b/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
new file mode 100644
index 0000000..a9ca1ca
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
@@ -0,0 +1,11 @@
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app/app.module';
+import { environment } from './environments/environment';
+
+if (environment.production) {
+ enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule);
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts b/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
new file mode 100644
index 0000000..53bdaf1
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
@@ -0,0 +1,68 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ * file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/** IE9, IE10 and IE11 requires all of the following polyfills. **/
+// import 'core-js/es6/symbol';
+// import 'core-js/es6/object';
+// import 'core-js/es6/function';
+// import 'core-js/es6/parse-int';
+// import 'core-js/es6/parse-float';
+// import 'core-js/es6/number';
+// import 'core-js/es6/math';
+// import 'core-js/es6/string';
+// import 'core-js/es6/date';
+// import 'core-js/es6/array';
+// import 'core-js/es6/regexp';
+// import 'core-js/es6/map';
+// import 'core-js/es6/set';
+
+/** IE10 and IE11 requires the following for NgClass support on SVG elements */
+// import 'classlist.js'; // Run `npm install --save classlist.js`.
+
+/** IE10 and IE11 requires the following to support `@angular/animation`. */
+// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
+
+
+/** Evergreen browsers require these. **/
+import 'core-js/es6/reflect';
+import 'core-js/es7/reflect';
+
+
+/** ALL Firefox browsers require the following to support `@angular/animation`. **/
+// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
+
+
+
+/***************************************************************************************************
+ * Zone JS is required by Angular itself.
+ */
+import 'zone.js/dist/zone'; // Included with Angular CLI.
+
+
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
+
+/**
+ * Date, currency, decimal and percent pipes.
+ * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
+ */
+// import 'intl'; // Run `npm install --save intl`.
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
new file mode 100644
index 0000000..90d4ee0
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
@@ -0,0 +1 @@
+/* You can add global styles to this file, and also import other style files */
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/test.ts b/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
new file mode 100644
index 0000000..9bf7226
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
@@ -0,0 +1,32 @@
+// This file is required by karma.conf.js and loads recursively all the .spec and framework files
+
+import 'zone.js/dist/long-stack-trace-zone';
+import 'zone.js/dist/proxy.js';
+import 'zone.js/dist/sync-test';
+import 'zone.js/dist/jasmine-patch';
+import 'zone.js/dist/async-test';
+import 'zone.js/dist/fake-async-test';
+import { getTestBed } from '@angular/core/testing';
+import {
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
+declare var __karma__: any;
+declare var require: any;
+
+// Prevent Karma from running prematurely.
+__karma__.loaded = function () {};
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
+// Finally, start Karma to run the tests.
+__karma__.start();
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json b/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
new file mode 100644
index 0000000..5e2507d
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
@@ -0,0 +1,13 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../out-tsc/app",
+ "module": "es2015",
+ "baseUrl": "",
+ "types": []
+ },
+ "exclude": [
+ "test.ts",
+ "**/*.spec.ts"
+ ]
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.spec.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.spec.json b/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.spec.json
new file mode 100644
index 0000000..510e3f1
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.spec.json
@@ -0,0 +1,20 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../out-tsc/spec",
+ "module": "commonjs",
+ "target": "es5",
+ "baseUrl": "",
+ "types": [
+ "jasmine",
+ "node"
+ ]
+ },
+ "files": [
+ "test.ts"
+ ],
+ "include": [
+ "**/*.spec.ts",
+ "**/*.d.ts"
+ ]
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts b/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
new file mode 100644
index 0000000..ef5c7bd
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
@@ -0,0 +1,5 @@
+/* SystemJS module definition */
+declare var module: NodeModule;
+interface NodeModule {
+ id: string;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json b/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
new file mode 100644
index 0000000..a35a8ee
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "outDir": "./dist/out-tsc",
+ "baseUrl": "src",
+ "sourceMap": true,
+ "declaration": false,
+ "moduleResolution": "node",
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "target": "es5",
+ "typeRoots": [
+ "node_modules/@types"
+ ],
+ "lib": [
+ "es2016",
+ "dom"
+ ]
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/da6ea9f5/ambari-logsearch/ambari-logsearch-web-new/tslint.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/tslint.json b/ambari-logsearch/ambari-logsearch-web-new/tslint.json
new file mode 100644
index 0000000..9113f13
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/tslint.json
@@ -0,0 +1,116 @@
+{
+ "rulesDirectory": [
+ "node_modules/codelyzer"
+ ],
+ "rules": {
+ "callable-types": true,
+ "class-name": true,
+ "comment-format": [
+ true,
+ "check-space"
+ ],
+ "curly": true,
+ "eofline": true,
+ "forin": true,
+ "import-blacklist": [true, "rxjs"],
+ "import-spacing": true,
+ "indent": [
+ true,
+ "spaces"
+ ],
+ "interface-over-type-literal": true,
+ "label-position": true,
+ "max-line-length": [
+ true,
+ 140
+ ],
+ "member-access": false,
+ "member-ordering": [
+ true,
+ "static-before-instance",
+ "variables-before-functions"
+ ],
+ "no-arg": true,
+ "no-bitwise": true,
+ "no-console": [
+ true,
+ "debug",
+ "info",
+ "time",
+ "timeEnd",
+ "trace"
+ ],
+ "no-construct": true,
+ "no-debugger": true,
+ "no-duplicate-variable": true,
+ "no-empty": false,
+ "no-empty-interface": true,
+ "no-eval": true,
+ "no-inferrable-types": [true, "ignore-params"],
+ "no-shadowed-variable": true,
+ "no-string-literal": false,
+ "no-string-throw": true,
+ "no-switch-case-fall-through": true,
+ "no-trailing-whitespace": true,
+ "no-unused-expression": true,
+ "no-use-before-declare": true,
+ "no-var-keyword": true,
+ "object-literal-sort-keys": false,
+ "one-line": [
+ true,
+ "check-open-brace",
+ "check-catch",
+ "check-else",
+ "check-whitespace"
+ ],
+ "prefer-const": true,
+ "quotemark": [
+ true,
+ "single"
+ ],
+ "radix": true,
+ "semicolon": [
+ "always"
+ ],
+ "triple-equals": [
+ true,
+ "allow-null-check"
+ ],
+ "typedef-whitespace": [
+ true,
+ {
+ "call-signature": "nospace",
+ "index-signature": "nospace",
+ "parameter": "nospace",
+ "property-declaration": "nospace",
+ "variable-declaration": "nospace"
+ }
+ ],
+ "typeof-compare": true,
+ "unified-signatures": true,
+ "variable-name": false,
+ "whitespace": [
+ true,
+ "check-branch",
+ "check-decl",
+ "check-operator",
+ "check-separator",
+ "check-type"
+ ],
+
+ "directive-selector": [true, "attribute", "app", "camelCase"],
+ "component-selector": [true, "element", "app", "kebab-case"],
+ "use-input-property-decorator": true,
+ "use-output-property-decorator": true,
+ "use-host-property-decorator": true,
+ "no-input-rename": true,
+ "no-output-rename": true,
+ "use-life-cycle-interface": true,
+ "use-pipe-transform-interface": true,
+ "component-class-suffix": true,
+ "directive-class-suffix": true,
+ "no-access-missing-member": true,
+ "templates-use-public": true,
+ "invoke-injectable": true
+ }
+}
[18/21] ambari git commit: AMBARI-21321 Log Search UI: fix mock data
service. (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21321 Log Search UI: fix mock data service. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/56681d79
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/56681d79
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/56681d79
Branch: refs/heads/branch-feature-logsearch-ui
Commit: 56681d79f25cbd98f70be8d23f3ae46619a90707
Parents: c3d8e31
Author: ababiichuk <ab...@hortonworks.com>
Authored: Fri Jun 16 15:05:09 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:44:46 2017 +0300
----------------------------------------------------------------------
.../accordion-panel.component.less | 2 +-
.../accordion-panel.component.spec.ts | 2 +-
.../accordion-panel.component.ts | 2 +-
.../src/app/app.component.less | 2 +-
.../src/app/app.module.ts | 38 +-
.../filter-dropdown.component.less | 2 +-
.../filter-dropdown.component.spec.ts | 2 +-
.../filter-dropdown.component.ts | 2 +-
.../filter-text-field.component.less | 2 +-
.../filter-text-field.component.spec.ts | 2 +-
.../filter-text-field.component.ts | 2 +-
.../app/login-form/login-form.component.less | 2 +-
.../src/app/logs-list/logs-list.component.less | 2 +-
.../app/logs-list/logs-list.component.spec.ts | 2 +-
.../src/app/logs-list/logs-list.component.ts | 2 +-
.../app/menu-button/menu-button.component.less | 2 +-
.../src/app/services/http-client.service.ts | 4 +-
.../app/services/mock-api-data.service.spec.ts | 81 ++
.../src/app/services/mock-api-data.service.ts | 1260 +++++++++---------
.../src/app/top-menu/top-menu.component.less | 2 +-
20 files changed, 788 insertions(+), 627 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
index f3630bb..8366952 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
index d1b185e..3706d51 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
index ae7fd7e..e48349e 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
index fba0ae6..f948b12 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/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 659172d..6670082 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,15 +17,16 @@
*/
import {BrowserModule} from '@angular/platform-browser';
-import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {NgModule, CUSTOM_ELEMENTS_SCHEMA, Injector} from '@angular/core';
import {FormsModule} from '@angular/forms';
-import {HttpModule, Http} from '@angular/http';
-import {InMemoryWebApiModule} from 'angular-in-memory-web-api';
-import {mockApiDataService} from './services/mock-api-data.service'
+import {HttpModule, Http, XHRBackend, BrowserXhr, ResponseOptions, XSRFStrategy} from '@angular/http';
+import {InMemoryBackendService} from 'angular-in-memory-web-api';
import {AlertModule} from 'ngx-bootstrap';
import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
import {StoreModule} from '@ngrx/store';
+import {environment} from '../environments/environment';
+import {mockApiDataService} from '@app/services/mock-api-data.service'
import {HttpClientService} from '@app/services/http-client.service';
import {ComponentActionsService} from '@app/services/component-actions.service';
import {FilteringService} from '@app/services/filtering.service';
@@ -51,7 +52,23 @@ import {AccordionPanelComponent} from '@app/accordion-panel/accordion-panel.comp
import {LogsListComponent} from '@app/logs-list/logs-list.component';
export function HttpLoaderFactory(http: Http) {
- return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+ // adding 'static' parameter to step over mock data request
+ return new TranslateHttpLoader(http, 'assets/i18n/', '.json?static=true');
+}
+
+export function getXHRBackend(injector: Injector, browser: BrowserXhr, xsrf: XSRFStrategy, options: ResponseOptions): any {
+ if (environment.production) {
+ return new XHRBackend(browser, options, xsrf);
+ } else {
+ return new InMemoryBackendService(
+ injector,
+ new mockApiDataService(),
+ {
+ passThruUnknownUrl: true,
+ rootPath: ''
+ }
+ );
+ }
}
@NgModule({
@@ -72,10 +89,6 @@ export function HttpLoaderFactory(http: Http) {
BrowserModule,
FormsModule,
HttpModule,
- InMemoryWebApiModule.forRoot(mockApiDataService, {
- passThruUnknownUrl: true,
- rootPath: ''
- }),
AlertModule.forRoot(),
TranslateModule.forRoot({
loader: {
@@ -104,7 +117,12 @@ export function HttpLoaderFactory(http: Http) {
GraphsService,
NodesService,
UserConfigsService,
- FiltersService
+ FiltersService,
+ {
+ provide: XHRBackend,
+ useFactory: getXHRBackend,
+ deps: [Injector, BrowserXhr, XSRFStrategy, ResponseOptions]
+ }
],
bootstrap: [AppComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
index 2c97a17..ec8e84b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
index 49eaf1f..ba0bd03 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
index 65446da..de6e79b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
index 3a9dcac..1395959 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
index d1df7b0..c54171a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
index c86d4cb..6bab2e6 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
index b84296a..f760ee8 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
index 1179e55..6bf54fe 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
index 6442864..53cdee6 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
index 107fb0d..5fd0ce5 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
index d6024c2..6a3a43d 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
index 2b69f45..84f82b3 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
@@ -21,7 +21,6 @@ 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';
-import {environment} from '@app/../environments/environment';
@Injectable()
export class HttpClientService extends Http {
@@ -75,8 +74,7 @@ export class HttpClientService extends Http {
}
post(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
- return environment.production ?
- super.post(this.generateUrlString(url), body, options) : super.get(this.generateUrlString(url), options);
+ return super.post(this.generateUrlString(url), body, options);
}
put(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.spec.ts
new file mode 100644
index 0000000..410f70d
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.spec.ts
@@ -0,0 +1,81 @@
+/**
+ * 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 {mockApiDataService} from './mock-api-data.service';
+
+describe('mockApiDataService', () => {
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ providers: [mockApiDataService]
+ });
+ });
+
+ it('should create service', inject([mockApiDataService], (service: mockApiDataService) => {
+ expect(service).toBeTruthy();
+ }));
+
+ describe('#parseUrl()', () => {
+ const cases = [
+ {
+ url: 'root',
+ base: '/',
+ collectionName: 'root',
+ query: '',
+ title: 'one-level depth url, no query params'
+ },
+ {
+ url: 'root?param0=1¶m1=2',
+ base: '/',
+ collectionName: 'root',
+ query: 'param0=1¶m1=2',
+ title: 'one-level depth url with query params'
+ },
+ {
+ url: 'root/resources/collection',
+ base: 'root/resources/',
+ collectionName: 'collection',
+ query: '',
+ title: 'more than one-level depth url, no query params'
+ },
+ {
+ url: 'root/resources/collection?param0=1¶m1=2',
+ base: 'root/resources/',
+ collectionName: 'collection',
+ query: 'param0=1¶m1=2',
+ title: 'more than one-level depth url with query params'
+ }
+ ];
+
+ cases.forEach(test => {
+ describe(test.title, () => {
+ it('base', inject([mockApiDataService], (service: mockApiDataService) => {
+ expect(service.parseUrl(test.url).base).toEqual(test.base);
+ }));
+
+ it('collectionName', inject([mockApiDataService], (service: mockApiDataService) => {
+ expect(service.parseUrl(test.url).collectionName).toEqual(test.collectionName);
+ }));
+
+ it('query', inject([mockApiDataService], (service: mockApiDataService) => {
+ expect(service.parseUrl(test.url).query.toString()).toEqual(test.query);
+ }));
+ });
+ });
+ });
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
index ff2ed2c..a6215e6 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
@@ -16,350 +16,398 @@
* limitations under the License.
*/
-import {InMemoryDbService} from 'angular-in-memory-web-api';
+import {URLSearchParams, Response, ResponseOptions} from '@angular/http';
+import {InMemoryDbService, InMemoryBackendService, createErrorResponse} from 'angular-in-memory-web-api';
+import {Observable} from 'rxjs/Observable';
+import {Subscriber} from 'rxjs/Subscriber';
+
+export class mockBackendService extends InMemoryBackendService {
+ getLocation(url: string): any {
+ return super.getLocation(url);
+ }
+}
export class mockApiDataService implements InMemoryDbService {
+
+ parseUrl(url: string): any {
+ const urlLocation = mockBackendService.prototype.getLocation(url),
+ query = urlLocation.search && new URLSearchParams(urlLocation.search.substr(1)),
+ splitUrl = urlLocation.pathname.substr(1).split('/'),
+ urlPartsCount = splitUrl.length,
+ collectionName = splitUrl[urlPartsCount - 1],
+ base = splitUrl.slice(0, urlPartsCount - 1).join('/') + '/';
+ return {
+ base: base,
+ collectionName: collectionName,
+ query: query
+ };
+ }
+
+ get(interceptorArgs: any): Observable<Response> {
+ const query = interceptorArgs.requestInfo.query,
+ path = interceptorArgs.requestInfo.base + interceptorArgs.requestInfo.collectionName,
+ pathArray = path.split('/').filter(part => part !== '');
+ if (query && query.paramsMap.has('static') && interceptorArgs.passThruBackend) {
+ return interceptorArgs.passThruBackend.createConnection(interceptorArgs.requestInfo.req).response;
+ } else {
+ let is404 = false;
+ const data = pathArray.reduce((currentObject, currentKey, index, array) => {
+ if (!currentObject && index < array.length - 1) {
+ return {};
+ } else if (currentObject.hasOwnProperty(currentKey)) {
+ return currentObject[currentKey];
+ } else {
+ is404 = true;
+ return {};
+ }
+ }, interceptorArgs.db);
+ if (is404) {
+ return new Observable<Response>((subscriber: Subscriber<Response>) => subscriber.error(new Response(createErrorResponse(
+ interceptorArgs.requestInfo.req, 404, 'Not found'
+ ))));
+ } else {
+ return new Observable<Response>((subscriber: Subscriber<Response>) => subscriber.next(new Response(new ResponseOptions({
+ status: 200,
+ body: data
+ }))));
+ }
+ }
+ }
+
+ post(interceptorArgs: any) {
+ // TODO implement posting data to mock object except login call
+ return this.get(interceptorArgs);
+ }
+
createDb() {
return {
login: {},
- audit: {
- logs: {
- logList: [
- {
- policy: 'policy',
- reason: 'Authentication required',
- result: 0,
- text: 'Please log in',
- tags: [
- 'ambari_agent'
- ],
- resource: '/ambari-agent',
- sess: '0',
- access: '0',
- logType: 'AmbariAudit',
- tags_str: 'ambari_agent',
- resType: 'agent',
- reqUser: 'admin',
- reqData: 'data',
- repoType: 1,
- repo: 'ambari',
- proxyUsers: [
- 'admin'
- ],
- evtTime: '2017-05-29T11:30:22.531Z',
- enforcer: 'ambari-acl',
- reqContext: 'ambari',
- cliType: 'GET',
- cliIP: '192.168.0.1',
- agent: 'agent',
- agentHost: 'localhost',
- action: 'SERVICE_CHECK',
- type: 'ambari-audit',
- _version_: 2,
- id: 'id0',
- file: 'ambari-agent.log',
- seq_num: 3,
- bundle_id: 'b0',
- case_id: 'c0',
- log_message: 'User(admin), Operation(SERVICE_CHECK)',
- logfile_line_number: 4,
- message_md5: '12345678900987654321',
- cluster: 'cl0',
- event_count: 0,
- event_md5: '09876543211234567890',
- event_dur_ms: 100,
- _ttl_: "+7DAYS",
- _expire_at_: '2017-05-29T11:30:22.531Z',
- _router_field_: 5
- },
- {
- policy: 'policy',
- reason: 'Server error',
- result: 1,
- text: 'Something went wrong',
- tags: [
- 'ambari_agent'
- ],
- resource: '/ambari-agent',
- sess: '1',
- access: '1',
- logType: 'AmbariAudit',
- tags_str: 'ambari_server',
- resType: 'server',
- reqUser: 'user',
- reqData: 'data',
- repoType: 1,
- repo: 'ambari',
- proxyUsers: [
- 'user'
+ api: {
+ v1: {
+ audit: {
+ logs: {
+ logList: [
+ {
+ policy: 'policy',
+ reason: 'Authentication required',
+ result: 0,
+ text: 'Please log in',
+ tags: [
+ 'ambari_agent'
+ ],
+ resource: '/ambari-agent',
+ sess: '0',
+ access: '0',
+ logType: 'AmbariAudit',
+ tags_str: 'ambari_agent',
+ resType: 'agent',
+ reqUser: 'admin',
+ reqData: 'data',
+ repoType: 1,
+ repo: 'ambari',
+ proxyUsers: [
+ 'admin'
+ ],
+ evtTime: '2017-05-29T11:30:22.531Z',
+ enforcer: 'ambari-acl',
+ reqContext: 'ambari',
+ cliType: 'GET',
+ cliIP: '192.168.0.1',
+ agent: 'agent',
+ agentHost: 'localhost',
+ action: 'SERVICE_CHECK',
+ type: 'ambari-audit',
+ _version_: 2,
+ id: 'id0',
+ file: 'ambari-agent.log',
+ seq_num: 3,
+ bundle_id: 'b0',
+ case_id: 'c0',
+ log_message: 'User(admin), Operation(SERVICE_CHECK)',
+ logfile_line_number: 4,
+ message_md5: '12345678900987654321',
+ cluster: 'cl0',
+ event_count: 0,
+ event_md5: '09876543211234567890',
+ event_dur_ms: 100,
+ _ttl_: "+7DAYS",
+ _expire_at_: '2017-05-29T11:30:22.531Z',
+ _router_field_: 5
+ },
+ {
+ policy: 'policy',
+ reason: 'Server error',
+ result: 1,
+ text: 'Something went wrong',
+ tags: [
+ 'ambari_agent'
+ ],
+ resource: '/ambari-agent',
+ sess: '1',
+ access: '1',
+ logType: 'AmbariAudit',
+ tags_str: 'ambari_server',
+ resType: 'server',
+ reqUser: 'user',
+ reqData: 'data',
+ repoType: 1,
+ repo: 'ambari',
+ proxyUsers: [
+ 'user'
+ ],
+ evtTime: '2017-05-29T11:30:22.531Z',
+ enforcer: 'hdfs',
+ reqContext: 'ambari_server',
+ cliType: 'PUT',
+ cliIP: '192.168.0.1',
+ agent: 'agent',
+ agentHost: 'localhost',
+ action: 'SERVICE_CHECK',
+ type: 'ambari-audit',
+ _version_: 4,
+ id: 'id1',
+ file: 'ambari-agent.log',
+ seq_num: 5,
+ bundle_id: 'b1',
+ case_id: 'c1',
+ log_message: 'User(user), Operation(SERVICE_CHECK)',
+ logfile_line_number: 6,
+ message_md5: '10293847561029384756',
+ cluster: 'cl1',
+ event_count: 2,
+ event_md5: '01928374650192837465',
+ event_dur_ms: 500,
+ _ttl_: "+7DAYS",
+ _expire_at_: '2017-05-29T11:30:22.531Z',
+ _router_field_: 10
+ }
],
- evtTime: '2017-05-29T11:30:22.531Z',
- enforcer: 'hdfs',
- reqContext: 'ambari_server',
- cliType: 'PUT',
- cliIP: '192.168.0.1',
- agent: 'agent',
- agentHost: 'localhost',
- action: 'SERVICE_CHECK',
- type: 'ambari-audit',
- _version_: 4,
- id: 'id1',
- file: 'ambari-agent.log',
- seq_num: 5,
- bundle_id: 'b1',
- case_id: 'c1',
- log_message: 'User(user), Operation(SERVICE_CHECK)',
- logfile_line_number: 6,
- message_md5: '10293847561029384756',
- cluster: 'cl1',
- event_count: 2,
- event_md5: '01928374650192837465',
- event_dur_ms: 500,
- _ttl_: "+7DAYS",
- _expire_at_: '2017-05-29T11:30:22.531Z',
- _router_field_: 10
- }
- ],
- bargraph: {
- graphData: [
- {
- dataCount: [
- {
- name: 'n0',
- value: 1
- },
- {
- name: 'n1',
- value: 2
- }
- ],
- name: 'graph0'
- },
- {
- dataCount: [
- {
- name: 'n2',
- value: 10
- },
- {
- name: 'n3',
- value: 20
- }
- ],
- name: 'graph1'
- }
- ]
- },
- components: {},
- resources: {
- graphData: [
- {
- dataCount: [
- {
- name: 'n16',
- value: 800
- },
- {
- name: 'n17',
- value: 400
- }
- ],
- name: 'graph8'
- },
- {
- dataCount: [
- {
- name: 'n18',
- value: 600
- },
- {
- name: 'n19',
- value: 300
- }
- ],
- name: 'graph9'
- }
- ]
- },
- schema: {
- fields: ''
- },
- serviceload: {
- graphData: [
- {
- dataCount: [
+ bargraph: {
+ graphData: [
{
- name: 'n4',
- value: 1
+ dataCount: [
+ {
+ name: 'n0',
+ value: 1
+ },
+ {
+ name: 'n1',
+ value: 2
+ }
+ ],
+ name: 'graph0'
},
{
- name: 'n5',
- value: 2
+ dataCount: [
+ {
+ name: 'n2',
+ value: 10
+ },
+ {
+ name: 'n3',
+ value: 20
+ }
+ ],
+ name: 'graph1'
}
- ],
- name: 'graph2'
+ ]
},
- {
- dataCount: [
- {
- name: 'n6',
- value: 10
- },
- {
- name: 'n7',
- value: 20
- }
- ],
- name: 'graph3'
- }
- ]
- }
- }
- },
- public: {
- config: {}
- },
- service: {
- logs: {
- logList: [
- {
- path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
- host: 'h0',
- level: 'WARN',
- logtime: '2017-05-28T11:30:22.531Z',
- ip: '192.168.0.1',
- logfile_line_number: 8,
- type: 'ams_collector',
- _version_: 9,
- id: 'id2',
- file: 'ambari-metrics-collector.log',
- seq_num: 10,
- bundle_id: 'b2',
- case_id: 'c2',
- log_message: 'Connection refused',
- message_md5: '1357908642',
- cluster: 'cl2',
- event_count: 5,
- event_md5: '1908755391',
- event_dur_ms: 200,
- _ttl_: "+5DAYS",
- _expire_at_: '2017-05-29T11:30:22.531Z',
- _router_field_: 20
- },
- {
- path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
- host: 'h1',
- level: 'ERROR',
- logtime: '2017-05-28T10:30:22.531Z',
- ip: '192.168.0.2',
- type: 'ams_collector',
- _version_: 14,
- id: 'id3',
- file: 'ambari-metrics-collector.log',
- seq_num: 15,
- bundle_id: 'b3',
- case_id: 'c3',
- log_message: 'Connection refused',
- logfile_line_number: 16,
- message_md5: '1357908642',
- cluster: 'cl3',
- event_count: 2,
- event_md5: '1029384756',
- event_dur_ms: 700,
- _ttl_: "+5DAYS",
- _expire_at_: '2017-05-29T10:30:22.531Z',
- _router_field_: 5
- }
- ],
- aggregated: {
- graphData: [
- {
- name: 'n0',
- count: 100,
- dataList: [
+ components: {},
+ resources: {
+ graphData: [
{
- name: 'n1',
- count: 50,
- dataList: null
+ dataCount: [
+ {
+ name: 'n16',
+ value: 800
+ },
+ {
+ name: 'n17',
+ value: 400
+ }
+ ],
+ name: 'graph8'
},
{
- name: 'n2',
- count: 200,
- dataList: null
+ dataCount: [
+ {
+ name: 'n18',
+ value: 600
+ },
+ {
+ name: 'n19',
+ value: 300
+ }
+ ],
+ name: 'graph9'
}
]
},
- {
- name: 'n3',
- count: 10,
- dataList: [
+ schema: {
+ fields: ''
+ },
+ serviceload: {
+ graphData: [
{
- name: 'n4',
- count: 5,
- dataList: null
+ dataCount: [
+ {
+ name: 'n4',
+ value: 1
+ },
+ {
+ name: 'n5',
+ value: 2
+ }
+ ],
+ name: 'graph2'
},
{
- name: 'n5',
- count: 20,
- dataList: null
+ dataCount: [
+ {
+ name: 'n6',
+ value: 10
+ },
+ {
+ name: 'n7',
+ value: 20
+ }
+ ],
+ name: 'graph3'
}
]
}
- ]
+ }
},
- components: {
- count: {
- anygraph: {
+ public: {
+ config: {}
+ },
+ service: {
+ logs: {
+ logList: [
+ {
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h0',
+ level: 'WARN',
+ logtime: '2017-05-28T11:30:22.531Z',
+ ip: '192.168.0.1',
+ logfile_line_number: 8,
+ type: 'ams_collector',
+ _version_: 9,
+ id: 'id2',
+ file: 'ambari-metrics-collector.log',
+ seq_num: 10,
+ bundle_id: 'b2',
+ case_id: 'c2',
+ log_message: 'Connection refused',
+ message_md5: '1357908642',
+ cluster: 'cl2',
+ event_count: 5,
+ event_md5: '1908755391',
+ event_dur_ms: 200,
+ _ttl_: "+5DAYS",
+ _expire_at_: '2017-05-29T11:30:22.531Z',
+ _router_field_: 20
+ },
+ {
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h1',
+ level: 'ERROR',
+ logtime: '2017-05-28T10:30:22.531Z',
+ ip: '192.168.0.2',
+ type: 'ams_collector',
+ _version_: 14,
+ id: 'id3',
+ file: 'ambari-metrics-collector.log',
+ seq_num: 15,
+ bundle_id: 'b3',
+ case_id: 'c3',
+ log_message: 'Connection refused',
+ logfile_line_number: 16,
+ message_md5: '1357908642',
+ cluster: 'cl3',
+ event_count: 2,
+ event_md5: '1029384756',
+ event_dur_ms: 700,
+ _ttl_: "+5DAYS",
+ _expire_at_: '2017-05-29T10:30:22.531Z',
+ _router_field_: 5
+ }
+ ],
+ aggregated: {
graphData: [
{
- dataCount: [
+ name: 'n0',
+ count: 100,
+ dataList: [
{
- name: 'n8',
- value: 50
+ name: 'n1',
+ count: 50,
+ dataList: null
},
{
- name: 'n9',
- value: 100
+ name: 'n2',
+ count: 200,
+ dataList: null
}
- ],
- name: 'graph4'
+ ]
},
{
- dataCount: [
+ name: 'n3',
+ count: 10,
+ dataList: [
{
- name: 'n10',
- value: 5
+ name: 'n4',
+ count: 5,
+ dataList: null
},
{
- name: 'n11',
- value: 10
+ name: 'n5',
+ count: 20,
+ dataList: null
}
- ],
- name: 'graph5'
+ ]
}
]
- }
- },
- levels: {
- counts: {
- vNodeList: [
- {
- name: 'ambari',
- type: 0,
- logLevelCount: [
+ },
+ components: {
+ count: {
+ anygraph: {
+ graphData: [
{
- name: 'ERROR',
- value: '10'
+ dataCount: [
+ {
+ name: 'n8',
+ value: 50
+ },
+ {
+ name: 'n9',
+ value: 100
+ }
+ ],
+ name: 'graph4'
},
{
- name: 'WARN',
- value: '50'
+ dataCount: [
+ {
+ name: 'n10',
+ value: 5
+ },
+ {
+ name: 'n11',
+ value: 10
+ }
+ ],
+ name: 'graph5'
}
- ],
- childs: [
+ ]
+ }
+ },
+ levels: {
+ counts: {
+ vNodeList: [
{
- name: 'hdfs',
- type: 2,
+ name: 'ambari',
+ type: 0,
logLevelCount: [
{
name: 'ERROR',
@@ -367,114 +415,114 @@ export class mockApiDataService implements InMemoryDbService {
},
{
name: 'WARN',
- value: '20'
+ value: '50'
}
],
- isParent: false,
+ childs: [
+ {
+ name: 'hdfs',
+ type: 2,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '10'
+ },
+ {
+ name: 'WARN',
+ value: '20'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ },
+ {
+ name: 'zookeeper',
+ type: 3,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '20'
+ },
+ {
+ name: 'WARN',
+ value: '40'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ],
+ isParent: true,
isRoot: false
},
{
- name: 'zookeeper',
- type: 3,
+ name: 'ambari_agent',
+ type: 1,
logLevelCount: [
{
name: 'ERROR',
- value: '20'
+ value: '100'
},
{
name: 'WARN',
- value: '40'
+ value: '500'
}
],
isParent: false,
isRoot: false
}
+ ]
+ }
+ }
+ },
+ files: {
+ hostLogFiles: {
+ clusters: [
+ 'c0',
+ 'c1'
+ ],
+ services: [
+ 'hdfs',
+ 'zookeeper'
+ ]
+ }
+ },
+ histogram: {
+ graphData: [
+ {
+ dataCount: [
+ {
+ name: 'n12',
+ value: 1000
+ },
+ {
+ name: 'n13',
+ value: 2000
+ }
],
- isParent: true,
- isRoot: false
+ name: 'graph6'
},
{
- name: 'ambari_agent',
- type: 1,
- logLevelCount: [
+ dataCount: [
{
- name: 'ERROR',
- value: '100'
+ name: 'n14',
+ value: 700
},
{
- name: 'WARN',
- value: '500'
+ name: 'n15',
+ value: 900
}
],
- isParent: false,
- isRoot: false
+ name: 'graph7'
}
]
- }
- }
- },
- files: {
- hostLogFiles: {
- clusters: [
- 'c0',
- 'c1'
- ],
- services: [
- 'hdfs',
- 'zookeeper'
- ]
- }
- },
- histogram: {
- graphData: [
- {
- dataCount: [
- {
- name: 'n12',
- value: 1000
- },
- {
- name: 'n13',
- value: 2000
- }
- ],
- name: 'graph6'
},
- {
- dataCount: [
- {
- name: 'n14',
- value: 700
- },
- {
- name: 'n15',
- value: 900
- }
- ],
- name: 'graph7'
- }
- ]
- },
- hosts: {
- components: {
- vNodeList: [
- {
- name: 'ambari',
- type: 0,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '100'
- },
+ hosts: {
+ components: {
+ vNodeList: [
{
- name: 'WARN',
- value: '500'
- }
- ],
- childs: [
- {
- name: 'ambari_metrics',
- type: 2,
+ name: 'ambari',
+ type: 0,
logLevelCount: [
{
name: 'ERROR',
@@ -482,100 +530,100 @@ export class mockApiDataService implements InMemoryDbService {
},
{
name: 'WARN',
- value: '200'
+ value: '500'
}
],
- isParent: false,
+ childs: [
+ {
+ name: 'ambari_metrics',
+ type: 2,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '100'
+ },
+ {
+ name: 'WARN',
+ value: '200'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ },
+ {
+ name: 'hbase',
+ type: 3,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '200'
+ },
+ {
+ name: 'WARN',
+ value: '400'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ],
+ isParent: true,
isRoot: false
},
{
- name: 'hbase',
- type: 3,
+ name: 'ambari_server',
+ type: 1,
logLevelCount: [
{
name: 'ERROR',
- value: '200'
+ value: '1000'
},
{
name: 'WARN',
- value: '400'
+ value: '5000'
}
],
isParent: false,
isRoot: false
}
- ],
- isParent: true,
- isRoot: false
+ ]
},
- {
- name: 'ambari_server',
- type: 1,
- logLevelCount: [
+ count: {
+ getvCounts: [
{
- name: 'ERROR',
- value: '1000'
+ name: 'n20',
+ count: 100
},
{
- name: 'WARN',
- value: '5000'
+ name: 'n21',
+ count: 200
}
- ],
- isParent: false,
- isRoot: false
- }
- ]
- },
- count: {
- getvCounts: [
- {
- name: 'n20',
- count: 100
- },
- {
- name: 'n21',
- count: 200
+ ]
}
- ]
- }
- },
- levels: {
- counts: {
- getvNameValues: [
- {
- name: 'n22',
- count: 1000
- },
- {
- name: 'n23',
- count: 2000
+ },
+ levels: {
+ counts: {
+ getvNameValues: [
+ {
+ name: 'n22',
+ count: 1000
+ },
+ {
+ name: 'n23',
+ count: 2000
+ }
+ ]
}
- ]
- }
- },
- schema: {
- fields: ''
- },
- serviceconfig: '',
- tree: {
- vNodeList: [
- {
- name: 'ambari',
- type: 0,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '1000'
- },
- {
- name: 'WARN',
- value: '5000'
- }
- ],
- childs: [
+ },
+ schema: {
+ fields: ''
+ },
+ serviceconfig: '',
+ tree: {
+ vNodeList: [
{
- name: 'yarn',
- type: 2,
+ name: 'ambari',
+ type: 0,
logLevelCount: [
{
name: 'ERROR',
@@ -583,182 +631,198 @@ export class mockApiDataService implements InMemoryDbService {
},
{
name: 'WARN',
- value: '2000'
+ value: '5000'
}
],
- isParent: false,
+ childs: [
+ {
+ name: 'yarn',
+ type: 2,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '1000'
+ },
+ {
+ name: 'WARN',
+ value: '2000'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ },
+ {
+ name: 'hive',
+ type: 3,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '2000'
+ },
+ {
+ name: 'WARN',
+ value: '4000'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ],
+ isParent: true,
isRoot: false
},
{
- name: 'hive',
- type: 3,
+ name: 'ambari_server',
+ type: 1,
logLevelCount: [
{
name: 'ERROR',
- value: '2000'
+ value: '10000'
},
{
name: 'WARN',
- value: '4000'
+ value: '50000'
}
],
isParent: false,
isRoot: false
}
- ],
- isParent: true,
- isRoot: false
+ ]
},
- {
- name: 'ambari_server',
- type: 1,
- logLevelCount: [
+ truncated: {
+ logList: [
{
- name: 'ERROR',
- value: '10000'
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h0',
+ level: 'WARN',
+ logtime: '2017-05-28T11:30:22.531Z',
+ ip: '192.168.0.1',
+ logfile_line_number: 8,
+ type: 'ams_collector',
+ _version_: 9,
+ id: 'id2',
+ file: 'ambari-metrics-collector.log',
+ seq_num: 10,
+ bundle_id: 'b2',
+ case_id: 'c2',
+ log_message: 'Connection refused',
+ message_md5: '1357908642',
+ cluster: 'cl2',
+ event_count: 5,
+ event_md5: '1908755391',
+ event_dur_ms: 200,
+ _ttl_: "+5DAYS",
+ _expire_at_: '2017-05-29T11:30:22.531Z',
+ _router_field_: 20
},
{
- name: 'WARN',
- value: '50000'
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h1',
+ level: 'ERROR',
+ logtime: '2017-05-28T10:30:22.531Z',
+ ip: '192.168.0.2',
+ type: 'ams_collector',
+ _version_: 14,
+ id: 'id3',
+ file: 'ambari-metrics-collector.log',
+ seq_num: 15,
+ bundle_id: 'b3',
+ case_id: 'c3',
+ log_message: 'Connection refused',
+ logfile_line_number: 16,
+ message_md5: '1357908642',
+ cluster: 'cl3',
+ event_count: 2,
+ event_md5: '1029384756',
+ event_dur_ms: 700,
+ _ttl_: "+5DAYS",
+ _expire_at_: '2017-05-29T10:30:22.531Z',
+ _router_field_: 5
}
- ],
- isParent: false,
- isRoot: false
+ ]
}
- ]
+ }
},
- truncated: {
- logList: [
+ status: {
+ auditlogs: {
+ znodeReady: true,
+ solrCollectionReady: true,
+ solrAliasReady: false,
+ configurationUploaded: true
+ },
+ servicelogs: {
+ znodeReady: true,
+ solrCollectionReady: true,
+ configurationUploaded: true
+ },
+ userconfig: {
+ znodeReady: true,
+ solrCollectionReady: true,
+ configurationUploaded: true
+ }
+ },
+ userconfig: {
+ userConfigList: [
{
- path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
- host: 'h0',
- level: 'WARN',
- logtime: '2017-05-28T11:30:22.531Z',
- ip: '192.168.0.1',
- logfile_line_number: 8,
- type: 'ams_collector',
- _version_: 9,
- id: 'id2',
- file: 'ambari-metrics-collector.log',
- seq_num: 10,
- bundle_id: 'b2',
- case_id: 'c2',
- log_message: 'Connection refused',
- message_md5: '1357908642',
- cluster: 'cl2',
- event_count: 5,
- event_md5: '1908755391',
- event_dur_ms: 200,
- _ttl_: "+5DAYS",
- _expire_at_: '2017-05-29T11:30:22.531Z',
- _router_field_: 20
+ id: 'c0',
+ userName: 'admin',
+ filtername: 'service',
+ values: 'hdfs',
+ shareNameList: [
+ 's0',
+ 's1'
+ ],
+ rowType: 'history'
},
{
- path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
- host: 'h1',
- level: 'ERROR',
- logtime: '2017-05-28T10:30:22.531Z',
- ip: '192.168.0.2',
- type: 'ams_collector',
- _version_: 14,
- id: 'id3',
- file: 'ambari-metrics-collector.log',
- seq_num: 15,
- bundle_id: 'b3',
- case_id: 'c3',
- log_message: 'Connection refused',
- logfile_line_number: 16,
- message_md5: '1357908642',
- cluster: 'cl3',
- event_count: 2,
- event_md5: '1029384756',
- event_dur_ms: 700,
- _ttl_: "+5DAYS",
- _expire_at_: '2017-05-29T10:30:22.531Z',
- _router_field_: 5
+ id: 'c0',
+ userName: 'user',
+ filtername: 'component',
+ values: 'namenode',
+ shareNameList: [
+ 's2',
+ 's3'
+ ],
+ rowType: 'history'
}
- ]
- }
- }
- },
- status: {
- auditlogs: {
- znodeReady: true,
- solrCollectionReady: true,
- solrAliasReady: false,
- configurationUploaded: true
- },
- servicelogs: {
- znodeReady: true,
- solrCollectionReady: true,
- configurationUploaded: true
- },
- userconfig: {
- znodeReady: true,
- solrCollectionReady: true,
- configurationUploaded: true
- }
- },
- userconfig: {
- userConfigList: [
- {
- id: 'c0',
- userName: 'admin',
- filtername: 'service',
- values: 'hdfs',
- shareNameList: [
- 's0',
- 's1'
],
- rowType: 'history'
- },
- {
- id: 'c0',
- userName: 'user',
- filtername: 'component',
- values: 'namenode',
- shareNameList: [
- 's2',
- 's3'
- ],
- rowType: 'history'
- }
- ],
- filters: {
- filter0: {
- label: 'filter0',
- hosts: [
- 'h0',
- 'h1'
- ],
- defaultLevels: [
- 'l0',
- 'l1'
- ],
- overrideLevels: [
- 'l2',
- 'l3'
- ],
- expiryTime: '2017-05-29T11:30:22.531Z'
- },
- filter1: {
- label: 'filter1',
- hosts: [
- 'h1',
- 'h2'
- ],
- defaultLevels: [
- 'l4',
- 'l5'
- ],
- overrideLevels: [
- 'l6',
- 'l7'
- ],
- expiryTime: '2017-05-30T11:30:22.531Z'
+ filters: {
+ filter0: {
+ label: 'filter0',
+ hosts: [
+ 'h0',
+ 'h1'
+ ],
+ defaultLevels: [
+ 'l0',
+ 'l1'
+ ],
+ overrideLevels: [
+ 'l2',
+ 'l3'
+ ],
+ expiryTime: '2017-05-29T11:30:22.531Z'
+ },
+ filter1: {
+ label: 'filter1',
+ hosts: [
+ 'h1',
+ 'h2'
+ ],
+ defaultLevels: [
+ 'l4',
+ 'l5'
+ ],
+ overrideLevels: [
+ 'l6',
+ 'l7'
+ ],
+ expiryTime: '2017-05-30T11:30:22.531Z'
+ }
+ },
+ names: []
}
- },
- names: []
+ }
}
};
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/56681d79/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
index 2e8e77a..e5e85f4 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
@@ -1,4 +1,4 @@
-/*
+/**
* 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.
[09/21] ambari git commit: AMBARI-21314 Log Search UI: implement top
bar. (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21314 Log Search UI: implement top bar. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e71ad966
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e71ad966
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e71ad966
Branch: refs/heads/branch-feature-logsearch-ui
Commit: e71ad9666728cd20c99c5528cdbd5b238d41f438
Parents: 8aa761f
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu May 25 13:57:40 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:28:31 2017 +0300
----------------------------------------------------------------------
.../ambari-logsearch-web-new/.angular-cli.json | 1 +
.../src/app/app.component.html | 9 +-
.../src/app/app.component.less | 26 +++++
.../src/app/app.component.spec.ts | 2 +-
.../src/app/app.component.ts | 2 +-
.../src/app/app.module.ts | 16 +++-
.../src/app/http-client.service.spec.ts | 57 -----------
.../src/app/http-client.service.ts | 97 -------------------
.../app/login-form/login-form.component.spec.ts | 6 +-
.../src/app/login-form/login-form.component.ts | 2 +-
.../app/menu-button/menu-button.component.html | 31 ++++++
.../app/menu-button/menu-button.component.less | 29 ++++++
.../menu-button/menu-button.component.spec.ts | 87 +++++++++++++++++
.../app/menu-button/menu-button.component.ts | 73 +++++++++++++++
.../src/app/mock-api-data.service.ts | 25 -----
.../src/app/services/actions.service.spec.ts | 33 +++++++
.../src/app/services/actions.service.ts | 47 ++++++++++
.../app/services/http-client.service.spec.ts | 57 +++++++++++
.../src/app/services/http-client.service.ts | 99 ++++++++++++++++++++
.../src/app/services/mock-api-data.service.ts | 25 +++++
.../src/app/top-menu/top-menu.component.html | 18 ++++
.../src/app/top-menu/top-menu.component.less | 22 +++++
.../src/app/top-menu/top-menu.component.spec.ts | 45 +++++++++
.../src/app/top-menu/top-menu.component.ts | 90 ++++++++++++++++++
.../src/assets/.gitkeep | 0
.../src/assets/i18n/en.json | 11 ++-
26 files changed, 716 insertions(+), 194 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/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 2f90ebe..cc74739 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
@@ -26,6 +26,7 @@
],
"scripts": [
"../node_modules/jquery/dist/jquery.min.js",
+ "../node_modules/bootstrap/dist/js/bootstrap.min.js",
"../src/vendor/js/bootstrap-logsearch.min.js"
],
"environmentSource": "environments/environment.ts",
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/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 8d9f6d0..9b44246 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
@@ -15,5 +15,10 @@
limitations under the License.
-->
-<h1>{{'common.title' | translate}}</h1>
-<login-form *ngIf="!httpClient.isAuthorized"></login-form>
\ No newline at end of file
+<nav class="navbar">
+ <div class="container-fluid">
+ <h1 [ngClass]="{'full-flex-width': !httpClient.isAuthorized, 'navbar-left': true}">{{'common.title' | translate}}</h1>
+ <top-menu *ngIf="httpClient.isAuthorized" class="navbar-right"></top-menu>
+ </div>
+</nav>
+<login-form *ngIf="!httpClient.isAuthorized"></login-form>
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
index 2944f98..d8410cf 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
@@ -14,3 +14,29 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+.navbar {
+ border-radius: 0;
+ background-color: #323544;
+ color: #fff;
+
+ .container-fluid {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+
+ h1 {
+ flex-basis: 70%;
+ margin-bottom: 20px;
+ text-transform: uppercase;
+
+ &.full-flex-width {
+ flex-basis: 100%;
+ }
+ }
+
+ /deep/ top-menu {
+ flex-basis: 30%;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/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 dfe6fbf..96cb0b4 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
@@ -21,7 +21,7 @@ import {TestBed, async} from '@angular/core/testing';
import {Http} from '@angular/http';
import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
-import {HttpClientService} from './http-client.service';
+import {HttpClientService} from './services/http-client.service';
import {AppComponent} from './app.component';
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/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 79cdc5d..fb79ccb 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
@@ -18,7 +18,7 @@
import {Component} from '@angular/core';
import {TranslateService} from '@ngx-translate/core';
-import {HttpClientService} from './http-client.service';
+import {HttpClientService} from './services/http-client.service';
@Component({
selector: 'app-root',
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/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 2d132e2..e8dee1b 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
@@ -21,14 +21,17 @@ import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {FormsModule} from '@angular/forms';
import {HttpModule, Http} from '@angular/http';
import {InMemoryWebApiModule} from 'angular-in-memory-web-api';
-import {mockApiDataService} from './mock-api-data.service'
+import {mockApiDataService} from './services/mock-api-data.service'
import {AlertModule} from 'ngx-bootstrap';
import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
-import {HttpClientService} from './http-client.service';
+import {HttpClientService} from './services/http-client.service';
+import {ActionsService} from './services/actions.service';
import {AppComponent} from './app.component';
import {LoginFormComponent} from './login-form/login-form.component';
+import {TopMenuComponent} from './top-menu/top-menu.component';
+import {MenuButtonComponent} from './menu-button/menu-button.component';
export function HttpLoaderFactory(http: Http) {
return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
@@ -37,7 +40,9 @@ export function HttpLoaderFactory(http: Http) {
@NgModule({
declarations: [
AppComponent,
- LoginFormComponent
+ LoginFormComponent,
+ TopMenuComponent,
+ MenuButtonComponent
],
imports: [
BrowserModule,
@@ -55,7 +60,10 @@ export function HttpLoaderFactory(http: Http) {
}
})
],
- providers: [HttpClientService],
+ providers: [
+ HttpClientService,
+ ActionsService
+ ],
bootstrap: [AppComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/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
deleted file mode 100644
index ec8596d..0000000
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.spec.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * 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/e71ad966/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
deleted file mode 100644
index 3585600..0000000
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/http-client.service.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * 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/e71ad966/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
index b58e834..55d125a 100644
--- 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
@@ -21,7 +21,7 @@ import {FormsModule} from '@angular/forms';
import {HttpModule, Http} from '@angular/http';
import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
-import {HttpClientService} from '../http-client.service';
+import {HttpClientService} from '../services/http-client.service';
import {LoginFormComponent} from './login-form.component';
@@ -84,8 +84,8 @@ describe('LoginFormComponent', () => {
expect(component).toBeTruthy();
});
- describe('login()', () => {
- let cases = [
+ describe('#login()', () => {
+ const cases = [
{
isError: true,
isLoginAlertDisplayed: true,
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/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
index 8dfa344..bffa412 100644
--- 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
@@ -18,7 +18,7 @@
import {Component, OnInit} from '@angular/core';
import 'rxjs/add/operator/finally';
-import {HttpClientService} from '../http-client.service';
+import {HttpClientService} from '../services/http-client.service';
@Component({
selector: 'login-form',
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
new file mode 100644
index 0000000..6bdbac4
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
@@ -0,0 +1,31 @@
+<!--
+ 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 #dropdown [ngClass]="{'dropdown': hasSubItems, 'text-center': true}">
+ <span (mousedown)="onMouseDown()" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">
+ <a *ngIf="title" class="icon" [ngClass]="iconClassNames"></a>
+ <span *ngIf="!title" class="icon" [ngClass]="iconClassNames"></span>
+ </span>
+ <a #dropdownToggle [ngClass]="{'dropdown-toggle': hasSubItems, 'caret': true}" [attr.data-toggle]="hasSubItems ? 'dropdown': null" *ngIf="hasSubItems"></a>
+ <br>
+ <span class="icon-title" *ngIf="title" (mousedown)="onMouseDown()" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">{{title | translate}}</span>
+ <ul class="dropdown-menu" *ngIf="hasSubItems">
+ <li *ngFor="let item of subItems">
+ <a href="#">{{item.title}}</a>
+ </li>
+ </ul>
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
new file mode 100644
index 0000000..16b06c4
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+:host {
+ display: inline-block;
+ cursor: pointer;
+
+ a:hover, a:focus {
+ text-decoration: none;
+ }
+
+ .icon {
+ padding: 5px;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
new file mode 100644
index 0000000..62afe07
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
@@ -0,0 +1,87 @@
+/**
+ * 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 {Http} from '@angular/http';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+import {ActionsService} from '../services/actions.service';
+
+import {MenuButtonComponent} from './menu-button.component';
+
+export function HttpLoaderFactory(http: Http) {
+ return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
+describe('MenuButtonComponent', () => {
+ let component: MenuButtonComponent;
+ let fixture: ComponentFixture<MenuButtonComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [MenuButtonComponent],
+ imports: [
+ TranslateModule.forRoot({
+ provide: TranslateLoader,
+ useFactory: HttpLoaderFactory,
+ deps: [Http]
+ })],
+ providers: [ActionsService]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(MenuButtonComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create component', () => {
+ expect(component).toBeTruthy();
+ });
+
+ describe('#hasSubItems', () => {
+
+ const cases = [
+ {
+ subItems: null,
+ hasSubItems: false,
+ title: 'no sub-items'
+ },
+ {
+ subItems: [],
+ hasSubItems: false,
+ title: 'empty sub-items array'
+ },
+ {
+ subItems: [{}],
+ hasSubItems: true,
+ title: 'sub-items present'
+ }
+ ];
+
+ cases.forEach((test) => {
+ it(test.title, () => {
+ component.subItems = test.subItems;
+ expect(component.hasSubItems).toEqual(test.hasSubItems);
+ });
+ });
+
+ });
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
new file mode 100644
index 0000000..7a967ad
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
@@ -0,0 +1,73 @@
+/**
+ * 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, AfterViewInit, Input, ViewChild, ElementRef} from '@angular/core';
+import {ActionsService} from '../services/actions.service';
+
+@Component({
+ selector: 'menu-button',
+ templateUrl: './menu-button.component.html',
+ styleUrls: ['./menu-button.component.less']
+})
+export class MenuButtonComponent implements AfterViewInit {
+
+ constructor(private actions: ActionsService) {
+ }
+
+ ngAfterViewInit() {
+ }
+
+ @ViewChild('dropdown')
+ dropdown: ElementRef;
+
+ @Input()
+ title?: string;
+
+ @Input()
+ action: string;
+
+ @Input()
+ iconClassNames: string[];
+
+ @Input()
+ subItems?: any[];
+
+ @Input()
+ get hasSubItems(): boolean {
+ return Boolean(this.subItems && this.subItems.length);
+ }
+
+ private clickStartTime: number;
+
+ private readonly longClickInterval = 1000;
+
+ onMouseDown() {
+ this.clickStartTime = (new Date()).getTime();
+ }
+
+ onMouseUp(event: Event) {
+ const clickEndTime = (new Date()).getTime();
+ if (this.hasSubItems && clickEndTime - this.clickStartTime >= this.longClickInterval) {
+ this.dropdown.nativeElement.classList.add('open');
+ } else {
+ this.actions[this.action]();
+ }
+ event.stopPropagation();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts
deleted file mode 100644
index da32c7e..0000000
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * 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 {InMemoryDbService} from 'angular-in-memory-web-api';
-
-export class mockApiDataService implements InMemoryDbService {
- createDb() {
- return {};
- }
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts
new file mode 100644
index 0000000..a14e0db
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts
@@ -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.
+ */
+
+import {TestBed, inject} from '@angular/core/testing';
+
+import {ActionsService} from './actions.service';
+
+describe('ActionsService', () => {
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ providers: [ActionsService]
+ });
+ });
+
+ it('should create service', inject([ActionsService], (service: ActionsService) => {
+ expect(service).toBeTruthy();
+ }));
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts
new file mode 100644
index 0000000..2bcd909
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts
@@ -0,0 +1,47 @@
+/**
+ * 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';
+
+@Injectable()
+export class ActionsService {
+
+ constructor() {
+ }
+
+ //TODO implement actions
+
+ undo() {
+ }
+
+ redo() {
+ }
+
+ refresh() {
+ }
+
+ openHistory() {
+ }
+
+ openAlerts() {
+ }
+
+ openUserDetails() {
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.spec.ts
new file mode 100644
index 0000000..083ea23
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/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/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
new file mode 100644
index 0000000..2aa87f9
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
@@ -0,0 +1,99 @@
+/**
+ * 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);
+ }
+
+ private readonly apiPrefix = 'api/v1/';
+
+ private readonly urls = {
+ status: 'status'
+ };
+
+ private readonly unauthorizedStatuses = [401, 403, 419];
+
+ 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 (this.unauthorizedStatuses.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/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
new file mode 100644
index 0000000..da32c7e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
@@ -0,0 +1,25 @@
+/**
+ * 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 {InMemoryDbService} from 'angular-in-memory-web-api';
+
+export class mockApiDataService implements InMemoryDbService {
+ createDb() {
+ return {};
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
new file mode 100644
index 0000000..82ab60a
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
@@ -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.
+-->
+
+<menu-button *ngFor="let item of items" [title]="item.title" [action]="item.action" [iconClassNames]="item.iconClassNames" [subItems]="item.subItems"></menu-button>
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
new file mode 100644
index 0000000..c992c9e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+:host {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.spec.ts
new file mode 100644
index 0000000..1649a50
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.spec.ts
@@ -0,0 +1,45 @@
+/**
+ * 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 {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+
+import {TopMenuComponent} from './top-menu.component';
+
+describe('TopMenuComponent', () => {
+ let component: TopMenuComponent;
+ let fixture: ComponentFixture<TopMenuComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [TopMenuComponent],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(TopMenuComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create component', () => {
+ expect(component).toBeTruthy();
+ });
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
new file mode 100644
index 0000000..d5f05875
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
@@ -0,0 +1,90 @@
+/**
+ * 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';
+
+@Component({
+ selector: 'top-menu',
+ templateUrl: './top-menu.component.html',
+ styleUrls: ['./top-menu.component.less']
+})
+export class TopMenuComponent implements OnInit {
+
+ constructor() {
+ }
+
+ ngOnInit() {
+ }
+
+ //TODO implement loading of real data into subItems
+ readonly items = [
+ {
+ iconClassNames: ['fa', 'fa-arrow-left'],
+ title: 'topMenu.undo',
+ action: 'undo',
+ subItems: [
+ {
+ title: 'Item 1'
+ },
+ {
+ title: 'Item 2'
+ }
+ ]
+ },
+ {
+ iconClassNames: ['fa', 'fa-arrow-right'],
+ title: 'topMenu.redo',
+ action: 'redo',
+ subItems: [
+ {
+ title: 'Item 1'
+ },
+ {
+ title: 'Item 2'
+ }
+ ]
+ },
+ {
+ iconClassNames: ['fa', 'fa-refresh'],
+ title: 'topMenu.refresh',
+ action: 'refresh'
+ },
+ {
+ iconClassNames: ['fa', 'fa-clock-o'],
+ title: 'topMenu.history',
+ action: 'openHistory',
+ subItems: [
+ {
+ title: 'Item 1'
+ },
+ {
+ title: 'Item 2'
+ }
+ ]
+ },
+ {
+ iconClassNames: ['fa', 'fa-bell'],
+ action: 'openAlerts'
+ },
+ {
+ iconClassNames: ['fa', 'fa-user'],
+ action: 'openUserDetails'
+ }
+ ];
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/assets/.gitkeep
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/assets/.gitkeep b/ambari-logsearch/ambari-logsearch-web-new/src/assets/.gitkeep
deleted file mode 100644
index e69de29..0000000
http://git-wip-us.apache.org/repos/asf/ambari/blob/e71ad966/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json b/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
index 13c3805..dea8120 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
@@ -1,8 +1,13 @@
{
- "common.title": "Ambari Log Search",
+ "common.title": "Log Search",
"authorization.name": "Username",
"authorization.password": "Password",
"authorization.signIn": "Sign In",
- "authorization.error": "<strong>Error!</strong> Invalid User credentials.<br>Please try again."
-}
\ No newline at end of file
+ "authorization.error": "<strong>Error!</strong> Invalid User credentials.<br>Please try again.",
+
+ "topMenu.undo": "Undo",
+ "topMenu.redo": "Redo",
+ "topMenu.refresh": "Refresh",
+ "topMenu.history": "History"
+}
[19/21] ambari git commit: AMBARI-21322 Log Search UI: implement
loading of logs list with filter conditions. (ababiichuk)
Posted by ab...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/assets/mock-data.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/assets/mock-data.ts b/ambari-logsearch/ambari-logsearch-web-new/src/assets/mock-data.ts
new file mode 100644
index 0000000..d269bc3
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/assets/mock-data.ts
@@ -0,0 +1,883 @@
+/**
+ * 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.
+ */
+
+export const mockData = {
+ login: {},
+ api: {
+ v1: {
+ audit: {
+ logs: {
+ logList: [
+ {
+ policy: 'policy',
+ reason: 'Authentication required',
+ result: 0,
+ text: 'Please log in',
+ tags: [
+ 'ambari_agent'
+ ],
+ resource: '/ambari-agent',
+ sess: '0',
+ access: '0',
+ logType: 'AmbariAudit',
+ tags_str: 'ambari_agent',
+ resType: 'agent',
+ reqUser: 'admin',
+ reqData: 'data',
+ repoType: 1,
+ repo: 'ambari',
+ proxyUsers: [
+ 'admin'
+ ],
+ evtTime: '2017-05-29T11:30:22.531Z',
+ enforcer: 'ambari-acl',
+ reqContext: 'ambari',
+ cliType: 'GET',
+ cliIP: '192.168.0.1',
+ agent: 'agent',
+ agentHost: 'localhost',
+ action: 'SERVICE_CHECK',
+ type: 'ambari-audit',
+ _version_: 2,
+ id: 'id0',
+ file: 'ambari-agent.log',
+ seq_num: 3,
+ bundle_id: 'b0',
+ case_id: 'c0',
+ log_message: 'User(admin), Operation(SERVICE_CHECK)',
+ logfile_line_number: 4,
+ message_md5: '12345678900987654321',
+ cluster: 'cl0',
+ event_count: 0,
+ event_md5: '09876543211234567890',
+ event_dur_ms: 100,
+ _ttl_: "+7DAYS",
+ _expire_at_: '2017-05-29T11:30:22.531Z',
+ _router_field_: 5
+ },
+ {
+ policy: 'policy',
+ reason: 'Server error',
+ result: 1,
+ text: 'Something went wrong',
+ tags: [
+ 'ambari_agent'
+ ],
+ resource: '/ambari-agent',
+ sess: '1',
+ access: '1',
+ logType: 'AmbariAudit',
+ tags_str: 'ambari_server',
+ resType: 'server',
+ reqUser: 'user',
+ reqData: 'data',
+ repoType: 1,
+ repo: 'ambari',
+ proxyUsers: [
+ 'user'
+ ],
+ evtTime: '2017-05-29T11:30:22.531Z',
+ enforcer: 'hdfs',
+ reqContext: 'ambari_server',
+ cliType: 'PUT',
+ cliIP: '192.168.0.1',
+ agent: 'agent',
+ agentHost: 'localhost',
+ action: 'SERVICE_CHECK',
+ type: 'ambari-audit',
+ _version_: 4,
+ id: 'id1',
+ file: 'ambari-agent.log',
+ seq_num: 5,
+ bundle_id: 'b1',
+ case_id: 'c1',
+ log_message: 'User(user), Operation(SERVICE_CHECK)',
+ logfile_line_number: 6,
+ message_md5: '10293847561029384756',
+ cluster: 'cl1',
+ event_count: 2,
+ event_md5: '01928374650192837465',
+ event_dur_ms: 500,
+ _ttl_: "+7DAYS",
+ _expire_at_: '2017-05-29T11:30:22.531Z',
+ _router_field_: 10
+ }
+ ],
+ bargraph: {
+ graphData: [
+ {
+ dataCount: [
+ {
+ name: 'n0',
+ value: 1
+ },
+ {
+ name: 'n1',
+ value: 2
+ }
+ ],
+ name: 'graph0'
+ },
+ {
+ dataCount: [
+ {
+ name: 'n2',
+ value: 10
+ },
+ {
+ name: 'n3',
+ value: 20
+ }
+ ],
+ name: 'graph1'
+ }
+ ]
+ },
+ components: {},
+ resources: {
+ graphData: [
+ {
+ dataCount: [
+ {
+ name: 'n16',
+ value: 800
+ },
+ {
+ name: 'n17',
+ value: 400
+ }
+ ],
+ name: 'graph8'
+ },
+ {
+ dataCount: [
+ {
+ name: 'n18',
+ value: 600
+ },
+ {
+ name: 'n19',
+ value: 300
+ }
+ ],
+ name: 'graph9'
+ }
+ ]
+ },
+ schema: {
+ fields: ''
+ },
+ serviceload: {
+ graphData: [
+ {
+ dataCount: [
+ {
+ name: 'n4',
+ value: 1
+ },
+ {
+ name: 'n5',
+ value: 2
+ }
+ ],
+ name: 'graph2'
+ },
+ {
+ dataCount: [
+ {
+ name: 'n6',
+ value: 10
+ },
+ {
+ name: 'n7',
+ value: 20
+ }
+ ],
+ name: 'graph3'
+ }
+ ]
+ }
+ }
+ },
+ public: {
+ config: {}
+ },
+ service: {
+ logs: {
+ logList: [
+ {
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h0',
+ level: 'WARN',
+ logtime: 1497474000000,
+ ip: '192.168.0.1',
+ logfile_line_number: 8,
+ type: 'ams_collector',
+ _version_: 9,
+ id: 'id2',
+ file: 'ambari-metrics-collector.log',
+ seq_num: 10,
+ bundle_id: 'b2',
+ case_id: 'c2',
+ log_message: 'Connection refused.\nPlease check Ambari Metrics.\nCheck log file for details.',
+ message_md5: '1357908642',
+ cluster: 'cl2',
+ event_count: 5,
+ event_md5: '1908755391',
+ event_dur_ms: 200,
+ _ttl_: "+5DAYS",
+ _expire_at_: 1497906000000,
+ _router_field_: 20
+ },
+ {
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h1',
+ level: 'ERROR',
+ logtime: 1497387600000,
+ ip: '192.168.0.2',
+ type: 'ams_collector',
+ _version_: 14,
+ id: 'id3',
+ file: 'ambari-metrics-collector.log',
+ seq_num: 15,
+ bundle_id: 'b3',
+ case_id: 'c3',
+ log_message: 'Connection refused.\nPlease check Ambari Metrics.\nCheck log file for details.',
+ logfile_line_number: 16,
+ message_md5: '1357908642',
+ cluster: 'cl3',
+ event_count: 2,
+ event_md5: '1029384756',
+ event_dur_ms: 700,
+ _ttl_: "+5DAYS",
+ _expire_at_: 1497819600000,
+ _router_field_: 5
+ },
+ {
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h1',
+ level: 'FATAL',
+ logtime: 1497042000000,
+ ip: '192.168.0.3',
+ type: 'ambari_agent',
+ _version_: 14,
+ id: 'id4',
+ file: 'ambari-agent.log',
+ seq_num: 15,
+ bundle_id: 'b4',
+ case_id: 'c4',
+ log_message: 'Connection refused.\nPlease check Ambari Agent.\nCheck log file for details.',
+ logfile_line_number: 16,
+ message_md5: '1038027502',
+ cluster: 'cl4',
+ event_count: 2,
+ event_md5: '67589403',
+ event_dur_ms: 100,
+ _ttl_: "+5DAYS",
+ _expire_at_: 1497474000000,
+ _router_field_: 45
+ },
+ {
+ path: '/var/log/ambari-metrics-collector/zookeeper-server.log',
+ host: 'h1',
+ level: 'INFO',
+ logtime: 1497956919700,
+ ip: '192.168.0.4',
+ type: 'zookeeper_server',
+ _version_: 14,
+ id: 'id4',
+ file: 'zookeeper_server.log',
+ seq_num: 15,
+ bundle_id: 'b0',
+ case_id: 'c0',
+ log_message: 'Connection refused.\nPlease check ZooKeeper Server.\nCheck log file for details.',
+ logfile_line_number: 16,
+ message_md5: '1038027502',
+ cluster: 'cl0',
+ event_count: 2,
+ event_md5: '67589403',
+ event_dur_ms: 1000,
+ _ttl_: "+5DAYS",
+ _expire_at_: 1497956939700,
+ _router_field_: 55
+ },
+ {
+ path: '/var/log/ambari-metrics-collector/zookeeper-server.log',
+ host: 'h1',
+ level: 'DEBUG',
+ logtime: 1497956919700,
+ ip: '192.168.0.4',
+ type: 'zookeeper_server',
+ _version_: 14,
+ id: 'id4',
+ file: 'zookeeper_server.log',
+ seq_num: 15,
+ bundle_id: 'b0',
+ case_id: 'c0',
+ log_message: 'Connection refused.\nPlease check ZooKeeper Server.\nCheck log file for details.',
+ logfile_line_number: 16,
+ message_md5: '1038027502',
+ cluster: 'cl1',
+ event_count: 2,
+ event_md5: '67589403',
+ event_dur_ms: 1000,
+ _ttl_: "+5DAYS",
+ _expire_at_: 1497956939700,
+ _router_field_: 55
+ },
+ {
+ path: '/var/log/ambari-metrics-collector/zookeeper-client.log',
+ host: 'h1',
+ level: 'TRACE',
+ logtime: 1497956919700,
+ ip: '192.168.0.4',
+ type: 'zookeeper_client',
+ _version_: 14,
+ id: 'id4',
+ file: 'zookeeper_client.log',
+ seq_num: 15,
+ bundle_id: 'b0',
+ case_id: 'c0',
+ log_message: 'Connection refused.\nPlease check ZooKeeper Client.\nCheck log file for details.',
+ logfile_line_number: 16,
+ message_md5: '1038027502',
+ cluster: 'cl1',
+ event_count: 2,
+ event_md5: '67589403',
+ event_dur_ms: 1000,
+ _ttl_: "+5DAYS",
+ _expire_at_: 1497956939700,
+ _router_field_: 55
+ },
+ {
+ path: '/var/log/ambari-metrics-collector/zookeeper-client.log',
+ host: 'h1',
+ level: 'UNKNOWN',
+ logtime: 1497956919700,
+ ip: '192.168.0.4',
+ type: 'zookeeper_client',
+ _version_: 14,
+ id: 'id4',
+ file: 'zookeeper_client.log',
+ seq_num: 15,
+ bundle_id: 'b0',
+ case_id: 'c0',
+ log_message: 'Connection refused.\nPlease check ZooKeeper Client.\nCheck log file for details.',
+ logfile_line_number: 16,
+ message_md5: '1038027502',
+ cluster: 'cl1',
+ event_count: 2,
+ event_md5: '67589403',
+ event_dur_ms: 1000,
+ _ttl_: "+5DAYS",
+ _expire_at_: 1497956939700,
+ _router_field_: 55
+ }
+ ],
+ aggregated: {
+ graphData: [
+ {
+ name: 'n0',
+ count: 100,
+ dataList: [
+ {
+ name: 'n1',
+ count: 50,
+ dataList: null
+ },
+ {
+ name: 'n2',
+ count: 200,
+ dataList: null
+ }
+ ]
+ },
+ {
+ name: 'n3',
+ count: 10,
+ dataList: [
+ {
+ name: 'n4',
+ count: 5,
+ dataList: null
+ },
+ {
+ name: 'n5',
+ count: 20,
+ dataList: null
+ }
+ ]
+ }
+ ]
+ },
+ components: {
+ count: {
+ anygraph: {
+ graphData: [
+ {
+ dataCount: [
+ {
+ name: 'n8',
+ value: 50
+ },
+ {
+ name: 'n9',
+ value: 100
+ }
+ ],
+ name: 'graph4'
+ },
+ {
+ dataCount: [
+ {
+ name: 'n10',
+ value: 5
+ },
+ {
+ name: 'n11',
+ value: 10
+ }
+ ],
+ name: 'graph5'
+ }
+ ]
+ }
+ },
+ levels: {
+ counts: {
+ vNodeList: [
+ {
+ name: 'ambari',
+ type: 0,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '10'
+ },
+ {
+ name: 'WARN',
+ value: '50'
+ }
+ ],
+ childs: [
+ {
+ name: 'hdfs',
+ type: 2,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '10'
+ },
+ {
+ name: 'WARN',
+ value: '20'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ },
+ {
+ name: 'zookeeper',
+ type: 3,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '20'
+ },
+ {
+ name: 'WARN',
+ value: '40'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ],
+ isParent: true,
+ isRoot: false
+ },
+ {
+ name: 'ambari_agent',
+ type: 1,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '100'
+ },
+ {
+ name: 'WARN',
+ value: '500'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ]
+ }
+ }
+ },
+ files: {
+ hostLogFiles: {
+ clusters: [
+ 'c0',
+ 'c1'
+ ],
+ services: [
+ 'hdfs',
+ 'zookeeper'
+ ]
+ }
+ },
+ histogram: {
+ graphData: [
+ {
+ dataCount: [
+ {
+ name: 'n12',
+ value: 1000
+ },
+ {
+ name: 'n13',
+ value: 2000
+ }
+ ],
+ name: 'graph6'
+ },
+ {
+ dataCount: [
+ {
+ name: 'n14',
+ value: 700
+ },
+ {
+ name: 'n15',
+ value: 900
+ }
+ ],
+ name: 'graph7'
+ }
+ ]
+ },
+ hosts: {
+ components: {
+ vNodeList: [
+ {
+ name: 'ambari',
+ type: 0,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '100'
+ },
+ {
+ name: 'WARN',
+ value: '500'
+ }
+ ],
+ childs: [
+ {
+ name: 'ambari_metrics',
+ type: 2,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '100'
+ },
+ {
+ name: 'WARN',
+ value: '200'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ },
+ {
+ name: 'hbase',
+ type: 3,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '200'
+ },
+ {
+ name: 'WARN',
+ value: '400'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ],
+ isParent: true,
+ isRoot: false
+ },
+ {
+ name: 'ambari_server',
+ type: 1,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '1000'
+ },
+ {
+ name: 'WARN',
+ value: '5000'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ]
+ },
+ count: {
+ getvCounts: [
+ {
+ name: 'n20',
+ count: 100
+ },
+ {
+ name: 'n21',
+ count: 200
+ }
+ ]
+ }
+ },
+ levels: {
+ counts: {
+ getvNameValues: [
+ {
+ name: 'n22',
+ count: 1000
+ },
+ {
+ name: 'n23',
+ count: 2000
+ }
+ ]
+ }
+ },
+ schema: {
+ fields: ''
+ },
+ serviceconfig: '',
+ tree: {
+ vNodeList: [
+ {
+ name: 'ambari',
+ type: 0,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '1000'
+ },
+ {
+ name: 'WARN',
+ value: '5000'
+ }
+ ],
+ childs: [
+ {
+ name: 'yarn',
+ type: 2,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '1000'
+ },
+ {
+ name: 'WARN',
+ value: '2000'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ },
+ {
+ name: 'hive',
+ type: 3,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '2000'
+ },
+ {
+ name: 'WARN',
+ value: '4000'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ],
+ isParent: true,
+ isRoot: false
+ },
+ {
+ name: 'ambari_server',
+ type: 1,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '10000'
+ },
+ {
+ name: 'WARN',
+ value: '50000'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ]
+ },
+ truncated: {
+ logList: [
+ {
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h0',
+ level: 'WARN',
+ logtime: '2017-05-28T11:30:22.531Z',
+ ip: '192.168.0.1',
+ logfile_line_number: 8,
+ type: 'ams_collector',
+ _version_: 9,
+ id: 'id2',
+ file: 'ambari-metrics-collector.log',
+ seq_num: 10,
+ bundle_id: 'b2',
+ case_id: 'c2',
+ log_message: 'Connection refused',
+ message_md5: '1357908642',
+ cluster: 'cl2',
+ event_count: 5,
+ event_md5: '1908755391',
+ event_dur_ms: 200,
+ _ttl_: "+5DAYS",
+ _expire_at_: '2017-05-29T11:30:22.531Z',
+ _router_field_: 20
+ },
+ {
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h1',
+ level: 'ERROR',
+ logtime: '2017-05-28T10:30:22.531Z',
+ ip: '192.168.0.2',
+ type: 'ams_collector',
+ _version_: 14,
+ id: 'id3',
+ file: 'ambari-metrics-collector.log',
+ seq_num: 15,
+ bundle_id: 'b3',
+ case_id: 'c3',
+ log_message: 'Connection refused',
+ logfile_line_number: 16,
+ message_md5: '1357908642',
+ cluster: 'cl3',
+ event_count: 2,
+ event_md5: '1029384756',
+ event_dur_ms: 700,
+ _ttl_: "+5DAYS",
+ _expire_at_: '2017-05-29T10:30:22.531Z',
+ _router_field_: 5
+ }
+ ]
+ }
+ }
+ },
+ status: {
+ auditlogs: {
+ znodeReady: true,
+ solrCollectionReady: true,
+ solrAliasReady: false,
+ configurationUploaded: true
+ },
+ servicelogs: {
+ znodeReady: true,
+ solrCollectionReady: true,
+ configurationUploaded: true
+ },
+ userconfig: {
+ znodeReady: true,
+ solrCollectionReady: true,
+ configurationUploaded: true
+ }
+ },
+ userconfig: {
+ userConfigList: [
+ {
+ id: 'c0',
+ userName: 'admin',
+ filtername: 'service',
+ values: 'hdfs',
+ shareNameList: [
+ 's0',
+ 's1'
+ ],
+ rowType: 'history'
+ },
+ {
+ id: 'c0',
+ userName: 'user',
+ filtername: 'component',
+ values: 'namenode',
+ shareNameList: [
+ 's2',
+ 's3'
+ ],
+ rowType: 'history'
+ }
+ ],
+ filters: {
+ filter0: {
+ label: 'filter0',
+ hosts: [
+ 'h0',
+ 'h1'
+ ],
+ defaultLevels: [
+ 'l0',
+ 'l1'
+ ],
+ overrideLevels: [
+ 'l2',
+ 'l3'
+ ],
+ expiryTime: '2017-05-29T11:30:22.531Z'
+ },
+ filter1: {
+ label: 'filter1',
+ hosts: [
+ 'h1',
+ 'h2'
+ ],
+ defaultLevels: [
+ 'l4',
+ 'l5'
+ ],
+ overrideLevels: [
+ 'l6',
+ 'l7'
+ ],
+ expiryTime: '2017-05-30T11:30:22.531Z'
+ }
+ },
+ names: []
+ }
+ }
+ }
+};
\ No newline at end of file
[02/21] ambari git commit: AMBARI-21310 Log Search UI: Provide
ability to use mocked data for api calls (akovalenko)
Posted by ab...@apache.org.
AMBARI-21310 Log Search UI: Provide ability to use mocked data for api calls (akovalenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4ce2f2c5
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4ce2f2c5
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4ce2f2c5
Branch: refs/heads/branch-feature-logsearch-ui
Commit: 4ce2f2c528c62a7f2651381df17630a86e104c1b
Parents: da6ea9f
Author: Aleksandr Kovalenko <ak...@hortonworks.com>
Authored: Tue Apr 11 14:01:25 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 14:53:24 2017 +0300
----------------------------------------------------------------------
.../ambari-logsearch-web-new/.angular-cli.json | 3 +-
.../ambari-logsearch-web-new/package.json | 3 ++
.../src/app/app.component.html | 17 +++++++++
.../src/app/app.component.less | 16 +++++++++
.../src/app/app.component.spec.ts | 18 ++++++++++
.../src/app/app.component.ts | 21 ++++++++++-
.../src/app/app.module.ts | 38 ++++++++++++++++----
.../src/app/mock-api-data.service.ts | 25 +++++++++++++
.../src/environments/environment.prod.ts | 18 ++++++++++
.../src/environments/environment.ts | 21 ++++++++---
.../ambari-logsearch-web-new/src/styles.less | 18 +++++++++-
11 files changed, 184 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/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 7b5c13b..03c5382 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/.angular-cli.json
@@ -19,7 +19,8 @@
"testTsconfig": "tsconfig.spec.json",
"prefix": "app",
"styles": [
- "styles.less"
+ "styles.less",
+ "../node_modules/bootstrap/dist/css/bootstrap.min.css"
],
"scripts": [],
"environmentSource": "environments/environment.ts",
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/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 f13d358..01ac4be 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/package.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/package.json
@@ -19,7 +19,9 @@
"@angular/platform-browser": "^4.0.0",
"@angular/platform-browser-dynamic": "^4.0.0",
"@angular/router": "^4.0.0",
+ "bootstrap": "^3.3.7",
"core-js": "^2.4.1",
+ "ngx-bootstrap": "^1.6.6",
"rxjs": "^5.1.0",
"zone.js": "^0.8.4"
},
@@ -28,6 +30,7 @@
"@angular/compiler-cli": "^4.0.0",
"@types/jasmine": "2.5.38",
"@types/node": "~6.0.60",
+ "angular-in-memory-web-api": "^0.3.1",
"codelyzer": "~2.0.0",
"jasmine-core": "~2.5.2",
"jasmine-spec-reporter": "~3.2.0",
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/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 b6931b5..85b96dc 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
@@ -1,3 +1,20 @@
+<!--
+ 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.
+-->
+
<h1>
{{title}}
</h1>
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
index e69de29..2944f98 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
@@ -0,0 +1,16 @@
+/*
+ * 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.
+ */
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/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 c740bcd..d57f9c4 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
@@ -1,3 +1,21 @@
+/**
+ * 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, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/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 3ffdc2e..5f59b8e 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
@@ -1,10 +1,29 @@
-import { Component } from '@angular/core';
+/**
+ * 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} from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.less']
})
+
export class AppComponent {
title = 'Ambari Log Search';
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/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 67ae491..34b7978 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
@@ -1,9 +1,30 @@
-import { BrowserModule } from '@angular/platform-browser';
-import { NgModule } from '@angular/core';
-import { FormsModule } from '@angular/forms';
-import { HttpModule } from '@angular/http';
+/**
+ * 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 { AppComponent } from './app.component';
+import {BrowserModule} from '@angular/platform-browser';
+import {NgModule} 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 {AppComponent} from './app.component';
@NgModule({
declarations: [
@@ -12,9 +33,12 @@ import { AppComponent } from './app.component';
imports: [
BrowserModule,
FormsModule,
- HttpModule
+ HttpModule,
+ InMemoryWebApiModule.forRoot(mockApiDataService),
+ AlertModule.forRoot()
],
providers: [],
bootstrap: [AppComponent]
})
-export class AppModule { }
+export class AppModule {
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts
new file mode 100644
index 0000000..da32c7e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/mock-api-data.service.ts
@@ -0,0 +1,25 @@
+/**
+ * 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 {InMemoryDbService} from 'angular-in-memory-web-api';
+
+export class mockApiDataService implements InMemoryDbService {
+ createDb() {
+ return {};
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
index 3612073..690ddb1 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.prod.ts
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
export const environment = {
production: true
};
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
index b7f639a..e34c67c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/environments/environment.ts
@@ -1,7 +1,20 @@
-// The file contents for the current environment will overwrite these during build.
-// The build system defaults to the dev environment which uses `environment.ts`, but if you do
-// `ng build --env=prod` then `environment.prod.ts` will be used instead.
-// The list of which env maps to which file can be found in `.angular-cli.json`.
+/**
+ * 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.
+ */
export const environment = {
production: false
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ce2f2c5/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
index 90d4ee0..5d5f1e3 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
@@ -1 +1,17 @@
-/* You can add global styles to this file, and also import other style files */
+/**
+ * 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.
+ */
[10/21] ambari git commit: AMBARI-21313 Log Search UI: implement
service for string constants (additional patch). (ababiichuk)
Posted by ab...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/84a59d71/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/yarn.lock b/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
new file mode 100644
index 0000000..d521f70
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
@@ -0,0 +1,5312 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@angular/cli@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-1.0.0.tgz#7bfde1e7c5f28bf5bed4dda1352ee67ee887302f"
+ dependencies:
+ "@ngtools/json-schema" "1.0.5"
+ "@ngtools/webpack" "1.3.0"
+ autoprefixer "^6.5.3"
+ chalk "^1.1.3"
+ common-tags "^1.3.1"
+ css-loader "^0.26.1"
+ cssnano "^3.10.0"
+ debug "^2.1.3"
+ denodeify "^1.2.1"
+ diff "^3.1.0"
+ ember-cli-normalize-entity-name "^1.0.0"
+ ember-cli-string-utils "^1.0.0"
+ exports-loader "^0.6.3"
+ extract-text-webpack-plugin "~2.0.0"
+ file-loader "^0.10.0"
+ fs-extra "^2.0.0"
+ get-caller-file "^1.0.0"
+ glob "^7.0.3"
+ html-webpack-plugin "^2.19.0"
+ inflection "^1.7.0"
+ inquirer "^3.0.0"
+ isbinaryfile "^3.0.0"
+ istanbul-instrumenter-loader "^2.0.0"
+ json-loader "^0.5.4"
+ karma-sourcemap-loader "^0.3.7"
+ karma-webpack "^2.0.0"
+ less "^2.7.2"
+ less-loader "^2.2.3"
+ lodash "^4.11.1"
+ minimatch "^3.0.3"
+ node-modules-path "^1.0.0"
+ nopt "^4.0.1"
+ opn "4.0.2"
+ portfinder "~1.0.12"
+ postcss-loader "^0.13.0"
+ postcss-url "^5.1.2"
+ raw-loader "^0.5.1"
+ resolve "^1.1.7"
+ rimraf "^2.5.3"
+ rsvp "^3.0.17"
+ rxjs "^5.0.1"
+ sass-loader "^4.1.1"
+ script-loader "^0.7.0"
+ semver "^5.1.0"
+ silent-error "^1.0.0"
+ source-map-loader "^0.1.5"
+ style-loader "^0.13.1"
+ stylus "^0.54.5"
+ stylus-loader "^2.4.0"
+ temp "0.8.3"
+ typescript ">=2.0.0 <2.3.0"
+ url-loader "^0.5.7"
+ walk-sync "^0.3.1"
+ webpack "~2.2.0"
+ webpack-dev-server "~2.3.0"
+ webpack-merge "^2.4.0"
+ zone.js "^0.7.2"
+ optionalDependencies:
+ node-sass "^4.3.0"
+
+"@angular/common@^4.0.0":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@angular/common/-/common-4.1.3.tgz#e7c4791e32131cf74c239428c2a67daab2eef017"
+
+"@angular/compiler-cli@^4.0.0":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-4.1.3.tgz#c2362ffdf65756471481f839fab675bcac213f96"
+ dependencies:
+ "@angular/tsc-wrapped" "4.1.3"
+ minimist "^1.2.0"
+ reflect-metadata "^0.1.2"
+
+"@angular/compiler@^4.0.0":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-4.1.3.tgz#d2dd30853b0cf4a54758b4a314632c231f9c94c3"
+
+"@angular/core@^4.0.0":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@angular/core/-/core-4.1.3.tgz#285498eb86ab7d0b6f982f8f9f487ef610013b35"
+
+"@angular/forms@^4.0.0":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-4.1.3.tgz#380ab4c3af84c5d1d748c2a7d04151c7dc8e4982"
+
+"@angular/http@^4.0.0":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@angular/http/-/http-4.1.3.tgz#eb9d1c302a0172815f9a573310d9be0bdeb845ae"
+
+"@angular/platform-browser-dynamic@^4.0.0":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.1.3.tgz#3c13fdcf591d487f6efdc1d46913f280c6d8c2ec"
+
+"@angular/platform-browser@^4.0.0":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-4.1.3.tgz#4fa1db5119dd178b315ddae5b329bee1a932a5bd"
+
+"@angular/router@^4.0.0":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@angular/router/-/router-4.1.3.tgz#ddafd46ae7ccc8b1f74904ffb45f394e44625216"
+
+"@angular/tsc-wrapped@4.1.3":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-4.1.3.tgz#2d6372c9187bf1621eacd960b94b39c4f95293cd"
+ dependencies:
+ tsickle "^0.21.0"
+
+"@ngtools/json-schema@1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@ngtools/json-schema/-/json-schema-1.0.5.tgz#ad39037c70c88b245ac7267a71777646b6063d77"
+
+"@ngtools/webpack@1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-1.3.0.tgz#a1071230985358ecdf87b2fa9879ae6cc6355e83"
+ dependencies:
+ enhanced-resolve "^3.1.0"
+ loader-utils "^1.0.2"
+ magic-string "^0.19.0"
+ source-map "^0.5.6"
+
+"@ngx-translate/core@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-6.0.1.tgz#7c7a80077feb994fc815b67a72065af04d394efe"
+
+"@ngx-translate/http-loader@^0.0.3":
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/@ngx-translate/http-loader/-/http-loader-0.0.3.tgz#8346c8d2d6f630254601029668f17abe2afe8a9b"
+
+"@types/jasmine@2.5.38":
+ version "2.5.38"
+ resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.38.tgz#a4379124c4921d4e21de54ec74669c9e9b356717"
+
+"@types/node@^6.0.46", "@types/node@~6.0.60":
+ version "6.0.73"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.73.tgz#85dc4bb6f125377c75ddd2519a1eeb63f0a4ed70"
+
+"@types/q@^0.0.32":
+ version "0.0.32"
+ resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5"
+
+"@types/selenium-webdriver@^2.53.35", "@types/selenium-webdriver@~2.53.39":
+ version "2.53.42"
+ resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-2.53.42.tgz#74cb77fb6052edaff2a8984ddafd88d419f25cac"
+
+abbrev@1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
+
+accepts@1.3.3, accepts@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
+ dependencies:
+ mime-types "~2.1.11"
+ negotiator "0.6.1"
+
+acorn-dynamic-import@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+ dependencies:
+ acorn "^4.0.3"
+
+acorn@^4.0.3, acorn@^4.0.4:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+adm-zip@0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.4.tgz#a61ed5ae6905c3aea58b3a657d25033091052736"
+
+adm-zip@^0.4.7:
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1"
+
+after@0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
+
+agent-base@2:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.0.tgz#193455e4347bca6b05847cb81e939bb325446da8"
+ dependencies:
+ extend "~3.0.0"
+ semver "~5.0.1"
+
+ajv-keywords@^1.1.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
+
+ajv@^4.11.2, ajv@^4.7.0, ajv@^4.9.1:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+ dependencies:
+ co "^4.6.0"
+ json-stable-stringify "^1.0.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+angular-in-memory-web-api@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/angular-in-memory-web-api/-/angular-in-memory-web-api-0.3.2.tgz#8836d9e2534d37b728f3cb5a1caf6fe1e7fbbecd"
+
+ansi-align@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
+ dependencies:
+ string-width "^2.0.0"
+
+ansi-escapes@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-html@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+any-promise@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+
+anymatch@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
+ dependencies:
+ arrify "^1.0.0"
+ micromatch "^2.1.5"
+
+app-root-path@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46"
+
+append-transform@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
+ dependencies:
+ default-require-extensions "^1.0.0"
+
+aproba@^1.0.3:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
+
+array-find-index@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+
+array-slice@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
+
+array-union@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+arraybuffer.slice@0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
+
+arrify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"
+
+asn1.js@^4.0.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert@^1.1.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async-foreach@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
+
+async@^0.9.0, async@~0.9.0:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
+
+async@^1.4.0, async@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.0.1, async@^2.1.2, async@^2.1.4:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7"
+ dependencies:
+ lodash "^4.14.0"
+
+async@~0.2.6:
+ version "0.2.10"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+autoprefixer@^6.3.1, autoprefixer@^6.5.3:
+ version "6.7.7"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
+ dependencies:
+ browserslist "^1.7.6"
+ caniuse-db "^1.0.30000634"
+ normalize-range "^0.1.2"
+ num2fraction "^1.2.2"
+ postcss "^5.2.16"
+ postcss-value-parser "^3.2.3"
+
+aws-sign2@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws4@^1.2.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+babel-code-frame@^6.11.0, babel-code-frame@^6.20.0, babel-code-frame@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
+ dependencies:
+ chalk "^1.1.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+babel-generator@^6.18.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.2.0"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.10.0"
+
+babel-template@^6.16.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ babylon "^6.11.0"
+ lodash "^4.2.0"
+
+babel-traverse@^6.18.0, babel-traverse@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ babylon "^6.15.0"
+ debug "^2.2.0"
+ globals "^9.0.0"
+ invariant "^2.2.0"
+ lodash "^4.2.0"
+
+babel-types@^6.18.0, babel-types@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975"
+ dependencies:
+ babel-runtime "^6.22.0"
+ esutils "^2.0.2"
+ lodash "^4.2.0"
+ to-fast-properties "^1.0.1"
+
+babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0:
+ version "6.17.1"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f"
+
+backo2@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+
+balanced-match@^0.4.1, balanced-match@^0.4.2:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
+base64-arraybuffer@0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
+
+base64-js@^1.0.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
+
+base64id@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
+
+batch@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+ dependencies:
+ tweetnacl "^0.14.3"
+
+better-assert@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
+ dependencies:
+ callsite "1.0.0"
+
+big.js@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978"
+
+binary-extensions@^1.0.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
+
+blob@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
+
+block-stream@*:
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+ dependencies:
+ inherits "~2.0.0"
+
+blocking-proxy@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-0.0.5.tgz#462905e0dcfbea970f41aa37223dda9c07b1912b"
+ dependencies:
+ minimist "^1.2.0"
+
+bluebird@^3.3.0, bluebird@^3.4.7:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+
+body-parser@^1.12.4:
+ version "1.17.2"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee"
+ dependencies:
+ bytes "2.4.0"
+ content-type "~1.0.2"
+ debug "2.6.7"
+ depd "~1.1.0"
+ http-errors "~1.6.1"
+ iconv-lite "0.4.15"
+ on-finished "~2.3.0"
+ qs "6.4.0"
+ raw-body "~2.2.0"
+ type-is "~1.6.15"
+
+boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+
+boom@2.x.x:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+ dependencies:
+ hoek "2.x.x"
+
+bootstrap@^3.3.7:
+ version "3.3.7"
+ resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71"
+
+boxen@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.1.0.tgz#b1b69dd522305e807a99deee777dbd6e5167b102"
+ dependencies:
+ ansi-align "^2.0.0"
+ camelcase "^4.0.0"
+ chalk "^1.1.1"
+ cli-boxes "^1.0.0"
+ string-width "^2.0.0"
+ term-size "^0.1.0"
+ widest-line "^1.0.0"
+
+brace-expansion@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59"
+ dependencies:
+ balanced-match "^0.4.1"
+ concat-map "0.0.1"
+
+braces@^0.1.2:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6"
+ dependencies:
+ expand-range "^0.1.0"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a"
+ dependencies:
+ buffer-xor "^1.0.2"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ inherits "^2.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d"
+ dependencies:
+ pako "~0.2.0"
+
+browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
+ version "1.7.7"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
+ dependencies:
+ caniuse-db "^1.0.30000639"
+ electron-to-chromium "^1.2.7"
+
+buffer-shims@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
+
+buffer-xor@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-modules@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+bytes@2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070"
+
+bytes@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339"
+
+callsite@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+
+camel-case@3.0.x:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.1.1"
+
+camelcase-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+ dependencies:
+ camelcase "^2.0.0"
+ map-obj "^1.0.0"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+
+camelcase@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caniuse-api@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
+ dependencies:
+ browserslist "^1.3.6"
+ caniuse-db "^1.0.30000529"
+ lodash.memoize "^4.1.2"
+ lodash.uniq "^4.5.0"
+
+caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
+ version "1.0.30000676"
+ resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000676.tgz#82ea578237637c8ff34a28acaade373b624c4ea8"
+
+capture-stack-trace@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chokidar@^1.4.1, chokidar@^1.4.3, chokidar@^1.6.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+ dependencies:
+ anymatch "^1.3.0"
+ async-each "^1.0.0"
+ glob-parent "^2.0.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^2.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ optionalDependencies:
+ fsevents "^1.0.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07"
+ dependencies:
+ inherits "^2.0.1"
+
+clap@^1.0.9:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/clap/-/clap-1.1.3.tgz#b3bd36e93dd4cbfb395a3c26896352445265c05b"
+ dependencies:
+ chalk "^1.1.3"
+
+clean-css@4.1.x:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.3.tgz#07cfe8980edb20d455ddc23aadcf1e04c6e509ce"
+ dependencies:
+ source-map "0.5.x"
+
+cli-boxes@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
+
+cli-cursor@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+ dependencies:
+ restore-cursor "^2.0.0"
+
+cli-width@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+clone@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+coa@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.2.tgz#2ba9fec3b4aa43d7a49d7e6c3561e92061b6bcec"
+ dependencies:
+ q "^1.1.2"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+codelyzer@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-2.0.1.tgz#d0f7121f67a8424c92d21d3b31f3640b83def9ed"
+ dependencies:
+ app-root-path "^2.0.1"
+ css-selector-tokenizer "^0.7.0"
+ cssauron "^1.4.0"
+ semver-dsl "^1.0.1"
+ source-map "^0.5.6"
+ sprintf-js "^1.0.3"
+
+color-convert@^1.3.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a"
+ dependencies:
+ color-name "^1.1.1"
+
+color-name@^1.0.0, color-name@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d"
+
+color-string@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
+ dependencies:
+ color-name "^1.0.0"
+
+color@^0.11.0:
+ version "0.11.4"
+ resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
+ dependencies:
+ clone "^1.0.2"
+ color-convert "^1.3.0"
+ color-string "^0.3.0"
+
+colormin@^1.0.5:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
+ dependencies:
+ color "^0.11.0"
+ css-color-names "0.0.4"
+ has "^1.0.1"
+
+colors@1.1.2, colors@^1.1.0, colors@^1.1.2, colors@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combine-lists@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6"
+ dependencies:
+ lodash "^4.5.0"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@2.9.x, commander@~2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+ dependencies:
+ graceful-readlink ">= 1.0.0"
+
+common-tags@^1.3.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.4.0.tgz#1187be4f3d4cf0c0427d43f74eef1f73501614c0"
+ dependencies:
+ babel-runtime "^6.18.0"
+
+component-bind@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
+
+component-emitter@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"
+
+component-emitter@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+component-inherit@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
+
+compressible@~2.0.8:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.10.tgz#feda1c7f7617912732b29bf8cf26252a20b9eecd"
+ dependencies:
+ mime-db ">= 1.27.0 < 2"
+
+compression@^1.5.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3"
+ dependencies:
+ accepts "~1.3.3"
+ bytes "2.3.0"
+ compressible "~2.0.8"
+ debug "~2.2.0"
+ on-headers "~1.0.1"
+ vary "~1.1.0"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+configstore@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1"
+ dependencies:
+ dot-prop "^4.1.0"
+ graceful-fs "^4.1.2"
+ make-dir "^1.0.0"
+ unique-string "^1.0.0"
+ write-file-atomic "^2.0.0"
+ xdg-basedir "^3.0.0"
+
+connect-history-api-fallback@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169"
+
+connect@^3.3.5:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.2.tgz#694e8d20681bfe490282c8ab886be98f09f42fe7"
+ dependencies:
+ debug "2.6.7"
+ finalhandler "1.0.3"
+ parseurl "~1.3.1"
+ utils-merge "1.0.0"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-disposition@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+
+content-type@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed"
+
+convert-source-map@^1.3.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+
+cookie@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+core-js@^2.2.0, core-js@^2.4.0, core-js@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-error-class@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
+ dependencies:
+ capture-stack-trace "^1.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-spawn-async@^2.1.1:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc"
+ dependencies:
+ lru-cache "^4.0.0"
+ which "^1.2.8"
+
+cross-spawn@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
+ dependencies:
+ lru-cache "^4.0.1"
+ which "^1.2.9"
+
+cryptiles@2.x.x:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+ dependencies:
+ boom "2.x.x"
+
+crypto-browserify@^3.11.0:
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522"
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+
+crypto-random-string@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
+
+css-color-names@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+
+css-loader@^0.26.1:
+ version "0.26.4"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.4.tgz#b61e9e30db94303e6ffc892f10ecd09ad025a1fd"
+ dependencies:
+ babel-code-frame "^6.11.0"
+ css-selector-tokenizer "^0.7.0"
+ cssnano ">=2.6.1 <4"
+ loader-utils "^1.0.2"
+ lodash.camelcase "^4.3.0"
+ object-assign "^4.0.1"
+ postcss "^5.0.6"
+ postcss-modules-extract-imports "^1.0.0"
+ postcss-modules-local-by-default "^1.0.1"
+ postcss-modules-scope "^1.0.0"
+ postcss-modules-values "^1.1.0"
+ source-list-map "^0.1.7"
+
+css-parse@1.7.x:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b"
+
+css-select@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+ dependencies:
+ boolbase "~1.0.0"
+ css-what "2.1"
+ domutils "1.5.1"
+ nth-check "~1.0.1"
+
+css-selector-tokenizer@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
+ dependencies:
+ cssesc "^0.1.0"
+ fastparse "^1.1.1"
+ regexpu-core "^1.0.0"
+
+css-what@2.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
+
+cssauron@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8"
+ dependencies:
+ through X.X.X
+
+cssesc@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
+
+"cssnano@>=2.6.1 <4", cssnano@^3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
+ dependencies:
+ autoprefixer "^6.3.1"
+ decamelize "^1.1.2"
+ defined "^1.0.0"
+ has "^1.0.1"
+ object-assign "^4.0.1"
+ postcss "^5.0.14"
+ postcss-calc "^5.2.0"
+ postcss-colormin "^2.1.8"
+ postcss-convert-values "^2.3.4"
+ postcss-discard-comments "^2.0.4"
+ postcss-discard-duplicates "^2.0.1"
+ postcss-discard-empty "^2.0.1"
+ postcss-discard-overridden "^0.1.1"
+ postcss-discard-unused "^2.2.1"
+ postcss-filter-plugins "^2.0.0"
+ postcss-merge-idents "^2.1.5"
+ postcss-merge-longhand "^2.0.1"
+ postcss-merge-rules "^2.0.3"
+ postcss-minify-font-values "^1.0.2"
+ postcss-minify-gradients "^1.0.1"
+ postcss-minify-params "^1.0.4"
+ postcss-minify-selectors "^2.0.4"
+ postcss-normalize-charset "^1.1.0"
+ postcss-normalize-url "^3.0.7"
+ postcss-ordered-values "^2.1.0"
+ postcss-reduce-idents "^2.2.2"
+ postcss-reduce-initial "^1.0.0"
+ postcss-reduce-transforms "^1.0.3"
+ postcss-svgo "^2.1.1"
+ postcss-unique-selectors "^2.0.2"
+ postcss-value-parser "^3.2.3"
+ postcss-zindex "^2.0.1"
+
+csso@~2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
+ dependencies:
+ clap "^1.0.9"
+ source-map "^0.5.3"
+
+currently-unhandled@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+ dependencies:
+ array-find-index "^1.0.1"
+
+custom-event@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ dependencies:
+ assert-plus "^1.0.0"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@*, debug@2, debug@2.6.8, debug@^2.1.3, debug@^2.2.0, debug@^2.6.3, debug@^2.6.8:
+ version "2.6.8"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
+ dependencies:
+ ms "2.0.0"
+
+debug@2.2.0, debug@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+ dependencies:
+ ms "0.7.1"
+
+debug@2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c"
+ dependencies:
+ ms "0.7.2"
+
+debug@2.6.7:
+ version "2.6.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e"
+ dependencies:
+ ms "2.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+deep-extend@~0.4.0:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+
+default-require-extensions@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
+ dependencies:
+ strip-bom "^2.0.0"
+
+defined@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+del@^2.2.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+ dependencies:
+ globby "^5.0.0"
+ is-path-cwd "^1.0.0"
+ is-path-in-cwd "^1.0.0"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+denodeify@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631"
+
+depd@1.1.0, depd@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ dependencies:
+ repeating "^2.0.0"
+
+detect-node@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127"
+
+di@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
+
+diff@^3.0.1, diff@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9"
+
+diffie-hellman@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+directory-encoder@^0.7.2:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/directory-encoder/-/directory-encoder-0.7.2.tgz#59b4e2aa4f25422f6c63b527b462f5e2d0dd2c58"
+ dependencies:
+ fs-extra "^0.23.1"
+ handlebars "^1.3.0"
+ img-stats "^0.5.2"
+
+dom-converter@~0.1:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b"
+ dependencies:
+ utila "~0.3"
+
+dom-serialize@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
+ dependencies:
+ custom-event "~1.0.0"
+ ent "~2.2.0"
+ extend "^3.0.0"
+ void-elements "^2.0.0"
+
+dom-serializer@0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+ dependencies:
+ domelementtype "~1.1.1"
+ entities "~1.1.1"
+
+domain-browser@^1.1.1:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+
+domelementtype@1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+
+domelementtype@~1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+
+domhandler@2.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594"
+ dependencies:
+ domelementtype "1"
+
+domutils@1.1:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485"
+ dependencies:
+ domelementtype "1"
+
+domutils@1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+dot-prop@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1"
+ dependencies:
+ is-obj "^1.0.0"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+ dependencies:
+ jsbn "~0.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+electron-to-chromium@^1.2.7:
+ version "1.3.13"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.13.tgz#1b3a5eace6e087bb5e257a100b0cbfe81b2891fc"
+
+elliptic@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+ember-cli-normalize-entity-name@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz#0b14f7bcbc599aa117b5fddc81e4fd03c4bad5b7"
+ dependencies:
+ silent-error "^1.0.0"
+
+ember-cli-string-utils@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1"
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+encodeurl@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
+
+engine.io-client@1.8.2:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.2.tgz#c38767547f2a7d184f5752f6f0ad501006703766"
+ dependencies:
+ component-emitter "1.2.1"
+ component-inherit "0.0.3"
+ debug "2.3.3"
+ engine.io-parser "1.3.2"
+ has-cors "1.1.0"
+ indexof "0.0.1"
+ parsejson "0.0.3"
+ parseqs "0.0.5"
+ parseuri "0.0.5"
+ ws "1.1.1"
+ xmlhttprequest-ssl "1.5.3"
+ yeast "0.1.2"
+
+engine.io-parser@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a"
+ dependencies:
+ after "0.8.2"
+ arraybuffer.slice "0.0.6"
+ base64-arraybuffer "0.1.5"
+ blob "0.0.4"
+ has-binary "0.1.7"
+ wtf-8 "1.0.0"
+
+engine.io@1.8.2:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.2.tgz#6b59be730b348c0125b0a4589de1c355abcf7a7e"
+ dependencies:
+ accepts "1.3.3"
+ base64id "1.0.0"
+ cookie "0.3.1"
+ debug "2.3.3"
+ engine.io-parser "1.3.2"
+ ws "1.1.1"
+
+enhanced-resolve@^3.0.0, enhanced-resolve@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec"
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ object-assign "^4.0.1"
+ tapable "^0.2.5"
+
+ensure-posix-path@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2"
+
+ent@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
+
+entities@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
+errno@^0.1.1, errno@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
+ dependencies:
+ prr "~0.0.0"
+
+error-ex@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+esprima@^2.6.0:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+etag@~1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051"
+
+eventemitter3@1.x.x:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
+events@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+eventsource@~0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232"
+ dependencies:
+ original ">=0.0.5"
+
+evp_bytestokey@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53"
+ dependencies:
+ create-hash "^1.1.1"
+
+execa@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3"
+ dependencies:
+ cross-spawn-async "^2.1.1"
+ is-stream "^1.1.0"
+ npm-run-path "^1.0.0"
+ object-assign "^4.0.1"
+ path-key "^1.0.0"
+ strip-eof "^1.0.0"
+
+exit@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+
+expand-braces@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea"
+ dependencies:
+ array-slice "^0.2.3"
+ array-unique "^0.2.1"
+ braces "^0.1.2"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-range@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044"
+ dependencies:
+ is-number "^0.1.1"
+ repeat-string "^0.2.2"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ dependencies:
+ fill-range "^2.1.0"
+
+exports-loader@^0.6.3:
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754be2740fc886"
+ dependencies:
+ loader-utils "^1.0.2"
+ source-map "0.5.x"
+
+express@^4.13.3:
+ version "4.15.3"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662"
+ dependencies:
+ accepts "~1.3.3"
+ array-flatten "1.1.1"
+ content-disposition "0.5.2"
+ content-type "~1.0.2"
+ cookie "0.3.1"
+ cookie-signature "1.0.6"
+ debug "2.6.7"
+ depd "~1.1.0"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ etag "~1.8.0"
+ finalhandler "~1.0.3"
+ fresh "0.5.0"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "~2.3.0"
+ parseurl "~1.3.1"
+ path-to-regexp "0.1.7"
+ proxy-addr "~1.1.4"
+ qs "6.4.0"
+ range-parser "~1.2.0"
+ send "0.15.3"
+ serve-static "1.12.3"
+ setprototypeof "1.0.3"
+ statuses "~1.3.1"
+ type-is "~1.6.15"
+ utils-merge "1.0.0"
+ vary "~1.1.1"
+
+extend@3, extend@^3.0.0, extend@~3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+external-editor@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972"
+ dependencies:
+ iconv-lite "^0.4.17"
+ jschardet "^1.4.2"
+ tmp "^0.0.31"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ dependencies:
+ is-extglob "^1.0.0"
+
+extract-text-webpack-plugin@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.0.0.tgz#8640f72609800a3528f13a2a9634d566a5c1ae60"
+ dependencies:
+ ajv "^4.11.2"
+ async "^2.1.2"
+ loader-utils "^1.0.2"
+ webpack-sources "^0.1.0"
+
+extsprintf@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
+
+fastparse@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
+
+faye-websocket@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+faye-websocket@~0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38"
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+figures@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+file-loader@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.10.1.tgz#815034119891fc6441fb5a64c11bc93c22ddd842"
+ dependencies:
+ loader-utils "^1.0.2"
+
+filename-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fileset@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
+ dependencies:
+ glob "^7.0.3"
+ minimatch "^3.0.3"
+
+fill-range@^2.1.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^1.1.3"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+finalhandler@1.0.3, finalhandler@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89"
+ dependencies:
+ debug "2.6.7"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.1"
+ statuses "~1.3.1"
+ unpipe "~1.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+findup-sync@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16"
+ dependencies:
+ glob "~5.0.0"
+
+flatten@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
+
+font-awesome@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133"
+
+for-in@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ dependencies:
+ for-in "^1.0.1"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.1.1:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.5"
+ mime-types "^2.1.12"
+
+forwarded@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363"
+
+fresh@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e"
+
+fs-access@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a"
+ dependencies:
+ null-check "^1.0.0"
+
+fs-extra@^0.23.1:
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.23.1.tgz#6611dba6adf2ab8dc9c69fab37cddf8818157e3d"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs-extra@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff"
+ dependencies:
+ nan "^2.3.0"
+ node-pre-gyp "^0.6.29"
+
+fstream-ignore@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+ dependencies:
+ fstream "^1.0.0"
+ inherits "2"
+ minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+ dependencies:
+ graceful-fs "^4.1.2"
+ inherits "~2.0.0"
+ mkdirp ">=0.5 0"
+ rimraf "2"
+
+function-bind@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+gaze@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105"
+ dependencies:
+ globule "^1.0.0"
+
+get-caller-file@^1.0.0, get-caller-file@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-stdin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ dependencies:
+ is-glob "^2.0.0"
+
+glob@7.0.x:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@~7.1.1:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@~5.0.0:
+ version "5.0.15"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^9.0.0:
+ version "9.17.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286"
+
+globby@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+ dependencies:
+ array-union "^1.0.1"
+ arrify "^1.0.0"
+ glob "^7.0.3"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+globule@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/globule/-/globule-1.1.0.tgz#c49352e4dc183d85893ee825385eb994bb6df45f"
+ dependencies:
+ glob "~7.1.1"
+ lodash "~4.16.4"
+ minimatch "~3.0.2"
+
+got@^6.7.1:
+ version "6.7.1"
+ resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
+ dependencies:
+ create-error-class "^3.0.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ is-redirect "^1.0.0"
+ is-retry-allowed "^1.0.0"
+ is-stream "^1.0.0"
+ lowercase-keys "^1.0.0"
+ safe-buffer "^5.0.1"
+ timed-out "^4.0.0"
+ unzip-response "^2.0.1"
+ url-parse-lax "^1.0.0"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+"graceful-readlink@>= 1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+
+handle-thing@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
+
+handlebars@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-1.3.0.tgz#9e9b130a93e389491322d975cf3ec1818c37ce34"
+ dependencies:
+ optimist "~0.3"
+ optionalDependencies:
+ uglify-js "~2.3"
+
+handlebars@^4.0.3:
+ version "4.0.10"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f"
+ dependencies:
+ async "^1.4.0"
+ optimist "^0.6.1"
+ source-map "^0.4.4"
+ optionalDependencies:
+ uglify-js "^2.6"
+
+har-schema@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-validator@~4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+ dependencies:
+ ajv "^4.9.1"
+ har-schema "^1.0.5"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-binary@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c"
+ dependencies:
+ isarray "0.0.1"
+
+has-cors@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+ dependencies:
+ function-bind "^1.0.2"
+
+hash-base@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
+ dependencies:
+ inherits "^2.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573"
+ dependencies:
+ inherits "^2.0.1"
+
+hawk@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+ dependencies:
+ boom "2.x.x"
+ cryptiles "2.x.x"
+ hoek "2.x.x"
+ sntp "1.x.x"
+
+he@1.1.x:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+hoek@2.x.x:
+ version "2.16.3"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+hosted-git-info@^2.1.4:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67"
+
+hpack.js@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
+ dependencies:
+ inherits "^2.0.1"
+ obuf "^1.0.0"
+ readable-stream "^2.0.1"
+ wbuf "^1.1.0"
+
+html-comment-regex@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
+
+html-entities@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
+
+html-minifier@^3.2.3:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.2.tgz#d73bc3ff448942408818ce609bf3fb0ea7ef4eb7"
+ dependencies:
+ camel-case "3.0.x"
+ clean-css "4.1.x"
+ commander "2.9.x"
+ he "1.1.x"
+ ncname "1.0.x"
+ param-case "2.1.x"
+ relateurl "0.2.x"
+ uglify-js "3.0.x"
+
+html-webpack-plugin@^2.19.0:
+ version "2.28.0"
+ resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.28.0.tgz#2e7863b57e5fd48fe263303e2ffc934c3064d009"
+ dependencies:
+ bluebird "^3.4.7"
+ html-minifier "^3.2.3"
+ loader-utils "^0.2.16"
+ lodash "^4.17.3"
+ pretty-error "^2.0.2"
+ toposort "^1.0.0"
+
+htmlparser2@~3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe"
+ dependencies:
+ domelementtype "1"
+ domhandler "2.1"
+ domutils "1.1"
+ readable-stream "1.0"
+
+http-deceiver@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+
+http-errors@~1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257"
+ dependencies:
+ depd "1.1.0"
+ inherits "2.0.3"
+ setprototypeof "1.0.3"
+ statuses ">= 1.3.1 < 2"
+
+http-proxy-middleware@~0.17.1:
+ version "0.17.4"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833"
+ dependencies:
+ http-proxy "^1.16.2"
+ is-glob "^3.1.0"
+ lodash "^4.17.2"
+ micromatch "^2.3.11"
+
+http-proxy@^1.13.0, http-proxy@^1.16.2:
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
+ dependencies:
+ eventemitter3 "1.x.x"
+ requires-port "1.x.x"
+
+http-signature@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+ dependencies:
+ assert-plus "^0.2.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-browserify@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
+
+https-proxy-agent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
+ dependencies:
+ agent-base "2"
+ debug "2"
+ extend "3"
+
+iconv-lite@0.4.15:
+ version "0.4.15"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
+
+iconv-lite@^0.4.17:
+ version "0.4.17"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.17.tgz#4fdaa3b38acbc2c031b045d0edcdfe1ecab18c8d"
+
+icss-replace-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+
+ieee754@^1.1.4:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+image-size@~0.5.0:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.4.tgz#94e07beec0659386f1aefb84b2222e88405485cd"
+
+img-stats@^0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/img-stats/-/img-stats-0.5.2.tgz#c203496c42f2d9eb2e5ab8232fa756bab32c9e2b"
+ dependencies:
+ xmldom "^0.1.19"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+in-publish@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
+
+indent-string@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+ dependencies:
+ repeating "^2.0.0"
+
+indexes-of@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflection@^1.7.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@^1.3.4, ini@~1.3.0:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
+
+inquirer@^3.0.0:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347"
+ dependencies:
+ ansi-escapes "^1.1.0"
+ chalk "^1.0.0"
+ cli-cursor "^2.1.0"
+ cli-width "^2.0.0"
+ external-editor "^2.0.1"
+ figures "^2.0.0"
+ lodash "^4.3.0"
+ mute-stream "0.0.7"
+ run-async "^2.2.0"
+ rx "^4.1.0"
+ string-width "^2.0.0"
+ strip-ansi "^3.0.0"
+ through "^2.3.6"
+
+interpret@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
+
+invariant@^2.2.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+ipaddr.js@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec"
+
+is-absolute-url@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
+
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-dotfile@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d"
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-npm@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
+
+is-number@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806"
+
+is-number@^2.0.2, is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-obj@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-path-cwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
+ dependencies:
+ is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f"
+ dependencies:
+ path-is-inside "^1.0.1"
+
+is-plain-obj@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-redirect@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
+
+is-retry-allowed@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+
+is-stream@^1.0.0, is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-svg@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
+ dependencies:
+ html-comment-regex "^1.1.0"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isbinaryfile@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istanbul-api@^1.1.1:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.9.tgz#2827920d380d4286d857d57a2968a841db8a7ec8"
+ dependencies:
+ async "^2.1.4"
+ fileset "^2.0.2"
+ istanbul-lib-coverage "^1.1.1"
+ istanbul-lib-hook "^1.0.7"
+ istanbul-lib-instrument "^1.7.2"
+ istanbul-lib-report "^1.1.1"
+ istanbul-lib-source-maps "^1.2.1"
+ istanbul-reports "^1.1.1"
+ js-yaml "^3.7.0"
+ mkdirp "^0.5.1"
+ once "^1.4.0"
+
+istanbul-instrumenter-loader@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-2.0.0.tgz#e5492900ab0bba835efa8024cb00be9b3eea2700"
+ dependencies:
+ convert-source-map "^1.3.0"
+ istanbul-lib-instrument "^1.1.3"
+ loader-utils "^0.2.16"
+ object-assign "^4.1.0"
+
+istanbul-lib-coverage@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
+
+istanbul-lib-hook@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc"
+ dependencies:
+ append-transform "^0.4.0"
+
+istanbul-lib-instrument@^1.1.3, istanbul-lib-instrument@^1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56"
+ dependencies:
+ babel-generator "^6.18.0"
+ babel-template "^6.16.0"
+ babel-traverse "^6.18.0"
+ babel-types "^6.18.0"
+ babylon "^6.13.0"
+ istanbul-lib-coverage "^1.1.1"
+ semver "^5.3.0"
+
+istanbul-lib-report@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9"
+ dependencies:
+ istanbul-lib-coverage "^1.1.1"
+ mkdirp "^0.5.1"
+ path-parse "^1.0.5"
+ supports-color "^3.1.2"
+
+istanbul-lib-source-maps@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c"
+ dependencies:
+ debug "^2.6.3"
+ istanbul-lib-coverage "^1.1.1"
+ mkdirp "^0.5.1"
+ rimraf "^2.6.1"
+ source-map "^0.5.3"
+
+istanbul-reports@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e"
+ dependencies:
+ handlebars "^4.0.3"
+
+jasmine-core@~2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff29
<TRUNCATED>
[15/21] ambari git commit: AMBARI-21318 Log Search UI: implement
filters panel. (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21318 Log Search UI: implement filters panel. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6fc2fef6
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6fc2fef6
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6fc2fef6
Branch: refs/heads/branch-feature-logsearch-ui
Commit: 6fc2fef6e0f3480551bbd18a888ad44b0005fade
Parents: ae40a5f
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 8 13:35:12 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:40:37 2017 +0300
----------------------------------------------------------------------
.../ambari-logsearch-web-new/package.json | 4 +
.../src/app/app.component.html | 2 +-
.../src/app/app.component.less | 6 +-
.../src/app/app.component.ts | 2 +-
.../src/app/app.module.ts | 15 +-
.../dropdown-list/dropdown-list.component.html | 20 +++
.../dropdown-list.component.spec.ts | 92 ++++++++++
.../dropdown-list/dropdown-list.component.ts | 50 ++++++
.../filter-dropdown.component.html | 23 +++
.../filter-dropdown.component.less | 31 ++++
.../filter-dropdown.component.spec.ts | 95 +++++++++++
.../filter-dropdown.component.ts | 45 +++++
.../filter-text-field.component.html | 21 +++
.../filter-text-field.component.less | 33 ++++
.../filter-text-field.component.spec.ts | 61 +++++++
.../filter-text-field.component.ts | 35 ++++
.../filters-panel/filters-panel.component.html | 36 ++++
.../filters-panel/filters-panel.component.less | 38 +++++
.../filters-panel.component.spec.ts | 59 +++++++
.../filters-panel/filters-panel.component.ts | 35 ++++
.../app/login-form/login-form.component.html | 2 +-
.../app/login-form/login-form.component.less | 22 +++
.../app/login-form/login-form.component.spec.ts | 2 +-
.../src/app/login-form/login-form.component.ts | 3 +-
.../main-container.component.html | 19 +++
.../main-container.component.spec.ts | 49 ++++++
.../main-container/main-container.component.ts | 33 ++++
.../app/menu-button/menu-button.component.html | 17 +-
.../app/menu-button/menu-button.component.less | 4 +
.../menu-button/menu-button.component.spec.ts | 39 ++++-
.../app/menu-button/menu-button.component.ts | 25 ++-
.../app/services/component-actions.service.ts | 6 -
.../src/app/services/filtering.service.spec.ts | 33 ++++
.../src/app/services/filtering.service.ts | 167 +++++++++++++++++++
.../src/app/top-menu/top-menu.component.html | 5 +-
.../src/app/top-menu/top-menu.component.less | 6 +-
.../src/app/top-menu/top-menu.component.ts | 60 ++++---
.../src/assets/i18n/en.json | 29 +++-
.../ambari-logsearch-web-new/src/styles.less | 15 ++
.../ambari-logsearch-web-new/yarn.lock | 20 ++-
40 files changed, 1194 insertions(+), 65 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/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 0994703..da44d30 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/package.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/package.json
@@ -27,6 +27,8 @@
"core-js": "^2.4.1",
"font-awesome": "^4.7.0",
"jquery": "^1.12.4",
+ "moment": "^2.18.1",
+ "moment-timezone": "^0.5.13",
"ngx-bootstrap": "^1.6.6",
"rxjs": "^5.1.0",
"zone.js": "^0.8.4"
@@ -35,6 +37,8 @@
"@angular/cli": "1.0.0",
"@angular/compiler-cli": "^4.0.0",
"@types/jasmine": "2.5.38",
+ "@types/moment": "^2.13.0",
+ "@types/moment-timezone": "^0.2.34",
"@types/node": "~6.0.60",
"angular-in-memory-web-api": "^0.3.1",
"codelyzer": "~2.0.0",
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/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 8b8687a..267e08b 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
@@ -29,4 +29,4 @@
<h1> </h1>
</div>
-<login-form *ngIf="!httpClient.isAuthorized"></login-form>
+<main-container></main-container>
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
index e09da49..3affd3f 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
@@ -15,18 +15,16 @@
* limitations under the License.
*/
-
@import '../styles.less';
.navbar {
+ margin-bottom: 0;
border-radius: 0;
background-color: @navbar-background-color;
color: #fff;
.container-fluid {
- display: flex;
- align-items: center;
- justify-content: space-between;
+ .default-flex;
}
h1 {
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/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 fb79ccb..e86a8a1 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
@@ -18,7 +18,7 @@
import {Component} from '@angular/core';
import {TranslateService} from '@ngx-translate/core';
-import {HttpClientService} from './services/http-client.service';
+import {HttpClientService} from '@app/services/http-client.service';
@Component({
selector: 'app-root',
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/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 f4ee972..f7221b3 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
@@ -28,6 +28,8 @@ import {TranslateHttpLoader} from '@ngx-translate/http-loader';
import {StoreModule} from '@ngrx/store';
import {HttpClientService} from '@app/services/http-client.service';
import {ComponentActionsService} from '@app/services/component-actions.service';
+import {FilteringService} from '@app/services/filtering.service';
+
import {AuditLogsService, auditLogs} from '@app/services/storage/audit-logs.service';
import {ServiceLogsService, serviceLogs} from '@app/services/storage/service-logs.service';
import {BarGraphsService, barGraphs} from '@app/services/storage/bar-graphs.service';
@@ -40,6 +42,11 @@ import {AppComponent} from '@app/app.component';
import {LoginFormComponent} from '@app/login-form/login-form.component';
import {TopMenuComponent} from '@app/top-menu/top-menu.component';
import {MenuButtonComponent} from '@app/menu-button/menu-button.component';
+import {MainContainerComponent} from '@app/main-container/main-container.component';
+import {FiltersPanelComponent} from '@app/filters-panel/filters-panel.component';
+import {FilterDropdownComponent} from '@app/filter-dropdown/filter-dropdown.component';
+import {DropdownListComponent} from '@app/dropdown-list/dropdown-list.component';
+import {FilterTextFieldComponent} from '@app/filter-text-field/filter-text-field.component';
export function HttpLoaderFactory(http: Http) {
return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
@@ -50,7 +57,12 @@ export function HttpLoaderFactory(http: Http) {
AppComponent,
LoginFormComponent,
TopMenuComponent,
- MenuButtonComponent
+ MenuButtonComponent,
+ MainContainerComponent,
+ FiltersPanelComponent,
+ DropdownListComponent,
+ FilterDropdownComponent,
+ FilterTextFieldComponent
],
imports: [
BrowserModule,
@@ -80,6 +92,7 @@ export function HttpLoaderFactory(http: Http) {
providers: [
HttpClientService,
ComponentActionsService,
+ FilteringService,
AuditLogsService,
ServiceLogsService,
BarGraphsService,
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.html
new file mode 100644
index 0000000..db4ee79
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.html
@@ -0,0 +1,20 @@
+<!--
+ 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.
+-->
+
+<li *ngFor="let item of items">
+ <a href="#" (click)="changeSelectedItem({value: item.value, label: item.label})">{{item.label | translate}}</a>
+</li>
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.spec.ts
new file mode 100644
index 0000000..445ee97
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.spec.ts
@@ -0,0 +1,92 @@
+/**
+ * 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 {Http} from '@angular/http';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+
+import {DropdownListComponent} from './dropdown-list.component';
+
+export function HttpLoaderFactory(http: Http) {
+ return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
+describe('DropdownListComponent', () => {
+ let component: DropdownListComponent;
+ let fixture: ComponentFixture<DropdownListComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [DropdownListComponent],
+ imports: [TranslateModule.forRoot({
+ provide: TranslateLoader,
+ useFactory: HttpLoaderFactory,
+ deps: [Http]
+ })]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(DropdownListComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create component', () => {
+ expect(component).toBeTruthy();
+ });
+
+ describe('#changeSelectedItem()', () => {
+
+ beforeEach(() => {
+ spyOn(component.selectedItemChange, 'emit').and.callFake(() => {});
+ });
+
+ describe('not a filter list', () => {
+ it('event should not be emitted', () => {
+ component.isFilter = false;
+ component.changeSelectedItem({});
+ expect(component.selectedItemChange.emit).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('filter list', () => {
+ const options = {
+ label: 'l',
+ value: 'v'
+ };
+
+ beforeEach(() => {
+ component.isFilter = true;
+ component.changeSelectedItem(options);
+ });
+
+ it('event should be emitted', () => {
+ expect(component.selectedItemChange.emit).toHaveBeenCalled();
+ });
+
+ it('event emitter should be called with correct arguments', () => {
+ expect(component.selectedItemChange.emit).toHaveBeenCalledWith(options);
+ });
+
+ });
+
+ });
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
new file mode 100644
index 0000000..dfd2527
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
@@ -0,0 +1,50 @@
+/**
+ * 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, Input, Output, EventEmitter} from '@angular/core';
+
+@Component({
+ selector: 'ul.dropdown-menu',
+ templateUrl: './dropdown-list.component.html'
+})
+export class DropdownListComponent implements OnInit {
+
+ constructor() { }
+
+ ngOnInit() {
+ }
+
+ @Input()
+ items: any[];
+
+ @Input()
+ defaultAction: Function;
+
+ @Input()
+ isFilter: boolean;
+
+ @Output()
+ selectedItemChange: EventEmitter<any> = new EventEmitter();
+
+ changeSelectedItem(options: any): void {
+ if (this.isFilter) {
+ this.selectedItemChange.emit(options);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.html
new file mode 100644
index 0000000..1ac663e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.html
@@ -0,0 +1,23 @@
+<!--
+ 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="filter-label" *ngIf="filterInstance.label">{{filterInstance.label | translate}}</div>
+<button class="btn btn-link dropdown-toggle" data-toggle="dropdown">
+ {{filterInstance.selectedLabel | translate}} <span class="caret"></span>
+</button>
+<ul class="dropdown-menu" [items]="filterInstance.options" [isFilter]="true"
+ (selectedItemChange)="setSelectedValue($event)"></ul>
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
new file mode 100644
index 0000000..c3a25cb
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
@@ -0,0 +1,31 @@
+/*
+ * 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 '../../styles.less';
+
+:host {
+ position: relative;
+ .default-flex;
+
+ .filter-label {
+ padding: @input-group-addon-padding;
+ }
+
+ .btn {
+ text-transform: none;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
new file mode 100644
index 0000000..49eaf1f
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
@@ -0,0 +1,95 @@
+/*
+ * 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 {NO_ERRORS_SCHEMA} from '@angular/core';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {Http} from '@angular/http';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+
+import {FilterDropdownComponent} from './filter-dropdown.component';
+
+export function HttpLoaderFactory(http: Http) {
+ return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
+describe('FilterDropdownComponent', () => {
+ let component: FilterDropdownComponent;
+ let fixture: ComponentFixture<FilterDropdownComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [FilterDropdownComponent],
+ imports: [TranslateModule.forRoot({
+ provide: TranslateLoader,
+ useFactory: HttpLoaderFactory,
+ deps: [Http]
+ })],
+ schemas: [NO_ERRORS_SCHEMA]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(FilterDropdownComponent);
+ component = fixture.componentInstance;
+ component.filterInstance = {
+ options: [
+ {
+ value: 'v0',
+ label: 'l0'
+ },
+ {
+ value: 'v1',
+ label: 'l1'
+ }
+ ]
+ };
+ fixture.detectChanges();
+ });
+
+ it('should create component', () => {
+ expect(component).toBeTruthy();
+ });
+
+ describe('should take initial filter values from 1st item', () => {
+ it('selectedValue', () => {
+ expect(component.filterInstance.selectedValue).toEqual('v0');
+ });
+
+ it('selectedLabel', () => {
+ expect(component.filterInstance.selectedLabel).toEqual('l0');
+ });
+ });
+
+ describe('#setSelectedValue()', () => {
+ beforeEach(() => {
+ component.setSelectedValue({
+ value: 'v2',
+ label: 'l2'
+ });
+ });
+
+ it('selectedValue', () => {
+ expect(component.filterInstance.selectedValue).toEqual('v2');
+ });
+
+ it('selectedLabel', () => {
+ expect(component.filterInstance.selectedLabel).toEqual('l2');
+ });
+ });
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
new file mode 100644
index 0000000..65446da
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
@@ -0,0 +1,45 @@
+/*
+ * 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, Input} from '@angular/core';
+
+@Component({
+ selector: 'filter-dropdown',
+ templateUrl: './filter-dropdown.component.html',
+ styleUrls: ['./filter-dropdown.component.less']
+})
+export class FilterDropdownComponent implements OnInit {
+
+ constructor() { }
+
+ ngOnInit() {
+ this.filterInstance.selectedValue = this.filterInstance.options[0].value;
+ this.filterInstance.selectedLabel = this.filterInstance.options[0].label;
+ }
+
+ @Input()
+ filterInstance: any;
+
+ @Input()
+ options: any[];
+
+ setSelectedValue(options: any): void {
+ this.filterInstance.selectedValue = options.value;
+ this.filterInstance.selectedLabel = options.label;
+ };
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
new file mode 100644
index 0000000..3ccbd6f
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
@@ -0,0 +1,21 @@
+<!--
+ 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="input-group">
+ <span class="input-group-addon">{{filterInstance.label | translate}}</span>
+ <input type="text" class="form-control" [(ngModel)]="filterInstance.value">
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
new file mode 100644
index 0000000..b5e65c9
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
@@ -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.
+ */
+
+@import '../../styles.less';
+
+.input-group {
+ border: @input-border;
+ border-right-width: 0;
+}
+
+.input-group-addon {
+ border: none;
+ background-color: transparent;
+ text-transform: uppercase;
+
+ & + input {
+ border: none;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
new file mode 100644
index 0000000..d1df7b0
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
@@ -0,0 +1,61 @@
+/*
+ * 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 {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {Http} from '@angular/http';
+import {FormsModule} from '@angular/forms';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+
+import {FilterTextFieldComponent} from './filter-text-field.component';
+
+export function HttpLoaderFactory(http: Http) {
+ return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
+describe('FilterTextFieldComponent', () => {
+ let component: FilterTextFieldComponent;
+ let fixture: ComponentFixture<FilterTextFieldComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [FilterTextFieldComponent],
+ imports: [
+ FormsModule,
+ TranslateModule.forRoot({
+ provide: TranslateLoader,
+ useFactory: HttpLoaderFactory,
+ deps: [Http]
+ })
+ ],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(FilterTextFieldComponent);
+ component = fixture.componentInstance;
+ component.filterInstance = {};
+ fixture.detectChanges();
+ });
+
+ it('should create component', () => {
+ expect(component).toBeTruthy();
+ });
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
new file mode 100644
index 0000000..c86d4cb
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
@@ -0,0 +1,35 @@
+/*
+ * 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, Input} from '@angular/core';
+
+@Component({
+ selector: 'filter-text-field',
+ templateUrl: './filter-text-field.component.html',
+ styleUrls: ['./filter-text-field.component.less']
+})
+export class FilterTextFieldComponent implements OnInit {
+
+ constructor() { }
+
+ ngOnInit() {
+ }
+
+ @Input()
+ filterInstance: any;
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
new file mode 100644
index 0000000..20f4353
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
@@ -0,0 +1,36 @@
+<!--
+ 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="form-inline filter-input-container col-md-8">
+ <filter-dropdown [filterInstance]="filtering.filters.clusters"></filter-dropdown>
+ <filter-text-field [filterInstance]="filtering.filters.text"></filter-text-field>
+ <filter-dropdown [filterInstance]="filtering.filters.timeRange"></filter-dropdown>
+ <filter-dropdown [filterInstance]="filtering.filters.timeZone"></filter-dropdown>
+ <button class="btn btn-success" type="button">
+ <span class="fa fa-search"></span>
+ </button>
+</div>
+<div class="default-flex col-md-4">
+ <menu-button [label]="filtering.filters.components.label" [iconClass]="filtering.filters.components.iconClass"
+ [subItems]="filtering.filters.components.options" [isFilter]="true"></menu-button>
+ <menu-button [label]="filtering.filters.levels.label" [iconClass]="filtering.filters.levels.iconClass"
+ [subItems]="filtering.filters.levels.options" [isFilter]="true"></menu-button>
+ <menu-button label="filter.capture" iconClass="fa fa-caret-right"></menu-button>
+ <a href="#">
+ <span class="fa fa-search-minus"></span> {{'filter.excluded' | translate}}
+ </a>
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
new file mode 100644
index 0000000..b393196
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
@@ -0,0 +1,38 @@
+/**
+ * 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 '../../styles.less';
+
+.filter-input-container {
+ .flex-vertical-align;
+ justify-content: flex-start;
+
+ .btn-success {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ filter-dropdown {
+ border: @input-border;
+ border-right-width: 0;
+
+ &:first-child {
+ border-radius: @button-border-radius 0 0 @button-border-radius;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.spec.ts
new file mode 100644
index 0000000..934f37a
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.spec.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 {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {Http} from '@angular/http';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+import {FilteringService} from '@app/services/filtering.service';
+
+import {FiltersPanelComponent} from './filters-panel.component';
+
+export function HttpLoaderFactory(http: Http) {
+ return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
+describe('FiltersPanelComponent', () => {
+ let component: FiltersPanelComponent;
+ let fixture: ComponentFixture<FiltersPanelComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [FiltersPanelComponent],
+ imports: [TranslateModule.forRoot({
+ provide: TranslateLoader,
+ useFactory: HttpLoaderFactory,
+ deps: [Http]
+ })],
+ providers: [FilteringService],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(FiltersPanelComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create component', () => {
+ expect(component).toBeTruthy();
+ });
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.ts
new file mode 100644
index 0000000..8c986f4
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.ts
@@ -0,0 +1,35 @@
+/**
+ * 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 {FilteringService} from '@app/services/filtering.service';
+
+@Component({
+ selector: 'filters-panel',
+ templateUrl: './filters-panel.component.html',
+ styleUrls: ['./filters-panel.component.less']
+})
+export class FiltersPanelComponent implements OnInit {
+
+ constructor(private filtering: FilteringService) {
+ }
+
+ ngOnInit() {
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/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
index 4b7951a..37a96e9 100644
--- 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
@@ -15,7 +15,7 @@
limitations under the License.
-->
-<div class="well col-md-4 col-md-offset-4 col-sm-offset-4">
+<div class="login-form well col-md-4 col-md-offset-4 col-sm-offset-4">
<div class="alert alert-danger" *ngIf="isLoginAlertDisplayed" [innerHTML]="'authorization.error' | translate"></div>
<form #loginForm="ngForm" (ngSubmit)="login()">
<div class="form-group">
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
new file mode 100644
index 0000000..7e37ea1
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
@@ -0,0 +1,22 @@
+/*
+ * 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 '../../styles.less';
+
+.login-form {
+ margin-top: @login-form-top-margin;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/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
index 55d125a..0498ee4 100644
--- 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
@@ -21,7 +21,7 @@ import {FormsModule} from '@angular/forms';
import {HttpModule, Http} from '@angular/http';
import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
-import {HttpClientService} from '../services/http-client.service';
+import {HttpClientService} from '@app/services/http-client.service';
import {LoginFormComponent} from './login-form.component';
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/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
index 400e65b..2a93775 100644
--- 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
@@ -22,7 +22,8 @@ import {HttpClientService} from '@app/services/http-client.service';
@Component({
selector: 'login-form',
- templateUrl: './login-form.component.html'
+ templateUrl: './login-form.component.html',
+ styleUrls: ['./login-form.component.less']
})
export class LoginFormComponent implements OnInit {
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
new file mode 100644
index 0000000..bc641a6
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
@@ -0,0 +1,19 @@
+<!--
+ 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.
+-->
+
+<login-form *ngIf="!httpClient.isAuthorized"></login-form>
+<filters-panel *ngIf="httpClient.isAuthorized" class="row"></filters-panel>
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.spec.ts
new file mode 100644
index 0000000..536f1ef
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.spec.ts
@@ -0,0 +1,49 @@
+/**
+ * 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 {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {HttpModule} from '@angular/http';
+import {HttpClientService} from '@app/services/http-client.service';
+
+import {MainContainerComponent} from './main-container.component';
+
+describe('MainContainerComponent', () => {
+ let component: MainContainerComponent;
+ let fixture: ComponentFixture<MainContainerComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [MainContainerComponent],
+ imports: [HttpModule],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+ providers: [HttpClientService]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(MainContainerComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create component', () => {
+ expect(component).toBeTruthy();
+ });
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.ts
new file mode 100644
index 0000000..d2e6a7f
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.ts
@@ -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.
+ */
+
+import {Component, OnInit} from '@angular/core';
+import {HttpClientService} from '@app/services/http-client.service';
+
+@Component({
+ selector: 'main-container',
+ templateUrl: './main-container.component.html'
+})
+export class MainContainerComponent implements OnInit {
+
+ constructor(private httpClient: HttpClientService) {}
+
+ ngOnInit() {
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
index 1afe6c0..4ed01bd 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
@@ -16,16 +16,11 @@
-->
<div #dropdown [ngClass]="{'dropdown': hasSubItems, 'text-center': true}">
- <span (mousedown)="onMouseDown($event)" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">
- <a *ngIf="title" class="icon" [ngClass]="iconClassNames"></a>
- <span *ngIf="!title" class="icon" [ngClass]="iconClassNames"></span>
- </span>
- <a #dropdownToggle [ngClass]="{'dropdown-toggle': hasSubItems, 'caret': true}" [attr.data-toggle]="hasSubItems ? 'dropdown': null" *ngIf="hasSubItems"></a>
+ <a [ngClass]="iconClass + ' icon'" (mousedown)="onMouseDown($event)" (mouseup)="onMouseUp($event)"
+ (click)="$event.stopPropagation()"></a>
+ <a #dropdownToggle class="dropdown-toggle caret" data-toggle="dropdown" *ngIf="hasCaret"></a>
<br>
- <span class="icon-title" *ngIf="title" (mousedown)="onMouseDown($event)" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">{{title | translate}}</span>
- <ul class="dropdown-menu" *ngIf="hasSubItems">
- <li *ngFor="let item of subItems">
- <a href="#">{{item.title}}</a>
- </li>
- </ul>
+ <a *ngIf="label" (mousedown)="onMouseDown($event)" [ngClass]="labelClass" (mouseup)="onMouseUp($event)"
+ (click)="$event.stopPropagation()">{{label | translate}}</a>
+ <ul class="dropdown-menu" [isFilter]="isFilter" *ngIf="hasSubItems" [items]="subItems"></ul>
</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
index 16b06c4..d6024c2 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.less
@@ -26,4 +26,8 @@
.icon {
padding: 5px;
}
+
+ .unstyled-link {
+ color: inherit;
+ }
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
index 5419b36..9af8f00 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
@@ -16,6 +16,7 @@
* limitations under the License.
*/
+import {NO_ERRORS_SCHEMA} from '@angular/core';
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
import {Http} from '@angular/http';
import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
@@ -41,7 +42,8 @@ describe('MenuButtonComponent', () => {
useFactory: HttpLoaderFactory,
deps: [Http]
})],
- providers: [ComponentActionsService]
+ providers: [ComponentActionsService],
+ schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
}));
@@ -57,7 +59,6 @@ describe('MenuButtonComponent', () => {
});
describe('#hasSubItems', () => {
-
const cases = [
{
subItems: null,
@@ -82,6 +83,40 @@ describe('MenuButtonComponent', () => {
expect(component.hasSubItems).toEqual(test.hasSubItems);
});
});
+ });
+
+ describe('#hasCaret', () => {
+ const cases = [
+ {
+ subItems: null,
+ hasCaret: false,
+ title: 'no sub-items'
+ },
+ {
+ subItems: [],
+ hasCaret: false,
+ title: 'empty sub-items array'
+ },
+ {
+ subItems: [{}],
+ hideCaret: false,
+ hasCaret: true,
+ title: 'sub-items present, caret not hidden'
+ },
+ {
+ subItems: [{}],
+ hideCaret: true,
+ hasCaret: true,
+ title: 'sub-items present, caret hidden'
+ }
+ ];
+ cases.forEach((test) => {
+ it(test.title, () => {
+ component.subItems = test.subItems;
+ component.hideCaret = Boolean(test.hideCaret);
+ expect(component.hasSubItems).toEqual(test.hasCaret);
+ });
+ });
});
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
index 716d3ae..9505f5b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
@@ -18,6 +18,7 @@
import {Component, AfterViewInit, Input, ViewChild, ElementRef} from '@angular/core';
import {ComponentActionsService} from '@app/services/component-actions.service';
+import * as $ from 'jquery';
@Component({
selector: 'menu-button',
@@ -36,28 +37,40 @@ export class MenuButtonComponent implements AfterViewInit {
dropdown: ElementRef;
@Input()
- title?: string;
+ label?: string;
@Input()
action: string;
@Input()
- iconClassNames: string[];
+ isFilter: boolean;
+
+ @Input()
+ iconClass: string;
+
+ @Input()
+ labelClass?: string;
@Input()
subItems?: any[];
@Input()
+ hideCaret?: boolean;
+
get hasSubItems(): boolean {
return Boolean(this.subItems && this.subItems.length);
}
+ get hasCaret(): boolean {
+ return this.hasSubItems && !this.hideCaret;
+ }
+
private clickStartTime: number;
private readonly longClickInterval = 1000;
onMouseDown(event: MouseEvent): void {
- if (event.button === 0) {
+ if (this.action && event.button === 0) {
this.clickStartTime = (new Date()).getTime();
}
}
@@ -65,9 +78,9 @@ export class MenuButtonComponent implements AfterViewInit {
onMouseUp(event: MouseEvent): void {
if (event.button === 0) {
const clickEndTime = (new Date()).getTime();
- if (this.hasSubItems && clickEndTime - this.clickStartTime >= this.longClickInterval) {
- this.dropdown.nativeElement.classList.add('open');
- } else {
+ if (this.hasSubItems && (!this.action || clickEndTime - this.clickStartTime >= this.longClickInterval)) {
+ $(this.dropdown.nativeElement).toggleClass('open');
+ } else if (this.action) {
this.actions[this.action]();
}
event.stopPropagation();
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
index 1a1062e..4cde0a0 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
@@ -38,10 +38,4 @@ export class ComponentActionsService {
openHistory() {
}
- openAlerts() {
- }
-
- openUserDetails() {
- }
-
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.spec.ts
new file mode 100644
index 0000000..d471e00
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.spec.ts
@@ -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.
+ */
+
+import {TestBed, inject} from '@angular/core/testing';
+
+import {FilteringService} from './filtering.service';
+
+describe('FilteringService', () => {
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ providers: [FilteringService]
+ });
+ });
+
+ it('should create service', inject([FilteringService], (service: FilteringService) => {
+ expect(service).toBeTruthy();
+ }));
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
new file mode 100644
index 0000000..84cbc50
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
@@ -0,0 +1,167 @@
+/**
+ * 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 * as moment from 'moment-timezone';
+
+@Injectable()
+export class FilteringService {
+
+ constructor() {
+ }
+
+ // TODO implement loading of real options data
+ readonly filters = {
+ clusters: {
+ label: 'filter.clusters',
+ options: [
+ {
+ label: 'filter.all',
+ value: 'ALL'
+ },
+ {
+ label: 'c0',
+ value: 'c0'
+ },
+ {
+ label: 'c1',
+ value: 'c1'
+ }
+ ],
+ selectedValue: '',
+ selectedLabel: ''
+ },
+ text: {
+ label: 'filter.message',
+ value: ''
+ },
+ timeRange: {
+ options: [
+ {
+ label: 'filter.timeRange.1hr',
+ value: '1HR'
+ },
+ {
+ label: 'filter.timeRange.24hr',
+ value: '24HR'
+ },
+ {
+ label: 'filter.timeRange.today',
+ value: 'TODAY'
+ },
+ {
+ label: 'filter.timeRange.yesterday',
+ value: 'YESTERDAY'
+ },
+ {
+ label: 'filter.timeRange.7d',
+ value: '7D'
+ },
+ {
+ label: 'filter.timeRange.30d',
+ value: '30d'
+ },
+ {
+ label: 'filter.timeRange.thisMonth',
+ value: 'THIS_MONTH'
+ },
+ {
+ label: 'filter.timeRange.lastMonth',
+ value: 'LAST_MONTH'
+ },
+ {
+ label: 'filter.timeRange.custom',
+ value: 'CUSTOM'
+ }
+ ],
+ selectedValue: '',
+ selectedLabel: ''
+ },
+ timeZone: {
+ options: moment.tz.names().map(zone => {
+ return {
+ label: zone,
+ value: zone
+ };
+ }),
+ selectedValue: '',
+ selectedLabel: ''
+ },
+ components: {
+ label: 'filter.components',
+ iconClass: 'fa fa-cubes',
+ options: [
+ {
+ label: 'DataNode',
+ value: 'DATANODE'
+ },
+ {
+ label: 'NameNode',
+ value: 'NAMENODE'
+ },
+ {
+ label: 'ZooKeeper Server',
+ value: 'ZOOKEEPER_SERVER'
+ },
+ {
+ label: 'Metrics Collector',
+ value: 'METRICS_COLLECTOR'
+ }
+ ],
+ selectedValue: '',
+ selectedLabel: ''
+ },
+ levels: {
+ label: 'filter.levels',
+ iconClass: 'fa fa-sort-amount-asc',
+ options: [
+ {
+ label: 'levels.fatal',
+ value: 'FATAL'
+ },
+ {
+ label: 'levels.error',
+ value: 'ERROR'
+ },
+ {
+ label: 'levels.warn',
+ value: 'WARN'
+ },
+ {
+ label: 'levels.info',
+ value: 'INFO'
+ },
+ {
+ label: 'levels.debug',
+ value: 'DEBUG'
+ },
+ {
+ label: 'levels.trace',
+ value: 'TRACE'
+ },
+ {
+ label: 'levels.unknown',
+ value: 'UNKNOWN'
+ }
+ ],
+ selectedValue: '',
+ selectedLabel: ''
+ }
+ };
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
index 82ab60a..6898354 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.html
@@ -15,4 +15,7 @@
limitations under the License.
-->
-<menu-button *ngFor="let item of items" [title]="item.title" [action]="item.action" [iconClassNames]="item.iconClassNames" [subItems]="item.subItems"></menu-button>
+<menu-button *ngFor="let item of items" [label]="item.label" [action]="item.action"
+ [iconClass]="item.iconClass" [labelClass]="item.labelClass"
+ [subItems]="item.subItems" [hideCaret]="item.hideCaret">
+</menu-button>
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
index c992c9e..8728ecf 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
@@ -15,8 +15,8 @@
* limitations under the License.
*/
+@import '../../styles.less';
+
:host {
- display: flex;
- align-items: center;
- justify-content: space-between;
+ .default-flex;
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
index 641fca0..bad588b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
@@ -34,76 +34,88 @@ export class TopMenuComponent implements OnInit {
//TODO implement loading of real data into subItems
readonly items = [
{
- iconClassNames: ['fa', 'fa-arrow-left'],
- title: 'topMenu.undo',
+ iconClass: 'fa fa-arrow-left',
+ label: 'topMenu.undo',
+ labelClass: 'unstyled-link',
action: 'undo',
subItems: [
{
- title: 'Apply \'Last week\' filter'
+ label: 'Apply \'Last week\' filter'
},
{
- title: 'Clear all filters'
+ label: 'Clear all filters'
},
{
- title: 'Apply \'HDFS\' filter'
+ label: 'Apply \'HDFS\' filter'
},
{
- title: 'Apply \'Errors\' filter'
+ label: 'Apply \'Errors\' filter'
}
]
},
{
- iconClassNames: ['fa', 'fa-arrow-right'],
- title: 'topMenu.redo',
+ iconClass: 'fa fa-arrow-right',
+ label: 'topMenu.redo',
+ labelClass: 'unstyled-link',
action: 'redo',
subItems: [
{
- title: 'Apply \'Warnings\' filter'
+ label: 'Apply \'Warnings\' filter'
},
{
- title: 'Switch to graph mode'
+ label: 'Switch to graph mode'
},
{
- title: 'Apply \'Custom Date\' filter'
+ label: 'Apply \'Custom Date\' filter'
}
]
},
{
- iconClassNames: ['fa', 'fa-refresh'],
- title: 'topMenu.refresh',
+ iconClass: 'fa fa-refresh',
+ label: 'topMenu.refresh',
+ labelClass: 'unstyled-link',
action: 'refresh'
},
{
- iconClassNames: ['fa', 'fa-clock-o'],
- title: 'topMenu.history',
+ iconClass: 'fa fa-clock-o',
+ label: 'topMenu.history',
+ labelClass: 'unstyled-link',
action: 'openHistory',
subItems: [
{
- title: 'Apply \'Custom Date\' filter'
+ label: 'Apply \'Custom Date\' filter'
},
{
- title: 'Switch to graph mode'
+ label: 'Switch to graph mode'
},
{
- title: 'Apply \'Warnings\' filter'
+ label: 'Apply \'Warnings\' filter'
},
{
- title: 'Apply \'Last week\' filter'
+ label: 'Apply \'Last week\' filter'
},
{
- title: 'Clear all filters'
+ label: 'Clear all filters'
},
{
- title: 'Apply \'HDFS\' filter'
+ label: 'Apply \'HDFS\' filter'
},
{
- title: 'Apply \'Errors\' filter'
+ label: 'Apply \'Errors\' filter'
}
]
},
{
- iconClassNames: ['fa', 'fa-user'],
- action: 'openUserDetails'
+ iconClass: 'fa fa-user unstyled-link',
+ hideCaret: true,
+ subItems: [
+ {
+ label: 'Options'
+ },
+ {
+ label: 'Logout'
+ }
+ ]
}
];
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json b/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
index dea8120..755f307 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
@@ -9,5 +9,32 @@
"topMenu.undo": "Undo",
"topMenu.redo": "Redo",
"topMenu.refresh": "Refresh",
- "topMenu.history": "History"
+ "topMenu.history": "History",
+
+ "filter.all": "All",
+
+ "filter.clusters": "Clusters",
+ "filter.message": "Message:",
+ "filter.components": "Components",
+ "filter.levels": "Levels",
+ "filter.capture": "Capture",
+ "filter.excluded": "Excluded",
+
+ "filter.timeRange.1hr": "Last 1 hour",
+ "filter.timeRange.24hr": "Last 24 hours",
+ "filter.timeRange.today": "Today",
+ "filter.timeRange.yesterday": "Yesterday",
+ "filter.timeRange.7d": "Last 7 days",
+ "filter.timeRange.30d": "Last 30 days",
+ "filter.timeRange.thisMonth": "This month",
+ "filter.timeRange.lastMonth": "Last month",
+ "filter.timeRange.custom": "Custom range",
+
+ "levels.fatal": "Fatal",
+ "levels.error": "Error",
+ "levels.warn": "Warn",
+ "levels.info": "Info",
+ "levels.debug": "Debug",
+ "levels.trace": "Trace",
+ "levels.unknown": "Unknown"
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
index 24136fe..db6da5c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
@@ -18,3 +18,18 @@
@navbar-background-color: #323544;
@h1-vertical-margin: 20px;
+@button-border-radius: 4px;
+@input-border: 1px solid #CFD3D7;
+@button-border-radius: 4px;
+@input-group-addon-padding: 6px 12px;
+@login-form-top-margin: 20px;
+
+.flex-vertical-align {
+ display: flex;
+ align-items: center;
+}
+
+.default-flex {
+ .flex-vertical-align;
+ justify-content: space-between;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/6fc2fef6/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/yarn.lock b/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
index d521f70..5412b84 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
+++ b/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
@@ -137,6 +137,18 @@
version "2.5.38"
resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.38.tgz#a4379124c4921d4e21de54ec74669c9e9b356717"
+"@types/moment-timezone@^0.2.34":
+ version "0.2.34"
+ resolved "https://registry.yarnpkg.com/@types/moment-timezone/-/moment-timezone-0.2.34.tgz#948e0aff82742a31dd63714d1aac9616bc375053"
+ dependencies:
+ moment ">=2.14.0"
+
+"@types/moment@^2.13.0":
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/@types/moment/-/moment-2.13.0.tgz#604ebd189bc3bc34a1548689404e61a2a4aac896"
+ dependencies:
+ moment "*"
+
"@types/node@^6.0.46", "@types/node@~6.0.60":
version "6.0.73"
resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.73.tgz#85dc4bb6f125377c75ddd2519a1eeb63f0a4ed70"
@@ -3019,7 +3031,13 @@ mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkd
dependencies:
minimist "0.0.8"
-moment@2.18.1:
+moment-timezone@^0.5.13:
+ version "0.5.13"
+ resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.13.tgz#99ce5c7d827262eb0f1f702044177f60745d7b90"
+ dependencies:
+ moment ">= 2.9.0"
+
+moment@*, moment@2.18.1, "moment@>= 2.9.0", moment@>=2.14.0, moment@^2.18.1:
version "2.18.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f"
[21/21] ambari git commit: AMBARI-21308 Log Search UI GA - fix
yarn.lock file. (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21308 Log Search UI GA - fix yarn.lock file. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4bfc6f13
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4bfc6f13
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4bfc6f13
Branch: refs/heads/branch-feature-logsearch-ui
Commit: 4bfc6f13e578e1c2d257df2f4180769068edb1d8
Parents: 1a2d6ce
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 22 16:16:26 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 16:16:26 2017 +0300
----------------------------------------------------------------------
ambari-logsearch/ambari-logsearch-web-new/yarn.lock | 8 ++++++++
1 file changed, 8 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/4bfc6f13/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/yarn.lock b/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
index 5412b84..ff37374 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
+++ b/ambari-logsearch/ambari-logsearch-web-new/yarn.lock
@@ -112,6 +112,14 @@
dependencies:
tsickle "^0.21.0"
+"@ngrx/core@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@ngrx/core/-/core-1.2.0.tgz#882b46abafa2e0e6d887cb71a1b2c2fa3e6d0dc6"
+
+"@ngrx/store@^2.2.2":
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-2.2.2.tgz#a00305a6452032a3385886a11ce529dce2dae65b"
+
"@ngtools/json-schema@1.0.5":
version "1.0.5"
resolved "https://registry.yarnpkg.com/@ngtools/json-schema/-/json-schema-1.0.5.tgz#ad39037c70c88b245ac7267a71777646b6063d77"
[08/21] ambari git commit: AMBARI-21313 Log Search UI: implement
service for string constants (additional patch). (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21313 Log Search UI: implement service for string constants (additional patch). (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/8aa761f9
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/8aa761f9
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/8aa761f9
Branch: refs/heads/branch-feature-logsearch-ui
Commit: 8aa761f9661fd07a3b75ca6b53a8a5fa9cbe4d51
Parents: 72c7400
Author: ababiichuk <ab...@hortonworks.com>
Authored: Fri May 19 18:08:08 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:24:50 2017 +0300
----------------------------------------------------------------------
.../src/app/app.component.spec.ts | 20 ++++++++++++--------
.../app/login-form/login-form.component.spec.ts | 18 ++++++++++++++++--
2 files changed, 28 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/8aa761f9/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 f6d229f..dfe6fbf 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
@@ -18,10 +18,17 @@
import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {TestBed, async} from '@angular/core/testing';
+import {Http} from '@angular/http';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
import {HttpClientService} from './http-client.service';
import {AppComponent} from './app.component';
+export function HttpLoaderFactory(http: Http) {
+ return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
describe('AppComponent', () => {
beforeEach(async(() => {
const httpClient = {
@@ -29,6 +36,11 @@ describe('AppComponent', () => {
};
TestBed.configureTestingModule({
declarations: [AppComponent],
+ imports: [TranslateModule.forRoot({
+ provide: TranslateLoader,
+ useFactory: HttpLoaderFactory,
+ deps: [Http]
+ })],
providers: [
{
provide: HttpClientService,
@@ -44,12 +56,4 @@ describe('AppComponent', () => {
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
}));
-
- 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.title);
- }));
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/8aa761f9/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
index 0a13c1e..b58e834 100644
--- 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
@@ -18,11 +18,17 @@
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
import {FormsModule} from '@angular/forms';
-import {HttpModule} from '@angular/http';
+import {HttpModule, Http} from '@angular/http';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
import {HttpClientService} from '../http-client.service';
import {LoginFormComponent} from './login-form.component';
+export function HttpLoaderFactory(http: Http) {
+ return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
describe('LoginFormComponent', () => {
let component: LoginFormComponent;
let fixture: ComponentFixture<LoginFormComponent>;
@@ -49,7 +55,15 @@ describe('LoginFormComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [LoginFormComponent],
- imports: [HttpModule, FormsModule],
+ imports: [
+ HttpModule,
+ FormsModule,
+ TranslateModule.forRoot({
+ provide: TranslateLoader,
+ useFactory: HttpLoaderFactory,
+ deps: [Http]
+ })
+ ],
providers: [
{
provide: HttpClientService,
[05/21] ambari git commit: AMBARI-21312 Provide Log Search UI
authorization functionality. (ababiichuk)
Posted by ab...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.svg
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.svg b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.svg
new file mode 100644
index 0000000..06824bf
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.svg
@@ -0,0 +1,7606 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="robotoregular" horiz-adv-x="1164" >
+<font-face units-per-em="2048" ascent="1638" descent="-410" />
+<missing-glyph horiz-adv-x="509" />
+<glyph unicode="fi" horiz-adv-x="1140" d="M28 936v146h170v117q0 182 106.5 282t295.5 100q67 0 132 -15.5t153 -45.5l-34 -160q-53 21 -113 36t-123 15q-117 0 -168.5 -52t-51.5 -160v-117h215v-146h-215v-936h-197v936h-170zM783 0v1082h198v-1082h-198z" />
+<glyph unicode=" " horiz-adv-x="509" />
+<glyph unicode="	" horiz-adv-x="509" />
+<glyph unicode=" " horiz-adv-x="509" />
+<glyph unicode="!" horiz-adv-x="539" d="M171 0v204h198v-204h-198zM171 478v978h197v-978h-197z" />
+<glyph unicode=""" horiz-adv-x="668" d="M80 1040l1 240v280h197v-270l-101 -250h-97zM389 1040l1 248v272h197v-270l-101 -250h-97z" />
+<glyph unicode="#" horiz-adv-x="1276" d="M70 410v140h264l68 348h-256v142h284l82 416h151l-82 -416h255l82 416h151l-82 -416h199v-142h-226l-68 -348h219v-140h-247l-80 -410h-152l80 410h-255l-80 -410h-151l80 410h-236zM485 550h255l68 348h-255z" />
+<glyph unicode="$" horiz-adv-x="1153" d="M114 424l2 5h190q0 -154 77.5 -219.5t190.5 -65.5q129 0 201.5 61.5t72.5 170.5q0 89 -64 153t-210 114q-202 61 -305 163t-103 272q0 165 94.5 269t260.5 125v221h158v-222q168 -24 260.5 -143.5t92.5 -320.5h-196q0 136 -63 220t-175 84q-118 0 -176.5 -61.5 t-58.5 -168.5q0 -97 60.5 -157t218.5 -114q205 -66 304 -164.5t99 -267.5q0 -172 -103 -273.5t-283 -120.5v-192h-157v191q-172 18 -282 125.5t-106 315.5z" />
+<glyph unicode="%" horiz-adv-x="1498" d="M104 1099v77q0 127 82 214t219 87t219 -86.5t82 -214.5v-77q0 -127 -81.5 -213t-217.5 -86q-138 0 -220.5 86t-82.5 213zM250 1099q0 -74 40.5 -125.5t116.5 -51.5q73 0 113 51t40 126v77q0 74 -40.5 126.5t-114.5 52.5q-75 0 -115 -52.5t-40 -126.5v-77zM349 177 l711 1138l109 -67l-711 -1138zM809 279v78q0 127 82 213.5t219 86.5q136 0 218.5 -86.5t82.5 -213.5v-78q0 -128 -82 -214t-217 -86q-138 0 -220.5 86t-82.5 214zM955 279q0 -75 40.5 -126.5t116.5 -51.5q73 0 113 51.5t40 126.5v78q0 74 -41 126t-114 52q-74 0 -114.5 -52 t-40.5 -126v-78z" />
+<glyph unicode="&" horiz-adv-x="1276" d="M64 392q0 122 70.5 213.5t210.5 183.5q-78 99 -116 176.5t-38 159.5q0 169 97.5 260.5t268.5 91.5q158 0 257 -91t99 -219q0 -98 -52.5 -169.5t-155.5 -146.5l-109 -80l340 -409q41 65 64 144t23 167h176q0 -132 -39 -244t-113 -201l185 -223l-2 -5h-229l-85 102 q-80 -60 -177 -91.5t-201 -31.5q-217 0 -345.5 115t-128.5 298zM261 392q0 -113 71 -186t206 -73q72 0 142 24.5t132 70.5l-361 435l-40 -29q-91 -68 -120.5 -130t-29.5 -112zM388 1127q0 -53 27 -110.5t81 -125.5l138 95q57 38 77.5 82.5t20.5 98.5q0 61 -48.5 108 t-126.5 47q-81 0 -125 -56.5t-44 -138.5z" />
+<glyph unicode="'" horiz-adv-x="359" d="M80 1055l1 265v240h197v-223l-101 -282h-97z" />
+<glyph unicode="(" horiz-adv-x="679" d="M132 582v9q0 394 159 673t334 372l6 -1l38 -116q-137 -107 -238.5 -343t-101.5 -583v-13q0 -347 101 -583t239 -352l-38 -108h-6q-175 93 -334 371.5t-159 673.5z" />
+<glyph unicode=")" horiz-adv-x="687" d="M6 -355q135 105 237.5 345.5t102.5 589.5v13q0 342 -105.5 583.5t-234.5 351.5l38 108h6q174 -93 333.5 -372t159.5 -673v-9q0 -395 -159.5 -673.5t-333.5 -371.5h-6z" />
+<glyph unicode="*" horiz-adv-x="884" d="M28 1071l49 154l296 -111l-10 342h161l-10 -348l293 110l48 -156l-302 -89l193 -270l-131 -96l-181 287l-176 -279l-132 93l198 274z" />
+<glyph unicode="+" horiz-adv-x="1162" d="M78 605v178h402v423h197v-423h399v-178h-399v-459h-197v459h-402z" />
+<glyph unicode="," horiz-adv-x="404" d="M48 -258l70 316v163h197v-173l-150 -306h-117z" />
+<glyph unicode="-" horiz-adv-x="561" d="M35 538v154h490v-154h-490z" />
+<glyph unicode="." horiz-adv-x="548" d="M161 0v202h197v-202h-197z" />
+<glyph unicode="/" horiz-adv-x="850" d="M16 -125l608 1581h167l-607 -1581h-168z" />
+<glyph unicode="0" horiz-adv-x="1154" d="M113 555v345q0 278 124.5 427.5t338.5 149.5q215 0 339.5 -149.5t124.5 -427.5v-345q0 -279 -123.5 -427.5t-338.5 -148.5t-340 149t-125 427zM310 515q0 -189 69 -285.5t199 -96.5t197.5 96t67.5 286v427q0 189 -68.5 284.5t-198.5 95.5t-198 -95.5t-68 -284.5v-427z " />
+<glyph unicode="1" horiz-adv-x="1153" d="M186 1260v142l495 54v-1456h-197v1264z" />
+<glyph unicode="2" horiz-adv-x="1153" d="M97 1033q-5 188 125 316t360 128q196 0 312.5 -114.5t116.5 -291.5q0 -119 -70.5 -238.5t-197.5 -256.5l-383 -417l2 -5h700v-154h-944v135l477 530q128 143 173.5 227t45.5 172q0 109 -63.5 183.5t-168.5 74.5q-151 0 -222.5 -77.5t-71.5 -217.5h-189z" />
+<glyph unicode="3" horiz-adv-x="1153" d="M100 378l3 6h188q0 -115 70.5 -183t193.5 -68q125 0 196 68t71 201q0 135 -63 199t-199 64h-172v154h172q131 0 185.5 65.5t54.5 182.5q0 125 -62 190t-183 65q-115 0 -184.5 -67.5t-69.5 -179.5h-189l-2 6q-5 165 119.5 280.5t325.5 115.5q202 0 322 -107.5t120 -306.5 q0 -90 -54.5 -179.5t-163.5 -136.5q131 -43 185.5 -135t54.5 -206q0 -199 -130.5 -313t-333.5 -114q-199 0 -329.5 107.5t-125.5 291.5z" />
+<glyph unicode="4" horiz-adv-x="1153" d="M55 336v111l642 1009h208v-966h201v-154h-201v-336h-196v336h-654zM265 490h444v683l-6 1l-19 -50z" />
+<glyph unicode="5" horiz-adv-x="1153" d="M157 377l2 6h178q0 -119 68.5 -184.5t177.5 -65.5q125 0 194 88t69 241q0 140 -70 230t-193 90q-116 0 -168 -35t-76 -107l-164 17l84 799h729v-175h-562l-48 -409q46 34 102.5 56.5t130.5 24.5q201 2 316.5 -131t115.5 -358q0 -219 -117.5 -352t-342.5 -133 q-185 0 -308 101t-118 297z" />
+<glyph unicode="6" horiz-adv-x="1153" d="M132 571v278q0 280 156 454t387 174q75 0 148.5 -17t121.5 -43l-42 -151q-49 25 -102.5 40.5t-125.5 15.5q-156 0 -251.5 -125t-95.5 -326v-23q64 56 146.5 87.5t177.5 31.5q195 0 311 -135t116 -342q0 -226 -123.5 -368.5t-329.5 -142.5q-214 0 -354 155t-140 437z M328 552q0 -201 85 -310t213 -109q121 0 188.5 102.5t67.5 254.5q0 144 -72.5 237t-201.5 93q-101 0 -172 -41t-108 -109v-118z" />
+<glyph unicode="7" horiz-adv-x="1153" d="M77 1301v155h985v-155q-264 -314 -356.5 -556.5t-133.5 -587.5l-16 -157h-197l16 157q42 344 163 615t331 529h-792z" />
+<glyph unicode="8" horiz-adv-x="1153" d="M102 394q0 123 74 217t200 138q-109 42 -171 127.5t-62 199.5q0 192 118.5 296.5t313.5 104.5q192 0 313.5 -104.5t121.5 -296.5q0 -114 -64 -199.5t-173 -127.5q126 -44 201.5 -138t75.5 -217q0 -202 -131.5 -308.5t-341.5 -106.5q-214 0 -344.5 106.5t-130.5 308.5z M299 398q0 -124 76 -194.5t202 -70.5q123 0 200 71t77 194q0 120 -79 197t-200 77q-123 0 -199.5 -77t-76.5 -197zM340 1072q0 -111 65.5 -178t171.5 -67q104 0 170 67t66 178q0 108 -67.5 179t-170.5 71q-105 0 -170 -68.5t-65 -181.5z" />
+<glyph unicode="9" horiz-adv-x="1153" d="M83 978q0 219 131.5 359t319.5 140q228 0 359.5 -142.5t131.5 -419.5v-347q0 -285 -142.5 -437t-371.5 -152q-77 0 -156.5 14.5t-142.5 44.5l30 151q59 -31 122.5 -43.5t146.5 -12.5q144 0 230.5 109t86.5 324v66q-49 -71 -122.5 -107.5t-163.5 -36.5q-211 0 -335 130.5 t-124 359.5zM280 978q0 -150 70.5 -243t191.5 -93q109 0 181.5 47t104.5 120v126q0 191 -73.5 289t-214.5 98q-108 0 -184 -96.5t-76 -247.5z" />
+<glyph unicode=":" horiz-adv-x="517" d="M161 0v202h197v-202h-197zM161 876v202h197v-202h-197z" />
+<glyph unicode=";" horiz-adv-x="525" d="M99 -258l70 316v163h197v-173l-150 -306h-117zM162 876v202h197v-202h-197z" />
+<glyph unicode="<" horiz-adv-x="1040" d="M71 466v149l816 378v-201l-559 -233l-85 -18v-6l85 -19l559 -228v-201z" />
+<glyph unicode="=" horiz-adv-x="1153" d="M152 407v164h834v-164h-834zM152 823v164h834v-164h-834z" />
+<glyph unicode=">" horiz-adv-x="1072" d="M136 87v196l598 238l85 17v6l-85 20l-598 234v195l856 -378v-149z" />
+<glyph unicode="?" horiz-adv-x="974" d="M61 1122q-3 161 113.5 258t296.5 97q197 0 306 -100.5t109 -280.5q0 -129 -70.5 -236t-186.5 -219q-54 -54 -65.5 -97t-11.5 -134h-197q1 145 25 201t126 148q99 117 141 180t42 152q0 106 -56.5 163t-161.5 57q-91 0 -155 -49.5t-64 -145.5h-188zM353 0v208h206v-208 h-206z" />
+<glyph unicode="@" horiz-adv-x="1833" d="M114 478q19 423 249 688t602 265q379 0 581.5 -250t185.5 -679q-9 -214 -120 -368.5t-332 -154.5q-73 0 -126 41.5t-76 117.5q-50 -80 -122 -119.5t-168 -39.5q-125 0 -194 120.5t-51 316.5q23 259 137.5 415.5t279.5 156.5q105 0 169 -26t139 -80l-4 -4h6l-51 -585 q-9 -110 21.5 -151.5t81.5 -41.5q123 0 197 113.5t82 288.5q16 382 -144 595.5t-496 213.5q-308 0 -495.5 -231t-202.5 -602q-18 -376 150 -594.5t482 -218.5q88 0 178.5 21.5t152.5 56.5l38 -107q-67 -42 -170.5 -65.5t-202.5 -23.5q-380 0 -587.5 249.5t-189.5 681.5z M720 416q-11 -142 21.5 -216t106.5 -74q64 0 117 24.5t97 87.5q-1 12 -0.5 25.5t2.5 29.5l47 538q-26 12 -54.5 19t-59.5 7q-125 0 -191 -109.5t-86 -331.5z" />
+<glyph unicode="A" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM420 540h490l-240 663h-6z" />
+<glyph unicode="B" horiz-adv-x="1309" d="M180 0v1456h475q228 0 357 -98.5t129 -295.5q0 -97 -62 -173.5t-163 -113.5q132 -28 207.5 -129t75.5 -235q0 -200 -129.5 -305.5t-351.5 -105.5h-538zM377 154h341q134 0 209 66.5t75 188.5q0 128 -62.5 201t-192.5 73h-370v-529zM377 837h319q110 0 179 60.5t69 168.5 q0 118 -74.5 176.5t-214.5 58.5h-278v-464z" />
+<glyph unicode="C" horiz-adv-x="1297" d="M118 598v259q0 269 155.5 444.5t402.5 175.5q247 1 393 -131q142 -128 142 -337v-12l-2 -6h-189q0 153 -90 242t-254 89q-165 0 -263 -133t-98 -330v-261q0 -199 98 -332t263 -133q164 0 254 88.5t90 244.5h189l2 -6v-11q0 -198 -144 -332q-148 -138 -391 -138 q-247 0 -402.5 175t-155.5 444z" />
+<glyph unicode="D" horiz-adv-x="1349" d="M180 0v1456h447q286 0 459 -175.5t173 -453.5v-199q0 -279 -173 -453.5t-459 -174.5h-447zM377 154h250q202 0 318.5 133t116.5 341v201q0 206 -116.5 339t-318.5 133h-250v-1147z" />
+<glyph unicode="E" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966z" />
+<glyph unicode="F" horiz-adv-x="1193" d="M180 0v1456h963v-155h-766v-502h664v-155h-664v-644h-197z" />
+<glyph unicode="G" horiz-adv-x="1396" d="M120 578v300q0 265 159 432t410 167q250 0 393 -123t146 -317l-2 -6h-188q-9 127 -96.5 209t-252.5 82q-167 0 -269 -125t-102 -317v-302q0 -194 114 -319.5t290 -125.5q124 0 203 33t113 75v331h-319v155h516v-534q-52 -80 -180.5 -147t-332.5 -67q-261 0 -431.5 167 t-170.5 432z" />
+<glyph unicode="H" horiz-adv-x="1461" d="M180 0v1456h197v-658h707v658h197v-1456h-197v643h-707v-643h-197z" />
+<glyph unicode="I" horiz-adv-x="579" d="M190 0v1456h198v-1456h-198z" />
+<glyph unicode="J" horiz-adv-x="1130" d="M66 395l2 6h189q0 -135 68.5 -201.5t193.5 -66.5q109 0 178 73.5t69 196.5v1053h197v-1053q0 -195 -123.5 -309.5t-320.5 -114.5q-210 0 -334 107q-119 102 -119 293v16z" />
+<glyph unicode="K" horiz-adv-x="1317" d="M180 0v1456h197v-644h152l521 644h218l3 -5l-565 -699l606 -747l-3 -5h-235l-527 657h-170v-657h-197z" />
+<glyph unicode="L" horiz-adv-x="1106" d="M180 0v1456h197v-1302h689v-154h-886z" />
+<glyph unicode="M" horiz-adv-x="1799" d="M180 0v1456h252l464 -1183h6l464 1183h252v-1456h-197v576l20 592l-5 1l-472 -1169h-131l-470 1166l-5 -1l19 -589v-576h-197z" />
+<glyph unicode="N" horiz-adv-x="1461" d="M180 0v1456h197l701 -1124l6 2v1122h197v-1456h-197l-701 1126l-6 -2v-1124h-197z" />
+<glyph unicode="O" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261z" />
+<glyph unicode="P" horiz-adv-x="1312" d="M180 0v1456h557q233 0 362 -120t129 -316q0 -199 -129 -317.5t-362 -118.5h-360v-584h-197zM377 738h360q148 0 221 79.5t73 200.5t-73.5 202t-220.5 81h-360v-563z" />
+<glyph unicode="Q" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -142 -50 -263t-140 -205l247 -233l-135 -129l-276 257q-56 -23 -116.5 -34.5t-124.5 -11.5q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5 t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128t-102.5 -328v-261z" />
+<glyph unicode="R" horiz-adv-x="1357" d="M180 0v1455h527q239 0 365 -106t126 -308q0 -112 -58.5 -195t-170.5 -132q120 -39 172.5 -126.5t52.5 -216.5v-137q0 -68 15 -122t52 -88v-24h-203q-39 34 -50 100t-11 136v133q0 118 -69 190t-185 72h-366v-631h-197zM377 786h310q167 0 240.5 63.5t73.5 193.5 q0 123 -71.5 190.5t-222.5 67.5h-330v-515z" />
+<glyph unicode="S" horiz-adv-x="1277" d="M102 413l2 6h188q0 -140 103 -213t255 -73q149 0 236 63t87 171q0 100 -75 167.5t-266 113.5q-231 55 -360.5 162t-129.5 269q0 170 139.5 284t361.5 114q239 0 381 -131q137 -127 136 -292v-12l-2 -6h-188q0 128 -84.5 207t-242.5 79q-147 0 -225.5 -66.5t-78.5 -173.5 q0 -95 85 -158.5t276 -111.5q230 -57 350 -168t120 -275q0 -176 -144 -283t-376 -107q-218 0 -386 118q-163 115 -162 305v11z" />
+<glyph unicode="T" horiz-adv-x="1200" d="M34 1301v155h1132v-155h-468v-1301h-197v1301h-467z" />
+<glyph unicode="U" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5z" />
+<glyph unicode="V" horiz-adv-x="1295" d="M22 1456h214l376 -1094l33 -115h6l33 115l376 1094h213l-541 -1456h-169z" />
+<glyph unicode="W" horiz-adv-x="1809" d="M54 1456h196l222 -952l27 -182l6 -1l39 183l267 952h174l269 -952l40 -187h6l29 187l217 952h197l-351 -1456h-176l-287 1010l-26 131h-6l-25 -131l-292 -1010h-176z" />
+<glyph unicode="X" horiz-adv-x="1295" d="M66 0l472 734l-462 722h236l338 -568l340 568h238l-462 -722l472 -734h-235l-349 578l-350 -578h-238z" />
+<glyph unicode="Y" horiz-adv-x="1250" d="M20 1456h225l380 -740l380 740h225l-511 -944v-512h-196v525z" />
+<glyph unicode="Z" horiz-adv-x="1225" d="M97 0v146l778 1155h-767v155h992v-141l-781 -1161h814v-154h-1036z" />
+<glyph unicode="[" horiz-adv-x="552" d="M143 -312v1976h385v-155h-188v-1666h188v-155h-385z" />
+<glyph unicode="\" horiz-adv-x="846" d="M39 1456h186l608 -1581h-186z" />
+<glyph unicode="]" horiz-adv-x="552" d="M11 -157h189v1666h-189v155h386v-1976h-386v155z" />
+<glyph unicode="^" horiz-adv-x="856" d="M61 729l299 727h134l298 -727h-181l-166 419l-16 70h-6l-16 -70l-163 -419h-183z" />
+<glyph unicode="_" horiz-adv-x="931" d="M4 0h923v-154h-923v154z" />
+<glyph unicode="`" horiz-adv-x="641" d="M82 1471l3 6h230l175 -266h-158z" />
+<glyph unicode="a" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6v11q0 111 112 205q118 98 303 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141z" />
+<glyph unicode="b" d="M143 0v1560h197v-606q51 72 126.5 110t176.5 38q200 0 312 -160t112 -421v-21q0 -234 -112.5 -377.5t-309.5 -143.5q-107 0 -186 41.5t-131 122.5l-24 -143h-161zM340 309q38 -80 99.5 -125t155.5 -45q139 0 207 99t68 262v21q0 186 -68.5 303.5t-208.5 117.5 q-91 0 -153.5 -44.5t-99.5 -119.5v-469z" />
+<glyph unicode="c" horiz-adv-x="1087" d="M97 520v42q0 231 125.5 385.5t360.5 154.5q191 0 311 -112q117 -108 116 -265v-10l-2 -6h-178q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h177l2 -6v-10q-1 -134 -125 -238 q-130 -108 -301 -109q-236 0 -361 154t-125 387z" />
+<glyph unicode="d" d="M98 500v21q0 261 111.5 421t312.5 160q95 0 168.5 -35t125.5 -102v595h197v-1560h-161l-23 133q-53 -76 -130 -115t-179 -39q-198 0 -310 143.5t-112 377.5zM295 500q0 -164 67 -262.5t208 -98.5q88 0 148 40t98 112v505q-38 67 -98.5 106.5t-145.5 39.5 q-142 0 -209.5 -117t-67.5 -304v-21z" />
+<glyph unicode="e" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM307 654l2 -5h499v26q0 116 -62 194t-184 78 q-99 0 -169 -83.5t-86 -209.5z" />
+<glyph unicode="f" horiz-adv-x="707" d="M56 936v146h169v137q0 173 90.5 267.5t252.5 94.5q34 0 68.5 -5.5t76.5 -15.5l-24 -150q-18 4 -43.5 7t-53.5 3q-86 0 -128 -51.5t-42 -149.5v-137h225v-146h-225v-936h-197v936h-169z" />
+<glyph unicode="g" d="M100 500v21q0 261 114 421t315 160q103 0 181 -41.5t130 -119.5l24 141h157v-1088q0 -208 -121 -319.5t-349 -111.5q-78 0 -168.5 21.5t-159.5 58.5l50 153q53 -30 128 -48.5t148 -18.5q144 0 209.5 65.5t65.5 199.5v122q-53 -68 -127 -102.5t-170 -34.5q-199 0 -313 144 t-114 377zM297 500q0 -163 69 -262t210 -99q89 0 149 40.5t99 114.5v498q-38 69 -99 109.5t-147 40.5q-141 0 -211 -118t-70 -303v-21z" />
+<glyph unicode="h" d="M143 0v1560h197v-623q56 78 137.5 121.5t180.5 43.5q173 0 269.5 -104t96.5 -320v-678h-197v680q0 134 -57.5 198t-171.5 64q-82 0 -148.5 -38.5t-109.5 -104.5v-799h-197z" />
+<glyph unicode="i" horiz-adv-x="516" d="M159 0v1082h197v-1082h-197zM159 1359v201h197v-201h-197z" />
+<glyph unicode="j" horiz-adv-x="530" d="M-66 -419l14 155q14 -5 40 -8.5t43 -3.5q65 0 103.5 44t38.5 143v1171h197v-1171q0 -167 -86 -257.5t-239 -90.5q-31 0 -56.5 4.5t-54.5 13.5zM167 1363v197h197v-197h-197z" />
+<glyph unicode="k" horiz-adv-x="1050" d="M144 0v1560h197v-904h126l296 426h236l-370 -492l423 -590h-232l-351 499h-128v-499h-197z" />
+<glyph unicode="l" horiz-adv-x="516" d="M159 0v1560h197v-1560h-197z" />
+<glyph unicode="m" horiz-adv-x="1790" d="M143 0v1082h176l14 -142q53 77 134.5 119.5t189.5 42.5t185.5 -50t116.5 -150q51 92 135 146t196 54q165 0 261 -113.5t96 -341.5v-647h-197v649q0 160 -55 226.5t-164 66.5q-101 0 -163.5 -70t-73.5 -177v-8v-687h-198v649q0 152 -56.5 222.5t-162.5 70.5 q-90 0 -148 -37t-89 -104v-801h-197z" />
+<glyph unicode="n" d="M143 0v1082h176l14 -161q54 86 135.5 133.5t185.5 47.5q175 0 271 -102.5t96 -316.5v-683h-197v679q0 143 -56.5 203t-172.5 60q-85 0 -150.5 -41t-104.5 -112v-789h-197z" />
+<glyph unicode="o" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="p" d="M143 -416v1498h151l31 -140q53 78 132 119t184 41q201 0 312.5 -159.5t111.5 -421.5v-21q0 -234 -112 -377.5t-309 -143.5q-100 0 -175.5 33.5t-128.5 100.5v-529h-197zM340 275q37 -67 97 -104.5t147 -37.5q140 0 212 102.5t72 264.5v21q0 184 -72.5 302.5t-213.5 118.5 q-85 0 -145 -38.5t-97 -105.5v-523z" />
+<glyph unicode="q" d="M98 500v21q0 261 111.5 421t312.5 160q99 0 174 -37.5t127 -109.5l29 127h150v-1498h-197v518q-52 -61 -123 -92t-162 -31q-198 0 -310 143.5t-112 377.5zM295 500q0 -164 67.5 -265.5t207.5 -101.5q81 0 138.5 36t96.5 101v546q-39 61 -96.5 96t-136.5 35 q-141 0 -209 -119.5t-68 -306.5v-21z" />
+<glyph unicode="r" horiz-adv-x="702" d="M143 0v1082h176l19 -158q46 84 113.5 131t155.5 47q22 0 42 -3.5t33 -7.5l-27 -183l-101 6q-78 0 -131.5 -37t-82.5 -104v-773h-197z" />
+<glyph unicode="s" horiz-adv-x="1071" d="M109 329l2 6h188q5 -105 78 -153.5t171 -48.5q105 0 164.5 42.5t59.5 111.5q0 65 -49.5 107t-187.5 73q-197 43 -296.5 116.5t-99.5 200.5q0 132 112 225t292 93q189 0 301 -97q107 -93 106 -224v-12l-2 -6h-188q0 71 -59.5 127.5t-157.5 56.5q-105 0 -156 -46t-51 -111 q0 -64 45 -101t183 -66q205 -44 305 -119.5t100 -202.5q0 -144 -116.5 -233t-304.5 -89q-207 0 -326 105q-113 100 -113 232v13z" />
+<glyph unicode="t" horiz-adv-x="708" d="M34 936v146h172v261h197v-261h205v-146h-205v-657q0 -76 31.5 -107t83.5 -31q17 0 37.5 4t36.5 10l26 -135q-22 -18 -64.5 -29.5t-85.5 -11.5q-120 0 -191 72.5t-71 227.5v657h-172z" />
+<glyph unicode="u" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352z" />
+<glyph unicode="v" horiz-adv-x="1030" d="M46 1082h202l256 -763l17 -76h6l19 76l249 763h201l-398 -1082h-149z" />
+<glyph unicode="w" horiz-adv-x="1550" d="M45 1082h196l179 -688l23 -131h6l28 131l216 688h158l217 -688l31 -146h6l29 146l170 688h196l-314 -1082h-159l-209 659l-45 184l-6 -1l-43 -183l-206 -659h-159z" />
+<glyph unicode="x" horiz-adv-x="1030" d="M46 0l361 547l-351 535h227l227 -399l230 399h230l-351 -535l361 -547h-226l-240 409l-240 -409h-228z" />
+<glyph unicode="y" horiz-adv-x="1030" d="M26 1082h220l228 -681l35 -136h6l266 817h219l-455 -1248q-41 -109 -117.5 -190t-206.5 -81q-24 0 -61 5.5t-57 10.5l20 155q-6 1 35.5 -2t52.5 -3q63 0 103 56t67 124l47 113z" />
+<glyph unicode="z" horiz-adv-x="1030" d="M94 0v138l585 788h-578v156h819v-134l-591 -794h625v-154h-860z" />
+<glyph unicode="{" horiz-adv-x="696" d="M63 543v147q106 0 157.5 61.5t51.5 174.5v206q0 171 82 290.5t277 174.5l40 -117q-110 -35 -156 -125.5t-46 -222.5v-206q0 -105 -42.5 -185t-127.5 -125q85 -46 127.5 -126.5t42.5 -183.5v-205q0 -132 46 -221.5t156 -125.5l-40 -118q-195 55 -277 175t-82 290v205 q0 112 -51.5 174.5t-157.5 62.5z" />
+<glyph unicode="|" horiz-adv-x="507" d="M175 -270v1726h158v-1726h-158z" />
+<glyph unicode="}" horiz-adv-x="696" d="M21 -246q109 36 156 125.5t47 221.5v205q0 107 45 187t139 123q-94 41 -139 121t-45 189v206q0 132 -47 222.5t-156 125.5l41 117q194 -55 276.5 -174.5t82.5 -290.5v-206q0 -113 50.5 -174.5t158.5 -61.5v-147q-108 0 -158.5 -62.5t-50.5 -174.5v-205q0 -170 -82.5 -290 t-276.5 -175z" />
+<glyph unicode="~" horiz-adv-x="1391" d="M128 474q0 136 85.5 232.5t217.5 96.5q88 0 163 -34.5t160 -104.5q58 -51 106 -74t100 -23q66 0 114.5 57t48.5 134l141 -18q0 -137 -87 -238t-217 -101q-90 0 -163.5 33t-158.5 107q-59 48 -108 72t-99 24q-67 0 -114.5 -53t-47.5 -128z" />
+<glyph unicode="¡" horiz-adv-x="507" d="M144 -374v978h197v-978h-197zM144 876v206h197v-206h-197z" />
+<glyph unicode="¢" horiz-adv-x="1122" d="M107 520v42q0 199 95 344.5t276 183.5v228h198v-223q157 -24 252.5 -130.5t92.5 -250.5l-2 -5h-179q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h178l3 -6q3 -122 -98 -223t-247 -126v-232 h-198v236q-182 36 -276.5 182t-94.5 347z" />
+<glyph unicode="£" horiz-adv-x="1194" d="M70 615v155h158l-10 270q0 204 112 320.5t300 116.5q200 0 310 -104.5t106 -276.5l-2 -6h-190q0 118 -63 175t-161 57q-99 0 -157 -74.5t-58 -207.5l10 -270h418v-155h-413l6 -149q0 -90 -15.5 -171.5t-44.5 -140.5h735l-1 -154h-976v154h10q48 13 72 111t24 201l-6 149 h-164z" />
+<glyph unicode="¤" horiz-adv-x="1456" d="M104 112l138 140q-50 76 -76.5 166.5t-26.5 189.5q0 102 28.5 196t82.5 172l-146 149l139 139l143 -146q74 55 163 85.5t185 30.5q97 0 186 -31t164 -87l146 149l140 -140l-150 -153q52 -78 80.5 -170.5t28.5 -193.5q0 -98 -26.5 -187.5t-74.5 -165.5l142 -143l-140 -139 l-133 135q-77 -62 -169.5 -95t-193.5 -33t-193.5 32.5t-167.5 93.5l-130 -132zM321 608q0 -188 120.5 -320.5t292.5 -132.5q170 0 290.5 132.5t120.5 320.5q0 186 -120.5 318t-290.5 132q-172 0 -292.5 -132t-120.5 -318z" />
+<glyph unicode="¥" horiz-adv-x="1243" d="M30 1456h226l359 -663l360 663h224l-418 -718h312v-155h-383v-135h383v-155h-383v-293h-197v293h-375v155h375v135h-375v155h311z" />
+<glyph unicode="¦" horiz-adv-x="499" d="M145 -270v792h197v-792h-197zM145 698v758h197v-758h-197z" />
+<glyph unicode="§" horiz-adv-x="1259" d="M94 551q0 91 47 161.5t134 111.5q-68 50 -102 119.5t-34 166.5q0 166 134 266.5t358 100.5q233 0 363 -111.5t126 -313.5l-3 -6h-188q0 118 -79 197t-219 79q-145 0 -220 -59.5t-75 -150.5q0 -99 67 -148.5t278 -107.5q244 -69 355.5 -159.5t111.5 -265.5q0 -94 -48 -164 t-135 -110q69 -51 104 -119t35 -166q0 -172 -133 -269.5t-358 -97.5q-221 0 -372 102.5t-146 322.5l2 6l188 2q0 -143 96.5 -210.5t231.5 -67.5q137 0 215.5 59.5t78.5 150.5t-72 141.5t-276 113.5q-239 63 -352 156t-113 270zM291 553q0 -100 68 -151.5t278 -110.5 q56 -17 93 -28t70 -23q72 20 112 69.5t40 118.5q0 91 -73.5 144.5t-275.5 116.5q-47 12 -88.5 24.5t-77.5 27.5q-73 -19 -109.5 -69t-36.5 -119z" />
+<glyph unicode="¨" horiz-adv-x="1021" d="M170 1256v200h219v-200h-219zM640 1256v200h219v-200h-219z" />
+<glyph unicode="©" horiz-adv-x="1604" d="M88 729q0 315 207 531t503 216q295 0 502 -216t207 -531q0 -316 -207.5 -533t-501.5 -217q-296 0 -503 217t-207 533zM209 729q0 -265 171.5 -447t417.5 -182q245 0 417 182t172 447q0 263 -172 444t-417 181q-246 0 -417.5 -181t-171.5 -444zM436 669v119q0 173 94 280 t254 107q157 0 245.5 -79t84.5 -228l-2 -6h-146q0 95 -45.5 138.5t-136.5 43.5q-94 0 -145 -70.5t-51 -184.5v-120q0 -117 51 -187t145 -70q91 0 136 43t45 141h146l2 -6q4 -151 -84 -229.5t-245 -78.5q-160 0 -254 106.5t-94 280.5z" />
+<glyph unicode="ª" horiz-adv-x="917" d="M120 920q0 110 84.5 170t245.5 60h139v52q0 63 -30 97t-88 34q-67 0 -103.5 -27t-36.5 -76l-162 13l-1 6q-6 98 78.5 163t224.5 65q134 0 212 -71t78 -205v-314q0 -50 6 -94t20 -87h-174q-8 21 -13 45t-8 50q-33 -47 -89.5 -78t-133.5 -31q-119 0 -184 61t-65 167z M293 924q0 -45 29 -69t89 -24q51 0 105.5 30t72.5 65v110h-138q-75 0 -116.5 -33t-41.5 -79z" />
+<glyph unicode="«" horiz-adv-x="966" d="M98 507v19l295 389h148l-255 -399l255 -398h-148zM432 507v19l295 389h148l-255 -399l255 -398h-148z" />
+<glyph unicode="¬" horiz-adv-x="1137" d="M127 637v165h835v-427h-198v262h-637z" />
+<glyph unicode="­" horiz-adv-x="561" d="M35 538v154h490v-154h-490z" />
+<glyph unicode="®" horiz-adv-x="1604" d="M88 729q0 315 207 531t503 216q295 0 502 -216t207 -531q0 -316 -207.5 -533t-501.5 -217q-296 0 -503 217t-207 533zM209 729q0 -266 171.5 -447.5t417.5 -181.5q244 0 416 182t172 447q0 264 -171.5 444.5t-416.5 180.5q-246 0 -417.5 -180.5t-171.5 -444.5zM504 316 v850h280q152 0 238.5 -65.5t86.5 -191.5q0 -62 -33 -109t-96 -78q66 -26 95.5 -79t29.5 -128v-56q0 -41 3.5 -73.5t13.5 -53.5v-16h-153q-9 21 -11 61.5t-2 82.5v54q0 72 -33.5 106t-110.5 34h-159v-338h-149zM653 784h152q65 1 110.5 32.5t45.5 87.5q0 73 -39.5 102.5 t-137.5 29.5h-131v-252z" />
+<glyph unicode="¯" horiz-adv-x="950" d="M123 1310v146h721v-146h-721z" />
+<glyph unicode="°" horiz-adv-x="763" d="M128 1216q0 106 76 183.5t181 77.5q103 0 177.5 -77.5t74.5 -183.5q0 -108 -74 -182.5t-178 -74.5q-106 0 -181.5 74.5t-75.5 182.5zM259 1216q0 -55 36.5 -91t89.5 -36q52 0 87.5 36t35.5 91t-36 92.5t-87 37.5q-53 0 -89.5 -37.5t-36.5 -92.5z" />
+<glyph unicode="±" horiz-adv-x="1097" d="M99 702v154h381v411h177v-411h358v-154h-358v-413h-177v413h-381zM136 4v155h835v-155h-835z" />
+<glyph unicode="²" horiz-adv-x="868" d="M119 1240q-6 99 78 169t225 70q135 0 211 -64t76 -180q0 -80 -44.5 -136t-160.5 -161l-153 -135l2 -6h361v-130h-592v130l302 262q69 60 91 97.5t22 79.5q0 50 -28.5 81t-86.5 31q-67 0 -103.5 -32t-36.5 -82h-161z" />
+<glyph unicode="³" horiz-adv-x="876" d="M112 882l1 6h163q0 -46 37.5 -74.5t100.5 -28.5q72 0 114 29.5t42 77.5q0 62 -36.5 90.5t-109.5 28.5h-132v126h132q67 0 99.5 28.5t32.5 80.5q0 43 -36.5 72t-105.5 29q-56 0 -90.5 -24t-34.5 -64h-162l-2 6q-6 94 78.5 153.5t210.5 59.5q145 0 229 -59.5t84 -169.5 q0 -55 -35.5 -100.5t-97.5 -71.5q70 -23 108 -71t38 -116q0 -111 -90 -173t-236 -62q-127 0 -217.5 58t-84.5 169z" />
+<glyph unicode="´" horiz-adv-x="654" d="M131 1211l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="µ" d="M153 -416v1498h196v-642q2 -178 57.5 -242.5t155.5 -64.5q98 0 158.5 36t92.5 106v807h197v-1082h-177l-9 108q-44 -63 -107.5 -96t-146.5 -33q-72 0 -126.5 16.5t-94.5 51.5v-463h-196z" />
+<glyph unicode="¶" horiz-adv-x="1006" d="M63 988q0 207 129.5 337.5t362.5 130.5h281v-1456h-197v520h-84q-233 0 -362.5 129.5t-129.5 338.5z" />
+<glyph unicode="·" horiz-adv-x="540" d="M161 624v212h198v-212h-198z" />
+<glyph unicode="¸" horiz-adv-x="509" d="M119 -326q72 0 116 24.5t44 73.5q0 48 -36 67t-123 26l32 135h140l-12 -52q65 -11 108 -52t43 -121q0 -96 -79 -153t-226 -57z" />
+<glyph unicode="¹" horiz-adv-x="557" d="M95 1320v134l301 23v-812h-174v655h-127z" />
+<glyph unicode="º" horiz-adv-x="933" d="M120 1025v117q0 148 94 241.5t251 93.5q158 0 252 -93.5t94 -241.5v-117q0 -149 -93.5 -241.5t-250.5 -92.5q-158 0 -252.5 92.5t-94.5 241.5zM293 1025q0 -88 44 -140.5t130 -52.5q83 0 127.5 53t44.5 140v117q0 84 -45 137.5t-129 53.5t-128 -53.5t-44 -137.5v-117z " />
+<glyph unicode="»" horiz-adv-x="966" d="M110 152l255 398l-255 399h148l295 -389v-19l-295 -389h-148zM456 152l255 398l-255 399h148l295 -389v-19l-295 -389h-148z" />
+<glyph unicode="¼" horiz-adv-x="1595" d="M184 1319v134l301 23v-812h-174v655h-127zM339 185l711 1138l109 -67l-711 -1138zM785 254l422 547h173v-519h126v-130h-126v-152h-170v152h-417zM967 282h243v310l-6 1l-13 -22z" />
+<glyph unicode="½" horiz-adv-x="1708" d="M184 1319v134l301 23v-812h-174v655h-127zM352 185l711 1138l109 -67l-711 -1138zM930 573q-6 99 78 169t225 70q135 0 211 -64t76 -180q0 -80 -44.5 -136t-160.5 -161l-153 -135l2 -6h361v-130h-592v130l302 262q69 60 91 97.5t22 79.5q0 50 -28.5 81t-86.5 31 q-67 0 -103.5 -32t-36.5 -82h-161z" />
+<glyph unicode="¾" horiz-adv-x="1781" d="M128 883l1 6h163q0 -46 37.5 -74.5t100.5 -28.5q72 0 114 29.5t42 77.5q0 62 -36.5 90.5t-109.5 28.5h-132v126h132q67 0 99.5 28.5t32.5 80.5q0 43 -36.5 72t-105.5 29q-56 0 -90.5 -24t-34.5 -64h-162l-2 6q-6 94 78.5 153.5t210.5 59.5q145 0 229 -59.5t84 -169.5 q0 -55 -35.5 -100.5t-97.5 -71.5q70 -23 108 -71t38 -116q0 -111 -90 -173t-236 -62q-127 0 -217.5 58t-84.5 169zM522 185l711 1138l109 -67l-711 -1138zM974 254l422 547h173v-519h126v-130h-126v-152h-170v152h-417zM1156 282h243v310l-6 1l-13 -22z" />
+<glyph unicode="¿" horiz-adv-x="1013" d="M114 -13q0 127 70 233.5t187 220.5q53 53 65 96t12 135h197q-2 -146 -26 -202t-125 -147q-100 -118 -141.5 -181t-41.5 -150q0 -106 56 -163t162 -57q90 0 154.5 49.5t64.5 145.5h188l3 -6q2 -161 -114.5 -258t-295.5 -97q-198 0 -306.5 100.5t-108.5 280.5zM441 874v209 h206v-209h-206z" />
+<glyph unicode="À" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM378 1820l3 6h230l175 -266h-158zM420 540h490l-240 663h-6z" />
+<glyph unicode="Á" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM420 540h490l-240 663h-6zM613 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="Â" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM356 1601v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160zM420 540h490l-240 663h-6z" />
+<glyph unicode="Ã" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM316 1628q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5zM420 540h490l-240 663h-6z " />
+<glyph unicode="Ä" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM319 1605v200h219v-200h-219zM420 540h490l-240 663h-6zM789 1605v200h219v-200h-219z" />
+<glyph unicode="Å" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM420 540h490l-240 663h-6zM457 1734q0 84 60.5 141t147.5 57q85 0 145 -56.5t60 -141.5q0 -86 -59.5 -140t-145.5 -54q-87 0 -147.5 54t-60.5 140zM560 1734q0 -43 31 -73.5t74 -30.5q42 0 72 29.5 t30 74.5t-30 76t-72 31q-43 0 -74 -31t-31 -76z" />
+<glyph unicode="Æ" horiz-adv-x="1922" d="M-20 0l880 1456h967v-155h-691l20 -466h590v-155h-584l22 -526h705v-154h-895l-15 350h-557l-202 -350h-240zM525 529h447l-31 710l-5 2z" />
+<glyph unicode="Ç" horiz-adv-x="1297" d="M118 598v259q0 269 155.5 444.5t402.5 175.5t393 -131.5t142 -348.5l-2 -6h-189q0 153 -90 242t-254 89q-165 0 -263 -133t-98 -330v-261q0 -199 98 -332t263 -133q164 0 254 88.5t90 244.5h189l2 -6q4 -205 -144 -343t-391 -138q-247 0 -402.5 175t-155.5 444zM581 -334 q72 0 116 24.5t44 73.5q0 48 -36 67t-123 26l32 135h140l-12 -52q65 -11 108 -52t43 -121q0 -96 -79 -153t-226 -57z" />
+<glyph unicode="È" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM303 1820l3 6h230l175 -266h-158z" />
+<glyph unicode="É" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM538 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="Ê" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM322 1601v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="Ë" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM284 1605v200h219v-200h-219zM754 1605v200h219v-200h-219z" />
+<glyph unicode="Ì" horiz-adv-x="579" d="M-34 1820l3 6h230l175 -266h-158zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="Í" horiz-adv-x="579" d="M190 0v1456h198v-1456h-198zM199 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="Î" horiz-adv-x="579" d="M-15 1601v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="Ï" horiz-adv-x="579" d="M-53 1605v200h219v-200h-219zM190 0v1456h198v-1456h-198zM417 1605v200h219v-200h-219z" />
+<glyph unicode="Ð" horiz-adv-x="1379" d="M42 663v155h168v638h447q286 0 459 -175.5t173 -453.5v-199q0 -279 -173 -453.5t-459 -174.5h-447v663h-168zM407 154h250q202 0 318.5 133t116.5 341v201q0 206 -116.5 339t-318.5 133h-250v-483h276v-155h-276v-509z" />
+<glyph unicode="Ñ" horiz-adv-x="1461" d="M180 0v1456h197l701 -1124l6 2v1122h197v-1456h-197l-701 1126l-6 -2v-1124h-197zM381 1628q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5z" />
+<glyph unicode="Ò" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM373 1841l3 6h230l175 -266h-158z" />
+<glyph unicode="Ó" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM608 1577l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="Ô" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM392 1622v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="Õ" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM351 1649q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5z" />
+<glyph unicode="Ö" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM354 1626v200h219v-200h-219zM824 1626v200h219v-200h-219z" />
+<glyph unicode="×" horiz-adv-x="1096" d="M88 351l327 334l-327 334l126 126l326 -333l327 333l126 -126l-328 -334l328 -334l-126 -126l-327 332l-326 -332z" />
+<glyph unicode="Ø" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q94 0 178.5 -25.5t156.5 -71.5l81 137h149l-132 -221q77 -84 119.5 -197t42.5 -242v-259q0 -267 -165.5 -443t-429.5 -176q-85 0 -160.5 20.5t-139.5 60.5l-91 -154h-149l139 234q-84 84 -128.5 202t-44.5 256zM310 598 q0 -85 19 -158t54 -125l6 -1l544 916q-50 41 -112 63t-134 22q-172 0 -274.5 -128t-102.5 -328v-261zM475 208q44 -34 97 -51t115 -17q183 0 290.5 127.5t107.5 330.5v261q0 75 -16.5 142t-46.5 117l-6 1z" />
+<glyph unicode="Ù" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM372 1820l3 6h230l175 -266h-158z" />
+<glyph unicode="Ú" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM607 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="Û" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM391 1601v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="Ü" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM353 1605v200h219v-200h-219zM823 1605v200h219v-200h-219z" />
+<glyph unicode="Ý" horiz-adv-x="1250" d="M20 1456h225l380 -740l380 740h225l-511 -944v-512h-196v525zM535 1555l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="Þ" horiz-adv-x="1209" d="M163 0v1456h197v-293h269q232 0 362 -118t130 -307q0 -190 -130 -307.5t-362 -117.5h-269v-313h-197zM360 467h269q147 0 220.5 78t73.5 191q0 114 -73.5 193.5t-220.5 79.5h-269v-542z" />
+<glyph unicode="ß" horiz-adv-x="1221" d="M137 0v1082q0 223 117.5 348t300.5 125q161 0 262 -86t101 -253q0 -118 -64.5 -228t-64.5 -167q0 -82 173.5 -224t173.5 -281q0 -167 -104.5 -252t-282.5 -85q-84 0 -172.5 20.5t-125.5 50.5l44 159q43 -28 108 -52t126 -24q108 0 159 47.5t51 125.5q0 84 -173.5 227.5 t-173.5 289.5q0 80 70.5 190.5t70.5 186.5q0 93 -51 147t-117 54q-104 0 -168 -83.5t-64 -235.5v-1082h-196z" />
+<glyph unicode="à" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM230 1498l3 6h230l175 -266h-158zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141z" />
+<glyph unicode="á" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141zM465 1234l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="â" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM249 1279v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141z" />
+<glyph unicode="ã" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM208 1306q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5zM303 300q0 -72 45 -114t133 -42q107 0 193 55 t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141z" />
+<glyph unicode="ä" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM211 1283v200h219v-200h-219zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141zM681 1283v200h219v-200h-219z" />
+<glyph unicode="å" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141zM346 1412q0 84 60.5 141t147.5 57q85 0 145 -56.5t60 -141.5q0 -86 -59.5 -140t-145.5 -54q-87 0 -147.5 54t-60.5 140z M449 1412q0 -43 31 -73.5t74 -30.5q42 0 72 29.5t30 74.5t-30 76t-72 31q-43 0 -74 -31t-31 -76z" />
+<glyph unicode="æ" horiz-adv-x="1729" d="M58 304q0 158 115 244.5t335 86.5h229v85q0 106 -51.5 166.5t-149.5 60.5q-103 0 -164 -55t-61 -133l-188 18l-2 6q-5 138 109.5 228.5t305.5 90.5q114 0 201.5 -40.5t137.5 -117.5q64 75 151.5 116.5t188.5 41.5q214 0 329.5 -130t115.5 -358v-119h-709l-2 -5 q1 -159 79.5 -258t233.5 -99q103 0 169.5 27.5t144.5 78.5l67 -138q-53 -44 -147 -83t-234 -39q-136 0 -240 48.5t-170 138.5q-56 -79 -167.5 -133t-271.5 -54q-170 0 -262.5 87t-92.5 238zM255 300q0 -74 50 -120.5t147 -46.5q76 0 159 43.5t126 100.5v216h-227 q-120 0 -187.5 -56t-67.5 -137zM953 645l2 -5h508v31q0 122 -60 199t-188 77q-113 0 -182 -84.5t-80 -217.5z" />
+<glyph unicode="ç" horiz-adv-x="1087" d="M97 520v42q0 231 125.5 385.5t360.5 154.5q190 0 310.5 -112t116.5 -275l-2 -6h-178q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h177l2 -6q5 -140 -124.5 -248.5t-301.5 -108.5 q-236 0 -361 154t-125 387zM440 -334q72 0 116 24.5t44 73.5q0 48 -36 67t-123 26l32 135h140l-12 -52q65 -11 108 -52t43 -121q0 -96 -79 -153t-226 -57z" />
+<glyph unicode="è" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM233 1499l3 6h230l175 -266h-158zM307 654l2 -5 h499v26q0 116 -62 194t-184 78q-99 0 -169 -83.5t-86 -209.5z" />
+<glyph unicode="é" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM307 654l2 -5h499v26q0 116 -62 194t-184 78 q-99 0 -169 -83.5t-86 -209.5zM468 1235l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="ê" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM252 1280v26l246 237h120l248 -238v-25h-161 l-147 148l-146 -148h-160zM307 654l2 -5h499v26q0 116 -62 194t-184 78q-99 0 -169 -83.5t-86 -209.5z" />
+<glyph unicode="ë" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM214 1284v200h219v-200h-219zM307 654l2 -5h499 v26q0 116 -62 194t-184 78q-99 0 -169 -83.5t-86 -209.5zM684 1284v200h219v-200h-219z" />
+<glyph unicode="ì" horiz-adv-x="515" d="M-71 1477l3 6h230l175 -266h-158zM153 0v1082h197v-1082h-197z" />
+<glyph unicode="í" horiz-adv-x="515" d="M153 0v1082h197v-1082h-197zM162 1213l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="î" horiz-adv-x="515" d="M-52 1258v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160zM153 0v1082h197v-1082h-197z" />
+<glyph unicode="ï" horiz-adv-x="515" d="M-90 1262v200h219v-200h-219zM153 0v1082h197v-1082h-197zM380 1262v200h219v-200h-219z" />
+<glyph unicode="ð" horiz-adv-x="1202" d="M72 466q0 228 138 370t351 142q90 0 169.5 -37t131.5 -97l4 5q-9 109 -51.5 197t-110.5 154l-290 -165l-77 102l256 146q-39 22 -80.5 39t-85.5 31l60 164q79 -19 151 -52t135 -79l218 125l77 -102l-195 -112q95 -104 147 -241.5t52 -300.5v-220q0 -245 -144 -400.5 t-359 -155.5q-218 0 -357.5 140t-139.5 347zM269 466q0 -132 82 -232.5t222 -100.5q133 0 217.5 114t84.5 288v148q-35 59 -115.5 99.5t-198.5 40.5q-131 0 -211.5 -104t-80.5 -253z" />
+<glyph unicode="ñ" d="M143 0v1082h176l14 -161q54 86 135.5 133.5t185.5 47.5q175 0 271 -102.5t96 -316.5v-683h-197v679q0 143 -56.5 203t-172.5 60q-85 0 -150.5 -41t-104.5 -112v-789h-197zM231 1306q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32 q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5z" />
+<glyph unicode="ò" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM257 1498l3 6h230l175 -266h-158zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113 q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="ó" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z M492 1234l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="ô" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM276 1279v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22 q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="õ" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM235 1306q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5 t-128 46.5q-43 0 -72 -32.5t-29 -78.5zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="ö" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM238 1283v200h219v-200h-219zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113 q-141 0 -213.5 -113t-72.5 -283v-22zM708 1283v200h219v-200h-219z" />
+<glyph unicode="÷" horiz-adv-x="1170" d="M71 597v188h998v-188h-998zM472 180v203h198v-203h-198zM472 999v203h198v-203h-198z" />
+<glyph unicode="ø" d="M97 529v22q0 240 130 395.5t353 155.5q56 0 107.5 -11t97.5 -31l74 149h129l-104 -211q88 -74 135 -190t47 -257v-22q0 -242 -130 -396t-354 -154q-51 0 -97 8.5t-88 24.5l-72 -147h-129l100 204q-96 71 -147.5 191t-51.5 269zM294 529q0 -91 20 -166.5t61 -123.5h6 l332 674q-29 16 -62.5 25t-70.5 9q-141 0 -213.5 -113t-72.5 -283v-22zM469 156q24 -12 52 -17.5t61 -5.5q141 0 214 112t73 284v22q0 80 -17.5 150.5t-49.5 117.5h-6z" />
+<glyph unicode="ù" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM255 1477l3 6h230l175 -266h-158z" />
+<glyph unicode="ú" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM490 1213l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="û" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM274 1258v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="ü" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM236 1262v200h219v-200h-219zM706 1262v200h219v-200h-219z" />
+<glyph unicode="ý" horiz-adv-x="1030" d="M26 1082h220l228 -681l35 -136h6l266 817h219l-455 -1248q-41 -109 -117.5 -190t-206.5 -81q-24 0 -61 5.5t-57 10.5l20 155q-6 1 35.5 -2t52.5 -3q63 0 103 56t67 124l47 113zM424 1213l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="þ" horiz-adv-x="1186" d="M153 -416v1976h197v-598q53 68 128 104t173 36q201 0 312.5 -159.5t111.5 -421.5v-21q0 -234 -112 -377.5t-309 -143.5q-100 0 -175.5 33.5t-128.5 100.5v-529h-197zM350 275q37 -67 97 -104.5t147 -37.5q140 0 212 102.5t72 264.5v21q0 184 -72.5 302.5t-213.5 118.5 q-85 0 -145 -38.5t-97 -105.5v-523z" />
+<glyph unicode="ÿ" horiz-adv-x="1030" d="M26 1082h220l228 -681l35 -136h6l266 817h219l-455 -1248q-41 -109 -117.5 -190t-206.5 -81q-24 0 -61 5.5t-57 10.5l20 155q-6 1 35.5 -2t52.5 -3q63 0 103 56t67 124l47 113zM170 1262v200h219v-200h-219zM640 1262v200h219v-200h-219z" />
+<glyph unicode="Ā" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM303 1640v146h721v-146h-721zM420 540h490l-240 663h-6z" />
+<glyph unicode="ā" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM200 1318v146h721v-146h-721zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141z" />
+<glyph unicode="Ă" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM369 1864l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM420 540h490l-240 663h-6z" />
+<glyph unicode="ă" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM261 1542l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141 z" />
+<glyph unicode="Ą" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM420 540h490l-240 663h-6zM962 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5 q-95 0 -155.5 55t-60.5 154z" />
+<glyph unicode="ą" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141zM667 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5 l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154z" />
+<glyph unicode="Ć" horiz-adv-x="1297" d="M118 598v259q0 269 155.5 444.5t402.5 175.5t393 -131.5t142 -348.5l-2 -6h-189q0 153 -90 242t-254 89q-165 0 -263 -133t-98 -330v-261q0 -199 98 -332t263 -133q164 0 254 88.5t90 244.5h189l2 -6q4 -205 -144 -343t-391 -138q-247 0 -402.5 175t-155.5 444zM588 1577 l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="ć" horiz-adv-x="1087" d="M97 520v42q0 231 125.5 385.5t360.5 154.5q190 0 310.5 -112t116.5 -275l-2 -6h-178q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h177l2 -6q5 -140 -124.5 -248.5t-301.5 -108.5 q-236 0 -361 154t-125 387zM447 1234l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="Ĉ" horiz-adv-x="1297" d="M118 598v259q0 269 155.5 444.5t402.5 175.5t393 -131.5t142 -348.5l-2 -6h-189q0 153 -90 242t-254 89q-165 0 -263 -133t-98 -330v-261q0 -199 98 -332t263 -133q164 0 254 88.5t90 244.5h189l2 -6q4 -205 -144 -343t-391 -138q-247 0 -402.5 175t-155.5 444zM372 1622 v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="ĉ" horiz-adv-x="1087" d="M97 520v42q0 231 125.5 385.5t360.5 154.5q190 0 310.5 -112t116.5 -275l-2 -6h-178q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h177l2 -6q5 -140 -124.5 -248.5t-301.5 -108.5 q-236 0 -361 154t-125 387zM231 1279v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="Ċ" horiz-adv-x="1297" d="M118 598v259q0 269 155.5 444.5t402.5 175.5t393 -131.5t142 -348.5l-2 -6h-189q0 153 -90 242t-254 89q-165 0 -263 -133t-98 -330v-261q0 -199 98 -332t263 -133q164 0 254 88.5t90 244.5h189l2 -6q4 -205 -144 -343t-391 -138q-247 0 -402.5 175t-155.5 444zM569 1625 v201h218v-201h-218z" />
+<glyph unicode="ċ" horiz-adv-x="1087" d="M97 520v42q0 231 125.5 385.5t360.5 154.5q190 0 310.5 -112t116.5 -275l-2 -6h-178q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h177l2 -6q5 -140 -124.5 -248.5t-301.5 -108.5 q-236 0 -361 154t-125 387zM428 1282v201h218v-201h-218z" />
+<glyph unicode="Č" horiz-adv-x="1297" d="M118 598v259q0 269 155.5 444.5t402.5 175.5t393 -131.5t142 -348.5l-2 -6h-189q0 153 -90 242t-254 89q-165 0 -263 -133t-98 -330v-261q0 -199 98 -332t263 -133q164 0 254 88.5t90 244.5h189l2 -6q4 -205 -144 -343t-391 -138q-247 0 -402.5 175t-155.5 444zM364 1866 v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="č" horiz-adv-x="1087" d="M97 520v42q0 231 125.5 385.5t360.5 154.5q190 0 310.5 -112t116.5 -275l-2 -6h-178q0 99 -70 168.5t-177 69.5q-155 0 -221.5 -111.5t-66.5 -273.5v-42q0 -166 66 -276.5t222 -110.5q98 0 172.5 60.5t74.5 148.5h177l2 -6q5 -140 -124.5 -248.5t-301.5 -108.5 q-236 0 -361 154t-125 387zM223 1523v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="Ď" horiz-adv-x="1349" d="M180 0v1456h447q286 0 459 -175.5t173 -453.5v-199q0 -279 -173 -453.5t-459 -174.5h-447zM306 1845v20h166l147 -148l147 148h170v-18l-257 -245h-119zM377 154h250q202 0 318.5 133t116.5 341v201q0 206 -116.5 339t-318.5 133h-250v-1147z" />
+<glyph unicode="ď" horiz-adv-x="1314" d="M98 500v21q0 261 111.5 421t312.5 160q95 0 168.5 -35t125.5 -102v595h197v-1560h-161l-23 133q-53 -76 -130 -115t-179 -39q-198 0 -310 143.5t-112 377.5zM295 500q0 -164 67 -262.5t208 -98.5q88 0 148 40t98 112v505q-38 67 -98.5 106.5t-145.5 39.5 q-142 0 -209.5 -117t-67.5 -304v-21zM1090 1183l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="Đ" horiz-adv-x="1379" d="M42 663v155h168v638h447q286 0 459 -175.5t173 -453.5v-199q0 -279 -173 -453.5t-459 -174.5h-447v663h-168zM407 154h250q202 0 318.5 133t116.5 341v201q0 206 -116.5 339t-318.5 133h-250v-483h276v-155h-276v-509z" />
+<glyph unicode="đ" horiz-adv-x="1194" d="M98 500v21q0 261 111.5 421t312.5 160q95 0 168.5 -35t125.5 -102v266h-247v155h247v174h197v-174h197v-155h-197v-1231h-161l-23 133q-53 -76 -130 -115t-179 -39q-198 0 -310 143.5t-112 377.5zM295 500q0 -164 67 -262.5t208 -98.5q88 0 148 40t98 112v505 q-38 67 -98.5 106.5t-145.5 39.5q-142 0 -209.5 -117t-67.5 -304v-21z" />
+<glyph unicode="Ē" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM273 1640v146h721v-146h-721z" />
+<glyph unicode="ē" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM203 1319v146h721v-146h-721zM307 654l2 -5h499 v26q0 116 -62 194t-184 78q-99 0 -169 -83.5t-86 -209.5z" />
+<glyph unicode="Ĕ" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM334 1864l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189z" />
+<glyph unicode="ĕ" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM264 1543l2 6h151q0 -66 34 -107t108 -41 q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM307 654l2 -5h499v26q0 116 -62 194t-184 78q-99 0 -169 -83.5t-86 -209.5z" />
+<glyph unicode="Ė" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM519 1604v201h218v-201h-218z" />
+<glyph unicode="ė" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM307 654l2 -5h499v26q0 116 -62 194t-184 78 q-99 0 -169 -83.5t-86 -209.5zM449 1283v201h218v-201h-218z" />
+<glyph unicode="Ę" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM399 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154z " />
+<glyph unicode="ę" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM307 654l2 -5h499v26q0 116 -62 194t-184 78 q-99 0 -169 -83.5t-86 -209.5zM560 -161q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154z" />
+<glyph unicode="Ě" horiz-adv-x="1197" d="M180 0v1456h955v-155h-758v-471h667v-155h-667v-521h769v-154h-966zM314 1845v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="ě" horiz-adv-x="1083" d="M99 520v44q0 231 137.5 384.5t325.5 153.5q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-226 0 -359.5 150.5t-133.5 390.5zM244 1524v20h166l147 -148l147 148h170v-18 l-257 -245h-119zM307 654l2 -5h499v26q0 116 -62 194t-184 78q-99 0 -169 -83.5t-86 -209.5z" />
+<glyph unicode="Ĝ" horiz-adv-x="1396" d="M120 578v300q0 265 159 432t410 167q250 0 393 -123t146 -317l-2 -6h-188q-9 127 -96.5 209t-252.5 82q-167 0 -269 -125t-102 -317v-302q0 -194 114 -319.5t290 -125.5q124 0 203 33t113 75v331h-319v155h516v-534q-52 -80 -180.5 -147t-332.5 -67q-261 0 -431.5 167 t-170.5 432zM362 1622v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="ĝ" d="M100 500v21q0 261 114 421t315 160q103 0 181 -41.5t130 -119.5l24 141h157v-1088q0 -208 -121 -319.5t-349 -111.5q-78 0 -168.5 21.5t-159.5 58.5l50 153q53 -30 128 -48.5t148 -18.5q144 0 209.5 65.5t65.5 199.5v122q-53 -68 -127 -102.5t-170 -34.5q-199 0 -313 144 t-114 377zM258 1279v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160zM297 500q0 -163 69 -262t210 -99q89 0 149 40.5t99 114.5v498q-38 69 -99 109.5t-147 40.5q-141 0 -211 -118t-70 -303v-21z" />
+<glyph unicode="Ğ" horiz-adv-x="1396" d="M120 578v300q0 265 159 432t410 167q250 0 393 -123t146 -317l-2 -6h-188q-9 127 -96.5 209t-252.5 82q-167 0 -269 -125t-102 -317v-302q0 -194 114 -319.5t290 -125.5q124 0 203 33t113 75v331h-319v155h516v-534q-52 -80 -180.5 -147t-332.5 -67q-261 0 -431.5 167 t-170.5 432zM374 1885l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189z" />
+<glyph unicode="ğ" d="M100 500v21q0 261 114 421t315 160q103 0 181 -41.5t130 -119.5l24 141h157v-1088q0 -208 -121 -319.5t-349 -111.5q-78 0 -168.5 21.5t-159.5 58.5l50 153q53 -30 128 -48.5t148 -18.5q144 0 209.5 65.5t65.5 199.5v122q-53 -68 -127 -102.5t-170 -34.5q-199 0 -313 144 t-114 377zM270 1542l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM297 500q0 -163 69 -262t210 -99q89 0 149 40.5t99 114.5v498q-38 69 -99 109.5t-147 40.5q-141 0 -211 -118t-70 -303v-21z" />
+<glyph unicode="Ġ" horiz-adv-x="1396" d="M120 578v300q0 265 159 432t410 167q250 0 393 -123t146 -317l-2 -6h-188q-9 127 -96.5 209t-252.5 82q-167 0 -269 -125t-102 -317v-302q0 -194 114 -319.5t290 -125.5q124 0 203 33t113 75v331h-319v155h516v-534q-52 -80 -180.5 -147t-332.5 -67q-261 0 -431.5 167 t-170.5 432zM559 1625v201h218v-201h-218z" />
+<glyph unicode="ġ" d="M100 500v21q0 261 114 421t315 160q103 0 181 -41.5t130 -119.5l24 141h157v-1088q0 -208 -121 -319.5t-349 -111.5q-78 0 -168.5 21.5t-159.5 58.5l50 153q53 -30 128 -48.5t148 -18.5q144 0 209.5 65.5t65.5 199.5v122q-53 -68 -127 -102.5t-170 -34.5q-199 0 -313 144 t-114 377zM297 500q0 -163 69 -262t210 -99q89 0 149 40.5t99 114.5v498q-38 69 -99 109.5t-147 40.5q-141 0 -211 -118t-70 -303v-21zM455 1282v201h218v-201h-218z" />
+<glyph unicode="Ģ" horiz-adv-x="1396" d="M120 578v300q0 265 159 432t410 167q250 0 393 -123t146 -317l-2 -6h-188q-9 127 -96.5 209t-252.5 82q-167 0 -269 -125t-102 -317v-302q0 -194 114 -319.5t290 -125.5q124 0 203 33t113 75v331h-319v155h516v-534q-52 -80 -180.5 -147t-332.5 -67q-261 0 -431.5 167 t-170.5 432zM521 -494l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="ģ" d="M100 500v21q0 261 114 421t315 160q103 0 181 -41.5t130 -119.5l24 141h157v-1088q0 -208 -121 -319.5t-349 -111.5q-78 0 -168.5 21.5t-159.5 58.5l50 153q53 -30 128 -48.5t148 -18.5q144 0 209.5 65.5t65.5 199.5v122q-53 -68 -127 -102.5t-170 -34.5q-199 0 -313 144 t-114 377zM297 500q0 -163 69 -262t210 -99q89 0 149 40.5t99 114.5v498q-38 69 -99 109.5t-147 40.5q-141 0 -211 -118t-70 -303v-21zM459 1253v148l121 247h97l-21 -257v-138h-197z" />
+<glyph unicode="Ĥ" horiz-adv-x="1461" d="M180 0v1456h197v-658h707v658h197v-1456h-197v643h-707v-643h-197zM415 1601v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="ĥ" d="M143 0v1560h197v-623q56 78 137.5 121.5t180.5 43.5q173 0 269.5 -104t96.5 -320v-678h-197v680q0 134 -57.5 198t-171.5 64q-82 0 -148.5 -38.5t-109.5 -104.5v-799h-197zM203 1600v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="Ħ" horiz-adv-x="1439" d="M31 1024v145h147v287h197v-287h707v287h197v-287h144v-145h-144v-1024h-197v643h-707v-643h-197v1024h-147zM375 798h707v226h-707v-226z" />
+<glyph unicode="ħ" horiz-adv-x="1194" d="M1 1231v155h172v174h197v-174h272v-155h-272v-294q56 78 137.5 121.5t180.5 43.5q173 0 269.5 -104t96.5 -320v-678h-197v680q0 134 -57.5 198t-171.5 64q-82 0 -148.5 -38.5t-109.5 -104.5v-799h-197v1231h-172z" />
+<glyph unicode="Ĩ" horiz-adv-x="579" d="M-56 1628q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="ĩ" horiz-adv-x="515" d="M-93 1285q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5zM153 0v1082h197v-1082h-197z" />
+<glyph unicode="Ī" horiz-adv-x="579" d="M-64 1640v146h721v-146h-721zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="ī" horiz-adv-x="515" d="M-101 1299v146h721v-146h-721zM153 0v1082h197v-1082h-197z" />
+<glyph unicode="Ĭ" horiz-adv-x="579" d="M-3 1864l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="ĭ" horiz-adv-x="515" d="M-40 1521l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM153 0v1082h197v-1082h-197z" />
+<glyph unicode="Į" horiz-adv-x="579" d="M46 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="į" horiz-adv-x="516" d="M14 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154zM159 0v1082h197v-1082h-197zM159 1359v201h197v-201h-197z" />
+<glyph unicode="İ" horiz-adv-x="579" d="M180 1604v201h218v-201h-218zM190 0v1456h198v-1456h-198z" />
+<glyph unicode="ı" horiz-adv-x="515" d="M153 0v1082h197v-1082h-197z" />
+<glyph unicode="IJ" horiz-adv-x="1709" d="M190 0v1456h198v-1456h-198zM645 395l2 6h189q0 -135 68.5 -201.5t193.5 -66.5q109 0 178 73.5t69 196.5v1053h197v-1053q0 -195 -123.5 -309.5t-320.5 -114.5q-210 0 -334 106.5t-119 309.5z" />
+<glyph unicode="ij" horiz-adv-x="1046" d="M159 0v1082h197v-1082h-197zM159 1359v201h197v-201h-197zM450 -419l14 155q14 -5 40 -8.5t43 -3.5q65 0 103.5 44t38.5 143v1171h197v-1171q0 -167 -86 -257.5t-239 -90.5q-31 0 -56.5 4.5t-54.5 13.5zM683 1363v197h197v-197h-197z" />
+<glyph unicode="Ĵ" horiz-adv-x="1130" d="M66 395l2 6h189q0 -135 68.5 -201.5t193.5 -66.5q109 0 178 73.5t69 196.5v1053h197v-1053q0 -195 -123.5 -309.5t-320.5 -114.5q-210 0 -334 106.5t-119 309.5zM550 1589v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="ĵ" horiz-adv-x="523" d="M-68 -419l14 150q14 -5 46.5 -9t50.5 -4q59 0 93.5 51.5t34.5 141.5v1171h197v-1171q0 -167 -86 -257.5t-239 -90.5q-31 0 -56.5 4.5t-54.5 13.5zM-34 1240v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="Ķ" horiz-adv-x="1317" d="M180 0v1456h197v-644h152l521 644h218l3 -5l-565 -699l606 -747l-3 -5h-235l-527 657h-170v-657h-197zM487 -477l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="ķ" horiz-adv-x="1050" d="M144 0v1560h197v-904h126l296 426h236l-370 -492l423 -590h-232l-351 499h-128v-499h-197zM388 -475l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="ĸ" horiz-adv-x="1144" d="M153 0v1082h197v-457h84l388 457h231l2 -5l-450 -514l483 -558l-2 -5h-241l-394 459h-101v-459h-197z" />
+<glyph unicode="Ĺ" horiz-adv-x="1106" d="M180 0v1456h197v-1302h689v-154h-886zM186 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="ĺ" horiz-adv-x="516" d="M159 0v1560h197v-1560h-197zM168 1594l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="Ļ" horiz-adv-x="1106" d="M180 0v1456h197v-1302h689v-154h-886zM480 -475l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="ļ" horiz-adv-x="516" d="M110 -475l61 246v131h158v-140l-122 -237h-97zM159 0v1560h197v-1560h-197z" />
+<glyph unicode="Ľ" horiz-adv-x="1106" d="M180 0v1456h197v-1302h689v-154h-886zM583 1080l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="ľ" horiz-adv-x="666" d="M159 0v1560h197v-1560h-197zM453 1183l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="Ŀ" horiz-adv-x="1106" d="M180 0v1456h197v-1302h689v-154h-886zM613 688v201h218v-201h-218z" />
+<glyph unicode="ŀ" horiz-adv-x="736" d="M159 0v1560h197v-1560h-197zM485 671v201h218v-201h-218z" />
+<glyph unicode="Ł" horiz-adv-x="1077" d="M40 576v166l123 39v675h197v-613l269 86v-166l-269 -86v-523h689v-154h-886v615z" />
+<glyph unicode="ł" horiz-adv-x="558" d="M37 578v165l142 54v763h197v-688l150 58v-165l-150 -58v-707h-197v632z" />
+<glyph unicode="Ń" horiz-adv-x="1461" d="M180 0v1456h197l701 -1124l6 2v1122h197v-1456h-197l-701 1126l-6 -2v-1124h-197zM638 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="ń" d="M143 0v1082h176l14 -161q54 86 135.5 133.5t185.5 47.5q175 0 271 -102.5t96 -316.5v-683h-197v679q0 143 -56.5 203t-172.5 60q-85 0 -150.5 -41t-104.5 -112v-789h-197zM488 1234l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="Ņ" horiz-adv-x="1461" d="M180 0v1456h197l701 -1124l6 2v1122h197v-1456h-197l-701 1126l-6 -2v-1124h-197zM580 -475l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="ņ" d="M143 0v1082h176l14 -161q54 86 135.5 133.5t185.5 47.5q175 0 271 -102.5t96 -316.5v-683h-197v679q0 143 -56.5 203t-172.5 60q-85 0 -150.5 -41t-104.5 -112v-789h-197zM430 -475l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="Ň" horiz-adv-x="1461" d="M180 0v1456h197l701 -1124l6 2v1122h197v-1456h-197l-701 1126l-6 -2v-1124h-197zM414 1845v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="ň" d="M143 0v1082h176l14 -161q54 86 135.5 133.5t185.5 47.5q175 0 271 -102.5t96 -316.5v-683h-197v679q0 143 -56.5 203t-172.5 60q-85 0 -150.5 -41t-104.5 -112v-789h-197zM264 1523v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="ʼn" d="M-32 1183l61 246v131h158v-140l-122 -237h-97zM143 0v1082h176l14 -161q54 86 135.5 133.5t185.5 47.5q175 0 271 -102.5t96 -316.5v-683h-197v679q0 143 -56.5 203t-172.5 60q-85 0 -150.5 -41t-104.5 -112v-789h-197z" />
+<glyph unicode="Ŋ" horiz-adv-x="1416" d="M161 0v1456h197l701 -1112l6 2v1110h197v-1545q0 -167 -86 -257.5t-240 -90.5q-31 0 -57 4.5t-55 13.5l14 150q13 -5 47 -9t51 -4q60 0 94.5 51.5t34.5 141.5v89l-701 1112l-6 -2v-1110h-197z" />
+<glyph unicode="ŋ" d="M143 0v1082h176l13 -150q54 81 134 125.5t181 44.5q174 0 270 -102.5t96 -316.5v-772q0 -167 -86 -257.5t-240 -90.5q-31 0 -57.5 4.5t-54.5 13.5l14 160q13 -5 46.5 -8.5t51.5 -3.5q61 0 95 47t34 135v768q0 143 -57 203t-173 60q-85 0 -146.5 -33t-99.5 -92v-817h-197z " />
+<glyph unicode="Ō" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM343 1661v146h721v-146h-721z" />
+<glyph unicode="ō" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM227 1318v146h721v-146h-721zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113 q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="Ŏ" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM404 1885l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189z" />
+<glyph unicode="ŏ" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM288 1542l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73q-138 0 -219 73t-76 189zM294 529 q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="Ő" horiz-adv-x="1396" d="M113 598v259q0 266 159.5 443t414.5 177q264 0 429.5 -176.5t165.5 -443.5v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM310 598q0 -202 102.5 -330t274.5 -128q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128 t-102.5 -328v-261zM462 1622l184 266h211l2 -5l-240 -261h-157zM731 1627l241 261h229l3 -6l-300 -260h-171z" />
+<glyph unicode="ő" d="M97 529v22q0 240 130 395.5t353 155.5q225 0 355.5 -155t130.5 -396v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z M346 1279l184 266h211l2 -5l-240 -261h-157zM615 1284l241 261h229l3 -6l-300 -260h-171z" />
+<glyph unicode="Œ" horiz-adv-x="1960" d="M104 576v304q0 265 154.5 431t403.5 166q69 0 140.5 -6t150.5 -15h907v-155h-758v-471h667v-155h-667v-521h769v-154h-918q-92 -10 -157 -15.5t-132 -5.5q-249 0 -404.5 166t-155.5 431zM301 576q0 -214 97 -328t266 -114q61 0 122 4.5t119 13.5v1151q-61 8 -122 13.5 t-121 5.5q-169 0 -265 -113.5t-96 -326.5v-306z" />
+<glyph unicode="œ" horiz-adv-x="1854" d="M97 529v22q0 240 130 395.5t353 155.5q130 0 230 -54.5t164 -152.5q65 97 161.5 152t204.5 55q219 0 331 -132t112 -352v-123h-702l-3 -5q3 -156 79 -256.5t213 -100.5q100 0 175.5 28.5t130.5 78.5l77 -128q-58 -57 -153 -95t-230 -38q-131 0 -232.5 52.5t-166.5 148.5 q-64 -96 -163 -148.5t-226 -52.5q-224 0 -354.5 154.5t-130.5 395.5zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22zM1085 654l2 -5h499v26q0 116 -62 194t-184 78q-99 0 -169 -83.5 t-86 -209.5z" />
+<glyph unicode="Ŕ" horiz-adv-x="1357" d="M180 0v1455h527q239 0 365 -106t126 -308q0 -112 -58.5 -195t-170.5 -132q120 -39 172.5 -126.5t52.5 -216.5v-137q0 -68 15 -122t52 -88v-24h-203q-39 34 -50 100t-11 136v133q0 118 -69 190t-185 72h-366v-631h-197zM377 786h310q167 0 240.5 63.5t73.5 193.5 q0 123 -71.5 190.5t-222.5 67.5h-330v-515zM530 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="ŕ" horiz-adv-x="702" d="M143 0v1082h176l19 -158q46 84 113.5 131t155.5 47q22 0 42 -3.5t33 -7.5l-27 -183l-101 6q-78 0 -131.5 -37t-82.5 -104v-773h-197zM323 1234l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="Ŗ" horiz-adv-x="1357" d="M180 0v1455h527q239 0 365 -106t126 -308q0 -112 -58.5 -195t-170.5 -132q120 -39 172.5 -126.5t52.5 -216.5v-137q0 -68 15 -122t52 -88v-24h-203q-39 34 -50 100t-11 136v133q0 118 -69 190t-185 72h-366v-631h-197zM377 786h310q167 0 240.5 63.5t73.5 193.5 q0 123 -71.5 190.5t-222.5 67.5h-330v-515zM472 -475l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="ŗ" horiz-adv-x="702" d="M107 -475l61 246v131h158v-140l-122 -237h-97zM143 0v1082h176l19 -158q46 84 113.5 131t155.5 47q22 0 42 -3.5t33 -7.5l-27 -183l-101 6q-78 0 -131.5 -37t-82.5 -104v-773h-197z" />
+<glyph unicode="Ř" horiz-adv-x="1357" d="M180 0v1455h527q239 0 365 -106t126 -308q0 -112 -58.5 -195t-170.5 -132q120 -39 172.5 -126.5t52.5 -216.5v-137q0 -68 15 -122t52 -88v-24h-203q-39 34 -50 100t-11 136v133q0 118 -69 190t-185 72h-366v-631h-197zM306 1845v20h166l147 -148l147 148h170v-18 l-257 -245h-119zM377 786h310q167 0 240.5 63.5t73.5 193.5q0 123 -71.5 190.5t-222.5 67.5h-330v-515z" />
+<glyph unicode="ř" horiz-adv-x="702" d="M101 1523v20h166l147 -148l147 148h170v-18l-257 -245h-119zM143 0v1082h176l19 -158q46 84 113.5 131t155.5 47q22 0 42 -3.5t33 -7.5l-27 -183l-101 6q-78 0 -131.5 -37t-82.5 -104v-773h-197z" />
+<glyph unicode="Ś" horiz-adv-x="1277" d="M102 413l2 6h188q0 -140 103 -213t255 -73q149 0 236 63t87 171q0 100 -75 167.5t-266 113.5q-231 55 -360.5 162t-129.5 269q0 170 139.5 284t361.5 114q239 0 380.5 -131t136.5 -304l-2 -6h-188q0 128 -84.5 207t-242.5 79q-147 0 -225.5 -66.5t-78.5 -173.5 q0 -95 85 -158.5t276 -111.5q230 -57 350 -168t120 -275q0 -176 -144 -283t-376 -107q-218 0 -385.5 118t-162.5 316zM523 1577l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="ś" horiz-adv-x="1071" d="M109 329l2 6h188q5 -105 78 -153.5t171 -48.5q105 0 164.5 42.5t59.5 111.5q0 65 -49.5 107t-187.5 73q-197 43 -296.5 116.5t-99.5 200.5q0 132 112 225t292 93q189 0 300.5 -97t106.5 -236l-2 -6h-188q0 71 -59.5 127.5t-157.5 56.5q-105 0 -156 -46t-51 -111 q0 -64 45 -101t183 -66q205 -44 305 -119.5t100 -202.5q0 -144 -116.5 -233t-304.5 -89q-207 0 -326 105t-113 245zM445 1234l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="Ŝ" horiz-adv-x="1277" d="M102 413l2 6h188q0 -140 103 -213t255 -73q149 0 236 63t87 171q0 100 -75 167.5t-266 113.5q-231 55 -360.5 162t-129.5 269q0 170 139.5 284t361.5 114q239 0 380.5 -131t136.5 -304l-2 -6h-188q0 128 -84.5 207t-242.5 79q-147 0 -225.5 -66.5t-78.5 -173.5 q0 -95 85 -158.5t276 -111.5q230 -57 350 -168t120 -275q0 -176 -144 -283t-376 -107q-218 0 -385.5 118t-162.5 316zM307 1622v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="ŝ" horiz-adv-x="1071" d="M109 329l2 6h188q5 -105 78 -153.5t171 -48.5q105 0 164.5 42.5t59.5 111.5q0 65 -49.5 107t-187.5 73q-197 43 -296.5 116.5t-99.5 200.5q0 132 112 225t292 93q189 0 300.5 -97t106.5 -236l-2 -6h-188q0 71 -59.5 127.5t-157.5 56.5q-105 0 -156 -46t-51 -111 q0 -64 45 -101t183 -66q205 -44 305 -119.5t100 -202.5q0 -144 -116.5 -233t-304.5 -89q-207 0 -326 105t-113 245zM229 1279v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="Ş" horiz-adv-x="1277" d="M102 413l2 6h188q0 -140 103 -213t255 -73q149 0 236 63t87 171q0 100 -75 167.5t-266 113.5q-231 55 -360.5 162t-129.5 269q0 170 139.5 284t361.5 114q239 0 380.5 -131t136.5 -304l-2 -6h-188q0 128 -84.5 207t-242.5 79q-147 0 -225.5 -66.5t-78.5 -173.5 q0 -95 85 -158.5t276 -111.5q230 -57 350 -168t120 -275q0 -176 -144 -283t-376 -107q-218 0 -385.5 118t-162.5 316zM516 -334q72 0 116 24.5t44 73.5q0 48 -36 67t-123 26l32 135h140l-12 -52q65 -11 108 -52t43 -121q0 -96 -79 -153t-226 -57z" />
+<glyph unicode="ş" horiz-adv-x="1071" d="M109 329l2 6h188q5 -105 78 -153.5t171 -48.5q105 0 164.5 42.5t59.5 111.5q0 65 -49.5 107t-187.5 73q-197 43 -296.5 116.5t-99.5 200.5q0 132 112 225t292 93q189 0 300.5 -97t106.5 -236l-2 -6h-188q0 71 -59.5 127.5t-157.5 56.5q-105 0 -156 -46t-51 -111 q0 -64 45 -101t183 -66q205 -44 305 -119.5t100 -202.5q0 -144 -116.5 -233t-304.5 -89q-207 0 -326 105t-113 245zM438 -333q72 0 116 24.5t44 73.5q0 48 -36 67t-123 26l32 135h140l-12 -52q65 -11 108 -52t43 -121q0 -96 -79 -153t-226 -57z" />
+<glyph unicode="Š" horiz-adv-x="1277" d="M102 413l2 6h188q0 -140 103 -213t255 -73q149 0 236 63t87 171q0 100 -75 167.5t-266 113.5q-231 55 -360.5 162t-129.5 269q0 170 139.5 284t361.5 114q239 0 380.5 -131t136.5 -304l-2 -6h-188q0 128 -84.5 207t-242.5 79q-147 0 -225.5 -66.5t-78.5 -173.5 q0 -95 85 -158.5t276 -111.5q230 -57 350 -168t120 -275q0 -176 -144 -283t-376 -107q-218 0 -385.5 118t-162.5 316zM299 1866v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="š" horiz-adv-x="1071" d="M109 329l2 6h188q5 -105 78 -153.5t171 -48.5q105 0 164.5 42.5t59.5 111.5q0 65 -49.5 107t-187.5 73q-197 43 -296.5 116.5t-99.5 200.5q0 132 112 225t292 93q189 0 300.5 -97t106.5 -236l-2 -6h-188q0 71 -59.5 127.5t-157.5 56.5q-105 0 -156 -46t-51 -111 q0 -64 45 -101t183 -66q205 -44 305 -119.5t100 -202.5q0 -144 -116.5 -233t-304.5 -89q-207 0 -326 105t-113 245zM221 1523v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="Ţ" horiz-adv-x="1200" d="M34 1301v155h1132v-155h-468v-1301h-197v1301h-467zM455 -475l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="ţ" horiz-adv-x="708" d="M34 936v146h172v261h197v-261h205v-146h-205v-657q0 -76 31.5 -107t83.5 -31q17 0 37.5 4t36.5 10l26 -135q-22 -18 -64.5 -29.5t-85.5 -11.5q-120 0 -191 72.5t-71 227.5v657h-172zM308 -485l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="Ť" horiz-adv-x="1200" d="M34 1301v155h1132v-155h-468v-1301h-197v1301h-467zM289 1844v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="ť" horiz-adv-x="748" d="M34 936v146h172v261h197v-261h205v-146h-205v-657q0 -76 31.5 -107t83.5 -31q17 0 37.5 4t36.5 10l26 -135q-22 -18 -64.5 -29.5t-85.5 -11.5q-120 0 -191 72.5t-71 227.5v657h-172zM545 1210l61 246v131h158v-140l-122 -237h-97z" />
+<glyph unicode="Ŧ" horiz-adv-x="1200" d="M34 1301v155h1132v-155h-468v-326h220v-155h-220v-820h-197v820h-224v155h224v326h-467z" />
+<glyph unicode="ŧ" horiz-adv-x="708" d="M-8 600v155h214v181h-172v146h172v261h197v-261h205v-146h-205v-181h230v-155h-230v-321q0 -76 31.5 -107t83.5 -31q17 0 37.5 4t36.5 10l26 -135q-22 -18 -64.5 -29.5t-85.5 -11.5q-120 0 -191 72.5t-71 227.5v321h-214z" />
+<glyph unicode="Ũ" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM350 1628q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32 q0 -94 -59.5 -159t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5z" />
+<glyph unicode="ũ" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM233 1285q0 93 59 161.5t150 68.5q56 0 140 -47t136 -47q41 0 71 32.5t30 79.5l108 -32q0 -94 -59.5 -159 t-149.5 -65q-71 0 -148 46.5t-128 46.5q-43 0 -72 -32.5t-29 -78.5z" />
+<glyph unicode="Ū" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM342 1640v146h721v-146h-721z" />
+<glyph unicode="ū" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM225 1299v146h721v-146h-721z" />
+<glyph unicode="Ŭ" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM403 1864l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73 q-138 0 -219 73t-76 189z" />
+<glyph unicode="ŭ" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM286 1521l2 6h151q0 -66 34 -107t108 -41q72 0 107 41.5t35 106.5h151l2 -6q4 -116 -77 -189t-218 -73 q-138 0 -219 73t-76 189z" />
+<glyph unicode="Ů" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM488 1734q0 84 60.5 141t147.5 57q85 0 145 -56.5t60 -141.5q0 -86 -59.5 -140t-145.5 -54 q-87 0 -147.5 54t-60.5 140zM591 1734q0 -43 31 -73.5t74 -30.5q42 0 72 29.5t30 74.5t-30 76t-72 31q-43 0 -74 -31t-31 -76z" />
+<glyph unicode="ů" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM371 1391q0 84 60.5 141t147.5 57q85 0 145 -56.5t60 -141.5q0 -86 -59.5 -140t-145.5 -54 q-87 0 -147.5 54t-60.5 140zM474 1391q0 -43 31 -73.5t74 -30.5q42 0 72 29.5t30 74.5t-30 76t-72 31q-43 0 -74 -31t-31 -76z" />
+<glyph unicode="Ű" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM461 1601l184 266h211l2 -5l-240 -261h-157zM730 1606l241 261h229l3 -6l-300 -260h-171z" />
+<glyph unicode="ű" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM344 1258l184 266h211l2 -5l-240 -261h-157zM613 1263l241 261h229l3 -6l-300 -260h-171z" />
+<glyph unicode="Ų" horiz-adv-x="1386" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-987q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5zM493 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66 t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154z" />
+<glyph unicode="ų" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-1082h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352zM675 -223q0 80 60.5 152t187.5 128l72 -57q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24 q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154z" />
+<glyph unicode="Ŵ" horiz-adv-x="1809" d="M54 1456h196l222 -952l27 -182l6 -1l39 183l267 952h174l269 -952l40 -187h6l29 187l217 952h197l-351 -1456h-176l-287 1010l-26 131h-6l-25 -131l-292 -1010h-176zM592 1601v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="ŵ" horiz-adv-x="1550" d="M45 1082h196l179 -688l23 -131h6l28 131l216 688h158l217 -688l31 -146h6l29 146l170 688h196l-314 -1082h-159l-209 659l-45 184l-6 -1l-43 -183l-206 -659h-159zM467 1258v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="Ŷ" horiz-adv-x="1250" d="M20 1456h225l380 -740l380 740h225l-511 -944v-512h-196v525zM319 1600v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="ŷ" horiz-adv-x="1030" d="M26 1082h220l228 -681l35 -136h6l266 817h219l-455 -1248q-41 -109 -117.5 -190t-206.5 -81q-24 0 -61 5.5t-57 10.5l20 155q-6 1 35.5 -2t52.5 -3q63 0 103 56t67 124l47 113zM208 1258v26l246 237h120l248 -238v-25h-161l-147 148l-146 -148h-160z" />
+<glyph unicode="Ÿ" horiz-adv-x="1250" d="M20 1456h225l380 -740l380 740h225l-511 -944v-512h-196v525zM281 1604v200h219v-200h-219zM751 1604v200h219v-200h-219z" />
+<glyph unicode="Ź" horiz-adv-x="1225" d="M97 0v146l778 1155h-767v155h992v-141l-781 -1161h814v-154h-1036zM519 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="ź" horiz-adv-x="1030" d="M94 0v138l585 788h-578v156h819v-134l-591 -794h625v-154h-860zM434 1213l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="Ż" horiz-adv-x="1225" d="M97 0v146l778 1155h-767v155h992v-141l-781 -1161h814v-154h-1036zM500 1604v201h218v-201h-218z" />
+<glyph unicode="ż" horiz-adv-x="1030" d="M94 0v138l585 788h-578v156h819v-134l-591 -794h625v-154h-860zM415 1261v201h218v-201h-218z" />
+<glyph unicode="Ž" horiz-adv-x="1225" d="M97 0v146l778 1155h-767v155h992v-141l-781 -1161h814v-154h-1036zM295 1845v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="ž" horiz-adv-x="1030" d="M94 0v138l585 788h-578v156h819v-134l-591 -794h625v-154h-860zM210 1502v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="ſ" horiz-adv-x="516" d="M159 0v1219q0 173 91 267.5t253 94.5q33 0 67.5 -5.5t76.5 -15.5l-24 -145q-20 5 -42 8t-47 3q-87 0 -132.5 -54.5t-45.5 -152.5v-1219h-197z" />
+<glyph unicode="ƒ" horiz-adv-x="702" d="M-23 -419l14 150q12 -5 45.5 -9t51.5 -4q60 0 94 51.5t34 141.5v1025h-169v146h169v137q0 173 90.5 267.5t252.5 94.5q34 0 68.5 -5.5t76.5 -15.5l-24 -150q-18 4 -43.5 7t-52.5 3q-87 0 -129 -51.5t-42 -149.5v-137h196v-146h-196v-1025q0 -167 -85.5 -257.5 t-239.5 -90.5q-32 0 -58 4.5t-53 13.5z" />
+<glyph unicode="Ơ" horiz-adv-x="1403" d="M108 598v259q0 266 159.5 443t414.5 177q120 0 223 -40t182 -113q123 11 187 96.5t64 232.5h197q0 -192 -88 -313.5t-250 -157.5q38 -71 59 -154t21 -171v-259q0 -267 -165.5 -443t-429.5 -176q-255 0 -414.5 176t-159.5 443zM305 598q0 -202 102.5 -330t274.5 -128 q183 0 290.5 127.5t107.5 330.5v261q0 200 -108 328t-290 128q-172 0 -274.5 -128t-102.5 -328v-261z" />
+<glyph unicode="ơ" horiz-adv-x="1175" d="M97 529v22q0 240 130 395.5t353 155.5q102 0 187 -35t149 -98q82 18 122 84t40 170h178q0 -143 -66.5 -237t-195.5 -126q35 -66 53.5 -144.5t18.5 -164.5v-22q0 -242 -130 -396t-354 -154t-354.5 154.5t-130.5 395.5zM294 529q0 -172 72.5 -284t215.5 -112q141 0 214 112 t73 284v22q0 170 -73.5 283t-215.5 113q-141 0 -213.5 -113t-72.5 -283v-22z" />
+<glyph unicode="Ư" horiz-adv-x="1430" d="M147 469v987h197v-987q0 -165 94 -250.5t248 -85.5q162 0 261.5 85.5t99.5 250.5v987h197v-178l6 -2q86 27 132 108.5t46 206.5h190l3 -5q2 -193 -96 -314.5t-281 -155.5v-647q0 -238 -154.5 -364t-403.5 -126q-240 0 -389.5 126.5t-149.5 363.5z" />
+<glyph unicode="ư" horiz-adv-x="1204" d="M139 444v638h197v-640q0 -173 51 -238t159 -65q105 0 173.5 42.5t103.5 120.5v780h197v-114l6 -2q100 7 142.5 71t42.5 190h169l3 -6q3 -177 -85.5 -273t-277.5 -110v-838h-177l-13 160q-51 -87 -131 -134t-185 -47q-177 0 -276 113t-99 352z" />
+<glyph unicode="ǰ" horiz-adv-x="523" d="M-68 -419l14 150q14 -5 46.5 -9t50.5 -4q59 0 93.5 51.5t34.5 141.5v1171h197v-1171q0 -167 -86 -257.5t-239 -90.5q-31 0 -56.5 4.5t-54.5 13.5zM-42 1484v20h166l147 -148l147 148h170v-18l-257 -245h-119z" />
+<glyph unicode="Ǻ" horiz-adv-x="1326" d="M20 0l563 1456h169l554 -1456h-201l-136 375h-610l-138 -375h-201zM420 540h490l-240 663h-6zM487 1684q0 72 51 119.5t124 47.5q70 0 120 -47.5t50 -119.5t-49.5 -118t-120.5 -46q-73 0 -124 46t-51 118zM575 1684q0 -35 25.5 -59.5t61.5 -24.5q34 0 58.5 24t24.5 60 q0 37 -24.5 62.5t-58.5 25.5q-36 0 -61.5 -25.5t-25.5 -62.5zM615 1900l144 185h199l2 -6l-216 -179h-129z" />
+<glyph unicode="ǻ" horiz-adv-x="1126" d="M106 304q0 155 125.5 242.5t340.5 87.5h214v107q0 95 -58 150.5t-164 55.5q-95 0 -154.5 -48.5t-59.5 -116.5h-188l-2 6q-6 118 111.5 216t303.5 98q184 0 296 -93.5t112 -269.5v-521q0 -58 6 -112t22 -106h-203q-10 49 -15.5 86.5t-6.5 75.5q-55 -78 -143.5 -130.5 t-190.5 -52.5q-169 0 -257.5 86.5t-88.5 238.5zM303 300q0 -72 45 -114t133 -42q107 0 193 55t112 126v176h-221q-119 0 -190.5 -60t-71.5 -141zM383 1362q0 72 51 119.5t124 47.5q70 0 120 -47.5t50 -119.5t-49.5 -118t-120.5 -46q-73 0 -124 46t-51 118zM471 1362 q0 -35 25.5 -59.5t61.5 -24.5q34 0 58.5 24t24.5 60q0 37 -24.5 62.5t-58.5 25.5q-36 0 -61.5 -25.5t-25.5 -62.5zM511 1578l144 185h199l2 -6l-216 -179h-129z" />
+<glyph unicode="Ǽ" horiz-adv-x="1922" d="M-20 0l880 1456h967v-155h-691l20 -466h590v-155h-584l22 -526h705v-154h-895l-15 350h-557l-202 -350h-240zM525 529h447l-31 710l-5 2zM845 1556l185 266h230l2 -6l-270 -260h-147z" />
+<glyph unicode="ǽ" horiz-adv-x="1729" d="M58 304q0 158 115 244.5t335 86.5h229v85q0 106 -51.5 166.5t-149.5 60.5q-103 0 -164 -55t-61 -133l-188 18l-2 6q-5 138 109.5 228.5t305.5 90.5q114 0 201.5 -40.5t137.5 -117.5q64 75 151.5 116.5t188.5 41.5q214 0 329.5 -130t115.5 -358v-119h-709l-2 -5 q1 -159 79.5 -258t233.5 -99q103 0 169.5 27.5t144.5 78.5l67 -138q-53 -44 -147 -83t-234 -39q-136 0 -240 48.5t-170 138.5q-56 -79 -167.5 -133t-271.5 -54q-170 0 -262
<TRUNCATED>
[07/21] ambari git commit: AMBARI-21313 Log Search UI: implement
service for string constants. (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21313 Log Search UI: implement service for string constants. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/72c7400d
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/72c7400d
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/72c7400d
Branch: refs/heads/branch-feature-logsearch-ui
Commit: 72c7400dcfed179524eed0a19747bb409130aaa8
Parents: 607c918
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 22 15:23:30 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:23:30 2017 +0300
----------------------------------------------------------------------
.../ambari-logsearch-web-new/package.json | 8 +++++---
.../src/app/app.component.html | 4 +---
.../src/app/app.component.ts | 7 ++++---
.../src/app/app.module.ts | 21 +++++++++++++++++---
.../app/login-form/login-form.component.html | 12 +++++------
.../src/assets/i18n/en.json | 8 ++++++++
6 files changed, 42 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/72c7400d/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 feccace..bda2556 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/package.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/package.json
@@ -19,13 +19,15 @@
"@angular/platform-browser": "^4.0.0",
"@angular/platform-browser-dynamic": "^4.0.0",
"@angular/router": "^4.0.0",
+ "@ngx-translate/core": "^6.0.1",
+ "@ngx-translate/http-loader": "^0.0.3",
"bootstrap": "^3.3.7",
"core-js": "^2.4.1",
+ "font-awesome": "^4.7.0",
+ "jquery": "^1.12.4",
"ngx-bootstrap": "^1.6.6",
"rxjs": "^5.1.0",
- "zone.js": "^0.8.4",
- "jquery": "^1.12.4",
- "font-awesome": "^4.7.0"
+ "zone.js": "^0.8.4"
},
"devDependencies": {
"@angular/cli": "1.0.0",
http://git-wip-us.apache.org/repos/asf/ambari/blob/72c7400d/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 3ba591e..8d9f6d0 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
@@ -15,7 +15,5 @@
limitations under the License.
-->
-<h1>
- {{title}}
-</h1>
+<h1>{{'common.title' | translate}}</h1>
<login-form *ngIf="!httpClient.isAuthorized"></login-form>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/72c7400d/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 6f88af0..79cdc5d 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 {TranslateService} from '@ngx-translate/core';
import {HttpClientService} from './http-client.service';
@Component({
@@ -27,12 +28,12 @@ import {HttpClientService} from './http-client.service';
export class AppComponent {
- constructor(private httpClient: HttpClientService) {
+ constructor(private httpClient: HttpClientService, private translate: TranslateService) {
+ translate.setDefaultLang('en');
+ translate.use('en');
}
ngOnInit() {
this.httpClient.get('status');
}
-
- title = 'Ambari Log Search';
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/72c7400d/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 39dc46f..2d132e2 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
@@ -19,15 +19,21 @@
import {BrowserModule} from '@angular/platform-browser';
import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {FormsModule} from '@angular/forms';
-import {HttpModule} from '@angular/http';
+import {HttpModule, Http} from '@angular/http';
import {InMemoryWebApiModule} from 'angular-in-memory-web-api';
import {mockApiDataService} from './mock-api-data.service'
import {AlertModule} from 'ngx-bootstrap';
+import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
import {HttpClientService} from './http-client.service';
import {AppComponent} from './app.component';
import {LoginFormComponent} from './login-form/login-form.component';
+export function HttpLoaderFactory(http: Http) {
+ return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
@NgModule({
declarations: [
AppComponent,
@@ -37,8 +43,17 @@ import {LoginFormComponent} from './login-form/login-form.component';
BrowserModule,
FormsModule,
HttpModule,
- InMemoryWebApiModule.forRoot(mockApiDataService),
- AlertModule.forRoot()
+ InMemoryWebApiModule.forRoot(mockApiDataService, {
+ passThruUnknownUrl: true
+ }),
+ AlertModule.forRoot(),
+ TranslateModule.forRoot({
+ loader: {
+ provide: TranslateLoader,
+ useFactory: HttpLoaderFactory,
+ deps: [Http]
+ }
+ })
],
providers: [HttpClientService],
bootstrap: [AppComponent],
http://git-wip-us.apache.org/repos/asf/ambari/blob/72c7400d/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
index 1cad6b3..4b7951a 100644
--- 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
@@ -16,18 +16,18 @@
-->
<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>
+ <div class="alert alert-danger" *ngIf="isLoginAlertDisplayed" [innerHTML]="'authorization.error' | translate"></div>
<form #loginForm="ngForm" (ngSubmit)="login()">
<div class="form-group">
- <label for="username">Username</label>
+ <label for="username">{{'authorization.name' | translate}}</label>
<input class="form-control" type="text" id="username" name="username" required [(ngModel)]="username">
</div>
<div class="form-group">
- <label for="password">Password</label>
+ <label for="password">{{'authorization.password' | translate}}</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>
+ <button class="btn btn-success" [disabled]="!loginForm.form.valid || isRequestInProgress">
+ {{'authorization.signIn' | translate}}
+ </button>
</form>
</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/72c7400d/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json b/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
new file mode 100644
index 0000000..13c3805
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/assets/i18n/en.json
@@ -0,0 +1,8 @@
+{
+ "common.title": "Ambari Log Search",
+
+ "authorization.name": "Username",
+ "authorization.password": "Password",
+ "authorization.signIn": "Sign In",
+ "authorization.error": "<strong>Error!</strong> Invalid User credentials.<br>Please try again."
+}
\ No newline at end of file
[12/21] ambari git commit: AMBARI-21315 Log Search UI: provide data
storage functionality with mock data. (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21315 Log Search UI: provide data storage functionality with mock data. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/603297ae
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/603297ae
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/603297ae
Branch: refs/heads/branch-feature-logsearch-ui
Commit: 603297ae862b633b5e562fe73860674cab2cfe94
Parents: 84a59d7
Author: ababiichuk <ab...@hortonworks.com>
Authored: Wed May 31 19:54:05 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:35:04 2017 +0300
----------------------------------------------------------------------
.../ambari-logsearch-web-new/package.json | 4 +-
.../src/app/app.module.ts | 38 +-
.../src/app/login-form/login-form.component.ts | 2 +-
.../menu-button/menu-button.component.spec.ts | 4 +-
.../app/menu-button/menu-button.component.ts | 4 +-
.../src/app/models/audit-log.model.ts | 46 ++
.../src/app/models/bar-graph.model.ts | 24 +
.../src/app/models/common-entry.model.ts | 22 +
.../src/app/models/count.model.ts | 22 +
.../src/app/models/filter.model.ts | 25 +
.../src/app/models/graph.model.ts | 23 +
.../src/app/models/log.model.ts | 37 +
.../src/app/models/node.model.ts | 29 +
.../src/app/models/service-log.model.ts | 27 +
.../app/models/solr-collection-state.model.ts | 23 +
.../src/app/models/store.model.ts | 95 +++
.../src/app/models/user-config.model.ts | 26 +
.../src/app/services/actions.service.spec.ts | 33 -
.../src/app/services/actions.service.ts | 47 --
.../services/component-actions.service.spec.ts | 33 +
.../app/services/component-actions.service.ts | 47 ++
.../src/app/services/mock-api-data.service.ts | 741 ++++++++++++++++++-
.../app/services/storage/audit-logs.service.ts | 34 +
.../app/services/storage/bar-graphs.service.ts | 34 +
.../src/app/services/storage/filters.service.ts | 34 +
.../src/app/services/storage/graphs.service.ts | 34 +
.../src/app/services/storage/nodes.service.ts | 34 +
.../services/storage/service-logs.service.ts | 34 +
.../services/storage/user-configs.service.ts | 34 +
.../src/tsconfig.app.json | 2 +-
.../ambari-logsearch-web-new/tsconfig.json | 5 +
31 files changed, 1502 insertions(+), 95 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/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 bda2556..0994703 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/package.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/package.json
@@ -19,6 +19,8 @@
"@angular/platform-browser": "^4.0.0",
"@angular/platform-browser-dynamic": "^4.0.0",
"@angular/router": "^4.0.0",
+ "@ngrx/core": "^1.2.0",
+ "@ngrx/store": "^2.2.2",
"@ngx-translate/core": "^6.0.1",
"@ngx-translate/http-loader": "^0.0.3",
"bootstrap": "^3.3.7",
@@ -41,9 +43,9 @@
"karma": "~1.4.1",
"karma-chrome-launcher": "~2.0.0",
"karma-cli": "~1.0.1",
+ "karma-coverage-istanbul-reporter": "^0.2.0",
"karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^0.2.2",
- "karma-coverage-istanbul-reporter": "^0.2.0",
"protractor": "~5.1.0",
"ts-node": "~2.0.0",
"tslint": "~4.5.0",
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/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 e8dee1b..f4ee972 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
@@ -25,13 +25,21 @@ import {mockApiDataService} from './services/mock-api-data.service'
import {AlertModule} from 'ngx-bootstrap';
import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
-import {HttpClientService} from './services/http-client.service';
-import {ActionsService} from './services/actions.service';
+import {StoreModule} from '@ngrx/store';
+import {HttpClientService} from '@app/services/http-client.service';
+import {ComponentActionsService} from '@app/services/component-actions.service';
+import {AuditLogsService, auditLogs} from '@app/services/storage/audit-logs.service';
+import {ServiceLogsService, serviceLogs} from '@app/services/storage/service-logs.service';
+import {BarGraphsService, barGraphs} from '@app/services/storage/bar-graphs.service';
+import {GraphsService, graphs} from '@app/services/storage/graphs.service';
+import {NodesService, nodes} from '@app/services/storage/nodes.service';
+import {UserConfigsService, userConfigs} from '@app/services/storage/user-configs.service';
+import {FiltersService, filters} from '@app/services/storage/filters.service';
-import {AppComponent} from './app.component';
-import {LoginFormComponent} from './login-form/login-form.component';
-import {TopMenuComponent} from './top-menu/top-menu.component';
-import {MenuButtonComponent} from './menu-button/menu-button.component';
+import {AppComponent} from '@app/app.component';
+import {LoginFormComponent} from '@app/login-form/login-form.component';
+import {TopMenuComponent} from '@app/top-menu/top-menu.component';
+import {MenuButtonComponent} from '@app/menu-button/menu-button.component';
export function HttpLoaderFactory(http: Http) {
return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
@@ -58,11 +66,27 @@ export function HttpLoaderFactory(http: Http) {
useFactory: HttpLoaderFactory,
deps: [Http]
}
+ }),
+ StoreModule.provideStore({
+ auditLogs,
+ serviceLogs,
+ barGraphs,
+ graphs,
+ nodes,
+ userConfigs,
+ filters
})
],
providers: [
HttpClientService,
- ActionsService
+ ComponentActionsService,
+ AuditLogsService,
+ ServiceLogsService,
+ BarGraphsService,
+ GraphsService,
+ NodesService,
+ UserConfigsService,
+ FiltersService
],
bootstrap: [AppComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/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
index bffa412..400e65b 100644
--- 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
@@ -18,7 +18,7 @@
import {Component, OnInit} from '@angular/core';
import 'rxjs/add/operator/finally';
-import {HttpClientService} from '../services/http-client.service';
+import {HttpClientService} from '@app/services/http-client.service';
@Component({
selector: 'login-form',
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
index 62afe07..5419b36 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
@@ -20,7 +20,7 @@ import {async, ComponentFixture, TestBed} from '@angular/core/testing';
import {Http} from '@angular/http';
import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
-import {ActionsService} from '../services/actions.service';
+import {ComponentActionsService} from '@app/services/component-actions.service';
import {MenuButtonComponent} from './menu-button.component';
@@ -41,7 +41,7 @@ describe('MenuButtonComponent', () => {
useFactory: HttpLoaderFactory,
deps: [Http]
})],
- providers: [ActionsService]
+ providers: [ComponentActionsService]
})
.compileComponents();
}));
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
index 2af5a44..716d3ae 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
@@ -17,7 +17,7 @@
*/
import {Component, AfterViewInit, Input, ViewChild, ElementRef} from '@angular/core';
-import {ActionsService} from '../services/actions.service';
+import {ComponentActionsService} from '@app/services/component-actions.service';
@Component({
selector: 'menu-button',
@@ -26,7 +26,7 @@ import {ActionsService} from '../services/actions.service';
})
export class MenuButtonComponent implements AfterViewInit {
- constructor(private actions: ActionsService) {
+ constructor(private actions: ComponentActionsService) {
}
ngAfterViewInit() {
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/audit-log.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/audit-log.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/audit-log.model.ts
new file mode 100644
index 0000000..ef8fe14
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/audit-log.model.ts
@@ -0,0 +1,46 @@
+/**
+ * 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 {Log} from '@app/models/log.model';
+
+export interface AuditLog extends Log {
+ policy?: string;
+ reason?: string;
+ result: number;
+ text?: string;
+ tags?: string[];
+ resource?: string;
+ sess?: string;
+ access?: string;
+ logType: string;
+ tags_str?: string;
+ resType?: string;
+ reqUser: string;
+ reqData?: string;
+ repoType: number;
+ repo: string;
+ proxyUsers?: string[];
+ evtTime: string;
+ enforcer: string;
+ reqContext?: string;
+ cliType?: string;
+ cliIP?: string;
+ agent?: string;
+ agentHost?: string;
+ action?: string;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/bar-graph.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/bar-graph.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/bar-graph.model.ts
new file mode 100644
index 0000000..f53d56d
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/bar-graph.model.ts
@@ -0,0 +1,24 @@
+/**
+ * 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 {CommonEntry} from '@app/models/common-entry.model';
+
+export interface BarGraph {
+ dataCount: CommonEntry[],
+ name: string;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/common-entry.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/common-entry.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/common-entry.model.ts
new file mode 100644
index 0000000..15d2be7
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/common-entry.model.ts
@@ -0,0 +1,22 @@
+/**
+ * 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.
+ */
+
+export interface CommonEntry {
+ name: string;
+ value: string;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/count.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/count.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/count.model.ts
new file mode 100644
index 0000000..095e8e7
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/count.model.ts
@@ -0,0 +1,22 @@
+/**
+ * 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.
+ */
+
+export interface Count {
+ name: string;
+ count: number;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/filter.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/filter.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/filter.model.ts
new file mode 100644
index 0000000..6ceaec1
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/filter.model.ts
@@ -0,0 +1,25 @@
+/**
+ * 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.
+ */
+
+export interface Filter {
+ label: string;
+ hosts: string[];
+ defaultLevels: string[];
+ overrideLevels: string[];
+ expiryTime: string;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/graph.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/graph.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/graph.model.ts
new file mode 100644
index 0000000..5021654
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/graph.model.ts
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+
+export interface Graph {
+ name: string;
+ count: string;
+ dataList?: Graph[]
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
new file mode 100644
index 0000000..825b4cf
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
@@ -0,0 +1,37 @@
+/**
+ * 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.
+ */
+
+export interface Log {
+ type: string;
+ _version_: number;
+ id: string;
+ file?: string;
+ seq_num: number;
+ bundle_id?: string;
+ case_id?: string;
+ log_message: string;
+ logfile_line_number: number;
+ message_md5: string;
+ cluster: string;
+ event_count: number;
+ event_md5: string;
+ event_dur_ms: number;
+ _ttl_: string;
+ _expire_at_: string;
+ _router_field_?: number;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/node.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/node.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/node.model.ts
new file mode 100644
index 0000000..1128827
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/node.model.ts
@@ -0,0 +1,29 @@
+/**
+ * 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 {CommonEntry} from '@app/models/common-entry.model';
+
+export interface Node {
+ name: string;
+ type?: number;
+ value: string;
+ isParent: boolean;
+ isRoot: boolean;
+ childs?: Node[];
+ logLevelCount: CommonEntry[];
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
new file mode 100644
index 0000000..e386ad5
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
@@ -0,0 +1,27 @@
+/**
+ * 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 {Log} from '@app/models/log.model';
+
+export interface ServiceLog extends Log {
+ path: string;
+ host: string;
+ level: string;
+ logtime: string;
+ ip: string;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/solr-collection-state.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/solr-collection-state.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/solr-collection-state.model.ts
new file mode 100644
index 0000000..9c40f4a
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/solr-collection-state.model.ts
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+
+export interface SolrCollectionState {
+ znodeReady: boolean;
+ configurationUploaded: boolean;
+ solrCollectionReady: boolean;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/store.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/store.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/store.model.ts
new file mode 100644
index 0000000..1f3a89c
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/store.model.ts
@@ -0,0 +1,95 @@
+/**
+ * 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 {Observable} from 'rxjs/Observable';
+import {Store, Action} from '@ngrx/store';
+import {AuditLog} from '@app/models/audit-log.model';
+import {ServiceLog} from '@app/models/service-log.model';
+import {BarGraph} from '@app/models/bar-graph.model';
+import {Graph} from '@app/models/graph.model';
+import {Node} from '@app/models/node.model';
+import {UserConfig} from '@app/models/user-config.model';
+import {Filter} from '@app/models/filter.model';
+
+export const storeActions = {
+ ADD: 'ADD',
+ DELETE: 'DELETE',
+ CLEAR: 'CLEAR'
+};
+
+export interface AppStore {
+ auditLogs: AuditLog[];
+ serviceLogs: ServiceLog[];
+ barGraphs: BarGraph[];
+ graphs: Graph[];
+ nodes: Node[];
+ userConfigs: UserConfig[];
+ filters: Filter[];
+}
+
+export class ModelService {
+
+ constructor(private modelName: string, private store: Store<AppStore>) {}
+
+ getInstances(): Observable<any> {
+ return this.store.select(this.modelName);
+ }
+
+ addInstance(instance: any): void {
+ this.store.dispatch({
+ type: storeActions.ADD,
+ payload: [instance]
+ });
+ }
+
+ addInstances(instances: any[]): void {
+ this.store.dispatch({
+ type: storeActions.ADD,
+ payload: instances
+ });
+ }
+
+ deleteInstance(instance: any): void {
+ this.store.dispatch({
+ type: storeActions.DELETE,
+ payload: instance
+ });
+ }
+
+ clear(): void {
+ this.store.dispatch({
+ type: storeActions.CLEAR
+ });
+ }
+
+}
+
+export function reducer(state: any, action: Action): any {
+ switch (action.type) {
+ case storeActions.ADD:
+ return [...state, ...action.payload];
+ case storeActions.DELETE:
+ return state.filter(instance => {
+ return instance.id !== action.payload.id;
+ });
+ case storeActions.CLEAR:
+ return [];
+ default:
+ return state;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/models/user-config.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/user-config.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/user-config.model.ts
new file mode 100644
index 0000000..3c3b884
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/user-config.model.ts
@@ -0,0 +1,26 @@
+/**
+ * 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.
+ */
+
+export interface UserConfig {
+ id: string;
+ userName: string;
+ filtername: string;
+ values: string;
+ shareNameList: string[];
+ rowType: string;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts
deleted file mode 100644
index a14e0db..0000000
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.spec.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * 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 {ActionsService} from './actions.service';
-
-describe('ActionsService', () => {
- beforeEach(() => {
- TestBed.configureTestingModule({
- providers: [ActionsService]
- });
- });
-
- it('should create service', inject([ActionsService], (service: ActionsService) => {
- expect(service).toBeTruthy();
- }));
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts
deleted file mode 100644
index 2bcd909..0000000
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/actions.service.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * 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';
-
-@Injectable()
-export class ActionsService {
-
- constructor() {
- }
-
- //TODO implement actions
-
- undo() {
- }
-
- redo() {
- }
-
- refresh() {
- }
-
- openHistory() {
- }
-
- openAlerts() {
- }
-
- openUserDetails() {
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.spec.ts
new file mode 100644
index 0000000..303fdab
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.spec.ts
@@ -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.
+ */
+
+import {TestBed, inject} from '@angular/core/testing';
+
+import {ComponentActionsService} from './component-actions.service';
+
+describe('ComponentActionsService', () => {
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ providers: [ComponentActionsService]
+ });
+ });
+
+ it('should create service', inject([ComponentActionsService], (service: ComponentActionsService) => {
+ expect(service).toBeTruthy();
+ }));
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
new file mode 100644
index 0000000..1a1062e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/component-actions.service.ts
@@ -0,0 +1,47 @@
+/**
+ * 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';
+
+@Injectable()
+export class ComponentActionsService {
+
+ constructor() {
+ }
+
+ //TODO implement actions
+
+ undo() {
+ }
+
+ redo() {
+ }
+
+ refresh() {
+ }
+
+ openHistory() {
+ }
+
+ openAlerts() {
+ }
+
+ openUserDetails() {
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
index da32c7e..be39536 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
@@ -20,6 +20,745 @@ import {InMemoryDbService} from 'angular-in-memory-web-api';
export class mockApiDataService implements InMemoryDbService {
createDb() {
- return {};
+ return {
+ audit: {
+ logs: {
+ logList: [
+ {
+ policy: 'policy',
+ reason: 'Authentication required',
+ result: 0,
+ text: 'Please log in',
+ tags: [
+ 'ambari_agent'
+ ],
+ resource: '/ambari-agent',
+ sess: '0',
+ access: '0',
+ logType: 'AmbariAudit',
+ tags_str: 'ambari_agent',
+ resType: 'agent',
+ reqUser: 'admin',
+ reqData: 'data',
+ repoType: 1,
+ repo: 'ambari',
+ proxyUsers: [
+ 'admin'
+ ],
+ evtTime: '2017-05-29T11:30:22.531Z',
+ enforcer: 'ambari-acl',
+ reqContext: 'ambari',
+ cliType: 'GET',
+ cliIP: '192.168.0.1',
+ agent: 'agent',
+ agentHost: 'localhost',
+ action: 'SERVICE_CHECK',
+ type: 'ambari-audit',
+ _version_: 2,
+ id: 'id0',
+ file: 'ambari-agent.log',
+ seq_num: 3,
+ bundle_id: 'b0',
+ case_id: 'c0',
+ log_message: 'User(admin), Operation(SERVICE_CHECK)',
+ logfile_line_number: 4,
+ message_md5: '12345678900987654321',
+ cluster: 'cl0',
+ event_count: 0,
+ event_md5: '09876543211234567890',
+ event_dur_ms: 100,
+ _ttl_: "+7DAYS",
+ _expire_at_: '2017-05-29T11:30:22.531Z',
+ _router_field_: 5
+ },
+ {
+ policy: 'policy',
+ reason: 'Server error',
+ result: 1,
+ text: 'Something went wrong',
+ tags: [
+ 'ambari_agent'
+ ],
+ resource: '/ambari-agent',
+ sess: '1',
+ access: '1',
+ logType: 'AmbariAudit',
+ tags_str: 'ambari_server',
+ resType: 'server',
+ reqUser: 'user',
+ reqData: 'data',
+ repoType: 1,
+ repo: 'ambari',
+ proxyUsers: [
+ 'user'
+ ],
+ evtTime: '2017-05-29T11:30:22.531Z',
+ enforcer: 'hdfs',
+ reqContext: 'ambari_server',
+ cliType: 'PUT',
+ cliIP: '192.168.0.1',
+ agent: 'agent',
+ agentHost: 'localhost',
+ action: 'SERVICE_CHECK',
+ type: 'ambari-audit',
+ _version_: 4,
+ id: 'id1',
+ file: 'ambari-agent.log',
+ seq_num: 5,
+ bundle_id: 'b1',
+ case_id: 'c1',
+ log_message: 'User(user), Operation(SERVICE_CHECK)',
+ logfile_line_number: 6,
+ message_md5: '10293847561029384756',
+ cluster: 'cl1',
+ event_count: 2,
+ event_md5: '01928374650192837465',
+ event_dur_ms: 500,
+ _ttl_: "+7DAYS",
+ _expire_at_: '2017-05-29T11:30:22.531Z',
+ _router_field_: 10
+ }
+ ],
+ bargraph: {
+ graphData: [
+ {
+ dataCount: [
+ {
+ name: 'n0',
+ value: 1
+ },
+ {
+ name: 'n1',
+ value: 2
+ }
+ ],
+ name: 'graph0'
+ },
+ {
+ dataCount: [
+ {
+ name: 'n2',
+ value: 10
+ },
+ {
+ name: 'n3',
+ value: 20
+ }
+ ],
+ name: 'graph1'
+ }
+ ]
+ },
+ components: {},
+ resources: {
+ graphData: [
+ {
+ dataCount: [
+ {
+ name: 'n16',
+ value: 800
+ },
+ {
+ name: 'n17',
+ value: 400
+ }
+ ],
+ name: 'graph8'
+ },
+ {
+ dataCount: [
+ {
+ name: 'n18',
+ value: 600
+ },
+ {
+ name: 'n19',
+ value: 300
+ }
+ ],
+ name: 'graph9'
+ }
+ ]
+ },
+ schema: {
+ fields: ''
+ },
+ serviceload: {
+ graphData: [
+ {
+ dataCount: [
+ {
+ name: 'n4',
+ value: 1
+ },
+ {
+ name: 'n5',
+ value: 2
+ }
+ ],
+ name: 'graph2'
+ },
+ {
+ dataCount: [
+ {
+ name: 'n6',
+ value: 10
+ },
+ {
+ name: 'n7',
+ value: 20
+ }
+ ],
+ name: 'graph3'
+ }
+ ]
+ }
+ }
+ },
+ public: {
+ config: {}
+ },
+ service: {
+ logs: {
+ logList: [
+ {
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h0',
+ level: 'WARN',
+ logtime: '2017-05-28T11:30:22.531Z',
+ ip: '192.168.0.1',
+ logfile_line_number: 8,
+ type: 'ams_collector',
+ _version_: 9,
+ id: 'id2',
+ file: 'ambari-metrics-collector.log',
+ seq_num: 10,
+ bundle_id: 'b2',
+ case_id: 'c2',
+ log_message: 'Connection refused',
+ message_md5: '1357908642',
+ cluster: 'cl2',
+ event_count: 5,
+ event_md5: '1908755391',
+ event_dur_ms: 200,
+ _ttl_: "+5DAYS",
+ _expire_at_: '2017-05-29T11:30:22.531Z',
+ _router_field_: 20
+ },
+ {
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h1',
+ level: 'ERROR',
+ logtime: '2017-05-28T10:30:22.531Z',
+ ip: '192.168.0.2',
+ type: 'ams_collector',
+ _version_: 14,
+ id: 'id3',
+ file: 'ambari-metrics-collector.log',
+ seq_num: 15,
+ bundle_id: 'b3',
+ case_id: 'c3',
+ log_message: 'Connection refused',
+ logfile_line_number: 16,
+ message_md5: '1357908642',
+ cluster: 'cl3',
+ event_count: 2,
+ event_md5: '1029384756',
+ event_dur_ms: 700,
+ _ttl_: "+5DAYS",
+ _expire_at_: '2017-05-29T10:30:22.531Z',
+ _router_field_: 5
+ }
+ ],
+ aggregated: {
+ graphData: [
+ {
+ name: 'n0',
+ count: 100,
+ dataList: [
+ {
+ name: 'n1',
+ count: 50,
+ dataList: null
+ },
+ {
+ name: 'n2',
+ count: 200,
+ dataList: null
+ }
+ ]
+ },
+ {
+ name: 'n3',
+ count: 10,
+ dataList: [
+ {
+ name: 'n4',
+ count: 5,
+ dataList: null
+ },
+ {
+ name: 'n5',
+ count: 20,
+ dataList: null
+ }
+ ]
+ }
+ ]
+ },
+ components: {
+ count: {
+ anygraph: {
+ graphData: [
+ {
+ dataCount: [
+ {
+ name: 'n8',
+ value: 50
+ },
+ {
+ name: 'n9',
+ value: 100
+ }
+ ],
+ name: 'graph4'
+ },
+ {
+ dataCount: [
+ {
+ name: 'n10',
+ value: 5
+ },
+ {
+ name: 'n11',
+ value: 10
+ }
+ ],
+ name: 'graph5'
+ }
+ ]
+ }
+ },
+ levels: {
+ counts: {
+ vNodeList: [
+ {
+ name: 'ambari',
+ type: 0,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '10'
+ },
+ {
+ name: 'WARN',
+ value: '50'
+ }
+ ],
+ childs: [
+ {
+ name: 'hdfs',
+ type: 2,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '10'
+ },
+ {
+ name: 'WARN',
+ value: '20'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ },
+ {
+ name: 'zookeeper',
+ type: 3,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '20'
+ },
+ {
+ name: 'WARN',
+ value: '40'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ],
+ isParent: true,
+ isRoot: false
+ },
+ {
+ name: 'ambari_agent',
+ type: 1,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '100'
+ },
+ {
+ name: 'WARN',
+ value: '500'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ]
+ }
+ }
+ },
+ files: {
+ hostLogFiles: {
+ clusters: [
+ 'c0',
+ 'c1'
+ ],
+ services: [
+ 'hdfs',
+ 'zookeeper'
+ ]
+ }
+ },
+ histogram: {
+ graphData: [
+ {
+ dataCount: [
+ {
+ name: 'n12',
+ value: 1000
+ },
+ {
+ name: 'n13',
+ value: 2000
+ }
+ ],
+ name: 'graph6'
+ },
+ {
+ dataCount: [
+ {
+ name: 'n14',
+ value: 700
+ },
+ {
+ name: 'n15',
+ value: 900
+ }
+ ],
+ name: 'graph7'
+ }
+ ]
+ },
+ hosts: {
+ components: {
+ vNodeList: [
+ {
+ name: 'ambari',
+ type: 0,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '100'
+ },
+ {
+ name: 'WARN',
+ value: '500'
+ }
+ ],
+ childs: [
+ {
+ name: 'ambari_metrics',
+ type: 2,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '100'
+ },
+ {
+ name: 'WARN',
+ value: '200'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ },
+ {
+ name: 'hbase',
+ type: 3,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '200'
+ },
+ {
+ name: 'WARN',
+ value: '400'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ],
+ isParent: true,
+ isRoot: false
+ },
+ {
+ name: 'ambari_server',
+ type: 1,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '1000'
+ },
+ {
+ name: 'WARN',
+ value: '5000'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ]
+ },
+ count: {
+ getvCounts: [
+ {
+ name: 'n20',
+ count: 100
+ },
+ {
+ name: 'n21',
+ count: 200
+ }
+ ]
+ }
+ },
+ levels: {
+ counts: {
+ getvNameValues: [
+ {
+ name: 'n22',
+ count: 1000
+ },
+ {
+ name: 'n23',
+ count: 2000
+ }
+ ]
+ }
+ },
+ schema: {
+ fields: ''
+ },
+ serviceconfig: '',
+ tree: {
+ vNodeList: [
+ {
+ name: 'ambari',
+ type: 0,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '1000'
+ },
+ {
+ name: 'WARN',
+ value: '5000'
+ }
+ ],
+ childs: [
+ {
+ name: 'yarn',
+ type: 2,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '1000'
+ },
+ {
+ name: 'WARN',
+ value: '2000'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ },
+ {
+ name: 'hive',
+ type: 3,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '2000'
+ },
+ {
+ name: 'WARN',
+ value: '4000'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ],
+ isParent: true,
+ isRoot: false
+ },
+ {
+ name: 'ambari_server',
+ type: 1,
+ logLevelCount: [
+ {
+ name: 'ERROR',
+ value: '10000'
+ },
+ {
+ name: 'WARN',
+ value: '50000'
+ }
+ ],
+ isParent: false,
+ isRoot: false
+ }
+ ]
+ },
+ truncated: {
+ logList: [
+ {
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h0',
+ level: 'WARN',
+ logtime: '2017-05-28T11:30:22.531Z',
+ ip: '192.168.0.1',
+ logfile_line_number: 8,
+ type: 'ams_collector',
+ _version_: 9,
+ id: 'id2',
+ file: 'ambari-metrics-collector.log',
+ seq_num: 10,
+ bundle_id: 'b2',
+ case_id: 'c2',
+ log_message: 'Connection refused',
+ message_md5: '1357908642',
+ cluster: 'cl2',
+ event_count: 5,
+ event_md5: '1908755391',
+ event_dur_ms: 200,
+ _ttl_: "+5DAYS",
+ _expire_at_: '2017-05-29T11:30:22.531Z',
+ _router_field_: 20
+ },
+ {
+ path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
+ host: 'h1',
+ level: 'ERROR',
+ logtime: '2017-05-28T10:30:22.531Z',
+ ip: '192.168.0.2',
+ type: 'ams_collector',
+ _version_: 14,
+ id: 'id3',
+ file: 'ambari-metrics-collector.log',
+ seq_num: 15,
+ bundle_id: 'b3',
+ case_id: 'c3',
+ log_message: 'Connection refused',
+ logfile_line_number: 16,
+ message_md5: '1357908642',
+ cluster: 'cl3',
+ event_count: 2,
+ event_md5: '1029384756',
+ event_dur_ms: 700,
+ _ttl_: "+5DAYS",
+ _expire_at_: '2017-05-29T10:30:22.531Z',
+ _router_field_: 5
+ }
+ ]
+ }
+ }
+ },
+ status: {
+ auditlogs: {
+ znodeReady: true,
+ solrCollectionReady: true,
+ solrAliasReady: false,
+ configurationUploaded: true
+ },
+ servicelogs: {
+ znodeReady: true,
+ solrCollectionReady: true,
+ configurationUploaded: true
+ },
+ userconfig: {
+ znodeReady: true,
+ solrCollectionReady: true,
+ configurationUploaded: true
+ }
+ },
+ userconfig: {
+ userConfigList: [
+ {
+ id: 'c0',
+ userName: 'admin',
+ filtername: 'service',
+ values: 'hdfs',
+ shareNameList: [
+ 's0',
+ 's1'
+ ],
+ rowType: 'history'
+ },
+ {
+ id: 'c0',
+ userName: 'user',
+ filtername: 'component',
+ values: 'namenode',
+ shareNameList: [
+ 's2',
+ 's3'
+ ],
+ rowType: 'history'
+ }
+ ],
+ filters: {
+ filter0: {
+ label: 'filter0',
+ hosts: [
+ 'h0',
+ 'h1'
+ ],
+ defaultLevels: [
+ 'l0',
+ 'l1'
+ ],
+ overrideLevels: [
+ 'l2',
+ 'l3'
+ ],
+ expiryTime: '2017-05-29T11:30:22.531Z'
+ },
+ filter1: {
+ label: 'filter1',
+ hosts: [
+ 'h1',
+ 'h2'
+ ],
+ defaultLevels: [
+ 'l4',
+ 'l5'
+ ],
+ overrideLevels: [
+ 'l6',
+ 'l7'
+ ],
+ expiryTime: '2017-05-30T11:30:22.531Z'
+ }
+ },
+ names: []
+ }
+ };
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/audit-logs.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/audit-logs.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/audit-logs.service.ts
new file mode 100644
index 0000000..706d2f3
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/audit-logs.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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 {Action, ActionReducer, Store} from '@ngrx/store';
+import {AuditLog} from '@app/models/audit-log.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class AuditLogsService extends ModelService {
+ constructor(store: Store<AppStore>) {
+ super('auditLogs', store);
+ }
+}
+
+export const auditLogs: ActionReducer<AuditLog[]> = (state: AuditLog[] = [], action: Action) => {
+ return reducer(state, action);
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/bar-graphs.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/bar-graphs.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/bar-graphs.service.ts
new file mode 100644
index 0000000..2e2db5b
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/bar-graphs.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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 {Action, ActionReducer, Store} from '@ngrx/store';
+import {BarGraph} from '@app/models/bar-graph.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class BarGraphsService extends ModelService {
+ constructor(store: Store<AppStore>) {
+ super('barGraphs', store);
+ }
+}
+
+export const barGraphs: ActionReducer<BarGraph[]> = (state: BarGraph[] = [], action: Action) => {
+ return reducer(state, action);
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/filters.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/filters.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/filters.service.ts
new file mode 100644
index 0000000..99d2140
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/filters.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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 {Action, ActionReducer, Store} from '@ngrx/store';
+import {Filter} from '@app/models/filter.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class FiltersService extends ModelService {
+ constructor(store: Store<AppStore>) {
+ super('filters', store);
+ }
+}
+
+export const filters: ActionReducer<Filter[]> = (state: Filter[] = [], action: Action) => {
+ return reducer(state, action);
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/graphs.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/graphs.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/graphs.service.ts
new file mode 100644
index 0000000..1c32d34
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/graphs.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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 {Action, ActionReducer, Store} from '@ngrx/store';
+import {Graph} from '@app/models/graph.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class GraphsService extends ModelService {
+ constructor(store: Store<AppStore>) {
+ super('graphs', store);
+ }
+}
+
+export const graphs: ActionReducer<Graph[]> = (state: Graph[] = [], action: Action) => {
+ return reducer(state, action);
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/nodes.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/nodes.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/nodes.service.ts
new file mode 100644
index 0000000..b194f94
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/nodes.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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 {Action, ActionReducer, Store} from '@ngrx/store';
+import {Node} from '@app/models/node.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class NodesService extends ModelService {
+ constructor(store: Store<AppStore>) {
+ super('nodes', store);
+ }
+}
+
+export const nodes: ActionReducer<Node[]> = (state: Node[] = [], action: Action) => {
+ return reducer(state, action);
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/service-logs.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/service-logs.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/service-logs.service.ts
new file mode 100644
index 0000000..6859653
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/service-logs.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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 {Action, ActionReducer, Store} from '@ngrx/store';
+import {ServiceLog} from '@app/models/service-log.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class ServiceLogsService extends ModelService {
+ constructor(store: Store<AppStore>) {
+ super('serviceLogs', store);
+ }
+}
+
+export const serviceLogs: ActionReducer<ServiceLog[]> = (state: ServiceLog[] = [], action: Action) => {
+ return reducer(state, action);
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/user-configs.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/user-configs.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/user-configs.service.ts
new file mode 100644
index 0000000..2c770f0
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/storage/user-configs.service.ts
@@ -0,0 +1,34 @@
+/**
+ * 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 {Action, ActionReducer, Store} from '@ngrx/store';
+import {UserConfig} from '@app/models/user-config.model';
+import {AppStore, ModelService, reducer} from '@app/models/store.model';
+
+@Injectable()
+export class UserConfigsService extends ModelService {
+ constructor(store: Store<AppStore>) {
+ super('userConfigs', store);
+ }
+}
+
+export const userConfigs: ActionReducer<UserConfig[]> = (state: UserConfig[] = [], action: Action) => {
+ return reducer(state, action);
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json b/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
index 5e2507d..7166e04 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/tsconfig.app.json
@@ -3,7 +3,7 @@
"compilerOptions": {
"outDir": "../out-tsc/app",
"module": "es2015",
- "baseUrl": "",
+ "baseUrl": ".",
"types": []
},
"exclude": [
http://git-wip-us.apache.org/repos/asf/ambari/blob/603297ae/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json b/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
index a35a8ee..12163cb 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
+++ b/ambari-logsearch/ambari-logsearch-web-new/tsconfig.json
@@ -3,6 +3,11 @@
"compilerOptions": {
"outDir": "./dist/out-tsc",
"baseUrl": "src",
+ "paths": {
+ "@app/*": [
+ "app/*"
+ ]
+ },
"sourceMap": true,
"declaration": false,
"moduleResolution": "node",
[06/21] ambari git commit: AMBARI-21312 Provide Log Search UI
authorization functionality. (ababiichuk)
Posted by ab...@apache.org.
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/branch-feature-logsearch-ui
Commit: 607c918595ce85e23adbe4ea2a9b79cb6b8492fa
Parents: 70633c5
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 22 15:17:33 2017 +0300
Committer: ababiichuk <ab...@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
[03/21] ambari git commit: AMBARI-21311 Log Search UI: add missing
license. (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21311 Log Search UI: add missing license. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/70633c5f
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/70633c5f
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/70633c5f
Branch: refs/heads/branch-feature-logsearch-ui
Commit: 70633c5f26a918f98693a69c007fa17df2619f2e
Parents: 4ce2f2c
Author: ababiichuk <ab...@hortonworks.com>
Authored: Fri Apr 28 14:40:04 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 14:54:55 2017 +0300
----------------------------------------------------------------------
.../ambari-logsearch-web-new/e2e/app.e2e-spec.ts | 18 ++++++++++++++++++
.../ambari-logsearch-web-new/e2e/app.po.ts | 18 ++++++++++++++++++
.../ambari-logsearch-web-new/karma.conf.js | 18 ++++++++++++++++++
.../ambari-logsearch-web-new/protractor.conf.js | 18 ++++++++++++++++++
.../ambari-logsearch-web-new/src/index.html | 17 +++++++++++++++++
.../ambari-logsearch-web-new/src/main.ts | 18 ++++++++++++++++++
.../ambari-logsearch-web-new/src/polyfills.ts | 18 ++++++++++++++++++
.../ambari-logsearch-web-new/src/test.ts | 18 ++++++++++++++++++
.../ambari-logsearch-web-new/src/typings.d.ts | 18 ++++++++++++++++++
9 files changed, 161 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/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 a9f0798..3813a3d 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
@@ -1,3 +1,21 @@
+/**
+ * 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 { AmbariLogsearchWebNewPage } from './app.po';
describe('ambari-logsearch-web-new App', () => {
http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
index 0dab904..c446bfb 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/e2e/app.po.ts
@@ -1,3 +1,21 @@
+/**
+ * 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 { browser, element, by } from 'protractor';
export class AmbariLogsearchWebNewPage {
http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js b/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
index 84b4cd5..0512808 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
+++ b/ambari-logsearch/ambari-logsearch-web-new/karma.conf.js
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
// Karma configuration file, see link for more information
// https://karma-runner.github.io/0.13/config/configuration-file.html
http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js b/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
index 1c5e1e5..6b4a31c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
+++ b/ambari-logsearch/ambari-logsearch-web-new/protractor.conf.js
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts
http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/src/index.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/index.html b/ambari-logsearch/ambari-logsearch-web-new/src/index.html
index b067fe4..f1c1562 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/index.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/index.html
@@ -1,3 +1,20 @@
+<!--
+ 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.
+-->
+
<!doctype html>
<html>
<head>
http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/main.ts b/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
index a9ca1ca..e3aeec1 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
@@ -1,3 +1,21 @@
+/**
+ * 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 { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts b/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
index 53bdaf1..741b82a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
@@ -1,4 +1,22 @@
/**
+ * 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.
+ */
+
+/**
* This file includes polyfills needed by Angular and is loaded before the app.
* You can add your own extra polyfills to this file.
*
http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/test.ts b/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
index 9bf7226..6597b1c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/test.ts
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
import 'zone.js/dist/long-stack-trace-zone';
http://git-wip-us.apache.org/repos/asf/ambari/blob/70633c5f/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts b/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
index ef5c7bd..e4a302b 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/typings.d.ts
@@ -1,3 +1,21 @@
+/**
+ * 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.
+ */
+
/* SystemJS module definition */
declare var module: NodeModule;
interface NodeModule {
[14/21] ambari git commit: AMBARI-21319 Log Search UI: provide
compatibility with IE11. (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21319 Log Search UI: provide compatibility with IE11. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/ae40a5f1
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/ae40a5f1
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/ae40a5f1
Branch: refs/heads/branch-feature-logsearch-ui
Commit: ae40a5f16f5992a9b9751edd22188cb70c9ffec2
Parents: c57329c
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 1 17:29:02 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:38:35 2017 +0300
----------------------------------------------------------------------
ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/ae40a5f1/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts b/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
index 741b82a..0ab921a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/polyfills.ts
@@ -38,15 +38,15 @@
/** IE9, IE10 and IE11 requires all of the following polyfills. **/
// import 'core-js/es6/symbol';
-// import 'core-js/es6/object';
+import 'core-js/es6/object';
// import 'core-js/es6/function';
// import 'core-js/es6/parse-int';
// import 'core-js/es6/parse-float';
// import 'core-js/es6/number';
// import 'core-js/es6/math';
-// import 'core-js/es6/string';
+import 'core-js/es6/string';
// import 'core-js/es6/date';
-// import 'core-js/es6/array';
+import 'core-js/es6/array';
// import 'core-js/es6/regexp';
// import 'core-js/es6/map';
// import 'core-js/es6/set';
[11/21] ambari git commit: AMBARI-21313 Log Search UI: implement
service for string constants (additional patch). (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21313 Log Search UI: implement service for string constants (additional patch). (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/84a59d71
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/84a59d71
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/84a59d71
Branch: refs/heads/branch-feature-logsearch-ui
Commit: 84a59d71183edfbb85de1090a5aa1092d60621cf
Parents: e71ad96
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 22 15:32:08 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:32:08 2017 +0300
----------------------------------------------------------------------
.../app/menu-button/menu-button.component.html | 4 +-
.../app/menu-button/menu-button.component.ts | 22 +-
.../src/app/top-menu/top-menu.component.ts | 40 +-
.../ambari-logsearch-web-new/yarn.lock | 5312 ++++++++++++++++++
4 files changed, 5357 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/84a59d71/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
index 6bdbac4..1afe6c0 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
@@ -16,13 +16,13 @@
-->
<div #dropdown [ngClass]="{'dropdown': hasSubItems, 'text-center': true}">
- <span (mousedown)="onMouseDown()" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">
+ <span (mousedown)="onMouseDown($event)" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">
<a *ngIf="title" class="icon" [ngClass]="iconClassNames"></a>
<span *ngIf="!title" class="icon" [ngClass]="iconClassNames"></span>
</span>
<a #dropdownToggle [ngClass]="{'dropdown-toggle': hasSubItems, 'caret': true}" [attr.data-toggle]="hasSubItems ? 'dropdown': null" *ngIf="hasSubItems"></a>
<br>
- <span class="icon-title" *ngIf="title" (mousedown)="onMouseDown()" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">{{title | translate}}</span>
+ <span class="icon-title" *ngIf="title" (mousedown)="onMouseDown($event)" (mouseup)="onMouseUp($event)" (click)="$event.stopPropagation()">{{title | translate}}</span>
<ul class="dropdown-menu" *ngIf="hasSubItems">
<li *ngFor="let item of subItems">
<a href="#">{{item.title}}</a>
http://git-wip-us.apache.org/repos/asf/ambari/blob/84a59d71/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
index 7a967ad..2af5a44 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
@@ -56,18 +56,22 @@ export class MenuButtonComponent implements AfterViewInit {
private readonly longClickInterval = 1000;
- onMouseDown() {
- this.clickStartTime = (new Date()).getTime();
+ onMouseDown(event: MouseEvent): void {
+ if (event.button === 0) {
+ this.clickStartTime = (new Date()).getTime();
+ }
}
- onMouseUp(event: Event) {
- const clickEndTime = (new Date()).getTime();
- if (this.hasSubItems && clickEndTime - this.clickStartTime >= this.longClickInterval) {
- this.dropdown.nativeElement.classList.add('open');
- } else {
- this.actions[this.action]();
+ onMouseUp(event: MouseEvent): void {
+ if (event.button === 0) {
+ const clickEndTime = (new Date()).getTime();
+ if (this.hasSubItems && clickEndTime - this.clickStartTime >= this.longClickInterval) {
+ this.dropdown.nativeElement.classList.add('open');
+ } else {
+ this.actions[this.action]();
+ }
+ event.stopPropagation();
}
- event.stopPropagation();
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/84a59d71/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
index d5f05875..641fca0 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
@@ -39,10 +39,16 @@ export class TopMenuComponent implements OnInit {
action: 'undo',
subItems: [
{
- title: 'Item 1'
+ title: 'Apply \'Last week\' filter'
},
{
- title: 'Item 2'
+ title: 'Clear all filters'
+ },
+ {
+ title: 'Apply \'HDFS\' filter'
+ },
+ {
+ title: 'Apply \'Errors\' filter'
}
]
},
@@ -52,10 +58,13 @@ export class TopMenuComponent implements OnInit {
action: 'redo',
subItems: [
{
- title: 'Item 1'
+ title: 'Apply \'Warnings\' filter'
},
{
- title: 'Item 2'
+ title: 'Switch to graph mode'
+ },
+ {
+ title: 'Apply \'Custom Date\' filter'
}
]
},
@@ -70,18 +79,29 @@ export class TopMenuComponent implements OnInit {
action: 'openHistory',
subItems: [
{
- title: 'Item 1'
+ title: 'Apply \'Custom Date\' filter'
+ },
+ {
+ title: 'Switch to graph mode'
+ },
+ {
+ title: 'Apply \'Warnings\' filter'
+ },
+ {
+ title: 'Apply \'Last week\' filter'
+ },
+ {
+ title: 'Clear all filters'
},
{
- title: 'Item 2'
+ title: 'Apply \'HDFS\' filter'
+ },
+ {
+ title: 'Apply \'Errors\' filter'
}
]
},
{
- iconClassNames: ['fa', 'fa-bell'],
- action: 'openAlerts'
- },
- {
iconClassNames: ['fa', 'fa-user'],
action: 'openUserDetails'
}
[04/21] ambari git commit: AMBARI-21312 Provide Log Search UI
authorization functionality. (ababiichuk)
Posted by ab...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.ttf
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.ttf b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.ttf
new file mode 100644
index 0000000..305f0d5
Binary files /dev/null and b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.ttf differ
http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.woff
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.woff b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.woff
new file mode 100644
index 0000000..ac7452a
Binary files /dev/null and b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/css/fonts/Roboto-Regular-webfont.woff differ
http://git-wip-us.apache.org/repos/asf/ambari/blob/607c9185/ambari-logsearch/ambari-logsearch-web-new/src/vendor/js/bootstrap-logsearch.min.js
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/vendor/js/bootstrap-logsearch.min.js b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/js/bootstrap-logsearch.min.js
new file mode 100644
index 0000000..a1b68d2
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/vendor/js/bootstrap-logsearch.min.js
@@ -0,0 +1,19 @@
+/**
+ * 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.
+ */
+"use strict";$(document).ready(function(){var n=$(this).find('[data-toggle="collapseAccordion"]');n.off("click").on("click",function(n){var l=$(this);return l.siblings(".panel-body").slideToggle(500),l.children().children(".panel-toggle").toggleClass("fa-angle-down fa-angle-up"),n.stopPropagation(),!1})});
+"use strict";!function(e){e.fn.navigationBar=function(n){var t=e.extend({},e.fn.navigationBar.defaults,n);return this.each(function(){function n(){var n=window.location.pathname+window.location.hash;o.find("li a").each(function(t,a){var i=e(a),s=i.attr("data-href")||i.attr("href");n.indexOf(s)!==-1&&["","#"].indexOf(s)===-1?i.parent().addClass("active"):i.parent().removeClass("active")})}function a(n){var a=e(n).parent(),i=t.activeClass,s=f+"."+i,l=c+"."+i;o.find(s).removeClass(i),o.find(l).removeClass(i),a.addClass(i)}var i=this,s=".navigation-bar-container",o=e(this).find(s),l=e(this).find("[data-toggle="+t.navBarToggleDataAttr+"]"),r=e(this).find("[data-toggle="+t.subMenuNavToggleDataAttr+"]"),f=".side-nav-menu>li",c=".side-nav-menu>li>ul>li",d=e(this).find(".more-actions"),u=d.children(".dropdown-menu");r.each(function(n,t){return e(t).parent().addClass("has-sub-menu")}),t.fitHeight&&(e(this).addClass("navigation-bar-fit-height"),e(this).find(".side-nav-menu").on("DOMMouseScroll
mousewheel",function(n){var t=e(this),a=this.scrollTop,i=this.scrollHeight,s=t.innerHeight(),o=n.originalEvent.wheelDelta,l=o>0,r=function(){return n.stopPropagation(),n.preventDefault(),n.returnValue=!1,!1};return!l&&-o>i-s-a?(t.scrollTop(i),r()):l&&o>a?(t.scrollTop(0),r()):void 0}));var h=o.width();t.moveLeftContent&&e(t.content).css("margin-left",h),t.moveLeftFooter&&e(t.footer).css("margin-left",h),t.handlePopState&&(n(),e(window).bind("popstate",n)),e(f+">a").on("click",function(){a(this)}),e(c+">a").on("click",function(){a(this),e(this).parent().parent().parent().addClass(t.activeClass)}),r.off("click").on("click",function(n){if(o.hasClass("collapsed"))return!1;var a=e(this);return a.siblings(".sub-menu").slideToggle(600,function(){var e=a.parent(),n=e.find("ul");return n.is(":visible")?e.removeClass("collapsed"):e.addClass("collapsed")}),a.children(".toggle-icon").toggleClass(t.menuLeftClass+" "+t.menuDownClass),n.stopPropagation(),!1}),e(this).find(".mainmenu-li>a").hover(f
unction(){var n=e(this).siblings(".more-actions");n.length&&!o.hasClass("collapsed")&&n.css("display","inline-block")},function(){var n=e(this).siblings(".more-actions");n.length&&!o.hasClass("collapsed")&&n.hide()}),d.hover(function(){e(this).css("display","inline-block")}),t.fitHeight&&d.on("click",function(){var n=e(this),t=e(".side-nav-header");u.css({top:n.offset().top-t.offset().top+20+"px",left:n.offset().left+"px"})}),u.on("click",function(){var n=e(this).parent();setTimeout(function(){n.hide()},1e3)}),o.children(".side-nav-menu").scroll(function(){d.removeClass("open")}),l.click(function(){return o.toggleClass("collapsed").promise().done(function(){var n="ul.sub-menu",a=o.find(n),s=o.find(".side-nav-menu>li");o.hasClass("collapsed")?(a.hide(),d.hide(),s.hover(function(){e(this).find(n).show();var a=e(this),i=e(".side-nav-header");t.fitHeight&&e(this).find(n).css({position:"fixed",top:a.offset().top-i.offset().top+"px",left:"50px"})},function(){e(this).find(n).hide()})):(a.s
how().each(function(n,t){return e(t).parent().removeClass("collapsed")}),s.unbind("mouseenter mouseleave"),o.find(".toggle-icon").removeClass(t.menuLeftClass).addClass(t.menuDownClass),t.fitHeight&&e(i).find(n).css({position:"relative",top:0,left:0})),o.on("transitionend",function(){var n=o.width();t.moveLeftContent&&e(t.content).css("margin-left",n),t.moveLeftFooter&&e(t.footer).css("margin-left",n)}),l.find("span").toggleClass(t.collapseNavBarClass+" "+t.expandNavBarClass)}),!1})})},e.fn.navigationBar.defaults={handlePopState:!0,fitHeight:!1,content:"#main",footer:"footer",moveLeftContent:!0,moveLeftFooter:!0,menuLeftClass:"glyphicon-menu-right",menuDownClass:"glyphicon-menu-down",collapseNavBarClass:"fa-angle-double-left",expandNavBarClass:"fa-angle-double-right",activeClass:"active",navBarToggleDataAttr:"collapse-side-nav",subMenuNavToggleDataAttr:"collapse-sub-menu"}}(jQuery);
\ No newline at end of file
[13/21] ambari git commit: AMBARI-21316 Log Search UI: dock
navigation bar to top. (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21316 Log Search UI: dock navigation bar to top. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/c57329cd
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/c57329cd
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/c57329cd
Branch: refs/heads/branch-feature-logsearch-ui
Commit: c57329cd4dafc71507ef88cd2b20ae9d0e02d66d
Parents: 603297a
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 1 16:08:41 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:36:00 2017 +0300
----------------------------------------------------------------------
.../src/app/app.component.html | 20 ++++++++++++++------
.../src/app/app.component.less | 7 +++++--
.../ambari-logsearch-web-new/src/styles.less | 3 +++
3 files changed, 22 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/c57329cd/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 9b44246..8b8687a 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
@@ -15,10 +15,18 @@
limitations under the License.
-->
-<nav class="navbar">
- <div class="container-fluid">
- <h1 [ngClass]="{'full-flex-width': !httpClient.isAuthorized, 'navbar-left': true}">{{'common.title' | translate}}</h1>
- <top-menu *ngIf="httpClient.isAuthorized" class="navbar-right"></top-menu>
- </div>
-</nav>
+<header>
+ <nav class="navbar navbar-fixed-top">
+ <div class="container-fluid">
+ <h1 [ngClass]="{'full-flex-width': !httpClient.isAuthorized, 'navbar-left': true}">{{'common.title' | translate}}</h1>
+ <top-menu *ngIf="httpClient.isAuthorized" class="navbar-right"></top-menu>
+ </div>
+ </nav>
+</header>
+
+<!-- hidden element for moving the main bar outside the fixed header -->
+<div class="navbar invisible">
+ <h1> </h1>
+</div>
+
<login-form *ngIf="!httpClient.isAuthorized"></login-form>
http://git-wip-us.apache.org/repos/asf/ambari/blob/c57329cd/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
index d8410cf..e09da49 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
@@ -15,9 +15,12 @@
* limitations under the License.
*/
+
+@import '../styles.less';
+
.navbar {
border-radius: 0;
- background-color: #323544;
+ background-color: @navbar-background-color;
color: #fff;
.container-fluid {
@@ -28,7 +31,7 @@
h1 {
flex-basis: 70%;
- margin-bottom: 20px;
+ margin-bottom: @h1-vertical-margin;
text-transform: uppercase;
&.full-flex-width {
http://git-wip-us.apache.org/repos/asf/ambari/blob/c57329cd/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
index 5d5f1e3..24136fe 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
@@ -15,3 +15,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+@navbar-background-color: #323544;
+@h1-vertical-margin: 20px;
[20/21] ambari git commit: AMBARI-21322 Log Search UI: implement
loading of logs list with filter conditions. (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21322 Log Search UI: implement loading of logs list with filter conditions. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/1a2d6ced
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/1a2d6ced
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/1a2d6ced
Branch: refs/heads/branch-feature-logsearch-ui
Commit: 1a2d6cedc162c7b71b93d5f5c3272aed30bc4fc2
Parents: 56681d7
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jun 22 13:47:53 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:45:53 2017 +0300
----------------------------------------------------------------------
.../queries/audit-logs-query-params.class.ts | 38 +
.../app/classes/queries/query-params.class.ts | 23 +
.../queries/service-logs-query-params.class.ts | 32 +
.../dropdown-list/dropdown-list.component.less | 22 +
.../dropdown-list/dropdown-list.component.ts | 3 +-
.../filter-dropdown.component.spec.ts | 2 +
.../filter-dropdown.component.ts | 11 +-
.../filter-text-field.component.html | 2 +-
.../filter-text-field.component.spec.ts | 2 +
.../filter-text-field.component.ts | 8 +-
.../filters-panel/filters-panel.component.html | 16 +-
.../filters-panel/filters-panel.component.less | 9 +-
.../src/app/logs-list/logs-list.component.html | 8 +-
.../src/app/logs-list/logs-list.component.less | 5 +-
.../app/logs-list/logs-list.component.spec.ts | 28 +
.../src/app/logs-list/logs-list.component.ts | 111 ++-
.../main-container.component.html | 2 +-
.../app/menu-button/menu-button.component.html | 3 +-
.../menu-button/menu-button.component.spec.ts | 6 +-
.../app/menu-button/menu-button.component.ts | 14 +-
.../src/app/models/log.model.ts | 2 +-
.../src/app/models/service-log.model.ts | 2 +-
.../src/app/services/filtering.service.ts | 153 +++-
.../src/app/services/http-client.service.ts | 72 +-
.../src/app/services/mock-api-data.service.ts | 803 ++---------------
.../src/app/variables.less | 7 +-
.../src/assets/mock-data.ts | 883 +++++++++++++++++++
27 files changed, 1379 insertions(+), 888 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/audit-logs-query-params.class.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/audit-logs-query-params.class.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/audit-logs-query-params.class.ts
new file mode 100644
index 0000000..749ed21
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/audit-logs-query-params.class.ts
@@ -0,0 +1,38 @@
+/**
+ * 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 {QueryParams} from '@app/classes/queries/query-params.class';
+
+export class AuditLogsQueryParams extends QueryParams {
+ startIndex?: string = '0';
+ page?: string = '0';
+ pageSize?: string = '25';
+ sortBy?: string;
+ sortType?: string;
+ start_time?: string;
+ end_time?: string;
+ clusters?: string;
+ iMessage?: string;
+ eMessage?: string;
+ mustBe?: string;
+ mustNot?: string;
+ includeQuery?: string;
+ excludeQuery?: string;
+ from?: string;
+ to?: string;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/query-params.class.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/query-params.class.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/query-params.class.ts
new file mode 100644
index 0000000..73db35a
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/query-params.class.ts
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+
+export class QueryParams {
+ constructor(options: QueryParams) {
+ Object.assign(this, options);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/service-logs-query-params.class.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/service-logs-query-params.class.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/service-logs-query-params.class.ts
new file mode 100644
index 0000000..829783e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/classes/queries/service-logs-query-params.class.ts
@@ -0,0 +1,32 @@
+/**
+ * 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 {AuditLogsQueryParams} from '@app/classes/queries/audit-logs-query-params.class';
+
+export class ServiceLogsQueryParams extends AuditLogsQueryParams {
+ level?: string;
+ host_name?: string;
+ component_name?: string;
+ file_name?: string;
+ bundle_id?: string;
+ hostList?: string;
+ find?: string;
+ sourceLogId?: string;
+ keywordType?: string;
+ token?: string;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.less
new file mode 100644
index 0000000..d0f079a
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.less
@@ -0,0 +1,22 @@
+/**
+ * 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.
+ */
+
+:host {
+ max-height: 500px; // TODO get rid of magic number, base on actual design
+ overflow-y: auto;
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
index dfd2527..808fcf8 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/dropdown-list/dropdown-list.component.ts
@@ -20,7 +20,8 @@ import {Component, OnInit, Input, Output, EventEmitter} from '@angular/core';
@Component({
selector: 'ul.dropdown-menu',
- templateUrl: './dropdown-list.component.html'
+ templateUrl: './dropdown-list.component.html',
+ styleUrls: ['./dropdown-list.component.less']
})
export class DropdownListComponent implements OnInit {
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
index ba0bd03..e0414f3 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.spec.ts
@@ -20,6 +20,7 @@ import {async, ComponentFixture, TestBed} from '@angular/core/testing';
import {Http} from '@angular/http';
import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+import {FilteringService} from '@app/services/filtering.service';
import {FilterDropdownComponent} from './filter-dropdown.component';
@@ -39,6 +40,7 @@ describe('FilterDropdownComponent', () => {
useFactory: HttpLoaderFactory,
deps: [Http]
})],
+ providers: [FilteringService],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
index de6e79b..faaafcb 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.ts
@@ -16,6 +16,7 @@
*/
import {Component, OnInit, Input} from '@angular/core';
+import {FilteringService} from '@app/services/filtering.service';
@Component({
selector: 'filter-dropdown',
@@ -24,7 +25,8 @@ import {Component, OnInit, Input} from '@angular/core';
})
export class FilterDropdownComponent implements OnInit {
- constructor() { }
+ constructor(private filtering: FilteringService) {
+ }
ngOnInit() {
this.filterInstance.selectedValue = this.filterInstance.options[0].value;
@@ -38,8 +40,11 @@ export class FilterDropdownComponent implements OnInit {
options: any[];
setSelectedValue(options: any): void {
- this.filterInstance.selectedValue = options.value;
- this.filterInstance.selectedLabel = options.label;
+ if (this.filterInstance.selectedValue !== options.value) {
+ this.filterInstance.selectedValue = options.value;
+ this.filterInstance.selectedLabel = options.label;
+ this.filtering.filteringSubject.next(null);
+ }
};
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
index 3ccbd6f..ed3c4ba 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.html
@@ -17,5 +17,5 @@
<div class="input-group">
<span class="input-group-addon">{{filterInstance.label | translate}}</span>
- <input type="text" class="form-control" [(ngModel)]="filterInstance.value">
+ <input type="text" class="form-control" [(ngModel)]="filterInstance.selectedValue" (change)="onValueChange()"> <!-- TODO use ngModelChange with debounce -->
</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
index c54171a..e4f026c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.spec.ts
@@ -21,6 +21,7 @@ import {Http} from '@angular/http';
import {FormsModule} from '@angular/forms';
import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+import {FilteringService} from '@app/services/filtering.service';
import {FilterTextFieldComponent} from './filter-text-field.component';
@@ -43,6 +44,7 @@ describe('FilterTextFieldComponent', () => {
deps: [Http]
})
],
+ providers: [FilteringService],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
.compileComponents();
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
index 6bab2e6..3f23ffd 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.ts
@@ -16,6 +16,7 @@
*/
import {Component, OnInit, Input} from '@angular/core';
+import {FilteringService} from '@app/services/filtering.service';
@Component({
selector: 'filter-text-field',
@@ -24,7 +25,8 @@ import {Component, OnInit, Input} from '@angular/core';
})
export class FilterTextFieldComponent implements OnInit {
- constructor() { }
+ constructor(private filtering: FilteringService) {
+ }
ngOnInit() {
}
@@ -32,4 +34,8 @@ export class FilterTextFieldComponent implements OnInit {
@Input()
filterInstance: any;
+ onValueChange() {
+ this.filtering.filteringSubject.next(null);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
index 20f4353..6387c22 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.html
@@ -20,17 +20,19 @@
<filter-text-field [filterInstance]="filtering.filters.text"></filter-text-field>
<filter-dropdown [filterInstance]="filtering.filters.timeRange"></filter-dropdown>
<filter-dropdown [filterInstance]="filtering.filters.timeZone"></filter-dropdown>
- <button class="btn btn-success" type="button">
+ <!--button class="btn btn-success" type="button">
<span class="fa fa-search"></span>
- </button>
+ </button-->
</div>
<div class="default-flex col-md-4">
- <menu-button [label]="filtering.filters.components.label" [iconClass]="filtering.filters.components.iconClass"
- [subItems]="filtering.filters.components.options" [isFilter]="true"></menu-button>
- <menu-button [label]="filtering.filters.levels.label" [iconClass]="filtering.filters.levels.iconClass"
- [subItems]="filtering.filters.levels.options" [isFilter]="true"></menu-button>
- <menu-button label="filter.capture" iconClass="fa fa-caret-right"></menu-button>
<a href="#">
<span class="fa fa-search-minus"></span> {{'filter.excluded' | translate}}
</a>
+ <menu-button [label]="filtering.filters.components.label" [iconClass]="filtering.filters.components.iconClass"
+ [subItems]="filtering.filters.components.options" [isFilter]="true"
+ [filterInstance]="filtering.filters.components"></menu-button>
+ <menu-button [label]="filtering.filters.levels.label" [iconClass]="filtering.filters.levels.iconClass"
+ [subItems]="filtering.filters.levels.options" [isFilter]="true"
+ [filterInstance]="filtering.filters.levels"></menu-button>
+ <menu-button label="filter.capture" iconClass="fa fa-caret-right"></menu-button>
</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
index d2400a4..46a157c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
@@ -29,10 +29,17 @@
filter-dropdown {
border: @input-border;
- border-right-width: 0;
+
+ &:not(:last-child) {
+ border-right-width: 0;
+ }
&:first-child {
border-radius: @button-border-radius 0 0 @button-border-radius;
}
+
+ &:last-child {
+ border-radius: 0 @button-border-radius @button-border-radius 0;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
index cf4bb57..827f63c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
@@ -15,10 +15,10 @@
limitations under the License.
-->
-<accordion-panel *ngFor="let log of logs; let i = index" [toggleId]="'details-' + i" class="col-md-12">
+<accordion-panel *ngFor="let log of logs | async; let i = index" [toggleId]="'details-' + i" class="col-md-12">
<ng-template>
- <div [ngClass]="'hexagon ' + log.level"></div>
- <div [ngClass]="'col-md-1 log-status ' + log.level">{{log.level}}</div>
+ <div [ngClass]="'hexagon ' + log.className"></div>
+ <div [ngClass]="'col-md-1 log-status ' + log.className">{{log.level}}</div>
<div class="col-md-3">
<div class="log-type">{{log.type}}</div>
<time class="log-time">{{log.time}}</time>
@@ -29,7 +29,7 @@
<span class="action-icon fa fa-external-link"></span>
<span class="action-icon fa fa-bullseye"></span>
</div>
- <div class="log-content" [innerHTML]="log.content"></div>
+ <div class="log-content">{{log.message}}</div>
</div>
</ng-template>
</accordion-panel>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
index 6bf54fe..6ed0463 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
@@ -19,7 +19,9 @@
:host {
display: block;
- margin-top: @block-margin-top;
+ overflow: hidden;
+ padding-top: @block-margin-top;
+ background-color: @main-background-color; // TODO implement actual color
.hexagon {
// TODO get rid of magic numbers, base on actual design
@@ -102,6 +104,7 @@
overflow: hidden;
max-height: @default-line-height * 2em;
padding-right: 65px;
+ white-space: pre-wrap;
}
.log-actions {
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
index 53cdee6..072bfcd 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
@@ -17,16 +17,44 @@
import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {StoreModule} from '@ngrx/store';
+import {AuditLogsService, auditLogs} from '@app/services/storage/audit-logs.service';
+import {ServiceLogsService, serviceLogs} from '@app/services/storage/service-logs.service';
+import {HttpClientService} from '@app/services/http-client.service';
+import {FilteringService} from '@app/services/filtering.service';
import {LogsListComponent} from './logs-list.component';
describe('LogsListComponent', () => {
let component: LogsListComponent;
let fixture: ComponentFixture<LogsListComponent>;
+ const httpClient = {
+ get: () => {
+ return {
+ subscribe: () => {
+ }
+ };
+ }
+ };
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [LogsListComponent],
+ imports: [
+ StoreModule.provideStore({
+ auditLogs,
+ serviceLogs
+ })
+ ],
+ providers: [
+ {
+ provide: HttpClientService,
+ useValue: httpClient
+ },
+ AuditLogsService,
+ ServiceLogsService,
+ FilteringService
+ ],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
.compileComponents();
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
index 5fd0ce5..6bc5ab9 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
@@ -15,7 +15,11 @@
* limitations under the License.
*/
-import {Component, OnInit} from '@angular/core';
+import {Component, OnInit, Input} from '@angular/core';
+import 'rxjs/add/operator/map';
+import {HttpClientService} from '@app/services/http-client.service';
+import {ServiceLogsService} from '@app/services/storage/service-logs.service';
+import {FilteringService} from '@app/services/filtering.service';
@Component({
selector: 'logs-list',
@@ -24,56 +28,69 @@ import {Component, OnInit} from '@angular/core';
})
export class LogsListComponent implements OnInit {
- constructor() {
+ constructor(private httpClient: HttpClientService, private serviceLogsStorage: ServiceLogsService, private filtering: FilteringService) {
+ this.filtering.filteringSubject.subscribe(this.loadLogs.bind(this));
}
ngOnInit() {
+ this.loadLogs();
}
- // TODO implement loading logs from API
- private readonly logs = [
- {
- level: 'fatal',
- type: 'ambari_agent',
- time: '2017/01/31 18:00:00',
- content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
- },
- {
- level: 'error',
- type: 'ambari_agent',
- time: '2017/01/31 18:00:00',
- content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
- },
- {
- level: 'warn',
- type: 'ambari_agent',
- time: '2017/01/31 18:00:00',
- content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
- },
- {
- level: 'info',
- type: 'ambari_agent',
- time: '2017/01/31 18:00:00',
- content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
- },
- {
- level: 'debug',
- type: 'ambari_agent',
- time: '2017/01/31 18:00:00',
- content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
- },
- {
- level: 'trace',
- type: 'ambari_agent',
- time: '2017/01/31 18:00:00',
- content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
- },
- {
- level: 'unknown',
- type: 'ambari_agent',
- time: '2017/01/31 18:00:00',
- content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
- }
- ];
+ @Input()
+ private logsArrayId: string;
+
+ private readonly usedFilters = {
+ clusters: ['clusters'],
+ text: ['iMessage'],
+ timeRange: ['end_time', 'start_time'],
+ components: ['component_name'],
+ levels: ['level']
+ };
+
+ private logs = this.serviceLogsStorage.getInstances().map(logs => {
+ return logs.map(log => {
+ return {
+ type: log.type,
+ level: log.level,
+ className: log.level.toLowerCase(),
+ message: log.log_message,
+ time: new Date(log.logtime).toLocaleDateString() + ' ' + new Date(log.logtime).toLocaleTimeString() // TODO use moment with custom time zone
+ }
+ });
+ });
+
+ private loadLogs(): void {
+ this.httpClient.get(this.logsArrayId, this.getParams()).subscribe(response => {
+ this.serviceLogsStorage.clear();
+ const logs = response.json().logList;
+ this.serviceLogsStorage.addInstances(logs);
+ });
+ }
+
+ private getParams(): any {
+ let params = {};
+ Object.keys(this.usedFilters).forEach(key => {
+ const inputFilter = this.filtering.filters[key],
+ inputValue = inputFilter.selectedValue,
+ paramNames = this.usedFilters[key];
+ paramNames.forEach(paramName => {
+ let value;
+ const valueGetter = this.filtering.valueGetters[paramName];
+ if (valueGetter) {
+ if (paramName === 'start_time') {
+ value = valueGetter(inputValue, params['end_time']);
+ } else {
+ value = valueGetter(inputValue);
+ }
+ } else {
+ value = inputValue;
+ }
+ if (value) {
+ params[paramName] = value;
+ }
+ });
+ }, this);
+ return params;
+ }
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
index 34af2b8..61562d2 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
@@ -17,4 +17,4 @@
<login-form *ngIf="!httpClient.isAuthorized"></login-form>
<filters-panel *ngIf="httpClient.isAuthorized" class="row"></filters-panel>
-<logs-list *ngIf="httpClient.isAuthorized"></logs-list>
+<logs-list *ngIf="httpClient.isAuthorized" [logsArrayId]="'serviceLogs'"></logs-list>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
index 4ed01bd..132d717 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.html
@@ -22,5 +22,6 @@
<br>
<a *ngIf="label" (mousedown)="onMouseDown($event)" [ngClass]="labelClass" (mouseup)="onMouseUp($event)"
(click)="$event.stopPropagation()">{{label | translate}}</a>
- <ul class="dropdown-menu" [isFilter]="isFilter" *ngIf="hasSubItems" [items]="subItems"></ul>
+ <ul class="dropdown-menu" [isFilter]="isFilter" *ngIf="hasSubItems" [items]="subItems"
+ (selectedItemChange)="setSelectedValue($event)"></ul>
</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
index 9af8f00..424d322 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.spec.ts
@@ -22,6 +22,7 @@ import {Http} from '@angular/http';
import {TranslateModule, TranslateLoader} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
import {ComponentActionsService} from '@app/services/component-actions.service';
+import {FilteringService} from '@app/services/filtering.service';
import {MenuButtonComponent} from './menu-button.component';
@@ -42,7 +43,10 @@ describe('MenuButtonComponent', () => {
useFactory: HttpLoaderFactory,
deps: [Http]
})],
- providers: [ComponentActionsService],
+ providers: [
+ ComponentActionsService,
+ FilteringService
+ ],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
index 9505f5b..ded01b7 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/menu-button/menu-button.component.ts
@@ -18,6 +18,7 @@
import {Component, AfterViewInit, Input, ViewChild, ElementRef} from '@angular/core';
import {ComponentActionsService} from '@app/services/component-actions.service';
+import {FilteringService} from '@app/services/filtering.service';
import * as $ from 'jquery';
@Component({
@@ -27,7 +28,7 @@ import * as $ from 'jquery';
})
export class MenuButtonComponent implements AfterViewInit {
- constructor(private actions: ComponentActionsService) {
+ constructor(private actions: ComponentActionsService, private filtering: FilteringService) {
}
ngAfterViewInit() {
@@ -46,6 +47,9 @@ export class MenuButtonComponent implements AfterViewInit {
isFilter: boolean;
@Input()
+ filterInstance?: any;
+
+ @Input()
iconClass: string;
@Input()
@@ -87,4 +91,12 @@ export class MenuButtonComponent implements AfterViewInit {
}
}
+ setSelectedValue(options: any): void {
+ if (this.filterInstance.selectedValue !== options.value) {
+ this.filterInstance.selectedValue = options.value;
+ this.filterInstance.selectedLabel = options.label;
+ this.filtering.filteringSubject.next(null);
+ }
+ };
+
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
index 825b4cf..abe1b48 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/log.model.ts
@@ -32,6 +32,6 @@ export interface Log {
event_md5: string;
event_dur_ms: number;
_ttl_: string;
- _expire_at_: string;
+ _expire_at_: number;
_router_field_?: number;
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
index e386ad5..6f76bcc 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/models/service-log.model.ts
@@ -22,6 +22,6 @@ export interface ServiceLog extends Log {
path: string;
host: string;
level: string;
- logtime: string;
+ logtime: number;
ip: string;
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
index 84cbc50..c4d2bdf 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/filtering.service.ts
@@ -17,6 +17,7 @@
*/
import {Injectable} from '@angular/core';
+import {Subject} from 'rxjs/Subject';
import * as moment from 'moment-timezone';
@Injectable()
@@ -26,67 +27,110 @@ export class FilteringService {
}
// TODO implement loading of real options data
- readonly filters = {
+ filters = {
clusters: {
label: 'filter.clusters',
options: [
{
label: 'filter.all',
- value: 'ALL'
+ value: ''
},
{
- label: 'c0',
- value: 'c0'
+ label: 'cl0',
+ value: 'cl0'
},
{
- label: 'c1',
- value: 'c1'
+ label: 'cl1',
+ value: 'cl1'
+ },
+ {
+ label: 'cl2',
+ value: 'cl2'
+ },
+ {
+ label: 'cl3',
+ value: 'cl3'
+ },
+ {
+ label: 'cl4',
+ value: 'cl4'
}
],
selectedValue: '',
- selectedLabel: ''
+ selectedLabel: '',
+ paramName: 'clusters',
},
text: {
label: 'filter.message',
- value: ''
+ selectedValue: ''
},
timeRange: {
options: [
{
label: 'filter.timeRange.1hr',
- value: '1HR'
+ value: {
+ type: 'LAST',
+ unit: 'h',
+ interval: 1
+ }
},
{
label: 'filter.timeRange.24hr',
- value: '24HR'
+ value: {
+ type: 'LAST',
+ unit: 'h',
+ interval: 24
+ }
},
{
label: 'filter.timeRange.today',
- value: 'TODAY'
+ value: {
+ type: 'CURRENT',
+ unit: 'd'
+ }
},
{
label: 'filter.timeRange.yesterday',
- value: 'YESTERDAY'
+ value: {
+ type: 'PAST',
+ unit: 'd'
+ }
},
{
label: 'filter.timeRange.7d',
- value: '7D'
+ value: {
+ type: 'LAST',
+ unit: 'd',
+ interval: 7
+ }
},
{
label: 'filter.timeRange.30d',
- value: '30d'
+ value: {
+ type: 'LAST',
+ unit: 'd',
+ interval: 30
+ }
},
{
label: 'filter.timeRange.thisMonth',
- value: 'THIS_MONTH'
+ value: {
+ type: 'CURRENT',
+ unit: 'M'
+ }
},
{
label: 'filter.timeRange.lastMonth',
- value: 'LAST_MONTH'
+ value: {
+ type: 'PAST',
+ unit: 'M'
+ }
},
{
label: 'filter.timeRange.custom',
- value: 'CUSTOM'
+ value: {
+ type: 'CUSTOM'
+ }
}
],
selectedValue: '',
@@ -94,8 +138,9 @@ export class FilteringService {
},
timeZone: {
options: moment.tz.names().map(zone => {
+ // TODO map labels according to actual design requirements
return {
- label: zone,
+ label: `${zone} (${moment.tz(zone).format('Z')})`,
value: zone
};
}),
@@ -107,20 +152,24 @@ export class FilteringService {
iconClass: 'fa fa-cubes',
options: [
{
- label: 'DataNode',
- value: 'DATANODE'
+ label: 'filter.all',
+ value: ''
+ },
+ {
+ label: 'ambari_agent',
+ value: 'ambari_agent'
},
{
- label: 'NameNode',
- value: 'NAMENODE'
+ label: 'ams_collector',
+ value: 'ams_collector'
},
{
- label: 'ZooKeeper Server',
- value: 'ZOOKEEPER_SERVER'
+ label: 'zookeeper_server',
+ value: 'zookeeper_server'
},
{
- label: 'Metrics Collector',
- value: 'METRICS_COLLECTOR'
+ label: 'zookeeper_client',
+ value: 'zookeeper_client'
}
],
selectedValue: '',
@@ -131,6 +180,10 @@ export class FilteringService {
iconClass: 'fa fa-sort-amount-asc',
options: [
{
+ label: 'filter.all',
+ value: ''
+ },
+ {
label: 'levels.fatal',
value: 'FATAL'
},
@@ -164,4 +217,52 @@ export class FilteringService {
}
};
+ readonly valueGetters = {
+ end_time: value => {
+ let time;
+ if (value) {
+ switch (value.type) {
+ case 'LAST':
+ time = moment();
+ break;
+ case 'CURRENT':
+ // TODO consider user's timezone
+ time = moment().endOf(value.unit);
+ break;
+ case 'PAST':
+ // TODO consider user's timezone
+ time = moment().startOf(value.unit).millisecond(-1);
+ break;
+ default:
+ break;
+ }
+ }
+ return time ? time.toISOString() : '';
+ },
+ start_time: (value, current) => {
+ let time;
+ if (value) {
+ const endTime = moment(moment(current).valueOf());
+ switch (value.type) {
+ case 'LAST':
+ time = endTime.subtract(value.interval, value.unit);
+ break;
+ case 'CURRENT':
+ // TODO consider user's timezone
+ time = moment().startOf(value.unit);
+ break;
+ case 'PAST':
+ // TODO consider user's timezone
+ time = endTime.startOf(value.unit);
+ break;
+ default:
+ break;
+ }
+ }
+ return time ? time.toISOString() : '';
+ }
+ };
+
+ filteringSubject = new Subject();
+
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
index 84f82b3..cef6696 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
@@ -21,6 +21,8 @@ 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';
+import {AuditLogsQueryParams} from '@app/classes/queries/audit-logs-query-params.class';
+import {ServiceLogsQueryParams} from '@app/classes/queries/service-logs-query-params.class';
@Injectable()
export class HttpClientService extends Http {
@@ -31,9 +33,18 @@ export class HttpClientService extends Http {
private readonly apiPrefix = 'api/v1/';
- private readonly urls = {
- status: 'status',
- auditLogs: 'audit/logs'
+ private readonly endPoints = {
+ status: {
+ url: 'status'
+ },
+ auditLogs: {
+ url: 'audit/logs',
+ params: opts => new AuditLogsQueryParams(opts)
+ },
+ serviceLogs: {
+ url: 'service/logs',
+ params: opts => new ServiceLogsQueryParams(opts)
+ }
};
private readonly unauthorizedStatuses = [401, 403, 419];
@@ -41,21 +52,28 @@ export class HttpClientService extends Http {
isAuthorized: boolean;
generateUrlString(url: string): string {
- const presetUrl = this.urls[url];
- return presetUrl ? (this.apiPrefix + this.urls[url]) : url;
+ const preset = this.endPoints[url];
+ return preset ? `${this.apiPrefix}${preset.url}` : url;
}
- generateUrl(url: string | Request): string | Request {
- if (typeof url === 'string') {
- return this.generateUrlString(url);
+ generateUrl(request: string | Request): string | Request {
+ if (typeof request === 'string') {
+ return this.generateUrlString(request);
}
- if (url instanceof Request) {
- url.url = this.generateUrlString(url.url);
- return url;
+ if (request instanceof Request) {
+ request.url = this.generateUrlString(request.url);
+ return request;
}
}
- handleError(request: Observable<Response>) {
+ generateOptions(url: string, params: {[key: string]: string}): RequestOptionsArgs {
+ const preset = this.endPoints[url];
+ return {
+ params: preset && preset.params ? preset.params(params) : params
+ };
+ }
+
+ handleError(request: Observable<Response>): void {
request.subscribe(null, (error: any) => {
if (this.unauthorizedStatuses.indexOf(error.status) > -1) {
this.isAuthorized = false;
@@ -63,38 +81,14 @@ export class HttpClientService extends Http {
});
}
- request(url: string | Request, options?: RequestOptionsArgs):Observable<Response> {
+ 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);
+ get(url, params?: {[key: string]: string}): Observable<Response> {
+ return super.get(this.generateUrlString(url), this.generateOptions(url, params));
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
index a6215e6..757f68d 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
@@ -20,6 +20,8 @@ import {URLSearchParams, Response, ResponseOptions} from '@angular/http';
import {InMemoryDbService, InMemoryBackendService, createErrorResponse} from 'angular-in-memory-web-api';
import {Observable} from 'rxjs/Observable';
import {Subscriber} from 'rxjs/Subscriber';
+import * as moment from 'moment';
+import {mockData} from '../../assets/mock-data';
export class mockBackendService extends InMemoryBackendService {
getLocation(url: string): any {
@@ -29,6 +31,35 @@ export class mockBackendService extends InMemoryBackendService {
export class mockApiDataService implements InMemoryDbService {
+ private readonly filterMap = {
+ 'api/v1/service/logs': {
+ pathToCollection: 'logList',
+ filters: {
+ clusters: {
+ key: 'cluster'
+ },
+ component_name: {
+ key: 'type'
+ },
+ level: {
+ key: 'level'
+ },
+ iMessage: {
+ key: 'log_message',
+ filterFunction: (value, filterValue) => value.toLowerCase().indexOf(filterValue.toLowerCase()) > -1
+ },
+ start_time: {
+ key: 'logtime',
+ filterFunction: (value, filterValue) => value >= moment(filterValue).valueOf()
+ },
+ end_time: {
+ key: 'logtime',
+ filterFunction: (value, filterValue) => value < moment(filterValue).valueOf()
+ }
+ }
+ }
+ };
+
parseUrl(url: string): any {
const urlLocation = mockBackendService.prototype.getLocation(url),
query = urlLocation.search && new URLSearchParams(urlLocation.search.substr(1)),
@@ -51,7 +82,7 @@ export class mockApiDataService implements InMemoryDbService {
return interceptorArgs.passThruBackend.createConnection(interceptorArgs.requestInfo.req).response;
} else {
let is404 = false;
- const data = pathArray.reduce((currentObject, currentKey, index, array) => {
+ const allData = pathArray.reduce((currentObject, currentKey, index, array) => {
if (!currentObject && index < array.length - 1) {
return {};
} else if (currentObject.hasOwnProperty(currentKey)) {
@@ -66,9 +97,31 @@ export class mockApiDataService implements InMemoryDbService {
interceptorArgs.requestInfo.req, 404, 'Not found'
))));
} else {
+ let filteredData;
+ const filterMapItem = this.filterMap[path];
+ if (query && filterMapItem) {
+ filteredData = {};
+ const collection = allData[filterMapItem.pathToCollection],
+ filteredCollection = collection.filter(item => {
+ let result = true;
+ query.paramsMap.forEach((value, key) => {
+ const paramValue = value[0], // TODO implement multiple conditions
+ paramFilter = filterMapItem.filters[key];
+ if (paramFilter &&
+ ((paramFilter.filterFunction && !paramFilter.filterFunction(item[paramFilter.key], paramValue)) ||
+ (!paramFilter.filterFunction && item[paramFilter.key] !== paramValue))) {
+ result = false;
+ }
+ });
+ return result;
+ });
+ filteredData[filterMapItem.pathToCollection] = filteredCollection;
+ } else {
+ filteredData = allData;
+ }
return new Observable<Response>((subscriber: Subscriber<Response>) => subscriber.next(new Response(new ResponseOptions({
status: 200,
- body: data
+ body: filteredData
}))));
}
}
@@ -80,750 +133,6 @@ export class mockApiDataService implements InMemoryDbService {
}
createDb() {
- return {
- login: {},
- api: {
- v1: {
- audit: {
- logs: {
- logList: [
- {
- policy: 'policy',
- reason: 'Authentication required',
- result: 0,
- text: 'Please log in',
- tags: [
- 'ambari_agent'
- ],
- resource: '/ambari-agent',
- sess: '0',
- access: '0',
- logType: 'AmbariAudit',
- tags_str: 'ambari_agent',
- resType: 'agent',
- reqUser: 'admin',
- reqData: 'data',
- repoType: 1,
- repo: 'ambari',
- proxyUsers: [
- 'admin'
- ],
- evtTime: '2017-05-29T11:30:22.531Z',
- enforcer: 'ambari-acl',
- reqContext: 'ambari',
- cliType: 'GET',
- cliIP: '192.168.0.1',
- agent: 'agent',
- agentHost: 'localhost',
- action: 'SERVICE_CHECK',
- type: 'ambari-audit',
- _version_: 2,
- id: 'id0',
- file: 'ambari-agent.log',
- seq_num: 3,
- bundle_id: 'b0',
- case_id: 'c0',
- log_message: 'User(admin), Operation(SERVICE_CHECK)',
- logfile_line_number: 4,
- message_md5: '12345678900987654321',
- cluster: 'cl0',
- event_count: 0,
- event_md5: '09876543211234567890',
- event_dur_ms: 100,
- _ttl_: "+7DAYS",
- _expire_at_: '2017-05-29T11:30:22.531Z',
- _router_field_: 5
- },
- {
- policy: 'policy',
- reason: 'Server error',
- result: 1,
- text: 'Something went wrong',
- tags: [
- 'ambari_agent'
- ],
- resource: '/ambari-agent',
- sess: '1',
- access: '1',
- logType: 'AmbariAudit',
- tags_str: 'ambari_server',
- resType: 'server',
- reqUser: 'user',
- reqData: 'data',
- repoType: 1,
- repo: 'ambari',
- proxyUsers: [
- 'user'
- ],
- evtTime: '2017-05-29T11:30:22.531Z',
- enforcer: 'hdfs',
- reqContext: 'ambari_server',
- cliType: 'PUT',
- cliIP: '192.168.0.1',
- agent: 'agent',
- agentHost: 'localhost',
- action: 'SERVICE_CHECK',
- type: 'ambari-audit',
- _version_: 4,
- id: 'id1',
- file: 'ambari-agent.log',
- seq_num: 5,
- bundle_id: 'b1',
- case_id: 'c1',
- log_message: 'User(user), Operation(SERVICE_CHECK)',
- logfile_line_number: 6,
- message_md5: '10293847561029384756',
- cluster: 'cl1',
- event_count: 2,
- event_md5: '01928374650192837465',
- event_dur_ms: 500,
- _ttl_: "+7DAYS",
- _expire_at_: '2017-05-29T11:30:22.531Z',
- _router_field_: 10
- }
- ],
- bargraph: {
- graphData: [
- {
- dataCount: [
- {
- name: 'n0',
- value: 1
- },
- {
- name: 'n1',
- value: 2
- }
- ],
- name: 'graph0'
- },
- {
- dataCount: [
- {
- name: 'n2',
- value: 10
- },
- {
- name: 'n3',
- value: 20
- }
- ],
- name: 'graph1'
- }
- ]
- },
- components: {},
- resources: {
- graphData: [
- {
- dataCount: [
- {
- name: 'n16',
- value: 800
- },
- {
- name: 'n17',
- value: 400
- }
- ],
- name: 'graph8'
- },
- {
- dataCount: [
- {
- name: 'n18',
- value: 600
- },
- {
- name: 'n19',
- value: 300
- }
- ],
- name: 'graph9'
- }
- ]
- },
- schema: {
- fields: ''
- },
- serviceload: {
- graphData: [
- {
- dataCount: [
- {
- name: 'n4',
- value: 1
- },
- {
- name: 'n5',
- value: 2
- }
- ],
- name: 'graph2'
- },
- {
- dataCount: [
- {
- name: 'n6',
- value: 10
- },
- {
- name: 'n7',
- value: 20
- }
- ],
- name: 'graph3'
- }
- ]
- }
- }
- },
- public: {
- config: {}
- },
- service: {
- logs: {
- logList: [
- {
- path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
- host: 'h0',
- level: 'WARN',
- logtime: '2017-05-28T11:30:22.531Z',
- ip: '192.168.0.1',
- logfile_line_number: 8,
- type: 'ams_collector',
- _version_: 9,
- id: 'id2',
- file: 'ambari-metrics-collector.log',
- seq_num: 10,
- bundle_id: 'b2',
- case_id: 'c2',
- log_message: 'Connection refused',
- message_md5: '1357908642',
- cluster: 'cl2',
- event_count: 5,
- event_md5: '1908755391',
- event_dur_ms: 200,
- _ttl_: "+5DAYS",
- _expire_at_: '2017-05-29T11:30:22.531Z',
- _router_field_: 20
- },
- {
- path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
- host: 'h1',
- level: 'ERROR',
- logtime: '2017-05-28T10:30:22.531Z',
- ip: '192.168.0.2',
- type: 'ams_collector',
- _version_: 14,
- id: 'id3',
- file: 'ambari-metrics-collector.log',
- seq_num: 15,
- bundle_id: 'b3',
- case_id: 'c3',
- log_message: 'Connection refused',
- logfile_line_number: 16,
- message_md5: '1357908642',
- cluster: 'cl3',
- event_count: 2,
- event_md5: '1029384756',
- event_dur_ms: 700,
- _ttl_: "+5DAYS",
- _expire_at_: '2017-05-29T10:30:22.531Z',
- _router_field_: 5
- }
- ],
- aggregated: {
- graphData: [
- {
- name: 'n0',
- count: 100,
- dataList: [
- {
- name: 'n1',
- count: 50,
- dataList: null
- },
- {
- name: 'n2',
- count: 200,
- dataList: null
- }
- ]
- },
- {
- name: 'n3',
- count: 10,
- dataList: [
- {
- name: 'n4',
- count: 5,
- dataList: null
- },
- {
- name: 'n5',
- count: 20,
- dataList: null
- }
- ]
- }
- ]
- },
- components: {
- count: {
- anygraph: {
- graphData: [
- {
- dataCount: [
- {
- name: 'n8',
- value: 50
- },
- {
- name: 'n9',
- value: 100
- }
- ],
- name: 'graph4'
- },
- {
- dataCount: [
- {
- name: 'n10',
- value: 5
- },
- {
- name: 'n11',
- value: 10
- }
- ],
- name: 'graph5'
- }
- ]
- }
- },
- levels: {
- counts: {
- vNodeList: [
- {
- name: 'ambari',
- type: 0,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '10'
- },
- {
- name: 'WARN',
- value: '50'
- }
- ],
- childs: [
- {
- name: 'hdfs',
- type: 2,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '10'
- },
- {
- name: 'WARN',
- value: '20'
- }
- ],
- isParent: false,
- isRoot: false
- },
- {
- name: 'zookeeper',
- type: 3,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '20'
- },
- {
- name: 'WARN',
- value: '40'
- }
- ],
- isParent: false,
- isRoot: false
- }
- ],
- isParent: true,
- isRoot: false
- },
- {
- name: 'ambari_agent',
- type: 1,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '100'
- },
- {
- name: 'WARN',
- value: '500'
- }
- ],
- isParent: false,
- isRoot: false
- }
- ]
- }
- }
- },
- files: {
- hostLogFiles: {
- clusters: [
- 'c0',
- 'c1'
- ],
- services: [
- 'hdfs',
- 'zookeeper'
- ]
- }
- },
- histogram: {
- graphData: [
- {
- dataCount: [
- {
- name: 'n12',
- value: 1000
- },
- {
- name: 'n13',
- value: 2000
- }
- ],
- name: 'graph6'
- },
- {
- dataCount: [
- {
- name: 'n14',
- value: 700
- },
- {
- name: 'n15',
- value: 900
- }
- ],
- name: 'graph7'
- }
- ]
- },
- hosts: {
- components: {
- vNodeList: [
- {
- name: 'ambari',
- type: 0,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '100'
- },
- {
- name: 'WARN',
- value: '500'
- }
- ],
- childs: [
- {
- name: 'ambari_metrics',
- type: 2,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '100'
- },
- {
- name: 'WARN',
- value: '200'
- }
- ],
- isParent: false,
- isRoot: false
- },
- {
- name: 'hbase',
- type: 3,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '200'
- },
- {
- name: 'WARN',
- value: '400'
- }
- ],
- isParent: false,
- isRoot: false
- }
- ],
- isParent: true,
- isRoot: false
- },
- {
- name: 'ambari_server',
- type: 1,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '1000'
- },
- {
- name: 'WARN',
- value: '5000'
- }
- ],
- isParent: false,
- isRoot: false
- }
- ]
- },
- count: {
- getvCounts: [
- {
- name: 'n20',
- count: 100
- },
- {
- name: 'n21',
- count: 200
- }
- ]
- }
- },
- levels: {
- counts: {
- getvNameValues: [
- {
- name: 'n22',
- count: 1000
- },
- {
- name: 'n23',
- count: 2000
- }
- ]
- }
- },
- schema: {
- fields: ''
- },
- serviceconfig: '',
- tree: {
- vNodeList: [
- {
- name: 'ambari',
- type: 0,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '1000'
- },
- {
- name: 'WARN',
- value: '5000'
- }
- ],
- childs: [
- {
- name: 'yarn',
- type: 2,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '1000'
- },
- {
- name: 'WARN',
- value: '2000'
- }
- ],
- isParent: false,
- isRoot: false
- },
- {
- name: 'hive',
- type: 3,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '2000'
- },
- {
- name: 'WARN',
- value: '4000'
- }
- ],
- isParent: false,
- isRoot: false
- }
- ],
- isParent: true,
- isRoot: false
- },
- {
- name: 'ambari_server',
- type: 1,
- logLevelCount: [
- {
- name: 'ERROR',
- value: '10000'
- },
- {
- name: 'WARN',
- value: '50000'
- }
- ],
- isParent: false,
- isRoot: false
- }
- ]
- },
- truncated: {
- logList: [
- {
- path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
- host: 'h0',
- level: 'WARN',
- logtime: '2017-05-28T11:30:22.531Z',
- ip: '192.168.0.1',
- logfile_line_number: 8,
- type: 'ams_collector',
- _version_: 9,
- id: 'id2',
- file: 'ambari-metrics-collector.log',
- seq_num: 10,
- bundle_id: 'b2',
- case_id: 'c2',
- log_message: 'Connection refused',
- message_md5: '1357908642',
- cluster: 'cl2',
- event_count: 5,
- event_md5: '1908755391',
- event_dur_ms: 200,
- _ttl_: "+5DAYS",
- _expire_at_: '2017-05-29T11:30:22.531Z',
- _router_field_: 20
- },
- {
- path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
- host: 'h1',
- level: 'ERROR',
- logtime: '2017-05-28T10:30:22.531Z',
- ip: '192.168.0.2',
- type: 'ams_collector',
- _version_: 14,
- id: 'id3',
- file: 'ambari-metrics-collector.log',
- seq_num: 15,
- bundle_id: 'b3',
- case_id: 'c3',
- log_message: 'Connection refused',
- logfile_line_number: 16,
- message_md5: '1357908642',
- cluster: 'cl3',
- event_count: 2,
- event_md5: '1029384756',
- event_dur_ms: 700,
- _ttl_: "+5DAYS",
- _expire_at_: '2017-05-29T10:30:22.531Z',
- _router_field_: 5
- }
- ]
- }
- }
- },
- status: {
- auditlogs: {
- znodeReady: true,
- solrCollectionReady: true,
- solrAliasReady: false,
- configurationUploaded: true
- },
- servicelogs: {
- znodeReady: true,
- solrCollectionReady: true,
- configurationUploaded: true
- },
- userconfig: {
- znodeReady: true,
- solrCollectionReady: true,
- configurationUploaded: true
- }
- },
- userconfig: {
- userConfigList: [
- {
- id: 'c0',
- userName: 'admin',
- filtername: 'service',
- values: 'hdfs',
- shareNameList: [
- 's0',
- 's1'
- ],
- rowType: 'history'
- },
- {
- id: 'c0',
- userName: 'user',
- filtername: 'component',
- values: 'namenode',
- shareNameList: [
- 's2',
- 's3'
- ],
- rowType: 'history'
- }
- ],
- filters: {
- filter0: {
- label: 'filter0',
- hosts: [
- 'h0',
- 'h1'
- ],
- defaultLevels: [
- 'l0',
- 'l1'
- ],
- overrideLevels: [
- 'l2',
- 'l3'
- ],
- expiryTime: '2017-05-29T11:30:22.531Z'
- },
- filter1: {
- label: 'filter1',
- hosts: [
- 'h1',
- 'h2'
- ],
- defaultLevels: [
- 'l4',
- 'l5'
- ],
- overrideLevels: [
- 'l6',
- 'l7'
- ],
- expiryTime: '2017-05-30T11:30:22.531Z'
- }
- },
- names: []
- }
- }
- }
- };
+ return mockData;
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/1a2d6ced/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
index a8c71d1..9a8ea09 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
@@ -26,8 +26,10 @@
@block-margin-top: 20px;
@link-color: #1491C1;
@link-hover-color: #23527C;
+@grey-color: #666;
+@default-line-height: 1.42857143;
+@main-background-color: #ECECEC;
-// TODO implement actual colors
@fatal-color: #830A0A;
@error-color: #E81D1D;
@warning-color: #FF8916;
@@ -36,9 +38,6 @@
@trace-color: #888;
@unknown-color: #BDBDBD;
-@grey-color: #666;
-@default-line-height: 1.42857143;
-
// Mixins
.flex-vertical-align {
display: flex;
[17/21] ambari git commit: AMBARI-21320 Log Search UI: implement log
entries display. (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21320 Log Search UI: implement log entries display. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/c3d8e311
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/c3d8e311
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/c3d8e311
Branch: refs/heads/branch-feature-logsearch-ui
Commit: c3d8e31112105898ee0183cb3233fa8057bd5ab8
Parents: a0e713d
Author: ababiichuk <ab...@hortonworks.com>
Authored: Wed Jun 14 14:48:40 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:43:34 2017 +0300
----------------------------------------------------------------------
.../accordion-panel.component.html | 25 ++++
.../accordion-panel.component.less | 42 +++++++
.../accordion-panel.component.spec.ts | 42 +++++++
.../accordion-panel.component.ts | 38 ++++++
.../src/app/app.component.less | 40 +++---
.../src/app/app.module.ts | 9 +-
.../filter-dropdown.component.less | 2 +-
.../filter-text-field.component.less | 2 +-
.../filters-panel/filters-panel.component.less | 2 +-
.../app/login-form/login-form.component.less | 4 +-
.../src/app/login-form/login-form.component.ts | 5 +-
.../src/app/logs-list/logs-list.component.html | 35 ++++++
.../src/app/logs-list/logs-list.component.less | 125 +++++++++++++++++++
.../app/logs-list/logs-list.component.spec.ts | 44 +++++++
.../src/app/logs-list/logs-list.component.ts | 79 ++++++++++++
.../main-container.component.html | 1 +
.../src/app/services/http-client.service.ts | 7 +-
.../src/app/top-menu/top-menu.component.less | 2 +-
.../src/app/top-menu/top-menu.component.ts | 2 +-
.../src/app/variables.less | 88 +++++++++++++
.../ambari-logsearch-web-new/src/main.ts | 8 +-
.../ambari-logsearch-web-new/src/styles.less | 18 ---
22 files changed, 565 insertions(+), 55 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.html
new file mode 100644
index 0000000..b2ce3a0
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.html
@@ -0,0 +1,25 @@
+<!--
+ 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="panel panel-default">
+ <div class="panel-body">
+ <ng-template [ngTemplateOutlet]="template"></ng-template>
+ <div class="accordion-toggle">
+ <span class="fa collapsed toggle-icon" data-toggle="collapse" [attr.data-target]="'#' + toggleId" aria-expanded="false"> </span>
+ </div>
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
new file mode 100644
index 0000000..f3630bb
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.less
@@ -0,0 +1,42 @@
+/*
+ * 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 '../variables';
+
+.panel-body {
+ position: relative;
+
+ .accordion-toggle {
+ position: absolute;
+
+ // TODO get rid of magic numbers, base on actual design
+ right: 10px;
+ top: 15px;
+
+ .toggle-icon {
+ .clickable-item;
+
+ &:before {
+ content: '\F077';
+ }
+
+ &.collapsed:before {
+ content: '\F078';
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
new file mode 100644
index 0000000..d1b185e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.spec.ts
@@ -0,0 +1,42 @@
+/*
+ * 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 {AccordionPanelComponent} from './accordion-panel.component';
+
+describe('AccordionPanelComponent', () => {
+ let component: AccordionPanelComponent;
+ let fixture: ComponentFixture<AccordionPanelComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [AccordionPanelComponent]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(AccordionPanelComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create component', () => {
+ expect(component).toBeTruthy();
+ });
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
new file mode 100644
index 0000000..ae7fd7e
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/accordion-panel/accordion-panel.component.ts
@@ -0,0 +1,38 @@
+/*
+ * 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, Input, ContentChild, TemplateRef} from '@angular/core';
+
+@Component({
+ selector: 'accordion-panel',
+ templateUrl: './accordion-panel.component.html',
+ styleUrls: ['./accordion-panel.component.less']
+})
+export class AccordionPanelComponent implements OnInit {
+
+ constructor() { }
+
+ ngOnInit() {
+ }
+
+ @Input()
+ private toggleId: string;
+
+ @ContentChild(TemplateRef)
+ private template;
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
index 3affd3f..fba0ae6 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/app.component.less
@@ -15,29 +15,33 @@
* limitations under the License.
*/
-@import '../styles.less';
+@import 'variables';
-.navbar {
- margin-bottom: 0;
- border-radius: 0;
- background-color: @navbar-background-color;
- color: #fff;
+:host {
+ line-height: @default-line-height;
- .container-fluid {
- .default-flex;
- }
+ .navbar {
+ margin-bottom: 0;
+ border-radius: 0;
+ background-color: @navbar-background-color;
+ color: #fff;
+
+ .container-fluid {
+ .default-flex;
+ }
- h1 {
- flex-basis: 70%;
- margin-bottom: @h1-vertical-margin;
- text-transform: uppercase;
+ h1 {
+ flex-basis: 70%;
+ margin-bottom: @h1-vertical-margin;
+ text-transform: uppercase;
- &.full-flex-width {
- flex-basis: 100%;
+ &.full-flex-width {
+ flex-basis: 100%;
+ }
}
- }
- /deep/ top-menu {
- flex-basis: 30%;
+ /deep/ top-menu {
+ flex-basis: 30%;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/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 f7221b3..659172d 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
@@ -47,6 +47,8 @@ import {FiltersPanelComponent} from '@app/filters-panel/filters-panel.component'
import {FilterDropdownComponent} from '@app/filter-dropdown/filter-dropdown.component';
import {DropdownListComponent} from '@app/dropdown-list/dropdown-list.component';
import {FilterTextFieldComponent} from '@app/filter-text-field/filter-text-field.component';
+import {AccordionPanelComponent} from '@app/accordion-panel/accordion-panel.component';
+import {LogsListComponent} from '@app/logs-list/logs-list.component';
export function HttpLoaderFactory(http: Http) {
return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
@@ -62,14 +64,17 @@ export function HttpLoaderFactory(http: Http) {
FiltersPanelComponent,
DropdownListComponent,
FilterDropdownComponent,
- FilterTextFieldComponent
+ FilterTextFieldComponent,
+ AccordionPanelComponent,
+ LogsListComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
InMemoryWebApiModule.forRoot(mockApiDataService, {
- passThruUnknownUrl: true
+ passThruUnknownUrl: true,
+ rootPath: ''
}),
AlertModule.forRoot(),
TranslateModule.forRoot({
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
index c3a25cb..2c97a17 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-dropdown/filter-dropdown.component.less
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-@import '../../styles.less';
+@import '../variables';
:host {
position: relative;
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
index b5e65c9..3a9dcac 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filter-text-field/filter-text-field.component.less
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-@import '../../styles.less';
+@import '../variables';
.input-group {
border: @input-border;
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
index b393196..d2400a4 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/filters-panel/filters-panel.component.less
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-@import '../../styles.less';
+@import '../variables';
.filter-input-container {
.flex-vertical-align;
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
index 7e37ea1..b84296a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/login-form/login-form.component.less
@@ -15,8 +15,8 @@
* limitations under the License.
*/
-@import '../../styles.less';
+@import '../variables';
.login-form {
- margin-top: @login-form-top-margin;
+ margin-top: @block-margin-top;
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/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
index 61d1fa1..2a93775 100644
--- 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
@@ -43,13 +43,10 @@ export class LoginFormComponent implements OnInit {
login() {
this.isRequestInProgress = true;
- /*
- TODO uncomment for using the real server
this.httpClient.post('login', {
username: this.username,
password: this.password
- })*/
- this.httpClient.get('api/login').finally(() => {
+ }).finally(() => {
this.isRequestInProgress = false;
}).subscribe(() => {
this.isLoginAlertDisplayed = false;
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
new file mode 100644
index 0000000..cf4bb57
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.html
@@ -0,0 +1,35 @@
+<!--
+ 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.
+-->
+
+<accordion-panel *ngFor="let log of logs; let i = index" [toggleId]="'details-' + i" class="col-md-12">
+ <ng-template>
+ <div [ngClass]="'hexagon ' + log.level"></div>
+ <div [ngClass]="'col-md-1 log-status ' + log.level">{{log.level}}</div>
+ <div class="col-md-3">
+ <div class="log-type">{{log.type}}</div>
+ <time class="log-time">{{log.time}}</time>
+ </div>
+ <div class="col-md-6 log-content-wrapper">
+ <div class="collapse log-actions" [attr.id]="'details-' + i">
+ <span class="action-icon fa fa-search"></span>
+ <span class="action-icon fa fa-external-link"></span>
+ <span class="action-icon fa fa-bullseye"></span>
+ </div>
+ <div class="log-content" [innerHTML]="log.content"></div>
+ </div>
+ </ng-template>
+</accordion-panel>
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
new file mode 100644
index 0000000..1179e55
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.less
@@ -0,0 +1,125 @@
+/*
+ * 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 '../variables';
+
+:host {
+ display: block;
+ margin-top: @block-margin-top;
+
+ .hexagon {
+ // TODO get rid of magic numbers, base on actual design
+ left: -7.5px;
+
+ &.fatal {
+ .common-hexagon(15px, @fatal-color);
+ }
+
+ &.error {
+ .common-hexagon(15px, @error-color);
+ }
+
+ &.warn {
+ .common-hexagon(15px, @warning-color);
+ }
+
+ &.info {
+ .common-hexagon(15px, @info-color);
+ }
+
+ &.debug {
+ .common-hexagon(15px, @debug-color);
+ }
+
+ &.trace {
+ .common-hexagon(15px, @trace-color);
+ }
+
+ &.unknown {
+ .common-hexagon(15px, @unknown-color);
+ }
+ }
+
+ .log-status {
+ text-transform: uppercase;
+
+ &.fatal {
+ color: @fatal-color;
+ }
+
+ &.error {
+ color: @error-color;
+ }
+
+ &.warn {
+ color: @warning-color;
+ }
+
+ &.info {
+ color: @info-color;
+ }
+
+ &.debug {
+ color: @debug-color;
+ }
+
+ &.trace {
+ color: @trace-color;
+ }
+
+ &.unknown {
+ color: @unknown-color;
+ }
+ }
+
+ .log-type {
+ color: @link-color;
+ }
+
+ .log-time {
+ color: @grey-color;
+ }
+
+ .log-content-wrapper {
+ position: relative;
+
+ // TODO get rid of magic numbers, base on actual design
+ .log-content {
+ overflow: hidden;
+ max-height: @default-line-height * 2em;
+ padding-right: 65px;
+ }
+
+ .log-actions {
+ position: absolute;
+ right: 40px;
+ top: 0;
+ border: @input-border;
+
+ &.collapsing + .log-content, &.collapse.in + .log-content {
+ min-height: 6em;
+ max-height: none;
+ }
+
+ .action-icon {
+ .clickable-item;
+ display: block;
+ padding: 5px;
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
new file mode 100644
index 0000000..6442864
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.spec.ts
@@ -0,0 +1,44 @@
+/*
+ * 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 {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+
+import {LogsListComponent} from './logs-list.component';
+
+describe('LogsListComponent', () => {
+ let component: LogsListComponent;
+ let fixture: ComponentFixture<LogsListComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [LogsListComponent],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(LogsListComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create component', () => {
+ expect(component).toBeTruthy();
+ });
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
new file mode 100644
index 0000000..107fb0d
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/logs-list/logs-list.component.ts
@@ -0,0 +1,79 @@
+/*
+ * 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';
+
+@Component({
+ selector: 'logs-list',
+ templateUrl: './logs-list.component.html',
+ styleUrls: ['./logs-list.component.less']
+})
+export class LogsListComponent implements OnInit {
+
+ constructor() {
+ }
+
+ ngOnInit() {
+ }
+
+ // TODO implement loading logs from API
+ private readonly logs = [
+ {
+ level: 'fatal',
+ type: 'ambari_agent',
+ time: '2017/01/31 18:00:00',
+ content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+ },
+ {
+ level: 'error',
+ type: 'ambari_agent',
+ time: '2017/01/31 18:00:00',
+ content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+ },
+ {
+ level: 'warn',
+ type: 'ambari_agent',
+ time: '2017/01/31 18:00:00',
+ content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+ },
+ {
+ level: 'info',
+ type: 'ambari_agent',
+ time: '2017/01/31 18:00:00',
+ content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+ },
+ {
+ level: 'debug',
+ type: 'ambari_agent',
+ time: '2017/01/31 18:00:00',
+ content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+ },
+ {
+ level: 'trace',
+ type: 'ambari_agent',
+ time: '2017/01/31 18:00:00',
+ content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+ },
+ {
+ level: 'unknown',
+ type: 'ambari_agent',
+ time: '2017/01/31 18:00:00',
+ content: 'Something went wrong.<br>Please restart ambari-agent.<br>See log file for details.'
+ }
+ ];
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
index bc641a6..34af2b8 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/main-container/main-container.component.html
@@ -17,3 +17,4 @@
<login-form *ngIf="!httpClient.isAuthorized"></login-form>
<filters-panel *ngIf="httpClient.isAuthorized" class="row"></filters-panel>
+<logs-list *ngIf="httpClient.isAuthorized"></logs-list>
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
index 2aa87f9..2b69f45 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/http-client.service.ts
@@ -21,6 +21,7 @@ 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';
+import {environment} from '@app/../environments/environment';
@Injectable()
export class HttpClientService extends Http {
@@ -32,7 +33,8 @@ export class HttpClientService extends Http {
private readonly apiPrefix = 'api/v1/';
private readonly urls = {
- status: 'status'
+ status: 'status',
+ auditLogs: 'audit/logs'
};
private readonly unauthorizedStatuses = [401, 403, 419];
@@ -73,7 +75,8 @@ export class HttpClientService extends Http {
}
post(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
- return super.post(this.generateUrlString(url), body, options);
+ return environment.production ?
+ super.post(this.generateUrlString(url), body, options) : super.get(this.generateUrlString(url), options);
}
put(url: string, body: any, options?: RequestOptionsArgs):Observable<Response> {
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
index 8728ecf..2e8e77a 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.less
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-@import '../../styles.less';
+@import '../variables';
:host {
.default-flex;
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
index bad588b..73b6131 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/top-menu/top-menu.component.ts
@@ -77,7 +77,7 @@ export class TopMenuComponent implements OnInit {
action: 'refresh'
},
{
- iconClass: 'fa fa-clock-o',
+ iconClass: 'fa fa-history',
label: 'topMenu.history',
labelClass: 'unstyled-link',
action: 'openHistory',
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less b/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
new file mode 100644
index 0000000..a8c71d1
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/variables.less
@@ -0,0 +1,88 @@
+/**
+ * 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.
+ */
+
+// Variables
+@navbar-background-color: #323544;
+@h1-vertical-margin: 20px;
+@button-border-radius: 4px;
+@input-border: 1px solid #CFD3D7;
+@button-border-radius: 4px;
+@input-group-addon-padding: 6px 12px;
+@block-margin-top: 20px;
+@link-color: #1491C1;
+@link-hover-color: #23527C;
+
+// TODO implement actual colors
+@fatal-color: #830A0A;
+@error-color: #E81D1D;
+@warning-color: #FF8916;
+@info-color: #2577B5;
+@debug-color: #65E8FF;
+@trace-color: #888;
+@unknown-color: #BDBDBD;
+
+@grey-color: #666;
+@default-line-height: 1.42857143;
+
+// Mixins
+.flex-vertical-align {
+ display: flex;
+ align-items: center;
+}
+
+.default-flex {
+ .flex-vertical-align;
+ justify-content: space-between;
+}
+
+.common-hexagon(@side, @color) {
+ display: block;
+ position: absolute;
+ margin: (@side / 3.464101615) 0;
+ width: @side;
+ height: @side / 1.732050808;
+ background-color: @color;
+
+ &:before, &:after {
+ display: block;
+ position: absolute;
+ width: 0;
+ border-left: (@side / 2) solid transparent;
+ border-right: (@side / 2) solid transparent;
+ content: '';
+ }
+
+ &:before {
+ bottom: 100%;
+ border-bottom: (@side / 3.464101615) solid @color;
+ }
+
+ &:after {
+ top: 100%;
+ border-top: (@side / 3.464101615) solid @color;
+ }
+}
+
+.clickable-item {
+ cursor: pointer;
+ color: @link-color;
+
+ &:hover {
+ color: @link-hover-color;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/main.ts b/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
index e3aeec1..dfabf38 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/main.ts
@@ -16,11 +16,11 @@
* limitations under the License.
*/
-import { enableProdMode } from '@angular/core';
-import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import {enableProdMode} from '@angular/core';
+import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
-import { AppModule } from './app/app.module';
-import { environment } from './environments/environment';
+import {AppModule} from './app/app.module';
+import {environment} from './environments/environment';
if (environment.production) {
enableProdMode();
http://git-wip-us.apache.org/repos/asf/ambari/blob/c3d8e311/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
index db6da5c..5d5f1e3 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/styles.less
@@ -15,21 +15,3 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-@navbar-background-color: #323544;
-@h1-vertical-margin: 20px;
-@button-border-radius: 4px;
-@input-border: 1px solid #CFD3D7;
-@button-border-radius: 4px;
-@input-group-addon-padding: 6px 12px;
-@login-form-top-margin: 20px;
-
-.flex-vertical-align {
- display: flex;
- align-items: center;
-}
-
-.default-flex {
- .flex-vertical-align;
- justify-content: space-between;
-}
[16/21] ambari git commit: AMBARI-21312 Provide Log Search UI
authorization functionality (additional patch). (ababiichuk)
Posted by ab...@apache.org.
AMBARI-21312 Provide Log Search UI authorization functionality (additional patch). (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a0e713df
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a0e713df
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a0e713df
Branch: refs/heads/branch-feature-logsearch-ui
Commit: a0e713dfd719daba1dff3de041b47e5f2c9d57b6
Parents: 6fc2fef
Author: ababiichuk <ab...@hortonworks.com>
Authored: Mon Jun 12 13:01:21 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jun 22 15:42:28 2017 +0300
----------------------------------------------------------------------
.../src/app/login-form/login-form.component.ts | 5 ++++-
.../src/app/services/mock-api-data.service.ts | 1 +
2 files changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/a0e713df/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
index 2a93775..61d1fa1 100644
--- 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
@@ -43,10 +43,13 @@ export class LoginFormComponent implements OnInit {
login() {
this.isRequestInProgress = true;
+ /*
+ TODO uncomment for using the real server
this.httpClient.post('login', {
username: this.username,
password: this.password
- }).finally(() => {
+ })*/
+ this.httpClient.get('api/login').finally(() => {
this.isRequestInProgress = false;
}).subscribe(() => {
this.isLoginAlertDisplayed = false;
http://git-wip-us.apache.org/repos/asf/ambari/blob/a0e713df/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
index be39536..ff2ed2c 100644
--- a/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web-new/src/app/services/mock-api-data.service.ts
@@ -21,6 +21,7 @@ import {InMemoryDbService} from 'angular-in-memory-web-api';
export class mockApiDataService implements InMemoryDbService {
createDb() {
return {
+ login: {},
audit: {
logs: {
logList: [