diff --git a/src/app/modules/angular-slickgrid/filter-conditions/dateEuroFilterCondition.ts b/src/app/modules/angular-slickgrid/filter-conditions/dateEuroFilterCondition.ts new file mode 100644 index 000000000..e2f6a9b57 --- /dev/null +++ b/src/app/modules/angular-slickgrid/filter-conditions/dateEuroFilterCondition.ts @@ -0,0 +1,18 @@ +import { FieldType, FilterCondition, FilterConditionOption } from '../models/index'; +import { testFilterCondition } from './filterUtilities'; +import { mapMomentDateFormatWithFieldType } from './../services/utilities'; +import * as moment_ from 'moment-mini'; +const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670 +const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateEuro); + +export const dateEuroFilterCondition: FilterCondition = (options: FilterConditionOption) => { + const searchTerm = Array.isArray(options.searchTerms) && options.searchTerms[0] || ''; + if (searchTerm === null || searchTerm === '' || !moment(options.cellValue, FORMAT, true).isValid() || !moment(searchTerm, FORMAT, true).isValid()) { + return false; + } + const dateCell = moment(options.cellValue, FORMAT, true); + const dateSearch = moment(searchTerm, FORMAT, true); + + // run the filter condition with date in Unix Timestamp format + return testFilterCondition(options.operator || '==', parseInt(dateCell.format('X'), 10), parseInt(dateSearch.format('X'), 10)); +}; diff --git a/src/app/modules/angular-slickgrid/filter-conditions/dateEuroShortFilterCondition.ts b/src/app/modules/angular-slickgrid/filter-conditions/dateEuroShortFilterCondition.ts new file mode 100644 index 000000000..34125a5fe --- /dev/null +++ b/src/app/modules/angular-slickgrid/filter-conditions/dateEuroShortFilterCondition.ts @@ -0,0 +1,18 @@ +import { FieldType, FilterCondition, FilterConditionOption } from '../models/index'; +import { testFilterCondition } from './filterUtilities'; +import { mapMomentDateFormatWithFieldType } from './../services/utilities'; +import * as moment_ from 'moment-mini'; +const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670 +const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateEuroShort); + +export const dateEuroShortFilterCondition: FilterCondition = (options: FilterConditionOption) => { + const searchTerm = Array.isArray(options.searchTerms) && options.searchTerms[0] || ''; + if (searchTerm === null || searchTerm === '' || !moment(options.cellValue, FORMAT, true).isValid() || !moment(searchTerm, FORMAT, true).isValid()) { + return false; + } + const dateCell = moment(options.cellValue, FORMAT, true); + const dateSearch = moment(searchTerm, FORMAT, true); + + // run the filter condition with date in Unix Timestamp format + return testFilterCondition(options.operator || '==', parseInt(dateCell.format('X'), 10), parseInt(dateSearch.format('X'), 10)); +}; diff --git a/src/app/modules/angular-slickgrid/filter-conditions/executeMappedCondition.ts b/src/app/modules/angular-slickgrid/filter-conditions/executeMappedCondition.ts index 62786b2e1..65dfa17d7 100644 --- a/src/app/modules/angular-slickgrid/filter-conditions/executeMappedCondition.ts +++ b/src/app/modules/angular-slickgrid/filter-conditions/executeMappedCondition.ts @@ -1,4 +1,6 @@ import { booleanFilterCondition } from './booleanFilterCondition'; +import { dateEuroShortFilterCondition } from './dateEuroShortFilterCondition'; +import { dateEuroFilterCondition } from './dateEuroFilterCondition'; import { dateFilterCondition } from './dateFilterCondition'; import { dateIsoFilterCondition } from './dateIsoFilterCondition'; import { dateUsShortFilterCondition } from './dateUsShortFilterCondition'; @@ -29,6 +31,14 @@ export const executeMappedCondition: FilterCondition = (options: FilterCondition return dateUtcFilterCondition(options); case FieldType.dateIso: return dateIsoFilterCondition(options); + // all Euro Formats (date/month/year) + case FieldType.dateEuro: + case FieldType.dateTimeEuro: + return dateEuroFilterCondition(options); + case FieldType.dateEuroShort: + case FieldType.dateTimeEuroShort: + return dateEuroShortFilterCondition(options); + // all US Formats (month/date/year) case FieldType.dateUs: case FieldType.dateTimeUs: return dateUsFilterCondition(options); diff --git a/src/app/modules/angular-slickgrid/filter-conditions/index.ts b/src/app/modules/angular-slickgrid/filter-conditions/index.ts index d6e14c5ac..54572318d 100644 --- a/src/app/modules/angular-slickgrid/filter-conditions/index.ts +++ b/src/app/modules/angular-slickgrid/filter-conditions/index.ts @@ -1,5 +1,7 @@ import { FilterConditionOption } from './../models/filterConditionOption.interface'; import { booleanFilterCondition } from './booleanFilterCondition'; +import { dateEuroFilterCondition } from './dateEuroFilterCondition'; +import { dateEuroShortFilterCondition } from './dateEuroShortFilterCondition'; import { dateFilterCondition } from './dateFilterCondition'; import { dateIsoFilterCondition } from './dateIsoFilterCondition'; import { dateUsFilterCondition } from './dateUsFilterCondition'; @@ -15,6 +17,8 @@ export const FilterConditions = { executeMappedCondition, booleanFilter: booleanFilterCondition, collectionSearchFilter: collectionSearchFilterCondition, + dateEuroFilter: dateEuroFilterCondition, + dateEuroShortFilter: dateEuroShortFilterCondition, dateFilter: dateFilterCondition, dateIsoFilter: dateIsoFilterCondition, dateUtcFilter: dateUtcFilterCondition, diff --git a/src/app/modules/angular-slickgrid/formatters/__tests__/dateEuroFormatter.spec.ts b/src/app/modules/angular-slickgrid/formatters/__tests__/dateEuroFormatter.spec.ts new file mode 100644 index 000000000..05b2203fc --- /dev/null +++ b/src/app/modules/angular-slickgrid/formatters/__tests__/dateEuroFormatter.spec.ts @@ -0,0 +1,28 @@ +import { Column } from '../../models'; +import { dateEuroFormatter } from '../dateEuroFormatter'; + +describe('the DateEuro Formatter', () => { + it('should return null when no value is provided', () => { + const value = null; + const result = dateEuroFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe(null); + }); + + it('should return original string when input value provided is not a valid date', () => { + const value = 'TBD'; + const result = dateEuroFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe('TBD'); + }); + + it('should return a formatted date value without time when valid date value is provided', () => { + const value = new Date('2019-05-03T00:00:01'); + const result = dateEuroFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe('03/05/2019'); + }); + + it('should return a formatted date value without time when valid date value is provided', () => { + const value = new Date('2019-05-01T02:36:07'); + const result = dateEuroFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe('01/05/2019'); + }); +}); diff --git a/src/app/modules/angular-slickgrid/formatters/__tests__/dateTimeEuroAmPmFormatter.spec.ts b/src/app/modules/angular-slickgrid/formatters/__tests__/dateTimeEuroAmPmFormatter.spec.ts new file mode 100644 index 000000000..83b4915ac --- /dev/null +++ b/src/app/modules/angular-slickgrid/formatters/__tests__/dateTimeEuroAmPmFormatter.spec.ts @@ -0,0 +1,28 @@ +import { Column } from '../../models'; +import { dateTimeEuroAmPmFormatter } from '../dateTimeEuroAmPmFormatter'; + +describe('the DateTimeShortEuro Formatter', () => { + it('should return null when no value is provided', () => { + const value = null; + const result = dateTimeEuroAmPmFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe(null); + }); + + it('should return original string when input value provided is not a valid date', () => { + const value = 'TBD'; + const result = dateTimeEuroAmPmFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe('TBD'); + }); + + it('should return a formatted date value in the morning when valid date value is provided', () => { + const value = new Date('2019-05-01T02:36:07'); + const result = dateTimeEuroAmPmFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe('01/05/2019 02:36:07 am'); + }); + + it('should return a formatted date value in the afternoon when valid date value is provided', () => { + const value = new Date('2019-05-01T20:36:07'); + const result = dateTimeEuroAmPmFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe('01/05/2019 08:36:07 pm'); + }); +}); diff --git a/src/app/modules/angular-slickgrid/formatters/__tests__/dateTimeEuroFormatter.spec.ts b/src/app/modules/angular-slickgrid/formatters/__tests__/dateTimeEuroFormatter.spec.ts new file mode 100644 index 000000000..0f18d9694 --- /dev/null +++ b/src/app/modules/angular-slickgrid/formatters/__tests__/dateTimeEuroFormatter.spec.ts @@ -0,0 +1,28 @@ +import { Column } from '../../models'; +import { dateTimeEuroFormatter } from '../dateTimeEuroFormatter'; + +describe('the DateTimeEuro Formatter', () => { + it('should return null when no value is provided', () => { + const value = null; + const result = dateTimeEuroFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe(null); + }); + + it('should return original string when input value provided is not a valid date', () => { + const value = 'TBD'; + const result = dateTimeEuroFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe('TBD'); + }); + + it('should return a formatted date value in the morning when valid date value is provided', () => { + const value = new Date('2019-05-01T02:36:07'); + const result = dateTimeEuroFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe('01/05/2019 02:36:07'); + }); + + it('should return a formatted date value in the afternoon when valid date value is provided', () => { + const value = new Date('2019-05-01T20:36:07'); + const result = dateTimeEuroFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe('01/05/2019 20:36:07'); + }); +}); diff --git a/src/app/modules/angular-slickgrid/formatters/__tests__/dateTimeShortEuroFormatter.spec.ts b/src/app/modules/angular-slickgrid/formatters/__tests__/dateTimeShortEuroFormatter.spec.ts new file mode 100644 index 000000000..4a51b53ab --- /dev/null +++ b/src/app/modules/angular-slickgrid/formatters/__tests__/dateTimeShortEuroFormatter.spec.ts @@ -0,0 +1,28 @@ +import { Column } from '../../models'; +import { dateTimeShortEuroFormatter } from '../dateTimeShortEuroFormatter'; + +describe('the DateTimeShortEuro Formatter', () => { + it('should return null when no value is provided', () => { + const value = null; + const result = dateTimeShortEuroFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe(null); + }); + + it('should return original string when input value provided is not a valid date', () => { + const value = 'TBD'; + const result = dateTimeShortEuroFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe('TBD'); + }); + + it('should return a formatted date value in the morning when valid date value is provided', () => { + const value = new Date('2019-05-01T02:36:07'); + const result = dateTimeShortEuroFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe('01/05/2019 02:36'); + }); + + it('should return a formatted date value in the afternoon when valid date value is provided', () => { + const value = new Date('2019-05-01T20:36:07'); + const result = dateTimeShortEuroFormatter(0, 0, value, {} as Column, {}); + expect(result).toBe('01/05/2019 20:36'); + }); +}); diff --git a/src/app/modules/angular-slickgrid/formatters/dateEuroFormatter.ts b/src/app/modules/angular-slickgrid/formatters/dateEuroFormatter.ts new file mode 100644 index 000000000..26733a22a --- /dev/null +++ b/src/app/modules/angular-slickgrid/formatters/dateEuroFormatter.ts @@ -0,0 +1,10 @@ +import { Column, FieldType, Formatter } from './../models/index'; +import { mapMomentDateFormatWithFieldType } from './../services/utilities'; +import * as moment_ from 'moment-mini'; +const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670 +const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateEuro); + +export const dateEuroFormatter: Formatter = (row: number, cell: number, value: any, columnDef: Column, dataContext: any) => { + const isDateValid = moment(value, FORMAT, false).isValid(); + return (value && isDateValid) ? moment(value).format(FORMAT) : value; +}; diff --git a/src/app/modules/angular-slickgrid/formatters/dateTimeEuroAmPmFormatter.ts b/src/app/modules/angular-slickgrid/formatters/dateTimeEuroAmPmFormatter.ts new file mode 100644 index 000000000..25d739280 --- /dev/null +++ b/src/app/modules/angular-slickgrid/formatters/dateTimeEuroAmPmFormatter.ts @@ -0,0 +1,10 @@ +import { Column, FieldType, Formatter } from './../models/index'; +import { mapMomentDateFormatWithFieldType } from './../services/utilities'; +import * as moment_ from 'moment-mini'; +const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670 +const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateTimeEuroAmPm); + +export const dateTimeEuroAmPmFormatter: Formatter = (row: number, cell: number, value: any, columnDef: Column, dataContext: any) => { + const isDateValid = moment(value, FORMAT, false).isValid(); + return (value && isDateValid) ? moment(value).format(FORMAT) : value; +}; diff --git a/src/app/modules/angular-slickgrid/formatters/dateTimeEuroFormatter.ts b/src/app/modules/angular-slickgrid/formatters/dateTimeEuroFormatter.ts new file mode 100644 index 000000000..fadd75a4d --- /dev/null +++ b/src/app/modules/angular-slickgrid/formatters/dateTimeEuroFormatter.ts @@ -0,0 +1,10 @@ +import { Column, FieldType, Formatter } from './../models/index'; +import { mapMomentDateFormatWithFieldType } from './../services/utilities'; +import * as moment_ from 'moment-mini'; +const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670 +const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateTimeEuro); + +export const dateTimeEuroFormatter: Formatter = (row: number, cell: number, value: any, columnDef: Column, dataContext: any) => { + const isDateValid = moment(value, FORMAT, false).isValid(); + return (value && isDateValid) ? moment(value).format(FORMAT) : value; +}; diff --git a/src/app/modules/angular-slickgrid/formatters/dateTimeShortEuroFormatter.ts b/src/app/modules/angular-slickgrid/formatters/dateTimeShortEuroFormatter.ts new file mode 100644 index 000000000..3fbf06c80 --- /dev/null +++ b/src/app/modules/angular-slickgrid/formatters/dateTimeShortEuroFormatter.ts @@ -0,0 +1,10 @@ +import { Column, FieldType, Formatter } from './../models/index'; +import { mapMomentDateFormatWithFieldType } from './../services/utilities'; +import * as moment_ from 'moment-mini'; +const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670 +const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateTimeShortEuro); + +export const dateTimeShortEuroFormatter: Formatter = (row: number, cell: number, value: any, columnDef: Column, dataContext: any) => { + const isDateValid = moment(value, FORMAT, false).isValid(); + return (value && isDateValid) ? moment(value).format(FORMAT) : value; +}; diff --git a/src/app/modules/angular-slickgrid/formatters/index.ts b/src/app/modules/angular-slickgrid/formatters/index.ts index eb5219c7e..c7bc5a89b 100644 --- a/src/app/modules/angular-slickgrid/formatters/index.ts +++ b/src/app/modules/angular-slickgrid/formatters/index.ts @@ -6,11 +6,15 @@ import { checkmarkFormatter } from './checkmarkFormatter'; import { collectionFormatter } from './collectionFormatter'; import { collectionEditorFormatter } from './collectionEditorFormatter'; import { complexObjectFormatter } from './complexObjectFormatter'; +import { dateEuroFormatter } from './dateEuroFormatter'; import { dateIsoFormatter } from './dateIsoFormatter'; +import { dateTimeEuroAmPmFormatter } from './dateTimeEuroAmPmFormatter'; +import { dateTimeEuroFormatter } from './dateTimeEuroFormatter'; import { dateTimeIsoFormatter } from './dateTimeIsoFormatter'; import { dateTimeIsoAmPmFormatter } from './dateTimeIsoAmPmFormatter'; import { dateTimeUsAmPmFormatter } from './dateTimeUsAmPmFormatter'; import { dateTimeUsFormatter } from './dateTimeUsFormatter'; +import { dateTimeShortEuroFormatter } from './dateTimeShortEuroFormatter'; import { dateTimeShortIsoFormatter } from './dateTimeShortIsoFormatter'; import { dateTimeShortUsFormatter } from './dateTimeShortUsFormatter'; import { dateUsFormatter } from './dateUsFormatter'; @@ -99,6 +103,18 @@ export const Formatters = { /** Takes a Date object and displays it as an ISO Date+Time+(am/pm) format */ dateTimeIsoAmPm: dateTimeIsoAmPmFormatter, + /** Takes a Date object and displays it as an Euro Date format */ + dateEuro: dateEuroFormatter, + + /** Takes a Date object and displays it as an Euro Date+Time format */ + dateTimeEuro: dateTimeEuroFormatter, + + /** Takes a Date object and displays it as an Euro Date+Time (without seconds) format */ + dateTimeShortEuro: dateTimeShortEuroFormatter, + + /** Takes a Date object and displays it as an Euro Date+Time+(am/pm) format */ + dateTimeEuroAmPm: dateTimeEuroAmPmFormatter, + /** Takes a Date object and displays it as an US Date format */ dateUs: dateUsFormatter, diff --git a/src/app/modules/angular-slickgrid/models/fieldType.enum.ts b/src/app/modules/angular-slickgrid/models/fieldType.enum.ts index 1b1a5238c..f31c870c1 100644 --- a/src/app/modules/angular-slickgrid/models/fieldType.enum.ts +++ b/src/app/modules/angular-slickgrid/models/fieldType.enum.ts @@ -32,6 +32,33 @@ export enum FieldType { /** Format: 'YYYY-MM-DD HH:mm' => 2001-01-01 14:01 */ dateTimeShortIso, + /** Format (Euro): 'DD/MM/YYYY' => 02/28/2001 */ + dateEuro, + + /** Format (Euro): 'D/M/YY' => 2/28/12 */ + dateEuroShort, + + /** Format (Euro): 'DD/MM/YYYY HH:mm' => 02/28/2001 13:01 */ + dateTimeShortEuro, + + /** Format (Euro): 'DD/MM/YYYY HH:mm:ss' => 02/28/2001 13:01:01 */ + dateTimeEuro, + + /** Format (Euro): 'DD/MM/YYYY hh:mm:ss a' => 02/28/2001 11:01:01 pm */ + dateTimeEuroAmPm, + + /** Format (Euro): 'DD/MM/YYYY hh:mm:ss A' => 02/28/2001 11:01:01 PM */ + dateTimeEuroAM_PM, + + /** Format (Euro): 'D/M/YY H:m:s' => 2/28/14 14:1:2 */ + dateTimeEuroShort, + + /** Format (Euro): 'D/M/YY h:m:s a' => 2/28/14 1:2:10 pm */ + dateTimeEuroShortAmPm, + + /** Format (Euro): 'D/M/YY h:m:s A' => 2/28/14 14:1:1 PM */ + dateTimeEuroShortAM_PM, + /** Format: 'MM/DD/YYYY' => 02/28/2001 */ dateUs, diff --git a/src/app/modules/angular-slickgrid/services/utilities.ts b/src/app/modules/angular-slickgrid/services/utilities.ts index e175346f0..35f660c99 100644 --- a/src/app/modules/angular-slickgrid/services/utilities.ts +++ b/src/app/modules/angular-slickgrid/services/utilities.ts @@ -154,7 +154,7 @@ export function decimalFormatted(input: number | string, minDecimal?: number, ma export function formatNumber(input: number | string, minDecimal?: number, maxDecimal?: number, displayNegativeNumberWithParentheses?: boolean, symbolPrefix = '', symbolSuffix = ''): string { if (isNaN(+input)) { - return input; + return input as string; } const calculatedValue = ((Math.round(parseFloat(input as string) * 1000000) / 1000000)); @@ -214,6 +214,32 @@ export function mapMomentDateFormatWithFieldType(fieldType: FieldType): string { case FieldType.dateTimeIsoAM_PM: map = 'YYYY-MM-DD hh:mm:ss A'; break; + // all Euro Formats (date/month/year) + case FieldType.dateEuro: + map = 'DD/MM/YYYY'; + break; + case FieldType.dateEuroShort: + map = 'D/M/YY'; + break; + case FieldType.dateTimeEuro: + map = 'DD/MM/YYYY HH:mm:ss'; + break; + case FieldType.dateTimeShortEuro: + map = 'DD/MM/YYYY HH:mm'; + break; + case FieldType.dateTimeEuroAmPm: + map = 'DD/MM/YYYY hh:mm:ss a'; + break; + case FieldType.dateTimeEuroAM_PM: + map = 'DD/MM/YYYY hh:mm:ss A'; + break; + case FieldType.dateTimeEuroShort: + map = 'D/M/YY H:m:s'; + break; + case FieldType.dateTimeEuroShortAmPm: + map = 'D/M/YY h:m:s a'; + break; + // all US Formats (month/date/year) case FieldType.dateUs: map = 'MM/DD/YYYY'; break; @@ -293,6 +319,32 @@ export function mapFlatpickrDateFormatWithFieldType(fieldType: FieldType): strin case FieldType.dateTimeIsoAM_PM: map = 'Y-m-d h:i:S K'; break; + // all Euro Formats (date/month/year) + case FieldType.dateEuro: + map = 'd/m/Y'; + break; + case FieldType.dateEuroShort: + map = 'd/m/y'; + break; + case FieldType.dateTimeEuro: + map = 'd/m/Y H:i:S'; + break; + case FieldType.dateTimeShortEuro: + map = 'd/m/y H:i'; + break; + case FieldType.dateTimeEuroAmPm: + map = 'd/m/Y h:i:S K'; // there is no lowercase in Flatpickr :( + break; + case FieldType.dateTimeEuroAM_PM: + map = 'd/m/Y h:i:s K'; + break; + case FieldType.dateTimeEuroShort: + map = 'd/m/y H:i:s'; + break; + case FieldType.dateTimeEuroShortAmPm: + map = 'd/m/y h:i:s K'; // there is no lowercase in Flatpickr :( + break; + // all US Formats (month/date/year) case FieldType.dateUs: map = 'm/d/Y'; break; @@ -412,6 +464,14 @@ export function mapOperatorByFieldType(fieldType: FieldType | string): OperatorT case FieldType.dateTimeIso: case FieldType.dateTimeIsoAmPm: case FieldType.dateTimeIsoAM_PM: + case FieldType.dateEuro: + case FieldType.dateEuroShort: + case FieldType.dateTimeEuro: + case FieldType.dateTimeEuroAmPm: + case FieldType.dateTimeEuroAM_PM: + case FieldType.dateTimeEuroShort: + case FieldType.dateTimeEuroShortAmPm: + case FieldType.dateTimeEuroShortAM_PM: case FieldType.dateUs: case FieldType.dateUsShort: case FieldType.dateTimeUs: diff --git a/src/app/modules/angular-slickgrid/sorters/__tests__/dateEuroShortSorter.spec.ts b/src/app/modules/angular-slickgrid/sorters/__tests__/dateEuroShortSorter.spec.ts new file mode 100644 index 000000000..8d5e13b85 --- /dev/null +++ b/src/app/modules/angular-slickgrid/sorters/__tests__/dateEuroShortSorter.spec.ts @@ -0,0 +1,33 @@ +import { SortDirectionNumber } from '../../models/sortDirectionNumber.enum'; +import { dateEuroShortSorter } from '../dateEuroShortSorter'; + +describe('the Date Euro Short Sorter', () => { + it('should return an array of Euro dates sorted ascending when only valid dates are provided', () => { + const direction = SortDirectionNumber.asc; + const inputArray = ['8/8/98', '8/10/98', '8/8/98', '01/01/18', '14/12/98']; + inputArray.sort((value1, value2) => dateEuroShortSorter(value1, value2, direction)); + expect(inputArray).toEqual(['8/8/98', '8/8/98', '8/10/98', '14/12/98', '01/01/18']); + }); + + it('should return an array of Euro dates sorted descending when only valid dates are provided', () => { + const direction = SortDirectionNumber.desc; + const inputArray = ['8/8/98', '8/10/98', null, '8/8/98', '01/01/18', '14/12/98']; + inputArray.sort((value1, value2) => dateEuroShortSorter(value1, value2, direction)); + expect(inputArray).toEqual(['01/01/18', '14/12/98', '8/10/98', '8/8/98', '8/8/98', null]); + }); + + it(`should return an array with unsorted characters showing at the beginning + then comes numbers sorted ascending when digits and chars are provided`, () => { + const direction = SortDirectionNumber.asc; + const inputArray = ['8/10/98', 'y', '8/8/98', '01/01/18', '14/12/98']; + inputArray.sort((value1, value2) => dateEuroShortSorter(value1, value2, direction)); + expect(inputArray).toEqual(['y', '8/8/98', '8/10/98', '14/12/98', '01/01/18']); + }); + + it(`should return an array with dates sorted descending showing at the beginning then characters`, () => { + const direction = SortDirectionNumber.desc; + const inputArray = ['8/10/98', null, '8/8/98', '01/01/18', '14/12/98']; + inputArray.sort((value1, value2) => dateEuroShortSorter(value1, value2, direction)); + expect(inputArray).toEqual(['01/01/18', '14/12/98', '8/10/98', '8/8/98', null]); + }); +}); diff --git a/src/app/modules/angular-slickgrid/sorters/__tests__/dateEuroSorter.spec.ts b/src/app/modules/angular-slickgrid/sorters/__tests__/dateEuroSorter.spec.ts new file mode 100644 index 000000000..d417ebb9a --- /dev/null +++ b/src/app/modules/angular-slickgrid/sorters/__tests__/dateEuroSorter.spec.ts @@ -0,0 +1,33 @@ +import { SortDirectionNumber } from '../../models/sortDirectionNumber.enum'; +import { dateEuroSorter } from '../dateEuroSorter'; + +describe('the Date Euro Sorter', () => { + it('should return an array of Euro dates sorted ascending when only valid dates are provided', () => { + const direction = SortDirectionNumber.asc; + const inputArray = ['08/08/1998', '08/10/1998', '08/08/1998', '01/01/2000', '14/12/1998']; + inputArray.sort((value1, value2) => dateEuroSorter(value1, value2, direction)); + expect(inputArray).toEqual(['08/08/1998', '08/08/1998', '08/10/1998', '14/12/1998', '01/01/2000']); + }); + + it('should return an array of Euro dates sorted descending when only valid dates are provided', () => { + const direction = SortDirectionNumber.desc; + const inputArray = ['08/08/1998', '08/10/1998', null, '08/08/1998', '01/01/2000', '14/12/1998']; + inputArray.sort((value1, value2) => dateEuroSorter(value1, value2, direction)); + expect(inputArray).toEqual(['01/01/2000', '14/12/1998', '08/10/1998', '08/08/1998', '08/08/1998', null]); + }); + + it(`should return an array with unsorted characters showing at the beginning + then comes numbers sorted ascending when digits and chars are provided`, () => { + const direction = SortDirectionNumber.asc; + const inputArray = ['08/10/1998', 'y', '08/08/1998', '01/01/2000', '14/12/1998']; + inputArray.sort((value1, value2) => dateEuroSorter(value1, value2, direction)); + expect(inputArray).toEqual(['y', '08/08/1998', '08/10/1998', '14/12/1998', '01/01/2000']); + }); + + it(`should return an array with dates sorted descending showing at the beginning then characters`, () => { + const direction = SortDirectionNumber.desc; + const inputArray = ['08/10/1998', null, '08/08/1998', '01/01/2000', '14/12/1998']; + inputArray.sort((value1, value2) => dateEuroSorter(value1, value2, direction)); + expect(inputArray).toEqual(['01/01/2000', '14/12/1998', '08/10/1998', '08/08/1998', null]); + }); +}); diff --git a/src/app/modules/angular-slickgrid/sorters/dateEuroShortSorter.ts b/src/app/modules/angular-slickgrid/sorters/dateEuroShortSorter.ts new file mode 100644 index 000000000..fee719bda --- /dev/null +++ b/src/app/modules/angular-slickgrid/sorters/dateEuroShortSorter.ts @@ -0,0 +1,8 @@ +import { mapMomentDateFormatWithFieldType } from './../services/utilities'; +import { FieldType, Sorter } from './../models/index'; +import { compareDates } from './compareDateUtility'; +const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateEuroShort); + +export const dateEuroShortSorter: Sorter = (value1, value2, sortDirection) => { + return compareDates(value1, value2, FORMAT, sortDirection, true); +}; diff --git a/src/app/modules/angular-slickgrid/sorters/dateEuroSorter.ts b/src/app/modules/angular-slickgrid/sorters/dateEuroSorter.ts new file mode 100644 index 000000000..e386e6e09 --- /dev/null +++ b/src/app/modules/angular-slickgrid/sorters/dateEuroSorter.ts @@ -0,0 +1,8 @@ +import { mapMomentDateFormatWithFieldType } from './../services/utilities'; +import { FieldType, Sorter } from './../models/index'; +import { compareDates } from './compareDateUtility'; +const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateEuro); + +export const dateEuroSorter: Sorter = (value1, value2, sortDirection) => { + return compareDates(value1, value2, FORMAT, sortDirection, true); +}; diff --git a/src/app/modules/angular-slickgrid/sorters/index.ts b/src/app/modules/angular-slickgrid/sorters/index.ts index 6081c5269..7bdb741ac 100644 --- a/src/app/modules/angular-slickgrid/sorters/index.ts +++ b/src/app/modules/angular-slickgrid/sorters/index.ts @@ -1,7 +1,9 @@ import { SortDirectionNumber } from './../models/sortDirectionNumber.enum'; -import { dateUsShortSorter } from './dateUsShortSorter'; -import { dateSorter } from './dateSorter'; +import { dateEuroShortSorter } from './dateEuroShortSorter'; +import { dateEuroSorter } from './dateEuroSorter'; import { dateIsoSorter } from './dateIsoSorter'; +import { dateSorter } from './dateSorter'; +import { dateUsShortSorter } from './dateUsShortSorter'; import { dateUsSorter } from './dateUsSorter'; import { numericSorter } from './numericSorter'; import { objectStringSorter } from './objectStringSorter'; @@ -17,6 +19,12 @@ export const Sorters = { */ dateIso: dateIsoSorter, + /** Sorter method to sort values by Date formatted as Euro date (dd/mm/yyyy) */ + dateEuro: dateEuroSorter, + + /** Sorter method to sort values by Date formatted as Euro short date (d/m/yy) */ + dateEuroShort: dateEuroShortSorter, + /** Sorter method to sort values by Date formatted as US date (mm/dd/yyyy) */ dateUs: dateUsSorter, diff --git a/src/app/modules/angular-slickgrid/sorters/sorterUtilities.ts b/src/app/modules/angular-slickgrid/sorters/sorterUtilities.ts index fd198db66..d7363d3a0 100644 --- a/src/app/modules/angular-slickgrid/sorters/sorterUtilities.ts +++ b/src/app/modules/angular-slickgrid/sorters/sorterUtilities.ts @@ -14,6 +14,14 @@ export function sortByFieldType(value1: any, value2: any, fieldType: FieldType, case FieldType.dateIso: sortResult = Sorters.dateIso(value1, value2, sortDirection); break; + // all Euro Formats (date/month/year) + case FieldType.dateEuro: + sortResult = Sorters.dateEuro(value1, value2, sortDirection); + break; + case FieldType.dateEuroShort: + sortResult = Sorters.dateEuroShort(value1, value2, sortDirection); + break; + // all US Formats (month/date/year) case FieldType.dateUs: sortResult = Sorters.dateUs(value1, value2, sortDirection); break;