TSK-380 Adapt application services for using HAL format

This commit is contained in:
Martin Rojas Miguel Angel 2018-03-14 10:58:00 +01:00 committed by Holger Hagen
parent 7dc951351d
commit 751d77254b
43 changed files with 248 additions and 588 deletions

View File

@ -3,7 +3,6 @@ import { RouterModule, Routes } from '@angular/router';
import { AppComponent } from './app.component';
import { WorkbasketListComponent } from './workbasket/list/workbasket-list.component';
import { WorkbasketDetailsComponent } from './workbasket/details/workbasket-details.component';
import { CategoriesadministrationComponent } from './categoriesadministration/categoriesadministration.component';
import { MasterAndDetailComponent } from './shared/masterAndDetail/master-and-detail.component';
import { NoAccessComponent } from './workbasket/noAccess/no-access.component';
@ -33,7 +32,7 @@ const appRoutes: Routes = [
children: [
{
path: '',
component: CategoriesadministrationComponent,
component: WorkbasketListComponent,
outlet: 'detail'
}
]

View File

@ -17,10 +17,6 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
*/
import { AppComponent } from './app.component';
import { WorkbasketListComponent } from './workbasket/list/workbasket-list.component';
import { CategorieslistComponent } from './categorieslist/categorieslist.component';
import { CategoriestreeComponent } from './categoriestree/categoriestree.component';
import { CategoryeditorComponent } from './categoryeditor/categoryeditor.component';
import { CategoriesadministrationComponent } from './categoriesadministration/categoriesadministration.component';
import { WorkbasketDetailsComponent } from './workbasket/details/workbasket-details.component';
import { WorkbasketInformationComponent } from './workbasket/details/information/workbasket-information.component';
import { DistributionTargetsComponent } from './workbasket/details/distribution-targets/distribution-targets.component';
@ -69,10 +65,6 @@ const MODULES = [
const DECLARATIONS = [
AppComponent,
WorkbasketListComponent,
CategorieslistComponent,
CategoriestreeComponent,
CategoryeditorComponent,
CategoriesadministrationComponent,
AccessItemsComponent,
WorkbasketDetailsComponent,
MasterAndDetailComponent,

View File

@ -1,6 +0,0 @@
<div class="col-md-3">
<app-categoriestree (categorySelected)="onCategorySelected($event)"></app-categoriestree>
</div>
<div class="col-md-9">
<app-categoryeditor [categorySelected]="categorySelected"></app-categoryeditor>
</div>

View File

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

View File

@ -1,23 +0,0 @@
import { Component, OnInit, Input } from '@angular/core';
@Component({
selector: 'app-categoriesadministration',
templateUrl: './categoriesadministration.component.html',
styleUrls: ['./categoriesadministration.component.css']
})
export class CategoriesadministrationComponent implements OnInit {
constructor() { }
ngOnInit() {
}
@Input()
categorySelected: any;
onCategorySelected(arg) {
console.log("Event angekommen: ",arg);
this.categorySelected = arg;
}
}

View File

@ -1,9 +0,0 @@
export class Category {
constructor(
public id: string,
public name: string,
public owner: string,
public description: string,
public priority: number,
public serviceLevel: string) { }
}

View File

@ -1,12 +0,0 @@
<table class="table table-hover">
<thead>
<th>ID</th>
<th>Name</th>
<th>Description</th>
</thead>
<tr *ngFor="let category of categories">
<td>{{ category.id }}</td>
<td>{{ category.name }}</td>
<td>{{ category.description }}</td>
</tr>
</table>

View File

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

View File

@ -1,31 +0,0 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-categorieslist',
templateUrl: './categorieslist.component.html',
styleUrls: ['./categorieslist.component.css']
})
export class CategorieslistComponent implements OnInit {
categories = [ {
"id": "1",
"name": "Category 1",
"description": "Das ist die erste Business Category."
},
{
"id": "2",
"name": "Category 2",
"description": "Das ist die erste Business Category."
},
{
"id": "3",
"name": "Category 3",
"description": "Das ist die erste Business Category."
}
];
constructor() { }
ngOnInit() {}
}

View File

@ -1,3 +0,0 @@
<tree-root [nodes]="nodes"
(onActivate)="onCategorySelected($event)">
</tree-root>

View File

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

View File

@ -1,87 +0,0 @@
import { Component, OnInit, EventEmitter, Output } from '@angular/core';
import { Category } from '../categoriesadministration/category';
import { CategoryService } from '../services/category.service';
@Component({
selector: 'app-categoriestree',
templateUrl: './categoriestree.component.html',
styleUrls: ['./categoriestree.component.css'],
providers: [CategoryService]
})
export class CategoriestreeComponent implements OnInit {
categories: Category[];
errorMessage: string;
nodes = [];
/*
nodes = [
{
id: '1',
name: 'Category 1',
children: [
{ id: '2', name: 'Category 2' },
{ id: '3', name: 'Category 3' }
]
},
{
id: '4',
name: 'Category 4',
children: [
{ id: '5', name: 'Category 5' },
{
id: '6',
name: 'Category 6',
children: [
{ id: '7', name: 'Category 7' }
]
}
]
}
];
*/
constructor(private categoryService: CategoryService) {
}
ngOnInit() {
this.getCategories();
}
@Output()
categorySelected = new EventEmitter<Category>();
onCategorySelected(arg) {
console.log("Selected: ", arg);
var category: Category = arg.node.data;
this.categorySelected.next(category);
}
getCategories() {
console.log("Going to load categories...");
this.categoryService.getCategories()
.subscribe(c => {
this.categories = c;
console.log("RESPONSE: ", c);
this.nodes = c;
if (this.categories != null && this.categories.length > 0) {
// this.nodes = [];
this.categories.forEach(category => {
console.log("Geladene Category: ", category);
// let count = 1;
// this.nodes.push({'1', 'NAME'});
// count++;
});
}
});
// this.autoCompleteData.push(workbasket.name);
// categories => this.categories = heroes,
// error => this.errorMessage = <any>error);
}
}

View File

@ -1,38 +0,0 @@
<h3>Category Details of {{categorySelected?.name}} (ID: {{categorySelected?.id}})</h3>
<form class="form-horizontal">
<div class="form-group">
<label class="col-sm-2 control-label" for="name">Name</label>
<div class="col-sm-10">
<input class="form-control" id="name" placeholder="Name" [(ngModel)]="categorySelected.name" name="name">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="descrption">Description</label>
<div class="col-sm-10">
<input class="form-control" id="description" placeholder="Description" [(ngModel)]="categorySelected.description" name="description">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="owner">Owner</label>
<div class="col-sm-10">
<input class="form-control" id="owner" placeholder="Owner" [(ngModel)]="categorySelected.owner" name="owner">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="priority">Priority</label>
<div class="col-sm-10">
<input class="form-control" id="priority" placeholder="Priority" [(ngModel)]="categorySelected.priority" name="priority">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="servicelevel">Service Level</label>
<div class="col-sm-10">
<input class="form-control" id="servicelevel" placeholder="Service Level" [(ngModel)]="categorySelected.serviceLevel" name="servicelevel">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default btn-primary">Save changes</button>
</div>
</div>
</form>

View File

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

View File

@ -1,20 +0,0 @@
import { Component, OnInit, Input } from '@angular/core';
import { Category } from '../categoriesadministration/category';
@Component({
selector: 'app-categoryeditor',
templateUrl: './categoryeditor.component.html',
styleUrls: ['./categoryeditor.component.css']
})
export class CategoryeditorComponent implements OnInit {
constructor() { }
ngOnInit() {
this.categorySelected = new Category('', '', '', '', 0,'');
}
@Input()
categorySelected: Category;
}

View File

@ -1,6 +1,7 @@
export class Links {
constructor(
public rel: string,
public href: string,
public self: {'href': string},
public distributionTargets: {'href': string} = undefined,
public accessItems: {'href': string} = undefined
){}
}

View File

@ -0,0 +1,9 @@
import { Links } from "./links";
import { WorkbasketAccessItems } from "./workbasket-access-items";
export class WorkbasketAccessItemsResource {
constructor(
public _embedded: { 'accessItems': Array<WorkbasketAccessItems> } = { 'accessItems': [] },
public _links: Links = undefined
) { }
}

View File

@ -22,6 +22,6 @@ export class WorkbasketAccessItems {
public permCustom10: boolean = false,
public permCustom11: boolean = false,
public permCustom12: boolean = false,
public links: Array<Links> = undefined
public _links: Links = undefined
) { }
}

View File

@ -0,0 +1,7 @@
import { WorkbasketSummary } from './workbasket-summary';
import { Links } from './links';
export class WorkbasketSummaryResource {
constructor(public _embedded: {'workbaskets': Array<WorkbasketSummary> } = {'workbaskets': []}, public _links: Links = null) {
}
}

View File

@ -1,6 +1,6 @@
import {Links} from './links';
export class WorkbasketSummary {
export class WorkbasketSummary{
constructor(
public workbasketId: string,
public key: string,
@ -14,5 +14,6 @@ export class WorkbasketSummary {
public orgLevel2: string,
public orgLevel3: string,
public orgLevel4: string,
public links: Array<Links> = undefined){}
public _links: Links = undefined){
}
}

View File

@ -1,6 +1,5 @@
import { WorkbasketSummary } from './workbasketSummary';
import { Links } from './links';
export class Workbasket {
export class Workbasket{
constructor(
public workbasketId: string,
public created: string = undefined,
@ -18,28 +17,29 @@ export class Workbasket {
public orgLevel1: string = undefined,
public orgLevel2: string = undefined,
public orgLevel3: string = undefined,
public orgLevel4: string = undefined,
public links: Array<Links> = undefined){}
public orgLevel4: string = undefined,
public _links:Links = undefined) {
}
public static equals(org: Workbasket, comp: Workbasket): boolean {
if (org.workbasketId !== comp.workbasketId) { return false; }
if (org.created !== comp.created) { return false; }
if (org.key !== comp.key) { return false; }
if (org.domain !== comp.domain) { return false; }
if (org.type !== comp.type) { return false; }
if (org.modified !== comp.modified) { return false; }
if (org.name !== comp.name) { return false; }
if (org.description !== comp.description) { return false; }
if (org.owner !== comp.owner) { return false; }
if (org.custom1 !== comp.custom1) { return false; }
if (org.custom2 !== comp.custom2) { return false; }
if (org.custom3 !== comp.custom3) { return false; }
if (org.custom4 !== comp.custom4) { return false; }
if (org.orgLevel1 !== comp.orgLevel1) { return false; }
if (org.orgLevel2 !== comp.orgLevel2) { return false; }
if (org.orgLevel3 !== comp.orgLevel3) { return false; }
if (org.orgLevel4 !== comp.orgLevel4) { return false; }
return true;
}
public static equals(org: Workbasket, comp: Workbasket): boolean {
if (org.workbasketId !== comp.workbasketId) { return false; }
if (org.created !== comp.created) { return false; }
if (org.key !== comp.key) { return false; }
if (org.domain !== comp.domain) { return false; }
if (org.type !== comp.type) { return false; }
if (org.modified !== comp.modified) { return false; }
if (org.name !== comp.name) { return false; }
if (org.description !== comp.description) { return false; }
if (org.owner !== comp.owner) { return false; }
if (org.custom1 !== comp.custom1) { return false; }
if (org.custom2 !== comp.custom2) { return false; }
if (org.custom3 !== comp.custom3) { return false; }
if (org.custom4 !== comp.custom4) { return false; }
if (org.orgLevel1 !== comp.orgLevel1) { return false; }
if (org.orgLevel2 !== comp.orgLevel2) { return false; }
if (org.orgLevel3 !== comp.orgLevel3) { return false; }
if (org.orgLevel4 !== comp.orgLevel4) { return false; }
return true;
}
}

View File

@ -2,20 +2,20 @@ import { Pipe, PipeTransform } from '@angular/core';
@Pipe({ name: 'selectWorkbaskets' })
export class SelectWorkBasketPipe implements PipeTransform {
transform(originArray: any, arg0: any, arg1: any): Object[] {
transform(originArray: any, selectionArray: any, arg1: any): Object[] {
let returnArray = [];
if (!originArray) {
return returnArray;
}
for (let index = originArray.length - 1; index >= 0; index--) {
if ((arg1 && !arg0.some(elementToRemove => { return originArray[index].workbasketId === elementToRemove.workbasketId})) ||
!arg1 && arg0.some(elementToRemove => { return originArray[index].workbasketId === elementToRemove.workbasketId})) {
if ((arg1 && !selectionArray.some(elementToRemove => { return originArray[index].workbasketId === elementToRemove.workbasketId })) ||
!arg1 && selectionArray.some(elementToRemove => { return originArray[index].workbasketId === elementToRemove.workbasketId })) {
originArray.splice(index, 1);
}
}
returnArray = originArray;
returnArray = originArray;
return returnArray;
}
}

View File

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

View File

@ -1,44 +0,0 @@
import { Injectable } from '@angular/core';
import { RequestOptions, Headers, Http, Response } from '@angular/http';
import { environment } from '../../environments/environment';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import { Category } from '../categoriesadministration/category';
@Injectable()
export class CategoryService {
private categoryServiceUrl = environment.taskanaRestUrl + '/v1/classifications'; // URL to web API
constructor(private http: Http) { }
getCategories(): Observable<Category[]> {
return this.http.get(this.categoryServiceUrl, this.createAuthorizationHeader())
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
let body = res.json();
console.log("Body: ", body);
return body;
}
private handleError(error: Response | any) {
// In a real world app, you might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
private createAuthorizationHeader() {
let headers: Headers = new Headers();
headers.append("Authorization", "Basic dXNlcl8xXzE6dXNlcl8xXzE=");
return new RequestOptions({ headers: headers });
}
}

View File

@ -1,12 +1,15 @@
import { Injectable } from '@angular/core';
import { HttpClientModule, HttpClient, HttpHeaders, HttpResponse, HttpErrorResponse } from '@angular/common/http';
import { WorkbasketSummary } from '../model/workbasketSummary';
import { WorkbasketSummary } from '../model/workbasket-summary';
import { Workbasket } from '../model/workbasket';
import { WorkbasketAccessItems } from '../model/workbasket-access-items';
import { environment } from '../../environments/environment';
import { Direction } from '../shared/sort/sort.component';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
import { map } from 'rxjs/operator/map';
import { WorkbasketSummaryResource } from '../model/workbasket-summary-resource';
import { WorkbasketAccessItemsResource } from '../model/workbasket-access-items-resource';
@Injectable()
export class WorkbasketService {
@ -35,12 +38,12 @@ export class WorkbasketService {
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Content-Type': 'application/hal+json',
'Authorization': 'Basic VEVBTUxFQURfMTpURUFNTEVBRF8x'
})
};
private workbasketSummaryRef: Observable<WorkbasketSummary[]>;
private workbasketSummaryRef: Observable<WorkbasketSummaryResource>;
//#region "REST calls"
// GET
@ -55,11 +58,11 @@ export class WorkbasketService {
type: string = undefined,
key: string = undefined,
keyLike: string = undefined,
requiredPermission: string = undefined): Observable<WorkbasketSummary[]> {
requiredPermission: string = undefined): Observable<WorkbasketSummaryResource> {
if (this.workbasketSummaryRef && !forceRequest) {
return this.workbasketSummaryRef;
}
return this.httpClient.get<WorkbasketSummary[]>(`${environment.taskanaRestUrl}/v1/workbaskets/${this.getWorkbasketSummaryQueryParameters(sortBy, order, name,
return this.workbasketSummaryRef = this.httpClient.get<WorkbasketSummaryResource>(`${environment.taskanaRestUrl}/v1/workbaskets/${this.getWorkbasketSummaryQueryParameters(sortBy, order, name,
nameLike, descLike, owner, ownerLike, type, key, keyLike, requiredPermission)}`, this.httpOptions);
}
@ -79,16 +82,16 @@ export class WorkbasketService {
.catch(this.handleError);
}
// DELETE
deleteWorkbasket(id: string) {
return this.httpClient.delete(environment.taskanaRestUrl + '/v1/workbaskets/' + id, this.httpOptions);
deleteWorkbasket(url: string) {
return this.httpClient.delete(url, this.httpOptions);
}
// GET
getWorkBasketAccessItems(id: String): Observable<WorkbasketAccessItems[]> {
return this.httpClient.get<WorkbasketAccessItems[]>(environment.taskanaRestUrl + '/v1/workbaskets/' + id + '/workbasketAccessItems', this.httpOptions);
getWorkBasketAccessItems(url: string): Observable<WorkbasketAccessItemsResource> {
return this.httpClient.get<WorkbasketAccessItemsResource>(url, this.httpOptions);
}
// POST
createWorkBasketAccessItem(workbasketAccessItem: WorkbasketAccessItems): Observable<WorkbasketAccessItems> {
return this.httpClient.post<WorkbasketAccessItems>(environment.taskanaRestUrl + '/v1/workbaskets/workbasketAccessItems', workbasketAccessItem, this.httpOptions);
createWorkBasketAccessItem(url: string, workbasketAccessItem: WorkbasketAccessItems): Observable<WorkbasketAccessItems> {
return this.httpClient.post<WorkbasketAccessItems>(url , workbasketAccessItem, this.httpOptions);
}
// PUT
updateWorkBasketAccessItem(url: string, workbasketAccessItem: Array<WorkbasketAccessItems>): Observable<string> {
@ -97,75 +100,75 @@ export class WorkbasketService {
this.httpOptions);
}
// GET
getWorkBasketsDistributionTargets(id: String): Observable<WorkbasketSummary[]> {
return this.httpClient.get<WorkbasketSummary[]>(environment.taskanaRestUrl + '/v1/workbaskets/' + id + '/distributiontargets', this.httpOptions);
getWorkBasketsDistributionTargets(url: string): Observable<WorkbasketSummaryResource> {
return this.httpClient.get<WorkbasketSummaryResource>(url, this.httpOptions);
}
//#endregion
//#region "Service extras"
selectWorkBasket(id: string) {
this.workBasketSelected.next(id);
}
//#endregion
getSelectedWorkBasket(): Observable < string > {
return this.workBasketSelected.asObservable();
}
//#region "Service extras"
selectWorkBasket(id: string) {
this.workBasketSelected.next(id);
}
triggerWorkBasketSaved() {
this.workBasketSaved.next(Date.now());
}
getSelectedWorkBasket(): Observable<string> {
return this.workBasketSelected.asObservable();
}
workbasketSavedTriggered(): Observable < number > {
return this.workBasketSaved.asObservable();
}
triggerWorkBasketSaved() {
this.workBasketSaved.next(Date.now());
}
workbasketSavedTriggered(): Observable<number> {
return this.workBasketSaved.asObservable();
}
//#endregion
//#region private
private getWorkbasketSummaryQueryParameters(sortBy: string,
order: string,
name: string,
nameLike: string,
descLike: string,
owner: string,
ownerLike: string,
type: string,
key: string,
keyLike: string,
requiredPermission: string): string {
let query: string = '?';
query += sortBy ? `${this.SORTBY}=${sortBy}&` : '';
query += order ? `${this.ORDER}=${order}&` : '';
query += name ? `${this.NAME}=${name}&` : '';
query += nameLike ? `${this.NAMELIKE}=${nameLike}&` : '';
query += descLike ? `${this.DESCLIKE}=${descLike}&` : '';
query += owner ? `${this.OWNER}=${owner}&` : '';
query += ownerLike ? `${this.OWNERLIKE}=${ownerLike}&` : '';
query += type ? `${this.TYPE}=${type}&` : '';
query += key ? `${this.KEY}=${key}&` : '';
query += keyLike ? `${this.KEYLIKE}=${keyLike}&` : '';
query += requiredPermission ? `${this.REQUIREDPERMISSION}=${requiredPermission}&` : '';
order: string,
name: string,
nameLike: string,
descLike: string,
owner: string,
ownerLike: string,
type: string,
key: string,
keyLike: string,
requiredPermission: string): string {
let query: string = '?';
query += sortBy ? `${this.SORTBY}=${sortBy}&` : '';
query += order ? `${this.ORDER}=${order}&` : '';
query += name ? `${this.NAME}=${name}&` : '';
query += nameLike ? `${this.NAMELIKE}=${nameLike}&` : '';
query += descLike ? `${this.DESCLIKE}=${descLike}&` : '';
query += owner ? `${this.OWNER}=${owner}&` : '';
query += ownerLike ? `${this.OWNERLIKE}=${ownerLike}&` : '';
query += type ? `${this.TYPE}=${type}&` : '';
query += key ? `${this.KEY}=${key}&` : '';
query += keyLike ? `${this.KEYLIKE}=${keyLike}&` : '';
query += requiredPermission ? `${this.REQUIREDPERMISSION}=${requiredPermission}&` : '';
if (query.lastIndexOf('&') === query.length - 1) {
query = query.slice(0, query.lastIndexOf('&'))
if (query.lastIndexOf('&') === query.length - 1) {
query = query.slice(0, query.lastIndexOf('&'))
}
return query;
}
return query;
}
private handleError(error: Response | any) {
// In a real world app, you might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
// In a real world app, you might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
console.error(errMsg);
return Observable.throw(errMsg);
}
//#endregion
}

View File

@ -13,7 +13,7 @@ export class SpinnerComponent {
isDelayedRunning: boolean = false;
@Input()
delay: number = 300;
delay: number = 100;
@Input()
set isRunning(value: boolean) {

View File

@ -1,11 +0,0 @@
import { Links} from '../../model/links';
export class Utils {
static getSelfRef(links: Array<Links>) {
return links.find(l => l.rel === 'self');
}
static getTagLinkRef(links: Array<Links>, tag: string) {
return links.find(l => l.rel === tag );
}
}

View File

@ -12,6 +12,7 @@ import { Links } from '../../../model/links';
import { Observable } from 'rxjs/Observable';
import { AccessItemsComponent } from './access-items.component';
import { WorkbasketAccessItems } from '../../../model/workbasket-access-items';
import { WorkbasketAccessItemsResource } from '../../../model/workbasket-access-items-resource';
describe('AccessItemsComponent', () => {
let component: AccessItemsComponent;
@ -31,11 +32,14 @@ describe('AccessItemsComponent', () => {
beforeEach(() => {
fixture = TestBed.createComponent(AccessItemsComponent);
component = fixture.componentInstance;
component.workbasket = new Workbasket('1')
component.workbasket = new Workbasket('1','','','','','','','','','','','','','','','', '', new Links(undefined,undefined, {'href': 'someurl' }));
workbasketService = TestBed.get(WorkbasketService);
alertService = TestBed.get(AlertService);
spyOn(workbasketService, 'getWorkBasketAccessItems').and.returnValue(Observable.of(new Array<WorkbasketAccessItems>(new WorkbasketAccessItems('id1', '1', 'accessID1', false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, new Array<Links>(new Links('setWorkbasketAccessItems', ''))),
new WorkbasketAccessItems('id2', '1', 'accessID2'))));
spyOn(workbasketService, 'getWorkBasketAccessItems').and.returnValue(Observable.of(new WorkbasketAccessItemsResource(
{'accessItems': new Array<WorkbasketAccessItems>(
new WorkbasketAccessItems('id1', '1', 'accessID1', false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
new WorkbasketAccessItems('id2', '1', 'accessID2')) }, new Links({ 'href': 'someurl' })
)));
spyOn(workbasketService, 'updateWorkBasketAccessItem').and.returnValue(Observable.of(true)),
spyOn(alertService, 'triggerAlert').and.returnValue(Observable.of(true)),
debugElement = fixture.debugElement.nativeElement;
@ -61,23 +65,6 @@ describe('AccessItemsComponent', () => {
expect(debugElement.querySelector('#button-add-access-item')).toBeTruthy;
});
xit('should highlight modified input', () => {
expect(debugElement.querySelectorAll('#table-access-items > tbody > tr')[0].querySelectorAll('td')[5].querySelector('div').getAttribute('class')).toBeNull();
debugElement.querySelectorAll('#table-access-items > tbody > tr')[0].querySelectorAll('td')[5].querySelector('input').click();
fixture.detectChanges();
expect(debugElement.querySelectorAll('#table-access-items > tbody > tr')[0].querySelectorAll('td')[5].querySelector('div').getAttribute('class')).toBe('has-changes');
});
xit('should undo changes if undo changes button is clicked', () => {
debugElement.querySelectorAll('#table-access-items > tbody > tr')[0].querySelectorAll('td')[5].querySelector('input').click();
expect(debugElement.querySelectorAll('#table-access-items > tbody > tr')[0].querySelectorAll('td')[5].getAttribute('class')).toBe('has-changes');
expect(debugElement.querySelectorAll('#wb-information > div > div')[0].querySelectorAll('button').length).toBe(2);
debugElement.querySelectorAll('#wb-information > div > div')[0].querySelectorAll('button')[1].click();
fixture.detectChanges();
expect(debugElement.querySelectorAll('#table-access-items > tbody > tr')[0].querySelectorAll('td')[5].getAttribute('class')).toBeNull();
});
it('should remove an access item if remove button is clicked', () => {
expect(debugElement.querySelectorAll('#table-access-items > tbody > tr').length).toBe(2);
debugElement.querySelectorAll('#table-access-items > tbody > tr')[0].querySelector('td > button').click();

View File

@ -1,12 +1,12 @@
import { Component, OnInit, Input, AfterViewInit } from '@angular/core';
import { Subscription } from 'rxjs';
import { Utils } from '../../../shared/utils/utils';
import { Workbasket } from '../../../model/workbasket';
import { WorkbasketAccessItems } from '../../../model/workbasket-access-items';
import { WorkbasketService } from '../../../services/workbasket.service';
import { AlertService, AlertModel, AlertType } from '../../../services/alert.service';
import { WorkbasketAccessItemsResource } from '../../../model/workbasket-access-items-resource';
declare var $: any;
@ -20,6 +20,7 @@ export class AccessItemsComponent implements OnInit {
@Input()
workbasket: Workbasket;
accessItemsResource: WorkbasketAccessItemsResource;
accessItems: Array<WorkbasketAccessItems>;
accessItemsClone: Array<WorkbasketAccessItems>;
accessItemsResetClone: Array<WorkbasketAccessItems>;
@ -33,8 +34,9 @@ export class AccessItemsComponent implements OnInit {
constructor(private workbasketService: WorkbasketService, private alertService: AlertService) { }
ngOnInit() {
this.accessItemsubscription = this.workbasketService.getWorkBasketAccessItems(this.workbasket.workbasketId).subscribe( (accessItems: Array<WorkbasketAccessItems>) =>{
this.accessItems = accessItems;
this.accessItemsubscription = this.workbasketService.getWorkBasketAccessItems(this.workbasket._links.accessItems.href).subscribe( (accessItemsResource: WorkbasketAccessItemsResource) =>{
this.accessItemsResource = accessItemsResource;
this.accessItems = accessItemsResource._embedded.accessItems;
this.accessItemsClone = this.cloneAccessItems(this.accessItems);
this.accessItemsResetClone = this.cloneAccessItems(this.accessItems);
})
@ -59,11 +61,7 @@ export class AccessItemsComponent implements OnInit {
onSave(): boolean {
this.requestInProgress = true;
if(!this.accessItems[0].links){
return;
}
this.workbasketService.updateWorkBasketAccessItem(Utils.getTagLinkRef(this.accessItems[0].links, 'setWorkbasketAccessItems').href, this.accessItems).subscribe(response =>{
this.workbasketService.updateWorkBasketAccessItem(this.accessItemsResource._links.self.href + '/', this.accessItems).subscribe(response =>{
this.accessItemsClone = this.cloneAccessItems(this.accessItems);
this.accessItemsResetClone = this.cloneAccessItems(this.accessItems);
this.alertService.triggerAlert(new AlertModel(AlertType.SUCCESS, `Workbasket ${this.workbasket.name} Access items were saved successfully`));
@ -72,8 +70,10 @@ export class AccessItemsComponent implements OnInit {
},
error => {
this.modalErrorMessage = error.message;
this.requestInProgress = false;
return false;
})
return false;
}
setValue() { debugger; }

View File

@ -80,7 +80,7 @@
<taskana-spinner [isRunning]="requestInProgressRight" [isModal]="modalSpinner" positionClass="centered-spinner" class="centered-horizontally floating"></taskana-spinner>
<ul class="list-group dual-list-group">
<li class="list-group-item" *ngFor="let distributionTarget of distributionTargetsRight | selectWorkbaskets: distributionTargetsSelected: 1"
[class.selected]="distributionTarget.selected" type="text" (click)="distributionTarget.selected = !distributionTarget.selected">
[class.selected]="distributionTarget.select" type="text" (click)="distributionTarget.select = !distributionTarget.select">
<div class="row">
<dl class="col-xs-1">
<dt>

View File

@ -1,25 +1,70 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { AngularSvgIconModule } from 'angular-svg-icon';
import { HttpClientModule } from '@angular/common/http';
import { HttpModule, JsonpModule } from '@angular/http';
import { DistributionTargetsComponent } from './distribution-targets.component';
import { SpinnerComponent } from '../../../shared/spinner/spinner.component';
import { GeneralMessageModalComponent } from '../../../shared/general-message-modal/general-message-modal.component';
import { IconTypeComponent } from '../../../shared/type-icon/icon-type.component';
import { SelectWorkBasketPipe } from '../../../pipes/seleted-workbasket.pipe';
import { WorkbasketSummaryResource } from '../../../model/workbasket-summary-resource';
import { WorkbasketSummary } from '../../../model/workbasket-summary';
import { Links } from '../../../model/links';
import { Component } from '@angular/core';
import { WorkbasketService } from '../../../services/workbasket.service';
import { AlertService } from '../../../services/alert.service';
import { Observable } from 'rxjs/Observable';
import { Workbasket } from '../../../model/workbasket';
const workbasketSummaryResource: WorkbasketSummaryResource = new WorkbasketSummaryResource({
'workbaskets': new Array<WorkbasketSummary>(
new WorkbasketSummary("1", "key1", "NAME1", "description 1", "owner 1", "", "", "PERSONAL", "", "", "", ""),
new WorkbasketSummary("2", "key2", "NAME2", "description 2", "owner 2", "", "", "GROUP", "", "", "", ""))
}, new Links({ 'href': 'url' }));
@Component({
selector: 'taskana-filter',
template: ''
})
export class FilterComponent {
}
describe('DistributionTargetsComponent', () => {
let component: DistributionTargetsComponent;
let fixture: ComponentFixture<DistributionTargetsComponent>;
let workbasketService;
let workbasket = new Workbasket('1', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', new Links({ 'href': 'someurl' }, { 'href': 'someurl' }, { 'href': 'someurl' }));
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ DistributionTargetsComponent ]
imports: [AngularSvgIconModule, HttpClientModule, HttpModule, JsonpModule],
declarations: [DistributionTargetsComponent, SpinnerComponent, GeneralMessageModalComponent, FilterComponent, SelectWorkBasketPipe, IconTypeComponent],
providers: [WorkbasketService, AlertService]
})
.compileComponents();
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DistributionTargetsComponent);
component = fixture.componentInstance;
component.workbasket = workbasket;
workbasketService = TestBed.get(WorkbasketService);
spyOn(workbasketService, 'getWorkBasketsSummary').and.callFake(() => {
return Observable.of(new WorkbasketSummaryResource(
{ 'workbaskets': new Array<WorkbasketSummary>(new WorkbasketSummary('id1', '', '', '', '', '', '', '', '', '', '', '', new Links({ 'href': 'someurl' }))) }, new Links({ 'href': 'someurl' })))
})
spyOn(workbasketService, 'getWorkBasketsDistributionTargets').and.callFake(() => {
return Observable.of(new WorkbasketSummaryResource(
{ 'workbaskets': new Array<WorkbasketSummary>(new WorkbasketSummary('id1', '', '', '', '', '', '', '', '', '', '', '', new Links({ 'href': 'someurl' }))) }, new Links({ 'href': 'someurl' })))
})
fixture.detectChanges();
});
xit('should create', () => {
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,6 +1,6 @@
import { Component, OnInit, Input } from '@angular/core';
import { Workbasket } from '../../../model/workbasket';
import { WorkbasketSummary } from '../../../model/workbasketSummary';
import { WorkbasketSummary } from '../../../model/workbasket-summary';
import { WorkbasketAccessItems } from '../../../model/workbasket-access-items';
import { FilterModel } from '../../../shared/filter/filter.component'
@ -9,6 +9,7 @@ import { AlertService, AlertModel, AlertType } from '../../../services/alert.ser
import { Subscription } from 'rxjs';
import { element } from 'protractor';
import { WorkbasketSummaryResource } from '../../../model/workbasket-summary-resource';
@Component({
selector: 'taskana-workbaskets-distribution-targets',
@ -23,9 +24,10 @@ export class DistributionTargetsComponent implements OnInit {
distributionTargetsSubscription: Subscription;
workbasketSubscription: Subscription;
workbasketFilterSubscription: Subscription;
distributionTargetsLeft: Array<WorkbasketSummary>;
distributionTargetsRight: Array<WorkbasketSummary>;
distributionTargetsSelected: Array<WorkbasketSummary>;
distributionTargetsResource: WorkbasketSummaryResource;
distributionTargetsLeft: Array<WorkbasketSummary> = [];
distributionTargetsRight: Array<WorkbasketSummary> = [];
distributionTargetsSelected: Array<WorkbasketSummary> = [];
filterBy: FilterModel = new FilterModel();
@ -38,14 +40,15 @@ export class DistributionTargetsComponent implements OnInit {
ngOnInit() {
this.requestInProgressLeft = true;
this.requestInProgressRight = true;
this.distributionTargetsSubscription = this.workbasketService.getWorkBasketsDistributionTargets(this.workbasket.workbasketId).subscribe((distributionTargetsSelected: Array<WorkbasketSummary>) => {
this.distributionTargetsSelected = distributionTargetsSelected;
this.workbasketSubscription = this.workbasketService.getWorkBasketsSummary().subscribe((distributionTargetsAvailable: Array<WorkbasketSummary>) => {
this.distributionTargetsLeft = distributionTargetsAvailable;
this.distributionTargetsRight = Object.assign([], distributionTargetsAvailable);
this.requestInProgressLeft = false;
this.requestInProgressRight = false;
});
this.distributionTargetsSubscription = this.workbasketService.getWorkBasketsDistributionTargets(this.workbasket._links.distributionTargets.href).subscribe((distributionTargetsSelectedResource: WorkbasketSummaryResource) => {
this.distributionTargetsSelected = distributionTargetsSelectedResource._embedded ? distributionTargetsSelectedResource._embedded.workbaskets :[];
this.workbasketSubscription = this.workbasketService.getWorkBasketsSummary().subscribe((distributionTargetsAvailable: WorkbasketSummaryResource) => {
this.distributionTargetsResource = distributionTargetsAvailable;
this.distributionTargetsLeft = Object.assign([], distributionTargetsAvailable._embedded.workbaskets);
this.distributionTargetsRight = Object.assign([], distributionTargetsAvailable._embedded.workbaskets);
this.requestInProgressLeft = false;
this.requestInProgressRight = false;
});
})
}
@ -91,8 +94,8 @@ export class DistributionTargetsComponent implements OnInit {
listType ? this.requestInProgressRight = true : this.requestInProgressLeft = true;
this.workbasketFilterSubscription = this.workbasketService.getWorkBasketsSummary(true, undefined, undefined, undefined,
this.filterBy.name, this.filterBy.description, undefined, this.filterBy.owner,
this.filterBy.type, undefined, this.filterBy.key).subscribe(resultList => {
listType ? this.distributionTargetsRight = resultList : this.distributionTargetsLeft = resultList;
this.filterBy.type, undefined, this.filterBy.key).subscribe((resultList: WorkbasketSummaryResource) => {
listType ? this.distributionTargetsRight = resultList._embedded.workbaskets : this.distributionTargetsLeft = resultList._embedded.workbaskets;
listType ? this.requestInProgressRight = false : this.requestInProgressLeft = false;
});

View File

@ -76,7 +76,7 @@ describe('InformationComponent', () => {
it('should reset requestInProgress after saving request is done', fakeAsync(() => {
component.workbasket = new Workbasket('id', 'created', 'keyModified', 'domain', 'type', 'modified', 'name', 'description',
'owner', 'custom1', 'custom2', 'custom3', 'custom4', 'orgLevel1', 'orgLevel2',
'orgLevel3', 'orgLevel4', new Array<Links>(new Links('self', 'someUrl')));
'orgLevel3', 'orgLevel4', new Links({'href': 'someUrl'}));
spyOn(workbasketService, 'updateWorkbasket').and.returnValue(Observable.of(component.workbasket));
spyOn(workbasketService, 'triggerWorkBasketSaved').and.returnValue(Observable.of(component.workbasket));
component.onSave();
@ -89,7 +89,7 @@ describe('InformationComponent', () => {
it('should trigger triggerWorkBasketSaved method after saving request is done', () => {
component.workbasket = new Workbasket('id', 'created', 'keyModified', 'domain', 'type', 'modified', 'name', 'description',
'owner', 'custom1', 'custom2', 'custom3', 'custom4', 'orgLevel1', 'orgLevel2',
'orgLevel3', 'orgLevel4', new Array<Links>(new Links('self', 'someUrl')));
'orgLevel3', 'orgLevel4', new Links({'href': 'someUrl'}));
spyOn(workbasketService, 'updateWorkbasket').and.returnValue(Observable.of(component.workbasket));
spyOn(workbasketService, 'triggerWorkBasketSaved').and.returnValue(Observable.of(component.workbasket));
component.onSave();

View File

@ -3,7 +3,6 @@ import { Workbasket } from '../../../model/workbasket';
import { WorkbasketService } from '../../../services/workbasket.service';
import { IconTypeComponent, ICONTYPES } from '../../../shared/type-icon/icon-type.component';
import { Subscription } from 'rxjs';
import { Utils } from '../../../shared/utils/utils';
import { AlertService, AlertModel, AlertType } from '../../../services/alert.service';
import { ActivatedRoute, Params, Router, NavigationStart } from '@angular/router';
@ -49,7 +48,7 @@ export class WorkbasketInformationComponent implements OnInit {
onSave() {
this.beforeRequest();
this.workbasketSubscription = (this.workbasketService.updateWorkbasket((Utils.getSelfRef(this.workbasket.links).href), this.workbasket).subscribe(
this.workbasketSubscription = (this.workbasketService.updateWorkbasket(this.workbasket._links.self.href, this.workbasket).subscribe(
workbasketUpdated => {
this.afterRequest();
this.workbasket = workbasketUpdated;

View File

@ -1,5 +1,5 @@
import { Component } from '@angular/core';
import { async, ComponentFixture, TestBed, } from '@angular/core/testing';
import { async, ComponentFixture, TestBed, } from '@angular/core/testing';
import { WorkbasketDetailsComponent } from './workbasket-details.component';
import { NoAccessComponent } from '../noAccess/no-access.component';
import { WorkbasketInformationComponent } from './information/workbasket-information.component';
@ -27,11 +27,13 @@ import { FormsModule } from '@angular/forms';
import { AngularSvgIconModule } from 'angular-svg-icon';
import { HttpClientModule } from '@angular/common/http';
import { HttpModule } from '@angular/http';
import { WorkbasketSummary } from '../../model/workbasketSummary';
import { WorkbasketSummary } from '../../model/workbasket-summary';
import { WorkbasketSummaryResource } from '../../model/workbasket-summary-resource';
import { WorkbasketAccessItemsResource } from '../../model/workbasket-access-items-resource';
@Component({
selector: 'taskana-filter',
template: ''
selector: 'taskana-filter',
template: ''
})
export class FilterComponent {
@ -44,7 +46,8 @@ describe('WorkbasketDetailsComponent', () => {
let debugElement;
let masterAndDetailService;
let workbasketService;
let workbasket = new Workbasket('1', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', new Links({ 'href': 'someurl' }, { 'href': 'someurl' }, { 'href': 'someurl' }));
beforeEach(async(() => {
TestBed.configureTestingModule({
@ -64,10 +67,14 @@ describe('WorkbasketDetailsComponent', () => {
workbasketService = TestBed.get(WorkbasketService);
spyOn(masterAndDetailService, 'getShowDetail').and.callFake(() => { return Observable.of(true) })
spyOn(workbasketService, 'getSelectedWorkBasket').and.callFake(() => { return Observable.of('id1') })
spyOn(workbasketService, 'getWorkBasketsSummary').and.callFake(() => { return Observable.of(new Array<WorkbasketSummary>(new WorkbasketSummary('id1', '', '', '', '', '', '', '', '', '', '', '', new Array<Links>(new Links('self', 'someurl'))))) })
spyOn(workbasketService, 'getWorkBasket').and.callFake(() => { return Observable.of(new Workbasket('id1')) })
spyOn(workbasketService, 'getWorkBasketAccessItems').and.callFake(() => { return Observable.of(new Array<WorkbasketAccessItems>()) })
spyOn(workbasketService, 'getWorkBasketsDistributionTargets').and.callFake(() => { return Observable.of(new Array<WorkbasketSummary>()) })
spyOn(workbasketService, 'getWorkBasketsSummary').and.callFake(() => {
return Observable.of(new WorkbasketSummaryResource(
{ 'workbaskets': new Array<WorkbasketSummary>(new WorkbasketSummary('id1', '', '', '', '', '', '', '', '', '', '', '', new Links({ 'href': 'someurl' }))) }, new Links({ 'href': 'someurl' })))
})
spyOn(workbasketService, 'getWorkBasket').and.callFake(() => { return Observable.of(workbasket) })
spyOn(workbasketService, 'getWorkBasketAccessItems').and.callFake(() => { return Observable.of(new WorkbasketAccessItemsResource( {'accessItems': new Array<WorkbasketAccessItems>()}, new Links({'href': 'url'})) )})
spyOn(workbasketService, 'getWorkBasketsDistributionTargets').and.callFake(() => { return Observable.of(new WorkbasketSummaryResource( {'workbaskets': new Array<WorkbasketSummary>()}, new Links({'href': 'url'})) ) })
});
@ -88,7 +95,7 @@ describe('WorkbasketDetailsComponent', () => {
expect(component.workbasket).toBeUndefined();
expect(debugElement.querySelector('app-no-access')).toBeTruthy;
component.workbasket = new Workbasket('id1');
component.workbasket = workbasket;
fixture.detectChanges();
expect(debugElement.querySelector('app-no-access')).toBeFalsy;
@ -98,7 +105,7 @@ describe('WorkbasketDetailsComponent', () => {
it('should show back button with classes "visible-xs visible-sm hidden" when showDetail property is true', () => {
component.workbasket = new Workbasket('id1');
component.workbasket = workbasket;
component.ngOnInit();
fixture.detectChanges();
expect(debugElement.querySelector('.visible-xs.visible-sm.hidden > a').textContent).toBe('Back');

View File

@ -5,8 +5,8 @@ import { MasterAndDetailService } from '../../services/master-and-detail.service
import { ActivatedRoute, Params, Router, NavigationStart } from '@angular/router';
import { PermissionService } from '../../services/permission.service';
import { Subscription } from 'rxjs';
import { WorkbasketSummary } from '../../model/workbasketSummary';
import { Utils } from '../../shared/utils/utils';
import { WorkbasketSummary } from '../../model/workbasket-summary';
import { WorkbasketSummaryResource } from '../../model/workbasket-summary-resource';
@Component({
selector: 'workbasket-details',
@ -70,10 +70,10 @@ export class WorkbasketDetailsComponent implements OnInit {
}
private getWorkbasketInformation(workbasketIdSelected: string) {
this.service.getWorkBasketsSummary().subscribe((workbasketSummary: Array<WorkbasketSummary>) => {
let workbasketSummarySelected = this.getWorkbasketSummaryById(workbasketSummary, workbasketIdSelected);
if (workbasketSummarySelected && workbasketSummarySelected.links) {
this.workbasketSubscription = this.service.getWorkBasket(Utils.getSelfRef(workbasketSummarySelected.links).href).subscribe(workbasket => {
this.service.getWorkBasketsSummary().subscribe((workbasketSummary: WorkbasketSummaryResource) => {
let workbasketSummarySelected = this.getWorkbasketSummaryById(workbasketSummary._embedded.workbaskets, workbasketIdSelected);
if (workbasketSummarySelected && workbasketSummarySelected._links) {
this.workbasketSubscription = this.service.getWorkBasket(workbasketSummarySelected._links.self.href).subscribe(workbasket => {
this.workbasket = workbasket;
this.requestInProgress = false;
});
@ -81,7 +81,7 @@ export class WorkbasketDetailsComponent implements OnInit {
});
}
private getWorkbasketSummaryById(workbasketSummary: Array<WorkbasketSummary>, selectedId: string) {
private getWorkbasketSummaryById(workbasketSummary: Array<WorkbasketSummary>, selectedId: string): WorkbasketSummary {
return workbasketSummary.find((summary => summary.workbasketId === selectedId));
}

View File

@ -34,6 +34,7 @@
</div>
</li>
<taskana-spinner [isRunning]="requestInProgress" class="centered-horizontally"></taskana-spinner>
<li class="list-group-item" *ngFor="let workbasket of workbaskets" [class.active]="workbasket.workbasketId == selectedId"
type="text" (click)="selectWorkbasket(workbasket.workbasketId)">
<div class="row">

View File

@ -3,7 +3,7 @@ import { async, ComponentFixture, TestBed, tick, fakeAsync } from '@angular/core
import { WorkbasketListComponent } from './workbasket-list.component';
import { AngularSvgIconModule } from 'angular-svg-icon';
import { HttpClientModule } from '@angular/common/http';
import { WorkbasketSummary } from '../../model/workbasketSummary';
import { WorkbasketSummary } from '../../model/workbasket-summary';
import { WorkbasketService } from '../../services/workbasket.service';
import { HttpModule } from '@angular/http';
import { Router, Routes } from '@angular/router';
@ -15,6 +15,8 @@ import { SortComponent } from '../../shared/sort/sort.component';
import { IconTypeComponent } from '../../shared/type-icon/icon-type.component';
import { RemoveNoneTypePipe } from '../../pipes/remove-none-type';
import { MapValuesPipe } from '../../pipes/map-values.pipe';
import { WorkbasketSummaryResource } from '../../model/workbasket-summary-resource';
import { Links } from '../../model/links';
@Component({
@ -33,9 +35,11 @@ export class FilterComponent {
}
const workbasketSummary: WorkbasketSummary[] = [new WorkbasketSummary("1", "key1", "NAME1", "description 1", "owner 1", "", "", "PERSONAL", "", "", "", ""),
new WorkbasketSummary("2", "key2", "NAME2", "description 2", "owner 2", "", "", "GROUP", "", "", "", "")
];
const workbasketSummaryResource: WorkbasketSummaryResource = new WorkbasketSummaryResource({
'workbaskets': new Array<WorkbasketSummary>(
new WorkbasketSummary("1", "key1", "NAME1", "description 1", "owner 1", "", "", "PERSONAL", "", "", "", ""),
new WorkbasketSummary("2", "key2", "NAME2", "description 2", "owner 2", "", "", "GROUP", "", "", "", ""))
}, new Links({ 'href': 'url' }));
describe('WorkbasketListComponent', () => {
@ -67,7 +71,7 @@ describe('WorkbasketListComponent', () => {
component = fixture.componentInstance;
debugElement = fixture.debugElement.nativeElement;
workbasketService = TestBed.get(WorkbasketService);
spyOn(workbasketService, 'getWorkBasketsSummary').and.returnValue(Observable.of(workbasketSummary));
spyOn(workbasketService, 'getWorkBasketsSummary').and.returnValue(Observable.of(workbasketSummaryResource));
spyOn(workbasketService, 'getSelectedWorkBasket').and.returnValue(Observable.of('2'));
fixture.detectChanges();
@ -85,7 +89,7 @@ describe('WorkbasketListComponent', () => {
component.ngOnInit();
expect(workbasketService.getWorkBasketsSummary).toHaveBeenCalled();
workbasketService.getWorkBasketsSummary().subscribe(value => {
expect(value).toBe(workbasketSummary);
expect(value).toBe(workbasketSummaryResource);
})
});

View File

@ -1,5 +1,6 @@
import { Component, OnInit, EventEmitter } from '@angular/core';
import { WorkbasketSummary } from '../../model/workbasketSummary';
import { WorkbasketSummaryResource } from '../../model/workbasket-summary-resource';
import { WorkbasketSummary } from '../../model/workbasket-summary';
import { WorkbasketService } from '../../services/workbasket.service'
import { Subscription } from 'rxjs/Subscription';
import { FilterModel } from '../../shared/filter/filter.component'
@ -32,7 +33,7 @@ export class WorkbasketListComponent implements OnInit {
ngOnInit() {
this.requestInProgress = true;
this.workBasketSummarySubscription = this.workbasketService.getWorkBasketsSummary().subscribe(resultList => {
this.workbaskets = resultList;
this.workbaskets = resultList._embedded.workbaskets;
this.requestInProgress = false;
});
@ -79,11 +80,11 @@ export class WorkbasketListComponent implements OnInit {
private performRequest(): void {
this.requestInProgress = true;
this.workbaskets = undefined;
this.workbaskets = [];
this.workbasketServiceSubscription.add(this.workbasketService.getWorkBasketsSummary(true, this.sort.sortBy, this.sort.sortDirection, undefined,
this.filterBy.name, this.filterBy.description, undefined, this.filterBy.owner,
this.filterBy.type, undefined, this.filterBy.key).subscribe(resultList => {
this.workbaskets = resultList;
this.workbaskets = resultList._embedded? resultList._embedded.workbaskets:[];
this.requestInProgress = false;
this.unSelectWorkbasket();
}));