diff --git a/package-lock.json b/package-lock.json index 0762a70b..0aa4a2e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ngx-material-timepicker", - "version": "5.1.0", + "version": "5.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2799,6 +2799,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, + "optional": true, "requires": { "hoek": "2.x.x" }, @@ -2807,7 +2808,8 @@ "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true + "dev": true, + "optional": true } } }, @@ -3046,7 +3048,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==", - "dev": true + "dev": true, + "optional": true }, "buffer-xor": { "version": "1.0.3", @@ -5393,7 +5396,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -5414,12 +5418,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5434,17 +5440,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5561,7 +5570,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5573,6 +5583,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5587,6 +5598,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5594,12 +5606,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5618,6 +5632,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -5698,7 +5713,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5710,6 +5726,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5795,7 +5812,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -5831,6 +5849,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5850,6 +5869,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5893,12 +5913,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -6574,6 +6596,7 @@ "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", "dev": true, + "optional": true, "requires": { "httpreq": ">=0.4.22", "underscore": "~1.7.0" @@ -6583,7 +6606,8 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", - "dev": true + "dev": true, + "optional": true }, "https-browserify": { "version": "1.0.0", @@ -7141,7 +7165,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true + "dev": true, + "optional": true }, "is-redirect": { "version": "1.0.0", @@ -7811,13 +7836,15 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", - "dev": true + "dev": true, + "optional": true }, "libmime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", "dev": true, + "optional": true, "requires": { "iconv-lite": "0.4.15", "libbase64": "0.1.0", @@ -7828,7 +7855,8 @@ "version": "0.4.15", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", - "dev": true + "dev": true, + "optional": true } } }, @@ -7836,7 +7864,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", - "dev": true + "dev": true, + "optional": true }, "license-webpack-plugin": { "version": "2.1.1", @@ -8998,16 +9027,6 @@ } } }, - "ngx-material-timepicker": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/ngx-material-timepicker/-/ngx-material-timepicker-3.3.1.tgz", - "integrity": "sha512-Tm29NwIqwv6tfxaKDVY7TxUJ1AAZKW96AQHW6hb9GGlZA1TkdoiIosZ+eNjoSVjhH8o/YaIiDFAnufG24+D+1g==", - "dev": true, - "requires": { - "luxon": "^1.11.3", - "tslib": "^1.9.0" - } - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -9276,13 +9295,15 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", - "dev": true + "dev": true, + "optional": true }, "nodemailer-shared": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", "dev": true, + "optional": true, "requires": { "nodemailer-fetch": "1.6.0" } @@ -9315,7 +9336,8 @@ "version": "0.1.10", "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", - "dev": true + "dev": true, + "optional": true }, "nopt": { "version": "3.0.6", @@ -10304,7 +10326,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "dev": true, + "optional": true }, "prepend-http": { "version": "2.0.0", @@ -11917,6 +11940,7 @@ "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", "dev": true, + "optional": true, "requires": { "httpntlm": "1.6.1", "nodemailer-shared": "1.1.0" @@ -13379,6 +13403,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, + "optional": true, "requires": { "prelude-ls": "~1.1.2" } @@ -13441,7 +13466,8 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true + "dev": true, + "optional": true }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", diff --git a/src/app/material-timepicker/services/time-adapter.spec.ts b/src/app/material-timepicker/services/time-adapter.spec.ts index b7863cff..20aa1511 100755 --- a/src/app/material-timepicker/services/time-adapter.spec.ts +++ b/src/app/material-timepicker/services/time-adapter.spec.ts @@ -4,10 +4,12 @@ import { DateTime } from 'luxon'; describe('TimeAdapter', () => { + const locale_pl_PL = 'pl-PL'; describe('parseTime', () => { const locale = 'en-US'; + it('should parse from string and return as DateTime', () => { let expectedHour = 11; const expectedMinute = 0; @@ -29,6 +31,11 @@ describe('TimeAdapter', () => { expect(TimeAdapter.parseTime('11:00 pm', {locale}).minute).toBe(expectedMinute); }); + it('should parse from string for locale pl-PL and return as DateTime', () => { + expect(TimeAdapter.parseTime('00:10', {locale: locale_pl_PL}).hour).toBe(0); + expect(TimeAdapter.parseTime('00:10', {locale: locale_pl_PL}).minute).toBe(10); + }); + it('should parse time from latn to arab number', () => { const arabLocale = 'ar-AE'; const arabicTime = '١١:١١ ص'; @@ -54,6 +61,13 @@ describe('TimeAdapter', () => { expect(TimeAdapter.formatTime('12:20 am', {format})).toBe('12:20 AM'); expect(TimeAdapter.formatTime('12:20 am', {format: 33})).toBe('12:20 AM'); }); + + it('should convert provided time (en-US) to provided locale (pl-PL) in 24-hours format', () => { + const expected = '0:11'; + const actual = '00:11'; + + expect(TimeAdapter.formatTime(actual, {locale: locale_pl_PL, format: 24})).toBe(expected); + }); }); describe('isTimeAvailable', () => { @@ -131,6 +145,7 @@ describe('TimeAdapter', () => { expect(TimeAdapter.toLocaleTimeString(actual, {locale: 'ar-AE', format: 24})).toBe(expected); }); + }); describe('fromDateTimeToString', () => { diff --git a/src/app/material-timepicker/services/time-adapter.ts b/src/app/material-timepicker/services/time-adapter.ts index f78351a8..f2f11551 100755 --- a/src/app/material-timepicker/services/time-adapter.ts +++ b/src/app/material-timepicker/services/time-adapter.ts @@ -1,9 +1,9 @@ import { DateTime, DateTimeFormatOptions, LocaleOptions, NumberingSystem } from 'luxon'; import { TimeFormat } from '../models/time-format.enum'; +import { TimeOptions } from '../models/time-options.interface'; import { TimePeriod } from '../models/time-period.enum'; import { isBetween, isSameOrAfter, isSameOrBefore } from '../utils/timepicker.utils'; -import { TimeOptions } from '../models/time-options.interface'; // @dynamic export class TimeAdapter { @@ -20,13 +20,13 @@ export class TimeAdapter { } static formatTime(time: string, opts: TimeOptions): string { - const {format} = opts; + const {format, locale} = opts; - return TimeAdapter.parseTime(time, opts).setLocale(TimeAdapter.DEFAULT_LOCALE) + return TimeAdapter.parseTime(time, opts).setLocale(locale ? locale : TimeAdapter.DEFAULT_LOCALE) .toLocaleString({ ...DateTime.TIME_SIMPLE, hour12: format !== 24, - numberingSystem: TimeAdapter.DEFAULT_NUMBERING_SYSTEM + numberingSystem: TimeAdapter.DEFAULT_NUMBERING_SYSTEM, }); } @@ -44,7 +44,7 @@ export class TimeAdapter { max?: DateTime, granularity?: 'hours' | 'minutes', minutesGap?: number, - format?: number + format?: number, ): boolean { if (!time) { return; @@ -89,7 +89,7 @@ export class TimeAdapter { return time.reconfigure({ numberingSystem: TimeAdapter.DEFAULT_NUMBERING_SYSTEM, - locale: TimeAdapter.DEFAULT_LOCALE + locale: TimeAdapter.DEFAULT_LOCALE, }).toFormat(timeFormat); }