From daa33737652747a27daf79d5fc7f921791d600a8 Mon Sep 17 00:00:00 2001 From: Miguel Martin Rojas Date: Mon, 2 Jul 2018 11:56:04 +0200 Subject: [PATCH] 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 --- .../list/classification-list.component.ts | 4 +- .../components/filter/filter.component.ts | 5 +- .../classifications.service.ts | 39 ++++----- .../master/list/workbasket-list.component.ts | 9 +- .../services/workbasket/workbasket.service.ts | 83 ++----------------- .../app/shared/util/query-parameters.spec.ts | 19 +++++ web/src/app/shared/util/query-parameters.ts | 65 +++++++++++++++ 7 files changed, 122 insertions(+), 102 deletions(-) create mode 100644 web/src/app/shared/util/query-parameters.spec.ts create mode 100644 web/src/app/shared/util/query-parameters.ts diff --git a/web/src/app/administration/classification/master/list/classification-list.component.ts b/web/src/app/administration/classification/master/list/classification-list.component.ts index 21b8b8e32..dbcb90451 100644 --- a/web/src/app/administration/classification/master/list/classification-list.component.ts +++ b/web/src/app/administration/classification/master/list/classification-list.component.ts @@ -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) => { 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) => { this.requestInProgress = false; this.classifications = classifications; diff --git a/web/src/app/administration/components/filter/filter.component.ts b/web/src/app/administration/components/filter/filter.component.ts index f4285a00e..e74dc52a8 100644 --- a/web/src/app/administration/components/filter/filter.component.ts +++ b/web/src/app/administration/components/filter/filter.component.ts @@ -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']]); } diff --git a/web/src/app/administration/services/classifications/classifications.service.ts b/web/src/app/administration/services/classifications/classifications.service.ts index 7a8106a26..c6b092242 100644 --- a/web/src/app/administration/services/classifications/classifications.service.ts +++ b/web/src/app/administration/services/classifications/classifications.service.ts @@ -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(); private classificationSaved = new Subject(); - private classificationTypes: Array; - constructor( private httpClient: HttpClient, private classificationTypeService: ClassificationTypesService, @@ -31,17 +28,32 @@ export class ClassificationsService { } // GET - getClassifications(forceRequest = false): Observable { + 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 { return this.domainService.getSelectedDomain().mergeMap(domain => { - const classificationTypes = this.classificationTypeService.getSelectedClassificationType(); + this.classificationTypeService.getSelectedClassificationType(); return this.getClassificationObservable(this.httpClient.get( - `${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 { return this.httpClient.get(`${environment.taskanaRestUrl}/v1/classifications/${id}`) @@ -130,16 +142,5 @@ export class ClassificationsService { } } } - - private map2Array(map: Map): Array { - const returnArray = []; - - map.forEach((entryVal, entryKey) => { - returnArray.push(entryKey); - }); - - return returnArray; - } - } diff --git a/web/src/app/administration/workbasket/master/list/workbasket-list.component.ts b/web/src/app/administration/workbasket/master/list/workbasket-list.component.ts index 6536ccec2..8b44aa12e 100644 --- a/web/src/app/administration/workbasket/master/list/workbasket-list.component.ts +++ b/web/src/app/administration/workbasket/master/list/workbasket-list.component.ts @@ -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(); } diff --git a/web/src/app/services/workbasket/workbasket.service.ts b/web/src/app/services/workbasket/workbasket.service.ts index 3060bee55..f4864c0a9 100644 --- a/web/src/app/services/workbasket/workbasket.service.ts +++ b/web/src/app/services/workbasket/workbasket.service.ts @@ -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(); public workBasketSaved = new Subject(); - - // 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 = 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( - `${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 { - return this.httpClient.get(`${environment.taskanaRestUrl}/v1/workbaskets?required-permission=OPEN`); - } + getAllWorkBaskets(): Observable { + return this.httpClient.get(`${environment.taskanaRestUrl}/v1/workbaskets?required-permission=OPEN`); + } // POST createWorkbasket(workbasket: Workbasket): Observable { @@ -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; diff --git a/web/src/app/shared/util/query-parameters.spec.ts b/web/src/app/shared/util/query-parameters.spec.ts new file mode 100644 index 000000000..000432470 --- /dev/null +++ b/web/src/app/shared/util/query-parameters.spec.ts @@ -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(); + }); +}); diff --git a/web/src/app/shared/util/query-parameters.ts b/web/src/app/shared/util/query-parameters.ts new file mode 100644 index 000000000..92e3ffcd5 --- /dev/null +++ b/web/src/app/shared/util/query-parameters.ts @@ -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; + } +}