ngx-material-timepicker
Version:
Handy material design timepicker for angular
67 lines • 11.7 kB
JavaScript
import { DateTime } from 'luxon';
import { TimeFormat } from '../models/time-format.enum';
import { TimePeriod } from '../models/time-period.enum';
import { isBetween, isSameOrAfter, isSameOrBefore } from '../utils/timepicker.utils';
// @dynamic
export class TimeAdapter {
static parseTime(time, format = 12) {
if (time.indexOf(':') === -1) {
return 'Invalid time';
}
let period = time.trim().substr(time.length - 2).toUpperCase();
const isPeriodValid = period === TimePeriod.AM || period === TimePeriod.PM;
const [h, m] = time.split(':');
if (format === 24) {
const formattedHours = isPeriodValid ? this.formatHour(+h, 12, period) : +h;
return `${formattedHours}:${parseInt(m, 10)}`;
}
const isPM = +h > 12;
const hours = isPM ? +h - 12 : +h;
period = isPeriodValid ? period : isPM ? TimePeriod.PM : TimePeriod.AM;
return `${hours}:${parseInt(m, 10)} ${period}`;
}
static formatTime(time, format = 12) {
const timeFormat = (format === 24) ? TimeFormat.TWENTY_FOUR : TimeFormat.TWELVE;
const timeMask = (format === 24) ? TimeFormat.TWENTY_FOUR_SHORT : TimeFormat.TWELVE_SHORT;
return DateTime.fromFormat(this.parseTime(time, format), timeMask).toFormat(timeFormat).toLowerCase();
}
static convertTimeToDateTime(time, format = 12) {
const timeMask = (format === 24) ? TimeFormat.TWENTY_FOUR_SHORT : TimeFormat.TWELVE_SHORT;
return DateTime.fromFormat(this.parseTime(time, format), timeMask);
}
static isTimeAvailable(time, min, max, granularity, minutesGap, format) {
if (!time) {
return;
}
const convertedTime = this.convertTimeToDateTime(time, format);
const minutes = convertedTime.minute;
if (minutesGap && (minutes % minutesGap !== 0)) {
throw new Error(`Your minutes - ${minutes} doesn\'t match your minutesGap - ${minutesGap}`);
}
const isAfter = (min && !max)
&& isSameOrAfter(convertedTime, min, granularity);
const isBefore = (max && !min)
&& isSameOrBefore(convertedTime, max, granularity);
const between = (min && max)
&& isBetween(convertedTime, min, max, granularity);
const isAvailable = !min && !max;
return isAfter || isBefore || between || isAvailable;
}
/***
* Format hour according to time format (12 or 24)
*/
static formatHour(currentHour, format, period) {
if (format === 24) {
return currentHour;
}
const hour = period === TimePeriod.AM ? currentHour : currentHour + 12;
if (period === TimePeriod.AM && hour === 12) {
return 0;
}
else if (period === TimePeriod.PM && hour === 24) {
return 12;
}
return hour;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LW1hdGVyaWFsLXRpbWVwaWNrZXIvIiwic291cmNlcyI6WyJzcmMvYXBwL21hdGVyaWFsLXRpbWVwaWNrZXIvc2VydmljZXMvdGltZS1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFakMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVyRixXQUFXO0FBQ1gsTUFBTSxPQUFPLFdBQVc7SUFFcEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFZLEVBQUUsTUFBTSxHQUFHLEVBQUU7UUFDdEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzFCLE9BQU8sY0FBYyxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRS9ELE1BQU0sYUFBYSxHQUFHLE1BQU0sS0FBSyxVQUFVLENBQUMsRUFBRSxJQUFJLE1BQU0sS0FBSyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQzNFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUcvQixJQUFJLE1BQU0sS0FBSyxFQUFFLEVBQUU7WUFDZixNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUs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RUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdkQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFFakMsT0FBTyxPQUFPLElBQUksUUFBUSxJQUFJLE9BQU8sSUFBSSxXQUFXLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFtQixFQUFFLE1BQWMsRUFBRSxNQUFrQjtRQUNyRSxJQUFJLE1BQU0sS0FBSyxFQUFFLEVBQUU7WUFDZixPQUFPLFdBQVcsQ0FBQztTQUN0QjtRQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFFdkUsSUFBSSxNQUFNLEtBQUssVUFBVSxDQUFDLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFO1lBQ3pDLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7YUFBTSxJQUFJLE1BQU0sS0FBSyxVQUFVLENBQUMsRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLEVBQUU7WUFDaEQsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuXG5pbXBvcnQgeyBUaW1lRm9ybWF0IH0gZnJvbSAnLi4vbW9kZWxzL3RpbWUtZm9ybWF0LmVudW0nO1xuaW1wb3J0IHsgVGltZVBlcmlvZCB9IGZyb20gJy4uL21vZGVscy90aW1lLXBlcmlvZC5lbnVtJztcbmltcG9ydCB7IGlzQmV0d2VlbiwgaXNTYW1lT3JBZnRlciwgaXNTYW1lT3JCZWZvcmUgfSBmcm9tICcuLi91dGlscy90aW1lcGlja2VyLnV0aWxzJztcblxuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBUaW1lQWRhcHRlciB7XG5cbiAgICBzdGF0aWMgcGFyc2VUaW1lKHRpbWU6IHN0cmluZywgZm9ybWF0ID0gMTIpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGltZS5pbmRleE9mKCc6JykgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgdGltZSc7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBlcmlvZCA9IHRpbWUudHJpbSgpLnN1YnN0cih0aW1lLmxlbmd0aCAtIDIpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgY29uc3QgaXNQZXJpb2RWYWxpZCA9IHBlcmlvZCA9PT0gVGltZVBlcmlvZC5BTSB8fCBwZXJpb2QgPT09IFRpbWVQZXJpb2QuUE07XG4gICAgICAgIGNvbnN0IFtoLCBtXSA9IHRpbWUuc3BsaXQoJzonKTtcblxuXG4gICAgICAgIGlmIChmb3JtYXQgPT09IDI0KSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRIb3VycyA9IGlzUGVyaW9kVmFsaWQgPyB0aGlzLmZvcm1hdEhvdXIoK2gsIDEyLCBwZXJpb2QgYXMgVGltZVBlcmlvZCkgOiAraDtcbiAgICAgICAgICAgIHJldHVybiBgJHtmb3JtYXR0ZWRIb3Vyc306JHtwYXJzZUludChtLCAxMCl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUE0gPSAraCA+IDEyO1xuICAgICAgICBjb25zdCBob3VycyA9IGlzUE0gPyAraCAtIDEyIDogK2g7XG5cbiAgICAgICAgcGVyaW9kID0gaXNQZXJpb2RWYWxpZCA/IHBlcmlvZCA6IGlzUE0gPyBUaW1lUGVyaW9kLlBNIDogVGltZVBlcmlvZC5BTTtcblxuICAgICAgICByZXR1cm4gYCR7aG91cnN9OiR7cGFyc2VJbnQobSwgMTApfSAke3BlcmlvZH1gO1xuICAgIH1cblxuICAgIHN0YXRpYyBmb3JtYXRUaW1lKHRpbWU6IHN0cmluZywgZm9ybWF0ID0gMTIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB0aW1lRm9ybWF0ID0gKGZvcm1hdCA9PT0gMjQpID8gVGltZUZvcm1hdC5UV0VOVFlfRk9VUiA6IFRpbWVGb3JtYXQuVFdFTFZFO1xuICAgICAgICBjb25zdCB0aW1lTWFzayA9IChmb3JtYXQgPT09IDI0KSA/IFRpbWVGb3JtYXQuVFdFTlRZX0ZPVVJfU0hPUlQgOiBUaW1lRm9ybWF0LlRXRUxWRV9TSE9SVDtcblxuICAgICAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdCh0aGlzLnBhcnNlVGltZSh0aW1lLCBmb3JtYXQpLCB0aW1lTWFzaykudG9Gb3JtYXQodGltZUZvcm1hdCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29udmVydFRpbWVUb0RhdGVUaW1lKHRpbWU6IHN0cmluZywgZm9ybWF0ID0gMTIpOiBEYXRlVGltZSB7XG4gICAgICAgIGNvbnN0IHRpbWVNYXNrID0gKGZvcm1hdCA9PT0gMjQpID8gVGltZUZvcm1hdC5UV0VOVFlfRk9VUl9TSE9SVCA6IFRpbWVGb3JtYXQuVFdFTFZFX1NIT1JUO1xuICAgICAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdCh0aGlzLnBhcnNlVGltZSh0aW1lLCBmb3JtYXQpLCB0aW1lTWFzayk7XG4gICAgfVxuXG4gICAgc3RhdGljIGlzVGltZUF2YWlsYWJsZShcbiAgICAgICAgdGltZTogc3RyaW5nLFxuICAgICAgICBtaW4/OiBEYXRlVGltZSxcbiAgICAgICAgbWF4PzogRGF0ZVRpbWUsXG4gICAgICAgIGdyYW51bGFyaXR5PzogJ2hvdXJzJyB8ICdtaW51dGVzJyxcbiAgICAgICAgbWludXRlc0dhcD86IG51bWJlcixcbiAgICAgICAgZm9ybWF0PzogbnVtYmVyXG4gICAgKTogYm9vbGVhbiB7XG5cbiAgICAgICAgaWYgKCF0aW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRUaW1lID0gdGhpcy5jb252ZXJ0VGltZVRvRGF0ZVRpbWUodGltZSwgZm9ybWF0KTtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IGNvbnZlcnRlZFRpbWUubWludXRlO1xuXG4gICAgICAgIGlmIChtaW51dGVzR2FwICYmIChtaW51dGVzICUgbWludXRlc0dhcCAhPT0gMCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91ciBtaW51dGVzIC0gJHttaW51dGVzfSBkb2VzblxcJ3QgbWF0Y2ggeW91ciBtaW51dGVzR2FwIC0gJHttaW51dGVzR2FwfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQWZ0ZXIgPSAobWluICYmICFtYXgpXG4gICAgICAgICAgICAmJiBpc1NhbWVPckFmdGVyKGNvbnZlcnRlZFRpbWUsIG1pbiwgZ3JhbnVsYXJpdHkpO1xuICAgICAgICBjb25zdCBpc0JlZm9yZSA9IChtYXggJiYgIW1pbilcbiAgICAgICAgICAgICYmIGlzU2FtZU9yQmVmb3JlKGNvbnZlcnRlZFRpbWUsIG1heCwgZ3JhbnVsYXJpdHkpO1xuICAgICAgICBjb25zdCBiZXR3ZWVuID0gKG1pbiAmJiBtYXgpXG4gICAgICAgICAgICAmJiBpc0JldHdlZW4oY29udmVydGVkVGltZSwgbWluLCBtYXgsIGdyYW51bGFyaXR5KTtcbiAgICAgICAgY29uc3QgaXNBdmFpbGFibGUgPSAhbWluICYmICFtYXg7XG5cbiAgICAgICAgcmV0dXJuIGlzQWZ0ZXIgfHwgaXNCZWZvcmUgfHwgYmV0d2VlbiB8fCBpc0F2YWlsYWJsZTtcbiAgICB9XG5cbiAgICAvKioqXG4gICAgICogIEZvcm1hdCBob3VyIGFjY29yZGluZyB0byB0aW1lIGZvcm1hdCAoMTIgb3IgMjQpXG4gICAgICovXG4gICAgc3RhdGljIGZvcm1hdEhvdXIoY3VycmVudEhvdXI6IG51bWJlciwgZm9ybWF0OiBudW1iZXIsIHBlcmlvZDogVGltZVBlcmlvZCk6IG51bWJlciB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IDI0KSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudEhvdXI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG91ciA9IHBlcmlvZCA9PT0gVGltZVBlcmlvZC5BTSA/IGN1cnJlbnRIb3VyIDogY3VycmVudEhvdXIgKyAxMjtcblxuICAgICAgICBpZiAocGVyaW9kID09PSBUaW1lUGVyaW9kLkFNICYmIGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSBlbHNlIGlmIChwZXJpb2QgPT09IFRpbWVQZXJpb2QuUE0gJiYgaG91ciA9PT0gMjQpIHtcbiAgICAgICAgICAgIHJldHVybiAxMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaG91cjtcbiAgICB9XG59XG4iXX0=