Skip to content
This repository was archived by the owner on Jun 1, 2025. It is now read-only.

Commit 547277d

Browse files
authored
Merge pull request #190 from ghiscoding/feat/date-euro-format
feat(euro): add Euro Formatters and Sorters (day/month/year)
2 parents dafc529 + cdbc43a commit 547277d

21 files changed

+406
-3
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { FieldType, FilterCondition, FilterConditionOption } from '../models/index';
2+
import { testFilterCondition } from './filterUtilities';
3+
import { mapMomentDateFormatWithFieldType } from './../services/utilities';
4+
import * as moment_ from 'moment-mini';
5+
const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670
6+
const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateEuro);
7+
8+
export const dateEuroFilterCondition: FilterCondition = (options: FilterConditionOption) => {
9+
const searchTerm = Array.isArray(options.searchTerms) && options.searchTerms[0] || '';
10+
if (searchTerm === null || searchTerm === '' || !moment(options.cellValue, FORMAT, true).isValid() || !moment(searchTerm, FORMAT, true).isValid()) {
11+
return false;
12+
}
13+
const dateCell = moment(options.cellValue, FORMAT, true);
14+
const dateSearch = moment(searchTerm, FORMAT, true);
15+
16+
// run the filter condition with date in Unix Timestamp format
17+
return testFilterCondition(options.operator || '==', parseInt(dateCell.format('X'), 10), parseInt(dateSearch.format('X'), 10));
18+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { FieldType, FilterCondition, FilterConditionOption } from '../models/index';
2+
import { testFilterCondition } from './filterUtilities';
3+
import { mapMomentDateFormatWithFieldType } from './../services/utilities';
4+
import * as moment_ from 'moment-mini';
5+
const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670
6+
const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateEuroShort);
7+
8+
export const dateEuroShortFilterCondition: FilterCondition = (options: FilterConditionOption) => {
9+
const searchTerm = Array.isArray(options.searchTerms) && options.searchTerms[0] || '';
10+
if (searchTerm === null || searchTerm === '' || !moment(options.cellValue, FORMAT, true).isValid() || !moment(searchTerm, FORMAT, true).isValid()) {
11+
return false;
12+
}
13+
const dateCell = moment(options.cellValue, FORMAT, true);
14+
const dateSearch = moment(searchTerm, FORMAT, true);
15+
16+
// run the filter condition with date in Unix Timestamp format
17+
return testFilterCondition(options.operator || '==', parseInt(dateCell.format('X'), 10), parseInt(dateSearch.format('X'), 10));
18+
};

src/app/modules/angular-slickgrid/filter-conditions/executeMappedCondition.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { booleanFilterCondition } from './booleanFilterCondition';
2+
import { dateEuroShortFilterCondition } from './dateEuroShortFilterCondition';
3+
import { dateEuroFilterCondition } from './dateEuroFilterCondition';
24
import { dateFilterCondition } from './dateFilterCondition';
35
import { dateIsoFilterCondition } from './dateIsoFilterCondition';
46
import { dateUsShortFilterCondition } from './dateUsShortFilterCondition';
@@ -29,6 +31,14 @@ export const executeMappedCondition: FilterCondition = (options: FilterCondition
2931
return dateUtcFilterCondition(options);
3032
case FieldType.dateIso:
3133
return dateIsoFilterCondition(options);
34+
// all Euro Formats (date/month/year)
35+
case FieldType.dateEuro:
36+
case FieldType.dateTimeEuro:
37+
return dateEuroFilterCondition(options);
38+
case FieldType.dateEuroShort:
39+
case FieldType.dateTimeEuroShort:
40+
return dateEuroShortFilterCondition(options);
41+
// all US Formats (month/date/year)
3242
case FieldType.dateUs:
3343
case FieldType.dateTimeUs:
3444
return dateUsFilterCondition(options);

src/app/modules/angular-slickgrid/filter-conditions/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { FilterConditionOption } from './../models/filterConditionOption.interface';
22
import { booleanFilterCondition } from './booleanFilterCondition';
3+
import { dateEuroFilterCondition } from './dateEuroFilterCondition';
4+
import { dateEuroShortFilterCondition } from './dateEuroShortFilterCondition';
35
import { dateFilterCondition } from './dateFilterCondition';
46
import { dateIsoFilterCondition } from './dateIsoFilterCondition';
57
import { dateUsFilterCondition } from './dateUsFilterCondition';
@@ -15,6 +17,8 @@ export const FilterConditions = {
1517
executeMappedCondition,
1618
booleanFilter: booleanFilterCondition,
1719
collectionSearchFilter: collectionSearchFilterCondition,
20+
dateEuroFilter: dateEuroFilterCondition,
21+
dateEuroShortFilter: dateEuroShortFilterCondition,
1822
dateFilter: dateFilterCondition,
1923
dateIsoFilter: dateIsoFilterCondition,
2024
dateUtcFilter: dateUtcFilterCondition,
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Column } from '../../models';
2+
import { dateEuroFormatter } from '../dateEuroFormatter';
3+
4+
describe('the DateEuro Formatter', () => {
5+
it('should return null when no value is provided', () => {
6+
const value = null;
7+
const result = dateEuroFormatter(0, 0, value, {} as Column, {});
8+
expect(result).toBe(null);
9+
});
10+
11+
it('should return original string when input value provided is not a valid date', () => {
12+
const value = 'TBD';
13+
const result = dateEuroFormatter(0, 0, value, {} as Column, {});
14+
expect(result).toBe('TBD');
15+
});
16+
17+
it('should return a formatted date value without time when valid date value is provided', () => {
18+
const value = new Date('2019-05-03T00:00:01');
19+
const result = dateEuroFormatter(0, 0, value, {} as Column, {});
20+
expect(result).toBe('03/05/2019');
21+
});
22+
23+
it('should return a formatted date value without time when valid date value is provided', () => {
24+
const value = new Date('2019-05-01T02:36:07');
25+
const result = dateEuroFormatter(0, 0, value, {} as Column, {});
26+
expect(result).toBe('01/05/2019');
27+
});
28+
});
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Column } from '../../models';
2+
import { dateTimeEuroAmPmFormatter } from '../dateTimeEuroAmPmFormatter';
3+
4+
describe('the DateTimeShortEuro Formatter', () => {
5+
it('should return null when no value is provided', () => {
6+
const value = null;
7+
const result = dateTimeEuroAmPmFormatter(0, 0, value, {} as Column, {});
8+
expect(result).toBe(null);
9+
});
10+
11+
it('should return original string when input value provided is not a valid date', () => {
12+
const value = 'TBD';
13+
const result = dateTimeEuroAmPmFormatter(0, 0, value, {} as Column, {});
14+
expect(result).toBe('TBD');
15+
});
16+
17+
it('should return a formatted date value in the morning when valid date value is provided', () => {
18+
const value = new Date('2019-05-01T02:36:07');
19+
const result = dateTimeEuroAmPmFormatter(0, 0, value, {} as Column, {});
20+
expect(result).toBe('01/05/2019 02:36:07 am');
21+
});
22+
23+
it('should return a formatted date value in the afternoon when valid date value is provided', () => {
24+
const value = new Date('2019-05-01T20:36:07');
25+
const result = dateTimeEuroAmPmFormatter(0, 0, value, {} as Column, {});
26+
expect(result).toBe('01/05/2019 08:36:07 pm');
27+
});
28+
});
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Column } from '../../models';
2+
import { dateTimeEuroFormatter } from '../dateTimeEuroFormatter';
3+
4+
describe('the DateTimeEuro Formatter', () => {
5+
it('should return null when no value is provided', () => {
6+
const value = null;
7+
const result = dateTimeEuroFormatter(0, 0, value, {} as Column, {});
8+
expect(result).toBe(null);
9+
});
10+
11+
it('should return original string when input value provided is not a valid date', () => {
12+
const value = 'TBD';
13+
const result = dateTimeEuroFormatter(0, 0, value, {} as Column, {});
14+
expect(result).toBe('TBD');
15+
});
16+
17+
it('should return a formatted date value in the morning when valid date value is provided', () => {
18+
const value = new Date('2019-05-01T02:36:07');
19+
const result = dateTimeEuroFormatter(0, 0, value, {} as Column, {});
20+
expect(result).toBe('01/05/2019 02:36:07');
21+
});
22+
23+
it('should return a formatted date value in the afternoon when valid date value is provided', () => {
24+
const value = new Date('2019-05-01T20:36:07');
25+
const result = dateTimeEuroFormatter(0, 0, value, {} as Column, {});
26+
expect(result).toBe('01/05/2019 20:36:07');
27+
});
28+
});
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Column } from '../../models';
2+
import { dateTimeShortEuroFormatter } from '../dateTimeShortEuroFormatter';
3+
4+
describe('the DateTimeShortEuro Formatter', () => {
5+
it('should return null when no value is provided', () => {
6+
const value = null;
7+
const result = dateTimeShortEuroFormatter(0, 0, value, {} as Column, {});
8+
expect(result).toBe(null);
9+
});
10+
11+
it('should return original string when input value provided is not a valid date', () => {
12+
const value = 'TBD';
13+
const result = dateTimeShortEuroFormatter(0, 0, value, {} as Column, {});
14+
expect(result).toBe('TBD');
15+
});
16+
17+
it('should return a formatted date value in the morning when valid date value is provided', () => {
18+
const value = new Date('2019-05-01T02:36:07');
19+
const result = dateTimeShortEuroFormatter(0, 0, value, {} as Column, {});
20+
expect(result).toBe('01/05/2019 02:36');
21+
});
22+
23+
it('should return a formatted date value in the afternoon when valid date value is provided', () => {
24+
const value = new Date('2019-05-01T20:36:07');
25+
const result = dateTimeShortEuroFormatter(0, 0, value, {} as Column, {});
26+
expect(result).toBe('01/05/2019 20:36');
27+
});
28+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Column, FieldType, Formatter } from './../models/index';
2+
import { mapMomentDateFormatWithFieldType } from './../services/utilities';
3+
import * as moment_ from 'moment-mini';
4+
const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670
5+
const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateEuro);
6+
7+
export const dateEuroFormatter: Formatter = (row: number, cell: number, value: any, columnDef: Column, dataContext: any) => {
8+
const isDateValid = moment(value, FORMAT, false).isValid();
9+
return (value && isDateValid) ? moment(value).format(FORMAT) : value;
10+
};
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Column, FieldType, Formatter } from './../models/index';
2+
import { mapMomentDateFormatWithFieldType } from './../services/utilities';
3+
import * as moment_ from 'moment-mini';
4+
const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670
5+
const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateTimeEuroAmPm);
6+
7+
export const dateTimeEuroAmPmFormatter: Formatter = (row: number, cell: number, value: any, columnDef: Column, dataContext: any) => {
8+
const isDateValid = moment(value, FORMAT, false).isValid();
9+
return (value && isDateValid) ? moment(value).format(FORMAT) : value;
10+
};
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Column, FieldType, Formatter } from './../models/index';
2+
import { mapMomentDateFormatWithFieldType } from './../services/utilities';
3+
import * as moment_ from 'moment-mini';
4+
const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670
5+
const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateTimeEuro);
6+
7+
export const dateTimeEuroFormatter: Formatter = (row: number, cell: number, value: any, columnDef: Column, dataContext: any) => {
8+
const isDateValid = moment(value, FORMAT, false).isValid();
9+
return (value && isDateValid) ? moment(value).format(FORMAT) : value;
10+
};
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Column, FieldType, Formatter } from './../models/index';
2+
import { mapMomentDateFormatWithFieldType } from './../services/utilities';
3+
import * as moment_ from 'moment-mini';
4+
const moment = moment_; // patch to fix rollup "moment has no default export" issue, document here https://github.com/rollup/rollup/issues/670
5+
const FORMAT = mapMomentDateFormatWithFieldType(FieldType.dateTimeShortEuro);
6+
7+
export const dateTimeShortEuroFormatter: Formatter = (row: number, cell: number, value: any, columnDef: Column, dataContext: any) => {
8+
const isDateValid = moment(value, FORMAT, false).isValid();
9+
return (value && isDateValid) ? moment(value).format(FORMAT) : value;
10+
};

src/app/modules/angular-slickgrid/formatters/index.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@ import { checkmarkFormatter } from './checkmarkFormatter';
66
import { collectionFormatter } from './collectionFormatter';
77
import { collectionEditorFormatter } from './collectionEditorFormatter';
88
import { complexObjectFormatter } from './complexObjectFormatter';
9+
import { dateEuroFormatter } from './dateEuroFormatter';
910
import { dateIsoFormatter } from './dateIsoFormatter';
11+
import { dateTimeEuroAmPmFormatter } from './dateTimeEuroAmPmFormatter';
12+
import { dateTimeEuroFormatter } from './dateTimeEuroFormatter';
1013
import { dateTimeIsoFormatter } from './dateTimeIsoFormatter';
1114
import { dateTimeIsoAmPmFormatter } from './dateTimeIsoAmPmFormatter';
1215
import { dateTimeUsAmPmFormatter } from './dateTimeUsAmPmFormatter';
1316
import { dateTimeUsFormatter } from './dateTimeUsFormatter';
17+
import { dateTimeShortEuroFormatter } from './dateTimeShortEuroFormatter';
1418
import { dateTimeShortIsoFormatter } from './dateTimeShortIsoFormatter';
1519
import { dateTimeShortUsFormatter } from './dateTimeShortUsFormatter';
1620
import { dateUsFormatter } from './dateUsFormatter';
@@ -99,6 +103,18 @@ export const Formatters = {
99103
/** Takes a Date object and displays it as an ISO Date+Time+(am/pm) format */
100104
dateTimeIsoAmPm: dateTimeIsoAmPmFormatter,
101105

106+
/** Takes a Date object and displays it as an Euro Date format */
107+
dateEuro: dateEuroFormatter,
108+
109+
/** Takes a Date object and displays it as an Euro Date+Time format */
110+
dateTimeEuro: dateTimeEuroFormatter,
111+
112+
/** Takes a Date object and displays it as an Euro Date+Time (without seconds) format */
113+
dateTimeShortEuro: dateTimeShortEuroFormatter,
114+
115+
/** Takes a Date object and displays it as an Euro Date+Time+(am/pm) format */
116+
dateTimeEuroAmPm: dateTimeEuroAmPmFormatter,
117+
102118
/** Takes a Date object and displays it as an US Date format */
103119
dateUs: dateUsFormatter,
104120

src/app/modules/angular-slickgrid/models/fieldType.enum.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,33 @@ export enum FieldType {
3232
/** Format: 'YYYY-MM-DD HH:mm' => 2001-01-01 14:01 */
3333
dateTimeShortIso,
3434

35+
/** Format (Euro): 'DD/MM/YYYY' => 02/28/2001 */
36+
dateEuro,
37+
38+
/** Format (Euro): 'D/M/YY' => 2/28/12 */
39+
dateEuroShort,
40+
41+
/** Format (Euro): 'DD/MM/YYYY HH:mm' => 02/28/2001 13:01 */
42+
dateTimeShortEuro,
43+
44+
/** Format (Euro): 'DD/MM/YYYY HH:mm:ss' => 02/28/2001 13:01:01 */
45+
dateTimeEuro,
46+
47+
/** Format (Euro): 'DD/MM/YYYY hh:mm:ss a' => 02/28/2001 11:01:01 pm */
48+
dateTimeEuroAmPm,
49+
50+
/** Format (Euro): 'DD/MM/YYYY hh:mm:ss A' => 02/28/2001 11:01:01 PM */
51+
dateTimeEuroAM_PM,
52+
53+
/** Format (Euro): 'D/M/YY H:m:s' => 2/28/14 14:1:2 */
54+
dateTimeEuroShort,
55+
56+
/** Format (Euro): 'D/M/YY h:m:s a' => 2/28/14 1:2:10 pm */
57+
dateTimeEuroShortAmPm,
58+
59+
/** Format (Euro): 'D/M/YY h:m:s A' => 2/28/14 14:1:1 PM */
60+
dateTimeEuroShortAM_PM,
61+
3562
/** Format: 'MM/DD/YYYY' => 02/28/2001 */
3663
dateUs,
3764

src/app/modules/angular-slickgrid/services/utilities.ts

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ export function decimalFormatted(input: number | string, minDecimal?: number, ma
154154

155155
export function formatNumber(input: number | string, minDecimal?: number, maxDecimal?: number, displayNegativeNumberWithParentheses?: boolean, symbolPrefix = '', symbolSuffix = ''): string {
156156
if (isNaN(+input)) {
157-
return input;
157+
return input as string;
158158
}
159159

160160
const calculatedValue = ((Math.round(parseFloat(input as string) * 1000000) / 1000000));
@@ -214,6 +214,32 @@ export function mapMomentDateFormatWithFieldType(fieldType: FieldType): string {
214214
case FieldType.dateTimeIsoAM_PM:
215215
map = 'YYYY-MM-DD hh:mm:ss A';
216216
break;
217+
// all Euro Formats (date/month/year)
218+
case FieldType.dateEuro:
219+
map = 'DD/MM/YYYY';
220+
break;
221+
case FieldType.dateEuroShort:
222+
map = 'D/M/YY';
223+
break;
224+
case FieldType.dateTimeEuro:
225+
map = 'DD/MM/YYYY HH:mm:ss';
226+
break;
227+
case FieldType.dateTimeShortEuro:
228+
map = 'DD/MM/YYYY HH:mm';
229+
break;
230+
case FieldType.dateTimeEuroAmPm:
231+
map = 'DD/MM/YYYY hh:mm:ss a';
232+
break;
233+
case FieldType.dateTimeEuroAM_PM:
234+
map = 'DD/MM/YYYY hh:mm:ss A';
235+
break;
236+
case FieldType.dateTimeEuroShort:
237+
map = 'D/M/YY H:m:s';
238+
break;
239+
case FieldType.dateTimeEuroShortAmPm:
240+
map = 'D/M/YY h:m:s a';
241+
break;
242+
// all US Formats (month/date/year)
217243
case FieldType.dateUs:
218244
map = 'MM/DD/YYYY';
219245
break;
@@ -293,6 +319,32 @@ export function mapFlatpickrDateFormatWithFieldType(fieldType: FieldType): strin
293319
case FieldType.dateTimeIsoAM_PM:
294320
map = 'Y-m-d h:i:S K';
295321
break;
322+
// all Euro Formats (date/month/year)
323+
case FieldType.dateEuro:
324+
map = 'd/m/Y';
325+
break;
326+
case FieldType.dateEuroShort:
327+
map = 'd/m/y';
328+
break;
329+
case FieldType.dateTimeEuro:
330+
map = 'd/m/Y H:i:S';
331+
break;
332+
case FieldType.dateTimeShortEuro:
333+
map = 'd/m/y H:i';
334+
break;
335+
case FieldType.dateTimeEuroAmPm:
336+
map = 'd/m/Y h:i:S K'; // there is no lowercase in Flatpickr :(
337+
break;
338+
case FieldType.dateTimeEuroAM_PM:
339+
map = 'd/m/Y h:i:s K';
340+
break;
341+
case FieldType.dateTimeEuroShort:
342+
map = 'd/m/y H:i:s';
343+
break;
344+
case FieldType.dateTimeEuroShortAmPm:
345+
map = 'd/m/y h:i:s K'; // there is no lowercase in Flatpickr :(
346+
break;
347+
// all US Formats (month/date/year)
296348
case FieldType.dateUs:
297349
map = 'm/d/Y';
298350
break;
@@ -412,6 +464,14 @@ export function mapOperatorByFieldType(fieldType: FieldType | string): OperatorT
412464
case FieldType.dateTimeIso:
413465
case FieldType.dateTimeIsoAmPm:
414466
case FieldType.dateTimeIsoAM_PM:
467+
case FieldType.dateEuro:
468+
case FieldType.dateEuroShort:
469+
case FieldType.dateTimeEuro:
470+
case FieldType.dateTimeEuroAmPm:
471+
case FieldType.dateTimeEuroAM_PM:
472+
case FieldType.dateTimeEuroShort:
473+
case FieldType.dateTimeEuroShortAmPm:
474+
case FieldType.dateTimeEuroShortAM_PM:
415475
case FieldType.dateUs:
416476
case FieldType.dateUsShort:
417477
case FieldType.dateTimeUs:

0 commit comments

Comments
 (0)