UNPKG

@vismaux/ngx-nordic-cool

Version:
129 lines 17.1 kB
import { LOCALE_ID, Inject, Injectable } from '@angular/core'; import { formatDate } from '@angular/common'; import * as i0 from "@angular/core"; export function NC_DATEPICKER_PARSER_FORMATTER_FACTORY(localeId) { return new NcDateParserFormatterDefault(localeId); } /** * Converts between the internal `NcDateStruct` model presentation and a `string` that is displayed in the * input element. * * When user types something in the input this service attempts to parse it into a `NcDateStruct` object. * And vice versa, when users selects a date in the calendar with the mouse, it must be displayed as a `string` * in the input. * * Default implementation uses the ISO 8601 format, but you can provide another implementation via DI * to use an alternative string format or a custom parsing logic. */ export class NcDateParserFormatter { } NcDateParserFormatter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcDateParserFormatter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); NcDateParserFormatter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcDateParserFormatter, providedIn: 'root', useFactory: NC_DATEPICKER_PARSER_FORMATTER_FACTORY, deps: [{ token: LOCALE_ID }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcDateParserFormatter, decorators: [{ type: Injectable, args: [{ providedIn: 'root', useFactory: NC_DATEPICKER_PARSER_FORMATTER_FACTORY, deps: [LOCALE_ID], }] }] }); export const DATE_INPUT_FORMATS = { 'en-US': ['M/d/yy', 'M/d/yyyy', 'M.d.yy', 'M.d.yyyy', 'M-d-yy', 'M-d-yyyy'], 'en-GB': ['d/M/yy', 'd/M/yyyy', 'd.M.yy', 'd.M.yyyy', 'd-M-yy', 'd-M-yyyy'], 'da-dK': ['d.M.yy', 'd.M.yyyy', 'd/M/yy', 'd/M/yyyy', 'd-M-yy', 'd-M-yyyy'], 'fi-FI': ['d.M.yy', 'd.M.yyyy', 'd/M/yy', 'd/M/yyyy', 'd-M-yy', 'd-M-yyyy'], 'nb-NO': ['d.M.yy', 'd.M.yyyy', 'd/M/yy', 'd/M/yyyy', 'd-M-yy', 'd-M-yyyy'], 'sv-SE': [ 'yy-M-d', 'yyyy-M-d', 'yy/M/d', 'yyyy/M/d', 'yy.M.d', 'yyyy.M.d', 'yyMMdd', 'yyyyMMdd', ], }; export const DATE_OUTPUT_FORMATS = { 'en-US': 'MM/dd/yyyy', 'en-GB': 'dd/MM/yyyy', 'da-DK': 'dd.MM.yyyy', 'fi-FI': 'dd.MM.yyyy', 'nb-NO': 'dd.MM.yyyy', 'sv-SE': 'yyyy-MM-dd', }; export class NcDateParserFormatterDefault extends NcDateParserFormatter { constructor(locale) { super(); this.locale = locale; } parse(value) { let config = DATE_INPUT_FORMATS[this.locale]; if (!config) { this.printUnkownLocaleWarning(); config = DATE_INPUT_FORMATS['en-GB']; } for (const format of config) { const regexp = this.dateFormatToRegexp(format); const match = value.match(regexp); if (match) { const yearIndex = format.indexOf('y'); const monthIndex = format.indexOf('M'); const dayIndex = format.indexOf('d'); const sortedIndexes = [yearIndex, monthIndex, dayIndex].sort(); const yearGroup = sortedIndexes.indexOf(yearIndex) + 1; const monthGroup = sortedIndexes.indexOf(monthIndex) + 1; const dayGroup = sortedIndexes.indexOf(dayIndex) + 1; const year = this.addYearPadding(+match[yearGroup]); const month = +match[monthGroup]; const day = +match[dayGroup]; return { year, month, day }; } } return null; } format(date) { if (!date) { return ''; } const utcDate = new Date(Date.UTC(date.year, date.month - 1, date.day)); let format = DATE_OUTPUT_FORMATS[this.locale]; if (!format) { this.printUnkownLocaleWarning(); format = DATE_OUTPUT_FORMATS['en-GB']; } return formatDate(utcDate, format, this.locale); } dateFormatToRegexp(format) { const pattern = '^' + format // / to \/ .replace(/\//g, '\\/') // . to \. .replace(/\./g, '\\.') .replace(/(d+)/, '(\\d{1,2})') .replace(/(yyyy)/, '(\\d{4})') .replace(/(yy)/, '(\\d{2})') .replace(/(M+)/, '(\\d{1,2})') + '$'; return new RegExp(pattern); } addYearPadding(year) { if (year < 100) { return 2000 + year; } return year; } printUnkownLocaleWarning() { console.warn(`Default datepicker parser-formatter does not have predefined formats for "${this.locale}" locale. Please provide custom 'NgbDateParserFormatter' class. Now defaults to "en-GB".`); } } NcDateParserFormatterDefault.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcDateParserFormatterDefault, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Injectable }); NcDateParserFormatterDefault.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcDateParserFormatterDefault }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcDateParserFormatterDefault, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [LOCALE_ID] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1wYXJzZXItZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vcmRpYy1jb29sL3NyYy9saWIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLXBhcnNlci1mb3JtYXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFHN0MsTUFBTSxVQUFVLHNDQUFzQyxDQUFDLFFBQWdCO0lBQ3JFLE9BQU8sSUFBSSw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQU1ILE1BQU0sT0FBZ0IscUJBQXFCOztrSEFBckIscUJBQXFCO3NIQUFyQixxQkFBcUIsY0FKN0IsTUFBTSxjQUNOLHNDQUFzQyxrQkFDM0MsU0FBUzsyRkFFSSxxQkFBcUI7a0JBTDFDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07b0JBQ2xCLFVBQVUsRUFBRSxzQ0FBc0M7b0JBQ2xELElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQztpQkFDbEI7O0FBbUJELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2hDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO0lBQzNFLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO0lBQzNFLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO0lBQzNFLE9BQU8sRUFB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QUFVOzswQkFFSSxNQUFNOzJCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMT0NBTEVfSUQsIEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOY0RhdGVTdHJ1Y3QgfSBmcm9tICcuL2RhdGVwaWNrZXIubW9kZWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gTkNfREFURVBJQ0tFUl9QQVJTRVJfRk9STUFUVEVSX0ZBQ1RPUlkobG9jYWxlSWQ6IHN0cmluZykge1xuICByZXR1cm4gbmV3IE5jRGF0ZVBhcnNlckZvcm1hdHRlckRlZmF1bHQobG9jYWxlSWQpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGJldHdlZW4gdGhlIGludGVybmFsIGBOY0RhdGVTdHJ1Y3RgIG1vZGVsIHByZXNlbnRhdGlvbiBhbmQgYSBgc3RyaW5nYCB0aGF0IGlzIGRpc3BsYXllZCBpbiB0aGVcbiAqIGlucHV0IGVsZW1lbnQuXG4gKlxuICogV2hlbiB1c2VyIHR5cGVzIHNvbWV0aGluZyBpbiB0aGUgaW5wdXQgdGhpcyBzZXJ2aWNlIGF0dGVtcHRzIHRvIHBhcnNlIGl0IGludG8gYSBgTmNEYXRlU3RydWN0YCBvYmplY3QuXG4gKiBBbmQgdmljZSB2ZXJzYSwgd2hlbiB1c2VycyBzZWxlY3RzIGEgZGF0ZSBpbiB0aGUgY2FsZW5kYXIgd2l0aCB0aGUgbW91c2UsIGl0IG11c3QgYmUgZGlzcGxheWVkIGFzIGEgYHN0cmluZ2BcbiAqIGluIHRoZSBpbnB1dC5cbiAqXG4gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIElTTyA4NjAxIGZvcm1hdCwgYnV0IHlvdSBjYW4gcHJvdmlkZSBhbm90aGVyIGltcGxlbWVudGF0aW9uIHZpYSBESVxuICogdG8gdXNlIGFuIGFsdGVybmF0aXZlIHN0cmluZyBmb3JtYXQgb3IgYSBjdXN0b20gcGFyc2luZyBsb2dpYy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIHVzZUZhY3Rvcnk6IE5DX0RBVEVQSUNLRVJfUEFSU0VSX0ZPUk1BVFRFUl9GQUNUT1JZLFxuICBkZXBzOiBbTE9DQUxFX0lEXSxcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmNEYXRlUGFyc2VyRm9ybWF0dGVyIHtcbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgZ2l2ZW4gYHN0cmluZ2AgdG8gYW4gYE5jRGF0ZVN0cnVjdGAuXG4gICAqXG4gICAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgdHJ5IHRoZWlyIGJlc3QgdG8gcHJvdmlkZSBhIHJlc3VsdCwgZXZlblxuICAgKiBwYXJ0aWFsLiBUaGV5IG11c3QgcmV0dXJuIGBudWxsYCBpZiB0aGUgdmFsdWUgY2FuJ3QgYmUgcGFyc2VkLlxuICAgKi9cbiAgYWJzdHJhY3QgcGFyc2UodmFsdWU6IHN0cmluZyk6IE5jRGF0ZVN0cnVjdCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgdGhlIGdpdmVuIGBOY0RhdGVTdHJ1Y3RgIHRvIGEgYHN0cmluZ2AuXG4gICAqXG4gICAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgZ2l2ZW4gZGF0ZSBpcyBgbnVsbGAsXG4gICAqIGFuZCB0cnkgdGhlaXIgYmVzdCB0byBwcm92aWRlIGEgcGFydGlhbCByZXN1bHQgaWYgdGhlIGdpdmVuIGRhdGUgaXMgaW5jb21wbGV0ZSBvciBpbnZhbGlkLlxuICAgKi9cbiAgYWJzdHJhY3QgZm9ybWF0KGRhdGU6IE5jRGF0ZVN0cnVjdCB8IG51bGwpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBEQVRFX0lOUFVUX0ZPUk1BVFMgPSB7XG4gICdlbi1VUyc6IFsnTS9kL3l5JywgJ00vZC95eXl5JywgJ00uZC55eScsICdNLmQueXl5eScsICdNLWQteXknLCAnTS1kLXl5eXknXSxcbiAgJ2VuLUdCJzogWydkL00veXknLCAnZC9NL3l5eXknLCAnZC5NLnl5JywgJ2QuTS55eXl5JywgJ2QtTS15eScsICdkLU0teXl5eSddLFxuICAnZGEtZEsnOiBbJ2QuTS55eScsICdkLk0ueXl5eScsICdkL00veXknLCAnZC9NL3l5eXknLCAnZC1NLXl5JywgJ2QtTS15eXl5J10sXG4gICdmaS1GSSc6IFsnZC5NLnl5JywgJ2QuTS55eXl5JywgJ2QvTS95eScsICdkL00veXl5eScsICdkLU0teXknLCAnZC1NLXl5eXknXSxcbiAgJ25iLU5PJzogWydkLk0ueXknLCAnZC5NLnl5eXknLCAnZC9NL3l5JywgJ2QvTS95eXl5JywgJ2QtTS15eScsICdkLU0teXl5eSddLFxuICAnc3YtU0UnOiBbXG4gICAgJ3l5LU0tZCcsXG4gICAgJ3l5eXktTS1kJyxcbiAgICAneXkvTS9kJyxcbiAgICAneXl5eS9NL2QnLFxuICAgICd5eS5NLmQnLFxuICAgICd5eXl5Lk0uZCcsXG4gICAgJ3l5TU1kZCcsXG4gICAgJ3l5eXlNTWRkJyxcbiAgXSxcbn0gYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9O1xuXG5leHBvcnQgY29uc3QgREFURV9PVVRQVVRfRk9STUFUUyA9IHtcbiAgJ2VuLVVTJzogJ01NL2RkL3l5eXknLFxuICAnZW4tR0InOiAnZGQvTU0veXl5eScsXG4gICdkYS1ESyc6ICdkZC5NTS55eXl5JyxcbiAgJ2ZpLUZJJzogJ2RkLk1NLnl5eXknLFxuICAnbmItTk8nOiAnZGQuTU0ueXl5eScsXG4gICdzdi1TRSc6ICd5eXl5LU1NLWRkJyxcbn0gYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5jRGF0ZVBhcnNlckZvcm1hdHRlckRlZmF1bHQgZXh0ZW5kcyBOY0RhdGVQYXJzZXJGb3JtYXR0ZXIge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KExPQ0FMRV9JRCkgcHJpdmF0ZSBsb2NhbGU6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwYXJzZSh2YWx1ZTogc3RyaW5nKTogTmNEYXRlU3RydWN0IHtcbiAgICBsZXQgY29uZmlnOiBzdHJpbmdbXSA9IERBVEVfSU5QVVRfRk9STUFUU1t0aGlzLmxvY2FsZV07XG5cbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgdGhpcy5wcmludFVua293bkxvY2FsZVdhcm5pbmcoKTtcbiAgICAgIGNvbmZpZyA9IERBVEVfSU5QVVRfRk9STUFUU1snZW4tR0InXTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZvcm1hdCBvZiBjb25maWcpIHtcbiAgICAgIGNvbnN0IHJlZ2V4cCA9IHRoaXMuZGF0ZUZvcm1hdFRvUmVnZXhwKGZvcm1hdCk7XG5cbiAgICAgIGNvbnN0IG1hdGNoID0gdmFsdWUubWF0Y2gocmVnZXhwKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjb25zdCB5ZWFySW5kZXggPSBmb3JtYXQuaW5kZXhPZigneScpO1xuICAgICAgICBjb25zdCBtb250aEluZGV4ID0gZm9ybWF0LmluZGV4T2YoJ00nKTtcbiAgICAgICAgY29uc3QgZGF5SW5kZXggPSBmb3JtYXQuaW5kZXhPZignZCcpO1xuICAgICAgICBjb25zdCBzb3J0ZWRJbmRleGVzID0gW3llYXJJbmRleCwgbW9udGhJbmRleCwgZGF5SW5kZXhdLnNvcnQoKTtcbiAgICAgICAgY29uc3QgeWVhckdyb3VwID0gc29ydGVkSW5kZXhlcy5pbmRleE9mKHllYXJJbmRleCkgKyAxO1xuICAgICAgICBjb25zdCBtb250aEdyb3VwID0gc29ydGVkSW5kZXhlcy5pbmRleE9mKG1vbnRoSW5kZXgpICsgMTtcbiAgICAgICAgY29uc3QgZGF5R3JvdXAgPSBzb3J0ZWRJbmRleGVzLmluZGV4T2YoZGF5SW5kZXgpICsgMTtcbiAgICAgICAgY29uc3QgeWVhciA9IHRoaXMuYWRkWWVhclBhZGRpbmcoK21hdGNoW3llYXJHcm91cF0pO1xuICAgICAgICBjb25zdCBtb250aCA9ICttYXRjaFttb250aEdyb3VwXTtcbiAgICAgICAgY29uc3QgZGF5ID0gK21hdGNoW2RheUdyb3VwXTtcbiAgICAgICAgcmV0dXJuIHsgeWVhciwgbW9udGgsIGRheSB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvcm1hdChkYXRlOiBOY0RhdGVTdHJ1Y3QpOiBzdHJpbmcge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoZGF0ZS55ZWFyLCBkYXRlLm1vbnRoIC0gMSwgZGF0ZS5kYXkpKTtcbiAgICBsZXQgZm9ybWF0ID0gREFURV9PVVRQVVRfRk9STUFUU1t0aGlzLmxvY2FsZV07XG4gICAgaWYgKCFmb3JtYXQpIHtcbiAgICAgIHRoaXMucHJpbnRVbmtvd25Mb2NhbGVXYXJuaW5nKCk7XG4gICAgICBmb3JtYXQgPSBEQVRFX09VVFBVVF9GT1JNQVRTWydlbi1HQiddO1xuICAgIH1cbiAgICByZXR1cm4gZm9ybWF0RGF0ZSh1dGNEYXRlLCBmb3JtYXQsIHRoaXMubG9jYWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZGF0ZUZvcm1hdFRvUmVnZXhwKGZvcm1hdDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0dGVybiA9XG4gICAgICAnXicgK1xuICAgICAgZm9ybWF0XG4gICAgICAgIC8vIC8gdG8gXFwvXG4gICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ1xcXFwvJylcbiAgICAgICAgLy8gLiB0byBcXC5cbiAgICAgICAgLnJlcGxhY2UoL1xcLi9nLCAnXFxcXC4nKVxuICAgICAgICAucmVwbGFjZSgvKGQrKS8sICcoXFxcXGR7MSwyfSknKVxuICAgICAgICAucmVwbGFjZSgvKHl5eXkpLywgJyhcXFxcZHs0fSknKVxuICAgICAgICAucmVwbGFjZSgvKHl5KS8sICcoXFxcXGR7Mn0pJylcbiAgICAgICAgLnJlcGxhY2UoLyhNKykvLCAnKFxcXFxkezEsMn0pJykgK1xuICAgICAgJyQnO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRZZWFyUGFkZGluZyh5ZWFyOiBudW1iZXIpIHtcbiAgICBpZiAoeWVhciA8IDEwMCkge1xuICAgICAgcmV0dXJuIDIwMDAgKyB5ZWFyO1xuICAgIH1cbiAgICByZXR1cm4geWVhcjtcbiAgfVxuXG4gIHByaXZhdGUgcHJpbnRVbmtvd25Mb2NhbGVXYXJuaW5nKCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBEZWZhdWx0IGRhdGVwaWNrZXIgcGFyc2VyLWZvcm1hdHRlciBkb2VzIG5vdCBoYXZlIHByZWRlZmluZWQgZm9ybWF0cyBmb3IgXCIke3RoaXMubG9jYWxlfVwiIGxvY2FsZS4gUGxlYXNlIHByb3ZpZGUgY3VzdG9tICdOZ2JEYXRlUGFyc2VyRm9ybWF0dGVyJyBjbGFzcy4gTm93IGRlZmF1bHRzIHRvIFwiZW4tR0JcIi5gXG4gICAgKTtcbiAgfVxufVxuIl19