TSK-183 workbasket list styling without tests and refactored workbasket edition

This commit is contained in:
Martin Rojas Miguel Angel 2018-02-05 16:40:06 +01:00 committed by Holger Hagen
parent b590597690
commit f9e0afcd41
40 changed files with 667 additions and 584 deletions

View File

@ -9,7 +9,7 @@
"outDir": "dist",
"assets": [
"assets",
"favicon.ico"
"taskana.ico"
],
"index": "index.html",
"main": "main.ts",

View File

@ -2,7 +2,7 @@ import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AppComponent } from './app.component';
import { WorkbasketListComponent } from './workbasket/list/workbasket-list.component';
import { WorkbasketadministrationComponent } from './workbasketadministration/workbasketadministration.component';
import { WorkbasketDetailsComponent } from './workbasket/details/workbasket-details.component';
import { CategoriesadministrationComponent } from './categoriesadministration/categoriesadministration.component';
import { MasterAndDetailComponent } from './shared/masterAndDetail/master-and-detail.component';
@ -17,7 +17,7 @@ const appRoutes: Routes = [
},
{
path: ':id',
component: WorkbasketadministrationComponent,
component: WorkbasketDetailsComponent,
outlet: 'detail'
}
]

View File

@ -30,4 +30,8 @@
</div>
</nav>
<router-outlet></router-outlet>
<div class="container-fluid container-main">
<div class ="row ">
<router-outlet></router-outlet>
</div>
</div>

View File

@ -17,3 +17,47 @@ p.navbar-brand >a{
color: white;
}
}
/*
* All side bar links styling.
*/
.nav-sidebar > li > a {
padding-right: 20px;
padding-left: 20px;
}
.nav-sidebar > .active > a,
.nav-sidebar > .active > a:hover,
.nav-sidebar > .active > a:focus {
color: #fff;
background-color: #428bca;
}
.nav.nav-tabs {
& > li {
& > a{
min-height: 56px;
padding-top: 17px;
}
&:first-child > a{
border-left: none;
}
}
& > p{
margin: 0px;
}
}
.navbar-brand {
float: none;
}
.navbar-inverse {
border: none;
}
.navbar {
margin-bottom: 0px;
}

View File

@ -22,10 +22,11 @@ import { CategorieslistComponent } from './categorieslist/categorieslist.compone
import { CategoriestreeComponent } from './categoriestree/categoriestree.component';
import { CategoryeditorComponent } from './categoryeditor/categoryeditor.component';
import { CategoriesadministrationComponent } from './categoriesadministration/categoriesadministration.component';
import { WorkbasketadministrationComponent } from './workbasketadministration/workbasketadministration.component';
import { WorkbasketAuthorizationComponent } from './workbasket-authorization/workbasket-authorization.component';
import { WorkbasketDetailsComponent } from './workbasket-details/workbasket-details.component';
import { WorkbasketDistributiontargetsComponent } from './workbasket-distributiontargets/workbasket-distributiontargets.component';
import { WorkbasketDetailsComponent } from './workbasket/details/workbasket-details.component'
import { WorkbasketInformationComponent } from './workbasket/details/information/workbasket-information.component'
//Shared
import { MasterAndDetailComponent} from './shared/masterAndDetail/master-and-detail.component';
@ -33,6 +34,8 @@ import { MasterAndDetailComponent} from './shared/masterAndDetail/master-and-det
/**
* Services
*/
import { WorkbasketService } from './services/workbasketservice.service'
const MODULES = [
BrowserModule,
@ -55,16 +58,16 @@ const COMPONENTS = [
CategoriestreeComponent,
CategoryeditorComponent,
CategoriesadministrationComponent,
WorkbasketadministrationComponent,
WorkbasketAuthorizationComponent,
WorkbasketDetailsComponent,
WorkbasketDistributiontargetsComponent,
MasterAndDetailComponent
MasterAndDetailComponent,
WorkbasketInformationComponent
];
@NgModule({
declarations: COMPONENTS,
imports: MODULES,
providers: [HttpClientModule],
providers: [HttpClientModule, WorkbasketService],
bootstrap: [AppComponent]
})
export class AppModule { }

View File

@ -1,10 +1,22 @@
import {WorkbasketSummary} from './WorkbasketSummary';
export class Workbasket {
constructor(
public id: string,
public created: string,
public key: string,
public domain: string,
public type: string,
public modified: string,
public name: string,
public description: string,
public description: string,
public owner: string,
public distributionTargets: [string]) { }
public custom1: string,
public custom2: string,
public custom3: string,
public custom4: string,
public orgLevel1: string,
public orgLevel2: string,
public orgLevel3: string,
public orgLevel4: string,
public workbasketSummary: WorkbasketSummary){}
}

View File

@ -0,0 +1,15 @@
export class WorkbasketSummary {
constructor(
public id: string,
public key: string,
public name: string,
public description: string,
public owner: string,
public modified: string,
public domain: string,
public type: string,
public orgLevel1: string,
public orgLevel2: string,
public orgLevel3: string,
public orgLevel4: string){}
}

View File

@ -1,15 +1,15 @@
import { TestBed, inject } from '@angular/core/testing';
import { WorkbasketserviceService } from './workbasketservice.service';
import { WorkbasketService } from './workbasketservice.service';
describe('WorkbasketserviceService', () => {
describe('WorkbasketService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [WorkbasketserviceService]
providers: [WorkbasketService]
});
});
xit('should be created', inject([WorkbasketserviceService], (service: WorkbasketserviceService) => {
xit('should be created', inject([WorkbasketService], (service: WorkbasketService) => {
expect(service).toBeTruthy();
}));
});

View File

@ -1,22 +1,30 @@
import { Injectable } from '@angular/core';
import { RequestOptions, Headers, Http, Response } from '@angular/http';
import { WorkbasketSummary } from '../model/workbasketSummary';
import { Workbasket } from '../model/workbasket';
import { WorkbasketAuthorization } from '../model/workbasket-authorization';
import { environment } from '../../environments/environment';
import { Observable } from 'rxjs/Observable';
import 'rxjs/Rx';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class WorkbasketserviceService {
export class WorkbasketService {
public workBasketSelected = new Subject<string>();
constructor(private http: Http) { }
getAllWorkBaskets(): Observable<Workbasket[]> {
getWorkBasketsSummary(): Observable<WorkbasketSummary[]> {
return this.http.get(environment.taskanaRestUrl + "/v1/workbaskets", this.createAuthorizationHeader())
.map(res => res.json());
}
createWorkbasket(workbasket: Workbasket): Observable<Workbasket> {
getWorkBasket(id: string): Observable<Workbasket> {
return this.http.get(`${environment.taskanaRestUrl}/v1/workbaskets/${id}`, this.createAuthorizationHeader())
.map(res => res.json());
}
createWorkbasket(workbasket: WorkbasketSummary): Observable<WorkbasketSummary> {
return this.http.post(environment.taskanaRestUrl + "/v1/workbaskets", workbasket, this.createAuthorizationHeader())
.map(res => res.json());
}
@ -26,7 +34,7 @@ export class WorkbasketserviceService {
.map(res => res.json());
}
updateWorkbasket(workbasket: Workbasket): Observable<Workbasket> {
updateWorkbasket(workbasket: WorkbasketSummary): Observable<WorkbasketSummary> {
return this.http.put(environment.taskanaRestUrl + "/v1/workbaskets/" + workbasket.id, workbasket, this.createAuthorizationHeader())
.map(res => res.json());
}
@ -50,6 +58,14 @@ export class WorkbasketserviceService {
return this.http.delete(environment.taskanaRestUrl + "/v1/workbaskets/authorizations/" + workbasketAuthorization.id, this.createAuthorizationHeader());
}
selectWorkBasket(id: string){
this.workBasketSelected.next(id);
}
getSelectedWorkBasket(){
return this.workBasketSelected.asObservable();
}
private createAuthorizationHeader() {
let headers: Headers = new Headers();
headers.append("Authorization", "Basic dXNlcl8xXzE6dXNlcl8xXzE=");

View File

@ -1,15 +1,16 @@
<div class="{{showDetail? 'col-md-4 hidden-xs hidden-sm':'col-xs-12 col-md-4'}} vertical-right-divider full-height" >
<router-outlet name="master"></router-outlet>
</div>
<div class="{{showDetail? 'col-xs-12 col-md-8': 'hidden'}} container-scrollable" >
<router-outlet name="detail">
<a class="{{showDetail? 'hidden visible-xs visible-sm': 'hidden'}}" (click) = "backClicked()"> < Back</a>
</router-outlet>
</div>
<div class="{{showDetail? 'hidden': 'col-md-8 container-no-detail' }}">
<div class = "center-block no-detail" >
<h3>Select a worbasket</h3>
<svg-icon class="img-responsive no-detail-icon" src="./assets/icons/no-shopping-basket.svg"></svg-icon>
<div class="no-gutter">
<div class="{{showDetail? 'col-md-4 hidden-xs hidden-sm':'col-xs-12 col-md-4'}} vertical-right-divider" >
<router-outlet name="master"></router-outlet>
</div>
<div class="{{showDetail? 'col-xs-12 col-md-8': 'hidden'}}" >
<router-outlet name="detail">
<a class="{{showDetail? 'hidden visible-xs visible-sm': 'hidden'}}" (click) = "backClicked()"> < Back</a>
</router-outlet>
</div>
<div class="{{showDetail? 'hidden': 'hidden-xs hidden-sm col-md-8 container-no-detail'}}">
<div class = "center-block no-detail" >
<h3>Select a worbasket</h3>
<svg-icon class="img-responsive no-detail-icon" src="./assets/icons/no-shopping-basket.svg"></svg-icon>
</div>
</div>
</div>

View File

@ -1,4 +1,4 @@
<h2>Authorizations</h2>
<!-- <h2>Authorizations</h2>
<table class="table table-condensed table-hover">
<thead>
<th>ID</th>
@ -95,4 +95,4 @@
</button>
</td>
</tr>
</table>
</table> -->

View File

@ -1,101 +1,100 @@
import { Component, OnInit, Input } from '@angular/core';
import { ActivatedRoute, Params } from '@angular/router';
import { WorkbasketserviceService } from '../services/workbasketservice.service';
import { WorkbasketService } from '../services/workbasketservice.service';
import { WorkbasketAuthorization } from '../model/workbasket-authorization';
import { Workbasket } from '../model/workbasket';
import { WorkbasketSummary } from '../model/workbasketSummary';
@Component({
selector: 'app-workbasket-authorization',
templateUrl: './workbasket-authorization.component.html',
styleUrls: ['./workbasket-authorization.component.css'],
providers: [WorkbasketserviceService]
styleUrls: ['./workbasket-authorization.component.css']
})
export class WorkbasketAuthorizationComponent implements OnInit {
@Input()
workbasket: Workbasket;
@Input()
workbasket: WorkbasketSummary;
workbasketAuthorization: WorkbasketAuthorization = this.getEmptyObject();
selected: WorkbasketAuthorization = this.getEmptyObject();
editing: WorkbasketAuthorization = this.getEmptyObject();
isEditing: boolean = false;
// workbasketAuthorization: WorkbasketAuthorization = this.getEmptyObject();
// selected: WorkbasketAuthorization = this.getEmptyObject();
// editing: WorkbasketAuthorization = this.getEmptyObject();
// isEditing: boolean = false;
constructor(private service: WorkbasketserviceService, private route: ActivatedRoute) { }
// constructor(private service: WorkbasketService, private route: ActivatedRoute) { }
workbasketAuthorizations: WorkbasketAuthorization[];
// workbasketAuthorizations: WorkbasketAuthorization[];
ngOnInit() {
this.route.params.switchMap((params: Params) => this.service.getAllWorkBasketAuthorizations(params['id']))
.subscribe(resultList => {
this.workbasketAuthorizations = resultList;
});
// this.route.params.switchMap((params: Params) => this.service.getAllWorkBasketAuthorizations(params['id']))
// .subscribe(resultList => {
// this.workbasketAuthorizations = resultList;
// });
}
getEmptyObject() {
return new WorkbasketAuthorization("", "", "", "", false, false, false, false, false);
}
// getEmptyObject() {
// return new WorkbasketAuthorization("", "", "", "", false, false, false, false, false);
// }
onDelete(workbasket: WorkbasketAuthorization) {
this.service.deleteWorkBasketAuthorization(workbasket).subscribe(result => {
var index = this.workbasketAuthorizations.indexOf(workbasket);
if (index > -1) {
this.workbasketAuthorizations.splice(index, 1);
}
});
}
// onDelete(workbasket: WorkbasketAuthorization) {
// this.service.deleteWorkBasketAuthorization(workbasket).subscribe(result => {
// var index = this.workbasketAuthorizations.indexOf(workbasket);
// if (index > -1) {
// this.workbasketAuthorizations.splice(index, 1);
// }
// });
// }
onAdd() {
console.log(this.workbasketAuthorization);
this.workbasketAuthorization.workbasketId = this.workbasket.id;
this.service.createWorkBasketAuthorization(this.workbasketAuthorization).subscribe(result => {
this.workbasketAuthorizations.push(result);
this.onClear();
});
}
// onAdd() {
// console.log(this.workbasketAuthorization);
// this.workbasketAuthorization.workbasketId = this.workbasket.id;
// this.service.createWorkBasketAuthorization(this.workbasketAuthorization).subscribe(result => {
// this.workbasketAuthorizations.push(result);
// this.onClear();
// });
// }
onEdit(workbasketAuthorizations: WorkbasketAuthorization) {
this.editing = { ...workbasketAuthorizations };
this.isEditing = true;
}
// onEdit(workbasketAuthorizations: WorkbasketAuthorization) {
// this.editing = { ...workbasketAuthorizations };
// this.isEditing = true;
// }
onSelect(workbasketAuthorizations: WorkbasketAuthorization) {
if (!this.isEditing) {
this.selected = workbasketAuthorizations;
}
}
// onSelect(workbasketAuthorizations: WorkbasketAuthorization) {
// if (!this.isEditing) {
// this.selected = workbasketAuthorizations;
// }
// }
onClear() {
this.workbasketAuthorization.id = "";
this.workbasketAuthorization.workbasketId = "";
this.workbasketAuthorization.userId = "";
this.workbasketAuthorization.groupId = "";
this.workbasketAuthorization.read = false;
this.workbasketAuthorization.open = false;
this.workbasketAuthorization.append = false;
this.workbasketAuthorization.transfer = false;
this.workbasketAuthorization.distribute = false;
}
// onClear() {
// this.workbasketAuthorization.id = "";
// this.workbasketAuthorization.workbasketId = "";
// this.workbasketAuthorization.userId = "";
// this.workbasketAuthorization.groupId = "";
// this.workbasketAuthorization.read = false;
// this.workbasketAuthorization.open = false;
// this.workbasketAuthorization.append = false;
// this.workbasketAuthorization.transfer = false;
// this.workbasketAuthorization.distribute = false;
// }
onSave() {
if (this.isEditing) {
this.service.updateWorkBasketAuthorization(this.editing).subscribe(result => {
this.selected.id = result.id;
this.selected.workbasketId = result.workbasketId;
this.selected.userId = result.userId;
this.selected.groupId = result.groupId;
this.selected.read = result.read;
this.selected.open = result.open;
this.selected.append = result.append;
this.selected.transfer = result.transfer;
this.selected.distribute = result.distribute;
});
}
this.isEditing = false;
this.editing = this.getEmptyObject();
}
// onSave() {
// if (this.isEditing) {
// this.service.updateWorkBasketAuthorization(this.editing).subscribe(result => {
// this.selected.id = result.id;
// this.selected.workbasketId = result.workbasketId;
// this.selected.userId = result.userId;
// this.selected.groupId = result.groupId;
// this.selected.read = result.read;
// this.selected.open = result.open;
// this.selected.append = result.append;
// this.selected.transfer = result.transfer;
// this.selected.distribute = result.distribute;
// });
// }
// this.isEditing = false;
// this.editing = this.getEmptyObject();
// }
onCancel() {
this.editing = this.getEmptyObject();
this.isEditing = false;
}
// onCancel() {
// this.editing = this.getEmptyObject();
// this.isEditing = false;
// }
}

View File

@ -1,29 +0,0 @@
<div class="row">
<div class="col-md-6">
<h2>Details</h2>
</div>
<div class="col-md-6">
<button type="button" class="btn btn-default" aria-label="Left Align" (click)="onEdit()">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
</button>
<button type="button" class="btn btn-default" aria-label="Left Align" (click)="onSave()">
<span class="glyphicon glyphicon-floppy-disk" aria-hidden="true"></span></button>
</div>
</div>
<dl class="dl-horizontal">
<dt>Id</dt>
<dd>{{ workbasketClone.id }}</dd>
<dt>Created Date</dt>
<dd>{{ workbasketClone.created | date: 'dd/MM/yyyy HH:mm' }}</dd>
<dt>Modified Date</dt>
<dd>{{ workbasketClone.modified | date: 'dd/MM/yyyy HH:mm' }}</dd>
<dt>Name</dt>
<dd *ngIf="!editMode">{{ workbasketClone.name }}</dd>
<dd *ngIf="editMode"><input class="form-control" placeholder="Name" name="editName" [(ngModel)]="workbasketClone.name" required></dd>
<dt>Owner</dt>
<dd *ngIf="!editMode">{{ workbasketClone.owner }}</dd>
<dd *ngIf="editMode"><input class="form-control" placeholder="Owner" name="editOwner" [(ngModel)]="workbasketClone.owner" required></dd>
<dt>Description</dt>
<dd *ngIf="!editMode">{{ workbasketClone.description }}</dd>
<dd *ngIf="editMode"><textarea class="form-control" rows="3" placeholder="Description" name="editDescription" [(ngModel)]="workbasketClone.description"></textarea></dd>
</dl>

View File

@ -1,41 +0,0 @@
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import { Workbasket } from '../model/workbasket';
import { WorkbasketserviceService } from '../services/workbasketservice.service';
@Component({
selector: 'app-workbasket-details',
templateUrl: './workbasket-details.component.html',
styleUrls: ['./workbasket-details.component.css']
})
export class WorkbasketDetailsComponent implements OnInit {
@Input()
workbasket: Workbasket;
workbasketClone: Workbasket;
allWorkbasket: Workbasket[];
editMode: boolean = false;
@Output()
onSaved = new EventEmitter<Workbasket>();
constructor(private service: WorkbasketserviceService) { }
ngOnInit() {
this.workbasketClone = { ...this.workbasket };
}
ngOnChanges() {
this.workbasketClone = { ...this.workbasket };
this.editMode = false;
}
onEdit() {
this.editMode = true;
}
onSave() {
this.onSaved.emit(this.workbasketClone);
this.editMode = false;
}
}

View File

@ -1,4 +1,4 @@
<h2>Distribution Targets</h2>
<!-- <h2>Distribution Targets</h2>
<div *ngFor="let alert of alerts">
<alert [type]="alert.type" dismissible="true" [dismissOnTimeout]="5000">{{ alert.msg }}</alert>
</div>
@ -31,4 +31,4 @@
</td>
</tr>
</table>
</div>
</div> -->

View File

@ -1,6 +1,6 @@
import { Component, OnInit, Input } from '@angular/core';
import { Workbasket } from '../model/workbasket';
import { WorkbasketserviceService } from '../services/workbasketservice.service'
import { WorkbasketSummary } from '../model/workbasketSummary';
import { WorkbasketService } from '../services/workbasketservice.service'
import { Observable } from 'rxjs/Observable';
@Component({
@ -11,96 +11,96 @@ import { Observable } from 'rxjs/Observable';
export class WorkbasketDistributiontargetsComponent implements OnInit {
@Input()
workbasket: Workbasket;
workbaskets: Workbasket[];
workbasket: WorkbasketSummary;
workbaskets: WorkbasketSummary[];
public alerts: any = [];
constructor(private service: WorkbasketserviceService) { }
constructor(private service: WorkbasketService) { }
ngOnInit() {
this.prepareData();
//this.prepareData();
}
ngOnChange() {
this.prepareData();
}
// ngOnChange() {
// this.prepareData();
// }
prepareData() {
this.service.getAllWorkBaskets().subscribe(resultList => {
this.workbaskets = resultList;
});
}
// prepareData() {
// this.service.getWorkBasketsSummary().subscribe(resultList => {
// this.workbaskets = resultList;
// });
// }
onAdd(w: Workbasket) {
if (this.workbasket.distributionTargets.length > 0) {
let found: boolean = false;
for (var i = 0, len = this.workbasket.distributionTargets.length; i < len; i++) {
if (this.workbasket.distributionTargets[i] === w.id) {
found = true;
break;
}
}
// onAdd(w: WorkbasketSummary) {
// if (this.workbasket.distributionTargets.length > 0) {
// let found: boolean = false;
// for (var i = 0, len = this.workbasket.distributionTargets.length; i < len; i++) {
// if (this.workbasket.distributionTargets[i] === w.id) {
// found = true;
// break;
// }
// }
if (!found) {
this.onSaved(w, true);
} else {
this.alerts = [{
type: "danger",
msg: "This workbasket is already mapped!"
}];
}
} else {
this.onSaved(w, true);
}
}
// if (!found) {
// this.onSaved(w, true);
// } else {
// this.alerts = [{
// type: "danger",
// msg: "This workbasket is already mapped!"
// }];
// }
// } else {
// this.onSaved(w, true);
// }
// }
onDelete(id: string) {
this.onSaved(this.resolveObject(id), false);
}
// onDelete(id: string) {
// this.onSaved(this.resolveObject(id), false);
// }
// get workbasket name
resolveName(id: string): any {
if (this.workbaskets != null) {
return this.workbaskets.filter(item => item.id === id)[0].name;
}
}
// // get workbasket name
// resolveName(id: string): any {
// if (this.workbaskets != null) {
// return this.workbaskets.filter(item => item.id === id)[0].name;
// }
// }
// create an Workbasket
resolveObject(id: string): any {
if (this.workbaskets != null) {
return this.workbaskets.filter(item => item.id === id)[0];
}
}
// // create an WorkbasketSummary
// resolveObject(id: string): any {
// if (this.workbaskets != null) {
// return this.workbaskets.filter(item => item.id === id)[0];
// }
// }
onSaved(w: Workbasket, isUpdate: boolean) {
if (w != null) {
// add changes
if (isUpdate) {
this.workbasket.distributionTargets.push(w.id);
} else {
let index = this.workbasket.distributionTargets.indexOf(w.id);
this.workbasket.distributionTargets.splice(index, 1);
}
// onSaved(w: WorkbasketSummary, isUpdate: boolean) {
// if (w != null) {
// // add changes
// if (isUpdate) {
// this.workbasket.distributionTargets.push(w.id);
// } else {
// let index = this.workbasket.distributionTargets.indexOf(w.id);
// this.workbasket.distributionTargets.splice(index, 1);
// }
// try to save changes
this.service.updateWorkbasket(this.workbasket).subscribe(result => {
this.workbasket.id = result.id;
this.workbasket.name = result.name;
this.workbasket.description = result.description;
this.workbasket.owner = result.owner;
this.workbasket.distributionTargets = result.distributionTargets;
}, (err) => {
this.alerts = [{
type: "danger",
msg: "You are not authorized."
}];
// reset changes
if (isUpdate) {
this.workbasket.distributionTargets.pop();
} else {
this.workbasket.distributionTargets.push(w.id);
}
});
}
}
// // try to save changes
// this.service.updateWorkbasket(this.workbasket).subscribe(result => {
// this.workbasket.id = result.id;
// this.workbasket.name = result.name;
// this.workbasket.description = result.description;
// this.workbasket.owner = result.owner;
// this.workbasket.distributionTargets = result.distributionTargets;
// }, (err) => {
// this.alerts = [{
// type: "danger",
// msg: "You are not authorized."
// }];
// // reset changes
// if (isUpdate) {
// this.workbasket.distributionTargets.pop();
// } else {
// this.workbasket.distributionTargets.push(w.id);
// }
// });
// }
// }
}

View File

@ -0,0 +1,27 @@
<div class="row">
<div class="col-md-6">
<h2>Details</h2>
</div>
<div class="col-md-6">
<button type="button" class="btn btn-default" aria-label="Left Align" (click)="onEdit()">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
</button>
<button type="button" class="btn btn-default" aria-label="Left Align" (click)="onSave()">
<span class="glyphicon glyphicon-floppy-disk" aria-hidden="true"></span></button>
</div>
</div>
<dl class="dl-horizontal" *ngIf = "workbasket">
<dt>Id</dt>
<dd>{{ workbasket.id }}</dd>
<dt>Created Date</dt>
<dd>{{ workbasket.created | date: 'dd/MM/yyyy HH:mm' }}</dd>
<dt>Modified Date</dt>
<dd>{{ workbasket.modified | date: 'dd/MM/yyyy HH:mm' }}</dd>
<dt>Name</dt>
<dd><input class="form-control" placeholder="Name" name="editName" [(ngModel)]="workbasket.name" required></dd>
<dt>Owner</dt>
<dd><input class="form-control" placeholder="Owner" name="editOwner" [(ngModel)]="workbasket.owner" required></dd>
<dt>Description</dt>
<dd><textarea class="form-control" rows="3" placeholder="Description" name="editDescription" [(ngModel)]="workbasket.description"></textarea></dd>
</dl>

View File

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { WorkbasketInformationComponent } from './workbasket-information.component';
describe('InformationComponent', () => {
let component: WorkbasketInformationComponent;
let fixture: ComponentFixture<WorkbasketInformationComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ WorkbasketInformationComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(WorkbasketInformationComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,23 @@
import { Component, OnInit, Input, Output } from '@angular/core';
import { WorkbasketSummary } from '../../../model/workbasketSummary';
import { WorkbasketService } from '../../../services/workbasketservice.service';
@Component({
selector: 'workbasket-information',
templateUrl: './workbasket-information.component.html',
styleUrls: ['./workbasket-information.component.scss']
})
export class WorkbasketInformationComponent implements OnInit {
@Input()
workbasket: WorkbasketSummary;
constructor(private service: WorkbasketService) { }
ngOnInit() {
}
ngOnChanges() {
}
}

View File

@ -0,0 +1,20 @@
<div class="col-xs-1">
<ul class="nav nav-tabs tabs-left sideways">
<li [class.active]="wbClicked"><a href="#workbaskets-information" data-toggle="tab" ><br>Details</a></li>
<li [class.active]="authClicked"><a href="#workbaskets-authorization" data-toggle="tab" ><br>Authorizations</a></li>
<li [class.active]="dtClicked"><a href="#workbaskets-distribution-targets" data-toggle="tab" >Distribution Targets</a></li>
</ul>
</div>
<div class="col-xs-10">
<div class="tab-content">
<div class="tab-pane" [class.active]="wbClicked" id="workbaskets-information">
<workbasket-information [workbasket]="workbasket"></workbasket-information>
</div>
<div class="tab-pane" [class.active]="authClicked" id="workbaskets-authorization">
<app-workbasket-authorization [workbasket]="workbasket"></app-workbasket-authorization>
</div>
<div class="tab-pane" [class.active]="dtClicked" id="workbaskets-distribution-targets">
<app-workbasket-distributiontargets [workbasket]="workbasket"></app-workbasket-distributiontargets>
</div>
</div>
</div>

View File

@ -0,0 +1,46 @@
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import { WorkbasketSummary } from '../../model/workbasketSummary';
import { WorkbasketService } from '../../services/workbasketservice.service'
import { ActivatedRoute, Params, Router, NavigationStart } from '@angular/router';
import { Subscription } from 'rxjs';
@Component({
selector: 'workbasket-details',
templateUrl: './workbasket-details.component.html',
styleUrls: ['./workbasket-details.component.scss']
})
export class WorkbasketDetailsComponent implements OnInit {
workbasket: WorkbasketSummary;
workbasketClone: WorkbasketSummary;
workbasketServiceSubscription: Subscription;
routeSubscription: Subscription;
constructor(private service: WorkbasketService, private route: ActivatedRoute, private router: Router) { }
ngOnInit() {
this.routeSubscription = this.route.params.subscribe(params => {
this.service.selectWorkBasket(params['id']);
});
this.workbasketServiceSubscription = this.service.getSelectedWorkBasket().subscribe( workbasketIdSelected => {
this.service.getWorkBasket(workbasketIdSelected).subscribe( workbasket => {
this.workbasket = workbasket;
this.workbasketClone = { ...this.workbasket };
});
});
}
ngOnChanges() {
}
onSave() {
}
ngOnDestroy(){
this.workbasketServiceSubscription.unsubscribe();
this.routeSubscription.unsubscribe();
}
}

View File

@ -1,88 +1,146 @@
<h1>Workbaskets</h1>
<form #workbasketForm="ngForm">
<table class="table table-condensed table-hover">
<thead>
<th>ID</th>
<th>Name</th>
<th>Description</th>
<th>Owner</th>
<th>Actions</th>
</thead>
<tr>
<td></td>
<td>
<input class="form-control" placeholder="Name" name="name" [(ngModel)]="workbasket.name" required>
</td>
<td>
<input class="form-control" placeholder="Description" name="description" [(ngModel)]="workbasket.description">
</td>
<td>
<input class="form-control" placeholder="Owner" name="owner" [(ngModel)]="workbasket.owner" required>
</td>
<td>
<button type="button" class="btn btn-default" aria-label="Left Align" (click)="onAdd()">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
</button>
<button type="button" class="btn btn-default" aria-label="Left Align" (click)="onClear()">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</td>
</tr>
<div class = "workbasket-list-full-height">
<ul class="list-group footer-space">
<li id="wb-action-toolbar" class="list-group-item">
<div class="row">
<div class="col-xs-9 mod-col-9">
<button type="button" data-toggle="tooltip" title="Add" class="btn btn-default">
<span class="glyphicon glyphicon-plus green" aria-hidden="true"></span>
</button>
<button type="button" data-toggle="tooltip" title="Edit" class="btn btn-default">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
</button>
<button type="button" data-toggle="tooltip" title="copy" class="btn btn-default">
<span class="glyphicon glyphicon-copy" aria-hidden="true"></span>
</button>
<button type="button" data-toggle="tooltip" title="Remove distibution target" class="btn btn-default">
<span class="glyphicon glyphicon-erase" aria-hidden="true"></span>
</button>
<button type="button" data-toggle="tooltip" title="Remove" class="btn btn-default remove">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</div>
<div class="clearfix btn-group">
<button class="btn btn-default collapsed" type="button" id="collapsedMenuSearchWb" data-toggle="collapse" data-target="#wb-search-bar" aria-expanded="false">
<span class="glyphicon glyphicon-filter blue wb-search-toggle"></span>
</button>
</div>
<div class="dropdown clearfix btn-group">
<button class="btn btn-default" type="button" id="dropdownMenu4" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
<span class="glyphicon glyphicon-sort blue dropdown-toggle"></span>
</button>
<ul class="dropdown-menu dropdown-menu-right orderby-dropdown popup" aria-labelledby="dropdownMenu1">
<li>
<div class="col-xs-6">
<h5>Order By</h5>
</div>
<button type="button" placeholder="des" class="btn btn-default" data-toggle="tooltip" title="descending">
<span class="glyphicon glyphicon-sort-by-attributes" aria-hidden="true"></span>
</button>
<button type="button" data-toggle="tooltip" title="ascending" class="btn btn-default">
<span class="glyphicon glyphicon-sort-by-attributes-alt" aria-hidden="true"></span>
</button>
</li>
<li role="separator" class="divider"></li>
<li class="link-padding">
<a>
<div class="radio">
<label class="radio-inline active">
<input type="radio" name="orderRadio" id="nameRadio" value="Name" aria-label="Name">Name
</label>
</div>
</a>
</li>
<li>
<a>
<div class="radio">
<label class="radio-inline">
<input type="radio" name="orderRadio" id="descriptionRadio" value="Description" aria-label="Description">Description
</label>
</div>
</a>
</li>
<li>
<a>
<div class="radio">
<label class="radio-inline">
<input type="radio" name="orderRadio" id="ownerRadio" value="Owner" aria-label="Name">Owner
</label>
</div>
</a>
</li>
<li>
<a>
<div class="radio">
<label class="radio-inline">
<input type="radio" name="orderRadio" id="typeRadio" value="Type" aria-label="Name">Type
</label>
</div>
</a>
</li>
</ul>
</div>
</div>
</li>
<tr *ngFor="let workbasket of workbaskets" (click)="onSelect(workbasket)" [class.active]="workbasket.id == selected.id" [routerLink]="[ {outlets: { detail: [workbasket.id] } }]">
<td *ngIf="workbasket.id != editing.id">{{ workbasket.id }}</td>
<td *ngIf="workbasket.id == editing.id">
<input class="form-control" placeholder="Id" name="editid" [(ngModel)]="editing.id" readonly>
</td>
<td *ngIf="workbasket.id != editing.id">{{ workbasket.name }}</td>
<td *ngIf="workbasket.id == editing.id">
<input class="form-control" placeholder="Name" name="editname" [(ngModel)]="editing.name" required>
</td>
<td *ngIf="workbasket.id != editing.id">{{ workbasket.description }}</td>
<td *ngIf="workbasket.id == editing.id">
<input class="form-control" placeholder="Description" name="editdescription" [(ngModel)]="editing.description">
</td>
<td *ngIf="workbasket.id != editing.id">{{ workbasket.owner }}</td>
<td *ngIf="workbasket.id == editing.id">
<input class="form-control" placeholder="Owner" name="editowner" [(ngModel)]="editing.owner" required>
</td>
<td *ngIf="workbasket.id != editing.id">
<button type="button" class="btn btn-default" aria-label="Left Align" (click)="onEdit(workbasket)">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
</button>
<button type="button" class="btn btn-default" aria-label="Left Align" (click)="onDelete(workbasket)">
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
</button>
</td>
<td *ngIf="workbasket.id == editing.id">
<button type="button" class="btn btn-default" aria-label="Left Align" (click)="onSave(workbasket)">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
</button>
<button type="button" class="btn btn-default" aria-label="Left Align" (click)="onCancel(workbasket)">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</td>
</tr>
</table>
</form>
<hr>
<div class="col-xs-1" *ngIf="workbasket.id != selected.id">
<ul class="nav nav-tabs tabs-left sideways">
<li [class.active]="wbClicked"><a href="javascript:void(0)" data-toggle="tab" (click)="onClickWB()"><br>Details</a></li>
<li [class.active]="authClicked"><a href="javascript:void(0)" data-toggle="tab" (click)="onClickAuth()"><br>Authorizations</a></li>
<li [class.active]="dtClicked"><a href="javascript:void(0)" data-toggle="tab" (click)="onClickDt()">Distribution Targets</a></li>
</ul>
</div>
<div class="col-xs-10" *ngIf="workbasket.id != selected.id">
<div class="tab-content">
<div class="tab-pane" [class.active]="wbClicked">
<app-workbasket-details [workbasket]="selected"></app-workbasket-details>
</div>
<div class="tab-pane" [class.active]="authClicked">
<app-workbasket-authorization [workbasket]="selected"></app-workbasket-authorization>
</div>
<div class="tab-pane" [class.active]="dtClicked">
<app-workbasket-distributiontargets [workbasket]="selected"></app-workbasket-distributiontargets>
</div>
</div>
<li type="text" id="wb-search-bar" class="list-group-seach collapse">
<div class="row">
<dl class="pull-left padding-left-5">
<dt class="dropdown"> <button class="btn btn-default" type="button" id="dropdownMenuSearch" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
<svg-icon class="small blue" src="./assets/icons/user.svg"></svg-icon>
</button> <ul class="dropdown-menu dropdown-menu-users" role="menu">
<li>
<button type="button" placeholder="individual" class="btn btn-default btn-users-list" data-toggle="tooltip" title="individual">
<svg-icon class="small blue" src="./assets/icons/user.svg"></svg-icon>
</button>
</li>
<li>
<button type="button" placeholder="multiple" data-toggle="tooltip" title="multiple" class="btn btn-default btn-users-list">
<svg-icon class="small blue" src="./assets/icons/users.svg"></svg-icon>
</button>
</li>
</ul></dt>
</dl>
<dl class="col-xs-10">
<dt><input type="text" class="form-control" id="wb-display-name-search" placeholder="Filter by name"> </dt>
<dt><input type="text" class="form-control" id="wb-display-description-search" placeholder="Filter by description"> </dt>
<dt><input type="text" class="form-control" id="wb-display-task-owner-search" placeholder="Filter by Task owner"> </dt>
</dl>
</div>
</li>
<li class="list-group-item" *ngFor= "let workbasket of workbaskets" [class.active]="workbasket.id === selectedId" type="text" [routerLink]="[ {outlets: { detail: [workbasket.id] } }]">
<div class="row">
<dl class="col-xs-1">
<dt><svg-icon class="{{workbasket.id === selectedId? 'white': 'blue' }} small" src="./assets/icons/{{workbasket.type === 'PERSONAL'? 'user.svg': 'users.svg'}}"></svg-icon></dt>
</dl>
<dl class="col-xs-10">
<dt>{{workbasket.name}} ({{workbasket.key}}) </dt>
<dd>{{workbasket.description}}</dd>
<dd>{{workbasket.owner}} &nbsp;</dd>
</dl>
</div>
</li>
</ul>
<ul class="pagination vertical-center">
<li>
<a href="#" aria-label="Previous"> <span aria-hidden="true">«</span> </a>
</li>
<li>
<a href="">1</a>
</li>
<li>
<a href="">2</a>
</li>
<li>
<a href="">3</a>
</li>
<li>
<a href="">4</a>
</li>
<li>
<a href="">5</a>
</li>
<li>
<a href="#" aria-label="Next"> <span aria-hidden="true">»</span> </a>
</li>
</ul>
</div>

View File

@ -0,0 +1,7 @@
.padding-left-5 {
padding-left:5px;
}
.workbasket-list-full-height{
height: calc(100vh - 55px);
}

View File

@ -1,40 +1,38 @@
import { Component, OnInit, EventEmitter } from '@angular/core';
import { Workbasket } from '../../model/workbasket';
import { WorkbasketserviceService } from '../../services/workbasketservice.service'
import { ActivatedRoute, Params } from '@angular/router';
import { WorkbasketSummary } from '../../model/workbasketSummary';
import { WorkbasketService } from '../../services/workbasketservice.service'
import { ActivatedRoute, Params, Router, NavigationStart } from '@angular/router';
import { Subscription } from 'rxjs/Subscription';
@Component({
selector: 'workbasket-list',
outputs: ['selectedWorkbasket'],
templateUrl: './workbasket-list.component.html',
styleUrls: ['./workbasket-list.component.css'],
providers: [WorkbasketserviceService]
styleUrls: ['./workbasket-list.component.scss']
})
export class WorkbasketListComponent implements OnInit {
public selectedWorkbasket: EventEmitter<Workbasket> = new EventEmitter();
public selectedWorkbasket: EventEmitter<WorkbasketSummary> = new EventEmitter();
workbasket: Workbasket = this.getEmptyObject();
selected: Workbasket = this.getEmptyObject();
editing: Workbasket = this.getEmptyObject();
isEditing: boolean = false;
newWorkbasket: WorkbasketSummary;
selectedId: string = undefined;
workbaskets : Array<WorkbasketSummary> = [];
wbClicked = true;
authClicked = false;
dtClicked = false
private workBasketSummarySubscription: Subscription;
private workbasketServiceSubscription: Subscription;
workbaskets = [];
public alerts: any = [];
constructor(private service: WorkbasketserviceService, private route: ActivatedRoute) { }
constructor(private service: WorkbasketService, private route: ActivatedRoute, private router: Router) { }
ngOnInit() {
this.service.getAllWorkBaskets().subscribe(resultList => {
this.workBasketSummarySubscription = this.service.getWorkBasketsSummary().subscribe(resultList => {
this.workbaskets = resultList;
});
this.workbasketServiceSubscription = this.service.getSelectedWorkBasket().subscribe( workbasketIdSelected => {
this.selectedId = workbasketIdSelected;
});
}
onDelete(workbasket: Workbasket) {
onDelete(workbasket: WorkbasketSummary) {
this.service.deleteWorkbasket(workbasket.id).subscribe(result => {
var index = this.workbaskets.indexOf(workbasket);
if (index > -1) {
@ -44,72 +42,26 @@ export class WorkbasketListComponent implements OnInit {
}
onAdd() {
this.service.createWorkbasket(this.workbasket).subscribe(result => {
this.service.createWorkbasket(this.newWorkbasket).subscribe(result => {
this.workbaskets.push(result);
this.onClear();
});
}
onEdit(workbasket: Workbasket) {
this.editing = { ...workbasket };
this.isEditing = true;
}
onSelect(workbasket: Workbasket) {
if (!this.isEditing) {
this.selected = workbasket;
}
}
onClear() {
this.workbasket.id = "";
this.workbasket.name = "";
this.workbasket.description = "";
this.workbasket.owner = "";
}
onSave() {
if (this.isEditing) {
this.service.updateWorkbasket(this.editing).subscribe(result => {
this.selected.id = result.id;
this.selected.name = result.name;
this.selected.description = result.description;
this.selected.owner = result.owner;
}, (err) => {
this.alerts = [{
type: "danger",
msg: "You are not authorized."
}]
});
}
this.isEditing = false;
this.editing = this.getEmptyObject();
}
onCancel() {
this.editing = this.getEmptyObject();
this.isEditing = false;
this.newWorkbasket.id = "";
this.newWorkbasket.name = "";
this.newWorkbasket.description = "";
this.newWorkbasket.owner = "";
}
getEmptyObject() {
return new Workbasket("", "", "", "", "", "", null);
return new WorkbasketSummary("", "", "", "", "", "", "", "", "", "", "", null);
}
onClickWB() {
this.wbClicked = !this.wbClicked;
this.authClicked = false;
this.dtClicked = false;
ngOnDestroy(){
this.workBasketSummarySubscription.unsubscribe();
this.workbasketServiceSubscription.unsubscribe();
}
onClickAuth() {
this.authClicked = !this.authClicked;
this.wbClicked = false;
this.dtClicked = false;
}
onClickDt() {
this.dtClicked = !this.dtClicked;
this.wbClicked = false;
this.authClicked = false;
}
}

View File

@ -1,3 +0,0 @@
<!-- app-workbasketeditor [workbasket]="selectedWorkbasket" (workbasketSaved)="onWorkbasketSaved($event)"></app-workbasketeditor -->
<!-- <workbasket-list (selectedWorkbasket)="onWorkbasketSelected($event)"></workbasket-list> -->
DETAIL COMPONENT

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { WorkbasketadministrationComponent } from './workbasketadministration.component';
describe('WorkbasketadministrationComponent', () => {
let component: WorkbasketadministrationComponent;
let fixture: ComponentFixture<WorkbasketadministrationComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ WorkbasketadministrationComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(WorkbasketadministrationComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
xit('should be created', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,26 +0,0 @@
import { Component, OnInit } from '@angular/core';
import { Workbasket } from '../model/workbasket';
@Component({
selector: 'app-workbasketadministration',
templateUrl: './workbasketadministration.component.html',
styleUrls: ['./workbasketadministration.component.css']
})
export class WorkbasketadministrationComponent implements OnInit {
selectedWorkbasket: Workbasket;
constructor() { }
ngOnInit() {
}
onWorkbasketSelected(workbasket: Workbasket) {
console.log("got new selected workbasket: " + workbasket.id);
this.selectedWorkbasket = workbasket;
}
onWorkbasketSaved(workbasket: Workbasket) {
console.log("got saved workbasket: " + workbasket);
}
}

View File

@ -1,5 +1,5 @@
import { Component, OnInit, EventEmitter } from '@angular/core';
import { Workbasket } from '../model/workbasket';
import { WorkbasketSummary } from '../model/workbasketSummary';
@Component({
selector: 'app-workbasketeditor',
@ -9,13 +9,13 @@ import { Workbasket } from '../model/workbasket';
styleUrls: ['./workbasketeditor.component.css']
})
export class WorkbasketeditorComponent implements OnInit {
public workbasket: Workbasket;
public workbasketSaved: EventEmitter<Workbasket> = new EventEmitter();
public workbasket: WorkbasketSummary;
public workbasketSaved: EventEmitter<WorkbasketSummary> = new EventEmitter();
constructor() { }
ngOnInit() {
this.workbasket = new Workbasket("", "", "", "", "", "", null);
this.workbasket = new WorkbasketSummary("", "", "", "", "", "", "", "", "", "", "", null);
}
onSubmit() {

View File

@ -1,67 +1,3 @@
/*
* Base structure
*/
/* Move down content because we have a fixed navbar that is 55px tall */
body {
padding-top: 55px;
}
/*
* All side bar links styling.
*/
.nav-sidebar > li > a {
padding-right: 20px;
padding-left: 20px;
}
.nav-sidebar > .active > a,
.nav-sidebar > .active > a:hover,
.nav-sidebar > .active > a:focus {
color: #fff;
background-color: #428bca;
}
.nav.nav-tabs {
& > li {
& > a{
min-height: 56px;
padding-top: 17px;
}
&:first-child > a{
border-left: none;
}
}
& > p{
margin: 0px;
}
}
.navbar-brand {
float: none;
}
.navbar-inverse {
border: none;
}
.navbar {
margin-bottom: 0px;
}
/*
* Placeholder dashboard ideas
*/
.placeholders {
margin-bottom: 30px;
text-align: center;
}
.placeholders h4 {
margin-bottom: 0;
}
.placeholder {
margin-bottom: 20px;
@ -83,8 +19,13 @@ body {
.no-border-radius {
border-radius: 0px;
}
/*
* Base structure
*/
/* Move down content because we have a fixed navbar that is 55px tall */
.container-main {
margin-top: 55px;
overflow-y: hidden;
/*Min mobile view size*/
min-width: 420px;
@ -138,16 +79,16 @@ body {
}
/*
*Remove bootstrap cols padding
*Remove bootstrap cols padding for master and detail component
*/
.no-gutter > [class*='col-'] {
.no-gutter > master-and-detail > [class*='col-'] {
padding-right: 0;
padding-left: 0;
}
img.small {
width: 14px;
height: 14px;
.small {
width: 16px;
height: 16px;
}
.dropdown-menu.action {
@ -161,13 +102,6 @@ img.small {
overflow-x: hidden;
}
.full-height {
max-height: 100vh;
height: 100vh;
overflow-y: auto;
overflow-x: hidden;
}
.margin-right {
margin-right: 2px;
}
@ -282,14 +216,40 @@ li > div.row > dl {
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
}
.green-32 {
.white{
color: white;
& svg {
fill: white;
}
}
.blue{
color: #337ab7;
& svg {
fill: #337ab7;
}
}
.green {
color: green;
}
.blue-32 {
color: #337ab7;
}
.toolbar {
padding: 13px 15px;
}
.open > .dropdown-menu {
opacity: 1;
visibility: visible;
}
.dropdown-menu {
display: block;
opacity: 0;
visibility: hidden;
-webkit-transition: opacity 300ms ease, visibility 300ms ease;
-moz-transition: opacity 300ms ease, visibility 300ms ease;
-o-transition: opacity 300ms ease, visibility 300ms ease;
transition: opacity 300ms ease, visibility 300ms ease;
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M9.157 11v-.947c1.257-.712 2.282-2.489 2.282-4.266 0-2.853 0-5.166-3.423-5.166-3.422 0-3.422 2.313-3.422 5.166 0 1.777 1.025 3.554 2.281 4.266V11c-3.87.318-6.844 2.232-6.844 4.546H16c0-2.314-2.974-4.228-6.844-4.546z"/></svg>

After

Width:  |  Height:  |  Size: 293 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M10.674 12.061v-.824c.974-.62 1.769-2.166 1.769-3.712 0-2.482 0-4.495-2.653-4.495-2.654 0-2.654 2.013-2.654 4.495 0 1.546.795 3.092 1.77 3.712v.824c-3 .277-5.307 1.942-5.307 3.955H15.98c0-2.013-2.307-3.678-5.307-3.955z"/><path d="M4.583 12.447c.764-.564 1.714-.993 2.76-1.255a5.714 5.714 0 0 1-.56-.921 6.306 6.306 0 0 1-.642-2.746c0-1.343 0-2.611.423-3.648.41-1.007 1.149-1.631 2.2-1.865C8.532.818 7.91.033 6.253.033c-2.653 0-2.653 2.013-2.653 4.495 0 1.546.794 3.092 1.769 3.712v.824C2.368 9.341.06 11.006.06 13.02h3.856c.2-.201.422-.393.666-.572z"/></svg>

After

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -7,10 +7,10 @@
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link rel="icon" type="image/x-icon" href="taskana.ico">
</head>
<body class ="container-main">
<body>
<app-root></app-root>
</body>

View File

@ -19,19 +19,19 @@
*/
/** IE9, IE10 and IE11 requires all of the following polyfills. **/
// import 'core-js/es6/symbol';
// import 'core-js/es6/object';
// import 'core-js/es6/function';
// import 'core-js/es6/parse-int';
// import 'core-js/es6/parse-float';
// import 'core-js/es6/number';
// import 'core-js/es6/math';
// import 'core-js/es6/string';
// import 'core-js/es6/date';
// import 'core-js/es6/array';
// import 'core-js/es6/regexp';
// import 'core-js/es6/map';
// import 'core-js/es6/set';
import 'core-js/es6/symbol';
import 'core-js/es6/object';
import 'core-js/es6/function';
import 'core-js/es6/parse-int';
import 'core-js/es6/parse-float';
import 'core-js/es6/number';
import 'core-js/es6/math';
import 'core-js/es6/string';
import 'core-js/es6/date';
import 'core-js/es6/array';
import 'core-js/es6/regexp';
import 'core-js/es6/map';
import 'core-js/es6/set';
/** IE10 and IE11 requires the following for NgClass support on SVG elements */
// import 'classlist.js'; // Run `npm install --save classlist.js`.

View File

@ -1,7 +0,0 @@
/* You can add global styles to this file, and also import other style files */
.ng-valid[required], .ng-valid.required {
border-left: 5px solid #42A948; /* green */
}
.ng-invalid:not(form) {
border-left: 5px solid #a94442; /* red */
}

BIN
admin/src/taskana.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB