From 6d93868708887962d0e179141c130d7beba2dffd Mon Sep 17 00:00:00 2001 From: iminin Date: Fri, 9 Feb 2018 13:42:10 +0300 Subject: [PATCH 001/270] TSlint updated and whole project cleanup --- package.json | 4 +- .../admin-container.component.ts | 9 +- src/app/admin/admin-routing.module.ts | 20 +- src/app/admin/admin.module.ts | 39 +- src/app/admin/admin.service.ts | 178 ++-- src/app/admin/admin.validators.ts | 12 +- .../admin-role/admin-role.component.ts | 136 ++- .../admin-technology.component.ts | 131 ++- src/app/app-routing.module.ts | 11 +- src/app/app.component.ts | 24 +- src/app/app.module.ts | 26 +- src/app/controls/button/button.component.ts | 37 +- .../controls/checkbox/checkbox.component.ts | 35 +- src/app/controls/chip/chip.component.ts | 60 +- src/app/controls/controls.module.ts | 45 +- src/app/controls/delete/delete.component.ts | 31 +- .../controls/dropdown/dropdown.component.ts | 45 +- .../filter-item/filter-item.component.ts | 54 +- .../filter-panel/filter-panel.component.ts | 26 +- .../dynamic-question.component.ts | 38 +- .../dynamic-question/question-dropdown.ts | 6 +- .../form/dynamic-question/question-textbox.ts | 4 +- src/app/controls/form/form.component.ts | 41 +- src/app/controls/form/question-base.ts | 48 +- .../controls/form/question-control.service.ts | 15 +- src/app/controls/input/input.component.ts | 206 ++--- .../list/list-item/list-item.component.ts | 72 +- src/app/controls/panel/panel.component.ts | 24 +- src/app/controls/slider/slider.component.ts | 26 +- src/app/core/core.module.ts | 105 ++- src/app/core/dynamic.service.ts | 88 +- src/app/core/extract.service.ts | 63 +- src/app/core/file.service.ts | 51 +- src/app/core/header/header.animation.ts | 3 +- src/app/core/header/header.component.ts | 11 +- src/app/core/http.service.ts | 66 +- src/app/core/loader/loader.component.ts | 11 +- src/app/core/powerpoint.service.ts | 840 ++++++++---------- src/app/core/user.service.ts | 6 +- .../employee-picker.component.ts | 125 ++- .../employee/employee-routing.module.ts | 12 +- src/app/features/employee/employee.module.ts | 25 +- src/app/features/employee/employee.service.ts | 100 +-- .../new-project/new-project.component.ts | 336 ++++--- .../project-history.component.ts | 125 ++- .../project-item/project-item.component.ts | 48 +- .../project-list/project-list.animation.ts | 50 +- .../project-list/project-list.component.ts | 321 ++++--- .../project-confirmation.component.ts | 27 +- .../project-modal/project-modal.component.ts | 71 +- .../project/project-routing.module.ts | 27 +- src/app/features/project/project.module.ts | 50 +- src/app/features/project/project.service.ts | 188 ++-- .../project/project/project.animation.ts | 39 +- .../project/project/project.component.ts | 255 +++--- .../technology-picker.component.ts | 123 ++- .../technology/technology-routing.module.ts | 12 +- .../features/technology/technology.module.ts | 25 +- .../features/technology/technology.service.ts | 62 +- .../shared/backpanel/backpanel.animation.ts | 37 +- .../shared/backpanel/backpanel.component.ts | 24 +- src/app/shared/dash.pipe.ts | 17 +- src/app/shared/filesize.pipe.ts | 17 +- src/app/shared/footer/footer.component.ts | 35 +- src/app/shared/helpers/comparer.ts | 97 +- src/app/shared/helpers/extensions.ts | 12 +- src/app/shared/helpers/queryEncoder.ts | 5 +- src/app/shared/helpers/routes.ts | 58 +- src/app/shared/keys.pipe.ts | 12 +- .../shared/modal/delete/delete.component.ts | 46 +- src/app/shared/modal/error/error.component.ts | 29 +- src/app/shared/modal/file/file.component.ts | 59 +- src/app/shared/modal/modal.component.ts | 29 +- src/app/shared/models/constants.ts | 25 +- src/app/shared/models/employee.ts | 31 +- src/app/shared/models/error.ts | 19 +- src/app/shared/models/project.ts | 101 +-- src/app/shared/models/role.ts | 20 +- src/app/shared/models/schedule.ts | 31 +- src/app/shared/models/technology.ts | 22 +- src/app/shared/ribbon/ribbon.component.ts | 19 +- src/app/shared/shared.module.ts | 48 +- src/app/shared/trimtext.directive.ts | 10 +- src/polyfills.ts | 6 - tslint.json | 40 +- 85 files changed, 2535 insertions(+), 2982 deletions(-) diff --git a/package.json b/package.json index 516b8d68..a6df72ef 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "@types/jasmine": "2.5.38", "@types/node": "~6.0.60", "autoprefixer": "^6.5.3", - "codelyzer": "~2.0.0", + "codelyzer": "^3.0.1", "css-loader": "^0.28.1", "cssnano": "^3.10.0", "exports-loader": "^0.6.3", @@ -86,7 +86,7 @@ "style-loader": "^0.13.1", "stylus-loader": "^3.0.1", "ts-node": "~2.0.0", - "tslint": "~4.5.0", + "tslint": "^5.9.1", "typescript": "~2.2.0", "url-loader": "^0.5.7", "webpack": "~2.2.0", diff --git a/src/app/admin/admin-container/admin-container.component.ts b/src/app/admin/admin-container/admin-container.component.ts index 2942b042..72c988b4 100644 --- a/src/app/admin/admin-container/admin-container.component.ts +++ b/src/app/admin/admin-container/admin-container.component.ts @@ -1,14 +1,11 @@ -import { Component, Input } from '@angular/core'; +import {Component} from '@angular/core'; @Component({ selector: 'admin-container', templateUrl: './admin-container.component.html', - styleUrls: ['./admin-container.component.less'], - animations: [ ] + styleUrls: ['./admin-container.component.less'], + animations: [] }) export class AdminContainerComponent { - constructor() { - - } } diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts index 5ab3d0cb..49ee9d05 100644 --- a/src/app/admin/admin-routing.module.ts +++ b/src/app/admin/admin-routing.module.ts @@ -1,14 +1,15 @@ -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; +import {NgModule} from '@angular/core'; +import {RouterModule} from '@angular/router'; -import { AdminContainerComponent } from './admin-container/admin-container.component'; -import { AdminRoleComponent } from './components/admin-role/admin-role.component'; -import { AdminTechnologyComponent } from './components/admin-technology/admin-technology.component'; +import {AdminContainerComponent} from './admin-container/admin-container.component'; +import {AdminRoleComponent} from './components/admin-role/admin-role.component'; +import {AdminTechnologyComponent} from './components/admin-technology/admin-technology.component'; @NgModule({ imports: [RouterModule.forChild([ - { path: 'admin', component: AdminContainerComponent, - children:[ + { + path: 'admin', component: AdminContainerComponent, + children: [ { path: 'technologies', component: AdminTechnologyComponent, @@ -18,9 +19,10 @@ import { AdminTechnologyComponent } from './components/admin-technology/admin-te path: 'roles', component: AdminRoleComponent, outlet: 'content' - }] + }] } ])], exports: [RouterModule] }) -export class AdminRoutingModule {} \ No newline at end of file +export class AdminRoutingModule { +} diff --git a/src/app/admin/admin.module.ts b/src/app/admin/admin.module.ts index 8725a1f1..e22455ae 100644 --- a/src/app/admin/admin.module.ts +++ b/src/app/admin/admin.module.ts @@ -1,23 +1,22 @@ -import { NgModule } from '@angular/core'; - import { SharedModule } from '../shared/shared.module'; -import { ControlsModule } from '../controls/controls.module'; -import { AdminService } from './admin.service'; - -import { AdminRoutingModule } from './admin-routing.module'; -import { AdminContainerComponent } from './admin-container/admin-container.component'; -import { AdminRoleComponent } from './components/admin-role/admin-role.component'; -import { AdminTechnologyComponent } from './components/admin-technology/admin-technology.component'; - +import {NgModule} from '@angular/core'; +import {SharedModule} from '../shared/shared.module'; +import {ControlsModule} from '../controls/controls.module'; +import {AdminService} from './admin.service'; +import {AdminRoutingModule} from './admin-routing.module'; +import {AdminContainerComponent} from './admin-container/admin-container.component'; +import {AdminRoleComponent} from './components/admin-role/admin-role.component'; +import {AdminTechnologyComponent} from './components/admin-technology/admin-technology.component'; @NgModule({ - imports: [ AdminRoutingModule, ControlsModule, SharedModule ], - exports: [], - declarations: [ - AdminContainerComponent, - AdminTechnologyComponent, - AdminRoleComponent - ], - providers: [ AdminService ] - }) - export class AdminModule { } \ No newline at end of file + imports: [AdminRoutingModule, ControlsModule, SharedModule], + exports: [], + declarations: [ + AdminContainerComponent, + AdminTechnologyComponent, + AdminRoleComponent + ], + providers: [AdminService] +}) +export class AdminModule { +} diff --git a/src/app/admin/admin.service.ts b/src/app/admin/admin.service.ts index 462230a6..91c8454c 100644 --- a/src/app/admin/admin.service.ts +++ b/src/app/admin/admin.service.ts @@ -1,104 +1,86 @@ -import {Output, EventEmitter, Injectable} from "@angular/core"; -import {Response, URLSearchParams} from "@angular/http"; -import { HttpService } from "../core/http.service"; -import { ExtractService } from "../core/extract.service"; -import {Observable} from "rxjs/Observable"; +import {Injectable} from '@angular/core'; +import {HttpService} from '../core/http.service'; +import {ExtractService} from '../core/extract.service'; +import {Observable} from 'rxjs/Observable'; +import {Routes} from '../shared/helpers/routes'; +import {Employee} from '../shared/models/employee'; +import {Role} from '../shared/models/role'; +import {Technology} from '../shared/models/technology'; -import { Employee } from "../shared/models/employee"; -import { Role } from "../shared/models/role"; -import { Technology } from "../shared/models/technology"; - -import { Routes } from './../shared/helpers/routes'; - -import "rxjs/add/operator/map"; -import "rxjs/add/operator/catch"; -import "rxjs/add/operator/toPromise"; -import { retry } from "rxjs/operator/retry"; - +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/catch'; @Injectable() export class AdminService { - routes:Routes; - - constructor(private http: HttpService, private extract:ExtractService) { - this.routes=new Routes(); - } - - - - - //GET requests - getEmployees() : Observable { - - // ...using get request - return this.http.get(this.routes.getEmployees) - // ...and calling .json() on the response to return data - .map(this.extract.extractData) - //...errors if any - .catch((error:any) => Observable.throw(this.extract.handleError(error))); - - } - - getRoles() : Observable { - - // ...using get request - return this.http.get(this.routes.getRoles) - // ...and calling .json() on the response to return data - .map(this.extract.extractData) - //...errors if any - .catch((error:any) => Observable.throw(this.extract.handleError(error))); - - } - - getTechnologies() : Observable { - - // ...using get request - return this.http.get(this.routes.getTechnologies) - // ...and calling .json() on the response to return data - .map(this.extract.extractData) - //...errors if any - .catch((error:any) => Observable.throw(this.extract.handleError(error))); - - } - - doesTechnologyExist(name:string,id:string){ - return this.http.get(this.routes.doesTechnologyExist + name + "/" +id) - // ...and calling .json() on the response to return data - .map(res=>res.json()) - //...errors if any - .catch((error:any) => Observable.throw(this.extract.handleError(error))); - } - - //POST requests - createTechnology(technology:Technology) { - let data = this.http.createParams(technology); - return this.http.post(this.routes.createTechnology , data) - .map(this.extract.extractData) - .catch((error:any) => Observable.throw(this.extract.handlePostError(error))); - } - - updateTechnology(technology:Technology) { - let data = this.http.createParams(technology); - return this.http.post(this.routes.updateTechnology , data) - .map(this.extract.extractData) - .catch((error:any) => Observable.throw(this.extract.handlePostError(error))); - } - - - deleteTechnology(id) { - return this.http.delete(this.routes.deleteTechnology + id) - .map(this.extract.extractData) - .catch((error:any) => Observable.throw(this.extract.handlePostError(error))); - - } - - - - getConstants() : Observable { - return this.http.getConstants() - .map(this.extract.extractData) - .catch((error:any) => Observable.throw(this.extract.handleError(error))); - } -} \ No newline at end of file + routes: Routes; + + constructor(private http: HttpService, private extract: ExtractService) { + this.routes = new Routes(); + } + + // GET requests + getEmployees(): Observable { + // ...using get request + return this.http.get(this.routes.getEmployees) + // ...and calling .json() on the response to return data + .map(this.extract.extractData) + // ...errors if any + .catch(error => Observable.throw(this.extract.handleError(error))); + } + + getRoles(): Observable { + // ...using get request + return this.http.get(this.routes.getRoles) + // ...and calling .json() on the response to return data + .map(this.extract.extractData) + // ...errors if any + .catch(error => Observable.throw(this.extract.handleError(error))); + } + + getTechnologies(): Observable { + // ...using get request + return this.http.get(this.routes.getTechnologies) + // ...and calling .json() on the response to return data + .map(this.extract.extractData) + // ...errors if any + .catch(error => Observable.throw(this.extract.handleError(error))); + } + + doesTechnologyExist(name: string, id: string) { + return this.http.get(this.routes.doesTechnologyExist + name + '/' + id) + // ...and calling .json() on the response to return data + .map(res => res.json()) + // ...errors if any + .catch(error => Observable.throw(this.extract.handleError(error))); + } + + // POST requests + createTechnology(technology: Technology) { + const data = this.http.createParams(technology); + return this.http.post(this.routes.createTechnology, data) + .map(this.extract.extractData) + .catch((error: {}) => Observable.throw(this.extract.handlePostError(error))); + } + + updateTechnology(technology: Technology) { + const data = this.http.createParams(technology); + return this.http.post(this.routes.updateTechnology, data) + .map(this.extract.extractData) + .catch(error => Observable.throw(this.extract.handlePostError(error))); + } + + deleteTechnology(id) { + return this.http.delete(this.routes.deleteTechnology + id) + .map(this.extract.extractData) + .catch(error => Observable.throw(this.extract.handlePostError(error))); + + } + + getConstants(): Observable<{ roles: string[]; seniority: string[]; technologies: string[] }> { + return this.http.getConstants() + .map(this.extract.extractData) + .catch(error => Observable.throw(this.extract.handleError(error))); + } +} diff --git a/src/app/admin/admin.validators.ts b/src/app/admin/admin.validators.ts index 65cf76a2..52749fa8 100644 --- a/src/app/admin/admin.validators.ts +++ b/src/app/admin/admin.validators.ts @@ -1,19 +1,19 @@ -import { AbstractControl } from '@angular/forms'; +import {AbstractControl} from '@angular/forms'; export class AdminValidators { static checkImage(control: AbstractControl) { - const valid =control.value ? control.value.endsWith('.png') : true; - return valid ? null : { invalidImage: true }; + const valid = control.value ? control.value.endsWith('.png') : true; + return valid ? null : {invalidImage: true}; } static versionRequired(control: AbstractControl) { const domain = control.get('domain'); const version = control.get('version'); - const required= (domain.value==='frontend' || domain.value==='backend') && !version.value; + const required = (domain.value === 'frontend' || domain.value === 'backend') && !version.value; - return required ? { versionRequired: true } : null; + return required ? {versionRequired: true} : null; } -} \ No newline at end of file +} diff --git a/src/app/admin/components/admin-role/admin-role.component.ts b/src/app/admin/components/admin-role/admin-role.component.ts index b8516cb0..5620f44b 100644 --- a/src/app/admin/components/admin-role/admin-role.component.ts +++ b/src/app/admin/components/admin-role/admin-role.component.ts @@ -1,88 +1,76 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { AdminService } from './../../admin.service'; -import { Role } from 'app/shared/models/role'; - -import { groupBy } from '../../../shared/helpers/extensions'; - -//forms -import { FormBuilder, Validators } from '@angular/forms'; -import { AdminValidators } from './../../admin.validators'; +import {Component, OnInit} from '@angular/core'; +import {Role} from 'app/shared/models/role'; +import {groupBy} from '../../../shared/helpers/extensions'; +import {FormBuilder, Validators} from '@angular/forms'; +import {AdminService} from '../../admin.service'; @Component({ selector: 'admin-role', templateUrl: './admin-role.component.html', - styleUrls: ['./admin-role.component.less','./../admin-form/admin-form.component.less'], - animations: [ ] + styleUrls: ['./admin-role.component.less', './../admin-form/admin-form.component.less'], + animations: [] }) -export class AdminRoleComponent implements OnInit{ - - activeId:string=""; - editMode:boolean=false; - roles:Array; - domains:Array; - seniority:Array; - //for checkbox - leadrole:boolean=false; - - constructor( - private fb: FormBuilder, - private service:AdminService - ) {} - - ngOnInit(){ - this.service.getConstants().subscribe(data=>{ - this.domains=data.roles; - this.seniority=data.seniority; - }); - this.service.getRoles().subscribe(data=>{ - this.roles=groupBy(data || [],'domain'); - console.log(this.roles); - }) - } +export class AdminRoleComponent implements OnInit { - form=this.fb.group({ - id:[''], - name:['', Validators.required], - domain:['', Validators.required ], - seniority:['',Validators.required], - leadrole:[''] - } /*, { validator: AdminValidators.checkImage }*/) + activeId = ''; + editMode = false; + roles: Role[]; + domains: string[]; + seniority: string[]; + //for checkbox + leadrole = false; + form = this.fb.group({ + id: [''], + name: ['', Validators.required], + domain: ['', Validators.required], + seniority: ['', Validators.required], + leadrole: [''] + }); - + constructor(private fb: FormBuilder, + private service: AdminService) { + } - setRoleType(){ - this.leadrole=!this.leadrole; - this.form.patchValue({leadrole:this.leadrole }); - } + ngOnInit() { + this.service.getConstants().subscribe(data => { + this.domains = data.roles; + this.seniority = data.seniority; + }); + this.service.getRoles().subscribe(data => { + this.roles = groupBy(data || [], 'domain') as Role[]; + console.log(this.roles); + }); + } - submitForm(){ - console.log(this.form.value); - } + setRoleType() { + this.leadrole = !this.leadrole; + this.form.patchValue({leadrole: this.leadrole}); + } - addRole($event){ - console.log($event); - } + submitForm() { + console.log(this.form.value); + } - setForm(value){ - this.form.patchValue({ - id:value.id, - name:value.name, - leadrole:value.leadrole, - seniority:value.seniority, - domain:value.domain - }); - this.leadrole=value.leadrole; - this.activeId=value.id; - this.editMode=true; - } + setForm(value) { + this.form.patchValue({ + id: value.id, + name: value.name, + leadrole: value.leadrole, + seniority: value.seniority, + domain: value.domain + }); + this.leadrole = value.leadrole; + this.activeId = value.id; + this.editMode = true; + } - resetForm(){ - this.activeId=""; - this.form.reset(); - this.editMode=false; - } + resetForm() { + this.activeId = ''; + this.form.reset(); + this.editMode = false; + } - deleteRole(roleid){ - console.log(roleid); - } + deleteRole(roleid) { + console.log(roleid); + } } diff --git a/src/app/admin/components/admin-technology/admin-technology.component.ts b/src/app/admin/components/admin-technology/admin-technology.component.ts index fc23e339..a9badd24 100644 --- a/src/app/admin/components/admin-technology/admin-technology.component.ts +++ b/src/app/admin/components/admin-technology/admin-technology.component.ts @@ -1,96 +1,89 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { AdminService } from './../../admin.service'; -import { Technology } from 'app/shared/models/technology'; - -import { groupBy } from '../../../shared/helpers/extensions'; - -//forms -import { FormBuilder,Validators, AbstractControl } from '@angular/forms'; -import { AdminValidators } from './../../admin.validators'; - +import {Component, OnInit} from '@angular/core'; +import {Technology} from 'app/shared/models/technology'; +import {groupBy} from '../../../shared/helpers/extensions'; +import {FormBuilder, Validators, AbstractControl} from '@angular/forms'; +import {AdminValidators} from '../../admin.validators'; +import {AdminService} from '../../admin.service'; @Component({ selector: 'admin-technology', templateUrl: './admin-technology.component.html', - styleUrls: ['./admin-technology.component.less','./../admin-form/admin-form.component.less'], - animations: [ ] + styleUrls: ['./admin-technology.component.less', './../admin-form/admin-form.component.less'], + animations: [] }) export class AdminTechnologyComponent implements OnInit { - technologies:Array; - techNames:Set; - domains:Array; - editMode:boolean=false; - - constructor( - private fb: FormBuilder, - private service:AdminService - ) {} - + technologies: Technology[]; + techNames: Set; + domains: string[]; + editMode = false; + form = this.fb.group({ + id: [''], + name: ['', Validators.required, this.validateTechnology.bind(this)], + domain: ['', Validators.required], + version: [''], + image: ['', AdminValidators.checkImage] + }); + + constructor(private fb: FormBuilder, + private service: AdminService) { + } - ngOnInit(){ - this.service.getConstants().subscribe(data=>this.domains=data.technologies); + ngOnInit() { + this.service.getConstants().subscribe(data => this.domains = data.technologies); this.getTechnologies(); } - form=this.fb.group({ - id:[''], - name:['', Validators.required,this.validateTechnology.bind(this) ], - domain:['', Validators.required ], - version:['' ], - image:['',AdminValidators.checkImage] - } /*, { validator: AdminValidators.checkImage }*/) - - getTechnologies(){ - this.service.getTechnologies().subscribe(data=>{ - this.technologies=groupBy(data || [],'domain'); - this.techNames=new Set(data.map(tech=>tech.name)) - console.log(this.technologies); - }) + getTechnologies() { + this.service.getTechnologies().subscribe(data => { + this.technologies = groupBy(data || [], 'domain') as Technology[]; + this.techNames = new Set(data.map(tech => tech.name)); + console.log(this.technologies); + }); } - addTechnology(){ - this.service.createTechnology(this.form.value).subscribe(data=>{ + addTechnology() { + this.service.createTechnology(this.form.value).subscribe(data => { this.form.reset(); - console.log(this.form.value) + console.log(this.form.value); this.getTechnologies(); - },error=>{ + }, error => { console.log(error); - }) + }); } -updateTechnology(){ - this.service.updateTechnology(this.form.value).subscribe(data=>{ + updateTechnology() { + this.service.updateTechnology(this.form.value).subscribe(data => { this.form.reset(); console.log(this.form.value); - this.editMode=false; + this.editMode = false; this.getTechnologies(); - },error=>{ + }, error => { console.log(error); - }) + }); } - submitForm(){ + submitForm() { this.editMode ? this.updateTechnology() : this.addTechnology(); } - setForm(value){ + setForm(value) { this.form.patchValue({ - id:value.id, - name:value.name, - image:value.image, - version:value.version, - domain:value.domain + id: value.id, + name: value.name, + image: value.image, + version: value.version, + domain: value.domain }); - this.editMode=true; + this.editMode = true; console.log(this.form.value); } - resetForm(){ + resetForm() { this.form.reset(); - this.editMode=false; + this.editMode = false; } get exists() { @@ -108,23 +101,21 @@ updateTechnology(){ } validateTechnology(control: AbstractControl) { - let id=this.form.get('id').value; + const id = this.form.get('id').value; - return this.service - .doesTechnologyExist(control.value,id) - .map((response: boolean) => - response ? { alreadyExists: true } : null ); + return this.service + .doesTechnologyExist(control.value, id) + .map((response: boolean) => + response ? {alreadyExists: true} : null); } - - - deleteTech(id,$event){ + deleteTech(id, $event) { $event.stopPropagation(); - - this.service.deleteTechnology(id).subscribe(data=>{ + + this.service.deleteTechnology(id).subscribe(data => { this.getTechnologies(); - },error=>{ + }, error => { console.log(error); - }) + }); } } diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index ea10dc99..6b3de584 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,14 +1,13 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; +import {NgModule} from '@angular/core'; +import {Routes, RouterModule} from '@angular/router'; export const routes: Routes = [ - { path: '', redirectTo: 'projects', pathMatch: 'full'} + {path: '', redirectTo: 'projects', pathMatch: 'full'} ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) -export class AppRoutingModule {} - - +export class AppRoutingModule { +} diff --git a/src/app/app.component.ts b/src/app/app.component.ts index b4234b84..5a936d9e 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,6 +1,5 @@ -import { Component } from '@angular/core'; -import { Router, NavigationEnd } from '@angular/router'; - +import {Component} from '@angular/core'; +import {Router, NavigationEnd} from '@angular/router'; @Component({ selector: 'app-root', @@ -9,14 +8,15 @@ import { Router, NavigationEnd } from '@angular/router'; }) export class AppComponent { - constructor(private router: Router) { } - + constructor(private router: Router) { + } + ngOnInit() { - this.router.events.subscribe((evt) => { - if (!(evt instanceof NavigationEnd)) { - return; - } - window.scrollTo(0, 0) - }); - } + this.router.events.subscribe(evt => { + if (!(evt instanceof NavigationEnd)) { + return; + } + window.scrollTo(0, 0); + }); + } } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index a7c3826c..d05c4d8d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,19 +1,18 @@ -import { BrowserModule } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { NgModule } from '@angular/core'; -import { HttpModule } from '@angular/http'; +import {BrowserModule} from '@angular/platform-browser'; +import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; +import {NgModule} from '@angular/core'; +import {HttpModule} from '@angular/http'; +import {AppComponent} from './app.component'; -import { AppComponent } from './app.component'; - -import { AppRoutingModule } from './app-routing.module'; +import {AppRoutingModule} from './app-routing.module'; /*Feature Modules */ -import { AdminModule } from './admin/admin.module'; -import { CoreModule } from './core/core.module'; -import { ProjectModule } from './features/project/project.module'; -import { EmployeeModule } from './features/employee/employee.module'; -import { TechnologyModule } from './features/technology/technology.module'; +import {AdminModule} from './admin/admin.module'; +import {CoreModule} from './core/core.module'; +import {ProjectModule} from './features/project/project.module'; +import {EmployeeModule} from './features/employee/employee.module'; +import {TechnologyModule} from './features/technology/technology.module'; @NgModule({ declarations: [ @@ -33,4 +32,5 @@ import { TechnologyModule } from './features/technology/technology.module'; providers: [], bootstrap: [AppComponent] }) -export class AppModule { } +export class AppModule { +} diff --git a/src/app/controls/button/button.component.ts b/src/app/controls/button/button.component.ts index dfe92620..1107b701 100644 --- a/src/app/controls/button/button.component.ts +++ b/src/app/controls/button/button.component.ts @@ -1,30 +1,29 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; +import {Component, Input, Output, EventEmitter} from '@angular/core'; @Component({ selector: 'app-button', templateUrl: './button.component.html', - styleUrls: [ - './button.component.less', - './../../shared/backpanel/backpanel.component.less', - './../input/input.component.less'] + styleUrls: [ + './button.component.less', + './../../shared/backpanel/backpanel.component.less', + './../input/input.component.less'] }) export class ButtonComponent { - @Input() value:string='SEARCH'; - @Input() style:string=''; - @Input() visible:boolean=true; - @Input() disabled:boolean=false; + @Input() value = 'SEARCH'; + @Input() style = ''; + @Input() visible = true; + @Input() disabled = false; - @Output() click=new EventEmitter(); - - constructor() { - - } + @Output() click = new EventEmitter(); - clicked(event){ - event.stopPropagation(); - this.click.emit(); - } + constructor() { + } -} \ No newline at end of file + clicked(event) { + event.stopPropagation(); + this.click.emit(); + } + +} diff --git a/src/app/controls/checkbox/checkbox.component.ts b/src/app/controls/checkbox/checkbox.component.ts index a00706a9..a72ffd9b 100644 --- a/src/app/controls/checkbox/checkbox.component.ts +++ b/src/app/controls/checkbox/checkbox.component.ts @@ -1,30 +1,25 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; +import {Component, Input, Output, EventEmitter} from '@angular/core'; @Component({ selector: 'checkbox', templateUrl: './checkbox.component.html', - styleUrls: [ - './checkbox.component.less'] + styleUrls: [ + './checkbox.component.less'] }) export class CheckBoxComponent { - @Input() model:boolean=false; - @Input() label:string=''; - @Input() name:string=''; - @Input() style:string=''; - @Input() visible:boolean=true; - @Input() labelStyle:string=''; - @Input() boxStyle:string=''; + @Input() model = false; + @Input() label = ''; + @Input() name = ''; + @Input() style = ''; + @Input() visible = true; + @Input() labelStyle = ''; + @Input() boxStyle = ''; - @Output() checked=new EventEmitter(); - - constructor() { - - } + @Output() checked = new EventEmitter(); - check(event){ - this.checked.emit(); - } + check(event) { + this.checked.emit(); + } - -} \ No newline at end of file +} diff --git a/src/app/controls/chip/chip.component.ts b/src/app/controls/chip/chip.component.ts index ba1477c4..ed95e5bb 100644 --- a/src/app/controls/chip/chip.component.ts +++ b/src/app/controls/chip/chip.component.ts @@ -1,47 +1,41 @@ -import { Component, Input, Output, EventEmitter,OnInit } from '@angular/core'; +import {Component, Input, Output, EventEmitter, OnInit} from '@angular/core'; @Component({ selector: 'chip', templateUrl: './chip.component.html', - styleUrls: [ - './chip.component.less' - ] + styleUrls: [ + './chip.component.less' + ] }) export class ChipComponent implements OnInit { - @Input() value:string=''; - @Input() style:string=''; - @Input() clickable:boolean=false; - @Input() isLink:boolean=false; + @Input() value = ''; + @Input() style = ''; + @Input() clickable = false; + @Input() isLink = false; - @Output() clicked=new EventEmitter(); - @Output() linkClicked=new EventEmitter(); + @Output() clicked = new EventEmitter(); + @Output() linkClicked = new EventEmitter(); - @Input() active=false; - @Input() image:string=""; - @Input() path:string="/server/images/presentation/"; + @Input() active = false; + @Input() image = ''; + @Input() path = '/server/images/presentation/'; - fullpath; - - constructor() { - - } + fullpath; - ngOnInit(){ - //event.stopPropagation(); - this.fullpath=this.path + this.image; - } + ngOnInit() { + this.fullpath = this.path + this.image; + } - performClick(value){ - if(this.clickable){ - this.active=!this.active; - this.clicked.emit(value); - } else{ - if(this.isLink){ - this.linkClicked.emit(value); - } - } + performClick(value) { + if (this.clickable) { + this.active = !this.active; + this.clicked.emit(value); + } else { + if (this.isLink) { + this.linkClicked.emit(value); + } } + } - -} \ No newline at end of file +} diff --git a/src/app/controls/controls.module.ts b/src/app/controls/controls.module.ts index 67ca2bc5..5dd6ad53 100644 --- a/src/app/controls/controls.module.ts +++ b/src/app/controls/controls.module.ts @@ -1,30 +1,29 @@ -import { NgModule, Optional, SkipSelf } from '@angular/core'; -import { SharedModule } from '../shared/shared.module'; +import {NgModule, Optional, SkipSelf} from '@angular/core'; +import {SharedModule} from '../shared/shared.module'; /*Control Components */ -import { ButtonComponent } from './button/button.component'; -import { CheckBoxComponent } from './checkbox/checkbox.component'; -import { InputComponent } from './input/input.component'; -import { DropDownComponent } from './dropdown/dropdown.component'; -import { DeleteButtonComponent } from './delete/delete.component'; -import { ChipComponent } from './chip/chip.component'; +import {ButtonComponent} from './button/button.component'; +import {CheckBoxComponent} from './checkbox/checkbox.component'; +import {InputComponent} from './input/input.component'; +import {DropDownComponent} from './dropdown/dropdown.component'; +import {DeleteButtonComponent} from './delete/delete.component'; +import {ChipComponent} from './chip/chip.component'; -import { FilterItemComponent } from './filters/filter-item/filter-item.component'; -import { FilterPanelComponent } from './filters/filter-panel/filter-panel.component'; +import {FilterItemComponent} from './filters/filter-item/filter-item.component'; +import {FilterPanelComponent} from './filters/filter-panel/filter-panel.component'; -import { ListItemComponent } from './list/list-item/list-item.component'; +import {ListItemComponent} from './list/list-item/list-item.component'; -import { PanelComponent } from './panel/panel.component'; -import { SliderComponent } from './slider/slider.component'; - -import { FormComponent } from './form/form.component'; -import { DynamicFormQuestionComponent } from './form/dynamic-question/dynamic-question.component'; -import { QuestionControlService } from './form/question-control.service'; +import {PanelComponent} from './panel/panel.component'; +import {SliderComponent} from './slider/slider.component'; +import {FormComponent} from './form/form.component'; +import {DynamicFormQuestionComponent} from './form/dynamic-question/dynamic-question.component'; +import {QuestionControlService} from './form/question-control.service'; @NgModule({ - imports: [ - SharedModule + imports: [ + SharedModule ], declarations: [ ButtonComponent, @@ -41,7 +40,7 @@ import { QuestionControlService } from './form/question-control.service'; PanelComponent, SliderComponent ], - exports: [ + exports: [ ButtonComponent, DeleteButtonComponent, CheckBoxComponent, @@ -56,15 +55,15 @@ import { QuestionControlService } from './form/question-control.service'; PanelComponent, SliderComponent ], - providers: [ + providers: [ QuestionControlService ] }) export class ControlsModule { - constructor (@Optional() @SkipSelf() parentModule: ControlsModule) { + constructor(@Optional() @SkipSelf() parentModule: ControlsModule) { if (parentModule) { throw new Error( 'ControlsModule is already loaded. Import it in the AppModule only'); } } -} \ No newline at end of file +} diff --git a/src/app/controls/delete/delete.component.ts b/src/app/controls/delete/delete.component.ts index 2e3156b7..9a99a129 100644 --- a/src/app/controls/delete/delete.component.ts +++ b/src/app/controls/delete/delete.component.ts @@ -1,33 +1,22 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; - -import * as Rx from 'rxjs/Rx'; -import { Inplace } from 'primeng/primeng'; +import {Component, Input, Output, EventEmitter} from '@angular/core'; @Component({ selector: 'delete-button', - styleUrls: [ + styleUrls: [ './delete.component.less' ], template: ` ` - - }) -export class DeleteButtonComponent { - - @Input() value:string="X"; - @Input() style:string=''; - @Output() clicked=new EventEmitter(); - - constructor() { - - } - - buttonClicked(event){ - this.clicked.emit(event); - } +export class DeleteButtonComponent { + @Input() value = 'X'; + @Input() style = ''; + @Output() clicked = new EventEmitter(); -} \ No newline at end of file + buttonClicked(event) { + this.clicked.emit(event); + } +} diff --git a/src/app/controls/dropdown/dropdown.component.ts b/src/app/controls/dropdown/dropdown.component.ts index d23ae9f8..ae8c7e0f 100644 --- a/src/app/controls/dropdown/dropdown.component.ts +++ b/src/app/controls/dropdown/dropdown.component.ts @@ -1,39 +1,30 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; +import {Component, Input, Output, EventEmitter} from '@angular/core'; @Component({ selector: 'dropdown', templateUrl: './dropdown.component.html', - styleUrls: [ - './dropdown.component.less' - ] + styleUrls: [ + './dropdown.component.less' + ] }) export class DropDownComponent { - @Input() id:string=''; - @Input() name:string=''; - @Input() model:string=''; - @Input() label:string=''; - @Input() wrapperStyle=''; - @Input() labelStyle=''; + @Input() id = ''; + @Input() name = ''; + @Input() model = ''; + @Input() label = ''; + @Input() wrapperStyle = ''; + @Input() labelStyle = ''; - @Input() options:Array=new Array(); - @Input() errorMessage:string=""; //Field is required + @Input() options: string[] = []; + @Input() errorMessage = ''; //Field is required - @Output() private changed:EventEmitter=new EventEmitter(); - + @Output() private changed: EventEmitter = new EventEmitter(); - constructor() { - - } + modelChanged(event) { + this.errorMessage = ''; + this.changed.emit(event); + } - ngOnInit(){ - } - - modelChanged(event){ - this.errorMessage=''; - this.changed.emit(event); - } - - -} \ No newline at end of file +} diff --git a/src/app/controls/filters/filter-item/filter-item.component.ts b/src/app/controls/filters/filter-item/filter-item.component.ts index 93e65eb2..7e0de41c 100644 --- a/src/app/controls/filters/filter-item/filter-item.component.ts +++ b/src/app/controls/filters/filter-item/filter-item.component.ts @@ -1,47 +1,35 @@ -import { Component, Input, EventEmitter, Output, ElementRef,HostListener} from '@angular/core'; - +import {Component, Input, EventEmitter, Output, ElementRef, HostListener} from '@angular/core'; @Component({ selector: 'filter-item', templateUrl: './filter-item.component.html', - styleUrls: [ - './filter-item.component.less' - ], - host:{ - '(document:click)': 'onClick($event)' - } + styleUrls: ['./filter-item.component.less'], + host: {'(document:click)': 'onClick($event)'} }) export class FilterItemComponent { - @Input() name:string=''; - @Input() withTooltip:boolean=false; - @Input() tooltipVisible:boolean=false; - @Input() filterStyle:string=""; - @Input() tooltipStyle:string=""; - @Input() wrapperStyle:string=""; - - @Output() onFilterAction=new EventEmitter(); - - - - constructor(private _eref: ElementRef) { - - } + @Input() name = ''; + @Input() withTooltip = false; + @Input() tooltipVisible = false; + @Input() filterStyle = ''; + @Input() tooltipStyle = ''; + @Input() wrapperStyle = ''; - ngAfterViewInit(){ + @Output() onFilterAction = new EventEmitter(); - } + constructor(private _eref: ElementRef) { + } - filterClick(type:string){ - this.onFilterAction.emit(this.name); - } + filterClick(type: string) { + this.onFilterAction.emit(this.name); + } - @HostListener('document:click', ['$event']) - onClick(event) { - if(!this._eref.nativeElement.contains(event.target)){ - this.tooltipVisible=false; - } + @HostListener('document:click', ['$event']) + onClick(event) { + if (!this._eref.nativeElement.contains(event.target)) { + this.tooltipVisible = false; } + } -} \ No newline at end of file +} diff --git a/src/app/controls/filters/filter-panel/filter-panel.component.ts b/src/app/controls/filters/filter-panel/filter-panel.component.ts index 42d27a83..76e08146 100644 --- a/src/app/controls/filters/filter-panel/filter-panel.component.ts +++ b/src/app/controls/filters/filter-panel/filter-panel.component.ts @@ -1,27 +1,13 @@ -import { Component, Input } from '@angular/core'; -import { FilterItemComponent } from '../filter-item/filter-item.component'; - -import * as Rx from 'rxjs/Rx'; +import {Component, Input} from '@angular/core'; @Component({ selector: 'filter-panel', templateUrl: './filter-panel.component.html', - styleUrls: [ - './filter-panel.component.less' - ] - + styleUrls: ['./filter-panel.component.less'] }) -export class FilterPanelComponent { - - @Input() id:string=''; - @Input() sortProperty:string='name'; - - - - constructor() { - - } - +export class FilterPanelComponent { -} \ No newline at end of file + @Input() id = ''; + @Input() sortProperty = 'name'; +} diff --git a/src/app/controls/form/dynamic-question/dynamic-question.component.ts b/src/app/controls/form/dynamic-question/dynamic-question.component.ts index fedf6656..a2896321 100644 --- a/src/app/controls/form/dynamic-question/dynamic-question.component.ts +++ b/src/app/controls/form/dynamic-question/dynamic-question.component.ts @@ -1,30 +1,28 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; - -import { QuestionBase } from './../question-base'; - +import {Component, Input} from '@angular/core'; +import {FormGroup} from '@angular/forms'; +import {QuestionBase} from '../question-base'; @Component({ selector: 'df-question', templateUrl: './dynamic-question.component.html', - styleUrls: [ - './dynamic-question.component.less' - ] + styleUrls: ['./dynamic-question.component.less'] }) export class DynamicFormQuestionComponent { - @Input() question: QuestionBase; - @Input() form: FormGroup; - @Input() id:string=""; + @Input() question: QuestionBase<{}>; + @Input() form: FormGroup; + @Input() id = ''; - @Input() label:string=''; - @Input() wrapperStyle=''; - @Input() placeholder:string=''; - @Input() labelStyle=''; + @Input() label = ''; + @Input() wrapperStyle = ''; + @Input() placeholder = ''; + @Input() labelStyle = ''; - ngOnInit(){ - console.log(this.form,this.form.controls[this.question.key]) - } + ngOnInit() { + console.log(this.form, this.form.controls[this.question.key]); + } - get isValid() { return this.form.controls[this.question.key].valid; } - } \ No newline at end of file + get isValid() { + return this.form.controls[this.question.key].valid; + } +} diff --git a/src/app/controls/form/dynamic-question/question-dropdown.ts b/src/app/controls/form/dynamic-question/question-dropdown.ts index 7b500547..86b41088 100644 --- a/src/app/controls/form/dynamic-question/question-dropdown.ts +++ b/src/app/controls/form/dynamic-question/question-dropdown.ts @@ -1,11 +1,11 @@ -import { QuestionBase } from './../question-base'; +import {QuestionBase} from './../question-base'; export class DropdownQuestion extends QuestionBase { controlType = 'dropdown'; - options: {key: string, value: string}[] = []; + options: { key: string, value: string }[] = []; constructor(options: {} = {}) { super(options); this.options = options['options'] || []; } -} \ No newline at end of file +} diff --git a/src/app/controls/form/dynamic-question/question-textbox.ts b/src/app/controls/form/dynamic-question/question-textbox.ts index 8f29c858..4cc8a79d 100644 --- a/src/app/controls/form/dynamic-question/question-textbox.ts +++ b/src/app/controls/form/dynamic-question/question-textbox.ts @@ -1,4 +1,4 @@ -import { QuestionBase } from './../question-base'; +import {QuestionBase} from './../question-base'; export class TextboxQuestion extends QuestionBase { controlType = 'textbox'; @@ -8,4 +8,4 @@ export class TextboxQuestion extends QuestionBase { super(options); this.type = options['type'] || ''; } -} \ No newline at end of file +} diff --git a/src/app/controls/form/form.component.ts b/src/app/controls/form/form.component.ts index ad7d1c5e..2bdde88a 100644 --- a/src/app/controls/form/form.component.ts +++ b/src/app/controls/form/form.component.ts @@ -1,31 +1,24 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; - -import { QuestionBase } from './question-base'; -import { QuestionControlService } from './question-control.service'; +import {Component, Input, OnInit} from '@angular/core'; +import {FormGroup} from '@angular/forms'; + +import {QuestionBase} from './question-base'; +import {QuestionControlService} from './question-control.service'; @Component({ selector: 'app-form', templateUrl: './form.component.html', - styleUrls: [ - './form.component.less' - ] + styleUrls: ['./form.component.less'] }) export class FormComponent implements OnInit { - - @Input() questions: QuestionBase[] = []; - form: FormGroup; - payLoad = ''; - - constructor(private qcs: QuestionControlService) { } - - ngOnInit() { - this.form = this.qcs.toFormGroup(this.questions); - } - - onSubmit() { - console.log(this.form.value); - //this.payLoad = JSON.stringify(this.form.value); - } -} \ No newline at end of file + + @Input() questions: QuestionBase<{}>[] = []; + form: FormGroup; + + constructor(private qcs: QuestionControlService) { + } + + ngOnInit() { + this.form = this.qcs.toFormGroup(this.questions); + } +} diff --git a/src/app/controls/form/question-base.ts b/src/app/controls/form/question-base.ts index 7aea7bb0..60604538 100644 --- a/src/app/controls/form/question-base.ts +++ b/src/app/controls/form/question-base.ts @@ -1,24 +1,24 @@ -export class QuestionBase{ - value: T; - key: string; - label: string; - required: boolean; - order: number; - controlType: string; - - constructor(options: { - value?: T, - key?: string, - label?: string, - required?: boolean, - order?: number, - controlType?: string - } = {}) { - this.value = options.value; - this.key = options.key || ''; - this.label = options.label || ''; - this.required = !!options.required; - this.order = options.order === undefined ? 1 : options.order; - this.controlType = options.controlType || ''; - } - } \ No newline at end of file +export class QuestionBase { + value: T; + key: string; + label: string; + required: boolean; + order: number; + controlType: string; + + constructor(options: { + value?: T, + key?: string, + label?: string, + required?: boolean, + order?: number, + controlType?: string + } = {}) { + this.value = options.value; + this.key = options.key || ''; + this.label = options.label || ''; + this.required = !!options.required; + this.order = options.order === undefined ? 1 : options.order; + this.controlType = options.controlType || ''; + } +} diff --git a/src/app/controls/form/question-control.service.ts b/src/app/controls/form/question-control.service.ts index 8db4aa00..98079144 100644 --- a/src/app/controls/form/question-control.service.ts +++ b/src/app/controls/form/question-control.service.ts @@ -1,19 +1,18 @@ -import { Injectable } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import {Injectable} from '@angular/core'; +import {FormControl, FormGroup, Validators} from '@angular/forms'; -import { QuestionBase } from './question-base'; +import {QuestionBase} from './question-base'; @Injectable() export class QuestionControlService { - constructor() { } - toFormGroup(questions: QuestionBase[] ) { - let group: any = {}; + toFormGroup(questions: QuestionBase<{}>[]) { + const group: {} = {}; questions.forEach(question => { group[question.key] = question.required ? new FormControl(question.value || '', Validators.required) - : new FormControl(question.value || ''); + : new FormControl(question.value || ''); }); return new FormGroup(group); } -} \ No newline at end of file +} diff --git a/src/app/controls/input/input.component.ts b/src/app/controls/input/input.component.ts index 9b6d4699..ace0bd97 100644 --- a/src/app/controls/input/input.component.ts +++ b/src/app/controls/input/input.component.ts @@ -1,136 +1,124 @@ -import { Component, Input,Output, EventEmitter,ViewChild } from '@angular/core'; -import * as Rx from 'rxjs/Rx'; +import {Component, Input, Output, EventEmitter, ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/observable/fromEvent'; +import 'rxjs/add/operator/pluck'; +import 'rxjs/add/operator/filter'; @Component({ selector: 'app-input', templateUrl: './input.component.html', - styleUrls: [ - './input.component.less', - './../../shared/backpanel/backpanel.component.less' - ] + styleUrls: [ + './input.component.less', + './../../shared/backpanel/backpanel.component.less' + ] }) export class InputComponent { - @Input() id:string=''; - @Input() name:string=''; - @Input() model:string=''; - @Input() label:string=''; - @Input() wrapperStyle=''; - @Input() labelStyle=''; - @Input() boxStyle=''; - @Input() clearStyle:string=''; - @Input() placeholder:string=''; - @Input() complete:Array=new Array(); + @Input() id = ''; + @Input() name = ''; + @Input() model = ''; + @Input() label = ''; + @Input() wrapperStyle = ''; + @Input() labelStyle = ''; + @Input() boxStyle = ''; + @Input() clearStyle = ''; + @Input() placeholder = ''; + @Input() complete = []; - @Input() errorMessage:string=""; //Field is required - @Input() controlType:string="input"; + @Input() errorMessage = ''; // Field is required + @Input() controlType = 'input'; - @Output() onModelChanged=new EventEmitter(); - + @Output() onModelChanged = new EventEmitter(); - @ViewChild('searchBox') searchBox; + @ViewChild('searchBox') searchBox; - completeInitial:Array=new Array(); - searchString:string=''; + completeInitial = []; - showAutocomplete:boolean=false; - activeItem=-1; + showAutocomplete = false; + activeItem = -1; - hasComplete:boolean=false; + hasComplete = false; - constructor() { - - } - - - - - ngAfterViewInit(){ - - setTimeout(function() { - this.showAutocomplete=false; - this.completeInitial=this.complete; - this.hasComplete=this.complete.length>0; - - - Rx.Observable.fromEvent(document, 'keydown') - .pluck('key') - .filter(char => char==="ArrowDown" || char==="ArrowUp" || char==="Enter") - .subscribe(item=>this.walkThroughComplete(item,this.showAutocomplete)); - }.bind(this), 200); - } + constructor() { - ngAfterContentInit(){ - - } + } + ngAfterViewInit() { - modelChanged(event){ - if(this.hasComplete){ - this.showAutocomplete=true; - this.complete=this.completeInitial; - let filtered=this.complete.filter(item=>item.toLowerCase().indexOf(event.toLowerCase())!=-1); - this.complete=filtered.length>0 ? filtered : ["No results found"]; - } - - this.errorMessage=''; - this.onModelChanged.emit(this.model); - } + setTimeout(function () { + this.showAutocomplete = false; + this.completeInitial = this.complete; + this.hasComplete = this.complete.length > 0; - blurInput(){ - setTimeout(function() { - this.showAutocomplete = false; - }.bind(this), 200); - } + Observable.fromEvent(document, 'keydown') + .pluck('key') + .filter(char => char === 'ArrowDown' || char === 'ArrowUp' || char === 'Enter') + .subscribe(item => this.walkThroughComplete(item, this.showAutocomplete)); + }.bind(this), 200); + } - completeClick(data){ - console.log(data); - //this.searchString=(this.searchString+=', ' + data).replace(/(^[,\s]+)|([,\s]+$)/g, ''); - this.model=data;//this.searchString; - this.modelChanged(data); - this.showAutocomplete=false; + modelChanged(event) { + if (this.hasComplete) { + this.showAutocomplete = true; + this.complete = this.completeInitial; + const filtered = this.complete.filter(item => item.toLowerCase().indexOf(event.toLowerCase()) != -1); + this.complete = filtered.length > 0 ? filtered : ['No results found']; } - clearModel(){ - this.model=''; - this.activeItem=-1; - this.modelChanged(this.model); - this.searchBox.nativeElement.focus(); - this.onModelChanged.emit(this.model); + this.errorMessage = ''; + this.onModelChanged.emit(this.model); + } + + blurInput() { + setTimeout(function () { + this.showAutocomplete = false; + }.bind(this), 200); + } + + completeClick(data) { + console.log(data); + //this.searchString=(this.searchString+=', ' + data).replace(/(^[,\s]+)|([,\s]+$)/g, ''); + this.model = data; //this.searchString; + this.modelChanged(data); + this.showAutocomplete = false; + } + + clearModel() { + this.model = ''; + this.activeItem = -1; + this.modelChanged(this.model); + this.searchBox.nativeElement.focus(); + this.onModelChanged.emit(this.model); + } + + walkThroughComplete(evt, showAutocomplete) { + + if (showAutocomplete) { + switch (evt) { + case 'ArrowDown': + this.activeItem === this.complete.length - 1 ? this.activeItem = 0 : this.activeItem++; + break; + case 'ArrowUp': + this.activeItem === 0 ? this.activeItem = this.complete.length - 1 : this.activeItem--; + break; + case 'Enter': + const selected = this.activeItem < 0 ? this.model : this.complete[this.activeItem]; + + this.model = selected; + this.modelChanged(selected); + this.onModelChanged.emit(selected); + + this.activeItem = -1; + this.showAutocomplete = false; + } } + } - - - walkThroughComplete(evt,showAutocomplete){ - - if(showAutocomplete){ - switch(evt){ - case "ArrowDown": - this.activeItem===this.complete.length-1 ? this.activeItem=0 : this.activeItem++; - break; - case "ArrowUp": - this.activeItem===0 ? this.activeItem=this.complete.length-1 : this.activeItem--; - break; - case "Enter": - let selected=this.activeItem<0 ? this.model : this.complete[this.activeItem]; - - this.model=selected; - this.modelChanged(selected); - this.onModelChanged.emit(selected); - - this.activeItem=-1; - this.showAutocomplete=false; - } - } - } - - - - filter(){ - this.showAutocomplete=false; - this.onModelChanged.emit(this.model); - } + filter() { + this.showAutocomplete = false; + this.onModelChanged.emit(this.model); + } } diff --git a/src/app/controls/list/list-item/list-item.component.ts b/src/app/controls/list/list-item/list-item.component.ts index 15969352..dbc45c93 100644 --- a/src/app/controls/list/list-item/list-item.component.ts +++ b/src/app/controls/list/list-item/list-item.component.ts @@ -1,54 +1,46 @@ -import { Component, Input, Output,EventEmitter, AfterContentInit } from '@angular/core'; -import { Employee } from '../../../shared/models/employee'; -import { Role } from '../../../shared/models/role'; -import { Schedule } from '../../../shared/models/schedule'; -import { validateConfig } from '@angular/router/src/config'; +import {Component, Input, Output, EventEmitter, AfterContentInit} from '@angular/core'; +import {Role} from '../../../shared/models/role'; +import {Schedule} from '../../../shared/models/schedule'; @Component({ selector: 'list-item', templateUrl: './list-item.component.html', - styleUrls: [ - './list-item.component.less'] + styleUrls: ['./list-item.component.less'] }) export class ListItemComponent implements AfterContentInit { - @Input() model:Schedule=new Schedule(); - @Input() roles:Array=new Array(); + @Input() model: Schedule = new Schedule(); + @Input() roles: Role[] = []; - @Input() itemStyle:string=''; - @Input() headingStyle:string=''; + @Input() itemStyle = ''; + @Input() headingStyle = ''; - @Input() clickable:boolean=false; - @Output() clicked=new EventEmitter(); + @Input() clickable = false; + @Output() clicked = new EventEmitter(); - active=false; - // @Input() output:Schedule=new Schedule(); - - constructor() { - - } + active = false; - ngAfterContentInit(){ - this.model.role=this.model.role.id==='' ? this.roles[0] : this.model.role; - } + ngAfterContentInit() { + this.model.role = this.model.role.id === '' ? this.roles[0] : this.model.role; + } - performCLick(value:Schedule){ - - if(this.clickable){ - value.active=!value.active; - value.participation = value.active ? 100.00 :0.0; - this.clicked.emit(this.model); - } - } - - stopAction($event){ - $event.stopPropagation(); - } + performCLick(value: Schedule) { - selectRole($event){ - this.model.role=this.roles.filter(item=>item.id==$event.target.value)[0]; - this.model.active=true; - this.model.participation=100.00; - this.clicked.emit(this.model); + if (this.clickable) { + value.active = !value.active; + value.participation = value.active ? 100.00 : 0.0; + this.clicked.emit(this.model); } -} \ No newline at end of file + } + + stopAction($event) { + $event.stopPropagation(); + } + + selectRole($event) { + this.model.role = this.roles.filter(item => item.id == $event.target.value)[0]; + this.model.active = true; + this.model.participation = 100.00; + this.clicked.emit(this.model); + } +} diff --git a/src/app/controls/panel/panel.component.ts b/src/app/controls/panel/panel.component.ts index 70c3fc90..438d8e9f 100644 --- a/src/app/controls/panel/panel.component.ts +++ b/src/app/controls/panel/panel.component.ts @@ -1,25 +1,13 @@ -import { Component, Input, Output,EventEmitter } from '@angular/core'; - - +import {Component, Input} from '@angular/core'; @Component({ selector: 'panel', templateUrl: './panel.component.html', - styleUrls: [ - './panel.component.less'] + styleUrls: ['./panel.component.less'] }) export class PanelComponent { - - @Input() itemStyle:string=''; - @Input() panelVisible:boolean=true; - @Input() panelOpened:boolean=true; - - constructor() { - - } - - - - -} \ No newline at end of file + @Input() itemStyle = ''; + @Input() panelVisible = true; + @Input() panelOpened = true; +} diff --git a/src/app/controls/slider/slider.component.ts b/src/app/controls/slider/slider.component.ts index 9c92cc3e..e5bb3988 100644 --- a/src/app/controls/slider/slider.component.ts +++ b/src/app/controls/slider/slider.component.ts @@ -1,35 +1,27 @@ // Exact copy of app/title.component.ts except import UserService from shared -import { Component, Input, SimpleChanges } from '@angular/core'; - +import {Component, Input, SimpleChanges} from '@angular/core'; @Component({ selector: 'slider', templateUrl: './slider.component.html', - styleUrls: ['./slider.component.less'] + styleUrls: ['./slider.component.less'] }) export class SliderComponent { - @Input() image:string=""; - @Input() withSugar:boolean=false; - fullpath; - - - constructor() { - - } + @Input() image = ''; + @Input() withSugar = false; + fullpath; - ngOnInit(){ + ngOnInit() { this.changePath(this.image); } ngOnChanges(changes: SimpleChanges) { - let change=changes.image.currentValue; + const change = changes.image.currentValue; this.changePath(change); - } - changePath(path){ - this.fullpath=path ? "/server/images/" + path : ""; + changePath(path) { + this.fullpath = path ? '/server/images/' + path : ''; } } - diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 9c01d42f..82abf4de 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -1,61 +1,60 @@ /* tslint:disable:member-ordering no-unused-variable */ import { - ModuleWithProviders, NgModule, - Optional, SkipSelf } from '@angular/core'; - - import { SharedModule } from '../shared/shared.module'; - import { UserService } from './user.service'; - import { UserServiceConfig } from './user.service'; + ModuleWithProviders, NgModule, + Optional, SkipSelf +} from '@angular/core'; +import {SharedModule} from '../shared/shared.module'; +import {UserService} from './user.service'; +import {UserServiceConfig} from './user.service'; - /*Feature Modules */ +/*Feature Modules */ - import { HeaderComponent } from './header/header.component'; - import { LoaderComponent } from './loader/loader.component'; +import {HeaderComponent} from './header/header.component'; +import {LoaderComponent} from './loader/loader.component'; - import { HttpService } from './http.service'; - import { DynamicService } from './dynamic.service'; - import { ExtractService } from './extract.service'; - import { FileService } from './file.service'; - import { PowerPointService } from './powerpoint.service'; - - @NgModule({ - imports: [ - SharedModule - ], - declarations: [ - HeaderComponent, - LoaderComponent - ], - exports: [ - HeaderComponent, - LoaderComponent - ], - providers: [ - DynamicService, - UserService, - HttpService, - ExtractService, - FileService, - PowerPointService - ] - }) - export class CoreModule { - - constructor (@Optional() @SkipSelf() parentModule: CoreModule) { - if (parentModule) { - throw new Error( - 'CoreModule is already loaded. Import it in the AppModule only'); - } - } - - static forRoot(config: UserServiceConfig): ModuleWithProviders { - return { - ngModule: CoreModule, - providers: [ - { provide: UserServiceConfig, useValue: config } - ] - }; +import {HttpService} from './http.service'; +import {DynamicService} from './dynamic.service'; +import {ExtractService} from './extract.service'; +import {FileService} from './file.service'; +import {PowerPointService} from './powerpoint.service'; + +@NgModule({ + imports: [ + SharedModule + ], + declarations: [ + HeaderComponent, + LoaderComponent + ], + exports: [ + HeaderComponent, + LoaderComponent + ], + providers: [ + DynamicService, + UserService, + HttpService, + ExtractService, + FileService, + PowerPointService + ] +}) +export class CoreModule { + + constructor(@Optional() @SkipSelf() parentModule: CoreModule) { + if (parentModule) { + throw new Error( + 'CoreModule is already loaded. Import it in the AppModule only'); } } - \ No newline at end of file + + static forRoot(config: UserServiceConfig): ModuleWithProviders { + return { + ngModule: CoreModule, + providers: [ + {provide: UserServiceConfig, useValue: config} + ] + }; + } +} diff --git a/src/app/core/dynamic.service.ts b/src/app/core/dynamic.service.ts index 16d1ad13..1098014a 100644 --- a/src/app/core/dynamic.service.ts +++ b/src/app/core/dynamic.service.ts @@ -1,48 +1,44 @@ -import { Component,ComponentFactoryResolver, Injectable, Inject, ReflectiveInjector,ViewContainerRef} from '@angular/core' -import { DeleteComponent } from '../shared/modal/delete/delete.component'; -import { ErrorComponent } from '../shared/modal/error/error.component'; -import { FileComponent } from '../shared/modal/file/file.component'; -import { ProjectConfirmationComponent } from '../features/project/project-modal/project-confirmation/project-confirmation.component'; - - - +import {ComponentFactoryResolver, Injectable, Inject, ViewContainerRef} from '@angular/core'; +import {DeleteComponent} from '../shared/modal/delete/delete.component'; +import {ErrorComponent} from '../shared/modal/error/error.component'; +import {FileComponent} from '../shared/modal/file/file.component'; +import {ProjectConfirmationComponent} from '../features/project/project-modal/project-confirmation/project-confirmation.component'; @Injectable() - export class DynamicService { - - rootViewContainer:ViewContainerRef; - factoryResolver:ComponentFactoryResolver; - - constructor(@Inject(ComponentFactoryResolver) factoryResolver) { - this.factoryResolver = factoryResolver - } - - - setRootViewContainerRef(viewContainerRef) { - this.rootViewContainer = viewContainerRef - } - - addDeleteComponent():DeleteComponent { - const factory = this.factoryResolver.resolveComponentFactory(DeleteComponent) - const component = this.rootViewContainer.createComponent(factory); - return component.instance; - } - - addFileComponent():FileComponent { - const factory = this.factoryResolver.resolveComponentFactory(FileComponent) - const component = this.rootViewContainer.createComponent(factory); - return component.instance; - } - - addErrorComponent():ErrorComponent { - const factory = this.factoryResolver.resolveComponentFactory(ErrorComponent) - const component = this.rootViewContainer.createComponent(factory); - return component.instance; - } - - addProjectConfirmationComponent():ProjectConfirmationComponent { - const factory = this.factoryResolver.resolveComponentFactory(ProjectConfirmationComponent) - const component = this.rootViewContainer.createComponent(factory); - return component.instance; - } -} \ No newline at end of file +export class DynamicService { + + rootViewContainer: ViewContainerRef; + factoryResolver: ComponentFactoryResolver; + + constructor(@Inject(ComponentFactoryResolver) factoryResolver) { + this.factoryResolver = factoryResolver; + } + + setRootViewContainerRef(viewContainerRef) { + this.rootViewContainer = viewContainerRef; + } + + addDeleteComponent(): DeleteComponent { + const factory = this.factoryResolver.resolveComponentFactory(DeleteComponent); + const component = this.rootViewContainer.createComponent(factory); + return component.instance; + } + + addFileComponent(): FileComponent { + const factory = this.factoryResolver.resolveComponentFactory(FileComponent); + const component = this.rootViewContainer.createComponent(factory); + return component.instance; + } + + addErrorComponent(): ErrorComponent { + const factory = this.factoryResolver.resolveComponentFactory(ErrorComponent); + const component = this.rootViewContainer.createComponent(factory); + return component.instance; + } + + addProjectConfirmationComponent(): ProjectConfirmationComponent { + const factory = this.factoryResolver.resolveComponentFactory(ProjectConfirmationComponent); + const component = this.rootViewContainer.createComponent(factory); + return component.instance; + } +} diff --git a/src/app/core/extract.service.ts b/src/app/core/extract.service.ts index 3d6d6402..cd7b25d5 100644 --- a/src/app/core/extract.service.ts +++ b/src/app/core/extract.service.ts @@ -1,22 +1,19 @@ -import {Output, EventEmitter, Injectable} from "@angular/core"; -import {Response} from "@angular/http"; -import {Observable} from "rxjs/Observable"; -import "rxjs/add/operator/map"; -import "rxjs/add/operator/catch"; - -import { Error } from '../shared/models/error'; +import {Output, EventEmitter, Injectable} from '@angular/core'; +import {Response} from '@angular/http'; +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/catch'; +import {Error} from '../shared/models/error'; +class MessageResponse extends Error { + message: string; +} @Injectable() export class ExtractService { @Output() errorMessage = new EventEmitter(); - - constructor() { - } - public extractData(res: Response) { let body; if (res.text()) { @@ -25,12 +22,12 @@ export class ExtractService { return body || {}; } - public handleError(error: Response | any) { + public handleError(error: MessageResponse) { - let errors: Error=new Error(); + const errors: Error = new Error(); if (error instanceof Response) { - errors.status=error.status; - errors.statusText=error.statusText; + errors.status = error.status; + errors.statusText = error.statusText; errors.errors.push(error.text()); } else { @@ -40,23 +37,23 @@ export class ExtractService { return errors; } - public handlePostError(error: Response | any) { - - let errors:Error=new Error(); - - if (error instanceof Response) { - errors.status=error.status; - errors.statusText=error.statusText; - - let resp=error.json()["errors"]; - for(let key of Object.keys(resp)){ - errors.errors.push(resp[key].msg); - } - } else { - errors.errors.push(error.toString()); - } - - return errors; + public handlePostError(error: Response | {}) { + + const errors: Error = new Error(); + + if (error instanceof Response) { + errors.status = error.status; + errors.statusText = error.statusText; + + const resp = error.json()['errors']; + for (const key of Object.keys(resp)) { + errors.errors.push(resp[key].msg); + } + } else { + errors.errors.push(error.toString()); } - } \ No newline at end of file + return errors; + } + +} diff --git a/src/app/core/file.service.ts b/src/app/core/file.service.ts index 3ac6e876..62930ae0 100644 --- a/src/app/core/file.service.ts +++ b/src/app/core/file.service.ts @@ -1,39 +1,30 @@ -import {Output, EventEmitter, Injectable} from "@angular/core"; -import {Response, URLSearchParams} from "@angular/http"; -import { HttpService } from "./http.service"; -import { ExtractService } from "./extract.service"; -import {Observable} from "rxjs/Observable"; +import {Injectable} from '@angular/core'; +import {HttpService} from './http.service'; +import {ExtractService} from './extract.service'; +import {Observable} from 'rxjs/Observable'; +import {Project} from '../shared/models/project'; +import {Routes} from '../shared/helpers/routes'; -import { Project } from "../shared/models/project"; - -import { PortfolioQueryEncoder } from "../shared//helpers/queryEncoder"; -import { Routes } from '../shared/helpers/routes'; - -import "rxjs/add/operator/map"; -import "rxjs/add/operator/catch"; -import "rxjs/add/operator/toPromise"; -import * as pptx from "pptxgenjs"; - +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/operator/toPromise'; @Injectable() export class FileService { - routes:Routes; - - constructor(private http: HttpService, private extract:ExtractService) { - this.routes=new Routes(); - } - - + routes: Routes; + constructor(private http: HttpService, private extract: ExtractService) { + this.routes = new Routes(); + } - //GET requests - removeImage(project:Project):Observable { - let data = this.http.createParams(project); - return this.http.put(this.routes.removeImage,data) - .map(this.extract.extractData) - .catch((error:any) => Observable.throw(this.extract.handlePostError(error))); - } + // GET requests + removeImage(project: Project): Observable { + const data = this.http.createParams(project); + return this.http.put(this.routes.removeImage, data) + .map(this.extract.extractData) + .catch((error: {}) => Observable.throw(this.extract.handlePostError(error))); + } -} \ No newline at end of file +} diff --git a/src/app/core/header/header.animation.ts b/src/app/core/header/header.animation.ts index 8e6fdcc8..9bb6d4c2 100644 --- a/src/app/core/header/header.animation.ts +++ b/src/app/core/header/header.animation.ts @@ -6,11 +6,10 @@ import { transition } from '@angular/animations'; - export const HEADER_ANIMATION = trigger('flyInOut', [ state('in', style({transform: 'translateY(0)'})), transition('void => *', [ style({transform: 'translateY(-100%)'}), animate('0.2s 200ms ease-out') ]) - ]) \ No newline at end of file + ]); diff --git a/src/app/core/header/header.component.ts b/src/app/core/header/header.component.ts index 9691e2e7..4727a532 100644 --- a/src/app/core/header/header.component.ts +++ b/src/app/core/header/header.component.ts @@ -1,13 +1,13 @@ // Exact copy of app/title.component.ts except import UserService from shared -import { Component, Input } from '@angular/core'; -import { UserService } from '../user.service'; -import { HEADER_ANIMATION } from './header.animation'; +import {Component} from '@angular/core'; +import {UserService} from '../user.service'; +import {HEADER_ANIMATION} from './header.animation'; @Component({ selector: 'app-header', templateUrl: './header.component.html', - styleUrls: ['./header.component.less'], - animations: [ HEADER_ANIMATION] + styleUrls: ['./header.component.less'], + animations: [HEADER_ANIMATION] }) export class HeaderComponent { user = ''; @@ -16,4 +16,3 @@ export class HeaderComponent { this.user = userService.userName; } } - diff --git a/src/app/core/http.service.ts b/src/app/core/http.service.ts index 2828d97c..6c0b5bbd 100644 --- a/src/app/core/http.service.ts +++ b/src/app/core/http.service.ts @@ -1,11 +1,12 @@ /** * Created by apotikho on 29.04.2017. */ -import {Injectable} from "@angular/core"; -import {Http, Headers, RequestOptionsArgs, RequestOptions, URLSearchParams} from "@angular/http"; +import {Injectable} from '@angular/core'; +import {Http, Headers, RequestOptionsArgs, RequestOptions, URLSearchParams} from '@angular/http'; -import { PortfolioQueryEncoder } from "../shared//helpers/queryEncoder"; -//import {AuthenticationService} from "../security/auth.service"; +import {PortfolioQueryEncoder} from '../shared//helpers/queryEncoder'; + +// import {AuthenticationService} from "../security/auth.service"; @Injectable() export class HttpService { @@ -13,67 +14,68 @@ export class HttpService { constructor(private http: Http) { } - public getCommonHeaders(): Headers { - //let token = this.auth.getLoggedInUser() ? this.auth.getLoggedInUser().token : ''; + public getCommonHeaders(): Headers { + // let token = this.auth.getLoggedInUser() ? this.auth.getLoggedInUser().token : ''; const headers = new Headers(); headers.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); - // headers.append('Authorization', `Bearer ${token}`); + // headers.append('Authorization', `Bearer ${token}`); - //Prevent Ajax Request Caching for Internet Explorer - headers.append("Cache-control", "no-cache"); - headers.append("Cache-control", "no-store"); - headers.append("Pragma", "no-cache"); - headers.append("Expires", "0"); + // Prevent Ajax Request Caching for Internet Explorer + headers.append('Cache-control', 'no-cache'); + headers.append('Cache-control', 'no-store'); + headers.append('Pragma', 'no-cache'); + headers.append('Expires', '0'); return headers; } get(url, options?: RequestOptionsArgs) { - let opt = options ? options : new RequestOptions(); + const opt = options ? options : new RequestOptions(); opt.headers = this.getCommonHeaders(); return this.http.get(url, opt); } post(url, data, options?: RequestOptionsArgs) { - let opt = options ? options : new RequestOptions(); + const opt = options ? options : new RequestOptions(); opt.headers = this.getCommonHeaders(); return this.http.post(url, data, opt); } put(url, data, options?: RequestOptionsArgs) { - let opt = options ? options : new RequestOptions(); + const opt = options ? options : new RequestOptions(); opt.headers = this.getCommonHeaders(); return this.http.put(url, data, opt); } delete(url, options?: RequestOptionsArgs) { - let opt = options ? options : new RequestOptions(); + const opt = options ? options : new RequestOptions(); opt.headers = this.getCommonHeaders(); return this.http.delete(url, opt); } - createParams(model:any) : URLSearchParams{ - let data = new URLSearchParams('', new PortfolioQueryEncoder()); - - for(let key of Object.keys(model)){ - if(!Array.isArray(model[key])){ - data.append(key,model[key]); - } else { - for(let item of model[key]){ - if(item instanceof Object) item=JSON.stringify(item); - data.append(key,item); - } + createParams(model: {}): URLSearchParams { + const data = new URLSearchParams('', new PortfolioQueryEncoder()); + + for (const key of Object.keys(model)) { + if (!Array.isArray(model[key])) { + data.append(key, model[key]); + } else { + for (let item of model[key]) { + if (item instanceof Object) { + item = JSON.stringify(item); + } + data.append(key, item); } - + } + } - + console.log(data); return data; } - getConstants(){ - return this.http.request('./../assets/constants.json'); + getConstants() { + return this.http.request('./../assets/constants.json'); } } - diff --git a/src/app/core/loader/loader.component.ts b/src/app/core/loader/loader.component.ts index db2e224a..9d4ecc57 100644 --- a/src/app/core/loader/loader.component.ts +++ b/src/app/core/loader/loader.component.ts @@ -1,16 +1,11 @@ -import { Component, Input } from '@angular/core'; - - +import {Component} from '@angular/core'; @Component({ selector: 'loader', templateUrl: './loader.component.html', - styleUrls: ['./loader.component.less'], - animations: [ ] + styleUrls: ['./loader.component.less'], + animations: [] }) export class LoaderComponent { - constructor() { - - } } diff --git a/src/app/core/powerpoint.service.ts b/src/app/core/powerpoint.service.ts index e5459734..e5a0f893 100644 --- a/src/app/core/powerpoint.service.ts +++ b/src/app/core/powerpoint.service.ts @@ -1,495 +1,429 @@ -import {Output, EventEmitter, Injectable} from "@angular/core"; -import {Response, URLSearchParams} from "@angular/http"; +import {Injectable} from '@angular/core'; -import { Project } from "../shared/models/project"; -import { HttpService } from './http.service'; -import { ExtractService } from "./extract.service"; -import {Observable} from "rxjs/Observable"; +import {Project} from '../shared/models/project'; +import {HttpService} from './http.service'; +import {ExtractService} from './extract.service'; +import {Observable} from 'rxjs/Observable'; -import { Routes } from './../shared/helpers/routes'; +import {Routes} from './../shared/helpers/routes'; -import "rxjs/add/operator/map"; -import "rxjs/add/operator/catch"; - - -import pptx from "pptxgenjs"; -import { retry } from "rxjs/operator/retry"; +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/catch'; +import pptx from 'pptxgenjs'; @Injectable() export class PowerPointService { - routes:Routes; - pptx:any; - PptxGenJS:any; - - constructor(private http:HttpService, private extract:ExtractService){ - this.routes=new Routes(); - this.PptxGenJS=Object.getPrototypeOf(pptx).constructor; - this.pptx=new this.PptxGenJS(); - //pptx.setBrowser(true); - } - - magenta:string="e20074"; - x:number=0.39; - - capitalize(word) { - return word.charAt(0).toUpperCase() + word.slice(1); - } - - getDate(date:Date){ - let newDate= date ? new Date(date) : null; - let parsed=newDate ? newDate.getDate() + '.'+ newDate.getMonth() + '.' + newDate.getFullYear() : ''; - return parsed; - } - - addSlide(project:Project){ - - - - - } - - - createPresentation(project:Project,name='', saveToClient=false){ - return this.http.get(this.routes.presentationImages + project.id) - .subscribe(res=>{ - - let response=res.json(); - let header=response.header; - let header2=response.header2; - let domain=response.domain; - let image=response.image; - let technologies=response.technologies; - - - // let PptxGenJS=Object.getPrototypeOf(pptx).constructor; - // let presentation=new PptxGenJS(); - - this.pptx.setBrowser(true); - - this.pptx.setLayout('LAYOUT_4x3'); - - var slide = this.pptx.addNewSlide(); - - - //header - slide.addImage( - { data:'image/png;base64,'+header, x:0.0, y:0.0, w:'100%', h:'0.5' } - ) + routes: Routes; + pptx; - slide.addImage( - { data:'image/png;base64,'+header2, x:0.0, y:0.0, w:'100%', h:'0.5' } - ) + constructor(private http: HttpService, private extract: ExtractService) { + this.routes = new Routes(); - if(domain){ - slide.addImage( - { data:'image/png;base64,'+domain, x:'92%', y:'0.05', w:'0.45', h:'0.45' } - ) - } + this.createInstance(); + } - slide.addText( - project.name, - { x:this.x, y:0.0, w:'100%', h:0.5, align:'l', valign:'middle', font_size:28, font_face:'TELEGROTESK HEADLINE ULTRA', color:'7F7F7F' } - ) + magenta = 'e20074'; + x = 0.39; - slide.addText( - 'Description of Project', - { x:this.x, y:0.6, w:'50%', h:0.5, align:'l', valign:'middle', font_size:18, font_face:'TELEGROTESK HEADLINE ULTRA', color:this.magenta } - ) + capitalize(word) { + return word.charAt(0).toUpperCase() + word.slice(1); + } - slide.addText( - project.description, - { x:this.x, y:1.0, w:'50%', h:1.0, align:'l',valign:'top', font_size:14, font_face:'Tele-GroteskNor', color:'000000' } - ) - - if(image){ - slide.addImage( - { data:'image/png;base64,'+image, x:'60%', y:1.1,w:3.2,h:1.9 } - ) - } + getDate(date: Date) { + const newDate = date ? new Date(date) : null; + const parsed = newDate ? newDate.getDate() + '.' + newDate.getMonth() + '.' + newDate.getFullYear() : ''; + return parsed; + } - // y = 3.625 for 16_9 - slide.addShape(this.pptx.shapes.RECTANGLE, { x:0.0, y:5.5, w:'50%', h:2.0, fill:this.magenta }); - slide.addShape(this.pptx.shapes.RECTANGLE, { x:'50%', y:5.5, w:'50%', h:2.0, fill:'a4a4a4' }); + addSlide(project: Project) { + } - // - slide.addText( - 'Details', - { x:this.x, y:5.45, w:'50%', h:0.5, align:'l', valign:'middle', font_size:18, font_face:'TELEGROTESK HEADLINE ULTRA', color:'ffffff' } - ) + createPresentation(project: Project, name = '', saveToClient = false) { + return this.http.get(this.routes.presentationImages + project.id) + .subscribe(res => { + const response = res.json(); + const header = response.header; + const header2 = response.header2; + const domain = response.domain; + const image = response.image; + const technologies = response.technologies; - // y=3.9 - //duration - let start=5.75; - let lineheight=0.25; - slide.addText( - 'Project duration:', - { x:this.x, y:start, w:'50%', h:0.5, align:'l', valign:'middle', font_size:18, font_face:'Tele-GroteskNor', color:'ffffff' } - ) + // let PptxGenJS=Object.getPrototypeOf(pptx).constructor; + // let presentation=new PptxGenJS(); - slide.addText( - this.getDate(project.startdate) + - (project.enddate ? '-' : '') - + this.getDate(project.enddate), - { x:1.9, y:start, w:'50%', h:0.5, align:'l', valign:'middle', underline:true, font_size:18, font_face:'Tele-GroteskNor', color:'ffffff' } - ) + this.pptx.setBrowser(true); - //program - slide.addText( - 'Program:', - { x:this.x, y:start+(lineheight), w:'50%', h:0.5, align:'l', valign:'middle', font_size:18, font_face:'Tele-GroteskNor', color:'ffffff' } - ) + this.pptx.setLayout('LAYOUT_4x3'); - slide.addText( - project.program, - { x:1.3, y:start+(lineheight), w:'50%', h:0.5, align:'l', valign:'middle',underline:true, font_size:18, font_face:'Tele-GroteskNor', color:'ffffff' } - ) + const slide = this.pptx.addNewSlide(); - //domain - slide.addText( - 'Domain:', - { x:this.x, y:start+(lineheight*2), w:'50%', h:0.5, align:'l', valign:'middle', font_size:18, font_face:'Tele-GroteskNor', color:'ffffff' } - ) + // header + slide.addImage( + {data: 'image/png;base64,' + header, x: 0.0, y: 0.0, w: '100%', h: '0.5'} + ); - slide.addText( - project.domain, - { x:1.3, y:start+(lineheight*2), w:'50%', h:0.5, align:'l', valign:'middle',underline:true, font_size:18, font_face:'Tele-GroteskNor', color:'ffffff' } - ) - - //Language - let interval=0; - let language=project.technologies.filter(tech=>tech.domain==='language'); - if(language.length){ - interval+=0.25; - let text =language.map(item=>item.name).join(' '); - slide.addText( - 'Language:', - { x:this.x, y:start+(lineheight*3), w:'50%', h:0.5, align:'l', valign:'middle', font_size:18, font_face:'Tele-GroteskNor', color:'ffffff' } - ) - - slide.addText( - text, - { x:1.4, y:start+(lineheight*3), w:'50%', h:0.5, align:'l', valign:'middle',underline:true, font_size:18, font_face:'Tele-GroteskNor', color:'ffffff' } - ) - } + slide.addImage( + {data: 'image/png;base64,' + header2, x: 0.0, y: 0.0, w: '100%', h: '0.5'} + ); - //Methology - let methodology=project.technologies.filter(tech=>tech.domain==='methodology'); - if(methodology.length){ - let text =methodology.map(item=>item.name).join(' '); - slide.addText( - 'Methodology:', - { x:this.x, y:start+(lineheight*3)+interval, w:'50%', h:0.5, align:'l', valign:'middle', font_size:18, font_face:'Tele-GroteskNor', color:'ffffff' } - ) - - slide.addText( - text, - { x:1.7, y:start+(lineheight*3)+interval, w:'50%', h:0.5, align:'l', valign:'middle',underline:true, font_size:18, font_face:'Tele-GroteskNor', color:'ffffff' } - ) + if (domain) { + slide.addImage( + {data: 'image/png;base64,' + domain, x: '92%', y: '0.05', w: '0.45', h: '0.45'} + ); + } + + slide.addText( + project.name, + { + x: this.x, + y: 0.0, + w: '100%', + h: 0.5, + align: 'l', + valign: 'middle', + font_size: 28, + font_face: 'TELEGROTESK HEADLINE ULTRA', + color: '7F7F7F' + } + ); + + slide.addText( + 'Description of Project', + { + x: this.x, + y: 0.6, + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + font_size: 18, + font_face: 'TELEGROTESK HEADLINE ULTRA', + color: this.magenta } + ); + slide.addText( + project.description, + {x: this.x, y: 1.0, w: '50%', h: 1.0, align: 'l', valign: 'top', font_size: 14, font_face: 'Tele-GroteskNor', color: '000000'} + ); - let backend=technologies.filter(item=>item.domain==='backend'); - let frontend=technologies.filter(item=>item.domain==='frontend'); + if (image) { + slide.addImage( + {data: 'image/png;base64,' + image, x: '60%', y: 1.1, w: 3.2, h: 1.9} + ); + } + + // y = 3.625 for 16_9 + slide.addShape(this.pptx.shapes.RECTANGLE, {x: 0.0, y: 5.5, w: '50%', h: 2.0, fill: this.magenta}); + slide.addShape(this.pptx.shapes.RECTANGLE, {x: '50%', y: 5.5, w: '50%', h: 2.0, fill: 'a4a4a4'}); + + // + slide.addText( + 'Details', + { + x: this.x, + y: 5.45, + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + font_size: 18, + font_face: 'TELEGROTESK HEADLINE ULTRA', + color: 'ffffff' + } + ); + + // y=3.9 + // duration + const start = 5.75; + const lineheight = 0.25; + slide.addText( + 'Project duration:', + { + x: this.x, + y: start, + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + font_size: 18, + font_face: 'Tele-GroteskNor', + color: 'ffffff' + } + ); + + slide.addText( + this.getDate(project.startdate) + + (project.enddate ? '-' : '') + + this.getDate(project.enddate), + { + x: 1.9, + y: start, + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + underline: true, + font_size: 18, + font_face: 'Tele-GroteskNor', + color: 'ffffff' + } + ); + + // program + slide.addText( + 'Program:', + { + x: this.x, + y: start + (lineheight), + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + font_size: 18, + font_face: 'Tele-GroteskNor', + color: 'ffffff' + } + ); + + slide.addText( + project.program, + { + x: 1.3, + y: start + (lineheight), + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + underline: true, + font_size: 18, + font_face: 'Tele-GroteskNor', + color: 'ffffff' + } + ); + + // domain + slide.addText( + 'Domain:', + { + x: this.x, + y: start + (lineheight * 2), + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + font_size: 18, + font_face: 'Tele-GroteskNor', + color: 'ffffff' + } + ); + + slide.addText( + project.domain, + { + x: 1.3, + y: start + (lineheight * 2), + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + underline: true, + font_size: 18, + font_face: 'Tele-GroteskNor', + color: 'ffffff' + } + ); + + // Language + let interval = 0; + const language = project.technologies.filter(tech => tech.domain === 'language'); + if (language.length) { + interval += 0.25; + const text = language.map(item => item.name).join(' '); + slide.addText( + 'Language:', + { + x: this.x, + y: start + (lineheight * 3), + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + font_size: 18, + font_face: 'Tele-GroteskNor', + color: 'ffffff' + } + ); - let headerY=5.45; - let iconY=5.9; - let textY=6.1; + slide.addText( + text, + { + x: 1.4, + y: start + (lineheight * 3), + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + underline: true, + font_size: 18, + font_face: 'Tele-GroteskNor', + color: 'ffffff' + } + ); + } - if(backend.length){ - slide.addText( - 'Back-end', - { x:5.1, y:headerY, w:'50%', h:0.5, align:'l', valign:'middle', font_size:18, font_face:'TELEGROTESK HEADLINE ULTRA', color:'ffffff' } - ) + // Methology + const methodology = project.technologies.filter(tech => tech.domain === 'methodology'); + if (methodology.length) { + const text = methodology.map(item => item.name).join(' '); + slide.addText( + 'Methodology:', + { + x: this.x, + y: start + (lineheight * 3) + interval, + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + font_size: 18, + font_face: 'Tele-GroteskNor', + color: 'ffffff' + } + ); - let bside=5.2; - let bsidetext=5.1; - for(let item of backend){ - slide.addImage( - { data:'image/png;base64,'+item.image, x:bside, y:iconY, w:0.4, h:0.3 } - ) + slide.addText( + text, + { + x: 1.7, + y: start + (lineheight * 3) + interval, + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + underline: true, + font_size: 18, + font_face: 'Tele-GroteskNor', + color: 'ffffff' + } + ); + } - slide.addText( - item.name, - { x:bsidetext, y:textY, w:'50%', h:0.5, align:'l', valign:'middle', font_size:14, font_face:'Tele-GroteskNor', color:'ffffff' } - ) + const backend = technologies.filter(item => item.domain === 'backend'); + const frontend = technologies.filter(item => item.domain === 'frontend'); - bside+=0.7; - bsidetext+=0.7; - } + let headerY = 5.45; + let iconY = 5.9; + let textY = 6.1; - headerY+=0.95; - iconY+=0.95; - textY+=0.95; - } + if (backend.length) { + slide.addText( + 'Back-end', + { + x: 5.1, + y: headerY, + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + font_size: 18, + font_face: 'TELEGROTESK HEADLINE ULTRA', + color: 'ffffff' + } + ); - if(frontend.length){ - slide.addText( - 'Front-end', - { x:5.1, y:headerY, w:'50%', h:0.5, align:'l', valign:'middle', font_size:18, font_face:'TELEGROTESK HEADLINE ULTRA', color:'ffffff' } - ) - - let bside=5.2; - let bsidetext=5.1; - for(let item of frontend){ - slide.addImage( - { data:'image/png;base64,'+item.image, x:bside, y:iconY, w:0.4, h:0.3 } - ) - - slide.addText( - item.name, - { x:bsidetext, y:textY, w:'50%', h:0.5, align:'l', valign:'middle', font_size:14, font_face:'Tele-GroteskNor', color:'ffffff' } - ) - - bside+=0.7; - bsidetext+=0.7; + let bside = 5.2; + let bsidetext = 5.1; + for (const item of backend) { + slide.addImage( + {data: 'image/png;base64,' + item.image, x: bside, y: iconY, w: 0.4, h: 0.3} + ); + + slide.addText( + item.name, + { + x: bsidetext, + y: textY, + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + font_size: 14, + font_face: 'Tele-GroteskNor', + color: 'ffffff' } - } + ); + bside += 0.7; + bsidetext += 0.7; + } - if(saveToClient) { - this.pptx.save('POP Russia Portfolio '+ name); - this.pptx=new this.PptxGenJS(); - } - - - }, - error => { - console.log(error); - Observable.throw(this.extract.handlePostError(error)); - } - ) - } - - // createPresentation(project:Project){ - // return this.http.get(this.routes.presentationImages + project.image) - // .subscribe(res=>{ - - // let response=res.json(); - // let background=response.background; - // let logo=response.logo; - // let image=response.image; - - // console.log(res.json()) - - // pptx.setLayout('LAYOUT_16x09'); - - // var slide = pptx.addNewSlide(); - - - - // slide.addImage( - // { data:'image/png;base64,'+background, x:0.0, y:0.0, w:'100%', h:'100%' } - // ) - - // //first slide - // slide=this.introSlide(slide,project); - - // //second slide - // this.defineMaster(project); - // let slide2=pptx.addNewSlide('MASTER_SLIDE'); - // slide2.addImage( - // { data:'image/png;base64,'+logo, x:this.x, y:'92%',w:1.5,h:0.3 } - // ) - - // if(image){ - // slide2.addImage( - // { data:'image/png;base64,'+image, x:this.x, y:2.3,w:3.0,h:1.5 } - // ) - - // slide2.addText( - // 'Description of Project', - // { x:3.5, y:0.9, w:5.5, h:'100%', align:'l',valign:'top', font_size:20, font_face:'TELEGROTESK HEADLINE ULTRA', color:'A6A6A6' } - // ) - - // slide2.addText( - // project.description, - // { x:3.5, y:1.3, w:5.5, h:'100%', align:'l',valign:'top', font_size:14, font_face:'Tele-GroteskNor', color:'000000' } - // ) - // }else{ - // slide2.addText( - // 'Description of Project', - // { x:this.x, y:0.9, w:8.7, h:'100%', align:'l',valign:'top', font_size:20, font_face:'TELEGROTESK HEADLINE ULTRA', color:'A6A6A6' } - // ) - - // slide2.addText( - // project.description, - // { x:this.x, y:1.3, w:8.7, h:'100%', align:'l',valign:'top', font_size:14, font_face:'Tele-GroteskNor', color:'000000' } - // ) - // } - - - // //slide 3 - // let slide3=pptx.addNewSlide('MASTER_SLIDE'); - // slide3.addImage( - // { data:'image/png;base64,'+logo, x:this.x, y:'92%',w:1.5,h:0.3 } - // ); - - // let backbottom=0.9; - // let frontbottom=0.9; - // let bottom=0.9; - // let lineheight=0.25; - - // if(project.technologies.length){ - // let backend=project.technologies.filter(item=>item.domain==='backend'); - // let frontend=project.technologies.filter(item=>item.domain==='frontend'); - // let language=project.technologies.filter(tech=>tech.domain==='language'); - // let methodology=project.technologies.filter(tech=>tech.domain==='methodology'); - // let information=project.technologies.filter(tech=>tech.domain==='information'); - - - - - // if(backend.length){ - // slide3.addText( - // 'Technologies/Back-end:', - // { x:this.x, y:0.9, w:4.0, h:'100%', align:'l',valign:'top', font_size:20, font_face:'TELEGROTESK HEADLINE ULTRA', color:'A6A6A6' } - // ) - - // let y=1.3; - - // backbottom=1.3+(lineheight*backend.length); - // for(let tech of backend){ - - // slide3.addText( - // tech.name, - // { x:this.x, y:y, w:4.0, h:1.0, align:'l',valign:'top', font_size:13, font_face:'Tele-GroteskNor', color:'000000' } - // ) - - // y+=lineheight; - // } - // } - - // if(frontend.length){ - // let x=backend.length ? 5.0 : this.x; - // let y=1.3; - // let name=backend.length ? 'Front-end:' : 'Technologies/Front-end:'; - - // slide3.addText( - // name, - // { x:x, y:0.9, w:4.0, h:'100%', align:'l',valign:'top', font_size:20, font_face:'TELEGROTESK HEADLINE ULTRA', color:'A6A6A6' } - // ) - - // frontbottom=1.3+(lineheight*frontend.length); - // for(let tech of frontend){ - // slide3.addText( - // tech.name, - // { x:x, y:y, w:4.0, h:1.0, align:'l',valign:'top', font_size:13, font_face:'Tele-GroteskNor', color:'000000' } - // ) - - // y+=lineheight; - // } - - // } - - - // let bottom = backbottom>frontbottom ? backbottom : backbottom===frontbottom ? backbottom : frontbottom; - - // if(methodology.length){ - - - // bottom+=lineheight; - // slide3.addText( - // 'Methodology:', - // { x:this.x, y:bottom, w:2.2, h:'100%', align:'l',valign:'top', font_size:20, font_face:'TELEGROTESK HEADLINE ULTRA', color:this.magenta } - // ); - - // let text =methodology.map(item=>item.name).join(' '); - // slide3.addText( - // text, - // { x:2.4, y:bottom, w:4.0, h:1.0, align:'l',valign:'top', font_size:20, font_face:'Tele-GroteskNor', color:'000000' } - // ) - - // bottom=bottom+(lineheight*methodology.length); - // } - - // if(language.length){ - - // bottom+=lineheight; - // slide3.addText( - // 'Language:', - // { x:this.x, y:bottom, w:2.2, h:'100%', align:'l',valign:'top', font_size:20, font_face:'TELEGROTESK HEADLINE ULTRA', color:this.magenta } - // ); - - // let text =language.map(item=>item.name).join(' '); - // slide3.addText( - // text, - // { x:2.4, y:bottom, w:4.0, h:1.0, align:'l',valign:'top', font_size:20, font_face:'Tele-GroteskNor', color:'000000' } - // ) - - // bottom=bottom+(lineheight*methodology.length); - // } - - // console.log(backbottom,frontbottom) - - // } - - - // // if(project.customer){ - // // bottom+=lineheight; - // // slide3.addText( - // // 'End Customer:', - // // { x:this.x, y:bottom, w:2.2, h:'100%', align:'l',valign:'top', font_size:20, font_face:'TELEGROTESK HEADLINE ULTRA', color:this.magenta } - // // ); - - - // // slide3.addText( - // // project.customer, - // // { x:2.4, y:bottom, w:4.0, h:1.0, align:'l',valign:'top', font_size:20, font_face:'Tele-GroteskNor', color:'000000' } - // // ) - - // // bottom=bottom+lineheight; - // // } - - - // pptx.save('Case Studies '+project.name); - // }, - // error => console.log(error) - // ) - // } - - - introSlide(slide,project){ - slide.addShape(pptx.shapes.RECTANGLE, { x:0.37, y:3.25, w:8, h:2, fill:this.magenta }); - - slide.addText( - project.name, - { x:this.x, y:3.25, w:'100%', h:1, align:'l', font_size:40, font_face:'TELEGROTESK HEADLINE ULTRA', color:'ffffff' } - ); + headerY += 0.95; + iconY += 0.95; + textY += 0.95; + } + if (frontend.length) { slide.addText( - this.capitalize(project.line) + ' ('+project.program +') ', - { x:this.x, y:3.8, w:'100%', h:1, align:'l', font_size:30, font_face:'TELEGROTESK HEADLINE', color:'ffffff' } + 'Front-end', + { + x: 5.1, + y: headerY, + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + font_size: 18, + font_face: 'TELEGROTESK HEADLINE ULTRA', + color: 'ffffff' + } ); - let now=new Date(project.updatedAt); - - slide.addText( - now.getDate() + '.' + now.getMonth() + '.' + now.getFullYear(), - { x:this.x, y:4.8, w:'100%', h:0.5, align:'l', font_size:14, font_face:'Tele-GroteskNor', color:'ffffff' } - ); + let bside = 5.2; + let bsidetext = 5.1; + for (const item of frontend) { + slide.addImage( + {data: 'image/png;base64,' + item.image, x: bside, y: iconY, w: 0.4, h: 0.3} + ); + + slide.addText( + item.name, + { + x: bsidetext, + y: textY, + w: '50%', + h: 0.5, + align: 'l', + valign: 'middle', + font_size: 14, + font_face: 'Tele-GroteskNor', + color: 'ffffff' + } + ); - return slide; - } - - - defineMaster(project){ - let now=new Date(); - let date=now.getDate() + '.' + now.getMonth() + '.' + now.getFullYear(); - - pptx.defineSlideMaster({ - title: 'MASTER_SLIDE', - bkgd: 'FFFFFF', - objects: [ - { 'text': { text:project.name, options:{ x:this.x, y:0.1, w:'100%', h:1, align:'l', font_size:28, font_face:'TELEGROTESK HEADLINE ULTRA', color:this.magenta } } }, - { 'text': { text:'-Internal-', options:{ x:4.3, y:'87%', h:1, align:'l', font_size:9, font_face:'Tele-GroteskNor', color:'000000' } } }, - { 'text': { text:'T-Systems Russia Portfolio', options:{ x:5.7, y:'87%', h:1, align:'l', font_size:9, font_face:'Tele-GroteskNor', color:'000000' } } }, - { 'text': { text: date, options:{ x:7.8, y:'87%', h:1, align:'l', font_size:9, font_face:'Tele-GroteskNor', color:'000000' } } } - ], - slideNumber: { x:'95%', y:'93%', fontFace:'Tele-GroteskNor', fontSize:9, color:'000000' } - }); - } -} \ No newline at end of file + bside += 0.7; + bsidetext += 0.7; + } + } + + if (saveToClient) { + this.pptx.save('POP Russia Portfolio ' + name); + + } + + }, + error => { + console.log(error); + Observable.throw(this.extract.handlePostError(error)); + } + ); + } + + private createInstance() { + const PptxGenJS = Object.getPrototypeOf(pptx).constructor; + this.pptx = new PptxGenJS(); + } +} diff --git a/src/app/core/user.service.ts b/src/app/core/user.service.ts index af715c61..227b000b 100644 --- a/src/app/core/user.service.ts +++ b/src/app/core/user.service.ts @@ -1,4 +1,4 @@ -import { Injectable, Optional } from '@angular/core'; +import {Injectable, Optional} from '@angular/core'; let nextId = 1; @@ -12,7 +12,9 @@ export class UserService { private _userName = 'Sherlock Holmes'; constructor(@Optional() config: UserServiceConfig) { - if (config) { this._userName = config.userName; } + if (config) { + this._userName = config.userName; + } } get userName() { diff --git a/src/app/features/employee/employee-picker/employee-picker.component.ts b/src/app/features/employee/employee-picker/employee-picker.component.ts index da63bc38..c8821e60 100644 --- a/src/app/features/employee/employee-picker/employee-picker.component.ts +++ b/src/app/features/employee/employee-picker/employee-picker.component.ts @@ -1,80 +1,71 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Employee } from './../../../shared/models/employee'; -import { Role } from './../../../shared/models/role'; -import { Schedule } from './../../../shared/models/schedule'; - -import {EmployeeService} from './../employee.service'; - +import {Component, Input, Output, EventEmitter} from '@angular/core'; +import {Employee} from '../../../shared/models/employee'; +import {Role} from '../../../shared/models/role'; +import {Schedule} from '../../../shared/models/schedule'; +import {EmployeeService} from '../employee.service'; @Component({ selector: 'employee-picker', templateUrl: './employee-picker.component.html', - styleUrls: ['./employee-picker.component.less'], + styleUrls: ['./employee-picker.component.less'], }) export class EmployeePickerComponent { - @Input() employees:Array=new Array(); - @Input() roles:Array=new Array(); - @Input() selectedSchedules:Array=new Array(); - - @Output() onSelect=new EventEmitter>(); - - initialSchedules:Array=new Array(); - selectedEmployees:Array=new Array(); - schedules:Array=new Array(); - - constructor(private dataService:EmployeeService) { - - } - - ngOnInit(){ - if(this.employees.length<=0){ - this.dataService.getRolesAndEmploees().subscribe(data=>{ - this.employees=data[0]; - this.schedules=this.employees.map(item=>{ - let schedule =this.selectedSchedules.filter(i=>i.employee.id===item.id)[0]; - return new Schedule({ - employee:item, - role: schedule ? schedule.role : new Role(), - participation: schedule ? schedule.participation : 0.0, - active:schedule ? true : false - }) - }); - this.roles=data[1]; - this.initialSchedules=this.schedules; - - - // this.schedules.filter((item)=> - // this.selectedSchedules.map(i=>i.employee.id) - // .includes(item.employee.id)).forEach(element => { - // element.active=true; - - // }); - - - }, error=>{ - console.log(error); - }) - } + @Input() employees: Employee[] = []; + @Input() roles: Role[] = []; + @Input() selectedSchedules: Schedule[] = []; + + @Output() onSelect = new EventEmitter(); + + initialSchedules: Schedule[] = []; + schedules: Schedule[] = []; + + constructor(private dataService: EmployeeService) { + } + + ngOnInit() { + if (this.employees.length <= 0) { + this.dataService.getRolesAndEmploees().subscribe(data => { + this.employees = data[0]; + this.schedules = this.employees.map(item => { + const schedule = this.selectedSchedules.filter(i => i.employee.id === item.id)[0]; + return new Schedule({ + employee: item, + role: schedule ? schedule.role : new Role(), + participation: schedule ? schedule.participation : 0.0, + active: schedule ? true : false + }); + }); + this.roles = data[1]; + this.initialSchedules = this.schedules; + + // this.schedules.filter((item)=> + // this.selectedSchedules.map(i=>i.employee.id) + // .includes(item.employee.id)).forEach(element => { + // element.active=true; + + // }); + + }, error => { + console.log(error); + }); } + } - filterEmployees(event){ - this.schedules=this.initialSchedules; - this.schedules=this.schedules.filter(item=> - (item.employee.firstname + ' ' + item.employee.lastname).toLowerCase().indexOf(event.toLowerCase())!=-1 //|| - //tem.roles[0].name.toLowerCase().indexOf(event.toLowerCase())!=-1 - ); - } + filterEmployees(event) { + this.schedules = this.initialSchedules; + this.schedules = this.schedules.filter(item => + (item.employee.firstname + ' ' + item.employee.lastname).toLowerCase().indexOf(event.toLowerCase()) !== -1 + ); + } - selectEmployee(event){ - let selected=this.schedules.filter(item=>item.active); - this.onSelect.emit(selected); - } - - stopAction($event){ - $event.stopPropagation(); - } + selectEmployee(event) { + const selected = this.schedules.filter(item => item.active); + this.onSelect.emit(selected); + } + stopAction($event) { + $event.stopPropagation(); + } } - diff --git a/src/app/features/employee/employee-routing.module.ts b/src/app/features/employee/employee-routing.module.ts index 57c3b37d..2822b419 100644 --- a/src/app/features/employee/employee-routing.module.ts +++ b/src/app/features/employee/employee-routing.module.ts @@ -1,11 +1,9 @@ -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - +import {NgModule} from '@angular/core'; +import {RouterModule} from '@angular/router'; @NgModule({ - imports: [RouterModule.forChild([ - //{ path: 'projects', component: {} }, - ])], + imports: [RouterModule.forChild([])], exports: [RouterModule] }) -export class EmployeeRoutingModule {} \ No newline at end of file +export class EmployeeRoutingModule { +} diff --git a/src/app/features/employee/employee.module.ts b/src/app/features/employee/employee.module.ts index eac85759..d9089e1f 100644 --- a/src/app/features/employee/employee.module.ts +++ b/src/app/features/employee/employee.module.ts @@ -1,19 +1,18 @@ -import { NgModule } from '@angular/core'; -import { SharedModule } from '../../shared/shared.module'; -import { ControlsModule } from '../../controls/controls.module'; +import {NgModule} from '@angular/core'; +import {SharedModule} from '../../shared/shared.module'; +import {ControlsModule} from '../../controls/controls.module'; +import {EmployeeService} from './employee.service'; +import {EmployeeRoutingModule} from './employee-routing.module'; -import { EmployeeService } from './employee.service'; -import { EmployeeRoutingModule } from './employee-routing.module'; - -//components -import { EmployeePickerComponent } from './employee-picker/employee-picker.component'; - +// components +import {EmployeePickerComponent} from './employee-picker/employee-picker.component'; @NgModule({ - imports: [ SharedModule, EmployeeRoutingModule, ControlsModule ], + imports: [SharedModule, EmployeeRoutingModule, ControlsModule], exports: [EmployeePickerComponent], - declarations: [ EmployeePickerComponent ], - providers: [ EmployeeService ] + declarations: [EmployeePickerComponent], + providers: [EmployeeService] }) -export class EmployeeModule { } \ No newline at end of file +export class EmployeeModule { +} diff --git a/src/app/features/employee/employee.service.ts b/src/app/features/employee/employee.service.ts index 207e001d..22c42d72 100644 --- a/src/app/features/employee/employee.service.ts +++ b/src/app/features/employee/employee.service.ts @@ -1,62 +1,50 @@ -import {Output, EventEmitter, Injectable} from "@angular/core"; -import {Response, URLSearchParams} from "@angular/http"; -import { HttpService } from "../../core/http.service"; -import { ExtractService } from "../../core/extract.service"; -import {Observable} from "rxjs/Observable"; +import {Injectable} from '@angular/core'; +import {HttpService} from '../../core/http.service'; +import {ExtractService} from '../../core/extract.service'; +import {Observable} from 'rxjs/Observable'; +import {Employee} from '../../shared/models/employee'; +import {Role} from '../../shared/models/role'; +import {Routes} from '../../shared/helpers/routes'; -import { Employee } from "../../shared/models/employee"; -import { Role } from "../../shared/models/role"; - -import { PortfolioQueryEncoder } from "../../shared//helpers/queryEncoder"; -import { Routes } from './../../shared/helpers/routes'; - -import "rxjs/add/operator/map"; -import "rxjs/add/operator/catch"; -import "rxjs/add/operator/toPromise"; -import { retry } from "rxjs/operator/retry"; - +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/observable/forkJoin'; @Injectable() export class EmployeeService { - routes:Routes; - - constructor(private http: HttpService, private extract:ExtractService) { - this.routes=new Routes(); - } - - - - - //GET requests - getEmployees() : Observable { - - // ...using get request - return this.http.get(this.routes.getEmployees) - // ...and calling .json() on the response to return data - .map(this.extract.extractData) - //...errors if any - .catch((error:any) => Observable.throw(this.extract.handleError(error))); - - } - - getRoles() : Observable { - - // ...using get request - return this.http.get(this.routes.getRoles) - // ...and calling .json() on the response to return data - .map(this.extract.extractData) - //...errors if any - .catch((error:any) => Observable.throw(this.extract.handleError(error))); - - } - - getRolesAndEmploees() : Observable<[Employee[],Role[]]>{ - return Observable.forkJoin( - this.getEmployees(), - this.getRoles() - ) - } - -} \ No newline at end of file + routes: Routes; + + constructor(private http: HttpService, private extract: ExtractService) { + this.routes = new Routes(); + } + + // GET requests + getEmployees(): Observable { + // ...using get request + return this.http.get(this.routes.getEmployees) + // ...and calling .json() on the response to return data + .map(this.extract.extractData) + // ...errors if any + .catch(error => Observable.throw(this.extract.handleError(error))); + + } + + getRoles(): Observable { + // ...using get request + return this.http.get(this.routes.getRoles) + // ...and calling .json() on the response to return data + .map(this.extract.extractData) + // ...errors if any + .catch(error => Observable.throw(this.extract.handleError(error))); + } + + getRolesAndEmploees(): Observable<[Employee[], Role[]]> { + return Observable.forkJoin( + this.getEmployees(), + this.getRoles() + ); + } + +} diff --git a/src/app/features/project/new-project/new-project.component.ts b/src/app/features/project/new-project/new-project.component.ts index 8c9a204a..87e2eacd 100644 --- a/src/app/features/project/new-project/new-project.component.ts +++ b/src/app/features/project/new-project/new-project.component.ts @@ -1,189 +1,175 @@ -//angular -import { Component, Input, ViewChild, ViewContainerRef } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Router } from '@angular/router'; +// angular +import {Component, Input, ViewChild, ViewContainerRef} from '@angular/core'; +import {ActivatedRoute} from '@angular/router'; +import {Router} from '@angular/router'; -//models -import { Project } from '../../../shared/models/project'; -import { Technology } from '../../../shared/models/technology'; -import { Employee } from '../../../shared/models/employee'; +// models +import {Project} from '../../../shared/models/project'; -//Services -import { ProjectService } from '../project.service'; -import { DynamicService } from '../../../core/dynamic.service'; +// Services +import {ProjectService} from '../project.service'; +import {DynamicService} from '../../../core/dynamic.service'; -//primeng and third libraries +// primeng and third libraries import {Message} from 'primeng/components/common/api'; -import * as _ from 'lodash'; -import { Comparer } from '../../../shared/helpers/comparer'; - - +import {Comparer} from '../../../shared/helpers/comparer'; @Component({ selector: 'new-project', templateUrl: './new-project.component.html', - styleUrls: [ - './new-project.component.less'], + styleUrls: ['./new-project.component.less'], animations: [] }) -export class NewProjectComponent { - - @Input() - model:Project=new Project(); - modelCopy:Project=new Project(); - - @ViewChild('entry', { read: ViewContainerRef} ) entry:ViewContainerRef; - - msgs: Message[] = []; - styleClass:string=""; - editMode:boolean=false; - - lines:Array; - domains:Array; - types:Array; - programs:Array; - - disabled:boolean=true; - errors:Object={}; - initialState:Project=new Project(); - - constructor(private dataService:ProjectService, - private route: ActivatedRoute, - private router:Router, - private dynamic:DynamicService ) {} - - ngOnInit(){ - - this.dataService.getConstants().subscribe(res=>{ - this.lines=res.lines; - this.domains=res.domains; - this.types=res.types; - this.programs=res.programs; - },error=>{ - console.log(error); +export class NewProjectComponent { + + @Input() + model: Project = new Project(); + modelCopy: Project = new Project(); + + @ViewChild('entry', {read: ViewContainerRef}) entry: ViewContainerRef; + + msgs: Message[] = []; + styleClass = ''; + editMode = false; + + lines: string[]; + domains: string[]; + types: string[]; + programs: string[]; + + disabled = true; + errors: Object = {}; + + constructor(private dataService: ProjectService, + private route: ActivatedRoute, + private router: Router, + private dynamic: DynamicService) { + } + + ngOnInit() { + + this.dataService.getConstants().subscribe(res => { + this.lines = res.lines; + this.domains = res.domains; + this.types = res.types; + this.programs = res.programs; + }, error => { + console.log(error); + }); + + this.route.params.subscribe(params => { + if (params['id']) { + this.dataService.getProject(params['id']).subscribe(data => { + this.model = new Project(data); + // detect changes for submit button disabled + + // if no date must be undefined or date picker breaks + this.model.startdate = this.model.startdate ? new Date(this.model.startdate) : undefined; + this.model.enddate = this.model.enddate ? new Date(this.model.enddate) : undefined; + + this.modelCopy = new Project(this.model); + + const urlSegment = this.route.snapshot.url[1].path; + this.editMode = urlSegment === 'update' ? true : false; + + }, error => { + this.dynamic.setRootViewContainerRef(this.entry); + const modal = this.dynamic.addErrorComponent(); + modal.error = error; + modal.action = true; + modal.actionPerfomed.subscribe(action => { + this.router.navigate(['/projects/']); + }); }); - - this.route.params.subscribe(params=>{ - if(params['id']){ - this.dataService.getProject(params['id']).subscribe(data=>{ - this.model=new Project(data); - //detect changes for submit button disabled - - //if no date must be undefined or date picker breaks - this.model.startdate=this.model.startdate ? new Date(this.model.startdate) : undefined; - this.model.enddate= this.model.enddate ? new Date(this.model.enddate) : undefined; - - this.modelCopy=new Project(this.model); - - let urlSegment=this.route.snapshot.url[1].path; - this.editMode= urlSegment==='update' ? true : false; - - },error=>{ - this.dynamic.setRootViewContainerRef(this.entry); - let modal=this.dynamic.addErrorComponent(); - modal.error=error; - modal.action=true; - modal.actionPerfomed.subscribe(action=>{ - this.router.navigate(["/projects/"]); - }); - }) - } else{ - this.editMode=false; - } - - },error=>{ - console.log('fuck',error) - }) - - } - - - - - - - - changeProject(){ - this.model.errors={}; - let unvalidFields=this.unvalidFields(); - - if(unvalidFields.length>0){ - this.model.generateErrors(unvalidFields); - - //error style for prime ng calender - this.styleClass=unvalidFields.filter(field=>field==="startdate").length>0 - ? "ui-inputtext--error" - : ""; - - this.msgs.push({severity:'error', summary:'Error Message', detail:'Please fill required fields'}) - }else{ - this.model.pss=parseFloat(this.model.pss.toString().replace(',','.')) || 0; - - if(this.editMode){ - this.model.version=this.model.version+1; - this.dataService.updateProject(this.model).subscribe( - data=>{ - this.router.navigate(["/project/",data.id]); - console.log(data) - }, - error=>{ - this.dynamic.setRootViewContainerRef(this.entry); - let modal=this.dynamic.addErrorComponent(); - modal.error=error; - console.log(error); - modal.action=true; - modal.actionPerfomed.subscribe(action=>{ - this.router.navigate(["/projects/"]); - }) - } - ); - } else{ - this.model.version=1; - this.dataService.createProject(this.model).subscribe( - data=>{this.router.navigate(["/projects/"])}, - error=>{ - this.dynamic.setRootViewContainerRef(this.entry); - let modal=this.dynamic.addErrorComponent(); - modal.error=error; - } - ); - } - } - } - - showPreview(){ - this.dynamic.setRootViewContainerRef(this.entry); - let modal=this.dynamic.addProjectConfirmationComponent(); - modal.project=new Project(this.model); - } - - - setValue(value,prop){ - this.model[prop]=value; - this.disableSubmit(); - console.log(this.model); + } else { + this.editMode = false; } - unvalidFields(){ - return this.model.required.map(key=>{ - return !this.model[key] ? key : ''; - }).filter(item=>item!=''); - } - - - changeLine(event){ - this.model.line=event; - } - - back(){ - window.history.back(); - } - - disableSubmit(){ - let comparer=new Comparer(); - let diff= comparer.deepCompare(this.model,this.modelCopy); - this.disabled= Object.keys(diff).length===0; + }, error => { + console.log('fuck', error); + }); + + } + + changeProject() { + this.model.errors = {}; + const unvalidFields = this.unvalidFields(); + + if (unvalidFields.length > 0) { + this.model.generateErrors(unvalidFields); + + // error style for prime ng calender + this.styleClass = unvalidFields.filter(field => field === 'startdate').length > 0 + ? 'ui-inputtext--error' + : ''; + + this.msgs.push({severity: 'error', summary: 'Error Message', detail: 'Please fill required fields'}); + } else { + this.model.pss = parseFloat(this.model.pss.toString().replace(',', '.')) || 0; + + if (this.editMode) { + this.model.version = this.model.version + 1; + this.dataService.updateProject(this.model).subscribe( + data => { + this.router.navigate(['/project/', data.id]); + console.log(data); + }, + error => { + this.dynamic.setRootViewContainerRef(this.entry); + const modal = this.dynamic.addErrorComponent(); + modal.error = error; + console.log(error); + modal.action = true; + modal.actionPerfomed.subscribe(action => { + this.router.navigate(['/projects/']); + }); + } + ); + } else { + this.model.version = 1; + this.dataService.createProject(this.model).subscribe( + data => { + this.router.navigate(['/projects/']); + }, + error => { + this.dynamic.setRootViewContainerRef(this.entry); + const modal = this.dynamic.addErrorComponent(); + modal.error = error; + } + ); } - - -} \ No newline at end of file + } + } + + showPreview() { + this.dynamic.setRootViewContainerRef(this.entry); + const modal = this.dynamic.addProjectConfirmationComponent(); + modal.project = new Project(this.model); + } + + setValue(value, prop) { + this.model[prop] = value; + this.disableSubmit(); + console.log(this.model); + } + + unvalidFields() { + return this.model.required.map(key => + !this.model[key] ? key : '').filter(item => item != ''); + } + + changeLine(event) { + this.model.line = event; + } + + back() { + window.history.back(); + } + + disableSubmit() { + const comparer = new Comparer(); + const diff = comparer.deepCompare(this.model, this.modelCopy); + this.disabled = Object.keys(diff).length === 0; + } + +} diff --git a/src/app/features/project/project-history/project-history.component.ts b/src/app/features/project/project-history/project-history.component.ts index 64456e52..8c2f72de 100644 --- a/src/app/features/project/project-history/project-history.component.ts +++ b/src/app/features/project/project-history/project-history.component.ts @@ -1,84 +1,73 @@ -import { Component, Input, Output,EventEmitter, - ViewChildren,QueryList,ViewChild, - ViewContainerRef } from '@angular/core'; +import {Component, Input, ViewChildren, QueryList, ViewChild, ViewContainerRef} from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; - -import { Project } from '../../../shared/models/project'; -import { PROJECT_ANIMATION } from '../project/project.animation'; -import { ProjectService } from '../project.service'; -import { DynamicService } from '../../../core/dynamic.service'; - -import { ProjectModalComponent } from '../project-modal/project-modal.component'; +import {ActivatedRoute} from '@angular/router'; +import {Project} from '../../../shared/models/project'; +import {PROJECT_ANIMATION} from '../project/project.animation'; +import {ProjectService} from '../project.service'; +import {DynamicService} from '../../../core/dynamic.service'; +import {ProjectModalComponent} from '../project-modal/project-modal.component'; @Component({ selector: 'project-history', templateUrl: './project-history.component.html', - styleUrls: [ - './project-history.component.less', - '../project/project.component.less'], - animations:PROJECT_ANIMATION + styleUrls: [ + './project-history.component.less', + '../project/project.component.less'], + animations: PROJECT_ANIMATION }) export class ProjectHistoryComponent { - @Input() model:Project=new Project(); - @Input() projects:Array=new Array(); - @Input() itemStyle:string=''; + @Input() model: Project = new Project(); + @Input() projects: Project[] = []; + @Input() itemStyle = ''; + + versions: number[] = []; + + @ViewChildren(ProjectModalComponent) modals: QueryList; + @ViewChild('entry', {read: ViewContainerRef}) entry: ViewContainerRef; + + constructor(private dataService: ProjectService, + private dynamic: DynamicService, + private route: ActivatedRoute) { + } - versions:Array=new Array(); - counter:number=0; + ngOnInit() { + this.route.params.subscribe(params => { + if (params['name']) { + this.model.name = params['name']; + this.dataService.getProjectsByName(params['name']).subscribe(data => { + this.projects = data; + this.versions = this.projects.map(p => p.version); + this.model.line = this.projects.length > 0 ? this.projects[0].line : 'grey'; + console.log(this.projects); + }, error => { + this.model.line = 'grey'; + this.dynamic.setRootViewContainerRef(this.entry); + const modal = this.dynamic.addErrorComponent(); + modal.error = error; + }); + } else { - @ViewChildren(ProjectModalComponent) modals: QueryList; - @ViewChild('entry', { read: ViewContainerRef} ) entry:ViewContainerRef; - - constructor(private dataService:ProjectService, - private dynamic:DynamicService, - private route: ActivatedRoute) { - } + } - ngOnInit(){ - this.route.params.subscribe(params=>{ - if(params['name']){ - this.model.name=params['name']; - this.dataService.getProjectsByName(params['name']).subscribe(data=>{ - this.projects=data; - this.versions=this.projects.map(p=>p.version); - this.model.line=this.projects.length>0 ? this.projects[0].line : 'grey'; - console.log(this.projects); - },error=>{ - this.model.line='grey'; - this.dynamic.setRootViewContainerRef(this.entry); - let modal=this.dynamic.addErrorComponent(); - modal.error=error; - }) - } else{ - - } - - },error=>{ - console.log('fuck',error) - }) + }, error => { + console.log('fuck', error); + }); - } - - onChange(event,project,project2){ - let modal=this.modals.filter(i=>{ - return i.id==project.id; - })[0]; - let modal2=this.modals.filter(i=>{ - return i.id==project2.id; - })[0]; - console.log(modal.project.id,modal.id,modal2.project.id,modal2.id) - let aimproject=this.projects.filter(pr=>pr.version==event)[0]; - //let aimproject2=this.projects.filter(pr=>pr.version==event)[0]; - modal.project=aimproject; - modal.compareProjects(modal.project,modal2.project); - modal2.compareProjects(modal2.project,modal.project); - - } + } - + onChange(event, project, project2) { + const modal = this.modals.filter(i => + i.id == project.id)[0]; + const modal2 = this.modals.filter(i => + i.id == project2.id)[0]; + console.log(modal.project.id, modal.id, modal2.project.id, modal2.id); + const aimproject = this.projects.filter(pr => pr.version == event)[0]; + modal.project = aimproject; + modal.compareProjects(modal.project, modal2.project); + modal2.compareProjects(modal2.project, modal.project); + } -} \ No newline at end of file +} diff --git a/src/app/features/project/project-item/project-item.component.ts b/src/app/features/project/project-item/project-item.component.ts index 948cf880..1536b676 100644 --- a/src/app/features/project/project-item/project-item.component.ts +++ b/src/app/features/project/project-item/project-item.component.ts @@ -1,36 +1,30 @@ -import { Component, Input } from '@angular/core'; -import { Project } from '../../../shared/models/project'; - +import {Component, Input} from '@angular/core'; +import {Project} from '../../../shared/models/project'; @Component({ selector: 'project-item', templateUrl: './project-item.component.html', - styleUrls: [ - './project-item.component.less'] + styleUrls: ['./project-item.component.less'] }) export class ProjectItemComponent { - @Input() model:Project=new Project(); - description:string=''; - - ribbonVisible=false; - constructor() { - - } - - ngAfterViewInit(){ - setTimeout(()=> { - this.description=this.trimText(this.model.description,101); - if(this.model.enddate){ - this.ribbonVisible=new Date(this.model.enddate)<=new Date(); - } - }, 0); - // - } + @Input() model: Project = new Project(); + description = ''; + + ribbonVisible = false; + + ngAfterViewInit() { + setTimeout(() => { + this.description = this.trimText(this.model.description, 101); + if (this.model.enddate) { + this.ribbonVisible = new Date(this.model.enddate) <= new Date(); + } + }, 0); + // + } - trimText(string, limit) - { - return string.length > limit ? string.substring(0,limit) + "..." : string; - } + trimText(string, limit) { + return string.length > limit ? string.substring(0, limit) + '...' : string; + } -} \ No newline at end of file +} diff --git a/src/app/features/project/project-list/project-list.animation.ts b/src/app/features/project/project-list/project-list.animation.ts index 0ee0e9de..b169be3a 100644 --- a/src/app/features/project/project-list/project-list.animation.ts +++ b/src/app/features/project/project-list/project-list.animation.ts @@ -1,24 +1,22 @@ import { - trigger, - state, - style, - animate, - transition, - keyframes - } from '@angular/animations'; - + trigger, + state, + style, + animate, + transition, +} from '@angular/animations'; export const LIST_ANIMATION = [trigger('appear', [ - state('in', style({opacity: 1 })), - transition('void => *', [ - style({ - opacity: 0 - }), - animate('0.4s 400ms ease-out') - ]) - ]), + state('in', style({opacity: 1})), + transition('void => *', [ + style({ + opacity: 0 + }), + animate('0.4s 400ms ease-out') + ]) +]), trigger('appear2', [ - state('in', style({opacity: 1 })), + state('in', style({opacity: 1})), transition('void => *', [ style({ opacity: 0 @@ -27,7 +25,7 @@ export const LIST_ANIMATION = [trigger('appear', [ ]) ]), trigger('appear3', [ - state('in', style({opacity: 1 })), + state('in', style({opacity: 1})), transition('void => *', [ style({ opacity: 0 @@ -35,13 +33,11 @@ export const LIST_ANIMATION = [trigger('appear', [ animate('0.4s 1500ms ease-out') ]) ]), - trigger('fadeIn', [ - transition(':enter', [ - style({ opacity: '0' }), - animate('.5s ease-out', style({ opacity: '1' })), - ]), - ]) - - + trigger('fadeIn', [ + transition(':enter', [ + style({opacity: '0'}), + animate('.5s ease-out', style({opacity: '1'})), + ]), + ]) -] \ No newline at end of file +]; diff --git a/src/app/features/project/project-list/project-list.component.ts b/src/app/features/project/project-list/project-list.component.ts index 53442dbc..9e04fd2e 100644 --- a/src/app/features/project/project-list/project-list.component.ts +++ b/src/app/features/project/project-list/project-list.component.ts @@ -1,179 +1,170 @@ -import { Component, Input, ViewChild,OnInit } from '@angular/core'; -import { TechnologyPickerComponent } from '../../technology/technology-picker/technology-picker.component'; -import { Project } from '../../../shared/models/project'; -import { Employee } from '../../../shared/models/employee'; -import { Technology } from '../../../shared/models/technology'; -import { Constants } from '../../../shared/models/constants'; - -import { ProjectService } from '../project.service'; -import { PowerPointService } from '../../../core/powerpoint.service'; -import { LIST_ANIMATION } from './project-list.animation'; -import { ActivatedRoute,Router } from '@angular/router'; -import { Comparer } from '../../../shared/helpers/comparer'; +import {Component, Input, ViewChild, OnInit} from '@angular/core'; +import {TechnologyPickerComponent} from '../../technology/technology-picker/technology-picker.component'; +import {Project} from '../../../shared/models/project'; +import {Technology} from '../../../shared/models/technology'; +import {Constants} from '../../../shared/models/constants'; + +import {ProjectService} from '../project.service'; +import {PowerPointService} from '../../../core/powerpoint.service'; +import {LIST_ANIMATION} from './project-list.animation'; +import {ActivatedRoute, Router} from '@angular/router'; +import {Comparer} from '../../../shared/helpers/comparer'; import * as _ from 'lodash'; - @Component({ selector: 'project-list', templateUrl: './project-list.component.html', - styleUrls: [ - './project-list.component.less'], - animations:LIST_ANIMATION + styleUrls: ['./project-list.component.less'], + animations: LIST_ANIMATION }) export class ProjectListComponent implements OnInit { - @Input() projects:Array=new Array(); - @Input() sortOrder:boolean=true; - @ViewChild(TechnologyPickerComponent) technologyPicker:TechnologyPickerComponent; - - filteredProjects:Array=new Array(); - - tooltipVisible:boolean=true; - complete:Array=new Array(); - - //initial project list - initialProjects:Array=new Array(); - sortProperty:string=''; - selectedTechnology:string=''; - - //constants - constants=new Constants(); - //filter checkboxes - line=new Array(); - type=new Array(); - program=new Array(); - domain=new Array(); - customer=new Array(); - technologies=new Array(); - - filter:any=new Object(); - - constructor(private dataService:ProjectService, - public router: Router, - private route:ActivatedRoute, - private powerpoint:PowerPointService) { - - } - - ngOnInit(){ - this.dataService.getConstants().subscribe(res=>{ - this.constants.lines=res.lines; - this.constants.domains=res.domains; - this.constants.types=res.types; - this.constants.programs=res.programs; - },error=>{ - console.log(error); - }); - - - - this.dataService.getProjects().subscribe(data=>{ - this.projects=data; - this.projects.forEach(item=>item.teamcount=item.schedules.length); - - //cutomer list for filters - this.constants.customers=new Set( - this.projects.map(item=>item.customer).filter(p=>p!=="" && p).sort() - ); - - - - console.log(this.projects); - - this.initialProjects=this.projects; - this.complete= this.refreshCompleteList(this.projects); - //check if filter needs to apply - let params=this.route.snapshot.queryParams; - if(!_.isEmpty(params)){ - for(let key of Object.keys(params)){ - let parameter=params[key]; - if(key==='technologies') this.selectedTechnology=parameter; - this[key]=[...this[key],parameter] - this.check(parameter,key); - } - } - - },err=>{ - console.log(err); - }) - } - - - isAssending:boolean=false; - sortProjects(event){ - this.isAssending=!this.isAssending; - this.projects.sort(Comparer.propCompare(event,this.isAssending)); - this.sortProperty=event; - } - - filterProjects(event){ - this.clearFilters(); - this.projects=this.initialProjects; - this.projects=this.projects.filter(item=>item.name.toLowerCase().indexOf(event.toLowerCase())!=-1); - this.complete=this.projects.map(item=>item.name); - } - - newProject(){ - this.router.navigate(["/project/new"]); - } - - check($event,name){ - if(this[name]){ - if(name==='technologies') this[name]=$event; - this.filter[name]=this[name]; - this.complexFilter(); - } - } - - complexFilter(){ - this.projects=this.initialProjects; - for(let key of Object.keys(this.filter)){ - this.projects=this.projects.filter(item=>{ - if(this.filter[key].length){ - - if(Array.isArray(item[key])){ - let ids=Array.isArray(this.filter[key]) ? this.filter[key].map(item=>item.id) : []; - return item[key].map(item=>item.id).filter(elem=>{ - return ids.indexOf(elem)>-1 - }).length==ids.length; - } else{ - return this.filter[key].indexOf(item[key])>-1; - } - } else{ - return item; - } - }) + @Input() projects: Project[] = []; + @Input() sortOrder = true; + @ViewChild(TechnologyPickerComponent) technologyPicker: TechnologyPickerComponent; + + complete: string[] = []; + + // initial project list + initialProjects: Project[] = []; + sortProperty = ''; + selectedTechnology = ''; + isAssending = false; + + // constants + constants = new Constants(); + // filter checkboxes + line: string[] = []; + type: string[] = []; + program: string[] = []; + domain: string[] = []; + customer: string[] = []; + technologies: Technology[] = []; + + filter = {}; + + constructor(private dataService: ProjectService, + public router: Router, + private route: ActivatedRoute, + private powerpoint: PowerPointService) { + + } + + ngOnInit() { + this.dataService.getConstants().subscribe(res => { + this.constants.lines = res.lines; + this.constants.domains = res.domains; + this.constants.types = res.types; + this.constants.programs = res.programs; + }, error => { + console.log(error); + }); + + this.dataService.getProjects().subscribe(data => { + this.projects = data; + this.projects.forEach(item => item.teamcount = item.schedules.length); + + // cutomer list for filters + this.constants.customers = new Set( + this.projects.map(item => item.customer).filter(p => p !== '' && p).sort() + ); + + console.log(this.projects); + + this.initialProjects = this.projects; + this.complete = this.refreshCompleteList(this.projects); + // check if filter needs to apply + const params = this.route.snapshot.queryParams; + if (!_.isEmpty(params)) { + for (const key of Object.keys(params)) { + const parameter = params[key]; + if (key === 'technologies') { + this.selectedTechnology = parameter; } - this.complete= this.refreshCompleteList(this.projects); - } - - clearFilters(){ - this.line=[] - this.type=[] - this.program=[]; - this.domain=[]; - this.technologies=[]; - this.customer=[]; - this.filter=new Object(); - this.projects=this.initialProjects; - this.technologyPicker.clearSelect(); - this.complete=this.refreshCompleteList(this.projects); + this[key] = [...this[key], parameter]; + this.check(parameter, key); + } } - refreshCompleteList(projects) :Array { - return Array.from(new Set(projects.map(item=>item.name))); + }, err => { + console.log(err); + }); + } + + sortProjects(event) { + this.isAssending = !this.isAssending; + this.projects.sort(Comparer.propCompare(event, this.isAssending)); + this.sortProperty = event; + } + + filterProjects(event) { + this.clearFilters(); + this.projects = this.initialProjects; + this.projects = this.projects.filter(item => item.name.toLowerCase().indexOf(event.toLowerCase()) != -1); + this.complete = this.projects.map(item => item.name); + } + + newProject() { + this.router.navigate(['/project/new']); + } + + check($event, name) { + if (this[name]) { + if (name === 'technologies') { + this[name] = $event; } - - - createPresentation(){ - - let presentationname=''; - - for(let i=0;i { + if (this.filter[key].length) { + + if (Array.isArray(item[key])) { + const ids = Array.isArray(this.filter[key]) ? this.filter[key].map(item => item.id) : []; + return item[key].map(item => item.id).filter(elem => + ids.indexOf(elem) > -1).length == ids.length; + } else { + return this.filter[key].indexOf(item[key]) > -1; + } + } else { + return item; + } + }); + } + this.complete = this.refreshCompleteList(this.projects); + } + + clearFilters() { + this.line = []; + this.type = []; + this.program = []; + this.domain = []; + this.technologies = []; + this.customer = []; + this.filter = new Object(); + this.projects = this.initialProjects; + this.technologyPicker.clearSelect(); + this.complete = this.refreshCompleteList(this.projects); + } + + refreshCompleteList(projects): any[] { + return Array.from(new Set(projects.map(item => item.name))); + } + + createPresentation() { + + const presentationname = ''; + + for (let i = 0; i < this.projects.length; i++) { + const saveToClient = i === this.projects.length - 1 ? true : false; + this.powerpoint.createPresentation(this.projects[i], presentationname, saveToClient); + } + } +} diff --git a/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.ts b/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.ts index 95d4e632..825a9f0f 100644 --- a/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.ts +++ b/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.ts @@ -1,27 +1,18 @@ -import { Component, Input } from '@angular/core'; -import { ModalComponent } from '../../../../shared/modal/modal.component'; -import { Project } from '../../../../shared/models/project'; -import { Schedule } from '../../../../shared/models/schedule'; -import { Employee } from '../../../../shared/models/employee'; +import {Component, Input} from '@angular/core'; +import {ModalComponent} from '../../../../shared/modal/modal.component'; +import {Project} from '../../../../shared/models/project'; @Component({ selector: 'project-confirmation', templateUrl: './project-confirmation.component.html', - styleUrls: ['./project-confirmation.component.less'] + styleUrls: ['./project-confirmation.component.less'] }) export class ProjectConfirmationComponent extends ModalComponent { - @Input() project:Project=new Project(); + @Input() project: Project = new Project(); + constructor() { + super(); + } - - constructor() { - super(); - } - - ngOnInit(){ - - } - - -} \ No newline at end of file +} diff --git a/src/app/features/project/project-modal/project-modal.component.ts b/src/app/features/project/project-modal/project-modal.component.ts index 65b0cd21..79a618ee 100644 --- a/src/app/features/project/project-modal/project-modal.component.ts +++ b/src/app/features/project/project-modal/project-modal.component.ts @@ -1,53 +1,46 @@ -import { Component, Input } from '@angular/core'; -import { Project } from '../../../shared/models/project'; -import { Comparer } from '../../../shared/helpers/comparer'; -import * as _ from "lodash"; -import { Validators } from '@angular/forms/src/validators'; - +import {Component, Input} from '@angular/core'; +import {Project} from '../../../shared/models/project'; +import {Comparer} from '../../../shared/helpers/comparer'; @Component({ selector: 'project-modal', templateUrl: './project-modal.component.html', - styleUrls: [ - './project-modal.component.less'] + styleUrls: [ + './project-modal.component.less'] }) export class ProjectModalComponent { - @Input() project:Project=new Project(); - @Input() compareProject:Project; + @Input() project: Project = new Project(); + @Input() compareProject: Project; - comparer:Comparer; + comparer: Comparer; - validator={}; - id:string; - - constructor() { - this.comparer=new Comparer(); - } + validator = {}; + id: string; - ngOnInit(){ - if(this.compareProject){ - this.compareProjects(this.project,this.compareProject); - } - - this.id=this.project.id; - } + constructor() { + this.comparer = new Comparer(); + } - ngAfterViewInit(){ - + ngOnInit() { + if (this.compareProject) { + this.compareProjects(this.project, this.compareProject); } - compareProjects(project1,project2){ - let difference=this.comparer.deepCompare(project1,project2); - - for(let key in difference){ - - if(Array.isArray(difference[key])){ - difference[key].forEach(id => this.validator[key+id]='item--edited'); - } else{ - this.validator[key]='project-modal--edited'; - } - } + this.id = this.project.id; + } + + compareProjects(project1, project2) { + const difference = this.comparer.deepCompare(project1, project2); + + for (const key in difference) { + + if (Array.isArray(difference[key])) { + difference[key].forEach(id => this.validator[key + id] = 'item--edited'); + } else { + this.validator[key] = 'project-modal--edited'; + } } - -} \ No newline at end of file + } + +} diff --git a/src/app/features/project/project-routing.module.ts b/src/app/features/project/project-routing.module.ts index 50a4a500..c2e4700d 100644 --- a/src/app/features/project/project-routing.module.ts +++ b/src/app/features/project/project-routing.module.ts @@ -1,20 +1,21 @@ -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; +import {NgModule} from '@angular/core'; +import {RouterModule} from '@angular/router'; -import { ProjectListComponent } from './project-list/project-list.component'; -import { ProjectComponent } from './project/project.component'; -import { NewProjectComponent } from './new-project/new-project.component'; -import { ProjectHistoryComponent } from './project-history/project-history.component'; +import {ProjectListComponent} from './project-list/project-list.component'; +import {ProjectComponent} from './project/project.component'; +import {NewProjectComponent} from './new-project/new-project.component'; +import {ProjectHistoryComponent} from './project-history/project-history.component'; @NgModule({ imports: [RouterModule.forChild([ - { path: 'projects', component: ProjectListComponent }, - { path: 'project/new', component: NewProjectComponent }, - { path: 'project/history/:name', component: ProjectHistoryComponent }, - { path: 'project/update/:id', component: NewProjectComponent }, - { path: 'project/copy/:id', component: NewProjectComponent }, - { path: 'project/:id', component: ProjectComponent } + {path: 'projects', component: ProjectListComponent}, + {path: 'project/new', component: NewProjectComponent}, + {path: 'project/history/:name', component: ProjectHistoryComponent}, + {path: 'project/update/:id', component: NewProjectComponent}, + {path: 'project/copy/:id', component: NewProjectComponent}, + {path: 'project/:id', component: ProjectComponent} ])], exports: [RouterModule] }) -export class ProjectRoutingModule {} \ No newline at end of file +export class ProjectRoutingModule { +} diff --git a/src/app/features/project/project.module.ts b/src/app/features/project/project.module.ts index adb3f52f..48cd1b14 100644 --- a/src/app/features/project/project.module.ts +++ b/src/app/features/project/project.module.ts @@ -1,34 +1,32 @@ -import { NgModule } from '@angular/core'; -import { SharedModule } from '../../shared/shared.module'; -import { ControlsModule } from '../../controls/controls.module'; -import {EmployeeModule } from './../employee/employee.module'; -import { TechnologyModule } from './../technology/technology.module'; - -import { ProjectItemComponent } from './project-item/project-item.component'; -import { ProjectListComponent } from './project-list/project-list.component'; -import { ProjectComponent } from './project/project.component'; -import { ProjectConfirmationComponent } from './project-modal/project-confirmation/project-confirmation.component'; -import { ProjectHistoryComponent } from './project-history/project-history.component'; -import { ProjectModalComponent } from './project-modal/project-modal.component'; -import { ProjectService } from './project.service'; -import { ProjectRoutingModule } from './project-routing.module'; -import { NewProjectComponent } from './new-project/new-project.component'; - - +import {NgModule} from '@angular/core'; +import {SharedModule} from '../../shared/shared.module'; +import {ControlsModule} from '../../controls/controls.module'; +import {EmployeeModule} from '../employee/employee.module'; +import {TechnologyModule} from '../technology/technology.module'; +import {ProjectItemComponent} from './project-item/project-item.component'; +import {ProjectListComponent} from './project-list/project-list.component'; +import {ProjectComponent} from './project/project.component'; +import {ProjectConfirmationComponent} from './project-modal/project-confirmation/project-confirmation.component'; +import {ProjectHistoryComponent} from './project-history/project-history.component'; +import {ProjectModalComponent} from './project-modal/project-modal.component'; +import {ProjectService} from './project.service'; +import {ProjectRoutingModule} from './project-routing.module'; +import {NewProjectComponent} from './new-project/new-project.component'; @NgModule({ - imports: [ SharedModule, ProjectRoutingModule, ControlsModule,EmployeeModule,TechnologyModule ], - declarations: [ - ProjectItemComponent, - ProjectListComponent, + imports: [SharedModule, ProjectRoutingModule, ControlsModule, EmployeeModule, TechnologyModule], + declarations: [ + ProjectItemComponent, + ProjectListComponent, ProjectComponent, ProjectConfirmationComponent, - NewProjectComponent, + NewProjectComponent, ProjectHistoryComponent, - ProjectModalComponent + ProjectModalComponent ], - providers: [ ProjectService ], - entryComponents:[ProjectConfirmationComponent] + providers: [ProjectService], + entryComponents: [ProjectConfirmationComponent] }) -export class ProjectModule { } \ No newline at end of file +export class ProjectModule { +} diff --git a/src/app/features/project/project.service.ts b/src/app/features/project/project.service.ts index 3d80e97c..752393c3 100644 --- a/src/app/features/project/project.service.ts +++ b/src/app/features/project/project.service.ts @@ -1,108 +1,88 @@ -import {Output, EventEmitter, Injectable} from "@angular/core"; -import {Response, URLSearchParams} from "@angular/http"; -import { HttpService } from "../../core/http.service"; -import { ExtractService } from "../../core/extract.service"; -import {Observable} from "rxjs/Observable"; - -import { Project } from "../../shared/models/project"; -import { Technology } from "../../shared/models/technology"; -import { Employee } from "../../shared/models/employee"; -import { Role } from "../../shared/models/role"; - -import { Routes } from './../../shared/helpers/routes'; - -import "rxjs/add/operator/map"; -import "rxjs/add/operator/catch"; - +import {Injectable} from '@angular/core'; +import {HttpService} from '../../core/http.service'; +import {ExtractService} from '../../core/extract.service'; +import {Observable} from 'rxjs/Observable'; +import {Routes} from '../../shared/helpers/routes'; +import {Project} from '../../shared/models/project'; +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/catch'; @Injectable() export class ProjectService { - routes:Routes; - - - - constructor(private http: HttpService, private extract:ExtractService) { - this.routes=new Routes(); - } - - - //GET requests - getProjects() : Observable { - - // ...using get request - return this.http.get(this.routes.getProjects) - // ...and calling .json() on the response to return data - .map(this.extract.extractData) - //...errors if any - .catch((error:any) => Observable.throw(this.extract.handleError(error))); - - } - - getProjectsByName(name) : Observable { - - // ...using get request - return this.http.get(this.routes.history + name) - // ...and calling .json() on the response to return data - .map(this.extract.extractData) - //...errors if any - .catch((error:any) => Observable.throw(this.extract.handleError(error))); - - } - - getProject(id) : Observable { - - // ...using get request - return this.http.get(this.routes.getProjects + id) - // ...and calling .json() on the response to return data - .map(this.extract.extractData) - //...errors if any - .catch((error:any) => Observable.throw(this.extract.handleError(error))); - - } - - //POST requests - createProject(project:Project) { - let data = this.http.createParams(project); - return this.http.post(this.routes.createProject,data) - .map(this.extract.extractData) - .catch((error:any) => Observable.throw(this.extract.handlePostError(error))); - } - - updateProject(project:Project) { - - let data = this.http.createParams(project); - return this.http.post(this.routes.updateProject,data) - .map(this.extract.extractData) - .catch((error:any) => Observable.throw(this.extract.handlePostError(error))); - - } - - archieveProject(project:Project) { - - let data = this.http.createParams(project); - return this.http.put(this.routes.archieve,data) - .map(this.extract.extractData) - .catch((error:any) => Observable.throw(this.extract.handlePostError(error))); - - } - - deleteProject(project:Project) { - return this.http.delete(this.routes.deleteProject + project.name) - .map(this.extract.extractData) - .catch((error:any) => Observable.throw(this.extract.handlePostError(error))); - - } - - - getConstants() : Observable { - return this.http.getConstants() - .map(this.extract.extractData) - .catch((error:any) => Observable.throw(this.extract.handleError(error))); - } - - - getRandomizer(bottom, top) { - return Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom; - } -} \ No newline at end of file + routes: Routes; + + constructor(private http: HttpService, private extract: ExtractService) { + this.routes = new Routes(); + } + + // GET requests + getProjects(): Observable { + // ...using get request + return this.http.get(this.routes.getProjects) + // ...and calling .json() on the response to return data + .map(this.extract.extractData) + // ...errors if any + .catch(error => Observable.throw(this.extract.handleError(error))); + + } + + getProjectsByName(name): Observable { + // ...using get request + return this.http.get(this.routes.history + name) + // ...and calling .json() on the response to return data + .map(this.extract.extractData) + // ...errors if any + .catch(error => Observable.throw(this.extract.handleError(error))); + + } + + getProject(id): Observable { + // ...using get request + return this.http.get(this.routes.getProjects + id) + // ...and calling .json() on the response to return data + .map(this.extract.extractData) + // ...errors if any + .catch(error => Observable.throw(this.extract.handleError(error))); + + } + + // POST requests + createProject(project: Project) { + const data = this.http.createParams(project); + return this.http.post(this.routes.createProject, data) + .map(this.extract.extractData) + .catch(error => Observable.throw(this.extract.handlePostError(error))); + } + + updateProject(project: Project) { + + const data = this.http.createParams(project); + return this.http.post(this.routes.updateProject, data) + .map(this.extract.extractData) + .catch(error => Observable.throw(this.extract.handlePostError(error))); + + } + + archieveProject(project: Project) { + + const data = this.http.createParams(project); + return this.http.put(this.routes.archieve, data) + .map(this.extract.extractData) + .catch(error => Observable.throw(this.extract.handlePostError(error))); + + } + + deleteProject(project: Project) { + return this.http.delete(this.routes.deleteProject + project.name) + .map(this.extract.extractData) + .catch(error => Observable.throw(this.extract.handlePostError(error))); + + } + + getConstants(): Observable<{ lines: string[]; domains: string[]; types: string[]; programs: string[] }> { + return this.http.getConstants() + .map(this.extract.extractData) + .catch(error => Observable.throw(this.extract.handleError(error))); + } +} diff --git a/src/app/features/project/project/project.animation.ts b/src/app/features/project/project/project.animation.ts index dacf64fa..35ac2c8c 100644 --- a/src/app/features/project/project/project.animation.ts +++ b/src/app/features/project/project/project.animation.ts @@ -1,25 +1,23 @@ import { - trigger, - state, - style, - animate, - transition, - keyframes - } from '@angular/animations'; - + trigger, + state, + style, + animate, + transition, +} from '@angular/animations'; export const PROJECT_ANIMATION = [trigger('appear', [ - state('in', style({opacity: 1 })), - transition('void => *', [ - style({ - opacity: 0, - transform: 'scale(0,0)' - }), - animate('0.4s 400ms ease-out') - ]) - ]), + state('in', style({opacity: 1})), + transition('void => *', [ + style({ + opacity: 0, + transform: 'scale(0,0)' + }), + animate('0.4s 400ms ease-out') + ]) +]), trigger('appear2', [ - state('in', style({opacity: 1 })), + state('in', style({opacity: 1})), transition('void => *', [ style({ opacity: 0 @@ -28,7 +26,7 @@ export const PROJECT_ANIMATION = [trigger('appear', [ ]) ]), trigger('appear3', [ - state('in', style({opacity: 1 })), + state('in', style({opacity: 1})), transition('void => *', [ style({ opacity: 0, @@ -38,5 +36,4 @@ export const PROJECT_ANIMATION = [trigger('appear', [ ]) ]) - -] +]; diff --git a/src/app/features/project/project/project.component.ts b/src/app/features/project/project/project.component.ts index 1ce0064c..0284d9aa 100644 --- a/src/app/features/project/project/project.component.ts +++ b/src/app/features/project/project/project.component.ts @@ -1,150 +1,145 @@ -import { Component, Input,ViewChild,ViewContainerRef } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Router } from '@angular/router'; +import {Component, ViewChild, ViewContainerRef} from '@angular/core'; +import {ActivatedRoute} from '@angular/router'; +import {Router} from '@angular/router'; -import { Project } from '../../../shared/models/project'; -import { Technology } from '../../../shared/models/technology'; +import {Project} from '../../../shared/models/project'; +import {Technology} from '../../../shared/models/technology'; -import { DynamicService } from '../../../core/dynamic.service'; -import { PowerPointService } from '../../../core/powerpoint.service'; -import { ProjectService } from '../project.service'; +import {DynamicService} from '../../../core/dynamic.service'; +import {PowerPointService} from '../../../core/powerpoint.service'; +import {ProjectService} from '../project.service'; +import {PROJECT_ANIMATION} from './project.animation'; -import { PROJECT_ANIMATION } from './project.animation'; -import { ReflectiveDependency } from '@angular/core/src/di/reflective_provider'; - -import { groupBy } from '../../../shared/helpers/extensions'; - +import {groupBy} from '../../../shared/helpers/extensions'; @Component({ selector: 'project', templateUrl: './project.component.html', - styleUrls: [ - './project.component.less'], + styleUrls: ['./project.component.less'], animations: [PROJECT_ANIMATION] }) export class ProjectComponent { - model:Project=new Project(); - @ViewChild('entry', { read: ViewContainerRef} ) entry:ViewContainerRef; - - id:number; - technologies:any; - leadContacts:any; - - ribbonVisible:boolean=false; - - constructor(private dataService:ProjectService, - private route: ActivatedRoute, - private router:Router, - private dynamic:DynamicService, - private powerpoint:PowerPointService) { - - } + model: Project = new Project(); + @ViewChild('entry', {read: ViewContainerRef}) entry: ViewContainerRef; - ngOnInit(){ - this.route.params.subscribe(params=>{ - this.id=+params['id']; - - this.dataService.getProject(this.id).subscribe(data=>{ - this.model=new Project(data); - this.technologies=groupBy(this.model.technologies,'domain'); - if(this.model.pss) this.technologies.information=this.technologies.information - ? [...this.technologies.information,new Technology({name:"PSS " + (this.model.pss)})] - : [new Technology({name:"PSS " + (this.model.pss)})]; - - this.leadContacts=this.model.schedules.filter(schedule=>schedule.role.leadrole); - - if(this.model.enddate){ - this.ribbonVisible=new Date(this.model.enddate)<=new Date(); - } - - console.log(this.model); - },error=>{ - this.dynamic.setRootViewContainerRef(this.entry); - let modal=this.dynamic.addErrorComponent(); - modal.error=error; - modal.action=true; - modal.actionPerfomed.subscribe(action=>{ - this.router.navigate(["/projects/"]); - }) - - this.model.line="grey"; - }) - }) - - - } + id: number; + technologies; + leadContacts; + ribbonVisible = false; - archieveProject(){ - this.dynamic.setRootViewContainerRef(this.entry); - let modal=this.dynamic.addDeleteComponent(); - modal.type="Project"; - modal.name=this.model.name; - - modal.deleted.subscribe(action=>{ - modal.visible=false; - this.dataService.deleteProject(this.model).subscribe( - data=>{ - this.router.navigate(["/projects"]); - }, - error=>{ - console.log(error) - this.dynamic.setRootViewContainerRef(this.entry); - let modal=this.dynamic.addErrorComponent(); - modal.error.errors=[error]; - } - ) - }) - - modal.archieved.subscribe(action=>{ - modal.visible=false; - this.dataService.archieveProject(this.model).subscribe( - data=>{ - this.router.navigate(["/projects"]); - }, - error=>{ - this.dynamic.setRootViewContainerRef(this.entry); - let modal=this.dynamic.addErrorComponent(); - modal.error.errors=[error]; - } - ) - }) - } + constructor(private dataService: ProjectService, + private route: ActivatedRoute, + private router: Router, + private dynamic: DynamicService, + private powerpoint: PowerPointService) { - showUpload(){ - this.dynamic.setRootViewContainerRef(this.entry); - let modal=this.dynamic.addFileComponent(); - modal.project=this.model; - - modal.onUploaded.subscribe(image=>{ - this.model.image=image; - console.log(this.model.image); - modal.visible=false; - }) - - modal.onErrors.subscribe(error=>{ - this.dynamic.setRootViewContainerRef(this.entry); - let modal=this.dynamic.addErrorComponent(); - modal.error=error; - }) - } + } + ngOnInit() { + this.route.params.subscribe(params => { + this.id = +params['id']; - createPresentation(){ - try{ - this.powerpoint.createPresentation(this.model, this.model.name,true); - } catch(error){ - this.dynamic.setRootViewContainerRef(this.entry); - let modal=this.dynamic.addErrorComponent(); - modal.error.errors=[error]; - } - } + this.dataService.getProject(this.id).subscribe(data => { + this.model = new Project(data); + this.technologies = groupBy(this.model.technologies, 'domain'); + if (this.model.pss) { + this.technologies.information = this.technologies.information + ? [...this.technologies.information, new Technology({name: 'PSS ' + (this.model.pss)})] + : [new Technology({name: 'PSS ' + (this.model.pss)})]; + } - searchProjects(name,value) { - let param=new Object(); - param[name]=value; - this.router.navigate(['/projects'], { queryParams: param }); + this.leadContacts = this.model.schedules.filter(schedule => schedule.role.leadrole); + + if (this.model.enddate) { + this.ribbonVisible = new Date(this.model.enddate) <= new Date(); + } + + console.log(this.model); + }, error => { + this.dynamic.setRootViewContainerRef(this.entry); + const modal = this.dynamic.addErrorComponent(); + modal.error = error; + modal.action = true; + modal.actionPerfomed.subscribe(action => { + this.router.navigate(['/projects/']); + }); + + this.model.line = 'grey'; + }); + }); + + } + + archieveProject() { + this.dynamic.setRootViewContainerRef(this.entry); + const modal = this.dynamic.addDeleteComponent(); + modal.type = 'Project'; + modal.name = this.model.name; + + modal.deleted.subscribe(action => { + modal.visible = false; + this.dataService.deleteProject(this.model).subscribe( + data => { + this.router.navigate(['/projects']); + }, + error => { + console.log(error); + this.dynamic.setRootViewContainerRef(this.entry); + const modal = this.dynamic.addErrorComponent(); + modal.error.errors = [error]; + } + ); + }); + + modal.archieved.subscribe(action => { + modal.visible = false; + this.dataService.archieveProject(this.model).subscribe( + data => { + this.router.navigate(['/projects']); + }, + error => { + this.dynamic.setRootViewContainerRef(this.entry); + const modal = this.dynamic.addErrorComponent(); + modal.error.errors = [error]; + } + ); + }); + } + + showUpload() { + this.dynamic.setRootViewContainerRef(this.entry); + const modal = this.dynamic.addFileComponent(); + modal.project = this.model; + + modal.onUploaded.subscribe(image => { + this.model.image = image; + console.log(this.model.image); + modal.visible = false; + }); + + modal.onErrors.subscribe(error => { + this.dynamic.setRootViewContainerRef(this.entry); + const modal = this.dynamic.addErrorComponent(); + modal.error = error; + }); + } + + createPresentation() { + try { + this.powerpoint.createPresentation(this.model, this.model.name, true); + } catch (error) { + this.dynamic.setRootViewContainerRef(this.entry); + const modal = this.dynamic.addErrorComponent(); + modal.error.errors = [error]; } -} \ No newline at end of file + } + + searchProjects(name, value) { + const param = new Object(); + param[name] = value; + this.router.navigate(['/projects'], {queryParams: param}); + } +} diff --git a/src/app/features/technology/technology-picker/technology-picker.component.ts b/src/app/features/technology/technology-picker/technology-picker.component.ts index b5a22c7f..c36111f1 100644 --- a/src/app/features/technology/technology-picker/technology-picker.component.ts +++ b/src/app/features/technology/technology-picker/technology-picker.component.ts @@ -1,91 +1,86 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Technology } from './../../../shared/models/technology'; - -import {TechnologyService} from './../technology.service'; +import {Component, Input, Output, EventEmitter} from '@angular/core'; +import {Technology} from '../../../shared/models/technology'; +import {TechnologyService} from '../technology.service'; @Component({ selector: 'technology-picker', templateUrl: './technology-picker.component.html', - styleUrls: ['./technology-picker.component.less'], + styleUrls: ['./technology-picker.component.less'], }) export class TechnologyPickerComponent { - @Input() selectedTechnologies:Array=new Array(); - @Input() pickerStyle:string=""; - @Input() searchStyle:string=""; - @Input() clearStyle:string=""; - @Input() selectStyle:string=""; + @Input() selectedTechnologies: Technology[] = []; + @Input() pickerStyle = ''; + @Input() searchStyle = ''; + @Input() clearStyle = ''; + @Input() selectStyle = ''; + allSelected: boolean; - allSelected:boolean; + @Input() + public set selected(val: string) { + this.selectedTechnologies = [...this.selectedTechnologies, new Technology({name: val})]; + this.initialFilter(); + } - //_selected:string; - @Input() - public set selected(val: string) { - this.selectedTechnologies=[...this.selectedTechnologies,new Technology({name:val})]; - this.initialFilter(); - } + @Output() onSelect = new EventEmitter(); - @Output() onSelect=new EventEmitter>(); + initialTechnologies: Technology[] = []; + technologies: Technology[] = []; - initialTechnologies:Array=new Array(); - technologies:Array=new Array(); + constructor(private dataService: TechnologyService) { - constructor(private dataService:TechnologyService) { - - } + } - ngOnInit(){ - this.dataService.getTechnologies().subscribe(data=>{ - this.technologies=data; - this.initialFilter(); + ngOnInit() { + this.dataService.getTechnologies().subscribe(data => { + this.technologies = data; + this.initialFilter(); - this.initialTechnologies=this.technologies; - }, error=>{ - console.log(error); - }) - } + this.initialTechnologies = this.technologies; + }, error => { + console.log(error); + }); + } - initialFilter(){ - this.technologies.filter((item)=> - this.selectedTechnologies.map(i=>i.name) - .includes(item.name)).forEach(element => { - element.active=true; - }); + initialFilter() { + this.technologies.filter(item => + this.selectedTechnologies.map(i => i.name) + .includes(item.name)).forEach(element => { + element.active = true; + }); - let selected=this.technologies.filter(item=>item.active); - this.allSelected=selected.length ? true : false; - console.log(this.allSelected) - this.onSelect.emit(selected); - } + const selected = this.technologies.filter(item => item.active); + this.allSelected = selected.length ? true : false; + console.log(this.allSelected); + this.onSelect.emit(selected); + } - filterTechnologies(event){ - - this.technologies=this.initialTechnologies; - this.technologies=this.technologies.filter(item=>item.name.toLowerCase().indexOf(event.toLowerCase())!=-1); - } + filterTechnologies(event) { - selectTechnology(event){ - let tech=this.initialTechnologies.filter(item=>item.name===event)[0]; - tech.active=!tech.active; + this.technologies = this.initialTechnologies; + this.technologies = this.technologies.filter(item => item.name.toLowerCase().indexOf(event.toLowerCase()) != -1); + } - let selected=this.technologies.filter(item=>item.active); - this.onSelect.emit(selected); - } + selectTechnology(event) { + const tech = this.initialTechnologies.filter(item => item.name === event)[0]; + tech.active = !tech.active; - clearSelect(){ - this.technologies.forEach(tech=>tech.active=false); - } + const selected = this.technologies.filter(item => item.active); + this.onSelect.emit(selected); + } - switchAll(allSelected){ - this.allSelected=!this.allSelected; - this.technologies.forEach(tech=>tech.active=this.allSelected); + clearSelect() { + this.technologies.forEach(tech => tech.active = false); + } - this.allSelected ? this.onSelect.emit(this.technologies) - : this.onSelect.emit([]); + switchAll(allSelected) { + this.allSelected = !this.allSelected; + this.technologies.forEach(tech => tech.active = this.allSelected); - } + this.allSelected ? this.onSelect.emit(this.technologies) + : this.onSelect.emit([]); + } } - diff --git a/src/app/features/technology/technology-routing.module.ts b/src/app/features/technology/technology-routing.module.ts index 2ab896c2..4b98cf30 100644 --- a/src/app/features/technology/technology-routing.module.ts +++ b/src/app/features/technology/technology-routing.module.ts @@ -1,11 +1,9 @@ -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - +import {NgModule} from '@angular/core'; +import {RouterModule} from '@angular/router'; @NgModule({ - imports: [RouterModule.forChild([ - //{ path: 'projects', component: {} }, - ])], + imports: [RouterModule.forChild([])], exports: [RouterModule] }) -export class TechnologyRoutingModule {} \ No newline at end of file +export class TechnologyRoutingModule { +} diff --git a/src/app/features/technology/technology.module.ts b/src/app/features/technology/technology.module.ts index 8aab6803..9f47d46d 100644 --- a/src/app/features/technology/technology.module.ts +++ b/src/app/features/technology/technology.module.ts @@ -1,19 +1,18 @@ -import { NgModule } from '@angular/core'; -import { SharedModule } from '../../shared/shared.module'; -import { ControlsModule } from '../../controls/controls.module'; +import {NgModule} from '@angular/core'; +import {SharedModule} from '../../shared/shared.module'; +import {ControlsModule} from '../../controls/controls.module'; +import {TechnologyService} from './technology.service'; +import {TechnologyRoutingModule} from './technology-routing.module'; -import { TechnologyService } from './technology.service'; -import { TechnologyRoutingModule } from './technology-routing.module'; - -//components -import { TechnologyPickerComponent } from './technology-picker/technology-picker.component'; - +// components +import {TechnologyPickerComponent} from './technology-picker/technology-picker.component'; @NgModule({ - imports: [ SharedModule, TechnologyRoutingModule, ControlsModule ], + imports: [SharedModule, TechnologyRoutingModule, ControlsModule], exports: [TechnologyPickerComponent], - declarations: [ TechnologyPickerComponent ], - providers: [ TechnologyService ] + declarations: [TechnologyPickerComponent], + providers: [TechnologyService] }) -export class TechnologyModule { } \ No newline at end of file +export class TechnologyModule { +} diff --git a/src/app/features/technology/technology.service.ts b/src/app/features/technology/technology.service.ts index aba9a186..1b0287bb 100644 --- a/src/app/features/technology/technology.service.ts +++ b/src/app/features/technology/technology.service.ts @@ -1,43 +1,31 @@ -import {Output, EventEmitter, Injectable} from "@angular/core"; -import {Response, URLSearchParams} from "@angular/http"; -import { HttpService } from "../../core/http.service"; -import { ExtractService } from "../../core/extract.service"; -import {Observable} from "rxjs/Observable"; +import {Injectable} from '@angular/core'; +import {HttpService} from '../../core/http.service'; +import {ExtractService} from '../../core/extract.service'; +import {Observable} from 'rxjs/Observable'; +import {Technology} from '../../shared/models/technology'; +import {Routes} from '../../shared/helpers/routes'; -import { Technology } from "../../shared/models/technology"; - - -import { PortfolioQueryEncoder } from "../../shared//helpers/queryEncoder"; -import { Routes } from './../../shared/helpers/routes'; - -import "rxjs/add/operator/map"; -import "rxjs/add/operator/catch"; -import "rxjs/add/operator/toPromise"; - +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/operator/toPromise'; @Injectable() export class TechnologyService { - routes:Routes; - - constructor(private http: HttpService, private extract:ExtractService) { - this.routes=new Routes(); - } - - - - - //GET requests - getTechnologies() : Observable { - - // ...using get request - return this.http.get(this.routes.getTechnologies) - // ...and calling .json() on the response to return data - .map(this.extract.extractData) - //...errors if any - .catch((error:any) => Observable.throw(this.extract.handleError(error))); - - } - -} \ No newline at end of file + routes: Routes; + + constructor(private http: HttpService, private extract: ExtractService) { + this.routes = new Routes(); + } + + // GET requests + getTechnologies(): Observable { + // ...using get request + return this.http.get(this.routes.getTechnologies) + // ...and calling .json() on the response to return data + .map(this.extract.extractData) + // ...errors if any + .catch(error => Observable.throw(this.extract.handleError(error))); + } +} diff --git a/src/app/shared/backpanel/backpanel.animation.ts b/src/app/shared/backpanel/backpanel.animation.ts index 6de49dcc..119e0aac 100644 --- a/src/app/shared/backpanel/backpanel.animation.ts +++ b/src/app/shared/backpanel/backpanel.animation.ts @@ -1,24 +1,22 @@ import { - trigger, - state, - style, - animate, - transition, - keyframes - } from '@angular/animations'; - + trigger, + state, + style, + animate, + transition +} from '@angular/animations'; export const BACKPANEL_ANIMATION = [trigger('appear', [ - state('in', style({opacity: 1 })), - transition('void => *', [ - style({ - opacity: 0 - }), - animate('0.4s 400ms ease-out') - ]) - ]), + state('in', style({opacity: 1})), + transition('void => *', [ + style({ + opacity: 0 + }), + animate('0.4s 400ms ease-out') + ]) +]), trigger('appear2', [ - state('in', style({opacity: 1 })), + state('in', style({opacity: 1})), transition('void => *', [ style({ opacity: 0 @@ -27,7 +25,7 @@ export const BACKPANEL_ANIMATION = [trigger('appear', [ ]) ]), trigger('appear3', [ - state('in', style({opacity: 1 })), + state('in', style({opacity: 1})), transition('void => *', [ style({ opacity: 0 @@ -36,5 +34,4 @@ export const BACKPANEL_ANIMATION = [trigger('appear', [ ]) ]) - -] +]; diff --git a/src/app/shared/backpanel/backpanel.component.ts b/src/app/shared/backpanel/backpanel.component.ts index 05e759c9..48848591 100644 --- a/src/app/shared/backpanel/backpanel.component.ts +++ b/src/app/shared/backpanel/backpanel.component.ts @@ -1,28 +1,16 @@ -import { Component, Input } from '@angular/core'; -import { BACKPANEL_ANIMATION } from './backpanel.animation'; -import * as Rx from 'rxjs/Rx'; - +import {Component, Input} from '@angular/core'; +import {BACKPANEL_ANIMATION} from './backpanel.animation'; @Component({ selector: 'backpanel', templateUrl: './backpanel.component.html', - styleUrls: ['./backpanel.component.less'], + styleUrls: ['./backpanel.component.less'], animations: BACKPANEL_ANIMATION }) export class BackPanelComponent { - @Input() color:string=''; - @Input() image:string='left'; - @Input() withAnimation:boolean=false; - - constructor() { - - } - - ngAfterViewInit(){ - - } - + @Input() color = ''; + @Input() image = 'left'; + @Input() withAnimation = false; } - diff --git a/src/app/shared/dash.pipe.ts b/src/app/shared/dash.pipe.ts index caf90136..07376f8b 100644 --- a/src/app/shared/dash.pipe.ts +++ b/src/app/shared/dash.pipe.ts @@ -1,11 +1,8 @@ -import { Pipe, PipeTransform } from "@angular/core"; +import {Pipe, PipeTransform} from '@angular/core'; -@Pipe({ - name:'dash' -}) - -export class DashPipe implements PipeTransform{ - transform(value:string){ - return value.replace(' ','-'); - } -} \ No newline at end of file +@Pipe({name: 'dash'}) +export class DashPipe implements PipeTransform { + transform(value: string) { + return value.replace(' ', '-'); + } +} diff --git a/src/app/shared/filesize.pipe.ts b/src/app/shared/filesize.pipe.ts index e00dd588..349bb7e1 100644 --- a/src/app/shared/filesize.pipe.ts +++ b/src/app/shared/filesize.pipe.ts @@ -1,11 +1,8 @@ -import { Pipe, PipeTransform } from "@angular/core"; +import {Pipe, PipeTransform} from '@angular/core'; -@Pipe({ - name:'filesize' -}) - -export class FileSizePipe implements PipeTransform{ - transform(size:number, extension:string ='MB'){ - return (size/(1024*1024)).toFixed(2) + extension; - } -} \ No newline at end of file +@Pipe({name: 'filesize'}) +export class FileSizePipe implements PipeTransform { + transform(size: number, extension: string = 'MB') { + return (size / (1024 * 1024)).toFixed(2) + extension; + } +} diff --git a/src/app/shared/footer/footer.component.ts b/src/app/shared/footer/footer.component.ts index af62a3ee..3a5a1e81 100644 --- a/src/app/shared/footer/footer.component.ts +++ b/src/app/shared/footer/footer.component.ts @@ -1,38 +1,11 @@ -import { Component, Input } from '@angular/core'; -//import * as Rx from 'rxjs/Rx'; - +import {Component, Input} from '@angular/core'; @Component({ selector: 'app-footer', templateUrl: './footer.component.html', - styleUrls: ['./footer.component.less'] + styleUrls: ['./footer.component.less'] }) export class FooterComponent { - @Input() color:string=''; - - - constructor() { - - } - - ngAfterViewInit(){ - - // var lastScrollTop = 0; - // let footer=document.querySelector('div#footer'); - - // window.addEventListener("scroll", function(){ - // var st = window.pageYOffset || document.documentElement.scrollTop; - // if (st > lastScrollTop){ - // footer.classList.add('footer--visible'); - // console.log('down') - // } else { - // footer.classList.remove('footer--visible'); - // console.log('up') - // } - // lastScrollTop = st; - // }, false); - } - - -} \ No newline at end of file + @Input() color = ''; +} diff --git a/src/app/shared/helpers/comparer.ts b/src/app/shared/helpers/comparer.ts index ec5917f0..88c19eed 100644 --- a/src/app/shared/helpers/comparer.ts +++ b/src/app/shared/helpers/comparer.ts @@ -1,54 +1,57 @@ import * as _ from 'lodash'; -export class Comparer { - deepCompare(obj1:any, obj2:any){ - let keys1=Object.keys(obj1); - let keys2=Object.keys(obj2); - - let keyDifference=_.difference(keys1,keys2); - let difference={}; - - if(keys1.length!==keys2.length && !keyDifference.length){ - return []; - } else{ - for(let key of keys1){ - // obj1[key]=obj1[key] || ''; - // obj2[key]=obj2[key] || ''; - - if(Array.isArray(obj1[key])){ - let ids1=obj1[key].map(i=>i.id); - let ids2=obj2[key].map(i=>i.id); - let diff=[]; - - - if(ids1.length>=ids2.length){ - diff=ids1.filter(function(i) {return ids2.indexOf(i) < 0;}); - } else if(ids1.length < ids2.length){ - diff=ids2.filter(function(i) {return ids1.indexOf(i) < 0;}); - } - - if(diff.length) difference[key]=diff; - } else{ - if( key!=='errors'){ - if(obj1[key]!==obj2[key]) difference[key]='changed';; - } - - } +export class Comparer { + + static propCompare(prop, isAssending) { + return (a, b) => { + if (isAssending) { + return a[prop] > b[prop] ? 1 : a[prop] === b[prop] ? 0 : -1; + } else { + return b[prop] > a[prop] ? 1 : a[prop] === b[prop] ? 0 : -1; + } + }; + } + + deepCompare(obj1: {}, obj2: {}) { + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + + const keyDifference = _.difference(keys1, keys2); + const difference = {}; + + if (keys1.length !== keys2.length && !keyDifference.length) { + return []; + } else { + for (const key of keys1) { + if (Array.isArray(obj1[key])) { + const ids1 = obj1[key].map(i => i.id); + const ids2 = obj2[key].map(i => i.id); + let diff = []; + + if (ids1.length >= ids2.length) { + diff = ids1.filter(i => { + return ids2.indexOf(i) < 0; + }); + } else if (ids1.length < ids2.length) { + diff = ids2.filter(i => { + return ids1.indexOf(i) < 0; + }); + } + + if (diff.length) { + difference[key] = diff; + } + } else { + if (key !== 'errors') { + if (obj1[key] !== obj2[key]) { + difference[key] = 'changed'; } - } - - return difference; - } + } - static propCompare(prop,isAssending) { - return function(a, b) { - if(isAssending){ - return a[prop] > b[prop] ? 1 : a[prop] === b[prop] ? 0 : -1; - } else{ - return b[prop] > a[prop] ? 1 : a[prop] === b[prop] ? 0 : -1; - } } + } } -} - \ No newline at end of file + return difference; + } +} diff --git a/src/app/shared/helpers/extensions.ts b/src/app/shared/helpers/extensions.ts index 1e42527f..e1ecbb07 100644 --- a/src/app/shared/helpers/extensions.ts +++ b/src/app/shared/helpers/extensions.ts @@ -1,6 +1,6 @@ -export function groupBy(xs:Array, key:string) { - return xs.reduce(function(rv, x) { - (rv[x[key]] = rv[x[key]] || []).push(x); - return rv; - }, {}); -}; \ No newline at end of file +export function groupBy(xs: {}[], key: string) { + return xs.reduce((rv, x) => { + (rv[x[key]] = rv[x[key]] || []).push(x); + return rv; + }, {}); +} diff --git a/src/app/shared/helpers/queryEncoder.ts b/src/app/shared/helpers/queryEncoder.ts index dbaa51e2..24a3249e 100644 --- a/src/app/shared/helpers/queryEncoder.ts +++ b/src/app/shared/helpers/queryEncoder.ts @@ -1,7 +1,6 @@ -import {QueryEncoder} from "@angular/http"; +import {QueryEncoder} from '@angular/http'; - -//requiered for storing '+' in strings for phone numbers +// requiered for storing '+' in strings for phone numbers export class PortfolioQueryEncoder extends QueryEncoder { encodeKey(k: string): string { diff --git a/src/app/shared/helpers/routes.ts b/src/app/shared/helpers/routes.ts index e2d21335..7d3b3119 100644 --- a/src/app/shared/helpers/routes.ts +++ b/src/app/shared/helpers/routes.ts @@ -1,12 +1,6 @@ -import {environment} from '../../../environments/environment'; - - export class Routes { - IsProduction = environment.production; - - - //Project + // Project getProjects; createProject; updateProject; @@ -14,52 +8,46 @@ export class Routes { archieve; deleteProject; - - //Employees + // Employees getEmployees; - getEmployee; - - //Technologies + // Technologies getTechnologies; doesTechnologyExist; createTechnology; deleteTechnology; updateTechnology; - - //Roles - getRoles; + // Roles + getRoles; - //file + // file removeImage; - //presentation + // presentation presentationImages; constructor() { - this.getProjects="/api/projects/"; - this.createProject="/api/projects/create/"; - this.updateProject="/api/projects/update/"; - this.archieve="/api/projects/archieve/"; - this.deleteProject="/api/projects/delete/"; - this.history="/api/projects/history/"; + this.getProjects = '/api/projects/'; + this.createProject = '/api/projects/create/'; + this.updateProject = '/api/projects/update/'; + this.archieve = '/api/projects/archieve/'; + this.deleteProject = '/api/projects/delete/'; + this.history = '/api/projects/history/'; - this.getEmployees="/api/employees"; - this.getRoles="/api/roles"; + this.getEmployees = '/api/employees'; + this.getRoles = '/api/roles'; - this.getTechnologies="/api/technologies"; - this.doesTechnologyExist="/api/technologies/exists/"; - this.createTechnology="/api/technology/create"; - this.deleteTechnology="/api/technology/delete/"; - this.updateTechnology="/api//technology/update/"; + this.getTechnologies = '/api/technologies'; + this.doesTechnologyExist = '/api/technologies/exists/'; + this.createTechnology = '/api/technology/create'; + this.deleteTechnology = '/api/technology/delete/'; + this.updateTechnology = '/api//technology/update/'; + this.getRoles = '/api/roles'; - this.getRoles="/api/roles"; - - this.removeImage="/api/images/remove"; - this.presentationImages='/api/presentation/images/'; + this.removeImage = '/api/images/remove'; + this.presentationImages = '/api/presentation/images/'; } - } diff --git a/src/app/shared/keys.pipe.ts b/src/app/shared/keys.pipe.ts index a0cd1774..6435983e 100644 --- a/src/app/shared/keys.pipe.ts +++ b/src/app/shared/keys.pipe.ts @@ -1,14 +1,12 @@ -import { Pipe,PipeTransform } from '@angular/core'; - - +import {Pipe, PipeTransform} from '@angular/core'; @Pipe({name: 'keys'}) export class KeysPipe implements PipeTransform { - transform(value) : any { - let keys = []; - for (let key in value) { + transform(value): {} { + const keys = []; + for (const key in value) { keys.push(key); } return keys; } -} \ No newline at end of file +} diff --git a/src/app/shared/modal/delete/delete.component.ts b/src/app/shared/modal/delete/delete.component.ts index 3c8d72ce..12b04247 100644 --- a/src/app/shared/modal/delete/delete.component.ts +++ b/src/app/shared/modal/delete/delete.component.ts @@ -1,39 +1,33 @@ -import { Component, Input, EventEmitter, Output } from '@angular/core'; -import { ModalComponent } from '../modal.component'; -import { Error } from '../../../shared/models/error'; +import {Component, Input, EventEmitter, Output} from '@angular/core'; +import {ModalComponent} from '../modal.component'; @Component({ selector: 'delete', templateUrl: './delete.component.html', - styleUrls: ['./delete.component.less'] + styleUrls: ['./delete.component.less'] }) export class DeleteComponent extends ModalComponent { - @Input() type:string=''; - @Input() name:string=''; + @Input() type = ''; + @Input() name = ''; - @Output() archieved=new EventEmitter(); - @Output() deleted=new EventEmitter(); + @Output() archieved = new EventEmitter(); + @Output() deleted = new EventEmitter(); - constructor() { - super(); - } + constructor() { + super(); + } - ngAfterViewInit(){ + archieve() { + this.archieved.emit(true); + } - } + delete() { + this.deleted.emit(true); + } - archieve(){ - this.archieved.emit(true); - } + cancel() { + this.visible = false; + } - delete(){ - this.deleted.emit(true); - } - - cancel(){ - this.visible=false; - } - - -} \ No newline at end of file +} diff --git a/src/app/shared/modal/error/error.component.ts b/src/app/shared/modal/error/error.component.ts index b2e29c81..dd5e4795 100644 --- a/src/app/shared/modal/error/error.component.ts +++ b/src/app/shared/modal/error/error.component.ts @@ -1,25 +1,24 @@ -import { Component, Input,Output, EventEmitter } from '@angular/core'; -import { ModalComponent } from '../modal.component'; -import { Error } from '../../../shared/models/error'; +import {Component, Input, Output, EventEmitter} from '@angular/core'; +import {ModalComponent} from '../modal.component'; +import {Error} from '../../models/error'; @Component({ selector: 'error', templateUrl: './error.component.html', - styleUrls: ['./error.component.less'] + styleUrls: ['./error.component.less'] }) export class ErrorComponent extends ModalComponent { - @Input() error:Error=new Error(); - @Input() action:boolean=false; - @Output() actionPerfomed=new EventEmitter(); + @Input() error: Error = new Error(); + @Input() action = false; + @Output() actionPerfomed = new EventEmitter(); - constructor() { - super(); - } + constructor() { + super(); + } - performAction(){ - this.actionPerfomed.emit(); - } + performAction() { + this.actionPerfomed.emit(); + } - -} \ No newline at end of file +} diff --git a/src/app/shared/modal/file/file.component.ts b/src/app/shared/modal/file/file.component.ts index 193ba14d..ef745d53 100644 --- a/src/app/shared/modal/file/file.component.ts +++ b/src/app/shared/modal/file/file.component.ts @@ -1,9 +1,8 @@ -import { Component, Input, Output,EventEmitter } from '@angular/core'; +import { Component, Input, Output, EventEmitter } from '@angular/core'; import { ModalComponent } from '../modal.component'; import { Project } from '../../../shared/models/project'; import { FileService } from '../../../core/file.service'; - @Component({ selector: 'file', templateUrl: './file.component.html', @@ -11,62 +10,60 @@ import { FileService } from '../../../core/file.service'; }) export class FileComponent extends ModalComponent { - @Input() project:Project=new Project(); - @Output() onUploaded=new EventEmitter(); - @Output() onErrors=new EventEmitter(); + @Input() project: Project = new Project(); + @Output() onUploaded = new EventEmitter(); + @Output() onErrors = new EventEmitter<{}>(); - visible=true; - uploadedFiles: any[] = []; + visible = true; + uploadedFiles: {}[] = []; - constructor(private dataService:FileService) { + constructor(private dataService: FileService) { super(); } - - ngOnInit(){ + ngOnInit() { } - onSelect(event) { - - for(let file of event.files) { + + for (const file of event.files) { //file.name=file.name+=' ' + this.project.id + ' ' + this.project.name; this.uploadedFiles.push(file); } - console.log(event.files) + console.log(event.files); console.log(this.uploadedFiles); } - onUpload(event){ + onUpload(event) { //event.stopPropagation(); - this.uploadedFiles=[]; + this.uploadedFiles = []; this.onUploaded.emit(event.xhr.response); } - onClear(event){ - this.uploadedFiles=[]; + onClear(event) { + this.uploadedFiles = []; } - onError(event){ - this.uploadedFiles=[]; + onError(event) { + this.uploadedFiles = []; console.log(event); } - onBeforeUpload(event){ - event.formData.append('name',this.project.name); - event.formData.append('id',this.project.id); + onBeforeUpload(event) { + event.formData.append('name', this.project.name); + event.formData.append('id', this.project.id); } - removeImage(){ - this.dataService.removeImage(this.project).subscribe(project=>{ - this.project.image=null; - this.visible=false; + removeImage() { + this.dataService.removeImage(this.project).subscribe(project => { + this.project.image = null; + this.visible = false; console.log(project); - },error=>{ - this.visible=false; + }, error => { + this.visible = false; this.onErrors.emit(error); - }) + }); } -} \ No newline at end of file +} diff --git a/src/app/shared/modal/modal.component.ts b/src/app/shared/modal/modal.component.ts index f8c4e4a5..fccd3b7d 100644 --- a/src/app/shared/modal/modal.component.ts +++ b/src/app/shared/modal/modal.component.ts @@ -1,30 +1,17 @@ -import { Component, Input } from '@angular/core'; - +import {Component, Input} from '@angular/core'; @Component({ selector: 'modal', templateUrl: './modal.component.html', - styleUrls: ['./modal.component.less'] + styleUrls: ['./modal.component.less'] }) export class ModalComponent { - @Input() color:string=''; - @Input() headerColor:string='grey'; - @Input() visible=true; - @Input() windowStyle:string=""; - - @Input() fullscreen:boolean=false; - - constructor() { - - } - - ngAfterViewInit(){ - - } + @Input() color = ''; + @Input() headerColor = 'grey'; + @Input() visible = true; + @Input() windowStyle = ''; - hide(){ - this.visible=false; - } + @Input() fullscreen = false; -} \ No newline at end of file +} diff --git a/src/app/shared/models/constants.ts b/src/app/shared/models/constants.ts index 6753a104..1de34215 100644 --- a/src/app/shared/models/constants.ts +++ b/src/app/shared/models/constants.ts @@ -1,15 +1,14 @@ +export class Constants { -export class Constants{ - - lines:Array; - domains:Array; - types:Array; - programs:Array; - customers:Set; - roles:Array; - technologies:Array; + lines: string[]; + domains: string[]; + types: string[]; + programs: string[]; + customers: Set; + roles: string[]; + technologies: string[]; - public constructor(init?:Partial) { - Object.assign(this, init); - } -} \ No newline at end of file + public constructor(init?: Partial) { + Object.assign(this, init); + } +} diff --git a/src/app/shared/models/employee.ts b/src/app/shared/models/employee.ts index 32e96ece..f12ec03d 100644 --- a/src/app/shared/models/employee.ts +++ b/src/app/shared/models/employee.ts @@ -1,21 +1,20 @@ -import {Role} from './role'; import {Technology} from './technology'; import {Schedule} from './schedule'; -export class Employee{ - id:string=''; - firstname:string=''; - lastname:string=''; - active:boolean=false; - participation:number=0.0; - schedules:Array=new Array(); - technologies:Array=new Array(); +export class Employee { + id = ''; + firstname = ''; + lastname = ''; + active = false; + participation = 0.0; + schedules: Schedule[] = new Array(); + technologies: Technology[] = new Array(); - get fullname() { - return this.firstname + " " + this.lastname; - } + get fullname() { + return this.firstname + ' ' + this.lastname; + } - public constructor(init?:Partial) { - Object.assign(this, init); - } -} \ No newline at end of file + public constructor(init?: Partial) { + Object.assign(this, init); + } +} diff --git a/src/app/shared/models/error.ts b/src/app/shared/models/error.ts index d353dbb6..8534600a 100644 --- a/src/app/shared/models/error.ts +++ b/src/app/shared/models/error.ts @@ -1,9 +1,10 @@ -export class Error{ - - status:number; - statusText=""; - errors:Array=new Array(); - public constructor(init?:Partial) { - Object.assign(this, init); - } -} \ No newline at end of file +export class Error { + + status: number; + statusText = ''; + errors: string[] = new Array(); + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} diff --git a/src/app/shared/models/project.ts b/src/app/shared/models/project.ts index c9b19fbc..fe514d0e 100644 --- a/src/app/shared/models/project.ts +++ b/src/app/shared/models/project.ts @@ -1,58 +1,47 @@ import {Technology} from './technology'; import {Employee} from './employee'; -import { Schedule } from './schedule'; - -export class Project{ - id:string=''; - customer:string=''; - name:string=''; - line:string=''; - domain:string=''; - description:string=''; - updatedAt:Date=new Date(); - - //new props - pss:number=0.0; - feedback:string=""; - program:string=""; - type:string=""; - image:string=""; - - technologies:Array=new Array(); - employees:Array=new Array(); - - schedules:Array=new Array(); - // get schedules(){ - // return this._schedules; - // } - // set schedules(value:Array){ - // this._schedules=value; - // this.teamcount=value ? value.length :0; - // } - - version:number=1; - teamcount:number=0; - startdate:Date; - enddate:Date; - - errors:Object={}; - - - required:Array; - - generateErrors(unvalidFields:Array){ - this.errors={}; - unvalidFields.map(field=>{ - this.errors[field]=`${field} is required`; - }); - } - - - - - public constructor(init?:Partial) { - Object.assign(this, init); - this.errors={}; - this.required=["name","line","domain","startdate","description","type","program"]; - } -} \ No newline at end of file +import {Schedule} from './schedule'; + +export class Project { + id = ''; + customer = ''; + name = ''; + line = ''; + domain = ''; + description = ''; + updatedAt: Date = new Date(); + + // new props + pss = 0.0; + feedback = ''; + program = ''; + type = ''; + image = ''; + + technologies: Technology[] = new Array(); + employees: Employee[] = new Array(); + + schedules: Schedule[] = new Array(); + + version = 1; + teamcount = 0; + startdate: Date; + enddate: Date; + + errors: Object = {}; + + required: string[]; + + generateErrors(unvalidFields: string[]) { + this.errors = {}; + unvalidFields.map(field => { + this.errors[field] = `${field} is required`; + }); + } + + public constructor(init?: Partial) { + Object.assign(this, init); + this.errors = {}; + this.required = ['name', 'line', 'domain', 'startdate', 'description', 'type', 'program']; + } +} diff --git a/src/app/shared/models/role.ts b/src/app/shared/models/role.ts index e4e6c5fa..1ec33042 100644 --- a/src/app/shared/models/role.ts +++ b/src/app/shared/models/role.ts @@ -1,11 +1,11 @@ -export class Role{ - id:string=''; - name:string=''; - participation:string=''; - seniority:string=''; - leadrole:boolean=false; +export class Role { + id = ''; + name = ''; + participation = ''; + seniority = ''; + leadrole = false; - public constructor(init?:Partial) { - Object.assign(this, init); - } -} \ No newline at end of file + public constructor(init?: Partial) { + Object.assign(this, init); + } +} diff --git a/src/app/shared/models/schedule.ts b/src/app/shared/models/schedule.ts index a9415279..c0e27ff6 100644 --- a/src/app/shared/models/schedule.ts +++ b/src/app/shared/models/schedule.ts @@ -1,23 +1,22 @@ import {Employee} from './employee'; -import {Role} from './role' +import {Role} from './role'; import {Project} from './project'; - export class Schedule { - id:string=''; - participation: number=0.0; - startdate: Date= new Date(); - enddate: Date; - active:boolean=false; + id = ''; + participation = 0.0; + startdate: Date = new Date(); + enddate: Date; + active = false; - project:Project=new Project(); - employee:Employee=new Employee(); - role:Role=new Role(); + project: Project = new Project(); + employee: Employee = new Employee(); + role: Role = new Role(); - roleid:string; - employeeid:string; + roleid: string; + employeeid: string; - public constructor(init?:Partial) { - Object.assign(this, init); - } -} \ No newline at end of file + public constructor(init?: Partial) { + Object.assign(this, init); + } +} diff --git a/src/app/shared/models/technology.ts b/src/app/shared/models/technology.ts index f3d55160..09991841 100644 --- a/src/app/shared/models/technology.ts +++ b/src/app/shared/models/technology.ts @@ -1,13 +1,13 @@ -export class Technology{ - id:string=''; - name:string=''; - domain:string=''; - active:boolean=false; +export class Technology { + id = ''; + name = ''; + domain = ''; + active = false; - image:string=''; - version:string=''; + image = ''; + version = ''; - public constructor(init?:Partial) { - Object.assign(this, init); - } -} \ No newline at end of file + public constructor(init?: Partial) { + Object.assign(this, init); + } +} diff --git a/src/app/shared/ribbon/ribbon.component.ts b/src/app/shared/ribbon/ribbon.component.ts index b7ed7168..7328fee2 100644 --- a/src/app/shared/ribbon/ribbon.component.ts +++ b/src/app/shared/ribbon/ribbon.component.ts @@ -1,20 +1,15 @@ -import { Component, Input } from '@angular/core'; - - +import {Component, Input} from '@angular/core'; @Component({ selector: 'ribbon', templateUrl: './ribbon.component.html', - styleUrls: ['./ribbon.component.less'] + styleUrls: ['./ribbon.component.less'] }) export class RibbonComponent { - @Input() style:string=''; - @Input() text:string=''; - @Input() date:Date; + @Input() style = ''; + @Input() text = ''; + @Input() date: Date; - @Input() visible =false; - constructor() { - - } -} \ No newline at end of file + @Input() visible = false; +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index abc88c67..abe88fe3 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -1,30 +1,34 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { ReactiveFormsModule } from '@angular/forms'; +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormsModule} from '@angular/forms'; +import {ReactiveFormsModule} from '@angular/forms'; -import {GrowlModule} from 'primeng/primeng'; -import {CalendarModule} from 'primeng/primeng'; +import {GrowlModule} from 'primeng/primeng'; +import {CalendarModule} from 'primeng/primeng'; import {FileUploadModule} from 'primeng/primeng'; import {CheckboxModule} from 'primeng/primeng'; import {TooltipModule} from 'primeng/primeng'; -import { BackPanelComponent} from './backpanel/backpanel.component'; -import { FooterComponent} from './footer/footer.component'; -import { ModalComponent} from './modal/modal.component'; -import { ErrorComponent} from './modal/error/error.component'; -import { DeleteComponent} from './modal/delete/delete.component'; -import { FileComponent} from './modal/file/file.component'; -import { RibbonComponent} from './ribbon/ribbon.component'; -import { TrimTextDirective } from './trimtext.directive'; -import {FileSizePipe } from './filesize.pipe'; -import { KeysPipe } from './keys.pipe'; -import { DashPipe } from './dash.pipe'; +import {BackPanelComponent} from './backpanel/backpanel.component'; +import {FooterComponent} from './footer/footer.component'; +import {ModalComponent} from './modal/modal.component'; +import {ErrorComponent} from './modal/error/error.component'; +import {DeleteComponent} from './modal/delete/delete.component'; +import {FileComponent} from './modal/file/file.component'; +import {RibbonComponent} from './ribbon/ribbon.component'; +import {TrimTextDirective} from './trimtext.directive'; +import {FileSizePipe} from './filesize.pipe'; +import {KeysPipe} from './keys.pipe'; +import {DashPipe} from './dash.pipe'; @NgModule({ - imports: [ CommonModule, ReactiveFormsModule,GrowlModule, CalendarModule,FileUploadModule,CheckboxModule,TooltipModule ], - declarations: [ BackPanelComponent,ErrorComponent,DashPipe,DeleteComponent,FileComponent,FileSizePipe, FooterComponent, KeysPipe, ModalComponent, RibbonComponent, TrimTextDirective ], - exports: [ CommonModule,ErrorComponent,DeleteComponent,FileComponent,DashPipe,FileSizePipe,FileUploadModule, KeysPipe,CheckboxModule,GrowlModule, CalendarModule,TooltipModule, FormsModule,ReactiveFormsModule, BackPanelComponent,FooterComponent,RibbonComponent, ModalComponent, TrimTextDirective ], - entryComponents:[ErrorComponent, DeleteComponent,FileComponent] + imports: [CommonModule, ReactiveFormsModule, GrowlModule, CalendarModule, FileUploadModule, CheckboxModule, TooltipModule], + declarations: [BackPanelComponent, ErrorComponent, DashPipe, DeleteComponent, FileComponent, FileSizePipe, FooterComponent, + KeysPipe, ModalComponent, RibbonComponent, TrimTextDirective], + exports: [CommonModule, ErrorComponent, DeleteComponent, FileComponent, DashPipe, FileSizePipe, FileUploadModule, KeysPipe, + CheckboxModule, GrowlModule, CalendarModule, TooltipModule, FormsModule, ReactiveFormsModule, BackPanelComponent, FooterComponent, + RibbonComponent, ModalComponent, TrimTextDirective], + entryComponents: [ErrorComponent, DeleteComponent, FileComponent] }) -export class SharedModule { } \ No newline at end of file +export class SharedModule { +} diff --git a/src/app/shared/trimtext.directive.ts b/src/app/shared/trimtext.directive.ts index e1b1986a..e512c2cd 100644 --- a/src/app/shared/trimtext.directive.ts +++ b/src/app/shared/trimtext.directive.ts @@ -1,11 +1,9 @@ -import { Directive, ElementRef } from '@angular/core'; +import {Directive, ElementRef} from '@angular/core'; -@Directive({ selector: '[trimtext]' }) +@Directive({selector: '[trimtext]'}) export class TrimTextDirective { constructor(el: ElementRef) { - - console.log( - el.nativeElement.innerText); + console.log(el.nativeElement.innerText); } -} \ No newline at end of file +} diff --git a/src/polyfills.ts b/src/polyfills.ts index 4352aba3..0f698417 100644 --- a/src/polyfills.ts +++ b/src/polyfills.ts @@ -40,24 +40,18 @@ import 'web-animations-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 */ diff --git a/tslint.json b/tslint.json index 97adaa5e..02e50407 100644 --- a/tslint.json +++ b/tslint.json @@ -3,6 +3,7 @@ "node_modules/codelyzer" ], "rules": { + "arrow-return-shorthand": [true, "multiline"], "callable-types": true, "class-name": true, "comment-format": [ @@ -10,11 +11,13 @@ "check-space" ], "curly": true, + "deprecation": true, "eofline": true, "forin": true, "import-blacklist": [ true, - "rxjs" + "rxjs", + "rxjs/Rx" ], "import-spacing": true, "indent": [ @@ -30,8 +33,14 @@ "member-access": false, "member-ordering": [ true, - "static-before-instance", - "variables-before-functions" + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } ], "no-arg": true, "no-bitwise": true, @@ -45,18 +54,22 @@ ], "no-construct": true, "no-debugger": true, - "no-empty": false, + "no-duplicate-super": true, + "no-empty": true, "no-empty-interface": true, "no-eval": true, "no-inferrable-types": [ true, "ignore-params" ], + "no-misused-new": true, + "no-non-null-assertion": true, "no-shadowed-variable": true, "no-string-literal": false, "no-string-throw": true, "no-switch-case-fall-through": true, "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, "no-unused-expression": true, "no-use-before-declare": true, "no-var-keyword": true, @@ -75,6 +88,7 @@ ], "radix": true, "semicolon": [ + true, "always" ], "triple-equals": [ @@ -109,7 +123,7 @@ "camelCase" ], "component-selector": [ - true, + false, "element", "app", "kebab-case" @@ -125,6 +139,20 @@ "directive-class-suffix": true, "no-access-missing-member": true, "templates-use-public": true, - "invoke-injectable": true + "invoke-injectable": true, + "no-consecutive-blank-lines": true, + "no-unused-variable": true, + "no-any": true, + "prefer-conditional-expression": true, + "no-var-requires": true, + "only-arrow-functions": true, + "prefer-for-of": true, + "cyclomatic-complexity": true, + "max-classes-per-file": [true, 1], + "no-require-imports": true, + "array-type": [true, "array"], + "arrow-parens": [true, "ban-single-arg-parens"], + "prefer-method-signature": true, + "prefer-template": true } } From 01923f83e9ba3b403d9f8d69a838b82b645c5b90 Mon Sep 17 00:00:00 2001 From: iminin Date: Fri, 9 Feb 2018 20:23:54 +0300 Subject: [PATCH 002/270] TypeScript for Node.js with watch mode --- package.json | 15 +- .../features/employee/employee.controller.js | 37 -- .../features/employee/employee.controller.ts | 34 ++ server/features/employee/employee.service.js | 56 --- server/features/employee/employee.service.ts | 25 ++ server/features/project/project.controller.js | 139 ------ server/features/project/project.controller.ts | 125 ++++++ server/features/project/project.service.js | 249 ---------- server/features/project/project.service.ts | 231 ++++++++++ server/features/project/project.validator.js | 36 -- server/features/project/project.validator.ts | 28 ++ .../technology/technology.controller.js | 99 ---- .../technology/technology.controller.ts | 93 ++++ .../features/technology/technology.service.js | 106 ----- .../features/technology/technology.service.ts | 93 ++++ .../technology/technology.validator.js | 27 -- .../technology/technology.validator.ts | 17 + server/routes/api.js | 15 - server/routes/api.ts | 9 + server.js => server/server.ts | 22 +- server/shared/file.controller.js | 110 ----- server/shared/file.controller.ts | 107 +++++ server/shared/parse.service.js | 78 ---- server/shared/parse.service.ts | 70 +++ webpack.config.js | 425 ------------------ 25 files changed, 847 insertions(+), 1399 deletions(-) delete mode 100644 server/features/employee/employee.controller.js create mode 100644 server/features/employee/employee.controller.ts delete mode 100644 server/features/employee/employee.service.js create mode 100644 server/features/employee/employee.service.ts delete mode 100644 server/features/project/project.controller.js create mode 100644 server/features/project/project.controller.ts delete mode 100644 server/features/project/project.service.js create mode 100644 server/features/project/project.service.ts delete mode 100644 server/features/project/project.validator.js create mode 100644 server/features/project/project.validator.ts delete mode 100644 server/features/technology/technology.controller.js create mode 100644 server/features/technology/technology.controller.ts delete mode 100644 server/features/technology/technology.service.js create mode 100644 server/features/technology/technology.service.ts delete mode 100644 server/features/technology/technology.validator.js create mode 100644 server/features/technology/technology.validator.ts delete mode 100644 server/routes/api.js create mode 100644 server/routes/api.ts rename server.js => server/server.ts (78%) delete mode 100644 server/shared/file.controller.js create mode 100644 server/shared/file.controller.ts delete mode 100644 server/shared/parse.service.js create mode 100644 server/shared/parse.service.ts delete mode 100644 webpack.config.js diff --git a/package.json b/package.json index a6df72ef..cc6d4433 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,13 @@ "version": "0.0.0", "license": "MIT", "scripts": { - "client": "ng serve --proxy-config proxy.conf.json", - "server": "nodemon server.js", - "client-server": "ng serve --proxy-config proxy.conf.json | nodemon server.js", - "build": "webpack", - "build:dev": "ng build && node server.js", - "build:prod": "ng build --prod --env=prod && node server.js", + "client": "ng build", + "server": "ts-node server.ts", + "client:watch": "ng serve --proxy-config proxy.conf.json", + "server:watch": "nodemon --watch server --exec ts-node server/server.ts", + "client-server": "ng serve --proxy-config proxy.conf.json | npm run server:watch", + "build:dev": "ng build && npm run server", + "build:prod": "ng build --prod --env=prod && npm run server", "db:drop": "sequelize db:drop", "db:create": "sequelize db:create", "db:migrate": "sequelize db:migrate", @@ -85,7 +86,7 @@ "source-map-loader": "^0.1.5", "style-loader": "^0.13.1", "stylus-loader": "^3.0.1", - "ts-node": "~2.0.0", + "ts-node": "^4.1.0", "tslint": "^5.9.1", "typescript": "~2.2.0", "url-loader": "^0.5.7", diff --git a/server/features/employee/employee.controller.js b/server/features/employee/employee.controller.js deleted file mode 100644 index dfef00fa..00000000 --- a/server/features/employee/employee.controller.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; - -const express = require('express'); -const router = express.Router(); - -var employeeService=require('./employee.service'); - - -// GET requests -router.get('/employees', (req, res) => { - - employeeService.getEmployees().then(data=>{ - if(!data) res.status(404).send("No employees found"); - - res.status(200).send(data); - }).catch(err=>{ - res.status(500).send(err); - }) - - -}); - -router.get('/roles', async (req, res) => { - - try{ - let roles= await employeeService.getRoles(); - if(!roles) res.status(404).send("No roles found"); - - return res.status(200).send(roles); - } catch(err){ - res.status(500).send(err); - } -}); - - - -module.exports = router; \ No newline at end of file diff --git a/server/features/employee/employee.controller.ts b/server/features/employee/employee.controller.ts new file mode 100644 index 00000000..327cef7e --- /dev/null +++ b/server/features/employee/employee.controller.ts @@ -0,0 +1,34 @@ +import * as express from 'express'; +const router = express.Router(); + +var employeeService = require('./employee.service'); + +// GET requests +router.get('/employees', (req, res) => { + + employeeService.getEmployees().then(data => { + if (!data) { + res.status(404).send('No employees found'); + } + + res.status(200).send(data); + }).catch(err => { + res.status(500).send(err); + }); +}); + +router.get('/roles', async (req, res) => { + + try { + const roles = await employeeService.getRoles(); + if (!roles) { + res.status(404).send('No roles found'); + } + + return res.status(200).send(roles); + } catch (err) { + res.status(500).send(err); + } +}); + +module.exports = router; diff --git a/server/features/employee/employee.service.js b/server/features/employee/employee.service.js deleted file mode 100644 index eb8202a2..00000000 --- a/server/features/employee/employee.service.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; - -var models = require('../../models'); - - -var employeeService={}; - - -//GET Section - -//GET list of projects with teamcount -employeeService.getEmployees= function(){ - try{ - return models.Employee.findAll({ - include: [{ - as: 'schedules', - model: models.Schedule - }, - ] - } - ) - }catch(e){ - console.log('fuck ',e) - } -} - -employeeService.getRoles= async ()=>{ - try{ - return await models.Role.findAll({ - order:[ - ['name','ASC'] - ] - }) - }catch(e){ - console.log('fuck ',e) - } -} - - - - - - - - -//POST Section - -//POST create new project - - - - - -module.exports = employeeService; - - \ No newline at end of file diff --git a/server/features/employee/employee.service.ts b/server/features/employee/employee.service.ts new file mode 100644 index 00000000..5bc932d9 --- /dev/null +++ b/server/features/employee/employee.service.ts @@ -0,0 +1,25 @@ +var models = require('../../models'); + +var employeeService = {}; + +// GET list of projects with teamcount +employeeService.getEmployees = () => { + return models.Employee.findAll({ + include: [{ + as: 'schedules', + model: models.Schedule + }, + ] + } + ) +}; + +employeeService.getRoles = async () => { + return await models.Role.findAll({ + order: [ + ['name', 'ASC'] + ] + }) +}; + +module.exports = employeeService; diff --git a/server/features/project/project.controller.js b/server/features/project/project.controller.js deleted file mode 100644 index 6049c5b3..00000000 --- a/server/features/project/project.controller.js +++ /dev/null @@ -1,139 +0,0 @@ -'use strict'; - -const express = require('express'); -const router = express.Router(); - -const { validationResult } = require('express-validator/check'); - - -var projectService=require('./project.service'); -var projectValidator=require('./project.validator'); - - -// GET requests -router.get('/projects', (req, res) => { - - projectService.getProjects().then(data=>{ - if(!data || !data.length) res.status(404).send("No projects found"); - - res.status(200).send(data); - }).catch(err=>{ - res.status(500).json({ errors: { er:{msg:err.message} }}); - }) - - -}); - -router.get('/projects/:id', (req, res) => { - projectService.getProject(req.params.id).then(data=>{ - if(!data) res.status(404).send("No projects found"); - - res.status(200).send(data); - }).catch(err=>{ - res.status(500).json({ errors: { er:{msg:error.message} }}); - }) -}); - - -router.get('/projects/history/:name', (req, res) => { - projectService.getProjectsByName(req.params.name).then(data=>{ - if(!data || !data.length) res.status(404).send("No projects found"); - - res.status(200).send(data); - }).catch(err=>{ - res.status(500).send({ errors: { er:{msg:error.message} }}); - }) -}); - - -//POST Requests -router.post('/projects/create', projectValidator.createValidators(),(req, res) => { - - const errors = validationResult(req); - if (!errors.isEmpty()) { - return res.status(422).json({ errors: errors.mapped() }); - } - - return projectService.doesProjectExist(req.body.name).then(doesExist=>{ - if(doesExist){ - res.status(409).json({ errors: { latest:{msg:'Project already exists or was archieved'} }}); - }else{ - projectService.createProject(req.body).then(project=>{ - res.status(200).send(project); - }).catch(error=>{ - res.status(500).json({ errors: { er:{msg:error.message} }}); - }) - } - }).catch(error=>{ - res.status(500).json({ errors: { er:{msg:error.message} }}); - }) -}) - -router.post('/projects/update', projectValidator.createValidators(),(req, res, next) => { - - const errors = validationResult(req); - if (!errors.isEmpty()) { - return res.status(422).json({ errors: errors.mapped() }); - } - - return projectService.isProjectLatest(req.body.id).then(isLatest=>{ - if(!isLatest){ - - res.status(409).json({ errors: { latest:{msg:'Somebody has already updated the project in background'} }}); - }else{ - projectService.updateProject(req.body).then(project=>{ - res.status(200).send(project); - }).catch(error=>{ - res.status(500).json({ errors: { er:{msg:error.message} }}); - }) - } - }).catch(error=>{ - res.status(500).json({ errors: { er:{ msg:error} }}); - }) -}) - - -//Put Requests -router.put('/projects/archieve', projectValidator.archieveValidators(), async (req, res, next) => { - - const errors = validationResult(req); - if (!errors.isEmpty()) { - return res.status(422).json({ errors: errors.mapped() }); - } - - try{ - let isLatest=await projectService.isProjectLatest(req.body.id); - if(isLatest){ - let project= await projectService.archieveProject(req.body.id); - res.status(200).send(project); - } else{ - res.status(409).json({ errors: { latest:{msg:'Somebody has already deleted the project in background'} }}); - } - - } catch(error){ - res.status(500).json({ errors: { er:{msg:error} }}); - } - -}) - -router.delete('/projects/delete/:name', projectValidator.deleteValidators(), async (req, res, next) => { - - const errors = validationResult(req); - if (!errors.isEmpty()) { - return res.status(422).json({ errors: errors.mapped() }); - } - - try{ - let response= await projectService.deleteProject(req.params.name); - res.status(200).json({message:'ok'}); - - } catch(error){ - console.log('from catch',response) - res.status(500).json({ errors: { er:{msg:error} }}); - } - -}) - - - -module.exports = router; \ No newline at end of file diff --git a/server/features/project/project.controller.ts b/server/features/project/project.controller.ts new file mode 100644 index 00000000..ea3023e6 --- /dev/null +++ b/server/features/project/project.controller.ts @@ -0,0 +1,125 @@ +import * as express from 'express'; + +const router = express.Router(); + +const {validationResult} = require('express-validator/check'); +var projectService = require('./project.service'); +var projectValidator = require('./project.validator'); + +// GET requests +router.get('/projects', (req, res) => { + + projectService.getProjects().then(data => { + if (!data || !data.length) { + res.status(404).send('No projects found'); + } + res.status(200).send(data); + }).catch(err => { + res.status(500).json({errors: {er: {msg: err.message}}}); + }); +}); + +router.get('/projects/:id', (req, res) => { + projectService.getProject(req.params.id).then(data => { + if (!data) { + res.status(404).send('No projects found'); + } + res.status(200).send(data); + }).catch(err => { + res.status(500).json({errors: {er: {msg: err.message}}}); + }); +}); + +router.get('/projects/history/:name', (req, res) => { + projectService.getProjectsByName(req.params.name).then(data => { + if (!data || !data.length) { + res.status(404).send('No projects found'); + } + res.status(200).send(data); + }).catch(err => { + res.status(500).send({errors: {er: {msg: err.message}}}); + }); +}); + +// POST Requests +router.post('/projects/create', projectValidator.createValidators(), (req, res) => { + + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(422).json({errors: errors.mapped()}); + } + + return projectService.doesProjectExist(req.body.name).then(doesExist => { + if (doesExist) { + res.status(409).json({errors: {latest: {msg: 'Project already exists or was archieved'}}}); + } else { + projectService.createProject(req.body).then(project => { + res.status(200).send(project); + }).catch(error => { + res.status(500).json({errors: {er: {msg: error.message}}}); + }); + } + }).catch(error => { + res.status(500).json({errors: {er: {msg: error.message}}}); + }); +}); + +router.post('/projects/update', projectValidator.createValidators(), (req, res, next) => { + + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(422).json({errors: errors.mapped()}); + } + + return projectService.isProjectLatest(req.body.id).then(isLatest => { + if (!isLatest) { + + res.status(409).json({errors: {latest: {msg: 'Somebody has already updated the project in background'}}}); + } else { + projectService.updateProject(req.body).then(project => { + res.status(200).send(project); + }).catch(error => { + res.status(500).json({errors: {er: {msg: error.message}}}); + }); + } + }).catch(error => { + res.status(500).json({errors: {er: {msg: error}}}); + }); +}); + +// Put Requests +router.put('/projects/archieve', projectValidator.archieveValidators(), async (req, res, next) => { + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(422).json({errors: errors.mapped()}); + } + + try { + const isLatest = await projectService.isProjectLatest(req.body.id); + if (isLatest) { + const project = await projectService.archieveProject(req.body.id); + res.status(200).send(project); + } else { + res.status(409).json({errors: {latest: {msg: 'Somebody has already deleted the project in background'}}}); + } + } catch (error) { + res.status(500).json({errors: {er: {msg: error}}}); + } +}); + +router.delete('/projects/delete/:name', projectValidator.deleteValidators(), async (req, res, next) => { + + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(422).json({errors: errors.mapped()}); + } + try { + const response = await projectService.deleteProject(req.params.name); + res.status(200).json({message: 'ok'}); + } catch (error) { + res.status(500).json({errors: {er: {msg: error}}}); + } + +}); + +module.exports = router; diff --git a/server/features/project/project.service.js b/server/features/project/project.service.js deleted file mode 100644 index 331b7f39..00000000 --- a/server/features/project/project.service.js +++ /dev/null @@ -1,249 +0,0 @@ -'use strict'; - -var models = require('../../models'); -var parse=require('../../shared/parse.service'); - -var projectService={}; - - -//GET Section - -//GET list of projects with teamcount -projectService.getProjects= function(){ - return models.Project.findAll({ - where: { ishistory: 0 }, - distinct:'name', - include: [{ - as: 'schedules', - model: models.Schedule - },{ - as:'technologies', - model: models.Technology - } - ], - order:[ - ['updatedAt','DESC'] - ] - } - ) -} - - - -//GET single project by id -projectService.getProject = function(id){ - - return models.Project.findOne({ - where: { - id: id, - ishistory:false - }, - include: [{ - as: 'schedules', - model: models.Schedule, - include: [{ - as: 'employee', - model: models.Employee - },{ - as: 'role', - model:models.Role - }] - },{ - as:'technologies', - model: models.Technology - }] - }) -} - - -//Get All Projects with same name -projectService.getProjectsByName = function(name){ - - return models.Project.findAll({ - where: { - name: name - }, - include: [{ - as: 'schedules', - model: models.Schedule, - include: [{ - as: 'employee', - model: models.Employee - },{ - as: 'role', - model:models.Role - }] - },{ - as:'technologies', - model: models.Technology - }], - order:[ - ['version','DESC'] - ] - }) -} - - -//GET check if project exists -projectService.doesProjectExist= function(name){ - - return models.Project.count({where: { name: name}}).then(count=>{ - if(count!=0){ - return true; - } else{ - return false; - } - }).catch(error=>{ - console.log(error); - }); -} - - -//GET Get latest project -projectService.isProjectLatest=function(id){ - return models.Project.findOne({ - where:{ - id:id - } - }).then(project=>{ - return project.ishistory ? false : true; - }).catch(error=>{ - console.log(error); - }); -} - - - -//POST create new project -projectService.createProject=function(Project){ - return models.Project.create({ - name: Project.name, - line: Project.line, - customer:Project.customer, - domain: Project.domain, - description:Project.description, - active:false, - startdate:Project.startdate, - enddate:Project.enddate, - pss:Project.pss, - program:Project.program, - feedback:Project.feedback, - image:Project.image, - type:Project.type, - ishistory:false, // default for new project - version:Project.version, // default for new project, - technologies:Project.technologies - }).then(function (project) { - - let technologies=parse.parseTechnology(Project.technologies); - let instances=technologies.map(tech=> { return models.Technology.build(tech) }); - project.setTechnologies(instances); - - let schedules=parse.parseShedules(project, Project.schedules); - models.Schedule.bulkCreate(schedules); - - - - return project; - }).catch(error=>{ - throw new Error(error); - }) -} - - -//POST request update Project -projectService.updateProject=function(Project){ - return models.sequelize.transaction().then(function(t){ - return models.Project.update( - { ishistory: true }, - { where: { id: Project.id }, transaction: t }, - ).then(project=>{ - return projectService.createProject(Project).then(project=>{ - t.commit(); - return project; - }).catch(error=>{ - console.log(error); - throw new Error(error); - return t.rollback(); - }) - }).catch(error=>{ - console.log(error); - throw new Error(error); - return t.rollback(); - }) - }).catch(error=>{ - console.log(error); - throw new Error(error); - }) - -} - - -//PUT request archieve project -projectService.archieveProject= async(id)=> { - try{ - let project=await models.Project.update( - { ishistory: true, - updatedAt:new Date() }, - { where: { id:id } } - ); - - return project; - } catch(e){ - console.log(e); - } -} - -projectService.deleteProject=async (name)=> { - try{ - let projects=await projectService.getProjectsByName(name); - projects.forEach(project=>{ - project.removeTechnologies(project.technologies); - models.Schedule.destroy({ where: {projectid:project.id }}); - }); - - let affectedRows=await models.Project.destroy({ where: {name:name},cascade:true }); - return affectedRows; - } catch(error){ - console.log(error) - throw new Error(error); - } -} - - -//PUT Save image -projectService.updateImage= (id,image)=> { - return models.Project.update( - { - image: image, - updatedAt:new Date() - }, - { - where: { id:id } - } - ).then(()=>{ - return projectService.getProject(id); - }); -} - -projectService.removeImage= (project)=> { - return models.Project.update( - { - image: project.image - }, - { - where: { name:project.name } - } - ).then(()=>{ - return projectService.getProject(project.id); - }); -} - - - - - - -module.exports = projectService; - - \ No newline at end of file diff --git a/server/features/project/project.service.ts b/server/features/project/project.service.ts new file mode 100644 index 00000000..043e8137 --- /dev/null +++ b/server/features/project/project.service.ts @@ -0,0 +1,231 @@ +var models = require('../../models'); +var parse = require('../../shared/parse.service'); + +var projectService = {}; + +// GET Section + +// GET list of projects with teamcount +projectService.getProjects = function () { + return models.Project.findAll({ + where: {ishistory: 0}, + distinct: 'name', + include: [{ + as: 'schedules', + model: models.Schedule + }, { + as: 'technologies', + model: models.Technology + } + ], + order: [ + ['updatedAt', 'DESC'] + ] + } + ); +}; + +// GET single project by id +projectService.getProject = function (id) { + + return models.Project.findOne({ + where: { + id: id, + ishistory: false + }, + include: [{ + as: 'schedules', + model: models.Schedule, + include: [{ + as: 'employee', + model: models.Employee + }, { + as: 'role', + model: models.Role + }] + }, { + as: 'technologies', + model: models.Technology + }] + }); +}; + +// Get All Projects with same name +projectService.getProjectsByName = function (name) { + + return models.Project.findAll({ + where: { + name: name + }, + include: [{ + as: 'schedules', + model: models.Schedule, + include: [{ + as: 'employee', + model: models.Employee + }, { + as: 'role', + model: models.Role + }] + }, { + as: 'technologies', + model: models.Technology + }], + order: [ + ['version', 'DESC'] + ] + }); +}; + +// GET check if project exists +projectService.doesProjectExist = function (name) { + + return models.Project.count({where: {name: name}}).then(count => { + if (count != 0) { + return true; + } else { + return false; + } + }).catch(error => { + console.log(error); + }); +}; + +// GET Get latest project +projectService.isProjectLatest = function (id) { + return models.Project.findOne({ + where: { + id: id + } + }).then(project => { + return project.ishistory ? false : true; + }).catch(error => { + console.log(error); + }); +}; + +// POST create new project +projectService.createProject = function (Project) { + return models.Project.create({ + name: Project.name, + line: Project.line, + customer: Project.customer, + domain: Project.domain, + description: Project.description, + active: false, + startdate: Project.startdate, + enddate: Project.enddate, + pss: Project.pss, + program: Project.program, + feedback: Project.feedback, + image: Project.image, + type: Project.type, + ishistory: false, // default for new project + version: Project.version, // default for new project, + technologies: Project.technologies + }).then(function (project) { + + const technologies = parse.parseTechnology(Project.technologies); + const instances = technologies.map(tech => { + return models.Technology.build(tech) + }); + project.setTechnologies(instances); + + const schedules = parse.parseShedules(project, Project.schedules); + models.Schedule.bulkCreate(schedules); + + return project; + }).catch(error => { + throw new Error(error); + }); +}; + +// POST request update Project +projectService.updateProject = function (Project) { + return models.sequelize.transaction().then(function (t) { + return models.Project.update( + {ishistory: true}, + {where: {id: Project.id}, transaction: t}, + ).then(project => { + return projectService.createProject(Project).then(project => { + t.commit(); + return project; + }).catch(error => { + console.log(error); + throw new Error(error); + return t.rollback(); + }) + }).catch(error => { + console.log(error); + throw new Error(error); + return t.rollback(); + }); + }).catch(error => { + console.log(error); + throw new Error(error); + }); + +}; + +// PUT request archieve project +projectService.archieveProject = async id => { + try { + const project = await models.Project.update( + { + ishistory: true, + updatedAt: new Date() + }, + {where: {id: id}} + ); + + return project; + } catch (e) { + console.log(e); + } +} + +projectService.deleteProject = async name => { + try { + const projects = await projectService.getProjectsByName(name); + projects.forEach(project => { + project.removeTechnologies(project.technologies); + models.Schedule.destroy({where: {projectid: project.id}}); + }); + + const affectedRows = await models.Project.destroy({where: {name: name}, cascade: true}); + return affectedRows; + } catch (error) { + console.log(error) + throw new Error(error); + } +}; + +// PUT Save image +projectService.updateImage = (id, image) => { + return models.Project.update( + { + image: image, + updatedAt: new Date() + }, + { + where: {id: id} + } + ).then(() => { + return projectService.getProject(id); + }); +}; + +projectService.removeImage = project => { + return models.Project.update( + { + image: project.image + }, + { + where: {name: project.name} + } + ).then(() => { + return projectService.getProject(project.id); + }); +}; + +module.exports = projectService; diff --git a/server/features/project/project.validator.js b/server/features/project/project.validator.js deleted file mode 100644 index 32293354..00000000 --- a/server/features/project/project.validator.js +++ /dev/null @@ -1,36 +0,0 @@ -'use strict'; - -const { check, validationResult } = require('express-validator/check'); -const { matchedData, sanitize } = require('express-validator/filter'); - - -var projectValidator={}; - -projectValidator.createValidators=function(){ - return [ - check('name','Field name is required').exists().isLength({ min: 1,max:100 }), - check('line','Field line is required').exists().isLength({ min: 1,max:100 }), - check('domain','Field domain is required').exists().isLength({ min: 1,max:100 }), - check('type','Field type is required').exists().isLength({ min: 1,max:100 }), - check('program','Field program is required').exists().isLength({ min: 1,max:100 }), - check('startdate','Field startdate is required').exists().isLength({ min: 1,max:100 }), - //check('enddate','Field startdate is required').isAfter() - ] -} - -projectValidator.archieveValidators=function(){ - return [ - check('id','Id is required').exists().isLength({ min: 1,max:100000 }), - check('id','Id has to be number').isNumeric() - ] -} - -projectValidator.deleteValidators=function(){ - return [ - check('name','Project name is required').exists().isLength({ min: 1,max:100000 }) - ] -} - - - -module.exports = projectValidator; \ No newline at end of file diff --git a/server/features/project/project.validator.ts b/server/features/project/project.validator.ts new file mode 100644 index 00000000..09602f60 --- /dev/null +++ b/server/features/project/project.validator.ts @@ -0,0 +1,28 @@ +const {check} = require('express-validator/check'); +var projectValidator = {}; + +projectValidator.createValidators = function () { + return [ + check('name', 'Field name is required').exists().isLength({min: 1, max: 100}), + check('line', 'Field line is required').exists().isLength({min: 1, max: 100}), + check('domain', 'Field domain is required').exists().isLength({min: 1, max: 100}), + check('type', 'Field type is required').exists().isLength({min: 1, max: 100}), + check('program', 'Field program is required').exists().isLength({min: 1, max: 100}), + check('startdate', 'Field startdate is required').exists().isLength({min: 1, max: 100}), + ]; +}; + +projectValidator.archieveValidators = function () { + return [ + check('id', 'Id is required').exists().isLength({min: 1, max: 100000}), + check('id', 'Id has to be number').isNumeric() + ]; +}; + +projectValidator.deleteValidators = function () { + return [ + check('name', 'Project name is required').exists().isLength({min: 1, max: 100000}) + ]; +}; + +module.exports = projectValidator; diff --git a/server/features/technology/technology.controller.js b/server/features/technology/technology.controller.js deleted file mode 100644 index ebc0fbb5..00000000 --- a/server/features/technology/technology.controller.js +++ /dev/null @@ -1,99 +0,0 @@ -const express = require('express'); -const router = express.Router(); -const { validationResult } = require('express-validator/check'); - -var technologyService=require('./technology.service'); -var technologyValidator=require('./technology.validator'); - -// GET requests -router.get('/technologies', (req, res) => { - - technologyService.getTechnologies().then(data=>{ - if(!data) res.status(404).send("No technologies found"); - - res.status(200).send(data); - }).catch(err=>{ - res.status(500).send(err); - }) - - -}); - -router.get('/technologies/exists/:name/:id?', (req, res) => { - - return technologyService.doesTechnologyExist(req.params.name,req.params.id).then(doesExist=>{ - console.log(doesExist) - res.status(200).send(doesExist); - }).catch(err=>{ - res.status(500).send(err); - }) -}); - - -//POST Requests -router.post('/technology/create', technologyValidator.createValidators(),(req, res) => { - - const errors = validationResult(req); - if (!errors.isEmpty()) { - return res.status(422).json({ errors: errors.mapped() }); - } - - return technologyService.doesTechnologyExist(req.body.name,req.body.id).then(doesExist=>{ - if(doesExist){ - res.status(409).json({ errors: { latest:{msg:'Technology already exists'} }}); - }else{ - technologyService.createTechnology(req.body).then(technology=>{ - res.status(200).send(technology); - }).catch(error=>{ - res.status(500).json({ errors: { er:{msg:error.message} }}); - }) - } - }).catch(error=>{ - res.status(500).json({ errors: { er:{msg:error.message} }}); - }) - }) - - router.post('/technology/update', technologyValidator.createValidators(), (req, res) => { - - const errors = validationResult(req); - if (!errors.isEmpty()) { - return res.status(422).json({ errors: errors.mapped() }); - } - - return technologyService.doesTechnologyExist(req.body.name,req.body.id).then(doesExist=>{ - if(doesExist){ - res.status(409).json({ errors: { latest:{msg:'Technology already exists'} }}); - }else{ - technologyService.updateTechnology(req.body).then(function(technology){ - res.status(200).send(technology); - }).catch(error=>{ - res.status(500).json({ errors: { er:{msg:error.message} }}); - }) - } - }).catch(error=>{ - res.status(500).json({ errors: { er:{msg:error.message} }}); - }) - }) - - - router.delete('/technology/delete/:id', technologyValidator.deleteValidators(), async (req, res, next) => { - - const errors = validationResult(req); - if (!errors.isEmpty()) { - return res.status(422).json({ errors: errors.mapped() }); - } - - try{ - let response= await technologyService.deleteTechnology(req.params.id); - res.status(200).json({message:'ok'}); - - } catch(error){ - console.log('from catch',response) - res.status(500).json({ errors: { er:{msg:error} }}); - } - -}) - - - -module.exports = router; \ No newline at end of file diff --git a/server/features/technology/technology.controller.ts b/server/features/technology/technology.controller.ts new file mode 100644 index 00000000..67a69452 --- /dev/null +++ b/server/features/technology/technology.controller.ts @@ -0,0 +1,93 @@ +import * as express from 'express'; + +const router = express.Router(); +const {validationResult} = require('express-validator/check'); + +var technologyService = require('./technology.service'); +var technologyValidator = require('./technology.validator'); + +// GET requests +router.get('/technologies', (req, res) => { + + technologyService.getTechnologies().then(data => { + if (!data) { + res.status(404).send('No technologies found'); + } + + res.status(200).send(data); + }).catch(err => { + res.status(500).send(err); + }); +}); + +router.get('/technologies/exists/:name/:id?', (req, res) => { + + return technologyService.doesTechnologyExist(req.params.name, req.params.id).then(doesExist => { + console.log(doesExist); + res.status(200).send(doesExist); + }).catch(err => { + res.status(500).send(err); + }); +}); + +// POST Requests +router.post('/technology/create', technologyValidator.createValidators(), (req, res) => { + + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(422).json({errors: errors.mapped()}); + } + + return technologyService.doesTechnologyExist(req.body.name, req.body.id).then(doesExist => { + if (doesExist) { + res.status(409).json({errors: {latest: {msg: 'Technology already exists'}}}); + } else { + technologyService.createTechnology(req.body).then(technology => { + res.status(200).send(technology); + }).catch(error => { + res.status(500).json({errors: {er: {msg: error.message}}}); + }); + } + }).catch(error => { + res.status(500).json({errors: {er: {msg: error.message}}}); + }); +}) + +router.post('/technology/update', technologyValidator.createValidators(), (req, res) => { + + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(422).json({errors: errors.mapped()}); + } + + return technologyService.doesTechnologyExist(req.body.name, req.body.id).then(doesExist => { + if (doesExist) { + res.status(409).json({errors: {latest: {msg: 'Technology already exists'}}}); + } else { + technologyService.updateTechnology(req.body).then(function (technology) { + res.status(200).send(technology); + }).catch(error => { + res.status(500).json({errors: {er: {msg: error.message}}}); + }); + } + }).catch(error => { + res.status(500).json({errors: {er: {msg: error.message}}}); + }); +}) + +router.delete('/technology/delete/:id', technologyValidator.deleteValidators(), async (req, res, next) => { + + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(422).json({errors: errors.mapped()}); + } + + try { + const response = await technologyService.deleteTechnology(req.params.id); + res.status(200).json({message: 'ok'}); + } catch (error) { + res.status(500).json({errors: {er: {msg: error}}}); + } +}); + +module.exports = router; diff --git a/server/features/technology/technology.service.js b/server/features/technology/technology.service.js deleted file mode 100644 index e082b1a7..00000000 --- a/server/features/technology/technology.service.js +++ /dev/null @@ -1,106 +0,0 @@ -'use strict'; - -var models = require('../../models'); -const Sequelize = require('sequelize'); -const op = Sequelize.Op; - -var technologyService={}; - - -//GET Section - -//GET list of projects with teamcount -technologyService.getTechnologies= function(){ - try{ - return models.Technology.findAll({ - order: [ - ['name', 'ASC'], - ] - // include: [{ - // as: 'schedules', - // model: models.Schedule - // }, - // ] - } - ) - }catch(e){ - console.log('fuck ',e) - } -} - - - -//GET single project by id - - - -//GET check if project exists -technologyService.doesTechnologyExist= function(name,id){ - id=id || ""; - return models.Technology.count({where: { name: name, id: { [ op.ne ]: id } }}).then(count=>{ - if(count!=0){ - return true; - } else{ - return false; - } - }).catch(error=>{ - console.log(error); - }); -} - - -//POST Section - -//POST create new technology -technologyService.createTechnology=function(Technology){ - return models.Technology.create({ - name: Technology.name, - domain:Technology.domain, - active:0, - image:Technology.image, - version:Technology.version || "" - - }).then(function (technology) { - - return technology; - }).catch(error=>{ - throw new Error(error); - }) -} - - -//PUT Update technology -technologyService.updateTechnology= function(Technology){ - return models.Technology.update({ - name: Technology.name, - domain:Technology.domain, - active:0, - image:Technology.image, - version:Technology.version || "" - }, { where: { id: Technology.id } } - ).then(function(technology){ - return technology; - }).catch(error=>{ - throw new Error(error); - }); -} - - - -technologyService.deleteTechnology=async (id)=> { - try{ - let technology= await models.Technology.findOne({ where: {id:id},include:[{as:'projects',model:models.Project}]}); - technology.removeProjects(technology.projects); - let affectedRows=await models.Technology.destroy({ where: {id:id},cascade:true }); - - return affectedRows; - } catch(error){ - console.log(error) - throw new Error(error); - } -} - - -module.exports = technologyService; - - \ No newline at end of file diff --git a/server/features/technology/technology.service.ts b/server/features/technology/technology.service.ts new file mode 100644 index 00000000..0d783adf --- /dev/null +++ b/server/features/technology/technology.service.ts @@ -0,0 +1,93 @@ +var models = require('../../models'); +const Sequelize = require('sequelize'); +const op = Sequelize.Op; + +var technologyService = {}; + +// GET Section + +// GET list of projects with teamcount +technologyService.getTechnologies = function () { + try { + return models.Technology.findAll({ + order: [ + ['name', 'ASC'], + ] + // include: [{ + // as: 'schedules', + // model: models.Schedule + // }, + // ] + } + ) + } catch (e) { + console.log('fuck ', e) + } +}; + +// GET check if project exists +technologyService.doesTechnologyExist = function (name, id) { + id = id || ''; + return models.Technology.count({where: {name: name, id: {[op.ne]: id}}}).then(count => { + if (count != 0) { + return true; + } else { + return false; + } + }).catch(error => { + console.log(error); + }); +} + + +// POST Section + +// POST create new technology +technologyService.createTechnology = function (Technology) { + return models.Technology.create({ + name: Technology.name, + domain: Technology.domain, + active: 0, + image: Technology.image, + version: Technology.version || '' + + }).then(function (technology) { + + return technology; + }).catch(error => { + throw new Error(error); + }) +}; + + +// PUT Update technology +technologyService.updateTechnology = function (Technology) { + return models.Technology.update({ + name: Technology.name, + domain: Technology.domain, + active: 0, + image: Technology.image, + version: Technology.version || '' + }, {where: {id: Technology.id}} + ).then(function (technology) { + return technology; + }).catch(error => { + throw new Error(error); + }); +}; + + +technologyService.deleteTechnology = async (id) => { + try { + let technology = await models.Technology.findOne({where: {id: id}, include: [{as: 'projects', model: models.Project}]}); + technology.removeProjects(technology.projects); + let affectedRows = await models.Technology.destroy({where: {id: id}, cascade: true}); + + return affectedRows; + } catch (error) { + console.log(error); + throw new Error(error); + } +}; + +module.exports = technologyService; diff --git a/server/features/technology/technology.validator.js b/server/features/technology/technology.validator.js deleted file mode 100644 index 6cb63c6a..00000000 --- a/server/features/technology/technology.validator.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -const { check, validationResult } = require('express-validator/check'); -const { matchedData, sanitize } = require('express-validator/filter'); - - -var technologyValidator={}; - -technologyValidator.createValidators=function(){ - return [ - check('name','Field name is required').exists().isLength({ min: 1,max:100 }), - //check('version','Field line is required').exists().isLength({ min: 1,max:100 }), - check('domain','Field domain is required').exists().isLength({ min: 1,max:100 }) - ] -} - -technologyValidator.deleteValidators=function(){ - return [ - check('id','Technology id is required').exists().isLength({ min: 1,max:100000 }) - ] -} - - - - - -module.exports = technologyValidator; \ No newline at end of file diff --git a/server/features/technology/technology.validator.ts b/server/features/technology/technology.validator.ts new file mode 100644 index 00000000..c01d7264 --- /dev/null +++ b/server/features/technology/technology.validator.ts @@ -0,0 +1,17 @@ +const {check} = require('express-validator/check'); +var technologyValidator = {}; + +technologyValidator.createValidators = function () { + return [ + check('name', 'Field name is required').exists().isLength({min: 1, max: 100}), + check('domain', 'Field domain is required').exists().isLength({min: 1, max: 100}) + ]; +}; + +technologyValidator.deleteValidators = function () { + return [ + check('id', 'Technology id is required').exists().isLength({min: 1, max: 100000}) + ]; +}; + +module.exports = technologyValidator; diff --git a/server/routes/api.js b/server/routes/api.js deleted file mode 100644 index 5207a884..00000000 --- a/server/routes/api.js +++ /dev/null @@ -1,15 +0,0 @@ -const express = require('express'); -const router = express.Router(); - -var models = require('../models'); - - -/* GET api listing. */ -router.get('/', (req, res) => { - - - - -}); - -module.exports = router; \ No newline at end of file diff --git a/server/routes/api.ts b/server/routes/api.ts new file mode 100644 index 00000000..4cf9bfbb --- /dev/null +++ b/server/routes/api.ts @@ -0,0 +1,9 @@ +import * as express from 'express'; +const router = express.Router(); + +var models = require('../models'); + +/* GET api listing. */ +router.get('/', (req, res) => {}); + +module.exports = router; diff --git a/server.js b/server/server.ts similarity index 78% rename from server.js rename to server/server.ts index 62b686dc..a2d951be 100644 --- a/server.js +++ b/server/server.ts @@ -1,7 +1,6 @@ - - // Get dependencies -const express = require('express'); +import * as express from 'express'; + const path = require('path'); //const https = require('https'); const http = require('http'); @@ -10,16 +9,15 @@ const validator = require('express-validator'); //const fs = require('fs'); // Get our API routes -const api = require('./server/routes/api'); +const api = require('./routes/api'); -const projectController = require('./server/features/project/project.controller'); -const technologyController = require('./server/features/technology/technology.controller'); -const employeeController = require('./server/features/employee/employee.controller'); -const fileController=require('./server/shared/file.controller'); +const projectController = require('./features/project/project.controller'); +const technologyController = require('./features/technology/technology.controller'); +const employeeController = require('./features/employee/employee.controller'); +const fileController = require('./shared/file.controller'); const app = express(); - // var sslOptions = { // key: fs.readFileSync('encryption/key.pem'), // cert: fs.readFileSync('encryption/cert.pem'), @@ -56,10 +54,6 @@ app.get('*', (req, res) => { const port = process.env.PORT || '3000'; app.set('port', port); - - - - /** * Create HTTP server. */ @@ -69,5 +63,3 @@ const server = http.createServer(app); * Listen on provided port, on all network interfaces. */ server.listen(port, () => console.log(`API running on localhost:${port}`)); - - diff --git a/server/shared/file.controller.js b/server/shared/file.controller.js deleted file mode 100644 index 191c999a..00000000 --- a/server/shared/file.controller.js +++ /dev/null @@ -1,110 +0,0 @@ - -'use strict'; -var path = require('path'); -var fs = require('fs'); -const DIST="server/images/"; -const express = require('express'); -const router = express.Router(); -var multer = require('multer'); -var projectService=require('../features/project/project.service'); - - - -var storage = multer.diskStorage({ - destination: function (req, file, cb) { - cb(null, DIST) - }, - filename: function (req, file, cb) { - cb(null, file.fieldname + '-' + req.body.name+path.extname(file.originalname)); - } -}) - -var upload = multer({ storage: storage }).single('image'); -//var pptx = require("pptxgenjs"); - -// POST requests -router.post('/images/add', function (req, res, next) { - upload(req, res, function (err) { - if (err) { - console.log(err) - return res.status(422).send(err) - } - - - - projectService.updateImage(req.body.id,req.file.filename).then(project=>{ - res.status(200).send(project.image); - }).catch(error=>{ - res.status(500).json({ errors: { er:{msg:error} }}); - }) - }); -}) - - -router.put('/images/remove', function (req, res, next) { - let image=DIST+req.body.image; - fs.exists(image, function(exists) { - if(exists) { - fs.unlink(image); - req.body.image=null; - projectService.removeImage(req.body).then(project=>{ - res.status(200).send(project); - }).catch(error=>{ - res.status(500).json({ errors: { er:{msg:error} }}); - }) - } else { - console.log(exists) - res.status(404).send('File not found.'); - } - }); -}) - - -router.get('/presentation/images/:id?', (req, res) => { - - projectService.getProject(req.params.id).then(project=>{ - if(!project) res.status(404).send("No projects found"); - - let dist='../images/presentation'; - - - let header=fs.readFileSync(path.join(__dirname, dist , 'Header.png')); - let header2=fs.readFileSync(path.join(__dirname, dist, 'Header2.png')); - let domain=fs.existsSync(path.join(__dirname, dist, project.domain +'.png')) ? - fs.readFileSync(path.join(__dirname, dist, project.domain +'.png')) : ''; - - - let image=fs.existsSync(path.join(__dirname, '../images', project.image || 'image.png')) ? - fs.readFileSync(path.join(__dirname, '../images', project.image)) : ''; - - let technologies=[] - for(let technology of project.technologies){ - if(fs.existsSync(path.join(__dirname, dist, technology.image || 'image.png'))){ - let tech=fs.readFileSync(path.join(__dirname, dist, technology.image)); - technologies.push({ - domain:technology.domain, - name:technology.name, - image:new Buffer(tech,'binary').toString('base64') - }); - } - } - - - let images={ - header:new Buffer(header,'binary').toString('base64'), - header2:new Buffer(header2,'binary').toString('base64'), - domain:new Buffer(domain,'binary').toString('base64'), - image: new Buffer(image,'binary').toString('base64'), - technologies:technologies - }; - - res.status(200).send(images); - }).catch(err=>{ - console.log(err) - res.status(500).json({ errors: { er:{msg:err} }}); - }) -}); - - - -module.exports = router; \ No newline at end of file diff --git a/server/shared/file.controller.ts b/server/shared/file.controller.ts new file mode 100644 index 00000000..90a46695 --- /dev/null +++ b/server/shared/file.controller.ts @@ -0,0 +1,107 @@ +import * as express from 'express'; + +var path = require('path'); +var fs = require('fs'); +const DIST = 'server/images/'; + +const router = express.Router(); +var multer = require('multer'); +var projectService = require('../features/project/project.service'); + + +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, DIST) + }, + filename: function (req, file, cb) { + cb(null, file.fieldname + '-' + req.body.name + path.extname(file.originalname)); + } +}) + +var upload = multer({storage: storage}).single('image'); +//var pptx = require("pptxgenjs"); + +// POST requests +router.post('/images/add', function (req, res, next) { + upload(req, res, function (err) { + if (err) { + console.log(err) + return res.status(422).send(err) + } + + + projectService.updateImage(req.body.id, req.file.filename).then(project => { + res.status(200).send(project.image); + }).catch(error => { + res.status(500).json({errors: {er: {msg: error}}}); + }) + }); +}) + + +router.put('/images/remove', function (req, res, next) { + let image = DIST + req.body.image; + fs.exists(image, function (exists) { + if (exists) { + fs.unlink(image); + req.body.image = null; + projectService.removeImage(req.body).then(project => { + res.status(200).send(project); + }).catch(error => { + res.status(500).json({errors: {er: {msg: error}}}); + }) + } else { + console.log(exists) + res.status(404).send('File not found.'); + } + }); +}) + + +router.get('/presentation/images/:id?', (req, res) => { + + projectService.getProject(req.params.id).then(project => { + if (!project) res.status(404).send('No projects found'); + + let dist = '../images/presentation'; + + + let header = fs.readFileSync(path.join(__dirname, dist, 'Header.png')); + let header2 = fs.readFileSync(path.join(__dirname, dist, 'Header2.png')); + let domain = fs.existsSync(path.join(__dirname, dist, project.domain + '.png')) ? + fs.readFileSync(path.join(__dirname, dist, project.domain + '.png')) : ''; + + + let image = fs.existsSync(path.join(__dirname, '../images', project.image || 'image.png')) ? + fs.readFileSync(path.join(__dirname, '../images', project.image)) : ''; + + let technologies = [] + for (let technology of project.technologies) { + if (fs.existsSync(path.join(__dirname, dist, technology.image || 'image.png'))) { + let tech = fs.readFileSync(path.join(__dirname, dist, technology.image)); + technologies.push({ + domain: technology.domain, + name: technology.name, + image: new Buffer(tech, 'binary').toString('base64') + }); + } + } + + + let images = { + header: new Buffer(header, 'binary').toString('base64'), + header2: new Buffer(header2, 'binary').toString('base64'), + domain: new Buffer(domain, 'binary').toString('base64'), + image: new Buffer(image, 'binary').toString('base64'), + technologies: technologies + }; + + res.status(200).send(images); + }).catch(err => { + console.log(err) + res.status(500).json({errors: {er: {msg: err}}}); + }) +}); + + +module.exports = router; diff --git a/server/shared/parse.service.js b/server/shared/parse.service.js deleted file mode 100644 index 6be178ab..00000000 --- a/server/shared/parse.service.js +++ /dev/null @@ -1,78 +0,0 @@ -'use strict'; - -var parseService={}; - - - -parseService.parseShedules=function(project,schedules){ - let parsed=[]; - if(Array.isArray(schedules)){ - for(let schedule of schedules){ - let s=JSON.parse(schedule); - - parsed.push( - { - projectid:project.id, - employeeid:s.employee.id, - roleid:s.role.id, - participation:s.participation, - } - ) - } - - } else{ - if(schedules){ - let s=JSON.parse(schedules); - parsed.push( - { - projectid:project.id, - employeeid:s.employee.id, - roleid:s.role.id, - participation:s.participation, - } - ) - } - } - - return parsed; -} - - -parseService.parseTechnology=function(technologies){ - let parsed=[]; - if(Array.isArray(technologies)){ - for(let tech of technologies){ - let t=JSON.parse(tech); - - parsed.push( - { - id:t.id, - name:t.name, - domain:t.domain, - active:0, - } - ) - } - - } else{ - if(technologies){ - let t=JSON.parse(technologies); - parsed.push( - { - id:t.id, - name:t.name, - domain:t.domain, - active:0, - } - ) - } - } - - return parsed; - -} - - -module.exports = parseService; - - \ No newline at end of file diff --git a/server/shared/parse.service.ts b/server/shared/parse.service.ts new file mode 100644 index 00000000..9d726b1e --- /dev/null +++ b/server/shared/parse.service.ts @@ -0,0 +1,70 @@ +var parseService = {}; + +parseService.parseShedules = function (project, schedules) { + const parsed = []; + if (Array.isArray(schedules)) { + for (const schedule of schedules) { + const s = JSON.parse(schedule); + + parsed.push( + { + projectid: project.id, + employeeid: s.employee.id, + roleid: s.role.id, + participation: s.participation, + } + ); + } + + } else { + if (schedules) { + const s = JSON.parse(schedules); + parsed.push( + { + projectid: project.id, + employeeid: s.employee.id, + roleid: s.role.id, + participation: s.participation, + } + ) + } + } + + return parsed; +}; + +parseService.parseTechnology = function (technologies) { + const parsed = []; + if (Array.isArray(technologies)) { + for (const tech of technologies) { + const t = JSON.parse(tech); + + parsed.push( + { + id: t.id, + name: t.name, + domain: t.domain, + active: 0 + } + ); + } + + } else { + if (technologies) { + const t = JSON.parse(technologies); + parsed.push( + { + id: t.id, + name: t.name, + domain: t.domain, + active: 0 + } + ); + } + } + + return parsed; + +}; + +module.exports = parseService; diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 4fcf2766..00000000 --- a/webpack.config.js +++ /dev/null @@ -1,425 +0,0 @@ -const path = require('path'); -const ProgressPlugin = require('webpack/lib/ProgressPlugin'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const autoprefixer = require('autoprefixer'); -const postcssUrl = require('postcss-url'); -const cssnano = require('cssnano'); - -const { NoEmitOnErrorsPlugin } = require('webpack'); -const { GlobCopyWebpackPlugin, BaseHrefWebpackPlugin } = require('@angular/cli/plugins/webpack'); -const { CommonsChunkPlugin } = require('webpack').optimize; -const { AotPlugin } = require('@ngtools/webpack'); - -const nodeModules = path.join(process.cwd(), 'node_modules'); -const entryPoints = ["inline","polyfills","sw-register","styles","vendor","main"]; -const minimizeCss = false; -const baseHref = ""; -const deployUrl = ""; -const postcssPlugins = function () { - // safe settings based on: https://github.com/ben-eb/cssnano/issues/358#issuecomment-283696193 - const importantCommentRe = /@preserve|@license|[@#]\s*source(?:Mapping)?URL|^!/i; - const minimizeOptions = { - autoprefixer: false, - safe: true, - mergeLonghand: false, - discardComments: { remove: (comment) => !importantCommentRe.test(comment) } - }; - return [ - postcssUrl({ - url: (URL) => { - // Only convert root relative URLs, which CSS-Loader won't process into require(). - if (!URL.startsWith('/') || URL.startsWith('//')) { - return URL; - } - if (deployUrl.match(/:\/\//)) { - // If deployUrl contains a scheme, ignore baseHref use deployUrl as is. - return `${deployUrl.replace(/\/$/, '')}${URL}`; - } - else if (baseHref.match(/:\/\//)) { - // If baseHref contains a scheme, include it as is. - return baseHref.replace(/\/$/, '') + - `/${deployUrl}/${URL}`.replace(/\/\/+/g, '/'); - } - else { - // Join together base-href, deploy-url and the original URL. - // Also dedupe multiple slashes into single ones. - return `/${baseHref}/${deployUrl}/${URL}`.replace(/\/\/+/g, '/'); - } - } - }), - autoprefixer(), - ].concat(minimizeCss ? [cssnano(minimizeOptions)] : []); - }; - - - - -module.exports = { - "devtool": "source-map", - "resolve": { - "extensions": [ - ".ts", - ".js" - ], - "modules": [ - "./node_modules" - ] - }, - "resolveLoader": { - "modules": [ - "./node_modules" - ] - }, - "entry": { - "main": [ - "./src/main.ts" - ], - "polyfills": [ - "./src/polyfills.ts" - ], - "styles": [ - "./src/assets/style/styles.less" - ] - }, - "output": { - "path": path.join(process.cwd(), "dist"), - "filename": "[name].bundle.js", - "chunkFilename": "[id].chunk.js" - }, - "module": { - "rules": [ - { - "enforce": "pre", - "test": /\.js$/, - "loader": "source-map-loader", - "exclude": [ - /\/node_modules\// - ] - }, - { - "test": /\.json$/, - "loader": "json-loader" - }, - { - "test": /\.html$/, - "loader": "raw-loader" - }, - { - "test": /\.(eot|svg)$/, - "loader": "file-loader?name=[name].[hash:20].[ext]" - }, - { - "test": /\.(jpg|png|gif|otf|ttf|woff|woff2|cur|ani)$/, - "loader": "url-loader?name=[name].[hash:20].[ext]&limit=10000" - }, - { - "exclude": [ - path.join(process.cwd(), "src/assets/style/styles.less") - ], - "test": /\.css$/, - "use": [ - "exports-loader?module.exports.toString()", - { - "loader": "css-loader", - "options": { - "sourceMap": false, - "importLoaders": 1 - } - }, - { - "loader": "postcss-loader", - "options": { - "ident": "postcss", - "plugins": postcssPlugins - } - } - ] - }, - { - "exclude": [ - path.join(process.cwd(), "src/assets/style/styles.less") - ], - "test": /\.scss$|\.sass$/, - "use": [ - "exports-loader?module.exports.toString()", - { - "loader": "css-loader", - "options": { - "sourceMap": false, - "importLoaders": 1 - } - }, - { - "loader": "postcss-loader", - "options": { - "ident": "postcss", - "plugins": postcssPlugins - } - }, - { - "loader": "sass-loader", - "options": { - "sourceMap": false, - "precision": 8, - "includePaths": [] - } - } - ] - }, - { - "exclude": [ - path.join(process.cwd(), "src/assets/style/styles.less") - ], - "test": /\.less$/, - "use": [ - "exports-loader?module.exports.toString()", - { - "loader": "css-loader", - "options": { - "sourceMap": false, - "importLoaders": 1 - } - }, - { - "loader": "postcss-loader", - "options": { - "ident": "postcss", - "plugins": postcssPlugins - } - }, - { - "loader": "less-loader", - "options": { - "sourceMap": false - } - } - ] - }, - { - "exclude": [ - path.join(process.cwd(), "src/assets/style/styles.less") - ], - "test": /\.styl$/, - "use": [ - "exports-loader?module.exports.toString()", - { - "loader": "css-loader", - "options": { - "sourceMap": false, - "importLoaders": 1 - } - }, - { - "loader": "postcss-loader", - "options": { - "ident": "postcss", - "plugins": postcssPlugins - } - }, - { - "loader": "stylus-loader", - "options": { - "sourceMap": false, - "paths": [] - } - } - ] - }, - { - "include": [ - path.join(process.cwd(), "src/assets/style/styles.less") - ], - "test": /\.css$/, - "use": [ - "style-loader", - { - "loader": "css-loader", - "options": { - "sourceMap": false, - "importLoaders": 1 - } - }, - { - "loader": "postcss-loader", - "options": { - "ident": "postcss", - "plugins": postcssPlugins - } - } - ] - }, - { - "include": [ - path.join(process.cwd(), "src/assets/style/styles.less") - ], - "test": /\.scss$|\.sass$/, - "use": [ - "style-loader", - { - "loader": "css-loader", - "options": { - "sourceMap": false, - "importLoaders": 1 - } - }, - { - "loader": "postcss-loader", - "options": { - "ident": "postcss", - "plugins": postcssPlugins - } - }, - { - "loader": "sass-loader", - "options": { - "sourceMap": false, - "precision": 8, - "includePaths": [] - } - } - ] - }, - { - "include": [ - path.join(process.cwd(), "src/assets/style/styles.less") - ], - "test": /\.less$/, - "use": [ - "style-loader", - { - "loader": "css-loader", - "options": { - "sourceMap": false, - "importLoaders": 1 - } - }, - { - "loader": "postcss-loader", - "options": { - "ident": "postcss", - "plugins": postcssPlugins - } - }, - { - "loader": "less-loader", - "options": { - "sourceMap": false - } - } - ] - }, - { - "include": [ - path.join(process.cwd(), "src/assets/style/styles.less") - ], - "test": /\.styl$/, - "use": [ - "style-loader", - { - "loader": "css-loader", - "options": { - "sourceMap": false, - "importLoaders": 1 - } - }, - { - "loader": "postcss-loader", - "options": { - "ident": "postcss", - "plugins": postcssPlugins - } - }, - { - "loader": "stylus-loader", - "options": { - "sourceMap": false, - "paths": [] - } - } - ] - }, - { - "test": /\.ts$/, - "loader": "@ngtools/webpack" - } - ] - }, - "plugins": [ - new NoEmitOnErrorsPlugin(), - new GlobCopyWebpackPlugin({ - "patterns": [ - "assets", - "favicon.ico" - ], - "globOptions": { - "cwd": "/Users/arturfedorov/Documents/VS Code Projects/Portfolio/src", - "dot": true, - "ignore": "**/.gitkeep" - } - }), - new ProgressPlugin(), - new HtmlWebpackPlugin({ - "template": "./src/index.html", - "filename": "./index.html", - "hash": false, - "inject": true, - "compile": true, - "favicon": false, - "minify": false, - "cache": true, - "showErrors": true, - "chunks": "all", - "excludeChunks": [], - "title": "Webpack App", - "xhtml": true, - "chunksSortMode": function sort(left, right) { - let leftIndex = entryPoints.indexOf(left.names[0]); - let rightindex = entryPoints.indexOf(right.names[0]); - if (leftIndex > rightindex) { - return 1; - } - else if (leftIndex < rightindex) { - return -1; - } - else { - return 0; - } - } - }), - new BaseHrefWebpackPlugin({}), - new CommonsChunkPlugin({ - "name": "inline", - "minChunks": null - }), - new CommonsChunkPlugin({ - "name": "vendor", - "minChunks": (module) => module.resource && module.resource.startsWith(nodeModules), - "chunks": [ - "main" - ] - }), - new AotPlugin({ - "mainPath": "main.ts", - "hostReplacementPaths": { - "environments/environment.ts": "environments/environment.ts" - }, - "exclude": [], - "tsConfigPath": "src/tsconfig.app.json", - "skipCodeGeneration": true - }) - ], - "node": { - "fs": "empty", - "global": true, - "crypto": "empty", - "tls": "empty", - "net": "empty", - "process": true, - "module": false, - "clearImmediate": false, - "setImmediate": false - }, - "devServer": { - "historyApiFallback": true - } -}; From c511bfef909ee662041c4477716d6c7f9725473c Mon Sep 17 00:00:00 2001 From: iminin Date: Fri, 9 Feb 2018 21:04:20 +0300 Subject: [PATCH 003/270] Refactoring of services for TypeScript --- .../features/employee/employee.controller.ts | 4 +- server/features/employee/employee.service.ts | 29 +- server/features/project/project.controller.ts | 7 +- server/features/project/project.service.ts | 378 +++++++++--------- server/features/project/project.validator.ts | 48 +-- .../technology/technology.controller.ts | 7 +- .../features/technology/technology.service.ts | 143 +++---- .../technology/technology.validator.ts | 27 +- server/routes/api.ts | 2 - server/shared/file.controller.ts | 60 ++- server/shared/parse.service.ts | 116 +++--- 11 files changed, 399 insertions(+), 422 deletions(-) diff --git a/server/features/employee/employee.controller.ts b/server/features/employee/employee.controller.ts index 327cef7e..490f6e25 100644 --- a/server/features/employee/employee.controller.ts +++ b/server/features/employee/employee.controller.ts @@ -1,7 +1,7 @@ import * as express from 'express'; -const router = express.Router(); +import employeeService from './employee.service'; -var employeeService = require('./employee.service'); +const router = express.Router(); // GET requests router.get('/employees', (req, res) => { diff --git a/server/features/employee/employee.service.ts b/server/features/employee/employee.service.ts index 5bc932d9..82dc2d0f 100644 --- a/server/features/employee/employee.service.ts +++ b/server/features/employee/employee.service.ts @@ -1,25 +1,18 @@ -var models = require('../../models'); +import * as models from '../../models/index'; -var employeeService = {}; - -// GET list of projects with teamcount -employeeService.getEmployees = () => { - return models.Employee.findAll({ - include: [{ - as: 'schedules', - model: models.Schedule - }, - ] - } - ) -}; - -employeeService.getRoles = async () => { - return await models.Role.findAll({ +const employeeService = { + // GET list of projects with teamcount + getEmployees: () => models.Employee.findAll({ + include: [{ + as: 'schedules', + model: models.Schedule + }] + }), + getRoles: async () => await models.Role.findAll({ order: [ ['name', 'ASC'] ] }) }; -module.exports = employeeService; +export default employeeService; diff --git a/server/features/project/project.controller.ts b/server/features/project/project.controller.ts index ea3023e6..962108f2 100644 --- a/server/features/project/project.controller.ts +++ b/server/features/project/project.controller.ts @@ -1,11 +1,10 @@ import * as express from 'express'; +import {validationResult} from 'express-validator/check'; +import projectService from './project.service'; +import projectValidator from './project.validator'; const router = express.Router(); -const {validationResult} = require('express-validator/check'); -var projectService = require('./project.service'); -var projectValidator = require('./project.validator'); - // GET requests router.get('/projects', (req, res) => { diff --git a/server/features/project/project.service.ts b/server/features/project/project.service.ts index 043e8137..2a069ba9 100644 --- a/server/features/project/project.service.ts +++ b/server/features/project/project.service.ts @@ -1,231 +1,233 @@ -var models = require('../../models'); -var parse = require('../../shared/parse.service'); +import * as models from '../../models/index'; +import parse from '../../shared/parse.service'; -var projectService = {}; - -// GET Section +const projectService = { + // GET Section // GET list of projects with teamcount -projectService.getProjects = function () { - return models.Project.findAll({ - where: {ishistory: 0}, - distinct: 'name', - include: [{ - as: 'schedules', - model: models.Schedule - }, { - as: 'technologies', - model: models.Technology + getProjects: function () { + return models.Project.findAll({ + where: {ishistory: 0}, + distinct: 'name', + include: [{ + as: 'schedules', + model: models.Schedule + }, { + as: 'technologies', + model: models.Technology + } + ], + order: [ + ['updatedAt', 'DESC'] + ] } - ], - order: [ - ['updatedAt', 'DESC'] - ] - } - ); -}; + ); + }, // GET single project by id -projectService.getProject = function (id) { + getProject: function (id) { - return models.Project.findOne({ - where: { - id: id, - ishistory: false - }, - include: [{ - as: 'schedules', - model: models.Schedule, + return models.Project.findOne({ + where: { + id: id, + ishistory: false + }, include: [{ - as: 'employee', - model: models.Employee + as: 'schedules', + model: models.Schedule, + include: [{ + as: 'employee', + model: models.Employee + }, { + as: 'role', + model: models.Role + }] }, { - as: 'role', - model: models.Role + as: 'technologies', + model: models.Technology }] - }, { - as: 'technologies', - model: models.Technology - }] - }); -}; + }); + }, // Get All Projects with same name -projectService.getProjectsByName = function (name) { + getProjectsByName: function (name) { - return models.Project.findAll({ - where: { - name: name - }, - include: [{ - as: 'schedules', - model: models.Schedule, + return models.Project.findAll({ + where: { + name: name + }, include: [{ - as: 'employee', - model: models.Employee + as: 'schedules', + model: models.Schedule, + include: [{ + as: 'employee', + model: models.Employee + }, { + as: 'role', + model: models.Role + }] }, { - as: 'role', - model: models.Role - }] - }, { - as: 'technologies', - model: models.Technology - }], - order: [ - ['version', 'DESC'] - ] - }); -}; + as: 'technologies', + model: models.Technology + }], + order: [ + ['version', 'DESC'] + ] + }); + }, // GET check if project exists -projectService.doesProjectExist = function (name) { + doesProjectExist: function (name) { - return models.Project.count({where: {name: name}}).then(count => { - if (count != 0) { - return true; - } else { - return false; - } - }).catch(error => { - console.log(error); - }); -}; + return models.Project.count({where: {name: name}}).then(count => { + if (count != 0) { + return true; + } else { + return false; + } + }).catch(error => { + console.log(error); + }); + }, // GET Get latest project -projectService.isProjectLatest = function (id) { - return models.Project.findOne({ - where: { - id: id - } - }).then(project => { - return project.ishistory ? false : true; - }).catch(error => { - console.log(error); - }); -}; + isProjectLatest: function (id) { + return models.Project.findOne({ + where: { + id: id + } + }).then(project => { + return project.ishistory ? false : true; + }).catch(error => { + console.log(error); + }); + }, // POST create new project -projectService.createProject = function (Project) { - return models.Project.create({ - name: Project.name, - line: Project.line, - customer: Project.customer, - domain: Project.domain, - description: Project.description, - active: false, - startdate: Project.startdate, - enddate: Project.enddate, - pss: Project.pss, - program: Project.program, - feedback: Project.feedback, - image: Project.image, - type: Project.type, - ishistory: false, // default for new project - version: Project.version, // default for new project, - technologies: Project.technologies - }).then(function (project) { - - const technologies = parse.parseTechnology(Project.technologies); - const instances = technologies.map(tech => { - return models.Technology.build(tech) + createProject: function (Project) { + return models.Project.create({ + name: Project.name, + line: Project.line, + customer: Project.customer, + domain: Project.domain, + description: Project.description, + active: false, + startdate: Project.startdate, + enddate: Project.enddate, + pss: Project.pss, + program: Project.program, + feedback: Project.feedback, + image: Project.image, + type: Project.type, + ishistory: false, // default for new project + version: Project.version, // default for new project, + technologies: Project.technologies + }).then(function (project) { + + const technologies = parse.parseTechnology(Project.technologies); + const instances = technologies.map(tech => { + return models.Technology.build(tech) + }); + project.setTechnologies(instances); + + const schedules = parse.parseShedules(project, Project.schedules); + models.Schedule.bulkCreate(schedules); + + return project; + }).catch(error => { + throw new Error(error); }); - project.setTechnologies(instances); - - const schedules = parse.parseShedules(project, Project.schedules); - models.Schedule.bulkCreate(schedules); - - return project; - }).catch(error => { - throw new Error(error); - }); -}; + }, // POST request update Project -projectService.updateProject = function (Project) { - return models.sequelize.transaction().then(function (t) { - return models.Project.update( - {ishistory: true}, - {where: {id: Project.id}, transaction: t}, - ).then(project => { - return projectService.createProject(Project).then(project => { - t.commit(); - return project; + updateProject: function (Project) { + return models.sequelize.transaction().then(function (t) { + return models.Project.update( + {ishistory: true}, + {where: {id: Project.id}, transaction: t}, + ).then(project => { + return projectService.createProject(Project).then(project => { + t.commit(); + return project; + }).catch(error => { + console.log(error); + throw new Error(error); + return t.rollback(); + }) }).catch(error => { console.log(error); throw new Error(error); return t.rollback(); - }) + }); }).catch(error => { console.log(error); throw new Error(error); - return t.rollback(); }); - }).catch(error => { - console.log(error); - throw new Error(error); - }); -}; + }, // PUT request archieve project -projectService.archieveProject = async id => { - try { - const project = await models.Project.update( + archieveProject: async id => { + try { + const project = await models.Project.update( + { + ishistory: true, + updatedAt: new Date() + }, + {where: {id: id}} + ); + + return project; + } catch (e) { + console.log(e); + } + }, + + deleteProject: + async name => { + try { + const projects = await projectService.getProjectsByName(name); + projects.forEach(project => { + project.removeTechnologies(project.technologies); + models.Schedule.destroy({where: {projectid: project.id}}); + }); + + const affectedRows = await models.Project.destroy({where: {name: name}, cascade: true}); + return affectedRows; + } catch (error) { + console.log(error) + throw new Error(error); + } + }, + +// PUT Save image + updateImage: (id, image) => { + return models.Project.update( { - ishistory: true, + image: image, updatedAt: new Date() }, - {where: {id: id}} - ); - - return project; - } catch (e) { - console.log(e); - } -} - -projectService.deleteProject = async name => { - try { - const projects = await projectService.getProjectsByName(name); - projects.forEach(project => { - project.removeTechnologies(project.technologies); - models.Schedule.destroy({where: {projectid: project.id}}); + { + where: {id: id} + } + ).then(() => { + return projectService.getProject(id); }); - - const affectedRows = await models.Project.destroy({where: {name: name}, cascade: true}); - return affectedRows; - } catch (error) { - console.log(error) - throw new Error(error); - } -}; - -// PUT Save image -projectService.updateImage = (id, image) => { - return models.Project.update( - { - image: image, - updatedAt: new Date() - }, - { - where: {id: id} - } - ).then(() => { - return projectService.getProject(id); - }); -}; - -projectService.removeImage = project => { - return models.Project.update( - { - image: project.image - }, - { - where: {name: project.name} + }, + + removeImage: + project => { + return models.Project.update( + { + image: project.image + }, + { + where: {name: project.name} + } + ).then(() => { + return projectService.getProject(project.id); + }); } - ).then(() => { - return projectService.getProject(project.id); - }); }; -module.exports = projectService; +export default projectService; diff --git a/server/features/project/project.validator.ts b/server/features/project/project.validator.ts index 09602f60..7850e769 100644 --- a/server/features/project/project.validator.ts +++ b/server/features/project/project.validator.ts @@ -1,28 +1,30 @@ -const {check} = require('express-validator/check'); -var projectValidator = {}; +import {check} from 'express-validator/check'; -projectValidator.createValidators = function () { - return [ - check('name', 'Field name is required').exists().isLength({min: 1, max: 100}), - check('line', 'Field line is required').exists().isLength({min: 1, max: 100}), - check('domain', 'Field domain is required').exists().isLength({min: 1, max: 100}), - check('type', 'Field type is required').exists().isLength({min: 1, max: 100}), - check('program', 'Field program is required').exists().isLength({min: 1, max: 100}), - check('startdate', 'Field startdate is required').exists().isLength({min: 1, max: 100}), - ]; -}; +const projectValidator = { -projectValidator.archieveValidators = function () { - return [ - check('id', 'Id is required').exists().isLength({min: 1, max: 100000}), - check('id', 'Id has to be number').isNumeric() - ]; -}; + createValidators: function () { + return [ + check('name', 'Field name is required').exists().isLength({min: 1, max: 100}), + check('line', 'Field line is required').exists().isLength({min: 1, max: 100}), + check('domain', 'Field domain is required').exists().isLength({min: 1, max: 100}), + check('type', 'Field type is required').exists().isLength({min: 1, max: 100}), + check('program', 'Field program is required').exists().isLength({min: 1, max: 100}), + check('startdate', 'Field startdate is required').exists().isLength({min: 1, max: 100}), + ]; + }, + + archieveValidators: function () { + return [ + check('id', 'Id is required').exists().isLength({min: 1, max: 100000}), + check('id', 'Id has to be number').isNumeric() + ]; + }, -projectValidator.deleteValidators = function () { - return [ - check('name', 'Project name is required').exists().isLength({min: 1, max: 100000}) - ]; + deleteValidators: function () { + return [ + check('name', 'Project name is required').exists().isLength({min: 1, max: 100000}) + ]; + } }; -module.exports = projectValidator; +export default projectValidator; diff --git a/server/features/technology/technology.controller.ts b/server/features/technology/technology.controller.ts index 67a69452..41d1854c 100644 --- a/server/features/technology/technology.controller.ts +++ b/server/features/technology/technology.controller.ts @@ -1,10 +1,9 @@ import * as express from 'express'; +import technologyService from './technology.service'; +import technologyValidator from './technology.validator'; +import {validationResult} from 'express-validator/check'; const router = express.Router(); -const {validationResult} = require('express-validator/check'); - -var technologyService = require('./technology.service'); -var technologyValidator = require('./technology.validator'); // GET requests router.get('/technologies', (req, res) => { diff --git a/server/features/technology/technology.service.ts b/server/features/technology/technology.service.ts index 0d783adf..9bd91d4b 100644 --- a/server/features/technology/technology.service.ts +++ b/server/features/technology/technology.service.ts @@ -1,93 +1,82 @@ -var models = require('../../models'); -const Sequelize = require('sequelize'); -const op = Sequelize.Op; - -var technologyService = {}; - -// GET Section +import * as models from '../../models/index'; +import * as Sequelize from 'sequelize'; -// GET list of projects with teamcount -technologyService.getTechnologies = function () { - try { - return models.Technology.findAll({ - order: [ - ['name', 'ASC'], - ] - // include: [{ - // as: 'schedules', - // model: models.Schedule - // }, - // ] - } - ) - } catch (e) { - console.log('fuck ', e) - } -}; +const op = Sequelize.Op; -// GET check if project exists -technologyService.doesTechnologyExist = function (name, id) { - id = id || ''; - return models.Technology.count({where: {name: name, id: {[op.ne]: id}}}).then(count => { - if (count != 0) { - return true; - } else { - return false; +const technologyService = { + // GET Section + // GET list of projects with teamcount + getTechnologies: function () { + try { + return models.Technology.findAll({ + order: [ + ['name', 'ASC'], + ] + } + ); + } catch (e) { + console.log('fuck ', e); } - }).catch(error => { - console.log(error); - }); -} - - -// POST Section - -// POST create new technology -technologyService.createTechnology = function (Technology) { - return models.Technology.create({ - name: Technology.name, - domain: Technology.domain, - active: 0, - image: Technology.image, - version: Technology.version || '' - - }).then(function (technology) { - - return technology; - }).catch(error => { - throw new Error(error); - }) -}; + }, + // GET check if project exists + doesTechnologyExist: function (name, id) { + id = id || ''; + return models.Technology.count({where: {name: name, id: {[op.ne]: id}}}).then(count => { + if (count != 0) { + return true; + } else { + return false; + } + }).catch(error => { + console.log(error); + }); + }, + // POST Section -// PUT Update technology -technologyService.updateTechnology = function (Technology) { - return models.Technology.update({ + // POST create new technology + createTechnology: function (Technology) { + return models.Technology.create({ name: Technology.name, domain: Technology.domain, active: 0, image: Technology.image, version: Technology.version || '' - }, {where: {id: Technology.id}} - ).then(function (technology) { - return technology; - }).catch(error => { - throw new Error(error); - }); -}; + }).then(function (technology) { + + return technology; + }).catch(error => { + throw new Error(error); + }); + }, -technologyService.deleteTechnology = async (id) => { - try { - let technology = await models.Technology.findOne({where: {id: id}, include: [{as: 'projects', model: models.Project}]}); - technology.removeProjects(technology.projects); - let affectedRows = await models.Technology.destroy({where: {id: id}, cascade: true}); +// PUT Update technology + updateTechnology: function (Technology) { + return models.Technology.update({ + name: Technology.name, + domain: Technology.domain, + active: 0, + image: Technology.image, + version: Technology.version || '' + }, {where: {id: Technology.id}} + ).then(function (technology) { + return technology; + }).catch(error => { + throw new Error(error); + }); + }, - return affectedRows; - } catch (error) { - console.log(error); - throw new Error(error); + deleteTechnology: async id => { + try { + const technology = await models.Technology.findOne({where: {id: id}, include: [{as: 'projects', model: models.Project}]}); + technology.removeProjects(technology.projects); + return await models.Technology.destroy({where: {id: id}, cascade: true}); + } catch (error) { + console.log(error); + throw new Error(error); + } } }; -module.exports = technologyService; +export default technologyService; diff --git a/server/features/technology/technology.validator.ts b/server/features/technology/technology.validator.ts index c01d7264..f44167fb 100644 --- a/server/features/technology/technology.validator.ts +++ b/server/features/technology/technology.validator.ts @@ -1,17 +1,18 @@ -const {check} = require('express-validator/check'); -var technologyValidator = {}; +import {check} from 'express-validator/check'; -technologyValidator.createValidators = function () { - return [ - check('name', 'Field name is required').exists().isLength({min: 1, max: 100}), - check('domain', 'Field domain is required').exists().isLength({min: 1, max: 100}) - ]; -}; +const technologyValidator = { + createValidators: function () { + return [ + check('name', 'Field name is required').exists().isLength({min: 1, max: 100}), + check('domain', 'Field domain is required').exists().isLength({min: 1, max: 100}) + ]; + }, -technologyValidator.deleteValidators = function () { - return [ - check('id', 'Technology id is required').exists().isLength({min: 1, max: 100000}) - ]; + deleteValidators: function () { + return [ + check('id', 'Technology id is required').exists().isLength({min: 1, max: 100000}) + ]; + } }; -module.exports = technologyValidator; +export default technologyValidator; diff --git a/server/routes/api.ts b/server/routes/api.ts index 4cf9bfbb..f6966667 100644 --- a/server/routes/api.ts +++ b/server/routes/api.ts @@ -1,8 +1,6 @@ import * as express from 'express'; const router = express.Router(); -var models = require('../models'); - /* GET api listing. */ router.get('/', (req, res) => {}); diff --git a/server/shared/file.controller.ts b/server/shared/file.controller.ts index 90a46695..b437844e 100644 --- a/server/shared/file.controller.ts +++ b/server/shared/file.controller.ts @@ -1,15 +1,15 @@ import * as express from 'express'; +import * as path from 'path'; +import * as fs from 'fs'; +import * as multer from 'multer'; + +import projectService from '../features/project/project.service'; -var path = require('path'); -var fs = require('fs'); const DIST = 'server/images/'; const router = express.Router(); -var multer = require('multer'); -var projectService = require('../features/project/project.service'); - -var storage = multer.diskStorage({ +const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, DIST) }, @@ -18,29 +18,26 @@ var storage = multer.diskStorage({ } }) -var upload = multer({storage: storage}).single('image'); -//var pptx = require("pptxgenjs"); +const upload = multer({storage: storage}).single('image'); // POST requests router.post('/images/add', function (req, res, next) { upload(req, res, function (err) { if (err) { console.log(err) - return res.status(422).send(err) + return res.status(422).send(err); } - projectService.updateImage(req.body.id, req.file.filename).then(project => { res.status(200).send(project.image); }).catch(error => { res.status(500).json({errors: {er: {msg: error}}}); - }) + }); }); -}) - +}); router.put('/images/remove', function (req, res, next) { - let image = DIST + req.body.image; + const image = DIST + req.body.image; fs.exists(image, function (exists) { if (exists) { fs.unlink(image); @@ -49,36 +46,35 @@ router.put('/images/remove', function (req, res, next) { res.status(200).send(project); }).catch(error => { res.status(500).json({errors: {er: {msg: error}}}); - }) + }); } else { - console.log(exists) + console.log(exists); res.status(404).send('File not found.'); } }); -}) - +}); router.get('/presentation/images/:id?', (req, res) => { projectService.getProject(req.params.id).then(project => { - if (!project) res.status(404).send('No projects found'); - - let dist = '../images/presentation'; + if (!project) { + res.status(404).send('No projects found'); + } + const dist = '../images/presentation'; - let header = fs.readFileSync(path.join(__dirname, dist, 'Header.png')); - let header2 = fs.readFileSync(path.join(__dirname, dist, 'Header2.png')); - let domain = fs.existsSync(path.join(__dirname, dist, project.domain + '.png')) ? + const header = fs.readFileSync(path.join(__dirname, dist, 'Header.png')); + const header2 = fs.readFileSync(path.join(__dirname, dist, 'Header2.png')); + const domain = fs.existsSync(path.join(__dirname, dist, project.domain + '.png')) ? fs.readFileSync(path.join(__dirname, dist, project.domain + '.png')) : ''; - - let image = fs.existsSync(path.join(__dirname, '../images', project.image || 'image.png')) ? + const image = fs.existsSync(path.join(__dirname, '../images', project.image || 'image.png')) ? fs.readFileSync(path.join(__dirname, '../images', project.image)) : ''; - let technologies = [] - for (let technology of project.technologies) { + const technologies = []; + for (const technology of project.technologies) { if (fs.existsSync(path.join(__dirname, dist, technology.image || 'image.png'))) { - let tech = fs.readFileSync(path.join(__dirname, dist, technology.image)); + const tech = fs.readFileSync(path.join(__dirname, dist, technology.image)); technologies.push({ domain: technology.domain, name: technology.name, @@ -87,8 +83,7 @@ router.get('/presentation/images/:id?', (req, res) => { } } - - let images = { + const images = { header: new Buffer(header, 'binary').toString('base64'), header2: new Buffer(header2, 'binary').toString('base64'), domain: new Buffer(domain, 'binary').toString('base64'), @@ -100,8 +95,7 @@ router.get('/presentation/images/:id?', (req, res) => { }).catch(err => { console.log(err) res.status(500).json({errors: {er: {msg: err}}}); - }) + }); }); - module.exports = router; diff --git a/server/shared/parse.service.ts b/server/shared/parse.service.ts index 9d726b1e..fc915197 100644 --- a/server/shared/parse.service.ts +++ b/server/shared/parse.service.ts @@ -1,70 +1,70 @@ -var parseService = {}; +const parseService = { -parseService.parseShedules = function (project, schedules) { - const parsed = []; - if (Array.isArray(schedules)) { - for (const schedule of schedules) { - const s = JSON.parse(schedule); + parseShedules: function (project, schedules) { + const parsed = []; + if (Array.isArray(schedules)) { + for (const schedule of schedules) { + const s = JSON.parse(schedule); - parsed.push( - { - projectid: project.id, - employeeid: s.employee.id, - roleid: s.role.id, - participation: s.participation, - } - ); - } + parsed.push( + { + projectid: project.id, + employeeid: s.employee.id, + roleid: s.role.id, + participation: s.participation, + } + ); + } - } else { - if (schedules) { - const s = JSON.parse(schedules); - parsed.push( - { - projectid: project.id, - employeeid: s.employee.id, - roleid: s.role.id, - participation: s.participation, - } - ) + } else { + if (schedules) { + const s = JSON.parse(schedules); + parsed.push( + { + projectid: project.id, + employeeid: s.employee.id, + roleid: s.role.id, + participation: s.participation, + } + ); + } } - } - return parsed; -}; + return parsed; + }, -parseService.parseTechnology = function (technologies) { - const parsed = []; - if (Array.isArray(technologies)) { - for (const tech of technologies) { - const t = JSON.parse(tech); + parseTechnology: function (technologies) { + const parsed = []; + if (Array.isArray(technologies)) { + for (const tech of technologies) { + const t = JSON.parse(tech); - parsed.push( - { - id: t.id, - name: t.name, - domain: t.domain, - active: 0 - } - ); - } + parsed.push( + { + id: t.id, + name: t.name, + domain: t.domain, + active: 0 + } + ); + } - } else { - if (technologies) { - const t = JSON.parse(technologies); - parsed.push( - { - id: t.id, - name: t.name, - domain: t.domain, - active: 0 - } - ); + } else { + if (technologies) { + const t = JSON.parse(technologies); + parsed.push( + { + id: t.id, + name: t.name, + domain: t.domain, + active: 0 + } + ); + } } - } - - return parsed; + return parsed; + } }; -module.exports = parseService; +export default parseService; From 63c41b3bb9a03a6bad3dea6466f7ef80a444355b Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Sat, 10 Feb 2018 22:44:15 +0300 Subject: [PATCH 004/270] Less to Scss Changed all less file to scss file Added OnInit interface Removed animation from all pages When build - > Error cannot find fonts in styles/colors.scss --- .angular-cli.json | 4 +- .gitignore | 8 +- package-lock.json | 1119 +++-------------- ...nt.less => admin-container.component.scss} | 28 +- .../admin-container.component.ts | 3 +- ...mponent.less => admin-form.component.scss} | 52 +- ...mponent.less => admin-role.component.scss} | 32 +- .../admin-role/admin-role.component.ts | 4 +- ...t.less => admin-technology.component.scss} | 8 +- .../admin-technology.component.ts | 2 +- src/app/app.component.less | 9 - src/app/app.component.scss | 9 + src/app/app.component.ts | 6 +- src/app/controls/button/button.component.less | 67 - src/app/controls/button/button.component.scss | 67 + src/app/controls/button/button.component.ts | 10 +- ...component.less => checkbox.component.scss} | 25 +- .../controls/checkbox/checkbox.component.ts | 2 +- ...hip.component.less => chip.component.scss} | 14 +- src/app/controls/chip/chip.component.ts | 2 +- ...e.component.less => delete.component.scss} | 14 +- src/app/controls/delete/delete.component.ts | 2 +- ...component.less => dropdown.component.scss} | 20 +- .../controls/dropdown/dropdown.component.ts | 4 +- ...ponent.less => filter-item.component.scss} | 34 +- .../filter-item/filter-item.component.ts | 3 +- ...onent.less => filter-panel.component.scss} | 8 +- .../filter-panel/filter-panel.component.ts | 2 +- ...t.less => dynamic-question.component.scss} | 18 +- .../dynamic-question.component.ts | 6 +- ...orm.component.less => form.component.scss} | 0 src/app/controls/form/form.component.ts | 2 +- ...ut.component.less => input.component.scss} | 54 +- src/app/controls/input/input.component.ts | 17 +- ...omponent.less => list-item.component.scss} | 31 +- .../list/list-item/list-item.component.ts | 4 +- ...el.component.less => panel.component.scss} | 32 +- src/app/controls/panel/panel.component.ts | 2 +- ...r.component.less => slider.component.scss} | 10 +- src/app/controls/slider/slider.component.ts | 8 +- ...r.component.less => header.component.scss} | 28 +- src/app/core/header/header.component.ts | 2 +- ...r.component.less => loader.component.scss} | 0 src/app/core/loader/loader.component.ts | 3 +- ...nt.less => employee-picker.component.scss} | 6 +- .../employee-picker.component.ts | 8 +- ...ponent.less => new-project.component.scss} | 22 +- .../new-project/new-project.component.ts | 7 +- .../project-history.component.html | 2 +- ...nt.less => project-history.component.scss} | 12 +- .../project-history.component.ts | 18 +- ...onent.less => project-item.component.scss} | 26 +- .../project-item/project-item.component.ts | 8 +- .../project-list/project-list.component.html | 2 +- ...onent.less => project-list.component.scss} | 6 +- .../project-list/project-list.component.ts | 6 +- .../project-confirmation.component.less | 13 - .../project-confirmation.component.scss | 13 + .../project-confirmation.component.ts | 2 +- ...nent.less => project-modal.component.scss} | 16 +- .../project-modal/project-modal.component.ts | 6 +- .../project/project/project.component.html | 4 +- ....component.less => project.component.scss} | 34 +- .../project/project/project.component.ts | 13 +- ....less => technology-picker.component.scss} | 22 +- .../technology-picker.component.ts | 8 +- .../shared/backpanel/backpanel.component.html | 8 +- ...omponent.less => backpanel.component.scss} | 16 +- .../shared/backpanel/backpanel.component.ts | 4 +- ...r.component.less => footer.component.scss} | 12 +- src/app/shared/footer/footer.component.ts | 2 +- ...e.component.less => delete.component.scss} | 40 +- .../shared/modal/delete/delete.component.ts | 2 +- ...or.component.less => error.component.scss} | 26 +- src/app/shared/modal/error/error.component.ts | 2 +- ...ile.component.less => file.component.scss} | 20 +- src/app/shared/modal/file/file.component.ts | 10 +- ...al.component.less => modal.component.scss} | 18 +- src/app/shared/modal/modal.component.ts | 2 +- ...n.component.less => ribbon.component.scss} | 36 +- src/app/shared/ribbon/ribbon.component.ts | 2 +- src/assets/style/{colors.less => colors.scss} | 42 +- src/assets/style/mixins.less | 151 --- src/assets/style/mixins.scss | 151 +++ ....overrides.less => primeng.overrides.scss} | 81 +- src/assets/style/{styles.less => styles.scss} | 25 +- webpack.config.js | 22 +- 87 files changed, 955 insertions(+), 1746 deletions(-) rename src/app/admin/admin-container/{admin-container.component.less => admin-container.component.scss} (50%) rename src/app/admin/components/admin-form/{admin-form.component.less => admin-form.component.scss} (73%) rename src/app/admin/components/admin-role/{admin-role.component.less => admin-role.component.scss} (63%) rename src/app/admin/components/admin-technology/{admin-technology.component.less => admin-technology.component.scss} (63%) delete mode 100644 src/app/app.component.less create mode 100644 src/app/app.component.scss delete mode 100644 src/app/controls/button/button.component.less create mode 100644 src/app/controls/button/button.component.scss rename src/app/controls/checkbox/{checkbox.component.less => checkbox.component.scss} (75%) rename src/app/controls/chip/{chip.component.less => chip.component.scss} (75%) rename src/app/controls/delete/{delete.component.less => delete.component.scss} (67%) rename src/app/controls/dropdown/{dropdown.component.less => dropdown.component.scss} (63%) rename src/app/controls/filters/filter-item/{filter-item.component.less => filter-item.component.scss} (84%) rename src/app/controls/filters/filter-panel/{filter-panel.component.less => filter-panel.component.scss} (55%) rename src/app/controls/form/dynamic-question/{dynamic-question.component.less => dynamic-question.component.scss} (66%) rename src/app/controls/form/{form.component.less => form.component.scss} (100%) rename src/app/controls/input/{input.component.less => input.component.scss} (77%) rename src/app/controls/list/list-item/{list-item.component.less => list-item.component.scss} (76%) rename src/app/controls/panel/{panel.component.less => panel.component.scss} (78%) rename src/app/controls/slider/{slider.component.less => slider.component.scss} (81%) rename src/app/core/header/{header.component.less => header.component.scss} (61%) rename src/app/core/loader/{loader.component.less => loader.component.scss} (100%) rename src/app/features/employee/employee-picker/{employee-picker.component.less => employee-picker.component.scss} (54%) rename src/app/features/project/new-project/{new-project.component.less => new-project.component.scss} (79%) rename src/app/features/project/project-history/{project-history.component.less => project-history.component.scss} (70%) rename src/app/features/project/project-item/{project-item.component.less => project-item.component.scss} (77%) rename src/app/features/project/project-list/{project-list.component.less => project-list.component.scss} (64%) delete mode 100644 src/app/features/project/project-modal/project-confirmation/project-confirmation.component.less create mode 100644 src/app/features/project/project-modal/project-confirmation/project-confirmation.component.scss rename src/app/features/project/project-modal/{project-modal.component.less => project-modal.component.scss} (79%) rename src/app/features/project/project/{project.component.less => project.component.scss} (78%) rename src/app/features/technology/technology-picker/{technology-picker.component.less => technology-picker.component.scss} (66%) rename src/app/shared/backpanel/{backpanel.component.less => backpanel.component.scss} (71%) rename src/app/shared/footer/{footer.component.less => footer.component.scss} (78%) rename src/app/shared/modal/delete/{delete.component.less => delete.component.scss} (63%) rename src/app/shared/modal/error/{error.component.less => error.component.scss} (76%) rename src/app/shared/modal/file/{file.component.less => file.component.scss} (77%) rename src/app/shared/modal/{modal.component.less => modal.component.scss} (76%) rename src/app/shared/ribbon/{ribbon.component.less => ribbon.component.scss} (63%) rename src/assets/style/{colors.less => colors.scss} (63%) delete mode 100644 src/assets/style/mixins.less create mode 100644 src/assets/style/mixins.scss rename src/assets/style/{primeng.overrides.less => primeng.overrides.scss} (70%) rename src/assets/style/{styles.less => styles.scss} (63%) diff --git a/.angular-cli.json b/.angular-cli.json index efb433bb..fbd9514e 100644 --- a/.angular-cli.json +++ b/.angular-cli.json @@ -23,7 +23,7 @@ "../node_modules/primeng/resources/primeng.min.css", "../node_modules/primeng/resources/themes/omega/theme.css", "../node_modules/font-awesome/css/font-awesome.min.css", - "assets/style/styles.less" + "assets/style/styles.scss" ], "scripts": [], "environmentSource": "environments/environment.ts", @@ -55,7 +55,7 @@ } }, "defaults": { - "styleExt": "less", + "styleExt": "scss", "serve": { "port": 4200 }, diff --git a/.gitignore b/.gitignore index 54bfd200..e8e4db24 100644 --- a/.gitignore +++ b/.gitignore @@ -19,10 +19,7 @@ # IDE - VSCode .vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json +.vs # misc /.sass-cache @@ -40,3 +37,6 @@ testem.log # System Files .DS_Store Thumbs.db + +# db passwords +/server/config/* diff --git a/package-lock.json b/package-lock.json index 3dd98b02..65a42c2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -471,7 +471,8 @@ "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "ansicolors": { "version": "0.2.1", @@ -520,11 +521,6 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" - }, "are-we-there-yet": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", @@ -580,6 +576,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, "requires": { "arr-flatten": "1.1.0" } @@ -587,17 +584,8 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true }, "array-equal": { "version": "1.0.0", @@ -616,11 +604,6 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "array-slice": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", - "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=" - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -633,12 +616,14 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true }, "arraybuffer.slice": { "version": "0.0.6", @@ -788,7 +773,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, "requires": { "core-js": "2.5.1", "regenerator-runtime": "0.11.0" @@ -851,7 +835,8 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "base64-arraybuffer": { "version": "0.1.5", @@ -886,11 +871,6 @@ "tweetnacl": "0.14.5" } }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" - }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1048,6 +1028,7 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -1057,6 +1038,7 @@ "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, "requires": { "expand-range": "1.8.2", "preserve": "0.2.0", @@ -1305,6 +1287,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -1427,7 +1410,8 @@ "clone": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=" + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "dev": true }, "clone-deep": { "version": "0.3.0", @@ -1452,11 +1436,6 @@ } } }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - }, "cls-bluebird": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", @@ -1486,9 +1465,9 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codelyzer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-2.0.1.tgz", - "integrity": "sha1-0PcSH2eoQkyS0h07MfNkC4Pe+e0=", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-3.2.2.tgz", + "integrity": "sha512-VNvW9gRThsqRarEnLioiILd0Pdk0yCq/7cVgYvqHpC+3CHqfnrJfmXjoana7vzWfSis+9pODXofjCWX+nlU9Gw==", "dev": true, "requires": { "app-root-path": "2.0.1", @@ -1627,7 +1606,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.0", @@ -2127,11 +2107,6 @@ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2176,14 +2151,6 @@ } } }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "requires": { - "clone": "1.0.3" - } - }, "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", @@ -2240,11 +2207,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=" - }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -2260,14 +2222,6 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "detect-file": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", - "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", - "requires": { - "fs-exists-sync": "0.1.0" - } - }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -2447,14 +2401,6 @@ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "requires": { - "readable-stream": "1.1.14" - } - }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -2549,14 +2495,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" }, - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", - "requires": { - "once": "1.3.3" - } - }, "engine.io": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.2.tgz", @@ -2762,7 +2700,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escodegen": { "version": "1.9.0", @@ -2925,6 +2864,7 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, "requires": { "is-posix-bracket": "0.1.1" } @@ -2933,18 +2873,11 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, "requires": { "fill-range": "2.2.3" } }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "requires": { - "os-homedir": "1.0.2" - } - }, "exports-loader": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.4.tgz", @@ -3034,6 +2967,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, "requires": { "is-extglob": "1.0.0" } @@ -3055,15 +2989,6 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, - "fancy-log": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", - "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", - "requires": { - "chalk": "1.1.3", - "time-stamp": "1.1.0" - } - }, "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", @@ -3115,7 +3040,8 @@ "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true }, "fileset": { "version": "2.0.3", @@ -3156,6 +3082,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", @@ -3185,11 +3112,6 @@ } } }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=" - }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -3198,49 +3120,6 @@ "locate-path": "2.0.0" } }, - "findup-sync": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-1.0.0.tgz", - "integrity": "sha1-b35LV7buOkA3tEFOrt6j9Y9x4Ow=", - "requires": { - "detect-file": "0.1.0", - "is-glob": "2.0.1", - "micromatch": "2.3.11", - "resolve-dir": "0.1.1" - } - }, - "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", - "requires": { - "expand-tilde": "2.0.2", - "is-plain-object": "2.0.4", - "object.defaults": "1.1.0", - "object.pick": "1.3.0", - "parse-filepath": "1.0.1" - }, - "dependencies": { - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "requires": { - "homedir-polyfill": "1.0.1" - } - } - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" - }, - "flagged-respawn": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", - "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=" - }, "flatten": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", @@ -3255,12 +3134,14 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, "requires": { "for-in": "1.0.2" } @@ -3305,11 +3186,6 @@ "null-check": "1.0.0" } }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" - }, "fs-extra": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", @@ -3379,14 +3255,6 @@ } } }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "requires": { - "globule": "0.1.0" - } - }, "generate-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", @@ -3431,21 +3299,11 @@ "assert-plus": "1.0.0" } }, - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.3.3" - } - }, "glob-base": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, "requires": { "glob-parent": "2.0.0", "is-glob": "2.0.1" @@ -3455,61 +3313,11 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, "requires": { "is-glob": "2.0.1" } }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "requires": { - "glob": "4.5.3", - "glob2base": "0.0.12", - "minimatch": "2.0.10", - "ordered-read-streams": "0.1.0", - "through2": "0.6.5", - "unique-stream": "1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "requires": { - "gaze": "0.5.2" - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "requires": { - "find-index": "0.1.1" - } - }, "global-dirs": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.0.tgz", @@ -3519,26 +3327,6 @@ "ini": "1.3.4" } }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "requires": { - "global-prefix": "0.1.5", - "is-windows": "0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "requires": { - "homedir-polyfill": "1.0.1", - "ini": "1.3.4", - "is-windows": "0.2.0", - "which": "1.3.0" - } - }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -3590,60 +3378,6 @@ } } }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "requires": { - "glob": "3.1.21", - "lodash": "1.0.2", - "minimatch": "0.2.14" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "requires": { - "graceful-fs": "1.2.3", - "inherits": "1.0.2", - "minimatch": "0.2.14" - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=" - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=" - }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=" - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } - } - } - }, - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "requires": { - "sparkles": "1.0.0" - } - }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -3668,82 +3402,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, - "gulp": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", - "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", - "requires": { - "archy": "1.0.0", - "chalk": "1.1.3", - "deprecated": "0.0.1", - "gulp-util": "3.0.8", - "interpret": "1.0.4", - "liftoff": "2.3.0", - "minimist": "1.2.0", - "orchestrator": "0.3.8", - "pretty-hrtime": "1.0.3", - "semver": "4.3.6", - "tildify": "1.2.0", - "v8flags": "2.1.1", - "vinyl-fs": "0.3.14" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "gulp-help": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/gulp-help/-/gulp-help-1.6.1.tgz", - "integrity": "sha1-Jh2xhuGDl/7z9qLCLpwxW/qIrgw=", - "requires": { - "chalk": "1.1.3", - "object-assign": "3.0.0" - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.3", - "beeper": "1.1.1", - "chalk": "1.1.3", - "dateformat": "2.2.0", - "fancy-log": "1.3.0", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", - "replace-ext": "0.0.1", - "through2": "2.0.3", - "vinyl": "0.5.3" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "requires": { - "glogg": "1.0.0" - } - }, "handle-thing": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", @@ -3818,6 +3476,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -3843,14 +3502,6 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "requires": { - "sparkles": "1.0.0" - } - }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -3909,14 +3560,6 @@ "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "requires": { - "parse-passwd": "1.0.0" - } - }, "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", @@ -4315,6 +3958,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "1.3.3", "wrappy": "1.0.2" @@ -4407,7 +4051,8 @@ "interpret": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", - "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=" + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", + "dev": true }, "invariant": { "version": "2.2.2", @@ -4428,15 +4073,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" }, - "is-absolute": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", - "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", - "requires": { - "is-relative": "0.2.1", - "is-windows": "0.2.0" - } - }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -4465,7 +4101,8 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-builtin-module": { "version": "1.0.0", @@ -4484,7 +4121,8 @@ "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true }, "is-electron": { "version": "2.1.0", @@ -4495,6 +4133,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, "requires": { "is-primitive": "2.0.0" } @@ -4502,12 +4141,14 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true }, "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true }, "is-finite": { "version": "1.0.2", @@ -4530,6 +4171,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, "requires": { "is-extglob": "1.0.0" } @@ -4567,6 +4209,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, "requires": { "kind-of": "3.2.2" } @@ -4611,6 +4254,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, "requires": { "isobject": "3.0.1" }, @@ -4618,19 +4262,22 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true }, "is-promise": { "version": "2.1.0", @@ -4650,14 +4297,6 @@ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", "dev": true }, - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "requires": { - "is-unc-path": "0.1.2" - } - }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", @@ -4683,23 +4322,11 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "is-unc-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", - "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "requires": { - "unc-path-regex": "0.1.2" - } - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true }, "isarray": { "version": "0.0.1", @@ -4721,6 +4348,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, "requires": { "isarray": "1.0.0" }, @@ -4728,7 +4356,8 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true } } }, @@ -5471,6 +5100,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -5719,35 +5349,6 @@ "immediate": "3.0.6" } }, - "liftoff": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", - "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", - "requires": { - "extend": "3.0.1", - "findup-sync": "0.4.3", - "fined": "1.1.0", - "flagged-respawn": "0.3.2", - "lodash.isplainobject": "4.0.6", - "lodash.isstring": "4.0.1", - "lodash.mapvalues": "4.6.0", - "rechoir": "0.6.2", - "resolve": "1.5.0" - }, - "dependencies": { - "findup-sync": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", - "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", - "requires": { - "detect-file": "0.1.0", - "is-glob": "2.0.1", - "micromatch": "2.3.11", - "resolve-dir": "0.1.1" - } - } - } - }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -5810,17 +5411,8 @@ "lodash._basecopy": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true }, "lodash._bindcallback": { "version": "3.0.1", @@ -5842,32 +5434,14 @@ "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true }, "lodash._isiterateecall": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true }, "lodash.assign": { "version": "4.2.0", @@ -5911,49 +5485,29 @@ } } }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "requires": { - "lodash._root": "3.0.1" - } - }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true }, "lodash.isarray": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, "requires": { "lodash._getnative": "3.9.1", "lodash.isarguments": "3.1.0", "lodash.isarray": "3.0.4" } }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=" - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -5970,7 +5524,8 @@ "lodash.restparam": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true }, "lodash.tail": { "version": "4.1.1", @@ -5978,31 +5533,6 @@ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", "dev": true }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" - } - }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -6076,11 +5606,6 @@ "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", "dev": true }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, "lru-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", @@ -6127,11 +5652,6 @@ "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", "dev": true }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -6391,6 +5911,7 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, "requires": { "arr-diff": "2.0.0", "array-unique": "0.2.1", @@ -6456,6 +5977,8 @@ "version": "2.0.10", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "optional": true, "requires": { "brace-expansion": "1.1.8" } @@ -6524,14 +6047,6 @@ "xtend": "4.0.1" } }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "requires": { - "duplexer2": "0.0.2" - } - }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -6662,11 +6177,6 @@ "dev": true, "optional": true }, - "natives": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", - "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=" - }, "ncname": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", @@ -7123,6 +6633,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, "requires": { "remove-trailing-separator": "1.1.0" } @@ -7225,56 +6736,16 @@ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", "dev": true }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "requires": { - "array-each": "1.0.1", - "array-slice": "1.0.0", - "for-own": "1.0.0", - "isobject": "3.0.1" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "requires": { - "for-in": "1.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, "requires": { "for-own": "0.1.5", "is-extendable": "0.1.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, "obuf": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", @@ -7299,6 +6770,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, "requires": { "wrappy": "1.0.2" } @@ -7366,21 +6838,6 @@ "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", "dev": true }, - "orchestrator": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", - "requires": { - "end-of-stream": "0.1.5", - "sequencify": "0.0.7", - "stream-consume": "0.1.0" - } - }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=" - }, "original": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", @@ -7411,7 +6868,8 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, "os-locale": { "version": "2.1.0", @@ -7509,20 +6967,11 @@ "pbkdf2": "3.0.14" } }, - "parse-filepath": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", - "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", - "requires": { - "is-absolute": "0.2.6", - "map-cache": "0.2.2", - "path-root": "0.1.1" - } - }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, "requires": { "glob-base": "0.3.0", "is-dotfile": "1.0.3", @@ -7538,11 +6987,6 @@ "error-ex": "1.3.1" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, "parse5": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", @@ -7613,19 +7057,6 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "requires": { - "path-root-regex": "0.1.2" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" - }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -8480,7 +7911,8 @@ "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true }, "pretty-error": { "version": "2.1.1", @@ -8492,11 +7924,6 @@ "utila": "0.4.0" } }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" - }, "primeng": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/primeng/-/primeng-4.3.0.tgz", @@ -8735,6 +8162,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -8744,6 +8172,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -8752,6 +8181,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -8762,6 +8192,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -8912,19 +8343,6 @@ } } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "1.5.0" - } - }, - "redefine": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/redefine/-/redefine-0.2.1.tgz", - "integrity": "sha1-6J7npvJNGf/2JZBWkzLcYDgKiaM=" - }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -9002,13 +8420,13 @@ "regenerator-runtime": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", - "dev": true + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" }, "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, "requires": { "is-equal-shallow": "0.1.3" } @@ -9067,7 +8485,8 @@ "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, "renderkid": { "version": "2.0.1", @@ -9093,12 +8512,14 @@ "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "repeating": { "version": "2.0.1", @@ -9109,11 +8530,6 @@ "is-finite": "1.0.2" } }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, "request": { "version": "2.83.0", "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", @@ -9173,15 +8589,6 @@ "path-parse": "1.0.5" } }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "requires": { - "expand-tilde": "1.2.2", - "global-modules": "0.2.3" - } - }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -9705,29 +9112,33 @@ } }, "sequelize-cli": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-2.8.0.tgz", - "integrity": "sha1-QwTM5g5JkWlgP4ON7bq0IcmEnnQ=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-3.2.0.tgz", + "integrity": "sha1-wBMzqYrTZGaXJiS7USId0MWgLfU=", "requires": { "bluebird": "3.5.1", "cli-color": "1.2.0", - "findup-sync": "1.0.0", "fs-extra": "4.0.2", - "gulp": "3.9.1", - "gulp-help": "1.6.1", "js-beautify": "1.7.4", "lodash": "4.17.4", - "moment": "2.19.2", "resolve": "1.5.0", - "umzug": "1.12.0", + "umzug": "2.1.0", "yargs": "8.0.2" + }, + "dependencies": { + "umzug": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.1.0.tgz", + "integrity": "sha512-BgT+ekpItEWaG+3JjLLj6yVTxw2wIH8Cr6JyKYIzukWAx9nzGhC6BGHb/IRMjpobMM1qtIrReATwLUjKpU2iOQ==", + "requires": { + "babel-runtime": "6.26.0", + "bluebird": "3.5.1", + "lodash": "4.17.4", + "resolve": "1.5.0" + } + } } }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=" - }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -10108,11 +9519,6 @@ "source-map": "0.5.7" } }, - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" - }, "spdx-correct": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", @@ -10327,11 +9733,6 @@ "duplexer": "0.1.1" } }, - "stream-consume": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", - "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=" - }, "stream-http": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", @@ -10435,15 +9836,6 @@ "ansi-regex": "2.1.1" } }, - "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", - "requires": { - "first-chunk-stream": "1.0.0", - "is-utf8": "0.2.1" - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -10542,7 +9934,8 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true }, "svgo": { "version": "0.7.2", @@ -10635,57 +10028,6 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "requires": { - "os-homedir": "1.0.2" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" - }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -10897,46 +10239,51 @@ "integrity": "sha512-ymKWWZJST0/CkgduC2qkzjMOWr4bouhuURNXCn/inEX0L57BnRG6FhX76o7FOnsjHazCjfU2LKeSrlS2sIKQJg==" }, "tslint": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-4.5.1.tgz", - "integrity": "sha1-BTVocb7yOkNJBnNABvwYgza6gks=", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", + "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", "dev": true, "requires": { "babel-code-frame": "6.26.0", - "colors": "1.1.2", + "builtin-modules": "1.1.1", + "chalk": "2.3.0", + "commander": "2.14.1", "diff": "3.4.0", - "findup-sync": "0.3.0", "glob": "7.1.2", - "optimist": "0.6.1", + "js-yaml": "3.7.0", + "minimatch": "3.0.4", "resolve": "1.5.0", - "tsutils": "1.9.1", - "update-notifier": "2.3.0" + "semver": "5.5.0", + "tslib": "1.8.0", + "tsutils": "2.21.0" }, "dependencies": { - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "glob": "5.0.15" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.3.3", - "path-is-absolute": "1.0.1" - } - } + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" } }, + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -10949,43 +10296,57 @@ "minimatch": "3.0.4", "once": "1.3.3", "path-is-absolute": "1.0.1" - }, - "dependencies": { - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - } } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" + "brace-expansion": "1.1.8" } }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "tsutils": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.21.0.tgz", + "integrity": "sha512-zlOHTYtTwvTiKxUyAU8wiKzPpAgwZrGjb7AY18VUlxuCgBiTMVorIl5HjrCT8V64Hm34RI1BZITJMVQpBLMxVg==", + "dev": true, + "requires": { + "tslib": "1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "dev": true + } + } } } }, - "tsutils": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", - "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", - "dev": true - }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -11065,23 +10426,6 @@ "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", "dev": true }, - "umzug": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-1.12.0.tgz", - "integrity": "sha1-p5yR8oYu7jEwxsNH8rkK1opm6Lg=", - "requires": { - "bluebird": "3.5.1", - "lodash": "4.17.4", - "moment": "2.19.2", - "redefine": "0.2.1", - "resolve": "1.5.0" - } - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" - }, "undefsafe": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", @@ -11114,11 +10458,6 @@ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, - "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=" - }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", @@ -11270,7 +10609,8 @@ "user-home": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true }, "useragent": { "version": "2.2.1", @@ -11332,6 +10672,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, "requires": { "user-home": "1.1.1" } @@ -11371,75 +10712,6 @@ "extsprintf": "1.3.0" } }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "requires": { - "clone": "1.0.3", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", - "requires": { - "defaults": "1.0.3", - "glob-stream": "3.1.18", - "glob-watcher": "0.0.6", - "graceful-fs": "3.0.11", - "mkdirp": "0.5.1", - "strip-bom": "1.0.0", - "through2": "0.6.5", - "vinyl": "0.4.6" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "requires": { - "natives": "1.1.0" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" - } - } - } - }, "vlq": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", @@ -12212,7 +11484,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write-file-atomic": { "version": "2.3.0", diff --git a/src/app/admin/admin-container/admin-container.component.less b/src/app/admin/admin-container/admin-container.component.scss similarity index 50% rename from src/app/admin/admin-container/admin-container.component.less rename to src/app/admin/admin-container/admin-container.component.scss index 72366032..50839a9a 100644 --- a/src/app/admin/admin-container/admin-container.component.less +++ b/src/app/admin/admin-container/admin-container.component.scss @@ -1,11 +1,11 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; .admin-container{ display: block; position: absolute; - background-color: @grey_bg; + background-color: $grey_bg; height: 100%; top: 60px; @@ -13,26 +13,26 @@ padding: 20px 40px 0 40px; width:100%; - .boxSizing(); + @include boxSizing(); } .navigation{ - background-color: @text_white; + background-color: $text_white; width: 100%; height: 40px; - .boxShadow(0 3px 3px 0 rgba(0,0,0,0.50)); - .boxSizing(); - .flex-display(); - .align-items(center); + @include boxShadow(0 3px 3px 0 rgba(0,0,0,0.50)); + @include boxSizing(); + @include flex-display(); + @include align-items(center); &__link{ - border-right: 1px solid @border; + border-right: 1px solid $border; font-family: ProximaRegularLight; font-size: 16px; - color:@text_navigation; + color:$text_navigation; height: 100%; line-height: 40px; vertical-align: middle; @@ -40,12 +40,12 @@ padding: 0 10px; text-decoration: none; - .boxSizing(); - .transition(all .3s); + @include boxSizing(); + @include transition(all .3s); &:hover,&--active{ background-color: #8FCFF9; - color:@text_white; + color:$text_white; } } } \ No newline at end of file diff --git a/src/app/admin/admin-container/admin-container.component.ts b/src/app/admin/admin-container/admin-container.component.ts index 72c988b4..eb43d5d8 100644 --- a/src/app/admin/admin-container/admin-container.component.ts +++ b/src/app/admin/admin-container/admin-container.component.ts @@ -3,9 +3,10 @@ import {Component} from '@angular/core'; @Component({ selector: 'admin-container', templateUrl: './admin-container.component.html', - styleUrls: ['./admin-container.component.less'], + styleUrls: ['./admin-container.component.scss'], animations: [] }) + export class AdminContainerComponent { } diff --git a/src/app/admin/components/admin-form/admin-form.component.less b/src/app/admin/components/admin-form/admin-form.component.scss similarity index 73% rename from src/app/admin/components/admin-form/admin-form.component.less rename to src/app/admin/components/admin-form/admin-form.component.scss index b7a8f4f8..2c8c585b 100644 --- a/src/app/admin/components/admin-form/admin-form.component.less +++ b/src/app/admin/components/admin-form/admin-form.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .admin-form{ @@ -8,7 +8,7 @@ margin: 20px 0 0 0; position: relative; width: 100%; - .boxSizing(); + @include boxSizing(); &__control{ display: inline-block; @@ -16,7 +16,7 @@ position: relative; height: 100%; width:200px; - .boxSizing(); + @include boxSizing(); &--checkMidle{ @@ -43,59 +43,59 @@ position: absolute; bottom: 0; width: 100%; - .boxSizing(); + @include boxSizing(); &--error{ - border: 1px solid @error; - .transition(all .3s); + border: 1px solid $error; + @include transition(all .3s); } &::-webkit-input-placeholder { /* Chrome/Opera/Safari */ font-family: ProximaRegularThin; font-size: 18px; - color:@text_input; + color:$text_input; } &::-moz-placeholder { /* Firefox 19+ */ font-family: ProximaRegularThin; font-size: 18px; - color:@text_input; + color:$text_input; } &:-ms-input-placeholder { /* IE 10+ */ font-family: ProximaRegularThin; font-size: 18px; - color:@text_input; + color:$text_input; } &:-moz-placeholder { /* Firefox 18- */ font-family: ProximaRegularThin; font-size: 18px; - color:@text_input; + color:$text_input; } } &__select{ - background-color: @text_white; - .borderRadius(0); + background-color: $text_white; + @include borderRadius(0); -webkit-border-radius: 0px; } &__button{ - background-color: @green_main; - color: @text_white; + background-color: $green_main; + color: $text_white; cursor: pointer; display: inline-block; font-family: ProximaRegularLight; font-size: 18px; - border: 2px solid @green_main; + border: 2px solid $green_main; height: 38px; padding: 0 20px; text-decoration: none; text-align: center; - .boxSizing(); - .transition(all .3s); + @include boxSizing(); + @include transition(all .3s); &:hover{ - background-color: @green_main_hover; + background-color: $green_main_hover; } &--floatR{ @@ -111,14 +111,14 @@ &--disabled{ cursor: default; pointer-events: none; - color: @text_second2; + color: $text_second2; } } &__message{ - background-color: @yellow; + background-color: $yellow; font-family: ProximaRegularBold; - color:@text_h; + color:$text_h; font-size: 14px; padding: 5px 10px; position: absolute; @@ -127,8 +127,8 @@ top:50%; margin-top: -2px; cursor: pointer; - .boxSizing(); - .borderRadius(2px); + @include boxSizing(); + @include borderRadius(2px); } &__error{ @@ -137,13 +137,13 @@ font-family: ProximaRegular; font-size: 14px; margin-bottom: 5px; - color:@error; + color:$error; width: 100%; position: absolute; top:0; left:0; - .boxSizing(); + @include boxSizing(); } &--absolute{ diff --git a/src/app/admin/components/admin-role/admin-role.component.less b/src/app/admin/components/admin-role/admin-role.component.scss similarity index 63% rename from src/app/admin/components/admin-role/admin-role.component.less rename to src/app/admin/components/admin-role/admin-role.component.scss index f705e186..1ad2509c 100644 --- a/src/app/admin/components/admin-role/admin-role.component.less +++ b/src/app/admin/components/admin-role/admin-role.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .admin-role{ @@ -10,32 +10,32 @@ width: 100%; margin: 20px 0; - .boxSizing(); + @include boxSizing(); } &__item{ display: inline-block; - background-color: @text_white; + background-color: $text_white; cursor: pointer; width: 100%; height:40px; line-height: 40px; vertical-align: middle; - border-bottom: 1px solid @border; + border-bottom: 1px solid $border; position: relative; - .boxSizing(); - .boxShadow(0 3px 3px 0 rgba(0,0,0,0.50)); - .transition(all .4s); + @include boxSizing(); + @include boxShadow(0 3px 3px 0 rgba(0,0,0,0.50)); + @include transition(all .4s); &:hover,&--active{ - background-color: @grey; + background-color: $grey; } } &__header{ font-family: ProximaRegularBold; - color:@text_h; + color:$text_h; font-size: 24px; margin: 0 0 10px 0; } @@ -48,10 +48,10 @@ &__name{ font-family: ProximaRegularBold; - color:@text_h; + color:$text_h; width:350px; padding-left: 10px; - .boxSizing(); + @include boxSizing(); } &__seniority{ @@ -65,12 +65,12 @@ } &__lead{ - background-color: @yellow; + background-color: $yellow; font-family: ProximaRegularBold; - color:@text_h; + color:$text_h; font-size: 14px; padding: 5px 10px; - .boxSizing(); - .borderRadius(2px); + @include boxSizing(); + @include borderRadius(2px); } } \ No newline at end of file diff --git a/src/app/admin/components/admin-role/admin-role.component.ts b/src/app/admin/components/admin-role/admin-role.component.ts index 5620f44b..6944b905 100644 --- a/src/app/admin/components/admin-role/admin-role.component.ts +++ b/src/app/admin/components/admin-role/admin-role.component.ts @@ -7,7 +7,7 @@ import {AdminService} from '../../admin.service'; @Component({ selector: 'admin-role', templateUrl: './admin-role.component.html', - styleUrls: ['./admin-role.component.less', './../admin-form/admin-form.component.less'], + styleUrls: ['./admin-role.component.scss', './../admin-form/admin-form.component.scss'], animations: [] }) export class AdminRoleComponent implements OnInit { @@ -17,7 +17,7 @@ export class AdminRoleComponent implements OnInit { roles: Role[]; domains: string[]; seniority: string[]; - //for checkbox + // for checkbox leadrole = false; form = this.fb.group({ id: [''], diff --git a/src/app/admin/components/admin-technology/admin-technology.component.less b/src/app/admin/components/admin-technology/admin-technology.component.scss similarity index 63% rename from src/app/admin/components/admin-technology/admin-technology.component.less rename to src/app/admin/components/admin-technology/admin-technology.component.scss index 7dc1cb39..011787c1 100644 --- a/src/app/admin/components/admin-technology/admin-technology.component.less +++ b/src/app/admin/components/admin-technology/admin-technology.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .admin-technology{ @@ -10,14 +10,14 @@ width: 100%; margin: 20px 0; - .boxSizing(); + @include boxSizing(); } &__header{ font-family: ProximaRegularBold; - color:@text_h; + color:$text_h; font-size: 24px; margin: 0 0 10px 0; } diff --git a/src/app/admin/components/admin-technology/admin-technology.component.ts b/src/app/admin/components/admin-technology/admin-technology.component.ts index a9badd24..9644dee3 100644 --- a/src/app/admin/components/admin-technology/admin-technology.component.ts +++ b/src/app/admin/components/admin-technology/admin-technology.component.ts @@ -8,7 +8,7 @@ import {AdminService} from '../../admin.service'; @Component({ selector: 'admin-technology', templateUrl: './admin-technology.component.html', - styleUrls: ['./admin-technology.component.less', './../admin-form/admin-form.component.less'], + styleUrls: ['./admin-technology.component.scss', './../admin-form/admin-form.component.scss'], animations: [] }) export class AdminTechnologyComponent implements OnInit { diff --git a/src/app/app.component.less b/src/app/app.component.less deleted file mode 100644 index f383da7c..00000000 --- a/src/app/app.component.less +++ /dev/null @@ -1,9 +0,0 @@ -@import './../assets/style/colors.less'; -@import './../assets/style/mixins.less'; - -.main{ - //display: inline-block; - position: relative; - width:100%; -} - diff --git a/src/app/app.component.scss b/src/app/app.component.scss new file mode 100644 index 00000000..437c987e --- /dev/null +++ b/src/app/app.component.scss @@ -0,0 +1,9 @@ +@import './../assets/style/colors.scss'; +@import './../assets/style/mixins.scss'; + +.main{ + //display: inline-block; + position: relative; + width:100%; +} + diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 5a936d9e..bc60aea9 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,12 +1,12 @@ -import {Component} from '@angular/core'; +import {Component, OnInit} from '@angular/core'; import {Router, NavigationEnd} from '@angular/router'; @Component({ selector: 'app-root', templateUrl: './app.component.html', - styleUrls: ['./app.component.less'] + styleUrls: ['./app.component.scss'] }) -export class AppComponent { +export class AppComponent implements OnInit { constructor(private router: Router) { } diff --git a/src/app/controls/button/button.component.less b/src/app/controls/button/button.component.less deleted file mode 100644 index 08a5385d..00000000 --- a/src/app/controls/button/button.component.less +++ /dev/null @@ -1,67 +0,0 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; - -.button{ - background-color: @green_main; - color: @text_white; - cursor: pointer; - display: inline-block; - font-family: ProximaRegularLight; - font-size: 18px; - border: 2px solid @green_main; - line-height: 50px; - height: 54px; - padding: 0 20px; - text-decoration: none; - text-align: center; - vertical-align: 54px; - .boxSizing(); - .transition(all .3s); - - &:hover{ - background-color: @green_main_hover; - } - - &--white{ - background-color: @text_white; - color:@green_main; - - &:hover{ - border-color: @green_main_hover; - background-color: @text_white; - color:@green_main_hover; - } - } - - - &--action{ - display: inline-block; - width: 56px; - height: 56px; - line-height: 52px; - font-size: 30px; - text-align: center; - position: fixed; - bottom: 20px; - right: 20px; - - .borderRadius(50%); - .boxShadow(0 2px 4px 0 rgba(0,0,0,0.50)); - } - - :host ::ng-deep &--grey{ - background-color: @grey_bg; - border-color: @grey_bg; - color: @text_body; - - &:hover{ - background-color: @grey; - } - } - - &--disabled{ - cursor: default; - pointer-events: none; - color: @text_second2; - } -} \ No newline at end of file diff --git a/src/app/controls/button/button.component.scss b/src/app/controls/button/button.component.scss new file mode 100644 index 00000000..b43364a4 --- /dev/null +++ b/src/app/controls/button/button.component.scss @@ -0,0 +1,67 @@ +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; + +.button{ + background-color: $green_main; + color: $text_white; + cursor: pointer; + display: inline-block; + font-family: ProximaRegularLight; + font-size: 18px; + border: 2px solid $green_main; + line-height: 50px; + height: 54px; + padding: 0 20px; + text-decoration: none; + text-align: center; + vertical-align: 54px; + @include boxSizing(); + @include transition(all .3s); + + &:hover{ + background-color: $green_main_hover; + } + + &--white{ + background-color: $text_white; + color:$green_main; + + &:hover{ + border-color: $green_main_hover; + background-color: $text_white; + color:$green_main_hover; + } + } + + + &--action{ + display: inline-block; + width: 56px; + height: 56px; + line-height: 52px; + font-size: 30px; + text-align: center; + position: fixed; + bottom: 20px; + right: 20px; + + @include borderRadius(50%); + @include boxShadow(0 2px 4px 0 rgba(0,0,0,0.50)); + } + + :host ::ng-deep &--grey{ + background-color: $grey_bg; + border-color: $grey_bg; + color: $text_body; + + &:hover{ + background-color: $grey; + } + } + + &--disabled{ + cursor: default; + pointer-events: none; + color: $text_second2; + } +} \ No newline at end of file diff --git a/src/app/controls/button/button.component.ts b/src/app/controls/button/button.component.ts index 1107b701..d21c6491 100644 --- a/src/app/controls/button/button.component.ts +++ b/src/app/controls/button/button.component.ts @@ -4,9 +4,9 @@ import {Component, Input, Output, EventEmitter} from '@angular/core'; selector: 'app-button', templateUrl: './button.component.html', styleUrls: [ - './button.component.less', - './../../shared/backpanel/backpanel.component.less', - './../input/input.component.less'] + './button.component.scss', + './../../shared/backpanel/backpanel.component.scss', + './../input/input.component.scss'] }) export class ButtonComponent { @@ -17,10 +17,6 @@ export class ButtonComponent { @Output() click = new EventEmitter(); - constructor() { - - } - clicked(event) { event.stopPropagation(); this.click.emit(); diff --git a/src/app/controls/checkbox/checkbox.component.less b/src/app/controls/checkbox/checkbox.component.scss similarity index 75% rename from src/app/controls/checkbox/checkbox.component.less rename to src/app/controls/checkbox/checkbox.component.scss index f89b028b..1288a973 100644 --- a/src/app/controls/checkbox/checkbox.component.less +++ b/src/app/controls/checkbox/checkbox.component.scss @@ -1,5 +1,5 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; @@ -8,13 +8,6 @@ position: absolute; display: inline-block; right: 15px; - - - - - - - } .checkbox__check{ @@ -28,20 +21,20 @@ .checkbox__label{ font-family:ProximaRegular; font-size:12px; - color:@text_h; + color:$text_h; letter-spacing:0px; } .checkbox__check { - background-color:@text_white; + background-color:$text_white; content:""; display:inline-block; - border:2px solid @text_h; + border:2px solid $text_h; border-radius:3px; font-size:23px; - color:@text_h; + color:$text_h; height:18px; width:18px; line-height:18px; @@ -51,13 +44,13 @@ } .checkbox__label:before{ - background-color:@text_white; + background-color:$text_white; content:""; display:inline-block; - border:2px solid @text_h; + border:2px solid $text_h; border-radius:3px; font-size:23px; - color:@text_h; + color:$text_h; height:18px; width:18px; line-height:18px; diff --git a/src/app/controls/checkbox/checkbox.component.ts b/src/app/controls/checkbox/checkbox.component.ts index a72ffd9b..8b23d5cd 100644 --- a/src/app/controls/checkbox/checkbox.component.ts +++ b/src/app/controls/checkbox/checkbox.component.ts @@ -4,7 +4,7 @@ import {Component, Input, Output, EventEmitter} from '@angular/core'; selector: 'checkbox', templateUrl: './checkbox.component.html', styleUrls: [ - './checkbox.component.less'] + './checkbox.component.scss'] }) export class CheckBoxComponent { diff --git a/src/app/controls/chip/chip.component.less b/src/app/controls/chip/chip.component.scss similarity index 75% rename from src/app/controls/chip/chip.component.less rename to src/app/controls/chip/chip.component.scss index 730f9437..21c8ba5a 100644 --- a/src/app/controls/chip/chip.component.less +++ b/src/app/controls/chip/chip.component.scss @@ -1,11 +1,11 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; .chip{ display: inline-block; font-family:ProximaRegular; font-size:14px; - color:@text_body; + color:$text_body; padding: 5px 10px; background-color: #DDDDDD; height: 26px; @@ -13,9 +13,9 @@ margin: 0 10px 10px 0; - .borderRadius(14px); - .boxSizing(); - .transition(all .3s); + @include borderRadius(14px); + @include boxSizing(); + @include transition(all .3s); &__image{ position: absolute; @@ -29,7 +29,7 @@ } &--clicked{ - background-color: @hor_bg; + background-color: $hor_bg; } &--clickable{ diff --git a/src/app/controls/chip/chip.component.ts b/src/app/controls/chip/chip.component.ts index ed95e5bb..f4a72ac3 100644 --- a/src/app/controls/chip/chip.component.ts +++ b/src/app/controls/chip/chip.component.ts @@ -4,7 +4,7 @@ import {Component, Input, Output, EventEmitter, OnInit} from '@angular/core'; selector: 'chip', templateUrl: './chip.component.html', styleUrls: [ - './chip.component.less' + './chip.component.scss' ] }) export class ChipComponent implements OnInit { diff --git a/src/app/controls/delete/delete.component.less b/src/app/controls/delete/delete.component.scss similarity index 67% rename from src/app/controls/delete/delete.component.less rename to src/app/controls/delete/delete.component.scss index c698c5a7..bdcc063d 100644 --- a/src/app/controls/delete/delete.component.less +++ b/src/app/controls/delete/delete.component.scss @@ -1,5 +1,5 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; .delete-button{ @@ -10,16 +10,16 @@ border: none; width:20px; height: 20px; - color:@text_white; + color:$text_white; z-index: 100; - background-color: @text_navigation2; + background-color: $text_navigation2; cursor: pointer; - .borderRadius(10px); - .transition(all .3s); + @include borderRadius(10px); + @include transition(all .3s); &:hover{ - background-color: @text_navigation; + background-color: $text_navigation; } :host ::ng-deep &--floatR{ diff --git a/src/app/controls/delete/delete.component.ts b/src/app/controls/delete/delete.component.ts index 9a99a129..7383384f 100644 --- a/src/app/controls/delete/delete.component.ts +++ b/src/app/controls/delete/delete.component.ts @@ -3,7 +3,7 @@ import {Component, Input, Output, EventEmitter} from '@angular/core'; @Component({ selector: 'delete-button', styleUrls: [ - './delete.component.less' + './delete.component.scss' ], template: ` diff --git a/src/app/controls/dropdown/dropdown.component.less b/src/app/controls/dropdown/dropdown.component.scss similarity index 63% rename from src/app/controls/dropdown/dropdown.component.less rename to src/app/controls/dropdown/dropdown.component.scss index ee9468a4..c42fc50d 100644 --- a/src/app/controls/dropdown/dropdown.component.less +++ b/src/app/controls/dropdown/dropdown.component.scss @@ -1,5 +1,5 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; .dropdown{ @@ -7,13 +7,13 @@ position: relative; width: 100%; - .boxSizing(); + @include boxSizing(); &__label{ display: block; font-family: ProximaRegular; font-size: 14px; - color:@text_h; + color:$text_h; margin-bottom: 5px; } @@ -22,7 +22,7 @@ &__box{ display: block; border: 1px solid #dddddd; - background-color: @text_white; + background-color: $text_white; outline: none; height: 40px; font-family: ProximaRegularLight; @@ -31,17 +31,17 @@ width: 100%; //-webkit-appearance: none; - .boxSizing(); - .borderRadius(0px); + @include boxSizing(); + @include borderRadius(0px); &--error{ - border-color: @error; - .transition(all .3s); + border-color: $error; + @include transition(all .3s); } } &__error{ - color:@error; + color:$error; float: right; } diff --git a/src/app/controls/dropdown/dropdown.component.ts b/src/app/controls/dropdown/dropdown.component.ts index ae8c7e0f..6748498e 100644 --- a/src/app/controls/dropdown/dropdown.component.ts +++ b/src/app/controls/dropdown/dropdown.component.ts @@ -4,7 +4,7 @@ import {Component, Input, Output, EventEmitter} from '@angular/core'; selector: 'dropdown', templateUrl: './dropdown.component.html', styleUrls: [ - './dropdown.component.less' + './dropdown.component.scss' ] }) @@ -18,7 +18,7 @@ export class DropDownComponent { @Input() labelStyle = ''; @Input() options: string[] = []; - @Input() errorMessage = ''; //Field is required + @Input() errorMessage = ''; // Field is required @Output() private changed: EventEmitter = new EventEmitter(); diff --git a/src/app/controls/filters/filter-item/filter-item.component.less b/src/app/controls/filters/filter-item/filter-item.component.scss similarity index 84% rename from src/app/controls/filters/filter-item/filter-item.component.less rename to src/app/controls/filters/filter-item/filter-item.component.scss index a0878b0e..3318b0d8 100644 --- a/src/app/controls/filters/filter-item/filter-item.component.less +++ b/src/app/controls/filters/filter-item/filter-item.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .filter-item{ display: inline-block; @@ -22,7 +22,7 @@ display: inline-block; outline: none; font-family: ProximaRegular; - .borderRadius(4px); + @include borderRadius(4px); } &__tooltip{ @@ -36,9 +36,9 @@ max-height: 600px; overflow-y: auto; - .transition(all .4s); - .boxSizing(); - .boxShadow(0 2px 4px 0 rgba(0,0,0,0.50)); + @include transition(all .4s); + @include boxSizing(); + @include boxShadow(0 2px 4px 0 rgba(0,0,0,0.50)); :host ::ng-deep &--right{ top:20px; @@ -62,10 +62,10 @@ font-family: ProximaRegular; font-size: 14px; padding: 0 20px; - color: @text_h; + color: $text_h; text-align: left; margin-bottom: 10px; - .transition(all .4s); + @include transition(all .4s); img{ margin-right: 10px; @@ -105,7 +105,7 @@ visibility: hidden; opacity: 0; z-index: 199; - .transition(all .2s); + @include transition(all .2s); :host ::ng-deep &--right{ margin: 0; @@ -131,19 +131,19 @@ font-size: 16px; margin: 0; font-family: ProximaRegularBold; - color:@text_h; + color:$text_h; width: 100%; text-align: left; padding: 0 10px; margin-bottom: 20px; - .boxSizing(); + @include boxSizing(); } &__subheader{ display: block; font-family: ProximaRegular; font-size: 14px; - color:@text_h; + color:$text_h; margin: 0; text-align: left; margin-bottom: 5px; @@ -156,7 +156,7 @@ &__button{ - color: @text_h; + color: $text_h; font-family: ProximaRegular; text-decoration: none; @@ -168,19 +168,19 @@ &__wrapper{ display: flex; width: 100%; - .boxSizing(); + @include boxSizing(); } &__block{ - .flex(1); + @include flex(1); width: 50%; padding: 0 20px 0 10px; - .boxSizing(); + @include boxSizing(); } &__checkboxes{ margin-bottom: 15px; - .boxSizing(); + @include boxSizing(); } &__checkbox{ diff --git a/src/app/controls/filters/filter-item/filter-item.component.ts b/src/app/controls/filters/filter-item/filter-item.component.ts index 7e0de41c..0d4d0575 100644 --- a/src/app/controls/filters/filter-item/filter-item.component.ts +++ b/src/app/controls/filters/filter-item/filter-item.component.ts @@ -3,7 +3,8 @@ import {Component, Input, EventEmitter, Output, ElementRef, HostListener} from ' @Component({ selector: 'filter-item', templateUrl: './filter-item.component.html', - styleUrls: ['./filter-item.component.less'], + styleUrls: ['./filter-item.component.scss'], + // tslint:disable-next-line:use-host-property-decorator host: {'(document:click)': 'onClick($event)'} }) diff --git a/src/app/controls/filters/filter-panel/filter-panel.component.less b/src/app/controls/filters/filter-panel/filter-panel.component.scss similarity index 55% rename from src/app/controls/filters/filter-panel/filter-panel.component.less rename to src/app/controls/filters/filter-panel/filter-panel.component.scss index e74c8b71..0c614ce4 100644 --- a/src/app/controls/filters/filter-panel/filter-panel.component.less +++ b/src/app/controls/filters/filter-panel/filter-panel.component.scss @@ -1,16 +1,16 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .filter-panel{ display: flex; align-content: center; margin: 20px 0 14px 0; - .boxSizing(); + @include boxSizing(); &__info{ font-family:ProximaRegularLight; font-size:14px; margin: 5px 0 0 0; - color:@text_navigation2; + color:$text_navigation2; } } \ No newline at end of file diff --git a/src/app/controls/filters/filter-panel/filter-panel.component.ts b/src/app/controls/filters/filter-panel/filter-panel.component.ts index 76e08146..2fca3138 100644 --- a/src/app/controls/filters/filter-panel/filter-panel.component.ts +++ b/src/app/controls/filters/filter-panel/filter-panel.component.ts @@ -3,7 +3,7 @@ import {Component, Input} from '@angular/core'; @Component({ selector: 'filter-panel', templateUrl: './filter-panel.component.html', - styleUrls: ['./filter-panel.component.less'] + styleUrls: ['./filter-panel.component.scss'] }) export class FilterPanelComponent { diff --git a/src/app/controls/form/dynamic-question/dynamic-question.component.less b/src/app/controls/form/dynamic-question/dynamic-question.component.scss similarity index 66% rename from src/app/controls/form/dynamic-question/dynamic-question.component.less rename to src/app/controls/form/dynamic-question/dynamic-question.component.scss index d1e6b9c4..54396c48 100644 --- a/src/app/controls/form/dynamic-question/dynamic-question.component.less +++ b/src/app/controls/form/dynamic-question/dynamic-question.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .question{ @@ -7,13 +7,13 @@ position: relative; width: 100%; - .boxSizing(); + @include boxSizing(); &__label{ display: block; font-family: ProximaRegular; font-size: 14px; - color:@text_h; + color:$text_h; margin-bottom: 5px; } @@ -22,7 +22,7 @@ &__box{ display: block; border: 1px solid #dddddd; - background-color: @text_white; + background-color: $text_white; outline: none; height: 40px; font-family: ProximaRegularLight; @@ -31,16 +31,16 @@ width: 100%; //-webkit-appearance: none; - .boxSizing(); - .borderRadius(0px); + @include boxSizing(); + @include borderRadius(0px); &--error{ - border-color: @error; + border-color: $error; } } &__error{ - color:@error; + color:$error; float: right; } diff --git a/src/app/controls/form/dynamic-question/dynamic-question.component.ts b/src/app/controls/form/dynamic-question/dynamic-question.component.ts index a2896321..07d8c5ad 100644 --- a/src/app/controls/form/dynamic-question/dynamic-question.component.ts +++ b/src/app/controls/form/dynamic-question/dynamic-question.component.ts @@ -5,7 +5,7 @@ import {QuestionBase} from '../question-base'; @Component({ selector: 'df-question', templateUrl: './dynamic-question.component.html', - styleUrls: ['./dynamic-question.component.less'] + styleUrls: ['./dynamic-question.component.scss'] }) export class DynamicFormQuestionComponent { @@ -18,10 +18,6 @@ export class DynamicFormQuestionComponent { @Input() placeholder = ''; @Input() labelStyle = ''; - ngOnInit() { - console.log(this.form, this.form.controls[this.question.key]); - } - get isValid() { return this.form.controls[this.question.key].valid; } diff --git a/src/app/controls/form/form.component.less b/src/app/controls/form/form.component.scss similarity index 100% rename from src/app/controls/form/form.component.less rename to src/app/controls/form/form.component.scss diff --git a/src/app/controls/form/form.component.ts b/src/app/controls/form/form.component.ts index 2bdde88a..c703f163 100644 --- a/src/app/controls/form/form.component.ts +++ b/src/app/controls/form/form.component.ts @@ -7,7 +7,7 @@ import {QuestionControlService} from './question-control.service'; @Component({ selector: 'app-form', templateUrl: './form.component.html', - styleUrls: ['./form.component.less'] + styleUrls: ['./form.component.scss'] }) export class FormComponent implements OnInit { diff --git a/src/app/controls/input/input.component.less b/src/app/controls/input/input.component.scss similarity index 77% rename from src/app/controls/input/input.component.less rename to src/app/controls/input/input.component.scss index fbe53349..6ee095c0 100644 --- a/src/app/controls/input/input.component.less +++ b/src/app/controls/input/input.component.scss @@ -1,18 +1,18 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; .input{ display: inline-block; position: relative; - .boxSizing(); + @include boxSizing(); &__label{ display: block; font-family: ProximaRegular; font-size: 14px; - color:@text_h; + color:$text_h; margin-bottom: 5px; text-align: left; } @@ -25,7 +25,7 @@ } &__error{ - color:@error; + color:$error; float: right; } @@ -35,7 +35,7 @@ font-family: ProximaRegularThin; font-size: 20px; position: absolute; - color:@text_input; + color:$text_input; top:17px; right: 120px; @@ -66,7 +66,7 @@ font-size: 18px; padding: 0 20px; width: 100%; - .boxSizing(); + @include boxSizing(); &--uneditable{ pointer-events: none; @@ -77,27 +77,27 @@ &::-webkit-input-placeholder { /* Chrome/Opera/Safari */ font-family: ProximaRegularThin; font-size: 18px; - color:@text_input; + color:$text_input; } &::-moz-placeholder { /* Firefox 19+ */ font-family: ProximaRegularThin; font-size: 18px; - color:@text_input; + color:$text_input; } &:-ms-input-placeholder { /* IE 10+ */ font-family: ProximaRegularThin; font-size: 18px; - color:@text_input; + color:$text_input; } &:-moz-placeholder { /* Firefox 18- */ font-family: ProximaRegularThin; font-size: 18px; - color:@text_input; + color:$text_input; } &--error{ - border-color: @error; - .transition(all .3s); + border-color: $error; + @include transition(all .3s); } } @@ -112,7 +112,7 @@ height: 40px; } - @font14:14px; + $font14:14px; :host ::ng-deep &--filter{ background-color: #EEF1F3; color:#777777; @@ -123,16 +123,16 @@ padding: 0; &::-webkit-input-placeholder { /* Chrome/Opera/Safari */ - font-size: @font14; + font-size: $font14; } &::-moz-placeholder { /* Firefox 19+ */ - font-size: @font14; + font-size: $font14; } &:-ms-input-placeholder { /* IE 10+ */ - font-size: @font14; + font-size: $font14; } &:-moz-placeholder { /* Firefox 18- */ - font-size: @font14; + font-size: $font14; } } @@ -153,7 +153,7 @@ .autocomplete{ display: inline-block; - background-color: @text_white; + background-color: $text_white; list-style: none; margin: 0; padding: 0; @@ -164,9 +164,9 @@ visibility: hidden; height: 0; - .boxSizing(); - .boxShadow(0 3px 3px 0 rgba(0,0,0,0.50)); - .transition(visibility 0.3s, opacity 0.5s;); + @include boxSizing(); + @include boxShadow(0 3px 3px 0 rgba(0,0,0,0.50)); + @include transition(visibility 0.3s, opacity 0.5s); &__item{ @@ -174,19 +174,19 @@ width: 100%; padding: 10px 20px; cursor: pointer; - color:@text_h; + color:$text_h; font-size: 14px; font-family: ProximaRegular; - .boxSizing(); - .transition(all .4s); + @include boxSizing(); + @include transition(all .4s); &:hover{ - background-color: @hor_bg; + background-color: $hor_bg; } &--active{ - background-color: @hor_bg; + background-color: $hor_bg; } } diff --git a/src/app/controls/input/input.component.ts b/src/app/controls/input/input.component.ts index ace0bd97..867dd047 100644 --- a/src/app/controls/input/input.component.ts +++ b/src/app/controls/input/input.component.ts @@ -1,4 +1,4 @@ -import {Component, Input, Output, EventEmitter, ViewChild} from '@angular/core'; +import {Component, Input, Output, EventEmitter, ViewChild, AfterViewInit} from '@angular/core'; import {Observable} from 'rxjs/Observable'; import 'rxjs/add/observable/fromEvent'; @@ -9,12 +9,12 @@ import 'rxjs/add/operator/filter'; selector: 'app-input', templateUrl: './input.component.html', styleUrls: [ - './input.component.less', - './../../shared/backpanel/backpanel.component.less' + './input.component.scss', + './../../shared/backpanel/backpanel.component.scss' ] }) -export class InputComponent { +export class InputComponent implements AfterViewInit { @Input() id = ''; @Input() name = ''; @@ -40,11 +40,6 @@ export class InputComponent { activeItem = -1; hasComplete = false; - - constructor() { - - } - ngAfterViewInit() { setTimeout(function () { @@ -79,8 +74,8 @@ export class InputComponent { completeClick(data) { console.log(data); - //this.searchString=(this.searchString+=', ' + data).replace(/(^[,\s]+)|([,\s]+$)/g, ''); - this.model = data; //this.searchString; + // this.searchString=(this.searchString+=', ' + data).replace(/(^[,\s]+)|([,\s]+$)/g, ''); + this.model = data; // this.searchString; this.modelChanged(data); this.showAutocomplete = false; } diff --git a/src/app/controls/list/list-item/list-item.component.less b/src/app/controls/list/list-item/list-item.component.scss similarity index 76% rename from src/app/controls/list/list-item/list-item.component.less rename to src/app/controls/list/list-item/list-item.component.scss index 32e74319..80a34ba2 100644 --- a/src/app/controls/list/list-item/list-item.component.less +++ b/src/app/controls/list/list-item/list-item.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .list-item{ display: inline-block; @@ -8,7 +8,7 @@ width:100%; margin-bottom: 20px; - .boxSizing(); + @include boxSizing(); &__img{ float: left; @@ -29,7 +29,7 @@ font-family: ProximaRegular; font-size: 14px; margin-bottom: 2px; - color: @text_h; + color: $text_h; } @@ -37,17 +37,17 @@ margin: 0; font-family: ProximaRegularLight; font-size: 14px; - color: @text_second2; + color: $text_second2; } &__select{ display: block; border: none; outline: none; - .borderRadius(2px); + @include borderRadius(2px); &--active{ - background-color: @sap_bg; + background-color: $sap_bg; } } @@ -62,7 +62,7 @@ top:50%; margin-top: -8px; font-size: 14px; - color: @text_body; + color: $text_body; } :host ::ng-deep &__input{ @@ -77,12 +77,12 @@ outline: none; border: none; text-align: center; - .borderRadius(2px); - .transition(all .4s); + @include borderRadius(2px); + @include transition(all .4s); z-index: 200; &:focus{ - border-bottom: 2px solid @text_h; + border-bottom: 2px solid $text_h; } } @@ -95,16 +95,11 @@ height: auto; cursor: pointer; - .transition(all .4s); - - &:hover{ - //background-color: @sap_bg; - } - + @include transition(all .4s); } &--active{ - background-color: @sap_bg; + background-color: $sap_bg; } } diff --git a/src/app/controls/list/list-item/list-item.component.ts b/src/app/controls/list/list-item/list-item.component.ts index dbc45c93..859f6f77 100644 --- a/src/app/controls/list/list-item/list-item.component.ts +++ b/src/app/controls/list/list-item/list-item.component.ts @@ -5,7 +5,7 @@ import {Schedule} from '../../../shared/models/schedule'; @Component({ selector: 'list-item', templateUrl: './list-item.component.html', - styleUrls: ['./list-item.component.less'] + styleUrls: ['./list-item.component.scss'] }) export class ListItemComponent implements AfterContentInit { @@ -38,7 +38,7 @@ export class ListItemComponent implements AfterContentInit { } selectRole($event) { - this.model.role = this.roles.filter(item => item.id == $event.target.value)[0]; + this.model.role = this.roles.filter(item => item.id === $event.target.value)[0]; this.model.active = true; this.model.participation = 100.00; this.clicked.emit(this.model); diff --git a/src/app/controls/panel/panel.component.less b/src/app/controls/panel/panel.component.scss similarity index 78% rename from src/app/controls/panel/panel.component.less rename to src/app/controls/panel/panel.component.scss index c485c810..55c672fd 100644 --- a/src/app/controls/panel/panel.component.less +++ b/src/app/controls/panel/panel.component.scss @@ -1,5 +1,5 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; .panel{ @@ -7,7 +7,7 @@ width: 100%; margin-bottom: 20px; - .boxSizing(); + @include boxSizing(); &__header{ display: inline-block; @@ -18,14 +18,14 @@ padding: 0 20px 0 20px; cursor: pointer; - .boxSizing(); - .boxShadow(0 2px 1px 0 #d9d9d9); + @include boxSizing(); + @include boxShadow(0 2px 1px 0 #d9d9d9); } &__arrow{ float: right; font-size:10px; - color:@text_second2; + color:$text_second2; cursor: pointer; } @@ -37,7 +37,7 @@ :host ::ng-deep &__name{ font-family:ProximaRegular; font-size:16px; - color:@text_h; + color:$text_h; margin-right: 20px; } @@ -50,7 +50,7 @@ margin-right: 20px; span{ - color:@text_h; + color:$text_h; } &--ib{ @@ -63,10 +63,10 @@ width: 100%; margin-top: 10px; - .flex-flow(row wrap); + @include flex-flow(row wrap); - .boxSizing(); - .boxShadow(0 2px 1px 0 #d9d9d9); + @include boxSizing(); + @include boxShadow(0 2px 1px 0 #d9d9d9); } :host ::ng-deep &__legend{ @@ -79,7 +79,7 @@ display: flex; align-items: center; - .boxSizing(); + @include boxSizing(); &-item{ display: flex; @@ -93,7 +93,7 @@ height: 16px; margin-right: 5px; background-color: #FFCDD2; - .borderRadius(4px); + @include borderRadius(4px); &--edited{ background-color: #FFEE58; @@ -107,20 +107,20 @@ &-text{ font-family: ProximaRegularLight; font-size: 14px; - color: @text_second2; + color: $text_second2; } } :host ::ng-deep &__col{ - .flex(1); + @include flex(1); width: 50%; padding: 20px; border:1px solid #e5e5e5; border-bottom: none; - .boxSizing(); + @include boxSizing(); &--noborderL{ border-left: none; diff --git a/src/app/controls/panel/panel.component.ts b/src/app/controls/panel/panel.component.ts index 438d8e9f..2673d40f 100644 --- a/src/app/controls/panel/panel.component.ts +++ b/src/app/controls/panel/panel.component.ts @@ -3,7 +3,7 @@ import {Component, Input} from '@angular/core'; @Component({ selector: 'panel', templateUrl: './panel.component.html', - styleUrls: ['./panel.component.less'] + styleUrls: ['./panel.component.scss'] }) export class PanelComponent { diff --git a/src/app/controls/slider/slider.component.less b/src/app/controls/slider/slider.component.scss similarity index 81% rename from src/app/controls/slider/slider.component.less rename to src/app/controls/slider/slider.component.scss index 411958e5..8f689ea3 100644 --- a/src/app/controls/slider/slider.component.less +++ b/src/app/controls/slider/slider.component.scss @@ -1,12 +1,12 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; .slider{ display: flex; justify-content: center; - .boxSizing(); + @include boxSizing(); &__header{ display: block; @@ -22,7 +22,7 @@ width: 100%; text-align: center; color: rgba(255, 255, 255, 0.9); - .boxSizing(); + @include boxSizing(); b{ font-family: ProximaRegular; @@ -33,7 +33,7 @@ text-align: center; height: 100%; max-height: 250px; - .boxSizing(); + @include boxSizing(); position: relative; } &__main{ diff --git a/src/app/controls/slider/slider.component.ts b/src/app/controls/slider/slider.component.ts index e5bb3988..36870ac0 100644 --- a/src/app/controls/slider/slider.component.ts +++ b/src/app/controls/slider/slider.component.ts @@ -1,12 +1,12 @@ // Exact copy of app/title.component.ts except import UserService from shared -import {Component, Input, SimpleChanges} from '@angular/core'; +import {Component, Input, SimpleChanges, OnInit, OnChanges} from '@angular/core'; @Component({ selector: 'slider', templateUrl: './slider.component.html', - styleUrls: ['./slider.component.less'] + styleUrls: ['./slider.component.scss'] }) -export class SliderComponent { +export class SliderComponent implements OnInit, OnChanges { @Input() image = ''; @Input() withSugar = false; @@ -22,6 +22,6 @@ export class SliderComponent { } changePath(path) { - this.fullpath = path ? '/server/images/' + path : ''; + this.fullpath = path ? `'/server/images/${path}'` : ''; } } diff --git a/src/app/core/header/header.component.less b/src/app/core/header/header.component.scss similarity index 61% rename from src/app/core/header/header.component.less rename to src/app/core/header/header.component.scss index 96190238..7a9d8ecc 100644 --- a/src/app/core/header/header.component.less +++ b/src/app/core/header/header.component.scss @@ -1,7 +1,7 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; -@header_height:60px; +$header_height:60px; .header{ @@ -9,20 +9,20 @@ padding: 0 20px; position: fixed; top:0; - height: @header_height; + height: $header_height; width: 100%; z-index: 200; - .boxShadow(0 3px 3px 0 rgba(0,0,0,0.50)); - .boxSizing(); - .flex-display(); - .align-content(center); + @include boxShadow(0 3px 3px 0 rgba(0,0,0,0.50)); + @include boxSizing(); + @include flex-display(); + @include align-content(center); &__navigation{ text-align: right; line-height: 60px; vertical-align: middle; - .flex(2); + @include flex(2); } &__logo{ @@ -31,7 +31,7 @@ vertical-align: middle; // align-content: center; // justify-content: left; - .flex(1); + @include flex(1); } @@ -42,21 +42,21 @@ &__item{ display: inline-block; - color:@text_navigation; + color:$text_navigation; font-family: ProximaRegularLight; font-size: 16px; margin-left: 20px; text-decoration: none; - .transition(all .5s); + @include transition(all .5s); &--active{ - color:@green_main; + color:$green_main; text-decoration: underline; } } &__item:hover{ - color:@green_main; + color:$green_main; } } diff --git a/src/app/core/header/header.component.ts b/src/app/core/header/header.component.ts index 4727a532..1e066d5e 100644 --- a/src/app/core/header/header.component.ts +++ b/src/app/core/header/header.component.ts @@ -6,7 +6,7 @@ import {HEADER_ANIMATION} from './header.animation'; @Component({ selector: 'app-header', templateUrl: './header.component.html', - styleUrls: ['./header.component.less'], + styleUrls: ['./header.component.scss'], animations: [HEADER_ANIMATION] }) export class HeaderComponent { diff --git a/src/app/core/loader/loader.component.less b/src/app/core/loader/loader.component.scss similarity index 100% rename from src/app/core/loader/loader.component.less rename to src/app/core/loader/loader.component.scss diff --git a/src/app/core/loader/loader.component.ts b/src/app/core/loader/loader.component.ts index 9d4ecc57..fb6b2320 100644 --- a/src/app/core/loader/loader.component.ts +++ b/src/app/core/loader/loader.component.ts @@ -3,8 +3,7 @@ import {Component} from '@angular/core'; @Component({ selector: 'loader', templateUrl: './loader.component.html', - styleUrls: ['./loader.component.less'], - animations: [] + styleUrls: ['./loader.component.scss'] }) export class LoaderComponent { diff --git a/src/app/features/employee/employee-picker/employee-picker.component.less b/src/app/features/employee/employee-picker/employee-picker.component.scss similarity index 54% rename from src/app/features/employee/employee-picker/employee-picker.component.less rename to src/app/features/employee/employee-picker/employee-picker.component.scss index 804928e0..27bcd155 100644 --- a/src/app/features/employee/employee-picker/employee-picker.component.less +++ b/src/app/features/employee/employee-picker/employee-picker.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .employee-picker{ @@ -9,6 +9,6 @@ height: 291px; overflow-y: scroll; overflow-x: hidden; - .boxSizing(); + @include boxSizing(); } } \ No newline at end of file diff --git a/src/app/features/employee/employee-picker/employee-picker.component.ts b/src/app/features/employee/employee-picker/employee-picker.component.ts index c8821e60..a6267da4 100644 --- a/src/app/features/employee/employee-picker/employee-picker.component.ts +++ b/src/app/features/employee/employee-picker/employee-picker.component.ts @@ -1,4 +1,4 @@ -import {Component, Input, Output, EventEmitter} from '@angular/core'; +import {Component, Input, Output, EventEmitter, OnInit} from '@angular/core'; import {Employee} from '../../../shared/models/employee'; import {Role} from '../../../shared/models/role'; import {Schedule} from '../../../shared/models/schedule'; @@ -7,9 +7,9 @@ import {EmployeeService} from '../employee.service'; @Component({ selector: 'employee-picker', templateUrl: './employee-picker.component.html', - styleUrls: ['./employee-picker.component.less'], + styleUrls: ['./employee-picker.component.scss'], }) -export class EmployeePickerComponent { +export class EmployeePickerComponent implements OnInit { @Input() employees: Employee[] = []; @Input() roles: Role[] = []; @@ -55,7 +55,7 @@ export class EmployeePickerComponent { filterEmployees(event) { this.schedules = this.initialSchedules; this.schedules = this.schedules.filter(item => - (item.employee.firstname + ' ' + item.employee.lastname).toLowerCase().indexOf(event.toLowerCase()) !== -1 + (`'${item.employee.firstname} ${item.employee.lastname}'`).toLowerCase().indexOf(event.toLowerCase()) !== -1 ); } diff --git a/src/app/features/project/new-project/new-project.component.less b/src/app/features/project/new-project/new-project.component.scss similarity index 79% rename from src/app/features/project/new-project/new-project.component.less rename to src/app/features/project/new-project/new-project.component.scss index 16b90a00..62600330 100644 --- a/src/app/features/project/new-project/new-project.component.less +++ b/src/app/features/project/new-project/new-project.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .new-project{ @@ -18,7 +18,7 @@ position: relative; overflow: hidden; - .boxSizing(); + @include boxSizing(); } @@ -46,12 +46,12 @@ height: 291px; overflow-y: scroll; overflow-x: hidden; - .boxSizing(); + @include boxSizing(); } &__content{ display: flex; - background-color: @text_white; + background-color: $text_white; width: 100%; //height: 100%; //overflow-y: scroll; @@ -60,20 +60,20 @@ z-index: 2500; - .boxSizing(); - .flex-flow(row wrap); + @include boxSizing(); + @include flex-flow(row wrap); &-block{ - .flex(1); + @include flex(1); width: 50%; padding: 20px 20px 0 20px; position: relative; - .boxSizing(); + @include boxSizing(); &--fullwidth{ width: 100%; - .flex(none); + @include flex(none); } &--margin-115px{ @@ -93,7 +93,7 @@ width: 100%; text-align: right; padding: 20px; - .boxSizing(); + @include boxSizing(); } :host ::ng-deep &--pad10{ diff --git a/src/app/features/project/new-project/new-project.component.ts b/src/app/features/project/new-project/new-project.component.ts index 87e2eacd..ad411270 100644 --- a/src/app/features/project/new-project/new-project.component.ts +++ b/src/app/features/project/new-project/new-project.component.ts @@ -1,5 +1,5 @@ // angular -import {Component, Input, ViewChild, ViewContainerRef} from '@angular/core'; +import {Component, Input, ViewChild, ViewContainerRef, OnInit} from '@angular/core'; import {ActivatedRoute} from '@angular/router'; import {Router} from '@angular/router'; @@ -17,10 +17,9 @@ import {Comparer} from '../../../shared/helpers/comparer'; @Component({ selector: 'new-project', templateUrl: './new-project.component.html', - styleUrls: ['./new-project.component.less'], - animations: [] + styleUrls: ['./new-project.component.scss'] }) -export class NewProjectComponent { +export class NewProjectComponent implements OnInit { @Input() model: Project = new Project(); diff --git a/src/app/features/project/project-history/project-history.component.html b/src/app/features/project/project-history/project-history.component.html index 8f1bbed1..59657c33 100644 --- a/src/app/features/project/project-history/project-history.component.html +++ b/src/app/features/project/project-history/project-history.component.html @@ -1,7 +1,7 @@
-
+

{{model.updatedAt | date: 'dd.MM.yyyy' }} - diff --git a/src/app/features/project/project-history/project-history.component.less b/src/app/features/project/project-history/project-history.component.scss similarity index 70% rename from src/app/features/project/project-history/project-history.component.less rename to src/app/features/project/project-history/project-history.component.scss index d5105e43..925e3c0c 100644 --- a/src/app/features/project/project-history/project-history.component.less +++ b/src/app/features/project/project-history/project-history.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .project-history{ @@ -13,20 +13,20 @@ margin: 0; font-family:ProximaRegularThin; font-size:18px; - color:@text_h; + color:$text_h; text-align:left; cursor: pointer; text-decoration: none; - .transition(all .4s); + @include transition(all .4s); &:hover{ - color:@text_second; + color:$text_second; } } &__message{ - color:@text_h; + color:$text_h; font-family: ProximaRegular; font-size: 30px; text-align: center; diff --git a/src/app/features/project/project-history/project-history.component.ts b/src/app/features/project/project-history/project-history.component.ts index 8c2f72de..e2a854e3 100644 --- a/src/app/features/project/project-history/project-history.component.ts +++ b/src/app/features/project/project-history/project-history.component.ts @@ -1,9 +1,8 @@ -import {Component, Input, ViewChildren, QueryList, ViewChild, ViewContainerRef} from '@angular/core'; +import {Component, Input, ViewChildren, QueryList, ViewChild, ViewContainerRef, OnInit} from '@angular/core'; import {ActivatedRoute} from '@angular/router'; import {Project} from '../../../shared/models/project'; -import {PROJECT_ANIMATION} from '../project/project.animation'; import {ProjectService} from '../project.service'; import {DynamicService} from '../../../core/dynamic.service'; @@ -13,11 +12,10 @@ import {ProjectModalComponent} from '../project-modal/project-modal.component'; selector: 'project-history', templateUrl: './project-history.component.html', styleUrls: [ - './project-history.component.less', - '../project/project.component.less'], - animations: PROJECT_ANIMATION + './project-history.component.scss', + '../project/project.component.scss'] }) -export class ProjectHistoryComponent { +export class ProjectHistoryComponent implements OnInit { @Input() model: Project = new Project(); @Input() projects: Project[] = []; @@ -48,8 +46,6 @@ export class ProjectHistoryComponent { const modal = this.dynamic.addErrorComponent(); modal.error = error; }); - } else { - } }, error => { @@ -60,11 +56,11 @@ export class ProjectHistoryComponent { onChange(event, project, project2) { const modal = this.modals.filter(i => - i.id == project.id)[0]; + i.id === project.id)[0]; const modal2 = this.modals.filter(i => - i.id == project2.id)[0]; + i.id === project2.id)[0]; console.log(modal.project.id, modal.id, modal2.project.id, modal2.id); - const aimproject = this.projects.filter(pr => pr.version == event)[0]; + const aimproject = this.projects.filter(pr => pr.version === event)[0]; modal.project = aimproject; modal.compareProjects(modal.project, modal2.project); modal2.compareProjects(modal2.project, modal.project); diff --git a/src/app/features/project/project-item/project-item.component.less b/src/app/features/project/project-item/project-item.component.scss similarity index 77% rename from src/app/features/project/project-item/project-item.component.less rename to src/app/features/project/project-item/project-item.component.scss index dc41c77d..f7069032 100644 --- a/src/app/features/project/project-item/project-item.component.less +++ b/src/app/features/project/project-item/project-item.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .project-item{ display: inline-block; @@ -10,9 +10,9 @@ position: relative; vertical-align: top; - .boxSizing(); - .borderRadius(2px); - .boxShadow(0 2px 4px 0 rgba(0,0,0,0.50)); + @include boxSizing(); + @include borderRadius(2px); + @include boxShadow(0 2px 4px 0 rgba(0,0,0,0.50)); &__header{ a{ @@ -28,14 +28,14 @@ display: block; padding: 15px 17px 0 17px; - .boxSizing(); + @include boxSizing(); } &__name{ margin: 0; font-family:ProximaRegularBold; font-size:16px; - color:@text_h; + color:$text_h; text-align: left; a{ @@ -48,14 +48,14 @@ margin:3px 0 0 0; font-family:ProximaRegularThin; font-size:12px; - color:@text_second; + color:$text_second; text-align: left; } &__description{ font-family:ProximaRegularLight; font-size:14px; - color:@text_body; + color:$text_body; line-height: 125%; margin:10px 0 0 0; text-align: left; @@ -67,18 +67,18 @@ &__footer{ display: inline-block; - background-color: @text_white; + background-color: $text_white; width: 100%; padding: 0 17px 5px 17px; z-index: 20; - .boxSizing(); + @include boxSizing(); } &__team{ margin: 0; font-family:ProximaRegular; font-size:19px; - color:@text_h; + color:$text_h; position: absolute; bottom: 25px; @@ -93,7 +93,7 @@ bottom: 5px; font-family:ProximaRegularLight; font-size:12px; - color:@text_second; + color:$text_second; text-align:left; } diff --git a/src/app/features/project/project-item/project-item.component.ts b/src/app/features/project/project-item/project-item.component.ts index 1536b676..5aa4f4d6 100644 --- a/src/app/features/project/project-item/project-item.component.ts +++ b/src/app/features/project/project-item/project-item.component.ts @@ -1,12 +1,12 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, AfterViewInit} from '@angular/core'; import {Project} from '../../../shared/models/project'; @Component({ selector: 'project-item', templateUrl: './project-item.component.html', - styleUrls: ['./project-item.component.less'] + styleUrls: ['./project-item.component.scss'] }) -export class ProjectItemComponent { +export class ProjectItemComponent implements AfterViewInit { @Input() model: Project = new Project(); description = ''; @@ -24,7 +24,7 @@ export class ProjectItemComponent { } trimText(string, limit) { - return string.length > limit ? string.substring(0, limit) + '...' : string; + return string.length > limit ? `'${string.substring(0, limit)}...'` : string; } } diff --git a/src/app/features/project/project-list/project-list.component.html b/src/app/features/project/project-list/project-list.component.html index 9d16f52e..40a61d79 100644 --- a/src/app/features/project/project-list/project-list.component.html +++ b/src/app/features/project/project-list/project-list.component.html @@ -8,7 +8,7 @@ -
+
diff --git a/src/app/features/project/project-list/project-list.component.less b/src/app/features/project/project-list/project-list.component.scss similarity index 64% rename from src/app/features/project/project-list/project-list.component.less rename to src/app/features/project/project-list/project-list.component.scss index 461e73f1..e83676cd 100644 --- a/src/app/features/project/project-list/project-list.component.less +++ b/src/app/features/project/project-list/project-list.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .project-list{ @@ -11,7 +11,7 @@ margin-top: 20px; &__empty{ - color:@text_h; + color:$text_h; font-family: ProximaRegular; font-size: 30px; } diff --git a/src/app/features/project/project-list/project-list.component.ts b/src/app/features/project/project-list/project-list.component.ts index 9e04fd2e..24a9e9d8 100644 --- a/src/app/features/project/project-list/project-list.component.ts +++ b/src/app/features/project/project-list/project-list.component.ts @@ -6,7 +6,6 @@ import {Constants} from '../../../shared/models/constants'; import {ProjectService} from '../project.service'; import {PowerPointService} from '../../../core/powerpoint.service'; -import {LIST_ANIMATION} from './project-list.animation'; import {ActivatedRoute, Router} from '@angular/router'; import {Comparer} from '../../../shared/helpers/comparer'; @@ -15,8 +14,7 @@ import * as _ from 'lodash'; @Component({ selector: 'project-list', templateUrl: './project-list.component.html', - styleUrls: ['./project-list.component.less'], - animations: LIST_ANIMATION + styleUrls: ['./project-list.component.scss'] }) export class ProjectListComponent implements OnInit { @@ -129,7 +127,7 @@ export class ProjectListComponent implements OnInit { if (Array.isArray(item[key])) { const ids = Array.isArray(this.filter[key]) ? this.filter[key].map(item => item.id) : []; return item[key].map(item => item.id).filter(elem => - ids.indexOf(elem) > -1).length == ids.length; + ids.indexOf(elem) > -1).length === ids.length; } else { return this.filter[key].indexOf(item[key]) > -1; } diff --git a/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.less b/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.less deleted file mode 100644 index ccbc84ca..00000000 --- a/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.less +++ /dev/null @@ -1,13 +0,0 @@ -@import './../../../../../assets/style/colors.less'; -@import './../../../../../assets/style/mixins.less'; - - -.project-confirmation{ - - &__content{ - padding: 20px; - overflow-y: auto; - max-height: 600px; - .boxSizing(); - } -} \ No newline at end of file diff --git a/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.scss b/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.scss new file mode 100644 index 00000000..f8165332 --- /dev/null +++ b/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.scss @@ -0,0 +1,13 @@ +@import './../../../../../assets/style/colors.scss'; +@import './../../../../../assets/style/mixins.scss'; + + +.project-confirmation{ + + &__content{ + padding: 20px; + overflow-y: auto; + max-height: 600px; + @include boxSizing(); + } +} \ No newline at end of file diff --git a/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.ts b/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.ts index 825a9f0f..f8e5fbd9 100644 --- a/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.ts +++ b/src/app/features/project/project-modal/project-confirmation/project-confirmation.component.ts @@ -5,7 +5,7 @@ import {Project} from '../../../../shared/models/project'; @Component({ selector: 'project-confirmation', templateUrl: './project-confirmation.component.html', - styleUrls: ['./project-confirmation.component.less'] + styleUrls: ['./project-confirmation.component.scss'] }) export class ProjectConfirmationComponent extends ModalComponent { diff --git a/src/app/features/project/project-modal/project-modal.component.less b/src/app/features/project/project-modal/project-modal.component.scss similarity index 79% rename from src/app/features/project/project-modal/project-modal.component.less rename to src/app/features/project/project-modal/project-modal.component.scss index 32b545af..6cae5ea9 100644 --- a/src/app/features/project/project-modal/project-modal.component.less +++ b/src/app/features/project/project-modal/project-modal.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .project-modal{ @@ -9,7 +9,7 @@ display: inline-block; font-family:ProximaRegular; font-size:16px; - color:@text_h; + color:$text_h; margin-right: 20px; margin-bottom: 20px; width: 100%; @@ -17,7 +17,7 @@ span{ float: right; font-size: 14px; - color:@text_second2; + color:$text_second2; } } @@ -31,7 +31,7 @@ margin-bottom: 10px; span{ - color:@text_h; + color:$text_h; } @@ -50,7 +50,7 @@ &--edited{ background-color: #FFEE58; padding: 3px; - .borderRadius(5px); + @include borderRadius(5px); } &--description{ @@ -60,13 +60,13 @@ &--added{ background-color: #CDE9E1; padding: 3px; - .borderRadius(5px); + @include borderRadius(5px); } &--removed{ background-color: #FFCDD2; padding: 3px; - .borderRadius(5px); + @include borderRadius(5px); } &--margin1020{ diff --git a/src/app/features/project/project-modal/project-modal.component.ts b/src/app/features/project/project-modal/project-modal.component.ts index 79a618ee..06add97b 100644 --- a/src/app/features/project/project-modal/project-modal.component.ts +++ b/src/app/features/project/project-modal/project-modal.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, OnInit} from '@angular/core'; import {Project} from '../../../shared/models/project'; import {Comparer} from '../../../shared/helpers/comparer'; @@ -6,9 +6,9 @@ import {Comparer} from '../../../shared/helpers/comparer'; selector: 'project-modal', templateUrl: './project-modal.component.html', styleUrls: [ - './project-modal.component.less'] + './project-modal.component.scss'] }) -export class ProjectModalComponent { +export class ProjectModalComponent implements OnInit { @Input() project: Project = new Project(); @Input() compareProject: Project; diff --git a/src/app/features/project/project/project.component.html b/src/app/features/project/project/project.component.html index b64084a2..4df8ede9 100644 --- a/src/app/features/project/project/project.component.html +++ b/src/app/features/project/project/project.component.html @@ -1,7 +1,7 @@
-
+

@@ -113,7 +113,7 @@

- + diff --git a/src/app/features/project/project/project.component.less b/src/app/features/project/project/project.component.scss similarity index 78% rename from src/app/features/project/project/project.component.less rename to src/app/features/project/project/project.component.scss index 9afb9a79..ffea6ff8 100644 --- a/src/app/features/project/project/project.component.less +++ b/src/app/features/project/project/project.component.scss @@ -1,10 +1,10 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .project{ display: inline-block; position: absolute; - background-color: @text_white; + background-color: $text_white; top:120px; width: 100%; max-width: 80%; @@ -15,13 +15,13 @@ - .boxSizing(); + @include boxSizing(); &__header{ display: inline-block; width: 100%; margin-top: 37px; - .boxSizing(); + @include boxSizing(); } &__subheading{ @@ -30,10 +30,10 @@ margin: 0; font-family:ProximaRegularThin; font-size:18px; - color:@text_second; + color:$text_second; text-align:left; - .boxSizing(); + @include boxSizing(); } &__heading{ @@ -43,7 +43,7 @@ font-family:ProximaRegularBold; font-size:40px; - color:@text_h; + color:$text_h; &--small{ font-size: 22px; @@ -55,10 +55,10 @@ margin-bottom: 15px; margin-top: 20px; - .flex-display(); + @include flex-display(); &-item{ - .flex(1) + @include flex(1) } &--center{ @@ -73,14 +73,14 @@ &__h{ font-family:ProximaRegular; font-size: 14px; - color: @text_h; + color: $text_h; margin: 0; } &__sh{ font-family:ProximaRegular; font-size: 14px; - color: @text_second2; + color: $text_second2; margin: 2px 0 10px 0; } @@ -88,7 +88,7 @@ &__t{ font-family:ProximaRegularLight; font-size: 18px; - color: @text_body; + color: $text_body; line-height: 125%; margin: 0; @@ -104,21 +104,21 @@ } &__bold{ - color: @green_main; + color: $green_main; font-size: 16px; text-decoration: none; cursor: pointer; font-family: ProximaRegularBold; - .transition(all .3s); + @include transition(all .3s); &:hover{ - color:@green_bg; + color:$green_bg; } &--nohover{ &:hover{ - color: @green_main; + color: $green_main; } } } diff --git a/src/app/features/project/project/project.component.ts b/src/app/features/project/project/project.component.ts index 0284d9aa..a32bbeef 100644 --- a/src/app/features/project/project/project.component.ts +++ b/src/app/features/project/project/project.component.ts @@ -1,4 +1,4 @@ -import {Component, ViewChild, ViewContainerRef} from '@angular/core'; +import {Component, ViewChild, ViewContainerRef, OnInit} from '@angular/core'; import {ActivatedRoute} from '@angular/router'; import {Router} from '@angular/router'; @@ -9,17 +9,14 @@ import {DynamicService} from '../../../core/dynamic.service'; import {PowerPointService} from '../../../core/powerpoint.service'; import {ProjectService} from '../project.service'; -import {PROJECT_ANIMATION} from './project.animation'; - import {groupBy} from '../../../shared/helpers/extensions'; @Component({ selector: 'project', templateUrl: './project.component.html', - styleUrls: ['./project.component.less'], - animations: [PROJECT_ANIMATION] + styleUrls: ['./project.component.scss'] }) -export class ProjectComponent { +export class ProjectComponent implements OnInit { model: Project = new Project(); @ViewChild('entry', {read: ViewContainerRef}) entry: ViewContainerRef; @@ -47,8 +44,8 @@ export class ProjectComponent { this.technologies = groupBy(this.model.technologies, 'domain'); if (this.model.pss) { this.technologies.information = this.technologies.information - ? [...this.technologies.information, new Technology({name: 'PSS ' + (this.model.pss)})] - : [new Technology({name: 'PSS ' + (this.model.pss)})]; + ? [...this.technologies.information, new Technology({name: `'PSS ${this.model.pss}'`})] + : [new Technology({name: `'PSS ${this.model.pss}'`})]; } this.leadContacts = this.model.schedules.filter(schedule => schedule.role.leadrole); diff --git a/src/app/features/technology/technology-picker/technology-picker.component.less b/src/app/features/technology/technology-picker/technology-picker.component.scss similarity index 66% rename from src/app/features/technology/technology-picker/technology-picker.component.less rename to src/app/features/technology/technology-picker/technology-picker.component.scss index 34f2bc06..03e84365 100644 --- a/src/app/features/technology/technology-picker/technology-picker.component.less +++ b/src/app/features/technology/technology-picker/technology-picker.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .technology-picker{ @@ -9,28 +9,28 @@ overflow-y: auto; overflow-x: hidden; text-align: left; - .boxSizing(); + @include boxSizing(); } &__button{ - background-color: @text_white; - color:@green_main; + background-color: $text_white; + color:$green_main; cursor: pointer; display: block; font-family: ProximaRegularLight; font-size: 16px; - border: 2px solid @green_main; + border: 2px solid $green_main; margin-bottom: 20px; padding: 0 5px; text-decoration: none; text-align: center; - .boxSizing(); - .transition(all .3s); + @include boxSizing(); + @include transition(all .3s); &:hover{ - border-color: @green_main_hover; - background-color: @text_white; - color:@green_main_hover; + border-color: $green_main_hover; + background-color: $text_white; + color:$green_main_hover; } } diff --git a/src/app/features/technology/technology-picker/technology-picker.component.ts b/src/app/features/technology/technology-picker/technology-picker.component.ts index c36111f1..8d087bfe 100644 --- a/src/app/features/technology/technology-picker/technology-picker.component.ts +++ b/src/app/features/technology/technology-picker/technology-picker.component.ts @@ -1,13 +1,13 @@ -import {Component, Input, Output, EventEmitter} from '@angular/core'; +import {Component, Input, Output, EventEmitter, OnInit} from '@angular/core'; import {Technology} from '../../../shared/models/technology'; import {TechnologyService} from '../technology.service'; @Component({ selector: 'technology-picker', templateUrl: './technology-picker.component.html', - styleUrls: ['./technology-picker.component.less'], + styleUrls: ['./technology-picker.component.scss'], }) -export class TechnologyPickerComponent { +export class TechnologyPickerComponent implements OnInit { @Input() selectedTechnologies: Technology[] = []; @Input() pickerStyle = ''; @@ -59,7 +59,7 @@ export class TechnologyPickerComponent { filterTechnologies(event) { this.technologies = this.initialTechnologies; - this.technologies = this.technologies.filter(item => item.name.toLowerCase().indexOf(event.toLowerCase()) != -1); + this.technologies = this.technologies.filter(item => item.name.toLowerCase().indexOf(event.toLowerCase()) !== -1); } selectTechnology(event) { diff --git a/src/app/shared/backpanel/backpanel.component.html b/src/app/shared/backpanel/backpanel.component.html index 2d2de3fd..5cecc4cf 100644 --- a/src/app/shared/backpanel/backpanel.component.html +++ b/src/app/shared/backpanel/backpanel.component.html @@ -1,13 +1,13 @@ -
+
- stars -
+
- stars diff --git a/src/app/shared/backpanel/backpanel.component.less b/src/app/shared/backpanel/backpanel.component.scss similarity index 71% rename from src/app/shared/backpanel/backpanel.component.less rename to src/app/shared/backpanel/backpanel.component.scss index 9d15b198..48050d68 100644 --- a/src/app/shared/backpanel/backpanel.component.less +++ b/src/app/shared/backpanel/backpanel.component.scss @@ -1,5 +1,5 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; .backpanel{ @@ -8,17 +8,17 @@ padding: 0 20px; height: 263px; width: 100%; - .flex-display(flex); - .align-content(center); - .boxSizing(); - .transition(all .5s); + @include flex-display(flex); + @include align-content(center); + @include boxSizing(); + @include transition(all .5s); &__img{ position: absolute; top:0; bottom: 0; margin: auto; - .boxSizing(); + @include boxSizing(); &--left{ text-align: left; @@ -43,7 +43,7 @@ margin-top: -27px; max-width: 800px; z-index: 100; - .transition(all .5s); + @include transition(all .5s); &--fixed{ position: fixed; diff --git a/src/app/shared/backpanel/backpanel.component.ts b/src/app/shared/backpanel/backpanel.component.ts index 48848591..97c2b38d 100644 --- a/src/app/shared/backpanel/backpanel.component.ts +++ b/src/app/shared/backpanel/backpanel.component.ts @@ -1,11 +1,9 @@ import {Component, Input} from '@angular/core'; -import {BACKPANEL_ANIMATION} from './backpanel.animation'; @Component({ selector: 'backpanel', templateUrl: './backpanel.component.html', - styleUrls: ['./backpanel.component.less'], - animations: BACKPANEL_ANIMATION + styleUrls: ['./backpanel.component.scss'] }) export class BackPanelComponent { diff --git a/src/app/shared/footer/footer.component.less b/src/app/shared/footer/footer.component.scss similarity index 78% rename from src/app/shared/footer/footer.component.less rename to src/app/shared/footer/footer.component.scss index b168adda..895fef91 100644 --- a/src/app/shared/footer/footer.component.less +++ b/src/app/shared/footer/footer.component.scss @@ -1,5 +1,5 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; .footer{ display: inline-block; @@ -12,8 +12,8 @@ text-align: center; z-index: 300; bottom:-100px; - .boxSizing(); - .transition(all .4s); + @include boxSizing(); + @include transition(all .4s); :host ::ng-deep &__button{ display: inline-block; @@ -27,8 +27,8 @@ margin-right: 10px; position: relative; - background-color: @text_white; - .borderRadius(50%); + background-color: $text_white; + @include borderRadius(50%); img{ display: inline-block; diff --git a/src/app/shared/footer/footer.component.ts b/src/app/shared/footer/footer.component.ts index 3a5a1e81..54b6701d 100644 --- a/src/app/shared/footer/footer.component.ts +++ b/src/app/shared/footer/footer.component.ts @@ -3,7 +3,7 @@ import {Component, Input} from '@angular/core'; @Component({ selector: 'app-footer', templateUrl: './footer.component.html', - styleUrls: ['./footer.component.less'] + styleUrls: ['./footer.component.scss'] }) export class FooterComponent { diff --git a/src/app/shared/modal/delete/delete.component.less b/src/app/shared/modal/delete/delete.component.scss similarity index 63% rename from src/app/shared/modal/delete/delete.component.less rename to src/app/shared/modal/delete/delete.component.scss index 6e8a9bb9..d7b653e1 100644 --- a/src/app/shared/modal/delete/delete.component.less +++ b/src/app/shared/modal/delete/delete.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .delete{ @@ -10,10 +10,10 @@ padding: 0 20px; width:100%; height: 40px; - background-color: @error; - color:@text_white; + background-color: $error; + color:$text_white; font-family: ProximaRegularLight; - .boxSizing(); + @include boxSizing(); } &__text,&__status{ @@ -29,7 +29,7 @@ position: relative; text-align: center; - .boxSizing(); + @include boxSizing(); } &__line{ @@ -37,7 +37,7 @@ margin: 0; font-size: 16px; font-family: ProximaRegularLight; - color: @text_body; + color: $text_body; margin-bottom: 10px; } @@ -48,17 +48,17 @@ bottom: 0; padding: 10px 0; justify-content: center; - .boxSizing(); + @include boxSizing(); } &__button{ - background-color: @error; - color: @text_white; + background-color: $error; + color: $text_white; cursor: pointer; display: inline-block; font-family: ProximaRegularLight; font-size: 14px; - border: 2px solid @error; + border: 2px solid $error; line-height: 28px; height: 30px; padding: 0 10px; @@ -66,24 +66,24 @@ margin-right: 10px; text-align: center; vertical-align: 54px; - .boxSizing(); - .transition(all .3s); - .borderRadius(2px); + @include boxSizing(); + @include transition(all .3s); + @include borderRadius(2px); &:hover{ - background-color: @error2; + background-color: $error2; } &--white{ - background-color: @text_white; - color:@error; + background-color: $text_white; + color:$error; &:hover{ - background-color: @text_white; - color:@error2; - border-color: @error2; + background-color: $text_white; + color:$error2; + border-color: $error2; } } diff --git a/src/app/shared/modal/delete/delete.component.ts b/src/app/shared/modal/delete/delete.component.ts index 12b04247..c16fda81 100644 --- a/src/app/shared/modal/delete/delete.component.ts +++ b/src/app/shared/modal/delete/delete.component.ts @@ -4,7 +4,7 @@ import {ModalComponent} from '../modal.component'; @Component({ selector: 'delete', templateUrl: './delete.component.html', - styleUrls: ['./delete.component.less'] + styleUrls: ['./delete.component.scss'] }) export class DeleteComponent extends ModalComponent { diff --git a/src/app/shared/modal/error/error.component.less b/src/app/shared/modal/error/error.component.scss similarity index 76% rename from src/app/shared/modal/error/error.component.less rename to src/app/shared/modal/error/error.component.scss index b17a4806..a7e61252 100644 --- a/src/app/shared/modal/error/error.component.less +++ b/src/app/shared/modal/error/error.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; @@ -11,11 +11,11 @@ padding: 0 20px; width:100%; height: 40px; - background-color: @error; - color:@text_white; + background-color: $error; + color:$text_white; font-family: ProximaRegularLight; justify-content: center; - .boxSizing(); + @include boxSizing(); } &__text,&__status{ @@ -37,24 +37,24 @@ &__content{ width: 100%; height: 100%; - background-color: @error; + background-color: $error; display: inline-block; padding:20px; position: relative; text-align: center; - .boxSizing(); + @include boxSizing(); } &__link{ font-family: ProximaRegularThin; - color: @text_white; + color: $text_white; position: absolute; cursor: pointer; bottom:10px; left:0; text-align: center; width: 100%; - .boxSizing(); + @include boxSizing(); &:hover{ text-decoration: underline; @@ -66,15 +66,15 @@ margin: 0; font-size: 18px; font-family: ProximaRegularLight; - color: @text_white; + color: $text_white; margin-bottom: 10px; } &__image{ margin: 40px 0; display: inline-block; - border: 2px solid @text_white; - color:@text_white; + border: 2px solid $text_white; + color:$text_white; font-family: ProximaRegularLight; width: 100px; height: 100px; @@ -89,7 +89,7 @@ font-size: 50px; - .borderRadius(50%); + @include borderRadius(50%); } } \ No newline at end of file diff --git a/src/app/shared/modal/error/error.component.ts b/src/app/shared/modal/error/error.component.ts index dd5e4795..785a310e 100644 --- a/src/app/shared/modal/error/error.component.ts +++ b/src/app/shared/modal/error/error.component.ts @@ -5,7 +5,7 @@ import {Error} from '../../models/error'; @Component({ selector: 'error', templateUrl: './error.component.html', - styleUrls: ['./error.component.less'] + styleUrls: ['./error.component.scss'] }) export class ErrorComponent extends ModalComponent { diff --git a/src/app/shared/modal/file/file.component.less b/src/app/shared/modal/file/file.component.scss similarity index 77% rename from src/app/shared/modal/file/file.component.less rename to src/app/shared/modal/file/file.component.scss index 02a043ff..6010c01a 100644 --- a/src/app/shared/modal/file/file.component.less +++ b/src/app/shared/modal/file/file.component.scss @@ -1,5 +1,5 @@ -@import './../../../../assets/style/colors.less'; -@import './../../../../assets/style/mixins.less'; +@import './../../../../assets/style/colors.scss'; +@import './../../../../assets/style/mixins.scss'; .file{ @@ -48,7 +48,7 @@ } &-item{ - .flex(1); + @include flex(1); } &--center{ @@ -57,25 +57,25 @@ } &__button{ - background-color: @error; - color: @text_white; + background-color: $error; + color: $text_white; cursor: pointer; display: inline-block; font-family: ProximaRegularLight; font-size: 16px; - border: 2px solid @error; + border: 2px solid $error; line-height: 28px; height: 30px; padding: 0 10px; text-decoration: none; text-align: center; vertical-align:middle; - .boxSizing(); - .transition(all .3s); - .borderRadius(2px); + @include boxSizing(); + @include transition(all .3s); + @include borderRadius(2px); &:hover{ - background-color: @error2; + background-color: $error2; } i{ diff --git a/src/app/shared/modal/file/file.component.ts b/src/app/shared/modal/file/file.component.ts index ef745d53..c5bad64e 100644 --- a/src/app/shared/modal/file/file.component.ts +++ b/src/app/shared/modal/file/file.component.ts @@ -6,7 +6,7 @@ import { FileService } from '../../../core/file.service'; @Component({ selector: 'file', templateUrl: './file.component.html', - styleUrls: ['./file.component.less'] + styleUrls: ['./file.component.scss'] }) export class FileComponent extends ModalComponent { @@ -21,14 +21,10 @@ export class FileComponent extends ModalComponent { super(); } - ngOnInit() { - - } - onSelect(event) { for (const file of event.files) { - //file.name=file.name+=' ' + this.project.id + ' ' + this.project.name; + // file.name=file.name+=' ' + this.project.id + ' ' + this.project.name; this.uploadedFiles.push(file); } console.log(event.files); @@ -36,7 +32,7 @@ export class FileComponent extends ModalComponent { } onUpload(event) { - //event.stopPropagation(); + // event.stopPropagation(); this.uploadedFiles = []; this.onUploaded.emit(event.xhr.response); } diff --git a/src/app/shared/modal/modal.component.less b/src/app/shared/modal/modal.component.scss similarity index 76% rename from src/app/shared/modal/modal.component.less rename to src/app/shared/modal/modal.component.scss index d3245700..7a7b01c9 100644 --- a/src/app/shared/modal/modal.component.less +++ b/src/app/shared/modal/modal.component.scss @@ -1,5 +1,5 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; .modal{ @@ -12,12 +12,12 @@ opacity: 0; visibility: hidden; - .transition(all .3s); + @include transition(all .3s); :host ::ng-deep &__h{ font-family:ProximaRegular; font-size: 14px; - color: @text_h; + color: $text_h; margin: 0; } @@ -34,13 +34,13 @@ } &__window{ - background-color: @text_white; + background-color: $text_white; display: block; position: fixed; width:910px; height: 600px; - .transition(all .5s); + @include transition(all .5s); top:50%; margin-top: -300px; @@ -49,9 +49,9 @@ margin-left: -455px; z-index: 3001; - .transition(all .3); - .boxSizing(); - .boxShadow(0 2px 4px 0 rgba(0,0,0,0.50)); + @include transition(all .3); + @include boxSizing(); + @include boxShadow(0 2px 4px 0 rgba(0,0,0,0.50)); } diff --git a/src/app/shared/modal/modal.component.ts b/src/app/shared/modal/modal.component.ts index fccd3b7d..eb695031 100644 --- a/src/app/shared/modal/modal.component.ts +++ b/src/app/shared/modal/modal.component.ts @@ -3,7 +3,7 @@ import {Component, Input} from '@angular/core'; @Component({ selector: 'modal', templateUrl: './modal.component.html', - styleUrls: ['./modal.component.less'] + styleUrls: ['./modal.component.scss'] }) export class ModalComponent { diff --git a/src/app/shared/ribbon/ribbon.component.less b/src/app/shared/ribbon/ribbon.component.scss similarity index 63% rename from src/app/shared/ribbon/ribbon.component.less rename to src/app/shared/ribbon/ribbon.component.scss index 17814ff0..644a2f61 100644 --- a/src/app/shared/ribbon/ribbon.component.less +++ b/src/app/shared/ribbon/ribbon.component.scss @@ -1,13 +1,13 @@ -@import './../../../assets/style/colors.less'; -@import './../../../assets/style/mixins.less'; +@import './../../../assets/style/colors.scss'; +@import './../../../assets/style/mixins.scss'; -@green:#79A70A; -@green2:#9BC90D; +$green:#79A70A; +$green2:#9BC90D; -@red:@error;//#8F0808; -@red2:#F70505; +$red:$error;//#8F0808; +$red2:#F70505; .ribbon{ position: absolute; @@ -29,8 +29,8 @@ -webkit-transform: rotate(45deg); width: 100px; display: block; - background: @green; - background: linear-gradient( @green2 0%, @green 100%); + background: $green; + background: linear-gradient( $green2 0%, $green 100%); box-shadow: 0 3px 10px -5px rgba(0, 0, 0, 1); position: absolute; top: 19px; right: -21px; @@ -39,10 +39,10 @@ content: ""; position: absolute; left: 0px; top: 100%; z-index: -1; - border-left: 3px solid @green; + border-left: 3px solid $green; border-right: 3px solid transparent; border-bottom: 3px solid transparent; - border-top: 3px solid @green; + border-top: 3px solid $green; } &:after{ @@ -50,24 +50,24 @@ position: absolute; right: 0px; top: 100%; z-index: -1; border-left: 3px solid transparent; - border-right: 3px solid @green; + border-right: 3px solid $green; border-bottom: 3px solid transparent; - border-top: 3px solid @green; + border-top: 3px solid $green; } &--red{ - background: @red; - background: linear-gradient(@red2 0%, @red 100%); + background: $red; + background: linear-gradient($red2 0%, $red 100%); &:before{ - border-left: 3px solid @red; - border-top: 3px solid @red; + border-left: 3px solid $red; + border-top: 3px solid $red; } &:after{ - border-right: 3px solid @red; - border-top: 3px solid @red; + border-right: 3px solid $red; + border-top: 3px solid $red; } } diff --git a/src/app/shared/ribbon/ribbon.component.ts b/src/app/shared/ribbon/ribbon.component.ts index 7328fee2..8e2233d1 100644 --- a/src/app/shared/ribbon/ribbon.component.ts +++ b/src/app/shared/ribbon/ribbon.component.ts @@ -3,7 +3,7 @@ import {Component, Input} from '@angular/core'; @Component({ selector: 'ribbon', templateUrl: './ribbon.component.html', - styleUrls: ['./ribbon.component.less'] + styleUrls: ['./ribbon.component.scss'] }) export class RibbonComponent { diff --git a/src/assets/style/colors.less b/src/assets/style/colors.scss similarity index 63% rename from src/assets/style/colors.less rename to src/assets/style/colors.scss index 42a7d5df..233b85ec 100644 --- a/src/assets/style/colors.less +++ b/src/assets/style/colors.scss @@ -1,37 +1,37 @@ //background -@grey_bg:#eef1f3; -@grey:#DDDDDD; -@green_bg:rgba(52,174,74,0.3); -@sap_bg:#90d0fa; -@auto_bg:#f9dabb; -@hor_bg:#cde9e1; -@ver_bg:#f2ede5; +$grey_bg:#eef1f3; +$grey:#DDDDDD; +$green_bg:rgba(52,174,74,0.3); +$sap_bg:#90d0fa; +$auto_bg:#f9dabb; +$hor_bg:#cde9e1; +$ver_bg:#f2ede5; //main -@green_main:#34ae4a; -@green_main_hover:#2e8a41; +$green_main:#34ae4a; +$green_main_hover:#2e8a41; //Typography -@text_h:#063642; -@text_body:#030302; -@text_second:#a3a3a3; -@text_second2:#757575; -@text_navigation:#555859; -@text_navigation2:#777777; -@text_input:#707070; -@text_white:#ffffff; +$text_h:#063642; +$text_body:#030302; +$text_second:#a3a3a3; +$text_second2:#757575; +$text_navigation:#555859; +$text_navigation2:#777777; +$text_input:#707070; +$text_white:#ffffff; -@border:#CACACA; +$border:#CACACA; -@error:#F44336; -@error2:#f5554a; +$error:#F44336; +$error2:#f5554a; -@yellow:#FFEE58; +$yellow:#FFEE58; @font-face { diff --git a/src/assets/style/mixins.less b/src/assets/style/mixins.less deleted file mode 100644 index 12743848..00000000 --- a/src/assets/style/mixins.less +++ /dev/null @@ -1,151 +0,0 @@ -.transition(@val){ - -webkit-transition: @val; - -moz-transition: @val; - -o-transition: @val; - transition: @val; -} - -.transition(@val,@val2){ - -webkit-transition: @val,@val2; - -moz-transition: @val,@val2; - -o-transition: @val,@val2; - transition: @val,@val2; -} - -.transition(@val,@val2,@val3, @val4){ - -webkit-transition: @val,@val2,@val3, @val4; - -moz-transition: @val,@val2,@val3, @val4; - -o-transition: @val,@val2,@val3, @val4; - transition: @val,@val2,@val3, @val4; -} - -.boxShadow(@val){ - -moz-box-shadow: @val; - -webkit-box-shadow: @val; - box-shadow: @val; -} - -.borderRadius(@val) { - -moz-border-radius: @val; - -webkit-border-radius: @val; - border-radius: @val; -} - -.boxSizing{ - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.flex-display(@display: flex) { - display: ~"-webkit-@{display}"; - display: ~"-ms-@{display}box"; // IE10 uses -ms-flexbox - display: ~"-ms-@{display}"; // IE11 - display: @display; -} - -.flex(@columns: initial) { - -webkit-flex: @columns; - -ms-flex: @columns; - flex: @columns; -} - -// Flex Flow Direction -// - applies to: flex containers -// row | row-reverse | column | column-reverse -.flex-direction(@direction: row) { - -webkit-flex-direction: @direction; - -ms-flex-direction: @direction; - flex-direction: @direction; - } - - // Flex Line Wrapping - // - applies to: flex containers - // nowrap | wrap | wrap-reverse - .flex-wrap(@wrap: nowrap) { - -webkit-flex-wrap: @wrap; - -ms-flex-wrap: @wrap; - flex-wrap: @wrap; - } - - // Flex Direction and Wrap - // - applies to: flex containers - // || - .flex-flow(@flow) { - -webkit-flex-flow: @flow; - -ms-flex-flow: @flow; - flex-flow: @flow; - } - - // Display Order - // - applies to: flex items - // - .flex-order(@order: 0) { - -webkit-order: @order; - -ms-order: @order; - order: @order; - } - - // Flex grow factor - // - applies to: flex items - // - .flex-grow(@grow: 0) { - -webkit-flex-grow: @grow; - -ms-flex-grow: @grow; - flex-grow: @grow; - } - - // Flex shrink - // - applies to: flex item shrink factor - // - .flex-shrink(@shrink: 1) { - -webkit-flex-shrink: @shrink; - -ms-flex-shrink: @shrink; - flex-shrink: @shrink; - } - - // Flex basis - // - the initial main size of the flex item - // - applies to: flex itemsnitial main size of the flex item - // - .flex-basis(@width: auto) { - -webkit-flex-basis: @width; - -ms-flex-basis: @width; - flex-basis: @width; - } - - // Axis Alignment - // - applies to: flex containers - // flex-start | flex-end | center | space-between | space-around - .justify-content(@justify: flex-start) { - -webkit-justify-content: @justify; - -ms-justify-content: @justify; - justify-content: @justify; - } - - // Packing Flex Lines - // - applies to: multi-line flex containers - // flex-start | flex-end | center | space-between | space-around | stretch - .align-content(@align: stretch) { - -webkit-align-content: @align; - -ms-align-content: @align; - align-content: @align; - } - - // Cross-axis Alignment - // - applies to: flex containers - // flex-start | flex-end | center | baseline | stretch - .align-items(@align: stretch) { - -webkit-align-items: @align; - -ms-align-items: @align; - align-items: @align; - } - - // Cross-axis Alignment - // - applies to: flex items - // auto | flex-start | flex-end | center | baseline | stretch - .align-self(@align: auto) { - -webkit-align-self: @align; - -ms-align-self: @align; - align-self: @align; - } \ No newline at end of file diff --git a/src/assets/style/mixins.scss b/src/assets/style/mixins.scss new file mode 100644 index 00000000..f491a6cb --- /dev/null +++ b/src/assets/style/mixins.scss @@ -0,0 +1,151 @@ +@mixin transition($val){ + -webkit-transition: $val; + -moz-transition: $val; + -o-transition: $val; + transition: $val; +} + +@mixin transition($val,$val2:''){ + -webkit-transition: $val,$val2; + -moz-transition: $val,$val2; + -o-transition: $val,$val2; + transition: $val,$val2; +} + +// @mixin transition($val,$val2,$val3, $val4){ +// -webkit-transition: $val,$val2,$val3, $val4; +// -moz-transition: $val,$val2,$val3, $val4; +// -o-transition: $val,$val2,$val3, $val4; +// transition: $val,$val2,$val3, $val4; +// } + +@mixin boxShadow($val){ + -moz-box-shadow: $val; + -webkit-box-shadow: $val; + box-shadow: $val; +} + +@mixin borderRadius($val) { + -moz-border-radius: $val; + -webkit-border-radius: $val; + border-radius: $val; +} + +@mixin boxSizing{ + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@mixin flex-display($display: flex) { + display: "-webkit-${display}"; + display: "-ms-${display}box"; // IE10 uses -ms-flexbox + display: "-ms-${display}"; // IE11 + display: $display; +} + +@mixin flex($columns: initial) { + -webkit-flex: $columns; + -ms-flex: $columns; + flex: $columns; +} + +// Flex Flow Direction +// - applies to: flex containers +// row | row-reverse | column | column-reverse +@mixin flex-direction($direction: row) { + -webkit-flex-direction: $direction; + -ms-flex-direction: $direction; + flex-direction: $direction; + } + + // Flex Line Wrapping + // - applies to: flex containers + // nowrap | wrap | wrap-reverse + @mixin flex-wrap($wrap: nowrap) { + -webkit-flex-wrap: $wrap; + -ms-flex-wrap: $wrap; + flex-wrap: $wrap; + } + + // Flex Direction and Wrap + // - applies to: flex containers + // || + @mixin flex-flow($flow) { + -webkit-flex-flow: $flow; + -ms-flex-flow: $flow; + flex-flow: $flow; + } + + // Display Order + // - applies to: flex items + // + @mixin flex-order($order: 0) { + -webkit-order: $order; + -ms-order: $order; + order: $order; + } + + // Flex grow factor + // - applies to: flex items + // + @mixin flex-grow($grow: 0) { + -webkit-flex-grow: $grow; + -ms-flex-grow: $grow; + flex-grow: $grow; + } + + // Flex shrink + // - applies to: flex item shrink factor + // + @mixin flex-shrink($shrink: 1) { + -webkit-flex-shrink: $shrink; + -ms-flex-shrink: $shrink; + flex-shrink: $shrink; + } + + // Flex basis + // - the initial main size of the flex item + // - applies to: flex itemsnitial main size of the flex item + // + @mixin flex-basis($width: auto) { + -webkit-flex-basis: $width; + -ms-flex-basis: $width; + flex-basis: $width; + } + + // Axis Alignment + // - applies to: flex containers + // flex-start | flex-end | center | space-between | space-around + @mixin justify-content($justify: flex-start) { + -webkit-justify-content: $justify; + -ms-justify-content: $justify; + justify-content: $justify; + } + + // Packing Flex Lines + // - applies to: multi-line flex containers + // flex-start | flex-end | center | space-between | space-around | stretch + @mixin align-content($align: stretch) { + -webkit-align-content: $align; + -ms-align-content: $align; + align-content: $align; + } + + // Cross-axis Alignment + // - applies to: flex containers + // flex-start | flex-end | center | baseline | stretch + @mixin align-items($align: stretch) { + -webkit-align-items: $align; + -ms-align-items: $align; + align-items: $align; + } + + // Cross-axis Alignment + // - applies to: flex items + // auto | flex-start | flex-end | center | baseline | stretch + @mixin align-self($align: auto) { + -webkit-align-self: $align; + -ms-align-self: $align; + align-self: $align; + } \ No newline at end of file diff --git a/src/assets/style/primeng.overrides.less b/src/assets/style/primeng.overrides.scss similarity index 70% rename from src/assets/style/primeng.overrides.less rename to src/assets/style/primeng.overrides.scss index b037bfc5..5df69271 100644 --- a/src/assets/style/primeng.overrides.less +++ b/src/assets/style/primeng.overrides.scss @@ -1,5 +1,5 @@ -@import "colors.less"; -@import "mixins.less"; +@import "colors.scss"; +@import "mixins.scss"; .ui-growl{ z-index: 4000 !important; @@ -19,39 +19,39 @@ font-size: 18px ; padding: 0 20px ; width: 100% ; - .boxSizing(); + @include boxSizing(); border-radius: 0 ; &--error{ - border-color: @error; - .transition(all .3s); + border-color: $error; + @include transition(all .3s); } &::-webkit-input-placeholder { /* Chrome/Opera/Safari */ font-family: ProximaRegularThin; font-size: 18px; - color:@text_input; + color:$text_input; } &::-moz-placeholder { /* Firefox 19+ */ font-family: ProximaRegularThin; font-size: 18px; - color:@text_input; + color:$text_input; } &:-ms-input-placeholder { /* IE 10+ */ font-family: ProximaRegularThin; font-size: 18px; - color:@text_input; + color:$text_input; } &:-moz-placeholder { /* Firefox 18- */ font-family: ProximaRegularThin; font-size: 18px; - color:@text_input; + color:$text_input; } &:focus{ outline: none ; border: 1px solid #dddddd ; - .boxShadow(none); + @include boxShadow(none); } } @@ -59,20 +59,20 @@ display: block; font-family: ProximaRegular; font-size: 14px; - color:@text_h; + color:$text_h; margin-bottom: 5px; &__error{ - color:@error; + color:$error; float: right; } } //file loader .ui-fileupload-buttonbar{ - background: @green_main ; + background: $green_main ; border: none; - .borderRadius(0); + @include borderRadius(0); } @@ -84,9 +84,7 @@ //checkbox -.ui-chkbox{ -} //Container element .ui-chkbox-box{ background-color: #EEF1F3; border: 2px solid #5F5F5F; @@ -97,15 +95,13 @@ } } //Container of icon. -.ui-chkbox-icon{ - -} //Icon element. + .ui-chkbox-label{ //display: block; font-family: ProximaRegular; font-size: 12px; - color:@text_h; + color:$text_h; margin: 0; } //Label element. @@ -126,8 +122,8 @@ .ui-chkbox-box.ui-state-active, .ui-radiobutton-box.ui-state-active { background: #EEF1F3 !important;; border: 2px solid #5F5F5F; - color:@text_h; - .boxShadow(none); + color:$text_h; + @include boxShadow(none); &:focus{ background: #EEF1F3 !important;; } @@ -138,42 +134,29 @@ } .ui-growl-message-error{ - background: @error !important; -} - -.ui-label-active{ - -} //Label element of a checked state. - -.ui-label-focus{ - -}//Label element of a focused state. - -.ui-label-disabled{ - + background: $error !important; } - .ui-fileupload-files{ width:100% !important; } .ui-fileupload-buttonbar{ - background: @sap_bg; + background: $sap_bg; } .ui-button{ - background: @text_white !important; - border: 1px solid @text_h !important; + background: $text_white !important; + border: 1px solid $text_h !important; &:hover{ - background: @text_white !important; + background: $text_white !important; } } .ui-fileupload-choose,.ui-widget button{ - color: @text_h !important; + color: $text_h !important; cursor: pointer; display: inline-block; font-family: ProximaRegularLight; @@ -183,23 +166,19 @@ text-decoration: none; text-align: center; vertical-align:middle !important; - .boxSizing(); - .transition(all .3s); - .borderRadius(2px); + @include boxSizing(); + @include transition(all .3s); + @include borderRadius(2px); } -//tooltip -.ui-tooltip { - -} .ui-tooltip-arrow{ - border-top-color: @text_h !important; + border-top-color: $text_h !important; } .ui-tooltip-text{ - background: @text_h !important; - color: @text_white !important; + background: $text_h !important; + color: $text_white !important; font-family: ProximaRegularThin; } \ No newline at end of file diff --git a/src/assets/style/styles.less b/src/assets/style/styles.scss similarity index 63% rename from src/assets/style/styles.less rename to src/assets/style/styles.scss index 2140b156..52930af0 100644 --- a/src/assets/style/styles.less +++ b/src/assets/style/styles.scss @@ -1,45 +1,42 @@ -@import "colors.less"; -@import "mixins.less"; -@import "primeng.overrides.less"; +@import "colors.scss"; +@import "mixins.scss"; +@import "primeng.overrides.scss"; -body{ - //overflow-y:scroll; -} /********** * Colors ***********/ .grey-bg{ - background-color: @grey_bg; + background-color: $grey_bg; } .grey{ - background-color: @grey !important; + background-color: $grey !important; } .green-bg{ - background-color: @green_bg; + background-color: $green_bg; } .sap{ - background-color: @sap_bg !important; + background-color: $sap_bg !important; } .automotive{ - background-color: @auto_bg !important; + background-color: $auto_bg !important; } .horizontal{ - background-color: @hor_bg !important; + background-color: $hor_bg !important; } .digital-integration{ - background-color: @hor_bg !important; + background-color: $hor_bg !important; } .vertical{ - background-color: @ver_bg !important; + background-color: $ver_bg !important; } diff --git a/webpack.config.js b/webpack.config.js index 4fcf2766..f8a48164 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -78,7 +78,7 @@ module.exports = { "./src/polyfills.ts" ], "styles": [ - "./src/assets/style/styles.less" + "./src/assets/style/styles.scss" ] }, "output": { @@ -114,7 +114,7 @@ module.exports = { }, { "exclude": [ - path.join(process.cwd(), "src/assets/style/styles.less") + path.join(process.cwd(), "src/assets/style/styles.scss") ], "test": /\.css$/, "use": [ @@ -137,7 +137,7 @@ module.exports = { }, { "exclude": [ - path.join(process.cwd(), "src/assets/style/styles.less") + path.join(process.cwd(), "src/assets/style/styles.scss") ], "test": /\.scss$|\.sass$/, "use": [ @@ -168,9 +168,9 @@ module.exports = { }, { "exclude": [ - path.join(process.cwd(), "src/assets/style/styles.less") + path.join(process.cwd(), "src/assets/style/styles.scss") ], - "test": /\.less$/, + "test": /\.scss$/, "use": [ "exports-loader?module.exports.toString()", { @@ -197,7 +197,7 @@ module.exports = { }, { "exclude": [ - path.join(process.cwd(), "src/assets/style/styles.less") + path.join(process.cwd(), "src/assets/style/styles.scss") ], "test": /\.styl$/, "use": [ @@ -227,7 +227,7 @@ module.exports = { }, { "include": [ - path.join(process.cwd(), "src/assets/style/styles.less") + path.join(process.cwd(), "src/assets/style/styles.scss") ], "test": /\.css$/, "use": [ @@ -250,7 +250,7 @@ module.exports = { }, { "include": [ - path.join(process.cwd(), "src/assets/style/styles.less") + path.join(process.cwd(), "src/assets/style/styles.scss") ], "test": /\.scss$|\.sass$/, "use": [ @@ -281,9 +281,9 @@ module.exports = { }, { "include": [ - path.join(process.cwd(), "src/assets/style/styles.less") + path.join(process.cwd(), "src/assets/style/styles.scss") ], - "test": /\.less$/, + "test": /\.scss$/, "use": [ "style-loader", { @@ -310,7 +310,7 @@ module.exports = { }, { "include": [ - path.join(process.cwd(), "src/assets/style/styles.less") + path.join(process.cwd(), "src/assets/style/styles.scss") ], "test": /\.styl$/, "use": [ From 5883594142522a5c19d2de3c0f8466e0c2f72423 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Mon, 12 Feb 2018 00:43:32 +0300 Subject: [PATCH 005/270] Documentation Comments added to all feature components except technologies Projects compiles Fonts not found --- .../list/list-item/list-item.component.scss | 1 + .../list/list-item/list-item.component.ts | 3 +- src/app/core/header/header.component.html | 4 +- src/app/core/header/header.component.ts | 4 +- .../employee-picker.component.html | 2 +- .../employee-picker.component.ts | 46 ++++++---- .../new-project/new-project.component.ts | 87 +++++++++++++++---- .../project-history.component.html | 3 +- .../project-history.component.ts | 30 +++++-- .../project-item/project-item.component.ts | 23 ++++- .../project-list/project-list.component.html | 2 +- .../project-list/project-list.component.ts | 75 +++++++++++++--- .../project-confirmation.component.ts | 7 ++ .../project-modal/project-modal.component.ts | 21 ++++- .../project/project/project.component.ts | 53 ++++++++--- src/assets/style/colors.scss | 8 +- 16 files changed, 282 insertions(+), 87 deletions(-) diff --git a/src/app/controls/list/list-item/list-item.component.scss b/src/app/controls/list/list-item/list-item.component.scss index 80a34ba2..fb4caad7 100644 --- a/src/app/controls/list/list-item/list-item.component.scss +++ b/src/app/controls/list/list-item/list-item.component.scss @@ -100,6 +100,7 @@ &--active{ background-color: $sap_bg; + @include transition(all .4s); } } diff --git a/src/app/controls/list/list-item/list-item.component.ts b/src/app/controls/list/list-item/list-item.component.ts index 859f6f77..efe32a61 100644 --- a/src/app/controls/list/list-item/list-item.component.ts +++ b/src/app/controls/list/list-item/list-item.component.ts @@ -38,7 +38,8 @@ export class ListItemComponent implements AfterContentInit { } selectRole($event) { - this.model.role = this.roles.filter(item => item.id === $event.target.value)[0]; + // tslint:disable-next-line:triple-equals + this.model.role = this.roles.filter(item => item.id == $event.target.value)[0]; this.model.active = true; this.model.participation = 100.00; this.clicked.emit(this.model); diff --git a/src/app/core/header/header.component.html b/src/app/core/header/header.component.html index 09b2a41b..43713786 100644 --- a/src/app/core/header/header.component.html +++ b/src/app/core/header/header.component.html @@ -1,11 +1,11 @@ -
+
diff --git a/client/src/components/.DS_Store b/client/src/components/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3e1a1b2ba0a38f91771f8e3b8c4aea62b4f7ed73 GIT binary patch literal 8196 zcmeHMNo*WN6#d_8FBrF-#Wpy}1Ur@uCLZsJoS5+vB^CsmjCUuoXQrFDlb&uf-7~i1 zIQRx(Ig&u&7C5j-fDl3g<-!Fxaj}#{To4B?2sm)z2EVF$25*5=a0FeWs$X6I|5{$Z z=|8^*0I)Z$Hv?1xfJBu^O{Hdw!t|_eDtZ2hLK4XzzyW)}auRXNiEpwF1_A^E1OfyC z1OfyC1nvg}C}y)F-6ie|ZO{e?1PJ^u5n#`U5LG54zFZNKKRT%4DFDd=8s>%ilm~F1 zkS`;?ToIDH(wriDK;ISp6a$4j=|jw%WW<*%LJD_4;ST7pjDCiKe0A~*adW_kkU<+D z5FoG_0hYTLL4q>(Bz@NB@9eA8MYaA9UbwRabC4pt^I(vd2kx4DpV`0rPxkS7cg}x5 z@J)QqGF>kmzJ+=D1%*Y$lB7sViE<`7>&!>Jn3r~YW2q^2H5Bt^<9>hGajaZF79TZ@ z`DtxupJRJ5(>7Av+0+d(IX!0Dx-;MFq;1{h^F)P0l4MDq)+(2lTH4ziLoFSLmK#G$ zot@#vP+M!q^0F*d9B4i|Fq2%oxO8dx@*Di_KHkec)KRa(vuOICj*$XiRIRE}e6LE{9S^hM%b{5wj9$E9MzJmc@+Rv4mr#leRnV z84Dg8nRK0$*T)B^H7)HLrwp<;Ge$poxzk!Xn`v;)GacI+ zw&7swp(8!350+|W6&rN7`9_cqYN8m znR``Ks_J+;Za$Yby+y4?lK5!#9#uK5(>6{zI-5<`K9z+1{ynNX#WZ~>gIe8pI8di5 z!!8|4i}{9+KBg$c7w8^puD?`MSW!o;SlqBQT^8%KwJYjaMx0H1(jPp$Ls7>QPBKYH zas9EQ-Ku()E&Ei=^#l(w#A#&+lq|-w=VD0)@0nJ)Nd~t@017z?%cI|Uv0zVEuBYta(8gUZCgjHwM^pl z5&Yo1$?}2|cD16i>LImS*_);DMtYAB(~Jd)5nC%3*89~OiAbVJ{8Fh?>t&*`hC*AX zHcFC~Cv;6}vrNp@@`bKV>5zz{TA|P$R=Q+ju~s0o-AY6vvT8*_TdnlVvIc*#?r%8v z9()2{65qaq@8L({+Hb@&B#xD073WwD)?ytt5zkt%72B~JpTHjC8e`hiIEc^SBu?QO zJWG5tiEkDr(ZK~=#3j5$yn6v(#Fy}8d=;iKcAJvCol? zF|~k44F|mS@d7JIw>G}y?Eb59B6mRDO;~XXW$Vz{fEs~w4@
-
-
{{ project.line }}
-
-
{{ project.name }}
-
{{ project.domain }}
-
{{ project.description }}
- {{ project.teamcount }} -
{{ new Date(project.startdate).toLocaleDateString() }}
-
-
+ v-bind:project="project"> + +
@@ -33,7 +25,8 @@ import axios from 'axios'; import {Util} from '../../shared/classes/Util'; import {DELETE_PROJECT, EDIT_PROJECT, NEW_PROJECT, SET_PROJECTS} from '../../store/mutation-types'; - import {IProject} from '../../store'; + import {IProject} from '../../shared/interfaces/project'; + import ProjectCard from './project-card/ProjectCard.vue'; export default Vue.extend({ computed: { @@ -41,6 +34,9 @@ return this.$store.state.projects; } }, + components:{ + ProjectCard + }, created() { axios.get(Util.getApiUrl('projects')) .then(response => { @@ -65,7 +61,7 @@ @import '../../styles/variables'; .project { - vertical-align: middle; + vertical-align: top; display: inline-block; height: 250px; width: 200px; diff --git a/client/src/components/projects/project-card/ProjectCard.test.vue b/client/src/components/projects/project-card/ProjectCard.test.vue new file mode 100644 index 00000000..e69de29b diff --git a/client/src/components/projects/project-card/ProjectCard.vue b/client/src/components/projects/project-card/ProjectCard.vue new file mode 100644 index 00000000..5beb5475 --- /dev/null +++ b/client/src/components/projects/project-card/ProjectCard.vue @@ -0,0 +1,114 @@ + + + + + \ No newline at end of file diff --git a/client/src/components/root/.DS_Store b/client/src/components/root/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..cd2ceea471260d33ba9a91aad942cd0ae25f7829 GIT binary patch literal 8196 zcmeHLTWl3Y82OoVb#O5sXl%IE<@R}4c8l^BNP;~lV419 z2TVvAl@S6F0(T?8k4*^};M314h~N29>ZDx%r%1wiMc>q{KNH6KpQUCT+YjRLTUfNF zcx}l#MbQ+kRC{`8%9|Yuj3Ddx7@0}lI%)({sjxomdCr}>kve8uvq`qG*K-5IcCCzX zwoQw=93Qn^)0^$_vaaciafYNpQB*}uva0#{U9GK6v0ZH)3r(^4_V##FY|rktg#}fq ze6*!&@Z|K|x%uZ7o_|wp12BA#K)Gz+DKAlN#U@QZ?WAa#++l^m@pHX$_eF2ycmGX( z_o}8pG%$ETOS1Jj+SHMm!1i4Kn3eHKCRw>pKn$im_h`oA_9UxF8%{dw7=hL8I79Y1 z%O6d9PIlV$#{%nYz%>)TmkD}>a?B=Qu1hkO^{uBYaCv3++bPEyc8zJP0-IEIsj{lN zOy8_;&6^5c6jrBT9QI5;i^)DzRAJd3)AdPi>CISFnu@Yi zQO?S=2E9>bhBEBaPNb$;i>u66ho7aVEj0RWtyN*BI^q~9%aN)MZLh)(s-rmxr&Mmx z_9^OE+MAxHP5NTmM7OS=;L{#5{NTup< zA}(7h-AmQbOt;W59H$d919R{yyapHGBD@9f!Uu2-uEP!Z5^lm*@HKn~Kfq7$3;YVd z!S4vD;wG%ZYOKLJ+=+2)!M)gtUAPZ>@em%yBX|@?@B}8&z!Xm58O&gSSzN%E@fAFe zuj3`Wj92g~zK_@NI)03w;OBS~Z_DKs+u#3hvGsPT zr0B+nH`Q)$Xx`n?)qUqd7CgV@EE2SlybyfJ^Fchp6-4A@uGzdr(?^I_*4aWT=PAzC zaq25eHN+475xq_!wy?0dL$6ne&#Xv{^?0MMu{A_paZYM>#xK7vo-3nJYu_#S?QpWzQ8TnREFTn%o; zZCH!-*no}Lgw5EF9U=AlaR3kCL89LXj^a2@;3S%OipXctDo0NFDkaW4BjO%#rY0`6|YS0fJ{Q^2j89G!s$bz-(gE7Bw_!!GC z91RAjw*ltrK3G}cL(M4NAAvQpOBIj*_pko_|Na9-Jt71m1pc=OU~%72Uk@!m|7W6b zCp^}UQ9enTC*E&SO5s9<2**i^aGWHMD@3Atj8{k|Lb)g -
-
-
- - - Life is for sharing. - +
+ - @@ -30,6 +36,7 @@ \ No newline at end of file diff --git a/client/src/components/common/Checkbox.test.ts b/client/src/components/common/Checkbox/Checkbox.test.ts similarity index 100% rename from client/src/components/common/Checkbox.test.ts rename to client/src/components/common/Checkbox/Checkbox.test.ts diff --git a/client/src/components/common/Checkbox.vue b/client/src/components/common/Checkbox/Checkbox.vue similarity index 84% rename from client/src/components/common/Checkbox.vue rename to client/src/components/common/Checkbox/Checkbox.vue index c7dea58c..b1b29dda 100644 --- a/client/src/components/common/Checkbox.vue +++ b/client/src/components/common/Checkbox/Checkbox.vue @@ -7,6 +7,7 @@ src="./check.svg" v-if="checkedValue" > +
@@ -15,9 +16,12 @@ export default Vue.extend({ name: 'Checkbox', - props: { - checked: Boolean + data: function(){ + return { + checked: false + } }, + props: ['label'], computed: { checkedValue(): boolean { return this.checked; @@ -26,13 +30,14 @@ methods: { toggleCheck() { this.$emit('update:checked', !this.checked); + this.checked=!this.checked; } } }); diff --git a/client/src/components/projects/project-card/ProjectCard.test.vue b/client/src/components/projects/project-card/ProjectCard.test.ts similarity index 100% rename from client/src/components/projects/project-card/ProjectCard.test.vue rename to client/src/components/projects/project-card/ProjectCard.test.ts diff --git a/client/src/components/projects/project-card/ProjectCard.vue b/client/src/components/projects/project-card/ProjectCard.vue index 5beb5475..93bb3298 100644 --- a/client/src/components/projects/project-card/ProjectCard.vue +++ b/client/src/components/projects/project-card/ProjectCard.vue @@ -20,7 +20,7 @@ {{ project.teamcount }}
- {{ project.updatedAt }} + {{ project.updatedAt | date }}
@@ -28,9 +28,15 @@ \ No newline at end of file + } + diff --git a/client/src/components/common/Checkbox/Checkbox.vue b/client/src/components/common/Checkbox/Checkbox.vue index b1b29dda..268f1900 100644 --- a/client/src/components/common/Checkbox/Checkbox.vue +++ b/client/src/components/common/Checkbox/Checkbox.vue @@ -7,7 +7,6 @@ src="./check.svg" v-if="checkedValue" > -
@@ -16,12 +15,9 @@ export default Vue.extend({ name: 'Checkbox', - data: function(){ - return { - checked: false - } + props: { + checked: Boolean }, - props: ['label'], computed: { checkedValue(): boolean { return this.checked; @@ -30,7 +26,6 @@ methods: { toggleCheck() { this.$emit('update:checked', !this.checked); - this.checked=!this.checked; } } }); @@ -52,15 +47,12 @@ border-radius: $telekom-radius; border: 1px solid $checkbox-border-color; transition: all 200ms ease; - .check { position: absolute; } - &:hover { background-color: $checkbox-background-color-hover; } - &:active { background-color: $checkbox-background-color-active; } diff --git a/client/src/components/projects/Projects.vue b/client/src/components/projects/Projects.vue index 7cab6569..8199448c 100644 --- a/client/src/components/projects/Projects.vue +++ b/client/src/components/projects/Projects.vue @@ -1,23 +1,27 @@ @@ -51,7 +55,7 @@ return Array.from(new Set(this.projects.map(project => project.line))); } }, - components:{ + components: { Accordeon, ProjectCard }, @@ -106,6 +110,4 @@ } - - diff --git a/client/src/components/projects/project-card/ProjectCard.vue b/client/src/components/projects/project-card/ProjectCard.vue index dee5f9e5..2990a491 100644 --- a/client/src/components/projects/project-card/ProjectCard.vue +++ b/client/src/components/projects/project-card/ProjectCard.vue @@ -1,48 +1,48 @@ \ No newline at end of file + diff --git a/client/src/components/root/Header.vue b/client/src/components/root/Header.vue index 7ae82fb4..89d0bc17 100644 --- a/client/src/components/root/Header.vue +++ b/client/src/components/root/Header.vue @@ -5,30 +5,40 @@
@@ -50,7 +60,6 @@ padding: 0 $side-padding; box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.5); - &-nav{ margin-left: 20px; diff --git a/client/src/main.ts b/client/src/main.ts index 4555de1e..13cf2802 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -7,10 +7,10 @@ import store from './store' import './styles/styles.scss'; import Checkbox from './components/common/Checkbox/Checkbox.vue'; -//import DateFilter from './shared/filters/Date'; +import DateFilter from './shared/filters/Date'; Vue.component('Checkbox', Checkbox); -//Vue.filter('date',DateFilter); +Vue.filter('date', DateFilter); Vue.config.productionTip = false; From fbf16393372796c012e41fd52914442223bab0cc Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Mon, 12 Mar 2018 15:51:21 +0300 Subject: [PATCH 081/270] Filter fix --- client/src/components/common/Accordeon/Accordeon.vue | 12 ++++-------- .../components/projects/project-card/ProjectCard.vue | 2 +- client/src/main.ts | 4 ++-- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/client/src/components/common/Accordeon/Accordeon.vue b/client/src/components/common/Accordeon/Accordeon.vue index e52591b3..70b7c4c2 100644 --- a/client/src/components/common/Accordeon/Accordeon.vue +++ b/client/src/components/common/Accordeon/Accordeon.vue @@ -23,17 +23,13 @@ export default Vue.extend({ name: 'Accordeon', + components:{ Checkbox - }, - // props: { - // name: { - // type: String, - // required: true - // }, - // closed: Boolean - // }, + }, + props:['name', 'closed', 'items'], + computed: { closedValue(): boolean { return this.closed; diff --git a/client/src/components/projects/project-card/ProjectCard.vue b/client/src/components/projects/project-card/ProjectCard.vue index 2990a491..afcd81b3 100644 --- a/client/src/components/projects/project-card/ProjectCard.vue +++ b/client/src/components/projects/project-card/ProjectCard.vue @@ -20,7 +20,7 @@ {{ project.teamcount }}
- {{ project.updatedAt | date }} + {{ project.updatedAt }}

diff --git a/client/src/main.ts b/client/src/main.ts index 13cf2802..5958971e 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -7,10 +7,10 @@ import store from './store' import './styles/styles.scss'; import Checkbox from './components/common/Checkbox/Checkbox.vue'; -import DateFilter from './shared/filters/Date'; +//import DateFilter from './shared/filters/Date'; Vue.component('Checkbox', Checkbox); -Vue.filter('date', DateFilter); +//Vue.filter('date', DateFilter); Vue.config.productionTip = false; From ca2316aa77b6d80af5837a434fd1684a175b5c56 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Mon, 12 Mar 2018 16:56:05 +0300 Subject: [PATCH 082/270] Accordeon functionality --- .../components/common/Accordeon/Accordeon.vue | 35 ++++++++++--------- .../projects/project-card/ProjectCard.test.ts | 16 +++++++++ .../projects/project-card/ProjectCard.vue | 2 +- client/src/components/root/Header.vue | 8 +++++ client/src/main.ts | 4 +-- 5 files changed, 45 insertions(+), 20 deletions(-) diff --git a/client/src/components/common/Accordeon/Accordeon.vue b/client/src/components/common/Accordeon/Accordeon.vue index 70b7c4c2..67ad1c25 100644 --- a/client/src/components/common/Accordeon/Accordeon.vue +++ b/client/src/components/common/Accordeon/Accordeon.vue @@ -2,24 +2,24 @@
{{ name }} -
- - +
+ +
-
+
- -
+ :key="item" + > + +
@@ -52,6 +52,7 @@ &-button{ background-color: $lite-grey; display: inline-block; + cursor: pointer; height: 24px; width: 24px; line-height: 24px; diff --git a/client/src/components/projects/project-card/ProjectCard.test.ts b/client/src/components/projects/project-card/ProjectCard.test.ts index e69de29b..7bfbf6bc 100644 --- a/client/src/components/projects/project-card/ProjectCard.test.ts +++ b/client/src/components/projects/project-card/ProjectCard.test.ts @@ -0,0 +1,16 @@ +// import ProjectCard from './ProjectCard.vue'; +// import {mount} from '@vue/test-utils'; + +// describe('Project Card', () => { + +// const wrapper = mount(ProjectCard, { +// propsData: { +// projec: 'red' +// } +// }); + +// it('should render correct contents', () => { +// wrapper.vm.newProject(); +// expect(wrapper.vm.projects.length).toBe(1); +// }); +// }); diff --git a/client/src/components/projects/project-card/ProjectCard.vue b/client/src/components/projects/project-card/ProjectCard.vue index afcd81b3..2990a491 100644 --- a/client/src/components/projects/project-card/ProjectCard.vue +++ b/client/src/components/projects/project-card/ProjectCard.vue @@ -20,7 +20,7 @@ {{ project.teamcount }}
- {{ project.updatedAt }} + {{ project.updatedAt | date }}
diff --git a/client/src/components/root/Header.vue b/client/src/components/root/Header.vue index 89d0bc17..ce45fa69 100644 --- a/client/src/components/root/Header.vue +++ b/client/src/components/root/Header.vue @@ -43,6 +43,14 @@ + + diff --git a/client/src/components/root/Header.vue b/client/src/components/root/Header.vue index ce45fa69..9a1a1de3 100644 --- a/client/src/components/root/Header.vue +++ b/client/src/components/root/Header.vue @@ -5,29 +5,29 @@ @@ -45,7 +45,7 @@ @@ -117,5 +136,19 @@ diff --git a/client/src/main.ts b/client/src/main.ts index 13cf2802..83729a0a 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -7,10 +7,11 @@ import store from './store' import './styles/styles.scss'; import Checkbox from './components/common/Checkbox/Checkbox.vue'; -import DateFilter from './shared/filters/Date'; +import date from './shared/filters/Date'; Vue.component('Checkbox', Checkbox); -Vue.filter('date', DateFilter); +Vue.filter('date', date); + Vue.config.productionTip = false; diff --git a/client/src/shared/classes/Extension.ts b/client/src/shared/classes/Extension.ts index a69ac3e1..db19e434 100644 --- a/client/src/shared/classes/Extension.ts +++ b/client/src/shared/classes/Extension.ts @@ -11,7 +11,7 @@ export class Extension { */ public static getUniqueValues(source: any[] ,key: string):string[] { - const uniqueSet=new Set(source.map(item=> item[key] )); + const uniqueSet=new Set(source.map(item=> item[key] ).filter(i => i)); return Array.from(uniqueSet).sort(); } diff --git a/client/src/styles/styles.scss b/client/src/styles/styles.scss index bd5ebf20..a49a90d8 100644 --- a/client/src/styles/styles.scss +++ b/client/src/styles/styles.scss @@ -9,8 +9,18 @@ body { font-size: $base-font-size; } -.title.is-6 { - font-weight: bold; +.title{ + &.is-6{ + font-weight: bold; + } + + &.is-5{ + font-weight: 500; + } + + &.is-size-16{ + font-size: 16px; + } } .centered { diff --git a/server/seeders/20171006143303-seed-project.js b/server/seeders/20171006143303-seed-project.js index fc93fc7e..a8dae53a 100644 --- a/server/seeders/20171006143303-seed-project.js +++ b/server/seeders/20171006143303-seed-project.js @@ -107,6 +107,7 @@ module.exports = { active:false, type:'Project', program:'Sales and Aftersales', + customer: 'Daimler', startdate: new Date(), createdAt:new Date(), updatedAt:new Date() @@ -143,6 +144,7 @@ module.exports = { active:false, type:'Project', program:'Sales and Aftersales', + customer: 'Strabag', startdate: new Date(), createdAt:new Date(), updatedAt:new Date() From fde0263e2f73d2b4f489a442c66d4cd56230a550 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Wed, 14 Mar 2018 13:44:49 +0300 Subject: [PATCH 086/270] e2e fix --- client/test/e2e/features/step-definitions/projects.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/test/e2e/features/step-definitions/projects.js b/client/test/e2e/features/step-definitions/projects.js index 6ff2be83..867a8896 100644 --- a/client/test/e2e/features/step-definitions/projects.js +++ b/client/test/e2e/features/step-definitions/projects.js @@ -7,4 +7,4 @@ Given('I open project page', async () => .waitForElementVisible('#app', 5000)); Then('project is present', async () => - client.waitForElementVisible('.project', 5000)); + client.waitForElementVisible('.project-card', 5000)); From 9654511857b5a1cd3c0b776d0936886db6451f49 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Thu, 15 Mar 2018 17:40:03 +0300 Subject: [PATCH 087/270] Project filter and constants --- client/src/assets/constants/constants.json | 77 ----------- .../projects/project-filter/ProjectFilter.vue | 122 ++++++++++-------- client/src/shared/constants/constants.ts | 56 ++++++++ 3 files changed, 123 insertions(+), 132 deletions(-) delete mode 100644 client/src/assets/constants/constants.json create mode 100644 client/src/shared/constants/constants.ts diff --git a/client/src/assets/constants/constants.json b/client/src/assets/constants/constants.json deleted file mode 100644 index 29eb057a..00000000 --- a/client/src/assets/constants/constants.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "project": { - "lines": { - "automotive": [ - "Sales and Aftersales", - "Product Lifecycle Management", - "Supply Chain Management" - ], - "digital division": [ - "Airport Management", - "Big Data Solutions", - "Innovation & Product Enabling", - "HealthCare Solutions", - "Cloud Consulting & Transformation Services", - "ECM Solutions", - "Telecom Solutions", - "Rail & Transport Management" - ], - - "sap": [] - }, - "programs": [ - "Sales and Aftersales", - "Product Lifecycle Management", - "Supply Chain Management", - "Airport Management", - "Big Data Solutions", - "Innovation & Product Enabling", - "HealthCare Solutions", - "Cloud Consulting & Transformation Services", - "ECM Solutions", - "Telecom Solutions", - "Rail & Transport Management" - ], - "domains": [ - "Automotive", - "Content management", - "Health", - "Transportation", - "Public", - "Logistics" - ], - - "types": [ - "Project", - "Service" - ] - - }, - - "employee": { - "roles": [ - "Configuration", - "Development", - "Management", - "Testing" - ], - "seniority": [ - "Junior", - "Middle", - "Senior", - "PM" - ] - }, - - "technology": { - "technologies": [ - "backend", - "frontend", - "information", - "language", - "methodology", - "tools" - ] - } - -} \ No newline at end of file diff --git a/client/src/components/projects/project-filter/ProjectFilter.vue b/client/src/components/projects/project-filter/ProjectFilter.vue index 404cf997..c400cec7 100644 --- a/client/src/components/projects/project-filter/ProjectFilter.vue +++ b/client/src/components/projects/project-filter/ProjectFilter.vue @@ -2,109 +2,118 @@
- - {{ item.line }} + + {{ line.name }}
- - {{ program }} + + {{ program.name }}
- - {{ t }} + + {{ t.name }}
- - {{ domain }} + + {{ domain.name }}
- - {{ customer }} + + {{ customer.name }}
- diff --git a/client/src/components/projects/project-card/ProjectCard.vue b/client/src/components/projects/project-card/ProjectCard.vue index 2990a491..db416936 100644 --- a/client/src/components/projects/project-card/ProjectCard.vue +++ b/client/src/components/projects/project-card/ProjectCard.vue @@ -28,7 +28,7 @@ diff --git a/client/src/shared/constants/admin.constants.ts b/client/src/shared/constants/admin.constants.ts index 13dcf1d3..573f0381 100644 --- a/client/src/shared/constants/admin.constants.ts +++ b/client/src/shared/constants/admin.constants.ts @@ -1,4 +1,4 @@ -import {Types} from './constant-types'; +import {Types} from '../../store/modules/projects/constant-types'; const constants: { [key: string]: string[] } = { [Types.ROLES]: [ diff --git a/client/src/shared/constants/project.constants.ts b/client/src/shared/constants/project.constants.ts index 65a90437..3e595918 100644 --- a/client/src/shared/constants/project.constants.ts +++ b/client/src/shared/constants/project.constants.ts @@ -1,4 +1,4 @@ -import {Types} from './constant-types'; +import {Types} from '../../store/modules/projects/constant-types'; const constants: { [key: string]: string[] } = { [Types.PRODUCTION_LINE]: [ diff --git a/client/src/store/http/routes.ts b/client/src/store/http/routes.ts index 586bcbbe..d22f3226 100644 --- a/client/src/store/http/routes.ts +++ b/client/src/store/http/routes.ts @@ -1,3 +1,4 @@ export enum routes { - GET_PROJECTS = '/api/projects' + GET_PROJECTS = '/api/projects', + GET_PROJECT_ADDONS = '/api/projects/addons' } diff --git a/client/src/store/modules/projects/actions.ts b/client/src/store/modules/projects/actions.ts index 42f67ab9..d4ebb75b 100644 --- a/client/src/store/modules/projects/actions.ts +++ b/client/src/store/modules/projects/actions.ts @@ -1,4 +1,4 @@ -import {FETCH_PROJECTS,SET_CUSTOMERS ,SET_PROJECTS} from './project-types'; +import {FETCH_PROJECTS, FETCH_ADDONS,SET_CUSTOMERS ,SET_PROJECTS, SET_LINES, SET_PROGRAMS, SET_DOMAINS, SET_TYPES} from './project-types'; import {ProjectService} from './project.service'; import {Extension} from '../../../shared/classes/Extension'; import {ActionTree} from 'vuex'; @@ -14,6 +14,16 @@ export const actions:ActionTree = { commit(SET_PROJECTS, response.data); commit(SET_CUSTOMERS, Extension.getUniqueValues(response.data, 'customer')); }) + }, + [FETCH_ADDONS]({commit}) { + return service.getProjectAddons() + .then((response) => { + commit(SET_LINES, response.data.lines); + commit(SET_PROGRAMS, response.data.programs); + commit(SET_DOMAINS, response.data.domains); + commit(SET_TYPES, response.data.types); + commit(SET_CUSTOMERS, response.data.customers); + }) } }; diff --git a/client/src/shared/constants/constant-types.ts b/client/src/store/modules/projects/constant-types.ts similarity index 100% rename from client/src/shared/constants/constant-types.ts rename to client/src/store/modules/projects/constant-types.ts diff --git a/client/src/store/modules/projects/getters.ts b/client/src/store/modules/projects/getters.ts new file mode 100644 index 00000000..41dea57e --- /dev/null +++ b/client/src/store/modules/projects/getters.ts @@ -0,0 +1,17 @@ +import {GET_ADDONS} from './project-types'; +import {IProjectState} from './index'; +import {Types} from './constant-types'; + + +export const getters = { + + [GET_ADDONS](state: IProjectState) { + return { + [Types.PRODUCTION_LINE]: state.lines, + programs: state.programs, + domains: state.domains, + types: state.types, + customers: state.customers + } + } +} diff --git a/client/src/store/modules/projects/index.ts b/client/src/store/modules/projects/index.ts index 101e7fda..907f5cde 100644 --- a/client/src/store/modules/projects/index.ts +++ b/client/src/store/modules/projects/index.ts @@ -1,21 +1,36 @@ import {mutations} from './mutations'; import {actions} from './actions'; +import {getters} from './getters'; import {IProject} from '../../../shared/interfaces/IProject'; +import {ICustomer} from '../../../shared/interfaces/ICustomer'; +import {ILine} from '../../../shared/interfaces/ILine'; +import {IProgram} from '../../../shared/interfaces/IProgram'; +import {IDomain} from '../../../shared/interfaces/IDomain'; +import {IType} from '../../../shared/interfaces/IType'; export interface IProjectState { - projects: IProject[], - customers: String[], + projects: IProject[]; + lines: ILine[]; + programs: IProgram[]; + domains: IDomain[]; + types: IType[]; + customers: ICustomer[]; loading: boolean; } const initialState: IProjectState = { - projects: [], - customers: [], + projects: new Array(), + customers: new Array(), + lines: new Array(), + programs: new Array(), + domains: new Array(), + types: new Array(), loading: true }; export default { state: {...initialState}, mutations, - actions + actions, + getters } diff --git a/client/src/store/modules/projects/mutations.ts b/client/src/store/modules/projects/mutations.ts index 9d1982ee..3e8131e2 100644 --- a/client/src/store/modules/projects/mutations.ts +++ b/client/src/store/modules/projects/mutations.ts @@ -1,13 +1,34 @@ -import {SET_CUSTOMERS, SET_PROJECTS} from './project-types'; +import {SET_CUSTOMERS, SET_PROJECTS, SET_LINES, SET_PROGRAMS, SET_DOMAINS, SET_TYPES} from './project-types'; import {IProject} from '../../../shared/interfaces/IProject'; import {IProjectState} from './index'; +import {ICustomer} from '../../../shared/interfaces/ICustomer'; +import {ILine} from '../../../shared/interfaces/ILine'; +import {IProgram} from '../../../shared/interfaces/IProgram'; +import {IDomain} from '../../../shared/interfaces/IDomain'; +import {IType} from '../../../shared/interfaces/IType'; export const mutations = { [SET_PROJECTS](state: IProjectState, payload: IProject[]) { state.projects = payload; state.loading = false; }, - [SET_CUSTOMERS](state: IProjectState, payload: String[]) { + [SET_LINES](state: IProjectState, payload: ILine[]) { + state.lines = payload; + state.loading = false; + }, + [SET_PROGRAMS](state: IProjectState, payload: IProgram[]) { + state.programs = payload; + state.loading = false; + }, + [SET_DOMAINS](state: IProjectState, payload: IDomain[]) { + state.domains = payload; + state.loading = false; + }, + [SET_TYPES](state: IProjectState, payload: IType[]) { + state.types = payload; + state.loading = false; + }, + [SET_CUSTOMERS](state: IProjectState, payload: ICustomer[]) { state.customers = payload; state.loading = false; } diff --git a/client/src/store/modules/projects/project-types.ts b/client/src/store/modules/projects/project-types.ts index bea92be5..39d82bd5 100644 --- a/client/src/store/modules/projects/project-types.ts +++ b/client/src/store/modules/projects/project-types.ts @@ -1,6 +1,18 @@ export const NEW_PROJECT = 'projects/NEW_PROJECT'; -export const SET_CUSTOMERS ='projects/SET_CUSTOMERS'; -export const SET_PROJECTS = 'projects/SET_PROJECTS'; -export const FETCH_PROJECTS = 'projects/FETCH_PROJECTS'; export const EDIT_PROJECT = 'projects/EDIT_PROJECT'; export const DELETE_PROJECT = 'projects/DELETE_PROJECT'; + +// GET +export const GET_ADDONS = 'projects/GET_ADDONS'; + +// FETCH +export const FETCH_ADDONS = 'projects/FETCH_ADDONS'; +export const FETCH_PROJECTS = 'projects/FETCH_PROJECTS'; + +// SET +export const SET_LINES = 'projects/SET_LINES'; +export const SET_PROGRAMS = 'projects/SET_PROGRAMS'; +export const SET_DOMAINS = 'projects/SET_DOMAINS'; +export const SET_TYPES = 'projects/SET_TYPES'; +export const SET_CUSTOMERS = 'projects/SET_CUSTOMERS'; +export const SET_PROJECTS = 'projects/SET_PROJECTS'; diff --git a/client/src/store/modules/projects/project.service.ts b/client/src/store/modules/projects/project.service.ts index c36df399..38e4105f 100644 --- a/client/src/store/modules/projects/project.service.ts +++ b/client/src/store/modules/projects/project.service.ts @@ -5,5 +5,9 @@ export class ProjectService extends HttpClientService{ getProjects() { return this.get(routes.GET_PROJECTS); + }; + + getProjectAddons() { + return this.get(routes.GET_PROJECT_ADDONS); } } diff --git a/server/features/project/project.controller.ts b/server/features/project/project.controller.ts index 2a99cbb9..113745f4 100644 --- a/server/features/project/project.controller.ts +++ b/server/features/project/project.controller.ts @@ -11,6 +11,10 @@ router.get('/projects', (req, res) => projectService.getProjects() .then(Util.handleData(res))); +router.get('/projects/addons', (req, res) => + projectAddonsService.getProjectFilterModel() + .then(Util.handleData(res))); + router.get('/projects/:id', (req, res) => projectService.getProject(req.params.id) .then(Util.handleData(res))); @@ -19,10 +23,6 @@ router.get('/projects/history/:name', (req, res) => projectService.getProjectsByName(req.params.name) .then(Util.handleData(res))); -router.get('/projects/dto', (req, res) => - projectAddonsService.getProjectFilterModel() - .then(Util.handleData(res))); - // POST Requests router.post('/projects/create', projectValidator.createValidators(), (req, res) => Util.handleValidation(req, res, () => diff --git a/server/features/project/shared/project-addons.service.ts b/server/features/project/shared/project-addons.service.ts index d83ed433..c6331a24 100644 --- a/server/features/project/shared/project-addons.service.ts +++ b/server/features/project/shared/project-addons.service.ts @@ -15,7 +15,6 @@ const projectAddonsService = { const domains = await Domain.findAll({ order: [['name', 'ASC']] }); const customers = await Customer.findAll({ order: [['name', 'ASC']] }); - console.log(lines); const dto = new ProjectFilterDto(); dto.lines = lines; dto.programs = programs; diff --git a/server/features/project/shared/project.dto.ts b/server/features/project/shared/project.dto.ts index 4e032645..0f1c24c8 100644 --- a/server/features/project/shared/project.dto.ts +++ b/server/features/project/shared/project.dto.ts @@ -4,7 +4,6 @@ import {Domain} from '../../../models/Domain'; import {Customer} from '../../../models/Customer'; import {Type} from '../../../models/Type'; - export class ProjectFilterDto { lines: Line[]; programs: Program[]; From f0075908efe2551d2dc0818353803ca3bef0fbd0 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Mon, 9 Apr 2018 01:23:30 +0300 Subject: [PATCH 106/270] FIlter from db + test fix --- .../projects/project-card/ProjectCard.test.ts | 55 ++++++++++-- .../project-filter/ProjectFilter.test.ts | 2 +- .../projects/project-filter/ProjectFilter.vue | 86 ++++++++----------- .../src/shared/constants/admin.constants.ts | 52 +++++------ .../src/shared/constants/project.constants.ts | 74 ++++++++-------- client/src/shared/interfaces/IModel.ts | 1 + .../store/modules/projects/constant-types.ts | 1 + client/src/store/modules/projects/getters.ts | 11 ++- 8 files changed, 158 insertions(+), 124 deletions(-) diff --git a/client/src/components/projects/project-card/ProjectCard.test.ts b/client/src/components/projects/project-card/ProjectCard.test.ts index f1d1d1dd..9eb27971 100644 --- a/client/src/components/projects/project-card/ProjectCard.test.ts +++ b/client/src/components/projects/project-card/ProjectCard.test.ts @@ -2,20 +2,65 @@ import ProjectCard from './ProjectCard.vue'; import {IProject} from '../../../shared/interfaces/IProject'; import {ISchedule} from '../../../shared/interfaces/ISchedule'; import {mount} from '@vue/test-utils'; +import {IProgram} from '../../../shared/interfaces/IProgram'; +import {IType} from '../../../shared/interfaces/IType'; +import {IDomain} from '../../../shared/interfaces/IDomain'; +import {ICustomer} from '../../../shared/interfaces/ICustomer'; +import {ILine} from '../../../shared/interfaces/ILine'; describe('Project Card', () => { it('should render correct contents', () => { + const type: IType = { + id: '1', + name: 'type', + active: false, + createdAt:new Date(), + updatedAt: new Date() + }; + + const domain: IDomain = { + id: '1', + name: 'domain', + active: false, + createdAt:new Date(), + updatedAt: new Date(), + projects: [] as IProject[], + customers: [] as ICustomer[] + }; + + const line: ILine = { + id: '1', + name: 'line', + active: false, + programs: [] as IProgram[], + createdAt:new Date(), + updatedAt: new Date() + }; + + const program: IProgram = { + id: '1', + name: 'program', + active: false, + line: line, + projects: [] as IProject[], + createdAt:new Date(), + updatedAt: new Date() + } + const project: IProject = { id: '1', + active: false, name: 'Test', description: '123', - domain: 'Test domain', - line: 'auto', + domain: domain, + program: program, + type: type, schedules: [] as ISchedule[], - startdate: new Date().toLocaleDateString(), - enddate: new Date().toLocaleDateString(), - createdAt: new Date(), + customers: [] as ICustomer[], + startdate:new Date().toLocaleDateString(), + enddate:new Date().toLocaleDateString(), + createdAt:new Date(), updatedAt: new Date() } diff --git a/client/src/components/projects/project-filter/ProjectFilter.test.ts b/client/src/components/projects/project-filter/ProjectFilter.test.ts index 42cecc2b..825087f8 100644 --- a/client/src/components/projects/project-filter/ProjectFilter.test.ts +++ b/client/src/components/projects/project-filter/ProjectFilter.test.ts @@ -7,7 +7,7 @@ describe('Project Filter', () => { const wrapper = mount(ProjectFilter, { store: store }); - const lines = ['digital integration', 'sap']; + const lines = [{ name: 'digital integration'}, { name: 'sap'}]; it('should convert strings to same number of models for Checkboxes', () => { diff --git a/client/src/components/projects/project-filter/ProjectFilter.vue b/client/src/components/projects/project-filter/ProjectFilter.vue index 6c4f46fb..27789701 100644 --- a/client/src/components/projects/project-filter/ProjectFilter.vue +++ b/client/src/components/projects/project-filter/ProjectFilter.vue @@ -4,7 +4,7 @@ :name="model.name" :opened="model.opened" @update:opened="model.opened = !model.opened" - v-for="model in models"> + v-for="model in modelsComputed">
@@ -25,44 +25,35 @@ import Checkbox from '../../common/Checkbox/Checkbox.vue'; import {IProjectFilter, IProjectFilterCheck} from './IProjectFilter'; import * as types from '../../../store/modules/projects/project-types'; - import {mapActions, mapGetters} from 'vuex'; - import {ILine} from '../../../shared/interfaces/ILine'; + import {IModel} from '../../../shared/interfaces/IModel'; export default Vue.extend({ - // data() { - // // return { - // // models: new Array() - // // } - // }, + data() { + return { + models: [] as IProjectFilter[] + } + }, created() { - this.fetchAddons(); - - // // TODO make it in computed property after moving constants to db - // this.models = Object.keys(Constants).map(key => { - // const model: IProjectFilter = { - // name: key, - // opened: true, - // items: this.createModelForCheckboxes(Constants[key]) - // }; - // - // return model; - // }); - // - // const customers: IProjectFilter = { - // name: 'Customers', - // opened: true, - // items: this.createModelForCheckboxes(this.$store.state.projects.customers) - // }; - // this.models.push(customers); + this.$store.dispatch(types.FETCH_ADDONS); }, computed: { - models(): ILine[] { - console.log(this.things) - return this.$store.state.projects.lines; + + modelsComputed(): IProjectFilter[] { + const addons = this.$store.getters[types.GET_ADDONS]; + this.models = [] as IProjectFilter[]; + + Object.keys(addons).forEach(key => { + const model: IProjectFilter = { + name: key, + opened: true, + items: this.createModelForCheckboxes(addons[key]) + }; + + this.models.push(model); + }); + + return this.models; }, - ...mapGetters({ - things: types.GET_ADDONS - }) }, components: { Accordion, @@ -70,24 +61,21 @@ }, methods: { - ...mapActions({ - fetchAddons: types.FETCH_ADDONS - }), // re render checkbox // will be used later for project filtering via store - // handleFilterAction(item:any, key: string){ - // item.checked = !item.checked; - // }, - // - // // Model for checkboxes must have a label - // // and boolean property checked - // createModelForCheckboxes(source: String[]) :IProjectFilterCheck[]{ - // return source.map(item => new Object({ - // value: item, - // checked: false - // }) - // ) as IProjectFilterCheck[] - // } + handleFilterAction(item:any, key: string){ + item.checked = !item.checked; + }, + + // Model for checkboxes must have a label + // and boolean property checked + createModelForCheckboxes(source: IModel[]) :IProjectFilterCheck[]{ + return source.map(item => new Object({ + value: item.name, + checked: false + }) + ) as IProjectFilterCheck[] + } } }); diff --git a/client/src/shared/constants/admin.constants.ts b/client/src/shared/constants/admin.constants.ts index 573f0381..06a12d10 100644 --- a/client/src/shared/constants/admin.constants.ts +++ b/client/src/shared/constants/admin.constants.ts @@ -1,26 +1,26 @@ -import {Types} from '../../store/modules/projects/constant-types'; - -const constants: { [key: string]: string[] } = { - [Types.ROLES]: [ - 'Configuration', - 'Development', - 'Management', - 'Testing' - ], - [Types.TECHNOLOGIES]: [ - 'backend', - 'frontend', - 'information', - 'language', - 'methodology', - 'tools' - ], - [Types.SENIORITY]: [ - 'Junior', - 'Middle', - 'Senior', - 'PM' - ] -} - -export default constants; +// import {Types} from '../../store/modules/projects/constant-types'; +// +// const constants: { [key: string]: string[] } = { +// [Types.ROLES]: [ +// 'Configuration', +// 'Development', +// 'Management', +// 'Testing' +// ], +// [Types.TECHNOLOGIES]: [ +// 'backend', +// 'frontend', +// 'information', +// 'language', +// 'methodology', +// 'tools' +// ], +// [Types.SENIORITY]: [ +// 'Junior', +// 'Middle', +// 'Senior', +// 'PM' +// ] +// } +// +// export default constants; diff --git a/client/src/shared/constants/project.constants.ts b/client/src/shared/constants/project.constants.ts index 3e595918..d4b7df7f 100644 --- a/client/src/shared/constants/project.constants.ts +++ b/client/src/shared/constants/project.constants.ts @@ -1,37 +1,37 @@ -import {Types} from '../../store/modules/projects/constant-types'; - -const constants: { [key: string]: string[] } = { - [Types.PRODUCTION_LINE]: [ - 'automotive', - 'digital integration', - 'sap' - ], - [Types.DOMAIN]: [ - 'Automotive', - 'Content management', - 'Health', - 'Transportation', - 'Public', - 'Logistics' - ], - [Types.PROGRAM]: [ - 'Sales and Aftersales', - 'Product Lifecycle Management', - 'Supply Chain Management', - 'Airport Management', - 'Big Data Solutions', - 'Innovation & Product Enabling', - 'HealthCare Solutions', - 'Cloud Consulting & Transformation Services', - 'ECM Solutions', - 'Telecom Solutions', - 'Rail & Transport Management' - ], - [Types.PROJECT_TYPE]: [ - 'Project', - 'Service', - 'Test' - ], - }; - - export default constants; +// import {Types} from '../../store/modules/projects/constant-types'; +// +// const constants: { [key: string]: string[] } = { +// [Types.PRODUCTION_LINE]: [ +// 'automotive', +// 'digital integration', +// 'sap' +// ], +// [Types.DOMAIN]: [ +// 'Automotive', +// 'Content management', +// 'Health', +// 'Transportation', +// 'Public', +// 'Logistics' +// ], +// [Types.PROGRAM]: [ +// 'Sales and Aftersales', +// 'Product Lifecycle Management', +// 'Supply Chain Management', +// 'Airport Management', +// 'Big Data Solutions', +// 'Innovation & Product Enabling', +// 'HealthCare Solutions', +// 'Cloud Consulting & Transformation Services', +// 'ECM Solutions', +// 'Telecom Solutions', +// 'Rail & Transport Management' +// ], +// [Types.PROJECT_TYPE]: [ +// 'Project', +// 'Service', +// 'Test' +// ], +// }; +// +// export default constants; diff --git a/client/src/shared/interfaces/IModel.ts b/client/src/shared/interfaces/IModel.ts index a6b0c59e..a2c0daac 100644 --- a/client/src/shared/interfaces/IModel.ts +++ b/client/src/shared/interfaces/IModel.ts @@ -4,5 +4,6 @@ */ export interface IModel { [key: string]: any; + active: boolean; id:string; } diff --git a/client/src/store/modules/projects/constant-types.ts b/client/src/store/modules/projects/constant-types.ts index 6975ae02..b5465d15 100644 --- a/client/src/store/modules/projects/constant-types.ts +++ b/client/src/store/modules/projects/constant-types.ts @@ -1,4 +1,5 @@ export enum Types { + CUSTOMER = 'Customer', PRODUCTION_LINE = 'Production line', PROGRAM = 'Program', DOMAIN = 'Domain', diff --git a/client/src/store/modules/projects/getters.ts b/client/src/store/modules/projects/getters.ts index 41dea57e..e5e8b3fe 100644 --- a/client/src/store/modules/projects/getters.ts +++ b/client/src/store/modules/projects/getters.ts @@ -2,16 +2,15 @@ import {GET_ADDONS} from './project-types'; import {IProjectState} from './index'; import {Types} from './constant-types'; - export const getters = { [GET_ADDONS](state: IProjectState) { return { [Types.PRODUCTION_LINE]: state.lines, - programs: state.programs, - domains: state.domains, - types: state.types, - customers: state.customers - } + [Types.PROGRAM]: state.programs, + [Types.DOMAIN]: state.domains, + [Types.PROJECT_TYPE]: state.types, + [Types.CUSTOMER]: state.customers, + }; } } From 22fa379f6509e77848aa8ddefd59ad1b4386a4b8 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Mon, 9 Apr 2018 17:16:50 +0300 Subject: [PATCH 107/270] Last fixes --- .../projects/project-filter/ProjectFilter.vue | 3 +- .../src/shared/constants/admin.constants.ts | 26 ------------- .../src/shared/constants/project.constants.ts | 37 ------------------- client/src/store/modules/projects/getters.ts | 6 +++ .../project/shared/project-addons.service.ts | 2 +- server/models/Program.ts | 3 ++ server/sequelize/Scopes.ts | 1 + 7 files changed, 13 insertions(+), 65 deletions(-) delete mode 100644 client/src/shared/constants/admin.constants.ts delete mode 100644 client/src/shared/constants/project.constants.ts diff --git a/client/src/components/projects/project-filter/ProjectFilter.vue b/client/src/components/projects/project-filter/ProjectFilter.vue index 27789701..859997cd 100644 --- a/client/src/components/projects/project-filter/ProjectFilter.vue +++ b/client/src/components/projects/project-filter/ProjectFilter.vue @@ -10,7 +10,7 @@ :key="item.value">
+ v-on:update:checked="handleFilterAction(item, model.name)"/> {{ item.value }}
@@ -26,6 +26,7 @@ import {IProjectFilter, IProjectFilterCheck} from './IProjectFilter'; import * as types from '../../../store/modules/projects/project-types'; import {IModel} from '../../../shared/interfaces/IModel'; + import {IProgram} from "../../../shared/interfaces/IProgram"; export default Vue.extend({ data() { diff --git a/client/src/shared/constants/admin.constants.ts b/client/src/shared/constants/admin.constants.ts deleted file mode 100644 index 06a12d10..00000000 --- a/client/src/shared/constants/admin.constants.ts +++ /dev/null @@ -1,26 +0,0 @@ -// import {Types} from '../../store/modules/projects/constant-types'; -// -// const constants: { [key: string]: string[] } = { -// [Types.ROLES]: [ -// 'Configuration', -// 'Development', -// 'Management', -// 'Testing' -// ], -// [Types.TECHNOLOGIES]: [ -// 'backend', -// 'frontend', -// 'information', -// 'language', -// 'methodology', -// 'tools' -// ], -// [Types.SENIORITY]: [ -// 'Junior', -// 'Middle', -// 'Senior', -// 'PM' -// ] -// } -// -// export default constants; diff --git a/client/src/shared/constants/project.constants.ts b/client/src/shared/constants/project.constants.ts deleted file mode 100644 index d4b7df7f..00000000 --- a/client/src/shared/constants/project.constants.ts +++ /dev/null @@ -1,37 +0,0 @@ -// import {Types} from '../../store/modules/projects/constant-types'; -// -// const constants: { [key: string]: string[] } = { -// [Types.PRODUCTION_LINE]: [ -// 'automotive', -// 'digital integration', -// 'sap' -// ], -// [Types.DOMAIN]: [ -// 'Automotive', -// 'Content management', -// 'Health', -// 'Transportation', -// 'Public', -// 'Logistics' -// ], -// [Types.PROGRAM]: [ -// 'Sales and Aftersales', -// 'Product Lifecycle Management', -// 'Supply Chain Management', -// 'Airport Management', -// 'Big Data Solutions', -// 'Innovation & Product Enabling', -// 'HealthCare Solutions', -// 'Cloud Consulting & Transformation Services', -// 'ECM Solutions', -// 'Telecom Solutions', -// 'Rail & Transport Management' -// ], -// [Types.PROJECT_TYPE]: [ -// 'Project', -// 'Service', -// 'Test' -// ], -// }; -// -// export default constants; diff --git a/client/src/store/modules/projects/getters.ts b/client/src/store/modules/projects/getters.ts index e5e8b3fe..b9da09ff 100644 --- a/client/src/store/modules/projects/getters.ts +++ b/client/src/store/modules/projects/getters.ts @@ -4,6 +4,12 @@ import {Types} from './constant-types'; export const getters = { + /** + * Get properties only for + * project filter + * @param {IProjectState} state + * @returns {{}} + */ [GET_ADDONS](state: IProjectState) { return { [Types.PRODUCTION_LINE]: state.lines, diff --git a/server/features/project/shared/project-addons.service.ts b/server/features/project/shared/project-addons.service.ts index c6331a24..4915d1da 100644 --- a/server/features/project/shared/project-addons.service.ts +++ b/server/features/project/shared/project-addons.service.ts @@ -10,7 +10,7 @@ const projectAddonsService = { getProjectFilterModel: async () => { const lines = await Line.scope([Scopes.WITH_PROGRAMS]).findAll(); - const programs = await Program.findAll({ order: [['name', 'ASC']] }); + const programs = await Program.scope([Scopes.WITH_LINE]).findAll({ order: [['name', 'ASC']] }); const types = await Type.findAll(); const domains = await Domain.findAll({ order: [['name', 'ASC']] }); const customers = await Customer.findAll({ order: [['name', 'ASC']] }); diff --git a/server/models/Program.ts b/server/models/Program.ts index 6ee0fdba..ca43a8c8 100644 --- a/server/models/Program.ts +++ b/server/models/Program.ts @@ -9,6 +9,9 @@ import {Tables} from '../sequelize/Tables'; @Scopes({ withProjects: { include: [() => Project ] + }, + withLine: { + include: [() => Line] } }) @Table({ diff --git a/server/sequelize/Scopes.ts b/server/sequelize/Scopes.ts index b45512fb..947042fd 100644 --- a/server/sequelize/Scopes.ts +++ b/server/sequelize/Scopes.ts @@ -12,6 +12,7 @@ export enum Scopes { WITH_EMPLOYESS = 'withEmployees', WITH_PROJECTS = 'withProjects', WITH_PROGRAMS = 'withPrograms', + WITH_LINE = 'withLine', WITH_SCHEDULES = 'withSchedules', WITH_TECHNOLOGIES = 'withTechnologies' } From f888f6c1e2850973f5464afb140a23db010a190b Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Mon, 9 Apr 2018 23:23:19 +0300 Subject: [PATCH 108/270] store insex.ts - comment fix --- .../components/common/Accordion/Accordion.vue | 6 +- .../projects/project-filter/ProjectFilter.vue | 82 +++++++++---------- client/src/store/modules/projects/index.ts | 12 +-- 3 files changed, 50 insertions(+), 50 deletions(-) diff --git a/client/src/components/common/Accordion/Accordion.vue b/client/src/components/common/Accordion/Accordion.vue index cabf9dc3..7fa9ca60 100644 --- a/client/src/components/common/Accordion/Accordion.vue +++ b/client/src/components/common/Accordion/Accordion.vue @@ -4,12 +4,12 @@ {{ name }}
- +
- +
diff --git a/client/src/components/projects/project-filter/ProjectFilter.vue b/client/src/components/projects/project-filter/ProjectFilter.vue index 859997cd..26eae448 100644 --- a/client/src/components/projects/project-filter/ProjectFilter.vue +++ b/client/src/components/projects/project-filter/ProjectFilter.vue @@ -10,7 +10,7 @@ :key="item.value">
+ @update:checked="handleFilterAction(item, model.name)"/> {{ item.value }}
@@ -26,58 +26,58 @@ import {IProjectFilter, IProjectFilterCheck} from './IProjectFilter'; import * as types from '../../../store/modules/projects/project-types'; import {IModel} from '../../../shared/interfaces/IModel'; - import {IProgram} from "../../../shared/interfaces/IProgram"; + import {IProgram} from '../../../shared/interfaces/IProgram'; export default Vue.extend({ - data() { - return { - models: [] as IProjectFilter[] - } - }, - created() { - this.$store.dispatch(types.FETCH_ADDONS); - }, - computed: { + data() { + return { + models: [] as IProjectFilter[] + }; + }, + created() { + this.$store.dispatch(types.FETCH_ADDONS); + }, + computed: { - modelsComputed(): IProjectFilter[] { - const addons = this.$store.getters[types.GET_ADDONS]; - this.models = [] as IProjectFilter[]; + modelsComputed(): IProjectFilter[] { + const addons = this.$store.getters[types.GET_ADDONS]; + this.models = [] as IProjectFilter[]; - Object.keys(addons).forEach(key => { - const model: IProjectFilter = { - name: key, - opened: true, - items: this.createModelForCheckboxes(addons[key]) - }; + Object.keys(addons).forEach(key => { + const model: IProjectFilter = { + name: key, + opened: true, + items: this.createModelForCheckboxes(addons[key]) + }; - this.models.push(model); - }); + this.models.push(model); + }); - return this.models; - }, - }, - components: { - Accordion, - Checkbox - }, + return this.models; + } + }, + components: { + Accordion, + Checkbox + }, - methods: { - // re render checkbox - // will be used later for project filtering via store - handleFilterAction(item:any, key: string){ - item.checked = !item.checked; - }, + methods: { + // re render checkbox + // will be used later for project filtering via store + handleFilterAction(item:any, key: string) { + item.checked = !item.checked; + }, - // Model for checkboxes must have a label - // and boolean property checked - createModelForCheckboxes(source: IModel[]) :IProjectFilterCheck[]{ - return source.map(item => new Object({ + // Model for checkboxes must have a label + // and boolean property checked + createModelForCheckboxes(source: IModel[]) :IProjectFilterCheck[] { + return source.map(item => new Object({ value: item.name, checked: false }) - ) as IProjectFilterCheck[] - } + ) as IProjectFilterCheck[]; } + } }); diff --git a/client/src/store/modules/projects/index.ts b/client/src/store/modules/projects/index.ts index 907f5cde..e9b66997 100644 --- a/client/src/store/modules/projects/index.ts +++ b/client/src/store/modules/projects/index.ts @@ -19,12 +19,12 @@ export interface IProjectState { } const initialState: IProjectState = { - projects: new Array(), - customers: new Array(), - lines: new Array(), - programs: new Array(), - domains: new Array(), - types: new Array(), + projects: [], + customers: [], + lines: [], + programs: [], + domains: [], + types: [], loading: true }; From 5f4ccfd9df7880bf07874da3e03424b2cb998389 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Mon, 9 Apr 2018 23:29:53 +0300 Subject: [PATCH 109/270] ProjectFilterDto constructor --- .../project/shared/project-addons.service.ts | 7 +------ server/features/project/shared/project.dto.ts | 13 +++++++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/server/features/project/shared/project-addons.service.ts b/server/features/project/shared/project-addons.service.ts index 4915d1da..393940ba 100644 --- a/server/features/project/shared/project-addons.service.ts +++ b/server/features/project/shared/project-addons.service.ts @@ -15,12 +15,7 @@ const projectAddonsService = { const domains = await Domain.findAll({ order: [['name', 'ASC']] }); const customers = await Customer.findAll({ order: [['name', 'ASC']] }); - const dto = new ProjectFilterDto(); - dto.lines = lines; - dto.programs = programs; - dto.types = types; - dto.domains = domains; - dto.customers = customers; + const dto = new ProjectFilterDto(lines, programs, domains, types, customers); return dto; } diff --git a/server/features/project/shared/project.dto.ts b/server/features/project/shared/project.dto.ts index 0f1c24c8..350c5b4c 100644 --- a/server/features/project/shared/project.dto.ts +++ b/server/features/project/shared/project.dto.ts @@ -10,4 +10,17 @@ export class ProjectFilterDto { domains: Domain[]; types: Type[]; customers: Customer[]; + + constructor( + lines: Line[], + programs: Program[], + domains: Domain[], + types: Type[], + customers: Customer[]) { + this.lines = lines; + this.programs = programs; + this.domains = domains; + this.types = types; + this.customers = customers; + } } From ce24c305e1c02080a3e044b9f1f1f3c6224bd523 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Mon, 9 Apr 2018 23:41:55 +0300 Subject: [PATCH 110/270] Extract loading and set after all SET --- client/src/store/modules/projects/actions.ts | 3 ++- client/src/store/modules/projects/mutations.ts | 10 +++++----- client/src/store/modules/projects/project-types.ts | 2 ++ client/src/store/mutation-types.ts | 5 +---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/client/src/store/modules/projects/actions.ts b/client/src/store/modules/projects/actions.ts index d4ebb75b..a2594dda 100644 --- a/client/src/store/modules/projects/actions.ts +++ b/client/src/store/modules/projects/actions.ts @@ -1,4 +1,4 @@ -import {FETCH_PROJECTS, FETCH_ADDONS,SET_CUSTOMERS ,SET_PROJECTS, SET_LINES, SET_PROGRAMS, SET_DOMAINS, SET_TYPES} from './project-types'; +import {FETCH_PROJECTS, FETCH_ADDONS,SET_CUSTOMERS, FINISH_LOADING,SET_PROJECTS, SET_LINES, SET_PROGRAMS, SET_DOMAINS, SET_TYPES} from './project-types'; import {ProjectService} from './project.service'; import {Extension} from '../../../shared/classes/Extension'; import {ActionTree} from 'vuex'; @@ -24,6 +24,7 @@ export const actions:ActionTree = { commit(SET_DOMAINS, response.data.domains); commit(SET_TYPES, response.data.types); commit(SET_CUSTOMERS, response.data.customers); + commit(FINISH_LOADING); }) } }; diff --git a/client/src/store/modules/projects/mutations.ts b/client/src/store/modules/projects/mutations.ts index 3e8131e2..35f2c82f 100644 --- a/client/src/store/modules/projects/mutations.ts +++ b/client/src/store/modules/projects/mutations.ts @@ -1,4 +1,4 @@ -import {SET_CUSTOMERS, SET_PROJECTS, SET_LINES, SET_PROGRAMS, SET_DOMAINS, SET_TYPES} from './project-types'; +import {SET_CUSTOMERS, SET_PROJECTS, SET_LINES, SET_PROGRAMS, SET_DOMAINS, SET_TYPES, FINISH_LOADING} from './project-types'; import {IProject} from '../../../shared/interfaces/IProject'; import {IProjectState} from './index'; import {ICustomer} from '../../../shared/interfaces/ICustomer'; @@ -14,22 +14,22 @@ export const mutations = { }, [SET_LINES](state: IProjectState, payload: ILine[]) { state.lines = payload; - state.loading = false; }, [SET_PROGRAMS](state: IProjectState, payload: IProgram[]) { state.programs = payload; - state.loading = false; }, [SET_DOMAINS](state: IProjectState, payload: IDomain[]) { state.domains = payload; - state.loading = false; }, [SET_TYPES](state: IProjectState, payload: IType[]) { state.types = payload; - state.loading = false; }, [SET_CUSTOMERS](state: IProjectState, payload: ICustomer[]) { state.customers = payload; + }, + [FINISH_LOADING](state: IProjectState) { state.loading = false; } + + }; diff --git a/client/src/store/modules/projects/project-types.ts b/client/src/store/modules/projects/project-types.ts index 39d82bd5..933ee176 100644 --- a/client/src/store/modules/projects/project-types.ts +++ b/client/src/store/modules/projects/project-types.ts @@ -16,3 +16,5 @@ export const SET_DOMAINS = 'projects/SET_DOMAINS'; export const SET_TYPES = 'projects/SET_TYPES'; export const SET_CUSTOMERS = 'projects/SET_CUSTOMERS'; export const SET_PROJECTS = 'projects/SET_PROJECTS'; + +export const FINISH_LOADING = 'projects/FINISH_LOADING'; diff --git a/client/src/store/mutation-types.ts b/client/src/store/mutation-types.ts index e24cb615..8b137891 100644 --- a/client/src/store/mutation-types.ts +++ b/client/src/store/mutation-types.ts @@ -1,4 +1 @@ -export const NEW_PROJECT = 'NEW_PROJECT'; -export const SET_PROJECTS = 'SET_PROJECTS'; -export const EDIT_PROJECT = 'EDIT_PROJECT'; -export const DELETE_PROJECT = 'DELETE_PROJECT'; + From dfe8f5ffdda44afddad9a898e2b2ee00f0be7de5 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Mon, 9 Apr 2018 23:47:50 +0300 Subject: [PATCH 111/270] rename computed property --- .../projects/project-filter/ProjectFilter.vue | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/src/components/projects/project-filter/ProjectFilter.vue b/client/src/components/projects/project-filter/ProjectFilter.vue index 26eae448..7afd4730 100644 --- a/client/src/components/projects/project-filter/ProjectFilter.vue +++ b/client/src/components/projects/project-filter/ProjectFilter.vue @@ -4,7 +4,7 @@ :name="model.name" :opened="model.opened" @update:opened="model.opened = !model.opened" - v-for="model in modelsComputed"> + v-for="model in models">
@@ -31,7 +31,7 @@ export default Vue.extend({ data() { return { - models: [] as IProjectFilter[] + accordionModels: [] as IProjectFilter[] }; }, created() { @@ -39,9 +39,9 @@ }, computed: { - modelsComputed(): IProjectFilter[] { + models(): IProjectFilter[] { const addons = this.$store.getters[types.GET_ADDONS]; - this.models = [] as IProjectFilter[]; + this.accordionModels = [] as IProjectFilter[]; Object.keys(addons).forEach(key => { const model: IProjectFilter = { @@ -50,10 +50,10 @@ items: this.createModelForCheckboxes(addons[key]) }; - this.models.push(model); + this.accordionModels.push(model); }); - return this.models; + return this.accordionModels; } }, components: { From 42250bbf3364780d6497d3758014642ffbd6d478 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Thu, 12 Apr 2018 14:59:18 +0300 Subject: [PATCH 112/270] Components templates --- client/src/components/common/Chip/Chip.vue | 22 +++++++++++++++++++ .../projects/project-card/ProjectCard.vue | 6 ++--- .../technology-picker/TechnologyPicker.vue | 15 +++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 client/src/components/common/Chip/Chip.vue create mode 100644 client/src/components/technologies/technology-picker/TechnologyPicker.vue diff --git a/client/src/components/common/Chip/Chip.vue b/client/src/components/common/Chip/Chip.vue new file mode 100644 index 00000000..02a93ad9 --- /dev/null +++ b/client/src/components/common/Chip/Chip.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/client/src/components/projects/project-card/ProjectCard.vue b/client/src/components/projects/project-card/ProjectCard.vue index 7321f5e3..ebce7b41 100644 --- a/client/src/components/projects/project-card/ProjectCard.vue +++ b/client/src/components/projects/project-card/ProjectCard.vue @@ -26,19 +26,19 @@
- + + From c127e6d38719f2abbf2787e24784b1a0c3bc6bcc Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Thu, 12 Apr 2018 15:27:30 +0300 Subject: [PATCH 113/270] Store technology module --- .../src/components/projects/Projects.test.ts | 2 +- .../project-filter/ProjectFilter.test.ts | 2 +- .../technology-picker/TechnologyPicker.vue | 5 ++++- client/src/main.ts | 2 +- client/src/shared/interfaces/IModel.ts | 2 ++ client/src/shared/interfaces/ITechnology.ts | 16 ++++++++++++++++ client/src/store/http/routes.ts | 3 ++- client/src/store/index.ts | 12 ------------ client/src/store/modules/index.ts | 14 ++++++++++++++ client/src/store/modules/projects/actions.ts | 2 -- .../src/store/modules/technologies/actions.ts | 15 +++++++++++++++ .../src/store/modules/technologies/index.ts | 19 +++++++++++++++++++ .../store/modules/technologies/mutations.ts | 10 ++++++++++ .../technologies/technology-service.ts | 9 +++++++++ .../modules/technologies/technology-types.ts | 2 ++ 15 files changed, 96 insertions(+), 19 deletions(-) create mode 100644 client/src/shared/interfaces/ITechnology.ts delete mode 100644 client/src/store/index.ts create mode 100644 client/src/store/modules/index.ts create mode 100644 client/src/store/modules/technologies/actions.ts create mode 100644 client/src/store/modules/technologies/index.ts create mode 100644 client/src/store/modules/technologies/mutations.ts create mode 100644 client/src/store/modules/technologies/technology-service.ts create mode 100644 client/src/store/modules/technologies/technology-types.ts diff --git a/client/src/components/projects/Projects.test.ts b/client/src/components/projects/Projects.test.ts index 162c938f..f8c2e702 100644 --- a/client/src/components/projects/Projects.test.ts +++ b/client/src/components/projects/Projects.test.ts @@ -1,5 +1,5 @@ import Projects from './Projects.vue'; -import store from '../../store/index'; +import store from '../../store/modules/index'; import {FETCH_PROJECTS} from '../../store/modules/projects/project-types'; import {mount} from '@vue/test-utils'; diff --git a/client/src/components/projects/project-filter/ProjectFilter.test.ts b/client/src/components/projects/project-filter/ProjectFilter.test.ts index 825087f8..8c2cf1ed 100644 --- a/client/src/components/projects/project-filter/ProjectFilter.test.ts +++ b/client/src/components/projects/project-filter/ProjectFilter.test.ts @@ -1,6 +1,6 @@ import ProjectFilter from './ProjectFilter.vue'; import {mount} from '@vue/test-utils'; -import store from '../../../store/index'; +import store from '../../../store/modules/index'; describe('Project Filter', () => { diff --git a/client/src/components/technologies/technology-picker/TechnologyPicker.vue b/client/src/components/technologies/technology-picker/TechnologyPicker.vue index e22202f3..5f425c44 100644 --- a/client/src/components/technologies/technology-picker/TechnologyPicker.vue +++ b/client/src/components/technologies/technology-picker/TechnologyPicker.vue @@ -4,9 +4,12 @@ diff --git a/client/src/main.ts b/client/src/main.ts index 83729a0a..d1fe127b 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -1,7 +1,7 @@ import Vue from 'vue'; import App from './App.vue'; import router from './router/index'; -import store from './store' +import store from './store/modules/index' // Global styles import './styles/styles.scss'; diff --git a/client/src/shared/interfaces/IModel.ts b/client/src/shared/interfaces/IModel.ts index a2c0daac..373b9397 100644 --- a/client/src/shared/interfaces/IModel.ts +++ b/client/src/shared/interfaces/IModel.ts @@ -6,4 +6,6 @@ export interface IModel { [key: string]: any; active: boolean; id:string; + createdAt: Date; + updatedAt: Date; } diff --git a/client/src/shared/interfaces/ITechnology.ts b/client/src/shared/interfaces/ITechnology.ts new file mode 100644 index 00000000..63de00f2 --- /dev/null +++ b/client/src/shared/interfaces/ITechnology.ts @@ -0,0 +1,16 @@ +import {IModel} from './IModel'; +import {IProject} from './IProject'; + +export interface ITechnology extends IModel { + name: string; + domain: string; + active: boolean; + image: string; + version: string; + projects: IProject[]; + + // TODO + // employees: IEmployee[]; +} + + diff --git a/client/src/store/http/routes.ts b/client/src/store/http/routes.ts index d22f3226..3e5fe00f 100644 --- a/client/src/store/http/routes.ts +++ b/client/src/store/http/routes.ts @@ -1,4 +1,5 @@ export enum routes { GET_PROJECTS = '/api/projects', - GET_PROJECT_ADDONS = '/api/projects/addons' + GET_PROJECT_ADDONS = '/api/projects/addons', + GET_TECHNOLOGIES = '/api/technologies' } diff --git a/client/src/store/index.ts b/client/src/store/index.ts deleted file mode 100644 index eb33b295..00000000 --- a/client/src/store/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import Vue from 'vue' -import Vuex from 'vuex' - -import projects from './modules/projects'; - -Vue.use(Vuex); - -export default new Vuex.Store({ - modules: { - projects - } -}) diff --git a/client/src/store/modules/index.ts b/client/src/store/modules/index.ts new file mode 100644 index 00000000..e501edee --- /dev/null +++ b/client/src/store/modules/index.ts @@ -0,0 +1,14 @@ +import Vue from 'vue' +import Vuex from 'vuex' + +import projects from './projects/index'; +import technologies from './technologies/index'; + +Vue.use(Vuex); + +export default new Vuex.Store({ + modules: { + projects, + technologies + } +}) diff --git a/client/src/store/modules/projects/actions.ts b/client/src/store/modules/projects/actions.ts index a2594dda..a497c171 100644 --- a/client/src/store/modules/projects/actions.ts +++ b/client/src/store/modules/projects/actions.ts @@ -1,6 +1,5 @@ import {FETCH_PROJECTS, FETCH_ADDONS,SET_CUSTOMERS, FINISH_LOADING,SET_PROJECTS, SET_LINES, SET_PROGRAMS, SET_DOMAINS, SET_TYPES} from './project-types'; import {ProjectService} from './project.service'; -import {Extension} from '../../../shared/classes/Extension'; import {ActionTree} from 'vuex'; import {IProjectState} from './index'; @@ -12,7 +11,6 @@ export const actions:ActionTree = { return service.getProjects() .then((response) => { commit(SET_PROJECTS, response.data); - commit(SET_CUSTOMERS, Extension.getUniqueValues(response.data, 'customer')); }) }, diff --git a/client/src/store/modules/technologies/actions.ts b/client/src/store/modules/technologies/actions.ts new file mode 100644 index 00000000..4c3fabf6 --- /dev/null +++ b/client/src/store/modules/technologies/actions.ts @@ -0,0 +1,15 @@ +import {FETCH_TECHNOLOGIES, SET_TECHNOLOGIES} from './technology-types'; +import {TechnologyService} from './technology-service'; +import {ActionTree} from 'vuex'; +import {ITechnologyState} from './index'; + +const service = new TechnologyService(); + +export const actions: ActionTree = { + [FETCH_TECHNOLOGIES]({commit}) { + return service.getTechnologies() + .then((response) => { + commit(SET_TECHNOLOGIES, response.data); + }) + } +} diff --git a/client/src/store/modules/technologies/index.ts b/client/src/store/modules/technologies/index.ts new file mode 100644 index 00000000..4da23167 --- /dev/null +++ b/client/src/store/modules/technologies/index.ts @@ -0,0 +1,19 @@ +import {actions} from './actions'; +import {mutations} from './mutations'; +import {ITechnology} from '../../../shared/interfaces/ITechnology'; + +export interface ITechnologyState { + technologies: ITechnology[]; + loading: boolean; +} + +const initialState: ITechnologyState = { + technologies: [], + loading: true +}; + +export default { + state: {...initialState}, + mutations, + actions +} diff --git a/client/src/store/modules/technologies/mutations.ts b/client/src/store/modules/technologies/mutations.ts new file mode 100644 index 00000000..7894b59d --- /dev/null +++ b/client/src/store/modules/technologies/mutations.ts @@ -0,0 +1,10 @@ +import {SET_TECHNOLOGIES} from './technology-types'; +import {ITechnologyState} from './index'; +import {ITechnology} from '../../../shared/interfaces/ITechnology'; + +export const mutations = { + [SET_TECHNOLOGIES](state: ITechnologyState, payload: ITechnology[]) { + state.technologies = payload; + state.loading = false; + } +} diff --git a/client/src/store/modules/technologies/technology-service.ts b/client/src/store/modules/technologies/technology-service.ts new file mode 100644 index 00000000..b7de3dc7 --- /dev/null +++ b/client/src/store/modules/technologies/technology-service.ts @@ -0,0 +1,9 @@ +import {HttpClientService} from '../../http/http-client.service'; +import {routes} from '../../http/routes'; + +export class TechnologyService extends HttpClientService{ + + getTechnologies() { + return this.get(routes.GET_TECHNOLOGIES); + }; +} diff --git a/client/src/store/modules/technologies/technology-types.ts b/client/src/store/modules/technologies/technology-types.ts new file mode 100644 index 00000000..75e6da7c --- /dev/null +++ b/client/src/store/modules/technologies/technology-types.ts @@ -0,0 +1,2 @@ +export const FETCH_TECHNOLOGIES = 'technologies/FETCH_TECHNOLOGIES'; +export const SET_TECHNOLOGIES = 'technologies/SET_TECHNOLOGIES'; From b8ba45f3c37c84009ef888c8d0b12427c48909d7 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Thu, 12 Apr 2018 16:34:32 +0300 Subject: [PATCH 114/270] Chip styling --- client/src/components/common/Chip/Chip.vue | 49 ++++++++++++++++++- .../projects/project-filter/ProjectFilter.vue | 8 ++- .../technology-picker/TechnologyPicker.vue | 19 ++++++- client/src/styles/variables.scss | 1 + 4 files changed, 73 insertions(+), 4 deletions(-) diff --git a/client/src/components/common/Chip/Chip.vue b/client/src/components/common/Chip/Chip.vue index 02a93ad9..c84244df 100644 --- a/client/src/components/common/Chip/Chip.vue +++ b/client/src/components/common/Chip/Chip.vue @@ -1,5 +1,14 @@ diff --git a/client/src/styles/variables.scss b/client/src/styles/variables.scss index 9324aa87..6d6b4274 100644 --- a/client/src/styles/variables.scss +++ b/client/src/styles/variables.scss @@ -6,6 +6,7 @@ $light-black: #262626; $text-color:#383838; $text-secondary:#7C7C7C; $lite-grey:#EDEDED; +$border-color: #DCDCDC; // Font sizes $small-font-size: 15px; From b108170122ebe847efbc65451c32225e5731438f Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Thu, 12 Apr 2018 18:18:09 +0300 Subject: [PATCH 115/270] search input watcher --- .../projects/project-filter/ProjectFilter.vue | 5 +++- .../components/technologies/assets/search.svg | 20 +++++++++++++ .../technology-picker/TechnologyPicker.vue | 30 +++++++++++++++++++ client/src/styles/bulma-overrides.scss | 2 ++ client/src/styles/styles.scss | 26 ++++++++++++++++ client/src/styles/variables.scss | 1 + 6 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 client/src/components/technologies/assets/search.svg diff --git a/client/src/components/projects/project-filter/ProjectFilter.vue b/client/src/components/projects/project-filter/ProjectFilter.vue index e7e96610..d3c1534b 100644 --- a/client/src/components/projects/project-filter/ProjectFilter.vue +++ b/client/src/components/projects/project-filter/ProjectFilter.vue @@ -16,7 +16,9 @@ + name = "Technologies" + :opened="accordionOpened" + @update:opened="accordionOpened = !accordionOpened"> @@ -36,6 +38,7 @@ export default Vue.extend({ data() { return { + accordionOpened: true, accordionModels: [] as IProjectFilter[] }; }, diff --git a/client/src/components/technologies/assets/search.svg b/client/src/components/technologies/assets/search.svg new file mode 100644 index 00000000..f0f96bbf --- /dev/null +++ b/client/src/components/technologies/assets/search.svg @@ -0,0 +1,20 @@ + + + + Shape + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/client/src/components/technologies/technology-picker/TechnologyPicker.vue b/client/src/components/technologies/technology-picker/TechnologyPicker.vue index e424ef30..aba00c41 100644 --- a/client/src/components/technologies/technology-picker/TechnologyPicker.vue +++ b/client/src/components/technologies/technology-picker/TechnologyPicker.vue @@ -1,5 +1,15 @@ - - diff --git a/client/src/components/root/assets/close.svg b/client/src/components/root/assets/close.svg new file mode 100644 index 00000000..cefc2345 --- /dev/null +++ b/client/src/components/root/assets/close.svg @@ -0,0 +1,12 @@ + + + + + cancel_outline + + + From 54d24a9c9a5f81a390f4e4d8a0748187ab721452 Mon Sep 17 00:00:00 2001 From: Igogrek Date: Wed, 23 May 2018 18:42:31 +0300 Subject: [PATCH 131/270] Added placeholder --- client/src/components/root/Header/Search.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/client/src/components/root/Header/Search.vue b/client/src/components/root/Header/Search.vue index d0dbed60..574f0e3c 100644 --- a/client/src/components/root/Header/Search.vue +++ b/client/src/components/root/Header/Search.vue @@ -1,6 +1,10 @@ From 0e97332e683df7142be9a31ade0d9710aa32a923 Mon Sep 17 00:00:00 2001 From: Igogrek Date: Thu, 24 May 2018 12:38:41 +0300 Subject: [PATCH 132/270] Linter fixes --- client/.eslintrc.js | 5 +- .../components/common/Accordion/Accordion.vue | 66 ++++++++++--------- .../common/Autocomplete/Autocomplete.vue | 7 +- client/src/components/projects/Projects.vue | 28 ++++---- .../projects/project-filter/ProjectFilter.vue | 46 ++++++------- client/src/components/root/Header/Header.vue | 12 ++-- client/src/components/root/Header/Search.vue | 2 +- .../technology-picker/TechnologyPicker.vue | 1 - 8 files changed, 87 insertions(+), 80 deletions(-) diff --git a/client/.eslintrc.js b/client/.eslintrc.js index 2f7ff99e..dc2e44ee 100644 --- a/client/.eslintrc.js +++ b/client/.eslintrc.js @@ -63,6 +63,8 @@ module.exports = { 'import/prefer-default-export': 'off', // TODO enable later if really needed 'vue/require-v-for-key': 'off', + // TODO enable later if really needed + 'vue/valid-v-for': 'off', // Typescript Plugin 'typescript/adjacent-overload-signatures': ['error'], @@ -75,7 +77,8 @@ module.exports = { 'typescript/no-explicit-any': ['error'], 'typescript/no-namespace': ['error'], 'typescript/no-triple-slash-reference': ['error'], - 'typescript/type-annotation-spacing': ['error'], + // Broken + // 'typescript/type-annotation-spacing': ['error'], }, overrides: [ { diff --git a/client/src/components/common/Accordion/Accordion.vue b/client/src/components/common/Accordion/Accordion.vue index 7fa9ca60..e1b146d7 100644 --- a/client/src/components/common/Accordion/Accordion.vue +++ b/client/src/components/common/Accordion/Accordion.vue @@ -2,13 +2,17 @@
{{ name }} -
- +
+
-
+
@@ -18,8 +22,6 @@ import Vue from 'vue'; export default Vue.extend({ - name: 'accordion', - props: { name: { type: String @@ -45,36 +47,36 @@ diff --git a/client/src/components/common/Autocomplete/Autocomplete.vue b/client/src/components/common/Autocomplete/Autocomplete.vue index a24d442f..3d964890 100644 --- a/client/src/components/common/Autocomplete/Autocomplete.vue +++ b/client/src/components/common/Autocomplete/Autocomplete.vue @@ -15,9 +15,10 @@ v-if="items.length" class="dropdown-menu"> diff --git a/client/src/components/projects/Projects.vue b/client/src/components/projects/Projects.vue index 47f64b75..d09b4c69 100644 --- a/client/src/components/projects/Projects.vue +++ b/client/src/components/projects/Projects.vue @@ -9,12 +9,14 @@
- +
- + Sorted by: production line
@@ -35,10 +37,9 @@ diff --git a/client/src/components/root/Header/Header.vue b/client/src/components/root/Header/Header.vue index c1173c5c..e9d428c3 100644 --- a/client/src/components/root/Header/Header.vue +++ b/client/src/components/root/Header/Header.vue @@ -42,11 +42,13 @@ - - + + diff --git a/client/src/components/root/Header/Search.vue b/client/src/components/root/Header/Search.vue index 574f0e3c..8a55ae6d 100644 --- a/client/src/components/root/Header/Search.vue +++ b/client/src/components/root/Header/Search.vue @@ -33,6 +33,6 @@ setSearch(value: string) { this.$store.commit(SET_SEARCH, value); } - }, + } }); diff --git a/client/src/components/technologies/technology-picker/TechnologyPicker.vue b/client/src/components/technologies/technology-picker/TechnologyPicker.vue index 1c8dcc76..63dd99d7 100644 --- a/client/src/components/technologies/technology-picker/TechnologyPicker.vue +++ b/client/src/components/technologies/technology-picker/TechnologyPicker.vue @@ -46,7 +46,6 @@ }, methods: { filterTechnologies(search: string) { - console.log(search); } } }); From 7d9cfcea57c577dca940c2abd50ed8d1fb8333d9 Mon Sep 17 00:00:00 2001 From: Igogrek Date: Thu, 24 May 2018 12:43:39 +0300 Subject: [PATCH 133/270] More linter fixes --- client/.eslintrc.js | 2 -- .../src/components/projects/project-filter/ProjectFilter.vue | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/client/.eslintrc.js b/client/.eslintrc.js index dc2e44ee..5e0369de 100644 --- a/client/.eslintrc.js +++ b/client/.eslintrc.js @@ -63,8 +63,6 @@ module.exports = { 'import/prefer-default-export': 'off', // TODO enable later if really needed 'vue/require-v-for-key': 'off', - // TODO enable later if really needed - 'vue/valid-v-for': 'off', // Typescript Plugin 'typescript/adjacent-overload-signatures': ['error'], diff --git a/client/src/components/projects/project-filter/ProjectFilter.vue b/client/src/components/projects/project-filter/ProjectFilter.vue index 006c5e30..44e3427e 100644 --- a/client/src/components/projects/project-filter/ProjectFilter.vue +++ b/client/src/components/projects/project-filter/ProjectFilter.vue @@ -4,7 +4,8 @@ :name="model.name" :opened="model.opened" @update:opened="model.opened = !model.opened" - v-for="model in models"> + v-for="(model,index) in models" + :key="index">
From 53841309bb83da022d5cb74f53c10b715e69add4 Mon Sep 17 00:00:00 2001 From: Igogrek Date: Thu, 24 May 2018 13:57:49 +0300 Subject: [PATCH 134/270] Super basic modal added --- client/src/assets/images/close.svg | 12 + .../common/CommonModal/CommonModal.vue | 129 +++++++++++ .../components/projects/Project/Project.vue | 68 ++++++ .../projects/project-card/ProjectCard.vue | 139 ++++++------ .../technology-picker/TechnologyPicker.vue | 5 + client/src/main.ts | 2 + client/src/router/index.ts | 9 +- client/src/styles/bulma-overrides.scss | 13 +- client/src/styles/forms.scss | 209 ++++++++++++++++++ client/src/styles/mixins.scss | 20 ++ client/src/styles/styles.scss | 7 +- client/src/styles/transitions.scss | 23 ++ client/src/styles/typography.scss | 58 +++++ client/src/styles/variables.scss | 71 ++++++ 14 files changed, 685 insertions(+), 80 deletions(-) create mode 100644 client/src/assets/images/close.svg create mode 100644 client/src/components/common/CommonModal/CommonModal.vue create mode 100644 client/src/components/projects/Project/Project.vue create mode 100644 client/src/styles/forms.scss create mode 100644 client/src/styles/transitions.scss create mode 100644 client/src/styles/typography.scss diff --git a/client/src/assets/images/close.svg b/client/src/assets/images/close.svg new file mode 100644 index 00000000..ac5f0d4a --- /dev/null +++ b/client/src/assets/images/close.svg @@ -0,0 +1,12 @@ + + + + + cancel_outline + + + diff --git a/client/src/components/common/CommonModal/CommonModal.vue b/client/src/components/common/CommonModal/CommonModal.vue new file mode 100644 index 00000000..6a228d79 --- /dev/null +++ b/client/src/components/common/CommonModal/CommonModal.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/client/src/components/projects/Project/Project.vue b/client/src/components/projects/Project/Project.vue new file mode 100644 index 00000000..e31b5578 --- /dev/null +++ b/client/src/components/projects/Project/Project.vue @@ -0,0 +1,68 @@ + diff --git a/client/src/components/projects/project-card/ProjectCard.vue b/client/src/components/projects/project-card/ProjectCard.vue index ebce7b41..de7ec33b 100644 --- a/client/src/components/projects/project-card/ProjectCard.vue +++ b/client/src/components/projects/project-card/ProjectCard.vue @@ -1,28 +1,30 @@ @@ -46,64 +48,63 @@ diff --git a/client/src/components/technologies/technology-picker/TechnologyPicker.vue b/client/src/components/technologies/technology-picker/TechnologyPicker.vue index 63dd99d7..5fc031c0 100644 --- a/client/src/components/technologies/technology-picker/TechnologyPicker.vue +++ b/client/src/components/technologies/technology-picker/TechnologyPicker.vue @@ -57,6 +57,11 @@ .technology-picker { position: relative; + .input { + border: none; + height: auto; + } + &-search { margin-bottom: 10px; } diff --git a/client/src/main.ts b/client/src/main.ts index f2aaf05b..d179bcdf 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -8,10 +8,12 @@ import './styles/styles.scss'; import Checkbox from './components/common/Checkbox/Checkbox.vue'; import Autocomplete from './components/common/Autocomplete/Autocomplete.vue'; +import CommonModal from './components/common/CommonModal/CommonModal.vue'; import date from './shared/filters/Date'; Vue.component('Checkbox', Checkbox); Vue.component('Autocomplete', Autocomplete); +Vue.component('CommonModal', CommonModal); Vue.filter('date', date); diff --git a/client/src/router/index.ts b/client/src/router/index.ts index 54fcdd68..d22240e8 100644 --- a/client/src/router/index.ts +++ b/client/src/router/index.ts @@ -1,6 +1,7 @@ import Vue from 'vue'; import Router from 'vue-router'; import Projects from '../components/projects/Projects.vue'; +import Project from '../components/projects/Project/Project.vue'; Vue.use(Router); @@ -8,8 +9,12 @@ export default new Router({ routes: [ { path: '/', - name: 'Projects', - component: Projects, + component: Projects + }, + { + path: '/projects/:id', + component: Project, + props: true } ] }); diff --git a/client/src/styles/bulma-overrides.scss b/client/src/styles/bulma-overrides.scss index 1004b754..39c8ff9c 100644 --- a/client/src/styles/bulma-overrides.scss +++ b/client/src/styles/bulma-overrides.scss @@ -5,6 +5,8 @@ @import '~bulma/sass/utilities/initial-variables'; @import '~bulma/sass/utilities/_all'; +$container-max-size: 984px; + // Fonts $family-serif: 'TeleGrotesk Next', serif; $family-primary: $family-serif; @@ -23,9 +25,11 @@ $size-2: 48px; $size-3: 36px; $size-4: 24px; $size-5: 21px; -$size-6: 15px; -$size-7: 12px; -$sizes: $size-1 $size-2 $size-3 $size-4 $size-5 $size-6 $size-7; +$size-6: 18px; +$size-7: 15px; +$size-8: 12px; +$sizes: $size-1 $size-2 $size-3 $size-4 $size-5 $size-6 $size-7 $size-8; +$magenta-title-margin-bottom: $building-unit / 2; $subtitle-size: $size-7; @@ -50,5 +54,4 @@ $size-large: $size-5; @import '~bulma/sass/elements/form'; @import '~bulma/sass/grid/columns'; @import '~bulma/sass/components/level'; - - +@import '~bulma/sass/components/modal'; diff --git a/client/src/styles/forms.scss b/client/src/styles/forms.scss new file mode 100644 index 00000000..2cab344c --- /dev/null +++ b/client/src/styles/forms.scss @@ -0,0 +1,209 @@ +// Forms +$label-margin-bottom: $building-unit / 4; +$input-padding: $building-unit / 2; +$field-margin-bottom: $building-unit * 1.5; +$input-group-header-margin-bottom: $building-unit * 1.5; +$input-group-header-item-mb: $building-unit / 2; + +$select-padding: ($building-unit / 2) + ($building-unit * 2); + +$button-default-height: $building-unit * 3; +$button-box-shadow: $input-focus-box-shadow-size rgba($blue, .5); + +@mixin input-style() { + font-size: $base-font-size; + line-height: 22px; + padding-top: $input-padding; + padding-bottom: $input-padding; +} + +@mixin placeholder-style() { + color: $gray-184; + @include input-style; +} + +.field { + max-width: $form-field-width; + margin-bottom: $field-margin-bottom; + + &.is-width-full { + max-width: 100%; + } + + &:not(:last-child) { + margin-bottom: $field-margin-bottom; + } + + @include mobile { + width: 100%; + max-width: 100%; + } + + label.label, + a.is-pulled-right, + span.error-message { + position: relative; + z-index: 1; + margin-bottom: $label-margin-bottom; + font-size: $size-7; + line-height: $lh-7; + } + + span.error-message { + color: $red; + } + + label { + font-size: $base-font-size; + color: $gray-56; + + &.is-required { + &::after { + content: "*"; + } + } + } +} + +.input, +.textarea { + @include input-style; + color: $gray-56; + transition: $transition-default; + height: auto; + + &:hover { + background-color: $gray-237; + } + + &:active { + background-color: $gray-220; + border-color: $gray-178; + box-shadow: none; + + } + + &::-webkit-input-placeholder { /* Chrome/Opera/Safari */ + @include placeholder-style; + } + &::-moz-placeholder { /* Firefox 19+ */ + @include placeholder-style; + } + &:-ms-input-placeholder { /* IE 10+ */ + @include placeholder-style; + } + &:-moz-placeholder { /* Firefox 18- */ + @include placeholder-style; + } +} + +.input-danger { + @extend .input; + border-color: $red; + background-color: $red-253; + + &:hover, + &:active { + background-color: $red-251; + border-color: $red; + } + + &:focus { + box-shadow: $input-focus-box-shadow-size rgba($red, .5); + border-color: $red; + } +} + +.button { + transition: $transition-default; + width: 100%; + padding: $building-unit / 2 $building-unit * 2 $building-unit * 2/3; + + @media screen and (min-width: 337px) { + width: auto; + } + + &:hover { + text-decoration: none; + } + + &:focus:not(:active), + &.is-focused:not(:active) { + box-shadow: $button-box-shadow !important; + border-color: $blue; + } + + &.is-default { + height: $button-default-height; + background-color: $gray-237; + border: 1px solid $gray-178; + color: $gray-56; + border-radius: $telekom-radius; + @include font-size(6); + + &:hover { + background-color: $gray-220; + } + + &:active { + border-color: $gray-117; + background-color: $gray-199; + } + } + + &.is-primary { + border-color: $magenta-dark; + + &:hover { + background-color: $magenta-208; + border-color: $magenta-dark; + } + + &:active { + background-color: $magenta-188; + border-color: $magenta-140; + } + } +} + +.input-group { + .input-group-header { + margin-bottom: $input-group-header-margin-bottom; + + & > * { + margin-bottom: $input-group-header-item-mb; + + &:last-child { + margin-bottom: 0; + } + } + } +} + +.select { + width: 100%; + + &:not(.is-multiple)::after { + border-color: $gray-117; + right: $building-unit; + } + + select { + background-color: $gray-237; + width: 100%; + @include input-style; + + &:not(.is-multiple) { + height: auto; + + &::after { + border-color: $gray-178; + } + } + + &.is-primary { + background-color: $white; + padding-right: $select-padding; + } + } +} diff --git a/client/src/styles/mixins.scss b/client/src/styles/mixins.scss index 1015e728..6399766b 100644 --- a/client/src/styles/mixins.scss +++ b/client/src/styles/mixins.scss @@ -3,3 +3,23 @@ left: 50%; transform: translateX(-50%); } + + +@mixin absolute-y-center { + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +@mixin absolute-x-center { + position: absolute; + left: 50%; + transform: translateX(-50%); +} + +@mixin absolute-xy-center { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} diff --git a/client/src/styles/styles.scss b/client/src/styles/styles.scss index 1df2bad8..5261f597 100644 --- a/client/src/styles/styles.scss +++ b/client/src/styles/styles.scss @@ -5,6 +5,9 @@ // Override bulma overrides @import './bulma-overrides'; +@import './typography'; +@import './forms'; + body { font-size: $base-font-size; } @@ -57,10 +60,6 @@ body { .input { - border: none; - height: auto; - padding: 0; - &-box { border: 1px solid $border-color; border-radius: 2px; diff --git a/client/src/styles/transitions.scss b/client/src/styles/transitions.scss new file mode 100644 index 00000000..39695645 --- /dev/null +++ b/client/src/styles/transitions.scss @@ -0,0 +1,23 @@ +// Vue transition classes + +// opacity +.opacity-enter-active, .fade-leave-active { + transition: opacity .2s; +} + +.opacity-enter, .opacity-leave-to { + opacity: 0; +} + + +// fade +.fade-vertical-enter-active, .fade-leave-active { + transition: .2s; +} + +.fade-vertical-enter, .fade-vertical-leave-to { + opacity: 0; + height: 0; + padding-top: 0; + padding-bottom: 0; +} diff --git a/client/src/styles/typography.scss b/client/src/styles/typography.scss new file mode 100644 index 00000000..e6f07aa7 --- /dev/null +++ b/client/src/styles/typography.scss @@ -0,0 +1,58 @@ +$font-list: + ( + lineHeight: $lh-1, + fontSize: $size-1, + fontWeight: $font-weight-thin + ) + ( + lineHeight: $lh-2, + fontSize: $size-2, + fontWeight: $font-weight-thin + ) + ( + lineHeight: $lh-3, + fontSize: $size-3, + fontWeight: $font-weight-medium + ) + ( + lineHeight: $lh-4, + fontSize: $size-4, + fontWeight: $font-weight-thin + ) + ( + lineHeight: $lh-5, + fontSize: $size-5, + fontWeight: $font-weight-medium + ) + ( + lineHeight: $lh-6, + fontSize: $size-6, + fontWeight: $font-weight-regular + ) + ( + lineHeight: $lh-7, + fontSize: $size-7, + fontWeight: $font-weight-regular + ) + ( + lineHeight: $lh-8, + fontSize: $size-8, + fontWeight: $font-weight-regular + ); + + +@each $font in $font-list { + $i: index($font-list, $font); + .is-size-#{$i} { + line-height: map-get($font, lineHeight); + font-size: map-get($font, fontSize); + font-weight: map-get($font, fontWeight); + } +} + +@mixin font-size($sizeIndex) { + $font: nth($font-list, $sizeIndex); + line-height: map-get($font, lineHeight); + font-size: map-get($font, fontSize); + font-weight: map-get($font, fontWeight); +} diff --git a/client/src/styles/variables.scss b/client/src/styles/variables.scss index 44edac90..d0021810 100644 --- a/client/src/styles/variables.scss +++ b/client/src/styles/variables.scss @@ -1,3 +1,6 @@ + +$building-unit: 12px; + // Colors $magenta: #C41065; $magenta-dark: #A00053; @@ -16,9 +19,77 @@ $base-font-size: 18px; $header-height:65px; $header-bar-height: 82px; +//Forms +$form-field-width: 312px; + +//Transition +$transition-default: .2s; + +//Typography +//line-heights +$lh-1: 72px; +$lh-2: 54px; +$lh-3: 42px; +$lh-4: 30px; +$lh-5: 24px; +$lh-6: 24px; +$lh-7: 18px; +$lh-8: 14px; + +//font-weights +$font-weight-thin: 100; +$font-weight-regular: 400; +$font-weight-medium: 500; +$font-weight-bold: 700; +$font-weight-ultra: 900; + +$container-min-width: 648px; +$form-max-width: $form-field-width * 2 + $building-unit * 2; + //Shared $top-border-height:5px; $side-padding:20px; $telekom-radius: 4px; $shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.5); $input-padding: 5px; + + + +// Colors +$magenta: #E20074; +$white: #FFFFFF; +$black: #000000; + +$gray-38: #262626; +$gray-178: #B2B2B2; +$gray-199: #C7C7C7; +$gray-220: #DCDCDC; +$gray-237: #EDEDED; +$gray-248: #F8F8F8; +$gray-56: #383838; +$gray-117: #757575; +$gray-184: #B8B8B8; +$gray-194: #C2C2C2; +$gray-230: #E6E6E6; + +$magenta-dark: #A00053; +$magenta-208: #D0006B; +$magenta-188: #BC0060; +$magenta-140: #8C0048; +$magenta-238: #EE7DB7; + +$red: #D90000; +$red-251: #FBE6E6; +$red-253: #FDF2F2; + +$green: #6BB324; + +$blue: #00A0DE; +$dark-blue: #007FAF; +$dark-blue-121: #005879; + +$purple-151: #5A4C97; + +$red-217: #D90000; +$red-a10: #6BB324; +$red-a05: #FDF2F2; From d23cee10f61bfdbe30a76660f325bc8bb324abe7 Mon Sep 17 00:00:00 2001 From: Igogrek Date: Thu, 24 May 2018 14:00:02 +0300 Subject: [PATCH 135/270] Cleanup --- client/src/components/projects/Project/Project.vue | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/client/src/components/projects/Project/Project.vue b/client/src/components/projects/Project/Project.vue index e31b5578..347bb499 100644 --- a/client/src/components/projects/Project/Project.vue +++ b/client/src/components/projects/Project/Project.vue @@ -4,7 +4,7 @@

- This is modal + Please edit project information here

From f5df6e1cd5bdfc32c4a3fd6c0878db83422bee52 Mon Sep 17 00:00:00 2001 From: Igogrek Date: Thu, 24 May 2018 14:10:44 +0300 Subject: [PATCH 136/270] Close button working --- .../src/components/projects/Project/Project.vue | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/client/src/components/projects/Project/Project.vue b/client/src/components/projects/Project/Project.vue index 347bb499..3256f10a 100644 --- a/client/src/components/projects/Project/Project.vue +++ b/client/src/components/projects/Project/Project.vue @@ -1,5 +1,5 @@ + + + From 14c30dc5c90663e2205a489586611fff12e21628 Mon Sep 17 00:00:00 2001 From: Igogrek Date: Thu, 24 May 2018 14:16:57 +0300 Subject: [PATCH 137/270] Cleanup --- .../components/common/Autocomplete/Autocomplete.vue | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/client/src/components/common/Autocomplete/Autocomplete.vue b/client/src/components/common/Autocomplete/Autocomplete.vue index 3d964890..3fe85bd6 100644 --- a/client/src/components/common/Autocomplete/Autocomplete.vue +++ b/client/src/components/common/Autocomplete/Autocomplete.vue @@ -61,9 +61,18 @@ @import '~bulma/sass/components/dropdown'; .dropdown { - .input:focus { + + &-trigger .button { + padding: 0; + } + + .input { border: none; - box-shadow: none; + + &:focus { + border: none; + box-shadow: none; + } } } From cec0e03032e6cd0c0fe2e05b8cb16e94350be208 Mon Sep 17 00:00:00 2001 From: Igogrek Date: Thu, 24 May 2018 15:00:09 +0300 Subject: [PATCH 138/270] Fixed technology picker --- .../TechnologyPicker.test.ts | 2 +- .../technology-picker/TechnologyPicker.vue | 45 ++++++++----------- .../{technology-types.ts => action-types.ts} | 1 - .../src/store/modules/technologies/actions.ts | 7 +-- .../modules/technologies/getter-types.ts | 2 + .../src/store/modules/technologies/index.ts | 25 +++++++---- .../modules/technologies/mutation-types.ts | 2 + .../store/modules/technologies/mutations.ts | 12 +++-- 8 files changed, 53 insertions(+), 43 deletions(-) rename client/src/store/modules/technologies/{technology-types.ts => action-types.ts} (51%) create mode 100644 client/src/store/modules/technologies/getter-types.ts create mode 100644 client/src/store/modules/technologies/mutation-types.ts diff --git a/client/src/components/technologies/technology-picker/TechnologyPicker.test.ts b/client/src/components/technologies/technology-picker/TechnologyPicker.test.ts index 4c7e78e7..b172c4a8 100644 --- a/client/src/components/technologies/technology-picker/TechnologyPicker.test.ts +++ b/client/src/components/technologies/technology-picker/TechnologyPicker.test.ts @@ -1,7 +1,7 @@ import {mount} from '@vue/test-utils'; import store from '../../../store/index'; import TechnologyPicker from './TechnologyPicker.vue'; -import {FETCH_TECHNOLOGIES} from '../../../store/modules/technologies/technology-types'; +import {FETCH_TECHNOLOGIES} from '../../../store/modules/technologies/action-types'; describe('TechnologyPicker', () => { diff --git a/client/src/components/technologies/technology-picker/TechnologyPicker.vue b/client/src/components/technologies/technology-picker/TechnologyPicker.vue index 5fc031c0..f96abf12 100644 --- a/client/src/components/technologies/technology-picker/TechnologyPicker.vue +++ b/client/src/components/technologies/technology-picker/TechnologyPicker.vue @@ -1,20 +1,14 @@ @@ -32,16 +46,20 @@ + diff --git a/client/src/components/projects/ProjectCard/ProjectCard.test.ts b/client/src/components/projects/ProjectCard/ProjectCard.test.ts index ce366011..b92367fa 100644 --- a/client/src/components/projects/ProjectCard/ProjectCard.test.ts +++ b/client/src/components/projects/ProjectCard/ProjectCard.test.ts @@ -10,7 +10,7 @@ import {ILine} from '../../../shared/interfaces/ILine'; import {ITechnology} from '../../../shared/interfaces/ITechnology'; import {TestMocks} from '../../../shared/classes/TestMocks'; -describe('Project Card', () => { +describe('ProjectChange Card', () => { it('should render correct contents', () => { diff --git a/client/src/components/projects/ProjectChange/ProjectChange.vue b/client/src/components/projects/ProjectChange/ProjectChange.vue new file mode 100644 index 00000000..3256f10a --- /dev/null +++ b/client/src/components/projects/ProjectChange/ProjectChange.vue @@ -0,0 +1,80 @@ + + + + diff --git a/client/src/components/projects/ProjectFilter/ProjectFilter.test.ts b/client/src/components/projects/ProjectFilter/ProjectFilter.test.ts index 7c351c9e..10175217 100644 --- a/client/src/components/projects/ProjectFilter/ProjectFilter.test.ts +++ b/client/src/components/projects/ProjectFilter/ProjectFilter.test.ts @@ -5,7 +5,7 @@ import {TestMocks} from '../../../shared/classes/TestMocks'; import {SET_FILTER, SET_PROJECTS} from '../../../store/modules/projects/mutation-types'; import {PROJECTS} from '../../../store/modules/projects/getter-types'; -describe('Project Filter', () => { +describe('ProjectChange Filter', () => { const wrapper = mount(ProjectFilter, { store: store diff --git a/client/src/shared/classes/TestMocks.ts b/client/src/shared/classes/TestMocks.ts index 1f3b1e8a..258f26e8 100644 --- a/client/src/shared/classes/TestMocks.ts +++ b/client/src/shared/classes/TestMocks.ts @@ -39,7 +39,7 @@ export class TestMocks { return technology; } - static TestType(typeName:string = 'Project') { + static TestType(typeName:string = 'ProjectChange') { const type: IType = { id: '1', name: typeName, diff --git a/client/src/store/http/routes.ts b/client/src/store/http/routes.ts index 3e5fe00f..d6611881 100644 --- a/client/src/store/http/routes.ts +++ b/client/src/store/http/routes.ts @@ -1,5 +1,6 @@ export enum routes { GET_PROJECTS = '/api/projects', + GET_PROJECT = '/api/projects/', GET_PROJECT_ADDONS = '/api/projects/addons', GET_TECHNOLOGIES = '/api/technologies' } diff --git a/client/src/store/modules/projects/action-types.ts b/client/src/store/modules/projects/action-types.ts index 68facef6..9487072b 100644 --- a/client/src/store/modules/projects/action-types.ts +++ b/client/src/store/modules/projects/action-types.ts @@ -1,2 +1,3 @@ export const FETCH_ADDONS = 'projects/FETCH_ADDONS'; export const FETCH_PROJECTS = 'projects/FETCH_PROJECTS'; +export const FETCH_PROJECT = 'projects/FETCH_PROJECT'; diff --git a/client/src/store/modules/projects/actions.ts b/client/src/store/modules/projects/actions.ts index 2c8e8c31..18b698c1 100644 --- a/client/src/store/modules/projects/actions.ts +++ b/client/src/store/modules/projects/actions.ts @@ -1,9 +1,9 @@ import {ActionTree} from 'vuex'; import {ProjectService} from './project.service'; import {IProjectState} from './index'; -import {FETCH_ADDONS, FETCH_PROJECTS} from './action-types'; +import {FETCH_ADDONS, FETCH_PROJECT, FETCH_PROJECTS} from './action-types'; import { - FINISH_LOADING, SET_CUSTOMERS, SET_DOMAINS, SET_LINES, SET_PROGRAMS, SET_PROJECTS, + FINISH_LOADING, SET_CUSTOMERS, SET_DOMAINS, SET_LINES, SET_PROGRAMS, SET_PROJECT, SET_PROJECTS, SET_TYPES } from './mutation-types'; @@ -18,6 +18,13 @@ export const actions: ActionTree = { }); }, + [FETCH_PROJECT]({commit}, id:string) { + return service.getProject(id) + .then(response => { + commit(SET_PROJECT, response.data); + }); + }, + [FETCH_ADDONS]({commit}) { return service.getProjectAddons() .then(response => { diff --git a/client/src/store/modules/projects/constant-types.ts b/client/src/store/modules/projects/constant-types.ts index 16b4da11..a28b0d3c 100644 --- a/client/src/store/modules/projects/constant-types.ts +++ b/client/src/store/modules/projects/constant-types.ts @@ -3,7 +3,7 @@ export enum Types { PRODUCTION_LINE = 'Production line', PROGRAM = 'Program', DOMAIN = 'Domain', - PROJECT_TYPE = 'Project type', + PROJECT_TYPE = 'ProjectChange type', ROLES = 'Roles', TECHNOLOGIES = 'Technologies', diff --git a/client/src/store/modules/projects/getter-types.ts b/client/src/store/modules/projects/getter-types.ts index 29ef9e8b..f32ea7f7 100644 --- a/client/src/store/modules/projects/getter-types.ts +++ b/client/src/store/modules/projects/getter-types.ts @@ -1,5 +1,6 @@ export const ADDONS = 'projects/ADDONS'; export const PROJECTS = 'projects/PROJECTS'; +export const PROJECT = 'projects/PROJECT'; export const PROJECT_FILTER = 'projects/PROJECT_FILTER'; export const PROJECT_NAMES = 'projects/PROJECT_NAMES'; export const SEARCH = 'projects/SEARCH'; diff --git a/client/src/store/modules/projects/getters.ts b/client/src/store/modules/projects/getters.ts index 51d95fab..8575fdcc 100644 --- a/client/src/store/modules/projects/getters.ts +++ b/client/src/store/modules/projects/getters.ts @@ -4,7 +4,7 @@ import {Types} from './constant-types'; import {Util} from '../../../shared/classes/Util'; import {IModel} from '../../../shared/interfaces/IModel'; import {IProject} from '../../../shared/interfaces/IProject'; -import {ADDONS, AUTOCOMPLETE_SEARCH, FILTER_VALUE, FILTERS, PROJECT_FILTER, PROJECT_NAMES, PROJECTS, SEARCH} from './getter-types'; +import {ADDONS, AUTOCOMPLETE_SEARCH, FILTER_VALUE, FILTERS, PROJECT, PROJECT_FILTER, PROJECT_NAMES, PROJECTS, SEARCH} from './getter-types'; import {TECHNOLOGIES} from '../technologies/getter-types'; import {IProjectFilter, IProjectFilterCheck} from '../../../shared/interfaces/shared/IProjectFilter'; import {FilterTypes} from './filter-types'; @@ -75,7 +75,7 @@ export const getters: GetterTree = { return project[key].map((item: IModel) => item.id).filter((id: string) => state.filter[key].indexOf(id) > -1).length === state.filter[key].length; } else { - // Project property is an object filter by object id + // ProjectChange property is an object filter by object id // exception is line it is nested object const searchedId = key === Util.mapNameToProperty(Types.PRODUCTION_LINE) ? project[Util.mapNameToProperty(Types.PROGRAM)].lineId @@ -96,6 +96,7 @@ export const getters: GetterTree = { return projects; }, + [PROJECT]: state => state.project, [SEARCH]: state => state.search, [AUTOCOMPLETE_SEARCH]: state => state.autocompleteSearch, [PROJECT_NAMES](state) { diff --git a/client/src/store/modules/projects/index.ts b/client/src/store/modules/projects/index.ts index 174d0d8b..15eb8ae1 100644 --- a/client/src/store/modules/projects/index.ts +++ b/client/src/store/modules/projects/index.ts @@ -14,6 +14,7 @@ import {IAccordion} from '../../../shared/interfaces/ui/IAccordion'; export interface IProjectState { accordion: IAccordion; projects: IProject[]; + project: IProject, lines: ILine[]; programs: IProgram[]; domains: IDomain[]; @@ -29,6 +30,7 @@ const projectState: Module = { state: { accordion: {} as IAccordion, projects: [], + project: {} as IProject, customers: [], lines: [], programs: [], diff --git a/client/src/store/modules/projects/mutation-types.ts b/client/src/store/modules/projects/mutation-types.ts index 6f25a768..61559e74 100644 --- a/client/src/store/modules/projects/mutation-types.ts +++ b/client/src/store/modules/projects/mutation-types.ts @@ -6,6 +6,7 @@ export const SET_DOMAINS = 'projects/SET_DOMAINS'; export const SET_TYPES = 'projects/SET_TYPES'; export const SET_CUSTOMERS = 'projects/SET_CUSTOMERS'; export const SET_PROJECTS = 'projects/SET_PROJECTS'; +export const SET_PROJECT = 'projects/SET_PROJECT'; export const SET_FILTER = 'projects/SET_FILTER'; export const SET_SEARCH = 'projects/SET_SEARCH'; export const SET_AUTOCOMPLETE_SEARCH = 'projects/SET_AUTOCOMPLETE_SEARCH'; diff --git a/client/src/store/modules/projects/mutations.ts b/client/src/store/modules/projects/mutations.ts index 180161f4..2d27dfd7 100644 --- a/client/src/store/modules/projects/mutations.ts +++ b/client/src/store/modules/projects/mutations.ts @@ -10,7 +10,7 @@ import {IType} from '../../../shared/interfaces/IType'; import {Extension} from '../../../shared/classes/Extension'; import { FINISH_LOADING, SET_ACCORDION, SET_ADDON, SET_AUTOCOMPLETE_SEARCH, - SET_CUSTOMERS, SET_DOMAINS, SET_FILTER, SET_LINES, SET_PROGRAMS, SET_PROJECTS, SET_SEARCH, + SET_CUSTOMERS, SET_DOMAINS, SET_FILTER, SET_LINES, SET_PROGRAMS, SET_PROJECT, SET_PROJECTS, SET_SEARCH, SET_TYPES } from './mutation-types'; @@ -27,6 +27,10 @@ export const mutations: MutationTree = { state.projects = payload; state.loading = false; }, + [SET_PROJECT](state, payload: IProject) { + state.project = payload; + state.loading = false; + }, [SET_FILTER](state, payload: { key: string, value: string }) { Vue.set( state.filter, diff --git a/client/src/store/modules/projects/project.service.ts b/client/src/store/modules/projects/project.service.ts index 38e4105f..36c4e951 100644 --- a/client/src/store/modules/projects/project.service.ts +++ b/client/src/store/modules/projects/project.service.ts @@ -7,6 +7,10 @@ export class ProjectService extends HttpClientService{ return this.get(routes.GET_PROJECTS); }; + getProject(id:string) { + return this.get(routes.GET_PROJECT + id); + } + getProjectAddons() { return this.get(routes.GET_PROJECT_ADDONS); } diff --git a/legacy-client/src/app/core/powerpoint.service.ts b/legacy-client/src/app/core/powerpoint.service.ts index dffb8d2f..b999f7f7 100644 --- a/legacy-client/src/app/core/powerpoint.service.ts +++ b/legacy-client/src/app/core/powerpoint.service.ts @@ -94,7 +94,7 @@ export class PowerPointService { ); slide.addText( - 'Description of Project', + 'Description of ProjectChange', { x: this.x, y: 0.6, @@ -144,7 +144,7 @@ export class PowerPointService { const start = 5.75; const lineheight = 0.25; slide.addText( - 'Project duration:', + 'ProjectChange duration:', { x: this.x, y: start, diff --git a/legacy-client/src/app/features/employee/employee-picker/employee-picker.component.ts b/legacy-client/src/app/features/employee/employee-picker/employee-picker.component.ts index a4b55992..65c4ed87 100644 --- a/legacy-client/src/app/features/employee/employee-picker/employee-picker.component.ts +++ b/legacy-client/src/app/features/employee/employee-picker/employee-picker.component.ts @@ -5,7 +5,7 @@ import {Schedule} from '../../../shared/models/schedule'; import {EmployeeService} from '../employee.service'; /** - * Used in create/update Project form + * Used in create/update ProjectChange form * Select Employees Roles and participation * @export * @class EmployeePickerComponent diff --git a/legacy-client/src/app/features/project/new-project/new-project.component.ts b/legacy-client/src/app/features/project/new-project/new-project.component.ts index 28715c83..62e89d25 100644 --- a/legacy-client/src/app/features/project/new-project/new-project.component.ts +++ b/legacy-client/src/app/features/project/new-project/new-project.component.ts @@ -106,7 +106,7 @@ export class NewProjectComponent implements OnInit { } /** - * Create or update Project + * Create or update ProjectChange * depending on editMode prop * @memberof NewProjectComponent */ diff --git a/legacy-client/src/app/features/project/project/project.component.html b/legacy-client/src/app/features/project/project/project.component.html index 4df8ede9..74382a55 100644 --- a/legacy-client/src/app/features/project/project/project.component.html +++ b/legacy-client/src/app/features/project/project/project.component.html @@ -19,7 +19,7 @@

@@ -44,7 +44,7 @@ }, methods: { toggleActive() { - this.$store.commit(TOGGLE_TECHNOLOGY, { id: this.id }); + this.$store.commit(TOGGLE_TECHNOLOGY, {id: this.id}); this.$store.commit(SET_FILTER, {key: FilterTypes.TECHNOLOGIES, value: this.id}); } } diff --git a/client/src/components/projects/AppliedFilters/AppliedFilters.vue b/client/src/components/projects/AppliedFilters/AppliedFilters.vue index d2f50237..b71ae9f9 100644 --- a/client/src/components/projects/AppliedFilters/AppliedFilters.vue +++ b/client/src/components/projects/AppliedFilters/AppliedFilters.vue @@ -67,7 +67,7 @@ this.$store.commit(SET_SEARCH, ''); }, removeFilter(filterKey: string, id: number) { - if(filterKey === FilterTypes.TECHNOLOGIES) this.$store.commit(TOGGLE_TECHNOLOGY, {id: id}); + if (filterKey === FilterTypes.TECHNOLOGIES) this.$store.commit(TOGGLE_TECHNOLOGY, {id}); this.$store.commit(SET_FILTER, {key: filterKey, value: id}); } } diff --git a/client/src/components/projects/ProjectFilter/ProjectFilter.vue b/client/src/components/projects/ProjectFilter/ProjectFilter.vue index 0e694a88..dd9bd573 100644 --- a/client/src/components/projects/ProjectFilter/ProjectFilter.vue +++ b/client/src/components/projects/ProjectFilter/ProjectFilter.vue @@ -37,7 +37,7 @@ import {IModel} from '../../../shared/interfaces/IModel'; import {Util} from '../../../shared/classes/Util'; import {FETCH_ADDONS} from '../../../store/modules/projects/action-types'; - import {ADDONS, PROJECT_FILTER} from "../../../store/modules/projects/getter-types"; + import {ADDONS, PROJECT_FILTER} from '../../../store/modules/projects/getter-types'; import {SET_FILTER, SET_ACCORDION} from '../../../store/modules/projects/mutation-types'; export default Vue.extend({ @@ -61,7 +61,7 @@ TechnologyPicker }, mounted() { - this.models.forEach(item => this.$store.commit(SET_ACCORDION, { key: item.name, value: true })) + this.models.forEach(item => this.$store.commit(SET_ACCORDION, {key: item.name, value: true})); }, methods: { // re render checkbox @@ -70,7 +70,7 @@ this.$store.commit(SET_FILTER, {key: Util.mapNameToProperty(key), value: item.id}); }, toggleAccordion(key:string, value: boolean) { - this.$store.commit(SET_ACCORDION, { key: key, value: value }); + this.$store.commit(SET_ACCORDION, {key, value}); } } }); From 7fc1dbf2239f4163708b92a67032416302800c18 Mon Sep 17 00:00:00 2001 From: Igogrek Date: Tue, 5 Jun 2018 11:46:10 +0300 Subject: [PATCH 158/270] Filter layout fix --- .../AppliedFilters/AppliedFilters.vue | 25 +++++-------------- client/src/components/projects/Projects.vue | 13 ++++++---- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/client/src/components/projects/AppliedFilters/AppliedFilters.vue b/client/src/components/projects/AppliedFilters/AppliedFilters.vue index b71ae9f9..75b897a2 100644 --- a/client/src/components/projects/AppliedFilters/AppliedFilters.vue +++ b/client/src/components/projects/AppliedFilters/AppliedFilters.vue @@ -1,17 +1,6 @@ @@ -79,4 +81,15 @@ margin-top: 15px; } } + + .fade-vertical-enter-active, .fade-vertical-leave-active { + transition: all .5s; + max-height: 1000px; + } + + .fade-vertical-enter, .fade-vertical-leave-to { + opacity: 0; + max-height: 0; + } + From 02829e67ef362ab1c0e167f5db344e8197c56212 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Wed, 6 Jun 2018 02:32:40 +0300 Subject: [PATCH 161/270] initial markup + TechnologyPanel --- .../components/projects/Project/Project.vue | 120 ++++++++++++++++-- .../TechnologyPanel/TechnologyPanel.vue | 48 +++++++ client/src/shared/classes/Extension.ts | 13 ++ client/src/shared/classes/TestMocks.ts | 1 + client/src/shared/interfaces/IProject.ts | 1 + .../store/modules/projects/getter-types.ts | 1 + client/src/store/modules/projects/getters.ts | 9 +- client/src/styles/styles.scss | 8 ++ client/src/styles/variables.scss | 1 + server/models/Project.ts | 2 +- server/seeders/20171006143303-seed-project.js | 6 + server/server-addons/server.constants.ts | 2 +- 12 files changed, 197 insertions(+), 15 deletions(-) create mode 100644 client/src/components/technologies/TechnologyPanel/TechnologyPanel.vue diff --git a/client/src/components/projects/Project/Project.vue b/client/src/components/projects/Project/Project.vue index 82bf8469..2b0e5342 100644 --- a/client/src/components/projects/Project/Project.vue +++ b/client/src/components/projects/Project/Project.vue @@ -1,33 +1,129 @@ diff --git a/client/src/components/technologies/TechnologyPanel/TechnologyPanel.vue b/client/src/components/technologies/TechnologyPanel/TechnologyPanel.vue new file mode 100644 index 00000000..f2be50ec --- /dev/null +++ b/client/src/components/technologies/TechnologyPanel/TechnologyPanel.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/client/src/shared/classes/Extension.ts b/client/src/shared/classes/Extension.ts index 00d007dc..62cf3416 100644 --- a/client/src/shared/classes/Extension.ts +++ b/client/src/shared/classes/Extension.ts @@ -31,4 +31,17 @@ export class Extension { ? [...source, value] : source.filter(item => item !== value); } + + /** + * group array by key + * @param {{}[]} xs source array + * @param {string} key property of all objects in array + * @returns {{}} + */ + public static groupBy(xs: {}[], key: string) { + return xs.reduce((rv:any, x:any) => { + (rv[x[key]] = rv[x[key]] || []).push(x); + return rv; + }, {}); + } } diff --git a/client/src/shared/classes/TestMocks.ts b/client/src/shared/classes/TestMocks.ts index 258f26e8..339cbb97 100644 --- a/client/src/shared/classes/TestMocks.ts +++ b/client/src/shared/classes/TestMocks.ts @@ -113,6 +113,7 @@ export class TestMocks { description: '123', domain: domain, program: program, + image: 'AS1313.jpg', type: type, schedules: [] as ISchedule[], customers: [customer1, customer2], diff --git a/client/src/shared/interfaces/IProject.ts b/client/src/shared/interfaces/IProject.ts index f2413869..7e994f92 100644 --- a/client/src/shared/interfaces/IProject.ts +++ b/client/src/shared/interfaces/IProject.ts @@ -13,6 +13,7 @@ export interface IProject extends IModel{ domain: IDomain; program: IProgram; type: IType; + image: string; schedules: ISchedule[]; customers: ICustomer[]; technologies: ITechnology[]; diff --git a/client/src/store/modules/projects/getter-types.ts b/client/src/store/modules/projects/getter-types.ts index f32ea7f7..e36f95a0 100644 --- a/client/src/store/modules/projects/getter-types.ts +++ b/client/src/store/modules/projects/getter-types.ts @@ -1,6 +1,7 @@ export const ADDONS = 'projects/ADDONS'; export const PROJECTS = 'projects/PROJECTS'; export const PROJECT = 'projects/PROJECT'; +export const PROJECT_TECHNOLOGIES = 'projects/PROJECT_TECHNOLOGIES'; export const PROJECT_FILTER = 'projects/PROJECT_FILTER'; export const PROJECT_NAMES = 'projects/PROJECT_NAMES'; export const SEARCH = 'projects/SEARCH'; diff --git a/client/src/store/modules/projects/getters.ts b/client/src/store/modules/projects/getters.ts index 8575fdcc..c18a96d8 100644 --- a/client/src/store/modules/projects/getters.ts +++ b/client/src/store/modules/projects/getters.ts @@ -4,10 +4,14 @@ import {Types} from './constant-types'; import {Util} from '../../../shared/classes/Util'; import {IModel} from '../../../shared/interfaces/IModel'; import {IProject} from '../../../shared/interfaces/IProject'; -import {ADDONS, AUTOCOMPLETE_SEARCH, FILTER_VALUE, FILTERS, PROJECT, PROJECT_FILTER, PROJECT_NAMES, PROJECTS, SEARCH} from './getter-types'; +import { + ADDONS, AUTOCOMPLETE_SEARCH, FILTER_VALUE, FILTERS, PROJECT, PROJECT_FILTER, PROJECT_NAMES, PROJECT_TECHNOLOGIES, PROJECTS, + SEARCH +} from './getter-types'; import {TECHNOLOGIES} from '../technologies/getter-types'; import {IProjectFilter, IProjectFilterCheck} from '../../../shared/interfaces/shared/IProjectFilter'; import {FilterTypes} from './filter-types'; +import {Extension} from '../../../shared/classes/Extension'; export const getters: GetterTree = { @@ -97,6 +101,9 @@ export const getters: GetterTree = { return projects; }, [PROJECT]: state => state.project, + [PROJECT_TECHNOLOGIES](state) { + return Extension.groupBy(state.project.technologies, 'domain'); + }, [SEARCH]: state => state.search, [AUTOCOMPLETE_SEARCH]: state => state.autocompleteSearch, [PROJECT_NAMES](state) { diff --git a/client/src/styles/styles.scss b/client/src/styles/styles.scss index 5261f597..88ebe5c6 100644 --- a/client/src/styles/styles.scss +++ b/client/src/styles/styles.scss @@ -41,10 +41,18 @@ body { font-size: 16px; } + &.is-size-18{ + font-size: 18px; + } + &.is-size-19{ font-size: 19px; } + &.is-size-22{ + font-size: 22px; + } + &.is-secondary { color: $text-secondary; } diff --git a/client/src/styles/variables.scss b/client/src/styles/variables.scss index 10bbd757..ed7de1a8 100644 --- a/client/src/styles/variables.scss +++ b/client/src/styles/variables.scss @@ -9,6 +9,7 @@ $light-black: #262626; $text-color:#383838; $text-secondary:#7C7C7C; $text-secondary2: #BDBDBD; +$text-secondary3: #A3A3A3; $lite-grey:#EDEDED; $border-color: #DCDCDC; diff --git a/server/models/Project.ts b/server/models/Project.ts index 23ffe361..da48c674 100644 --- a/server/models/Project.ts +++ b/server/models/Project.ts @@ -19,8 +19,8 @@ import {Line} from './Line'; full: { include: [ { model: () => Schedule, include: [() => Employee, () => Role]}, + { model: () => Program, include: [() => Line] }, () => Technology, - () => Program, () => Domain, () => Type, () => Customer diff --git a/server/seeders/20171006143303-seed-project.js b/server/seeders/20171006143303-seed-project.js index e035b7ba..5da68049 100644 --- a/server/seeders/20171006143303-seed-project.js +++ b/server/seeders/20171006143303-seed-project.js @@ -41,6 +41,7 @@ module.exports = { typeId: typeRows[0].id, description:'Online Sales Management system for dealers and customers. Used for selling vehicles of BMW AG online', active:false, + image: 'image-AS1313.jpg', pss: 5, startdate: new Date(), createdAt:new Date(), @@ -54,6 +55,7 @@ module.exports = { typeId: typeRows[0].id, description:'Online Sales Management system for dealers and customers. Used for selling vehicles of BMW AG online', active:false, + image: 'image-AS1313.jpg', pss: 5, startdate: new Date(), createdAt:new Date(), @@ -67,6 +69,7 @@ module.exports = { typeId: typeRows[0].id, description:'Online Sales Management system for dealers and customers. Used for selling vehicles of BMW AG online', active:false, + image: 'image-AS1313.jpg', pss: 5, startdate: new Date(), createdAt:new Date(), @@ -80,6 +83,7 @@ module.exports = { typeId: typeRows[0].id, description:'Online Sales Management system for dealers and customers. Used for selling vehicles of BMW AG online', active:false, + image: 'image-AS1313.jpg', pss: 5, startdate: new Date(), createdAt:new Date(), @@ -93,6 +97,7 @@ module.exports = { typeId: typeRows[0].id, description:'Online Sales Management system for dealers and customers. Used for selling vehicles of BMW AG online', active:false, + image: 'image-AS1313.jpg', pss: 5, startdate: new Date(), createdAt:new Date(), @@ -106,6 +111,7 @@ module.exports = { typeId: typeRows[0].id, description:'Online Sales Management system for dealers and customers. Used for selling vehicles of BMW AG online', active:false, + image: 'image-AS1313.jpg', pss: 5, startdate: new Date(), createdAt:new Date(), diff --git a/server/server-addons/server.constants.ts b/server/server-addons/server.constants.ts index c1ef87c6..e31af822 100644 --- a/server/server-addons/server.constants.ts +++ b/server/server-addons/server.constants.ts @@ -10,7 +10,7 @@ export enum ServerConstants { DEFAULT_INDEX_PATH = 'dist/index.html', DEFAULT_STATIC_PATH = 'dist', IMAGES_ROUTE = '/server/images', - IMAGES_PATH = 'server/images', + IMAGES_PATH = '../server/images', PORT_ALIAS = 'port', MAX_REQUEST_SIZE = '10mb' } From 78d7f4516f28a37b8e746203efd64b4c12b706de Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Wed, 6 Jun 2018 11:04:22 +0300 Subject: [PATCH 162/270] image routing project --- client/src/shared/filters/Capitalize.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 client/src/shared/filters/Capitalize.ts diff --git a/client/src/shared/filters/Capitalize.ts b/client/src/shared/filters/Capitalize.ts new file mode 100644 index 00000000..e69de29b From 9000a167d2913a18dd4d355f6fd9c98c803629dd Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Wed, 6 Jun 2018 11:04:47 +0300 Subject: [PATCH 163/270] capitalize filter --- client/config/index.js | 3 ++- client/src/components/projects/Project/Project.vue | 3 +-- .../technologies/TechnologyPanel/TechnologyPanel.vue | 5 ++--- client/src/main.ts | 2 ++ client/src/shared/filters/Capitalize.ts | 4 ++++ client/src/store/modules/projects/index.ts | 8 +++++++- 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/client/config/index.js b/client/config/index.js index 1996cb11..44ee94ec 100644 --- a/client/config/index.js +++ b/client/config/index.js @@ -11,7 +11,8 @@ module.exports = { assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: { - '/api': 'http://localhost:3000' + '/api': 'http://localhost:3000', + '/server/images': 'http://localhost:3000' }, // Various Dev Server settings diff --git a/client/src/components/projects/Project/Project.vue b/client/src/components/projects/Project/Project.vue index 2b0e5342..52c6e941 100644 --- a/client/src/components/projects/Project/Project.vue +++ b/client/src/components/projects/Project/Project.vue @@ -15,8 +15,7 @@ v-for="customer in project.customers" :key="customer.id" :name="customer.name" - :selected = "customer.active" - :id="customer.id"/> + :selected = "customer.active"/>

{{ project.description }} diff --git a/client/src/components/technologies/TechnologyPanel/TechnologyPanel.vue b/client/src/components/technologies/TechnologyPanel/TechnologyPanel.vue index f2be50ec..6c5b91ee 100644 --- a/client/src/components/technologies/TechnologyPanel/TechnologyPanel.vue +++ b/client/src/components/technologies/TechnologyPanel/TechnologyPanel.vue @@ -2,14 +2,13 @@

- {{ domain }} + {{ domain | capitalize}}

+ :selected = "technology.active"/>
diff --git a/client/src/main.ts b/client/src/main.ts index d179bcdf..31620f66 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -10,11 +10,13 @@ import Checkbox from './components/common/Checkbox/Checkbox.vue'; import Autocomplete from './components/common/Autocomplete/Autocomplete.vue'; import CommonModal from './components/common/CommonModal/CommonModal.vue'; import date from './shared/filters/Date'; +import capitalize from './shared/filters/Capitalize'; Vue.component('Checkbox', Checkbox); Vue.component('Autocomplete', Autocomplete); Vue.component('CommonModal', CommonModal); Vue.filter('date', date); +Vue.filter('capitalize', capitalize); Vue.config.productionTip = false; diff --git a/client/src/shared/filters/Capitalize.ts b/client/src/shared/filters/Capitalize.ts index e69de29b..33c9084c 100644 --- a/client/src/shared/filters/Capitalize.ts +++ b/client/src/shared/filters/Capitalize.ts @@ -0,0 +1,4 @@ +export default function (value:string) { + if (!value) return '' + return value.charAt(0).toUpperCase() + value.slice(1); +} diff --git a/client/src/store/modules/projects/index.ts b/client/src/store/modules/projects/index.ts index 15eb8ae1..33cd7090 100644 --- a/client/src/store/modules/projects/index.ts +++ b/client/src/store/modules/projects/index.ts @@ -10,6 +10,9 @@ import {IType} from '../../../shared/interfaces/IType'; import {IFilter} from '../../../shared/interfaces/IFilter'; import {Module} from 'vuex'; import {IAccordion} from '../../../shared/interfaces/ui/IAccordion'; +import {ISchedule} from '../../../shared/interfaces/ISchedule'; +import {ITechnology} from '../../../shared/interfaces/ITechnology'; +import {TestMocks} from '../../../shared/classes/TestMocks'; export interface IProjectState { accordion: IAccordion; @@ -26,11 +29,14 @@ export interface IProjectState { autocompleteSearch: string; } + +const initialProject: IProject = TestMocks.TestProject(); + const projectState: Module = { state: { accordion: {} as IAccordion, projects: [], - project: {} as IProject, + project: initialProject, customers: [], lines: [], programs: [], From 5a45a8aadbafa519c35ff3aac7238290f0c28d7f Mon Sep 17 00:00:00 2001 From: Igogrek Date: Wed, 6 Jun 2018 13:26:32 +0300 Subject: [PATCH 164/270] Initial presentation added --- client/package.json | 1 + .../AppliedFilters/AppliedFilters.vue | 11 + .../assets/presentation-file_outline.svg | 12 + .../modules/projects/PowerPointService.ts | 383 ++++++++++++++++++ .../store/modules/projects/action-types.ts | 1 + client/src/store/modules/projects/actions.ts | 8 +- client/vue-shims.d.ts | 3 + client/yarn.lock | 297 +++++++++++++- 8 files changed, 703 insertions(+), 13 deletions(-) create mode 100644 client/src/components/projects/AppliedFilters/assets/presentation-file_outline.svg create mode 100644 client/src/store/modules/projects/PowerPointService.ts diff --git a/client/package.json b/client/package.json index a21009fd..92fec533 100644 --- a/client/package.json +++ b/client/package.json @@ -20,6 +20,7 @@ "axios": "^0.18.0", "bulma": "^0.6.2", "eslint-plugin-typescript": "^0.11.0", + "pptxgenjs": "^2.1.0", "vue": "^2.5.2", "vue-router": "^3.0.1", "vuex": "^3.0.1" diff --git a/client/src/components/projects/AppliedFilters/AppliedFilters.vue b/client/src/components/projects/AppliedFilters/AppliedFilters.vue index 75b897a2..6841d1f6 100644 --- a/client/src/components/projects/AppliedFilters/AppliedFilters.vue +++ b/client/src/components/projects/AppliedFilters/AppliedFilters.vue @@ -1,6 +1,13 @@ diff --git a/client/src/shared/classes/Util.ts b/client/src/shared/classes/Util.ts index c9b5111f..2739c6a3 100644 --- a/client/src/shared/classes/Util.ts +++ b/client/src/shared/classes/Util.ts @@ -20,23 +20,64 @@ export class Util { return words.length > 1 ? words[1].toLowerCase() : words[0].toLowerCase(); } - public static checkFIltersInProjects(key:string, itemsToCheck:IModel[], projects:IProject[]) { + public static checkFIltersInProjects(key: string, itemsToCheck: IModel[], projects: IProject[]) { - if(key === this.mapNameToProperty(Types.CUSTOMER)) { + if (key === this.mapNameToProperty(Types.CUSTOMER)) { const newArray = [].concat.apply([], projects.map(project => project[key])); itemsToCheck.forEach(item => item.active = - newArray.map((model: IModel)=> model.id).indexOf(item.id) > -1 ); - } else if(key === this.mapNameToProperty(Types.PRODUCTION_LINE)) { + newArray.map((model: IModel) => model.id).indexOf(item.id) > -1); + } else if (key === this.mapNameToProperty(Types.PRODUCTION_LINE)) { itemsToCheck.forEach(item => item.active = - projects.map(project => project['program'].lineId).indexOf(item.id)>-1); + projects.map(project => project['program'].lineId).indexOf(item.id) > -1); } else { itemsToCheck.forEach(item => item.active = - projects.map(project => project[key].id).indexOf(item.id)>-1); + projects.map(project => project[key].id).indexOf(item.id) > -1); } - return itemsToCheck; } + + /** + * Sort by field function + * @param {string} field Field to sort for + * @param {boolean} reverse Reverse sorting direction + * @param {boolean} ignoreCase case for strings + * @returns {(a: {[p: string]: {}}, b: {[p: string]: {}}) => (number | number)} Sort function + */ + static sortByField(field: keyof T, reverse = false, ignoreCase = false) { + return (a: T, b: T) => { + const aValue = Util.getNestedProperty(a as { [key: string]: {} }, field); + const bValue = Util.getNestedProperty(b as { [key: string]: {} }, field); + + const aField = ignoreCase ? aValue.toString().toLowerCase() : aValue; + const bField = ignoreCase ? bValue.toString().toLowerCase() : bValue; + + return reverse ? + Util.compareValues(aField, bField) : + Util.compareValues(bField, aField); + }; + } + + private static getNestedProperty(object: { [key: string]: {} }, property: string): {} { + if (typeof object === 'undefined') { + return false; + } + const index = property.indexOf('.'); + if (index > -1) { + return Util.getNestedProperty(object[property.substring(0, index)], property.substr(index + 1)); + } + return object[property]; + } + + private static compareValues(a: {}, b: {}): number { + if (a > b) { + return 1; + } + if (a < b) { + return -1; + } + return 0; + } } diff --git a/client/src/store/modules/projects/getters.ts b/client/src/store/modules/projects/getters.ts index 51d95fab..5c540328 100644 --- a/client/src/store/modules/projects/getters.ts +++ b/client/src/store/modules/projects/getters.ts @@ -94,6 +94,8 @@ export const getters: GetterTree = { projects = projects.filter(project => project.name.toLowerCase().indexOf(state.search.toLowerCase()) > -1); } + projects.sort(Util.sortByField(state.sort, state.sortReverse, true)); + return projects; }, [SEARCH]: state => state.search, diff --git a/client/src/store/modules/projects/index.ts b/client/src/store/modules/projects/index.ts index 174d0d8b..72a93475 100644 --- a/client/src/store/modules/projects/index.ts +++ b/client/src/store/modules/projects/index.ts @@ -23,6 +23,8 @@ export interface IProjectState { loading: boolean; search: string; autocompleteSearch: string; + sort: string; + sortReverse: boolean; } const projectState: Module = { @@ -37,7 +39,9 @@ const projectState: Module = { filter: {} as IFilter, loading: true, search: '', - autocompleteSearch: '' + autocompleteSearch: '', + sort: 'name', + sortReverse: true }, mutations, actions, diff --git a/client/src/store/modules/projects/mutation-types.ts b/client/src/store/modules/projects/mutation-types.ts index 6f25a768..71763897 100644 --- a/client/src/store/modules/projects/mutation-types.ts +++ b/client/src/store/modules/projects/mutation-types.ts @@ -9,5 +9,7 @@ export const SET_PROJECTS = 'projects/SET_PROJECTS'; export const SET_FILTER = 'projects/SET_FILTER'; export const SET_SEARCH = 'projects/SET_SEARCH'; export const SET_AUTOCOMPLETE_SEARCH = 'projects/SET_AUTOCOMPLETE_SEARCH'; +export const SET_SORT = 'SET_SORT'; +export const SET_SORT_REVERSE = 'SET_SORT_REVERSE'; export const FINISH_LOADING = 'projects/FINISH_LOADING'; diff --git a/client/src/store/modules/projects/mutations.ts b/client/src/store/modules/projects/mutations.ts index 180161f4..8f135fd8 100644 --- a/client/src/store/modules/projects/mutations.ts +++ b/client/src/store/modules/projects/mutations.ts @@ -10,12 +10,12 @@ import {IType} from '../../../shared/interfaces/IType'; import {Extension} from '../../../shared/classes/Extension'; import { FINISH_LOADING, SET_ACCORDION, SET_ADDON, SET_AUTOCOMPLETE_SEARCH, - SET_CUSTOMERS, SET_DOMAINS, SET_FILTER, SET_LINES, SET_PROGRAMS, SET_PROJECTS, SET_SEARCH, + SET_CUSTOMERS, SET_DOMAINS, SET_FILTER, SET_LINES, SET_PROGRAMS, SET_PROJECTS, SET_SEARCH, SET_SORT, SET_SORT_REVERSE, SET_TYPES } from './mutation-types'; export const mutations: MutationTree = { - [SET_ACCORDION](state, payload: { key:string, value: boolean }) { + [SET_ACCORDION](state, payload: { key: string, value: boolean }) { Vue.set( state.accordion, payload.key, @@ -53,10 +53,16 @@ export const mutations: MutationTree = { [FINISH_LOADING](state) { state.loading = false; }, - [SET_SEARCH](state, search: string){ + [SET_SEARCH](state, search: string) { state.search = search; }, - [SET_AUTOCOMPLETE_SEARCH](state, search: string){ + [SET_AUTOCOMPLETE_SEARCH](state, search: string) { state.autocompleteSearch = search; + }, + [SET_SORT](state, sort: string) { + state.sort = sort; + }, + [SET_SORT_REVERSE](state, reverse: boolean) { + state.sortReverse = reverse; } }; From fd402dbbc6b99de691f7c533a656200d9f51a584 Mon Sep 17 00:00:00 2001 From: Igogrek Date: Wed, 6 Jun 2018 16:50:42 +0300 Subject: [PATCH 172/270] Added sorted by --- .../AppliedFilters/AppliedFilters.vue | 24 ++++++++++++++++--- .../AppliedFilters/assets/export_outline.svg | 12 ++++++++++ .../store/modules/projects/getter-types.ts | 2 ++ client/src/store/modules/projects/getters.ts | 16 +++++++++++-- 4 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 client/src/components/projects/AppliedFilters/assets/export_outline.svg diff --git a/client/src/components/projects/AppliedFilters/AppliedFilters.vue b/client/src/components/projects/AppliedFilters/AppliedFilters.vue index 3bbadd9c..f4e9d9f5 100644 --- a/client/src/components/projects/AppliedFilters/AppliedFilters.vue +++ b/client/src/components/projects/AppliedFilters/AppliedFilters.vue @@ -10,6 +10,17 @@
+
+ + Sorted by: + + {{ sort }} + + + +
@@ -45,7 +56,7 @@ diff --git a/client/src/components/projects/Project/Project.vue b/client/src/components/projects/Project/Project.vue index 154b8636..897d90ba 100644 --- a/client/src/components/projects/Project/Project.vue +++ b/client/src/components/projects/Project/Project.vue @@ -29,7 +29,7 @@
-
+

Details @@ -77,6 +77,8 @@ :schedule="schedule"/>

+ +
@@ -85,6 +87,7 @@ import {FETCH_PROJECT} from '../../../store/modules/projects/action-types'; import {PROJECT, PROJECT_TECHNOLOGIES} from '../../../store/modules/projects/getter-types'; import Chip from '../../common/Chip/Chip.vue'; + import Footer from '../../root/Footer/Footer.vue'; import ScheduleItem from '../../employees/ScheduleItem/ScheduleItem.vue'; import TechnologyPanel from '../../technologies/TechnologyPanel/TechnologyPanel.vue'; import {IProject} from "../../../shared/interfaces/IProject"; @@ -93,6 +96,7 @@ export default Vue.extend({ components: { Chip, + Footer, TechnologyPanel, ScheduleItem }, @@ -128,6 +132,8 @@ $image-height: 250px; .project { + margin-bottom: 100px; + &-secondary { color: $text-secondary3; margin-top: 30px; @@ -156,5 +162,9 @@ &-mb30 { margin-bottom: 30px; } + + &-nomb{ + margin-bottom: 0; + } } diff --git a/client/src/components/projects/ProjectCard/ProjectCard.vue b/client/src/components/projects/ProjectCard/ProjectCard.vue index de7ec33b..b29675dc 100644 --- a/client/src/components/projects/ProjectCard/ProjectCard.vue +++ b/client/src/components/projects/ProjectCard/ProjectCard.vue @@ -85,7 +85,7 @@ &-body { padding: 0 $padding; - max-height: 125px; + max-height: 119px; overflow: hidden; } diff --git a/client/src/components/root/.DS_Store b/client/src/components/root/.DS_Store index cd2ceea471260d33ba9a91aad942cd0ae25f7829..d76a7d50e0600d63afb4a7d457321678f4638795 100644 GIT binary patch delta 56 rcmZp1XmQxEMvRw@!Gj@{A(0^kNEU5ADCWjEv4LYVyTnp9tWvB1vndY& delta 50 rcmZp1XmQxEMvRk-!Gj@{A(0_va-*2k=Hp@(jGNgdma<`pn=%3bX0Z*K diff --git a/client/src/components/root/Footer/Footer.vue b/client/src/components/root/Footer/Footer.vue new file mode 100644 index 00000000..93b7db3a --- /dev/null +++ b/client/src/components/root/Footer/Footer.vue @@ -0,0 +1,49 @@ + + + diff --git a/client/src/components/root/Footer.vue b/client/src/components/root/Footer/TelekomFooter.vue similarity index 77% rename from client/src/components/root/Footer.vue rename to client/src/components/root/Footer/TelekomFooter.vue index 6a1c830d..15b02cab 100644 --- a/client/src/components/root/Footer.vue +++ b/client/src/components/root/Footer/TelekomFooter.vue @@ -3,7 +3,7 @@
Imprint @@ -26,13 +26,13 @@ From 54c000070e3a33dd9872888a73587c051e5f7072 Mon Sep 17 00:00:00 2001 From: artur_fjodorov Date: Thu, 7 Jun 2018 18:28:08 +0300 Subject: [PATCH 186/270] Stepper --- .../components/common/Checkbox/Checkbox.vue | 5 + .../src/components/common/Stepper/Stepper.vue | 64 +++++ .../projects/ProjectChange/ProjectChange.vue | 231 ++++++++++-------- 3 files changed, 200 insertions(+), 100 deletions(-) create mode 100644 client/src/components/common/Stepper/Stepper.vue diff --git a/client/src/components/common/Checkbox/Checkbox.vue b/client/src/components/common/Checkbox/Checkbox.vue index 0cc02f1b..8323c174 100644 --- a/client/src/components/common/Checkbox/Checkbox.vue +++ b/client/src/components/common/Checkbox/Checkbox.vue @@ -79,6 +79,11 @@ } } + .checkbox-label { + font-weight: 500; + font-size: 16px; + } + .checkbox-icon { position: absolute; top: 0; diff --git a/client/src/components/common/Stepper/Stepper.vue b/client/src/components/common/Stepper/Stepper.vue new file mode 100644 index 00000000..edb4969d --- /dev/null +++ b/client/src/components/common/Stepper/Stepper.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/client/src/components/projects/ProjectChange/ProjectChange.vue b/client/src/components/projects/ProjectChange/ProjectChange.vue index 64d543e1..c82a33bc 100644 --- a/client/src/components/projects/ProjectChange/ProjectChange.vue +++ b/client/src/components/projects/ProjectChange/ProjectChange.vue @@ -8,121 +8,148 @@