TSK-622 Add query parameters to classification list service

- Add query parameters to classification list service in order to  order by key instead of Id
This commit is contained in:
Martin Rojas Miguel Angel 2018-07-02 11:56:04 +02:00 committed by Holger Hagen
parent b1d78b5544
commit f47a3cfdd5
7 changed files with 122 additions and 102 deletions

View File

@ -66,7 +66,7 @@ export class ClassificationListComponent implements OnInit, OnDestroy {
this.classifications = [];
this.requestInProgress = true;
this.classificationTypeService.selectClassificationType(classificationTypeSelected);
this.classificationService.getClassifications(true)
this.classificationService.getClassifications()
.subscribe((classifications: Array<TreeNodeModel>) => {
this.classifications = classifications;
this.requestInProgress = false;
@ -101,7 +101,7 @@ export class ClassificationListComponent implements OnInit, OnDestroy {
this.requestInProgress = true;
this.classifications = [];
this.classificationServiceSubscription = this.classificationService.getClassifications(true)
this.classificationServiceSubscription = this.classificationService.getClassifications()
.subscribe((classifications: Array<TreeNodeModel>) => {
this.requestInProgress = false;
this.classifications = classifications;

View File

@ -1,5 +1,4 @@
import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core';
import { IconTypeComponent } from '../type-icon/icon-type.component'
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { ICONTYPES } from 'app/models/type';
import { FilterModel } from 'app/models/filter';
@ -23,7 +22,7 @@ export class FilterComponent {
toggleDropDown = false;
constructor() {
this.allTypes = new Map([['ALL', 'All'], ['PERSONAL', 'Personal'], ['GROUP', 'Group'],
this.allTypes = new Map([['', 'All'], ['PERSONAL', 'Personal'], ['GROUP', 'Group'],
['CLEARANCE', 'Clearance'], ['TOPIC', 'Topic']]);
}

View File

@ -1,29 +1,26 @@
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { environment } from 'environments/environment';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
import 'rxjs/add/observable/combineLatest';
import 'rxjs/add/operator/map'
import { Classification } from 'app/models/classification';
import { TreeNodeModel } from 'app/models/tree-node';
import { ClassificationDefinition } from 'app/models/classification-definition';
import { ClassificationResource } from 'app/models/classification-resource';
import { ClassificationTypesService } from '../classification-types/classification-types.service';
import { DomainService } from 'app/services/domain/domain.service';
import { TaskanaQueryParameters } from 'app/shared/util/query-parameters';
import { Direction } from 'app/models/sorting';
@Injectable()
export class ClassificationsService {
private url = environment.taskanaRestUrl + '/v1/classifications/';
private classificationSelected = new Subject<string>();
private classificationSaved = new Subject<number>();
private classificationTypes: Array<string>;
constructor(
private httpClient: HttpClient,
private classificationTypeService: ClassificationTypesService,
@ -31,17 +28,32 @@ export class ClassificationsService {
}
// GET
getClassifications(forceRequest = false): Observable<any> {
getClassifications(sortBy: string = TaskanaQueryParameters.KEY,
order: string = Direction.ASC,
name: string = undefined,
nameLike: string = undefined,
descLike: string = undefined,
owner: string = undefined,
ownerLike: string = undefined,
type: string = undefined,
key: string = undefined,
keyLike: string = undefined,
requiredPermission: string = undefined,
allPages: boolean = true): Observable<any> {
return this.domainService.getSelectedDomain().mergeMap(domain => {
const classificationTypes = this.classificationTypeService.getSelectedClassificationType();
this.classificationTypeService.getSelectedClassificationType();
return this.getClassificationObservable(this.httpClient.get<ClassificationResource>(
`${environment.taskanaRestUrl}/v1/classifications/?domain=${domain}`));
`${environment.taskanaRestUrl}/v1/classifications/${TaskanaQueryParameters.getQueryParameters(
sortBy, order, name,
nameLike, descLike, owner, ownerLike, type, key, keyLike, requiredPermission,
!allPages ? TaskanaQueryParameters.page : undefined, !allPages ? TaskanaQueryParameters.pageSize : undefined, domain)}`));
}).do(() => {
this.domainService.domainChangedComplete();
});
}
// GET
getClassification(id: string): Observable<ClassificationDefinition> {
return this.httpClient.get<ClassificationDefinition>(`${environment.taskanaRestUrl}/v1/classifications/${id}`)
@ -130,16 +142,5 @@ export class ClassificationsService {
}
}
}
private map2Array(map: Map<string, string>): Array<string> {
const returnArray = [];
map.forEach((entryVal, entryKey) => {
returnArray.push(entryKey);
});
return returnArray;
}
}

View File

@ -1,6 +1,6 @@
import {
Component, OnInit, EventEmitter, OnDestroy,
HostListener, ViewChild, ElementRef, AfterViewChecked, ChangeDetectorRef
Component, OnInit, OnDestroy,
ViewChild, ElementRef, ChangeDetectorRef
} from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { Subscription } from 'rxjs/Subscription';
@ -13,6 +13,7 @@ import { Orientation } from 'app/models/orientation';
import { WorkbasketService } from 'app/services/workbasket/workbasket.service'
import { OrientationService } from 'app/services/orientation/orientation.service';
import { TaskanaQueryParameters } from 'app/shared/util/query-parameters';
@Component({
selector: 'taskana-workbasket-list',
@ -74,7 +75,7 @@ export class WorkbasketListComponent implements OnInit, OnDestroy {
}
changePage(page) {
this.workbasketService.page = page;
TaskanaQueryParameters.page = page;
this.performRequest();
}
@ -84,7 +85,7 @@ export class WorkbasketListComponent implements OnInit, OnDestroy {
const unusedHeight = 145
const totalHeight = window.innerHeight;
const cards = Math.round((totalHeight - (unusedHeight + toolbarSize)) / cardHeight);
this.workbasketService.pageSize = cards;
TaskanaQueryParameters.pageSize = cards;
this.performRequest();
}

View File

@ -11,55 +11,25 @@ import { WorkbasketDistributionTargetsResource } from 'app/models/workbasket-dis
import { Direction } from 'app/models/sorting';
import { DomainService } from 'app/services/domain/domain.service';
import { RequestInProgressService } from 'app/services/requestInProgress/request-in-progress.service';
import {WorkbasketResource} from '../../models/workbasket-resource';
import { WorkbasketResource } from '../../models/workbasket-resource';
import { TaskanaQueryParameters } from 'app/shared/util/query-parameters';
@Injectable()
export class WorkbasketService {
public workBasketSelected = new Subject<string>();
public workBasketSaved = new Subject<number>();
// Sorting
readonly SORTBY = 'sort-by';
readonly ORDER = 'order';
// Filtering
readonly NAME = 'name';
readonly NAMELIKE = 'name-like';
readonly DESCLIKE = 'description-like';
readonly OWNER = 'owner';
readonly OWNERLIKE = 'owner-like';
readonly TYPE = 'type';
readonly KEY = 'key';
readonly KEYLIKE = 'key-like';
// Access
readonly REQUIREDPERMISSION = 'required-permission';
// Pagination
readonly PAGE = 'page';
readonly PAGESIZE = 'page-size';
// Domain
readonly DOMAIN = 'domain';
page = 1;
pageSize = 9;
private workbasketSummaryRef: Observable<WorkbasketSummaryResource> = new Observable();
constructor(
private httpClient: HttpClient,
private domainService: DomainService,
private requestInProgressService: RequestInProgressService
private domainService: DomainService
) { }
// #region "REST calls"
// GET
getWorkBasketsSummary(forceRequest: boolean = false,
sortBy: string = this.KEY,
sortBy: string = TaskanaQueryParameters.KEY,
order: string = Direction.ASC,
name: string = undefined,
nameLike: string = undefined,
@ -78,10 +48,10 @@ export class WorkbasketService {
return this.domainService.getSelectedDomain().mergeMap(domain => {
return this.workbasketSummaryRef = this.httpClient.get<WorkbasketSummaryResource>(
`${environment.taskanaRestUrl}/v1/workbaskets/${this.getWorkbasketSummaryQueryParameters(
`${environment.taskanaRestUrl}/v1/workbaskets/${TaskanaQueryParameters.getQueryParameters(
sortBy, order, name,
nameLike, descLike, owner, ownerLike, type, key, keyLike, requiredPermission,
!allPages ? this.page : undefined, !allPages ? this.pageSize : undefined, domain)}`)
!allPages ? TaskanaQueryParameters.page : undefined, !allPages ? TaskanaQueryParameters.pageSize : undefined, domain)}`)
.do(workbaskets => {
return workbaskets;
});
@ -95,9 +65,9 @@ export class WorkbasketService {
}
// GET
getAllWorkBaskets(): Observable<WorkbasketResource> {
return this.httpClient.get<WorkbasketResource>(`${environment.taskanaRestUrl}/v1/workbaskets?required-permission=OPEN`);
}
getAllWorkBaskets(): Observable<WorkbasketResource> {
return this.httpClient.get<WorkbasketResource>(`${environment.taskanaRestUrl}/v1/workbaskets?required-permission=OPEN`);
}
// POST
createWorkbasket(workbasket: Workbasket): Observable<Workbasket> {
@ -165,41 +135,6 @@ export class WorkbasketService {
// #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,
page: number,
pageSize: number,
domain: string): string {
let query = '?';
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}&` : '';
query += page ? `${this.PAGE}=${page}&` : '';
query += pageSize ? `${this.PAGESIZE}=${pageSize}&` : '';
query += domain !== undefined ? `${this.DOMAIN}=${domain}&` : '';
if (query.lastIndexOf('&') === query.length - 1) {
query = query.slice(0, query.lastIndexOf('&'))
}
return query;
}
private handleError(error: Response | any) {
let errMsg: string;

View File

@ -0,0 +1,19 @@
import { TaskanaQueryParameters } from './query-parameters';
import { Direction } from 'app/models/sorting';
describe('TaskanaQueryParameters', () => {
it('should create a empty query', () => {
expect(TaskanaQueryParameters.getQueryParameters()).toBe('');
});
it('should create a query separated with &', () => {
expect(TaskanaQueryParameters.getQueryParameters(TaskanaQueryParameters.KEY,
Direction.ASC).split('&').length).toBe(2);
});
it('should remove last & from query', () => {
expect(TaskanaQueryParameters.getQueryParameters(TaskanaQueryParameters.KEY,
Direction.ASC).endsWith('?')).toBeFalsy();
});
});

View File

@ -0,0 +1,65 @@
export class TaskanaQueryParameters {
// Sorting
static SORTBY = 'sort-by';
static ORDER = 'order';
// Filtering
static NAME = 'name';
static NAMELIKE = 'name-like';
static DESCLIKE = 'description-like';
static OWNER = 'owner';
static OWNERLIKE = 'owner-like';
static TYPE = 'type';
static KEY = 'key';
static KEYLIKE = 'key-like';
// Access
static REQUIREDPERMISSION = 'required-permission';
// Pagination
static PAGE = 'page';
static PAGESIZE = 'page-size';
static page = 1;
static pageSize = 9;
// Domain
static DOMAIN = 'domain';
public static getQueryParameters(sortBy: string = undefined,
order: string = undefined,
name: string = undefined,
nameLike: string = undefined,
descLike: string = undefined,
owner: string = undefined,
ownerLike: string = undefined,
type: string = undefined,
key: string = undefined,
keyLike: string = undefined,
requiredPermission: string = undefined,
page: number = undefined,
pageSize: number = undefined,
domain: string = undefined): string {
let query = '?';
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}&` : '';
query += page ? `${this.PAGE}=${page}&` : '';
query += pageSize ? `${this.PAGESIZE}=${pageSize}&` : '';
query += domain !== undefined ? `${this.DOMAIN}=${domain}&` : '';
if (query.lastIndexOf('&') === query.length - 1) {
query = query.slice(0, query.lastIndexOf('&'))
}
return query === '?' ? '' : query;
}
}