@vismaux/ngx-nordic-cool
Version:
Common Nordic-Cool components for Angular.
129 lines • 17.1 kB
JavaScript
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