From a5049090c43fe45f85e6691b60ef95022ca8736a Mon Sep 17 00:00:00 2001 From: thediaval Date: Thu, 10 Oct 2019 14:09:06 +0300 Subject: [PATCH 1/4] test(core): add table-sort directive test --- .../packages/core/src/lib/tests/table-sort.directive.spec.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts diff --git a/npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts new file mode 100644 index 0000000000..e69de29bb2 From 624e3b231179e4bb4b131d4de390c3a5143bd1af Mon Sep 17 00:00:00 2001 From: thediaval Date: Thu, 10 Oct 2019 14:46:35 +0300 Subject: [PATCH 2/4] test(core): add new test to table-directive.spec --- .../lib/directives/table-sort.directive.ts | 4 ++- .../lib/tests/table-sort.directive.spec.ts | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/directives/table-sort.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/table-sort.directive.ts index 707f2ab6ef..77e9bc10e8 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/table-sort.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/table-sort.directive.ts @@ -1,6 +1,8 @@ import { Directive, Input, Optional, Self, SimpleChanges, OnChanges } from '@angular/core'; import { Table } from 'primeng/table'; import { SortPipe, SortOrder } from '../pipes/sort.pipe'; +import { timer } from 'rxjs'; +import clone from 'just-clone'; export interface TableSortOptions { key: string; @@ -23,7 +25,7 @@ export class TableSortDirective implements OnChanges { ngOnChanges({ value, abpTableSort }: SimpleChanges) { if (value || abpTableSort) { this.abpTableSort = this.abpTableSort || ({} as TableSortOptions); - this.table.value = this.sortPipe.transform(this.value, this.abpTableSort.order, this.abpTableSort.key); + this.table.value = this.sortPipe.transform(clone(this.value), this.abpTableSort.order, this.abpTableSort.key); } } } diff --git a/npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts index e69de29bb2..c705735f03 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts @@ -0,0 +1,27 @@ +import { SpectatorDirective, createDirectiveFactory, SpyObject } from '@ngneat/spectator/jest'; +import { TableSortDirective } from '../directives/table-sort.directive'; +import { TableModule, Table } from 'primeng/table'; + +describe('TableSortDirective', () => { + let spectator: SpectatorDirective; + let directive: TableSortDirective; + const createDirective = createDirectiveFactory({ + directive: TableSortDirective, + imports: [TableModule], + }); + + beforeEach(() => { + spectator = createDirective(``); + directive = spectator.directive; + }); + + test('should be created', () => { + expect(directive).toBeTruthy(); + }); + + test('should change table value', () => { + expect(directive.value).toEqual([1, 4, 2]); + const table = spectator.query(Table); + expect(table.value).toEqual([1, 2, 4]); + }); +}); From 3154baeba7f97df76ea57cdb4b67e21c58872dca Mon Sep 17 00:00:00 2001 From: thediaval Date: Fri, 11 Oct 2019 16:05:54 +0300 Subject: [PATCH 3/4] test(core): add sort.pipe.spec --- .../lib/directives/table-sort.directive.ts | 6 ---- .../packages/core/src/lib/pipes/sort.pipe.ts | 26 ++++++++-------- .../core/src/lib/tests/sort.pipe.spec.ts | 30 +++++++++++++++++++ .../lib/tests/table-sort.directive.spec.ts | 2 +- 4 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/sort.pipe.spec.ts diff --git a/npm/ng-packs/packages/core/src/lib/directives/table-sort.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/table-sort.directive.ts index 77e9bc10e8..e9a58fe589 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/table-sort.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/table-sort.directive.ts @@ -1,14 +1,11 @@ import { Directive, Input, Optional, Self, SimpleChanges, OnChanges } from '@angular/core'; import { Table } from 'primeng/table'; import { SortPipe, SortOrder } from '../pipes/sort.pipe'; -import { timer } from 'rxjs'; import clone from 'just-clone'; - export interface TableSortOptions { key: string; order: SortOrder; } - @Directive({ selector: '[abpTableSort]', providers: [SortPipe], @@ -16,12 +13,9 @@ export interface TableSortOptions { export class TableSortDirective implements OnChanges { @Input() abpTableSort: TableSortOptions; - @Input() value: any[] = []; - constructor(@Optional() @Self() private table: Table, private sortPipe: SortPipe) {} - ngOnChanges({ value, abpTableSort }: SimpleChanges) { if (value || abpTableSort) { this.abpTableSort = this.abpTableSort || ({} as TableSortOptions); diff --git a/npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts b/npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts index d31d4903c6..9e7b5a0d10 100644 --- a/npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts +++ b/npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts @@ -1,29 +1,27 @@ -import { Pipe, PipeTransform, Injectable } from '@angular/core'; -import clone from 'just-clone'; - +import { Injectable, Pipe, PipeTransform } from '@angular/core'; export type SortOrder = 'asc' | 'desc'; - @Injectable() @Pipe({ name: 'abpSort', }) export class SortPipe implements PipeTransform { - intialValue: any[]; - transform(value: any[], sortOrder: SortOrder | string = 'asc', sortKey?: string): any { sortOrder = sortOrder && (sortOrder.toLowerCase() as any); - - if (!this.intialValue) this.intialValue = clone(value); - - if (!value || (sortOrder !== 'asc' && sortOrder !== 'desc')) return this.intialValue; - + if (!value || (sortOrder !== 'asc' && sortOrder !== 'desc')) return value; let sorted; if (!sortKey) { - sorted = value.sort(); + const numberArray = []; + const stringArray = []; + value.forEach(item => (typeof item === 'number' ? numberArray.push(item) : stringArray.push(item))); + sorted = numberArray.sort().concat(stringArray.sort()); } else { - sorted = value.sort((a, b) => (a[sortKey] < b[sortKey] ? -1 : a[sortKey] > b[sortKey] ? 1 : 0)); + sorted = value.sort((a, b) => { + return ( + Number(typeof b[sortKey] === 'number') - Number(typeof a[sortKey] === 'number') || + (a[sortKey] < b[sortKey] ? -1 : 1) + ); + }); } - return sortOrder === 'asc' ? sorted : sorted.reverse(); } } diff --git a/npm/ng-packs/packages/core/src/lib/tests/sort.pipe.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/sort.pipe.spec.ts new file mode 100644 index 0000000000..6b88961728 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/sort.pipe.spec.ts @@ -0,0 +1,30 @@ +import { createServiceFactory, SpectatorService } from '@ngneat/spectator'; +import { SortPipe } from '../pipes/sort.pipe'; + +describe('SortPipe', () => { + let pipe: SortPipe; + let spectator: SpectatorService; + const createService = createServiceFactory(SortPipe); + + beforeEach(() => { + spectator = createService(); + pipe = spectator.service; + }); + + test('should sort array in ascending and descending orders', () => { + expect(pipe.transform([5, 'b', 1, 'a'], 'asc')).toEqual([1, 5, 'a', 'b']); + expect(pipe.transform([5, 'b', 1, 'a'], 'desc')).toEqual(['b', 'a', 5, 1]); + }); + + test('should sort object array in given order with given key', () => { + const array = [{ key: 5 }, { key: 'b' }, { key: 1 }, { key: 'a' }]; + + expect(pipe.transform(array, 'asc', 'key')).toEqual([{ key: 1 }, { key: 5 }, { key: 'a' }, { key: 'b' }]); + expect(pipe.transform(array, 'desc', 'key')).toEqual([{ key: 'b' }, { key: 'a' }, { key: 5 }, { key: 1 }]); + }); + + test('should require an array as value', () => { + expect(pipe.transform(null, 'asc')).toBeFalsy(); + expect(pipe.transform(undefined, 'desc')).toBeFalsy(); + }); +}); diff --git a/npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts index c705735f03..6a9401217e 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts @@ -1,4 +1,4 @@ -import { SpectatorDirective, createDirectiveFactory, SpyObject } from '@ngneat/spectator/jest'; +import { SpectatorDirective, createDirectiveFactory } from '@ngneat/spectator/jest'; import { TableSortDirective } from '../directives/table-sort.directive'; import { TableModule, Table } from 'primeng/table'; From a4700aecc70e47aaeb15faf8a438347938d13b42 Mon Sep 17 00:00:00 2001 From: thediaval Date: Fri, 11 Oct 2019 18:06:21 +0300 Subject: [PATCH 4/4] refactor(core): refactor sort-pipe --- .../packages/core/src/lib/pipes/sort.pipe.ts | 27 +++++++++++-------- .../core/src/lib/tests/sort.pipe.spec.ts | 4 +-- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts b/npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts index 9e7b5a0d10..ea23da1efc 100644 --- a/npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts +++ b/npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts @@ -7,21 +7,26 @@ export type SortOrder = 'asc' | 'desc'; export class SortPipe implements PipeTransform { transform(value: any[], sortOrder: SortOrder | string = 'asc', sortKey?: string): any { sortOrder = sortOrder && (sortOrder.toLowerCase() as any); + if (!value || (sortOrder !== 'asc' && sortOrder !== 'desc')) return value; - let sorted; + + let numberArray = []; + let stringArray = []; + if (!sortKey) { - const numberArray = []; - const stringArray = []; - value.forEach(item => (typeof item === 'number' ? numberArray.push(item) : stringArray.push(item))); - sorted = numberArray.sort().concat(stringArray.sort()); + numberArray = value.filter(item => typeof item === 'number').sort(); + stringArray = value.filter(item => typeof item === 'string').sort(); } else { - sorted = value.sort((a, b) => { - return ( - Number(typeof b[sortKey] === 'number') - Number(typeof a[sortKey] === 'number') || - (a[sortKey] < b[sortKey] ? -1 : 1) - ); - }); + numberArray = value.filter(item => typeof item[sortKey] === 'number').sort((a, b) => a[sortKey] - b[sortKey]); + stringArray = value + .filter(item => typeof item[sortKey] === 'string') + .sort((a, b) => { + if (a[sortKey] < b[sortKey]) return -1; + else if (a[sortKey] > b[sortKey]) return 1; + else return 0; + }); } + const sorted = numberArray.concat(stringArray); return sortOrder === 'asc' ? sorted : sorted.reverse(); } } diff --git a/npm/ng-packs/packages/core/src/lib/tests/sort.pipe.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/sort.pipe.spec.ts index 6b88961728..8428515118 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/sort.pipe.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/sort.pipe.spec.ts @@ -1,4 +1,4 @@ -import { createServiceFactory, SpectatorService } from '@ngneat/spectator'; +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; import { SortPipe } from '../pipes/sort.pipe'; describe('SortPipe', () => { @@ -24,7 +24,7 @@ describe('SortPipe', () => { }); test('should require an array as value', () => { - expect(pipe.transform(null, 'asc')).toBeFalsy(); + expect(pipe.transform(null)).toBeFalsy(); expect(pipe.transform(undefined, 'desc')).toBeFalsy(); }); });