From d699f5c5f8b2a7317cc5284591107abe5cfd5e61 Mon Sep 17 00:00:00 2001 From: Shea Phillips Date: Thu, 8 Dec 2016 22:33:40 -0800 Subject: [PATCH 1/2] - support multi-repo issue and source control modules --- api/models/Module.js | 55 ++++++---- api/services/GithubService.js | 103 +++++++++++++++--- assets/app/controllers/ModuleAddController.js | 11 +- assets/app/controllers/ToolController.js | 1 + assets/app/views/module-add.html | 8 ++ assets/app/views/widget/commits.html | 3 + config/connections.js | 10 +- config/env/production.js | 36 +++--- views/layout.ejs | 55 +--------- 9 files changed, 172 insertions(+), 110 deletions(-) diff --git a/api/models/Module.js b/api/models/Module.js index 859c689..13c4a22 100644 --- a/api/models/Module.js +++ b/api/models/Module.js @@ -1,20 +1,20 @@ /** -Copyright 2016, Cloud Compass Computing, Inc. + Copyright 2016, Cloud Compass Computing, Inc. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + 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. + 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. -*/ + */ /** * Module.js * @@ -47,12 +47,12 @@ module.exports = { }, //todo icon is a client-side concern and should be refactored. - getIcon: function() { + getIcon: function () { console.log("Looking up icon for", this); //face var iconMap = { 'repo': 'archive', - 'issues':'bug report' , + 'issues': 'bug report', 'wiki': 'description' }; @@ -60,7 +60,7 @@ module.exports = { }, // Override the default toJSON method so the derived icon is included - toJSON: function() { + toJSON: function () { var obj = this.toObject(); obj.icon = this.getIcon(); return obj; @@ -68,19 +68,30 @@ module.exports = { }, beforeCreate: function (module, next) { - var admin = module.config.permissions.admin; - module.config = _.pick(module.config, ['full_name']); - sails.log.info('Project.beforeCreate.createWebhook', module); + var serviceId = _.has(module.service, 'id') ? module.service.id : module.service; + Service.findOne({id: serviceId}) .exec(function (err, service) { if (service.platform == 'github') { - if (admin) { - GithubService.createWebhook(module, next); - } else { - next(); - } + var moduleConfig = _.isArray(module.config) ? module.config : module.config != undefined && module.config != null ? [module.config] : []; + + _.each(moduleConfig, function (config) { + var admin = config.permissions.admin; + + sails.log.info('Project.beforeCreate.createWebhook', config); + + //todo this is probably broken if the module has some repos with admin and some with not. prob will end up with webhook for some, but missing for others, depending on ordering. + if (admin) { + GithubService.createWebhook(config, function () { + sails.log.debug("created webhook"); + }); + } + }); + // fallthrough and/or default + next(); } + }); }, diff --git a/api/services/GithubService.js b/api/services/GithubService.js index f678e5f..9defc5a 100644 --- a/api/services/GithubService.js +++ b/api/services/GithubService.js @@ -128,6 +128,15 @@ module.exports = { var issues = []; var client = github.client(); + var getDataPage = function (client, nextPage, pager) { + sails.log.debug("Retrieving repo page ", nextPage); + var ghme = client.me(); + ghme.repos({ + page: nextPage, + per_page: 100 + }, pager); + }; + var pager = function (err, data, headers) { if (data) { issues = issues.concat(data); @@ -139,7 +148,7 @@ module.exports = { //parse out next page from link header format like https://api.github.com/user/repos?page=50&per_page=100 var nextPageNumber = querystring.parse(url.parse(linkHeaders.next).query).page; - getRepoPage(client, nextPageNumber, pager) + getDataPage(client, nextPageNumber, pager) } else { sails.log.debug("Returning repos to caller..."); cb(err, issues, headers); @@ -147,20 +156,28 @@ module.exports = { } }; - function getRepoPage(client, page, pager) { - sails.log.debug("Retrieving repo page ", page); - var ghme = client.me(); - ghme.repos({ - page: page, - per_page: 100 - }, pager); - } + //attempt at currying + var aggregate = function(howMany, cb) { + var callCount = 0; + var issues = []; + return function (err, data, headers) { + callCount++; + if (!err) { + if (data) { + issues = issues.concat(data); + } + } + if (callCount == howMany) { + cb(err,issues, headers); + } + } + }; Service.findOne({id: serviceID}) .exec(function (err, service) { if (service) { client = github.client(service.token); - getRepoPage(client, 1, pager); + getDataPage(client, 1, pager); } else { sails.log.error('could not retrieve repos', err); } @@ -175,10 +192,39 @@ module.exports = { // sails.log.debug('finding first module:', widget.modules[0].id); Module.findOne({id: widget.module.id}).populate('service') .exec(function (err, module) { + //todo handle multi-repo modules, and implement paging if (module) { + + //coerce config into array for preliminary support of multi-repo modules + var moduleConfig = _.isArray(module.config) ? module.config : module.config != undefined && module.config != null ? [module.config] : []; + var client = github.client(module.service.token); - var ghrepo = client.repo(module.config.full_name); - ghrepo.commits(cb); + + var commits = []; + + //eww + var callCount = 0; + + var aggregate = function (err, data, headers) { + callCount++; + if (!err) { + if (data) { + commits = commits.concat(data); + } + } + if (callCount == moduleConfig.length) { + cb(err,commits, headers); + } + }; + + //initial multi-repo module support + _.each(moduleConfig, function (config) { + var ghrepo = client.repo(config.full_name); + //todo implement paging using same pattern as with getRepos or mapreduce, or determine a new promise style + // currently, this is just getting the first page for each repo + ghrepo.commits(aggregate); + } + ); } else { sails.log.error('could not retrieve module', err); } @@ -194,13 +240,40 @@ module.exports = { Widget.findOne({id: widgetId}).populate('module') .exec(function (err, widget) { if (widget) { - // sails.log.debug('finding first module:', widget.modules); Module.findOne({id: widget.module.id}).populate('service') .exec(function (err, module) { if (module) { + + //coerce config into array for preliminary support of multi-repo modules + var moduleConfig = _.isArray(module.config) ? module.config : module.config != undefined && module.config != null ? [module.config] : []; + var client = github.client(module.service.token); - var ghrepo = client.repo(module.config.full_name); - ghrepo.issues(cb); + + var issues = []; + + //eww + var callCount = 0; + + var aggregate = function (err, data, headers) { + callCount++; + if (!err) { + if (data) { + issues = issues.concat(data); + } + } + if (callCount == moduleConfig.length) { + cb(err,issues, headers); + } + }; + + //initial multi-repo module support + _.each(moduleConfig, function (config) { + var ghrepo = client.repo(config.full_name); + //todo implement paging using same pattern as with getRepos or mapreduce, or determine a new promise style + // currently, this is just getting the first page for each repo + ghrepo.issues(aggregate); + } + ); } else { sails.log.error('could not retrieve module', err); } diff --git a/assets/app/controllers/ModuleAddController.js b/assets/app/controllers/ModuleAddController.js index 5279e8f..7c93087 100644 --- a/assets/app/controllers/ModuleAddController.js +++ b/assets/app/controllers/ModuleAddController.js @@ -128,8 +128,15 @@ function ModuleAddController($scope, $state, $stateParams, ToolService, ProjectS // data = object to pull properties from // properties = optional array of property names to extract (default: *) function configureModule(data) { - vm.module.config = data; - console.log(vm.module); + if (!vm.module.config || vm.module.config == undefined || vm.module.config == null) { + vm.module.config = []; + + } + + console.log("adding ", data, vm.module); + vm.module.config = vm.module.config.concat(data); + + console.log("...to module ", vm.module); } function addModule(newModule) { diff --git a/assets/app/controllers/ToolController.js b/assets/app/controllers/ToolController.js index dd18df9..aac7b13 100644 --- a/assets/app/controllers/ToolController.js +++ b/assets/app/controllers/ToolController.js @@ -84,6 +84,7 @@ function ToolController($scope, ToolService, ProjectService) { // data = object to pull properties from // properties = optional array of property names to extract (default: *) function configureModule(data, properties) { + console.log("configModule:",data,properties); if (typeof properties == 'undefined') { vm.currentModule.config = data; } else { diff --git a/assets/app/views/module-add.html b/assets/app/views/module-add.html index 80ef03d..9da1430 100644 --- a/assets/app/views/module-add.html +++ b/assets/app/views/module-add.html @@ -113,6 +113,14 @@

Configuration :

You do not have administrator rights to this repository. This module will not post to the activity feed. + + + + {{repo.full_name}} + + + + diff --git a/assets/app/views/widget/commits.html b/assets/app/views/widget/commits.html index 35bed47..ebff44e 100644 --- a/assets/app/views/widget/commits.html +++ b/assets/app/views/widget/commits.html @@ -45,6 +45,9 @@
+ + Commit {{commit.sha | limitTo : 8}} + By: {{commit.author ? commit.author.login : commit.commit.committer.name}} diff --git a/config/connections.js b/config/connections.js index 4db6da1..da00881 100644 --- a/config/connections.js +++ b/config/connections.js @@ -46,11 +46,15 @@ module.exports.connections = { * * ***************************************************************************/ localDiskDb: { - adapter: 'sails-disk' - }, + adapter: 'sails-disk'}, stackbuttonMongo: { - adapter: 'sails-mongo' + adapter: 'sails-mongo', + host: process.env.MONGODB_SERVICE_HOST || 'localhost', + port: process.env.MONGODB_SERVICE_PORT || 27017 , + user: process.env.MONGODB_USER || '', + password: process.env.MONGODB_PASSWORD || '', + database: process.env.MONGODB_DATABASE || 'stackbutton' } /*************************************************************************** diff --git a/config/env/production.js b/config/env/production.js index fd3e4ca..f387538 100644 --- a/config/env/production.js +++ b/config/env/production.js @@ -1,20 +1,20 @@ /** -Copyright 2016, Cloud Compass Computing, Inc. + Copyright 2016, Cloud Compass Computing, Inc. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + 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. + 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. -*/ + */ /** * Production environment settings * @@ -33,15 +33,21 @@ module.exports = { models: { migrate: 'safe' - } + }, /*************************************************************************** * Set the default database connection for models in the production * * environment (see config/connections.js and config/models.js ) * ***************************************************************************/ - // models: { - // connection: 'someMysqlServer' - // }, + models: { + connection: 'stackbuttonMongo' + }, + + url: { + hooks: process.env.WEBHOOK_URL + } + + /*************************************************************************** * Set the port in the production environment to 80 * diff --git a/views/layout.ejs b/views/layout.ejs index c8d28e2..7a5083f 100644 --- a/views/layout.ejs +++ b/views/layout.ejs @@ -46,11 +46,7 @@ limitations under the License. --> - - - - - + @@ -109,54 +105,7 @@ limitations under the License. --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + From d3e8c9b787a56cae31d7892fae764c455c66dbd0 Mon Sep 17 00:00:00 2001 From: Shea Phillips Date: Fri, 21 Apr 2017 21:39:02 -0700 Subject: [PATCH 2/2] - initial commit of angular 2 frontend --- ng2/.angular-cli.json | 78 +++ ng2/.editorconfig | 13 + ng2/.gitignore | 42 ++ ng2/README.md | 28 + ng2/e2e/app.e2e-spec.ts | 14 + ng2/e2e/app.po.ts | 11 + ng2/e2e/tsconfig.e2e.json | 12 + ng2/karma.conf.js | 44 ++ ng2/package.json | 47 ++ ng2/protractor.conf.js | 30 + ng2/src/app/app.component.css | 0 ng2/src/app/app.component.html | 801 +++++++++++++++++++++ ng2/src/app/app.component.spec.ts | 32 + ng2/src/app/app.component.ts | 10 + ng2/src/app/app.module.ts | 22 + ng2/src/app/login/login.component.css | 0 ng2/src/app/login/login.component.html | 3 + ng2/src/app/login/login.component.spec.ts | 25 + ng2/src/app/login/login.component.ts | 15 + ng2/src/assets/.gitkeep | 0 ng2/src/environments/environment.prod.ts | 3 + ng2/src/environments/environment.ts | 8 + ng2/src/favicon.ico | Bin 0 -> 5430 bytes ng2/src/index.html | 804 ++++++++++++++++++++++ ng2/src/main.ts | 11 + ng2/src/polyfills.ts | 68 ++ ng2/src/styles.css | 1 + ng2/src/test.ts | 32 + ng2/src/tsconfig.app.json | 13 + ng2/src/tsconfig.spec.json | 20 + ng2/src/typings.d.ts | 5 + ng2/tsconfig.json | 20 + ng2/tslint.json | 116 ++++ views/layout.ejs | 55 +- 34 files changed, 2381 insertions(+), 2 deletions(-) create mode 100644 ng2/.angular-cli.json create mode 100644 ng2/.editorconfig create mode 100644 ng2/.gitignore create mode 100644 ng2/README.md create mode 100644 ng2/e2e/app.e2e-spec.ts create mode 100644 ng2/e2e/app.po.ts create mode 100644 ng2/e2e/tsconfig.e2e.json create mode 100644 ng2/karma.conf.js create mode 100644 ng2/package.json create mode 100644 ng2/protractor.conf.js create mode 100644 ng2/src/app/app.component.css create mode 100644 ng2/src/app/app.component.html create mode 100644 ng2/src/app/app.component.spec.ts create mode 100644 ng2/src/app/app.component.ts create mode 100644 ng2/src/app/app.module.ts create mode 100644 ng2/src/app/login/login.component.css create mode 100644 ng2/src/app/login/login.component.html create mode 100644 ng2/src/app/login/login.component.spec.ts create mode 100644 ng2/src/app/login/login.component.ts create mode 100644 ng2/src/assets/.gitkeep create mode 100644 ng2/src/environments/environment.prod.ts create mode 100644 ng2/src/environments/environment.ts create mode 100644 ng2/src/favicon.ico create mode 100644 ng2/src/index.html create mode 100644 ng2/src/main.ts create mode 100644 ng2/src/polyfills.ts create mode 100644 ng2/src/styles.css create mode 100644 ng2/src/test.ts create mode 100644 ng2/src/tsconfig.app.json create mode 100644 ng2/src/tsconfig.spec.json create mode 100644 ng2/src/typings.d.ts create mode 100644 ng2/tsconfig.json create mode 100644 ng2/tslint.json diff --git a/ng2/.angular-cli.json b/ng2/.angular-cli.json new file mode 100644 index 0000000..acb341e --- /dev/null +++ b/ng2/.angular-cli.json @@ -0,0 +1,78 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "project": { + "name": "ng2" + }, + "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": [ + "../node_modules/patternfly/dist/css/patternfly.min.css", + "../node_modules/patternfly/dist/css/patternfly-additions.min.css", + "styles.css" + ], + "scripts": [ + "../node_modules/patternfly/node_modules/jquery/dist/jquery.min.js", + "../node_modules/patternfly/node_modules/bootstrap/dist/js/bootstrap.min.js", + "../node_modules/patternfly/node_modules/c3/c3.min.js", + "../node_modules/patternfly/node_modules/d3/d3.min.js", + "../node_modules/patternfly/node_modules/datatables/media/js/jquery.dataTables.min.js", + "../node_modules/patternfly/node_modules/drmonty-datatables-colvis/js/dataTables.colVis.js", + "../node_modules/patternfly/node_modules/datatables.net-colreorder/js/dataTables.colReorder.js", + "../node_modules/patternfly/dist/js/patternfly.min.js", + "../node_modules/patternfly/node_modules/patternfly-bootstrap-combobox/js/bootstrap-combobox.js", + "../node_modules/patternfly/node_modules/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js", + "../node_modules/patternfly/node_modules/moment/min/moment.min.js", + "../node_modules/patternfly/node_modules/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min.js", + "../node_modules/patternfly/node_modules/bootstrap-select/dist/js/bootstrap-select.min.js", + "../node_modules/patternfly/node_modules/bootstrap-switch/dist/js/bootstrap-switch.min.js", + "../node_modules/patternfly/node_modules/bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.js", + "../node_modules/patternfly/node_modules/patternfly-bootstrap-treeview/dist/bootstrap-treeview.min.js", + "../node_modules/patternfly/node_modules/google-code-prettify/bin/prettify.min.js", + "../node_modules/patternfly/node_modules/jquery-match-height/jquery.matchHeight-min.js" + ], + "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": "css", + "component": {} + } +} diff --git a/ng2/.editorconfig b/ng2/.editorconfig new file mode 100644 index 0000000..6e87a00 --- /dev/null +++ b/ng2/.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 diff --git a/ng2/.gitignore b/ng2/.gitignore new file mode 100644 index 0000000..54bfd20 --- /dev/null +++ b/ng2/.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 diff --git a/ng2/README.md b/ng2/README.md new file mode 100644 index 0000000..e30bd07 --- /dev/null +++ b/ng2/README.md @@ -0,0 +1,28 @@ +# Ng2 + +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). diff --git a/ng2/e2e/app.e2e-spec.ts b/ng2/e2e/app.e2e-spec.ts new file mode 100644 index 0000000..631978d --- /dev/null +++ b/ng2/e2e/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import { Ng2Page } from './app.po'; + +describe('ng2 App', () => { + let page: Ng2Page; + + beforeEach(() => { + page = new Ng2Page(); + }); + + it('should display message saying app works', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('app works!'); + }); +}); diff --git a/ng2/e2e/app.po.ts b/ng2/e2e/app.po.ts new file mode 100644 index 0000000..6da4195 --- /dev/null +++ b/ng2/e2e/app.po.ts @@ -0,0 +1,11 @@ +import { browser, element, by } from 'protractor'; + +export class Ng2Page { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/ng2/e2e/tsconfig.e2e.json b/ng2/e2e/tsconfig.e2e.json new file mode 100644 index 0000000..ac7a373 --- /dev/null +++ b/ng2/e2e/tsconfig.e2e.json @@ -0,0 +1,12 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types":[ + "jasmine", + "node" + ] + } +} diff --git a/ng2/karma.conf.js b/ng2/karma.conf.js new file mode 100644 index 0000000..84b4cd5 --- /dev/null +++ b/ng2/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 + }); +}; diff --git a/ng2/package.json b/ng2/package.json new file mode 100644 index 0000000..d49ca10 --- /dev/null +++ b/ng2/package.json @@ -0,0 +1,47 @@ +{ + "name": "ng2", + "version": "0.0.0", + "license": "MIT", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "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", + "patternfly": "^3.23.2", + "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" + } +} diff --git a/ng2/protractor.conf.js b/ng2/protractor.conf.js new file mode 100644 index 0000000..1c5e1e5 --- /dev/null +++ b/ng2/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 } })); + } +}; diff --git a/ng2/src/app/app.component.css b/ng2/src/app/app.component.css new file mode 100644 index 0000000..e69de29 diff --git a/ng2/src/app/app.component.html b/ng2/src/app/app.component.html new file mode 100644 index 0000000..40e1706 --- /dev/null +++ b/ng2/src/app/app.component.html @@ -0,0 +1,801 @@ +
+ + + + + + + + + +
+ +
+ +
+
+

+ 0 Ipsum +

+
+

+ +

+
+
+ +
+
+
+

+ 20 Amet +

+
+

+ 4 + 1 +

+
+
+ +
+
+
+

+ 9 Adipiscing +

+
+

+ +

+
+
+ +
+
+
+

+ 12 Lorem +

+
+

+ 1 +

+
+
+
+
+
+ +
+
+

+ + 0 Ipsum +

+
+

+ +

+
+
+ +
+
+
+

+ + + 20 Amet + +

+
+

+ 4 +

+
+
+ +
+
+
+

+ + + 9 Adipiscing + +

+
+

+ +

+
+
+ +
+
+
+

+ + + 12 Lorem + +

+
+

+ 1 +

+
+
+
+
+
+ +
+
+
+

+ Top Utilized Clusters +

+
+
+
+ RHOS6-Controller +
+
+
+ 190.0 of 200.0 GB Used +
+
+ 5% Available +
+
+
+ CFMEQE-Cluster +
+
+
+ 100.0 of 200.0 GB Used +
+
+ 50% Available +
+
+
+ RHOS-Undercloud +
+
+
+ 140.0 of 200.0 GB Used +
+
+ 30% Available +
+
+
+ RHEL6-Controller +
+
+
+ 153.0 of 200.0 GB Used +
+
+ 23.5% Available +
+
+
+
+ +
+
+
+
+

+ Quotas +

+
+
+
+
+ CPU +
+
+
+ 115 of 460 MHz +
+
+ 75% Available +
+
+
+
+
+ Memory +
+
+
+ 8 of 16 GB +
+
+ 50% Available +
+
+
+
+
+ Pods +
+
+
+ 5 of 8 Total +
+
+ 37.5% Available +
+
+
+
+
+ Services +
+
+
+ 2 of 2 Total +
+
+
+
+
+ +
+
+
+
+
+
+

Last 30 days

+

+ Utilization +

+
+
+
+
+

CPU

+

+ 50 + + Available + of 1000 MHz + +

+
+
+ +
+
+

Memory

+

+ 256 + + Available + of 432 GB + +

+
+
+ +
+
+

Network

+

+ 200 + + Available + of 1300 Gbps + +

+
+
+ +
+
+
+
+ +
+
+
+
+
+

+ Network +

+
+

+ 200 + + Available + of 1300 Gbps + +

+
+
+ +
+
+ +
+
+
+ +
+
+
+ +

+ Card Title +

+
+
+

[card contents]

+
+
+ +
+
+
+

+ Card Title +

+
+

[card contents]

+
+ +
+ +
+
+
+ +
+
+

+ Card Title +

+
+

[card contents]

+
+ +
+
+
+
+

+ Card Title +

+
+

[card contents]

+
+
+
+
+
+ +
+
+
+

[card contents]

+
+ +
+
+
+
+
+

[card contents]

+
+ +
+
+
+
+ +
+
+
+

[card contents]

+
+
+
+
+
+
+

[card contents]

+
+
+
+
+ +
+ + +
diff --git a/ng2/src/app/app.component.spec.ts b/ng2/src/app/app.component.spec.ts new file mode 100644 index 0000000..c740bcd --- /dev/null +++ b/ng2/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!'); + })); +}); diff --git a/ng2/src/app/app.component.ts b/ng2/src/app/app.component.ts new file mode 100644 index 0000000..ff63e05 --- /dev/null +++ b/ng2/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.css'] +}) +export class AppComponent { + title = 'app works!'; +} diff --git a/ng2/src/app/app.module.ts b/ng2/src/app/app.module.ts new file mode 100644 index 0000000..496a0e2 --- /dev/null +++ b/ng2/src/app/app.module.ts @@ -0,0 +1,22 @@ +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'; +import { LoginComponent } from './login/login.component'; + +@NgModule({ + declarations: [ + AppComponent, + LoginComponent + ], + imports: [ + BrowserModule, + FormsModule, + HttpModule + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/ng2/src/app/login/login.component.css b/ng2/src/app/login/login.component.css new file mode 100644 index 0000000..e69de29 diff --git a/ng2/src/app/login/login.component.html b/ng2/src/app/login/login.component.html new file mode 100644 index 0000000..65bfa50 --- /dev/null +++ b/ng2/src/app/login/login.component.html @@ -0,0 +1,3 @@ +

+ login works! +

diff --git a/ng2/src/app/login/login.component.spec.ts b/ng2/src/app/login/login.component.spec.ts new file mode 100644 index 0000000..d6d85a8 --- /dev/null +++ b/ng2/src/app/login/login.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LoginComponent } from './login.component'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ LoginComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/ng2/src/app/login/login.component.ts b/ng2/src/app/login/login.component.ts new file mode 100644 index 0000000..5701fa2 --- /dev/null +++ b/ng2/src/app/login/login.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.css'] +}) +export class LoginComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/ng2/src/assets/.gitkeep b/ng2/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ng2/src/environments/environment.prod.ts b/ng2/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/ng2/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/ng2/src/environments/environment.ts b/ng2/src/environments/environment.ts new file mode 100644 index 0000000..b7f639a --- /dev/null +++ b/ng2/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 +}; diff --git a/ng2/src/favicon.ico b/ng2/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8081c7ceaf2be08bf59010158c586170d9d2d517 GIT binary patch literal 5430 zcmc(je{54#6vvCoAI3i*G5%$U7!sA3wtMZ$fH6V9C`=eXGJb@R1%(I_{vnZtpD{6n z5Pl{DmxzBDbrB>}`90e12m8T*36WoeDLA&SD_hw{H^wM!cl_RWcVA!I+x87ee975; z@4kD^=bYPn&pmG@(+JZ`rqQEKxW<}RzhW}I!|ulN=fmjVi@x{p$cC`)5$a!)X&U+blKNvN5tg=uLvuLnuqRM;Yc*swiexsoh#XPNu{9F#c`G zQLe{yWA(Y6(;>y|-efAy11k<09(@Oo1B2@0`PtZSkqK&${ zgEY}`W@t{%?9u5rF?}Y7OL{338l*JY#P!%MVQY@oqnItpZ}?s z!r?*kwuR{A@jg2Chlf0^{q*>8n5Ir~YWf*wmsh7B5&EpHfd5@xVaj&gqsdui^spyL zB|kUoblGoO7G(MuKTfa9?pGH0@QP^b#!lM1yHWLh*2iq#`C1TdrnO-d#?Oh@XV2HK zKA{`eo{--^K&MW66Lgsktfvn#cCAc*(}qsfhrvOjMGLE?`dHVipu1J3Kgr%g?cNa8 z)pkmC8DGH~fG+dlrp(5^-QBeEvkOvv#q7MBVLtm2oD^$lJZx--_=K&Ttd=-krx(Bb zcEoKJda@S!%%@`P-##$>*u%T*mh+QjV@)Qa=Mk1?#zLk+M4tIt%}wagT{5J%!tXAE;r{@=bb%nNVxvI+C+$t?!VJ@0d@HIyMJTI{vEw0Ul ze(ha!e&qANbTL1ZneNl45t=#Ot??C0MHjjgY8%*mGisN|S6%g3;Hlx#fMNcL<87MW zZ>6moo1YD?P!fJ#Jb(4)_cc50X5n0KoDYfdPoL^iV`k&o{LPyaoqMqk92wVM#_O0l z09$(A-D+gVIlq4TA&{1T@BsUH`Bm=r#l$Z51J-U&F32+hfUP-iLo=jg7Xmy+WLq6_tWv&`wDlz#`&)Jp~iQf zZP)tu>}pIIJKuw+$&t}GQuqMd%Z>0?t%&BM&Wo^4P^Y z)c6h^f2R>X8*}q|bblAF?@;%?2>$y+cMQbN{X$)^R>vtNq_5AB|0N5U*d^T?X9{xQnJYeU{ zoZL#obI;~Pp95f1`%X3D$Mh*4^?O?IT~7HqlWguezmg?Ybq|7>qQ(@pPHbE9V?f|( z+0xo!#m@Np9PljsyxBY-UA*{U*la#8Wz2sO|48_-5t8%_!n?S$zlGe+NA%?vmxjS- zHE5O3ZarU=X}$7>;Okp(UWXJxI%G_J-@IH;%5#Rt$(WUX?6*Ux!IRd$dLP6+SmPn= z8zjm4jGjN772R{FGkXwcNv8GBcZI#@Y2m{RNF_w8(Z%^A*!bS*!}s6sh*NnURytky humW;*g7R+&|Ledvc- + + + + + + + + + + +
+ +
+ +
+
+

+ 0 Ipsum +

+
+

+ +

+
+
+ +
+
+
+

+ 20 Amet +

+
+

+ 4 + 1 +

+
+
+ +
+
+
+

+ 9 Adipiscing +

+
+

+ +

+
+
+ +
+
+
+

+ 12 Lorem +

+
+

+ 1 +

+
+
+
+
+
+ +
+
+

+ + 0 Ipsum +

+
+

+ +

+
+
+ +
+
+
+

+ + + 20 Amet + +

+
+

+ 4 +

+
+
+ +
+
+
+

+ + + 9 Adipiscing + +

+
+

+ +

+
+
+ +
+
+
+

+ + + 12 Lorem + +

+
+

+ 1 +

+
+
+
+
+
+ +
+
+
+

+ Top Utilized Clusters +

+
+
+
+ RHOS6-Controller +
+
+
+ 190.0 of 200.0 GB Used +
+
+ 5% Available +
+
+
+ CFMEQE-Cluster +
+
+
+ 100.0 of 200.0 GB Used +
+
+ 50% Available +
+
+
+ RHOS-Undercloud +
+
+
+ 140.0 of 200.0 GB Used +
+
+ 30% Available +
+
+
+ RHEL6-Controller +
+
+
+ 153.0 of 200.0 GB Used +
+
+ 23.5% Available +
+
+
+
+ +
+
+
+
+

+ Quotas +

+
+
+
+
+ CPU +
+
+
+ 115 of 460 MHz +
+
+ 75% Available +
+
+
+
+
+ Memory +
+
+
+ 8 of 16 GB +
+
+ 50% Available +
+
+
+
+
+ Pods +
+
+
+ 5 of 8 Total +
+
+ 37.5% Available +
+
+
+
+
+ Services +
+
+
+ 2 of 2 Total +
+
+
+
+
+ +
+
+
+
+
+
+

Last 30 days

+

+ Utilization +

+
+
+
+
+

CPU

+

+ 50 + + Available + of 1000 MHz + +

+
+
+ +
+
+

Memory

+

+ 256 + + Available + of 432 GB + +

+
+
+ +
+
+

Network

+

+ 200 + + Available + of 1300 Gbps + +

+
+
+ +
+
+
+
+ +
+
+
+
+
+

+ Network +

+
+

+ 200 + + Available + of 1300 Gbps + +

+
+
+ +
+
+ +
+
+
+ +
+
+
+ +

+ Card Title +

+
+
+

[card contents]

+
+
+ +
+
+
+

+ Card Title +

+
+

[card contents]

+
+ +
+ +
+
+
+ +
+
+

+ Card Title +

+
+

[card contents]

+
+ +
+
+
+
+

+ Card Title +

+
+

[card contents]

+
+
+
+
+
+ +
+
+
+

[card contents]

+
+ +
+
+
+
+
+

[card contents]

+
+ +
+
+
+
+ +
+
+
+

[card contents]

+
+
+
+
+
+
+

[card contents]

+
+
+
+
+ +
+ + + + + + + + + + + + + + + + diff --git a/ng2/src/main.ts b/ng2/src/main.ts new file mode 100644 index 0000000..a9ca1ca --- /dev/null +++ b/ng2/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); diff --git a/ng2/src/polyfills.ts b/ng2/src/polyfills.ts new file mode 100644 index 0000000..53bdaf1 --- /dev/null +++ b/ng2/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`. diff --git a/ng2/src/styles.css b/ng2/src/styles.css new file mode 100644 index 0000000..90d4ee0 --- /dev/null +++ b/ng2/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/ng2/src/test.ts b/ng2/src/test.ts new file mode 100644 index 0000000..9bf7226 --- /dev/null +++ b/ng2/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(); diff --git a/ng2/src/tsconfig.app.json b/ng2/src/tsconfig.app.json new file mode 100644 index 0000000..5e2507d --- /dev/null +++ b/ng2/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" + ] +} diff --git a/ng2/src/tsconfig.spec.json b/ng2/src/tsconfig.spec.json new file mode 100644 index 0000000..510e3f1 --- /dev/null +++ b/ng2/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" + ] +} diff --git a/ng2/src/typings.d.ts b/ng2/src/typings.d.ts new file mode 100644 index 0000000..ef5c7bd --- /dev/null +++ b/ng2/src/typings.d.ts @@ -0,0 +1,5 @@ +/* SystemJS module definition */ +declare var module: NodeModule; +interface NodeModule { + id: string; +} diff --git a/ng2/tsconfig.json b/ng2/tsconfig.json new file mode 100644 index 0000000..a35a8ee --- /dev/null +++ b/ng2/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" + ] + } +} diff --git a/ng2/tslint.json b/ng2/tslint.json new file mode 100644 index 0000000..9113f13 --- /dev/null +++ b/ng2/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 + } +} diff --git a/views/layout.ejs b/views/layout.ejs index 7a5083f..c8d28e2 100644 --- a/views/layout.ejs +++ b/views/layout.ejs @@ -46,7 +46,11 @@ limitations under the License. --> - + + + + + @@ -105,7 +109,54 @@ limitations under the License. --> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +