UNPKG

ngx-material-timepicker

Version:
174 lines 13.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { TimePeriod } from '../models/time-period.enum'; import { TimeAdapter } from './time-adapter'; import { DateTime } from 'luxon'; import * as i0 from "@angular/core"; /** @type {?} */ const DEFAULT_HOUR = { time: 12, angle: 360 }; /** @type {?} */ const DEFAULT_MINUTE = { time: 0, angle: 360 }; export class NgxMaterialTimepickerService { constructor() { this.hourSubject = new BehaviorSubject(DEFAULT_HOUR); this.minuteSubject = new BehaviorSubject(DEFAULT_MINUTE); this.periodSubject = new BehaviorSubject(TimePeriod.AM); } /** * @param {?} hour * @return {?} */ set hour(hour) { this.hourSubject.next(hour); } /** * @return {?} */ get selectedHour() { return this.hourSubject.asObservable(); } /** * @param {?} minute * @return {?} */ set minute(minute) { this.minuteSubject.next(minute); } /** * @return {?} */ get selectedMinute() { return this.minuteSubject.asObservable(); } /** * @param {?} period * @return {?} */ set period(period) { /** @type {?} */ const isPeriodValid = (period === TimePeriod.AM) || (period === TimePeriod.PM); if (isPeriodValid) { this.periodSubject.next(period); } } /** * @return {?} */ get selectedPeriod() { return this.periodSubject.asObservable(); } /** * @param {?} time * @param {?} min * @param {?} max * @param {?} format * @param {?=} minutesGap * @return {?} */ setDefaultTimeIfAvailable(time, min, max, format, minutesGap) { /* Workaround to double error message*/ try { if (TimeAdapter.isTimeAvailable(time, min, max, 'minutes', minutesGap)) { this.setDefaultTime(TimeAdapter.formatTime(time, format), format); } } catch (e) { console.error(e); } } /** * @param {?} format * @return {?} */ getFullTime(format) { /** @type {?} */ const hour = this.hourSubject.getValue().time; /** @type {?} */ const minute = this.minuteSubject.getValue().time; /** @type {?} */ const period = format === 12 ? this.periodSubject.getValue() : ''; return TimeAdapter.formatTime(`${hour}:${minute} ${period}`, format); } /** * @private * @param {?} time * @param {?} format * @return {?} */ setDefaultTime(time, format) { /** @type {?} */ const defaultTime = TimeAdapter.convertTimeToDateTime(time, format).toJSDate(); if (DateTime.fromJSDate(defaultTime).isValid) { /** @type {?} */ const period = time.substr(time.length - 2).toUpperCase(); /** @type {?} */ const hour = defaultTime.getHours(); this.hour = Object.assign({}, DEFAULT_HOUR, { time: formatHourByPeriod(hour, (/** @type {?} */ (period))) }); this.minute = Object.assign({}, DEFAULT_MINUTE, { time: defaultTime.getMinutes() }); this.period = (/** @type {?} */ (period)); } else { this.resetTime(); } } /** * @private * @return {?} */ resetTime() { this.hour = Object.assign({}, DEFAULT_HOUR); this.minute = Object.assign({}, DEFAULT_MINUTE); this.period = TimePeriod.AM; } } NgxMaterialTimepickerService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ NgxMaterialTimepickerService.ngInjectableDef = i0.defineInjectable({ factory: function NgxMaterialTimepickerService_Factory() { return new NgxMaterialTimepickerService(); }, token: NgxMaterialTimepickerService, providedIn: "root" }); if (false) { /** * @type {?} * @private */ NgxMaterialTimepickerService.prototype.hourSubject; /** * @type {?} * @private */ NgxMaterialTimepickerService.prototype.minuteSubject; /** * @type {?} * @private */ NgxMaterialTimepickerService.prototype.periodSubject; } /** * * Format hour in 24hours format to meridian (AM or PM) format * @param {?} hour * @param {?} period * @return {?} */ function formatHourByPeriod(hour, period) { switch (period) { case TimePeriod.AM: return hour === 0 ? 12 : hour; case TimePeriod.PM: return hour === 12 ? 12 : hour - 12; default: return hour; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hdGVyaWFsLXRpbWVwaWNrZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXRlcmlhbC10aW1lcGlja2VyLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tYXRlcmlhbC10aW1lcGlja2VyL3NlcnZpY2VzL25neC1tYXRlcmlhbC10aW1lcGlja2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7OztNQUczQixZQUFZLEdBQWtCO0lBQ2hDLElBQUksRUFBRSxFQUFFO0lBQ1IsS0FBSyxFQUFFLEdBQUc7Q0FDYjs7TUFDSyxjQUFjLEdBQWtCO0lBQ2xDLElBQUksRUFBRSxDQUFDO0lBQ1AsS0FBSyxFQUFFLEdBQUc7Q0FDYjtBQUtELE1BQU0sT0FBTyw0QkFBNEI7SUFIekM7UUFLWSxnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFnQixZQUFZLENBQUMsQ0FBQztRQUMvRCxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFnQixjQUFjLENBQUMsQ0FBQztRQUNuRSxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFhLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQXdFMUU7Ozs7O0lBckVHLElBQUksSUFBSSxDQUFDLElBQW1CO1FBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Ozs7SUFFRCxJQUFJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDM0Ms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Q0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUM7SUFDaEMsQ0FBQzs7O1lBOUVKLFVBQVUsU0FBQztnQkFDUixVQUFVLEVBQUUsTUFBTTthQUNyQjs7Ozs7Ozs7SUFHRyxtREFBdUU7Ozs7O0lBQ3ZFLHFEQUEyRTs7Ozs7SUFDM0UscURBQXVFOzs7Ozs7Ozs7QUE2RTNFLFNBQVMsa0JBQWtCLENBQUMsSUFBWSxFQUFFLE1BQWtCO0lBQ3hELFFBQVEsTUFBTSxFQUFFO1FBQ1osS0FBSyxVQUFVLENBQUMsRUFBRTtZQUNkLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEMsS0FBSyxVQUFVLENBQUMsRUFBRTtZQUNkLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3hDO1lBQ0ksT0FBTyxJQUFJLENBQUM7S0FDbkI7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2xvY2tGYWNlVGltZSB9IGZyb20gJy4uL21vZGVscy9jbG9jay1mYWNlLXRpbWUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGltZVBlcmlvZCB9IGZyb20gJy4uL21vZGVscy90aW1lLXBlcmlvZC5lbnVtJztcbmltcG9ydCB7IFRpbWVBZGFwdGVyIH0gZnJvbSAnLi90aW1lLWFkYXB0ZXInO1xuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbic7XG5cblxuY29uc3QgREVGQVVMVF9IT1VSOiBDbG9ja0ZhY2VUaW1lID0ge1xuICAgIHRpbWU6IDEyLFxuICAgIGFuZ2xlOiAzNjBcbn07XG5jb25zdCBERUZBVUxUX01JTlVURTogQ2xvY2tGYWNlVGltZSA9IHtcbiAgICB0aW1lOiAwLFxuICAgIGFuZ2xlOiAzNjBcbn07XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTmd4TWF0ZXJpYWxUaW1lcGlja2VyU2VydmljZSB7XG5cbiAgICBwcml2YXRlIGhvdXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDbG9ja0ZhY2VUaW1lPihERUZBVUxUX0hPVVIpO1xuICAgIHByaXZhdGUgbWludXRlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2xvY2tGYWNlVGltZT4oREVGQVVMVF9NSU5VVEUpO1xuICAgIHByaXZhdGUgcGVyaW9kU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGltZVBlcmlvZD4oVGltZVBlcmlvZC5BTSk7XG5cblxuICAgIHNldCBob3VyKGhvdXI6IENsb2NrRmFjZVRpbWUpIHtcbiAgICAgICAgdGhpcy5ob3VyU3ViamVjdC5uZXh0KGhvdXIpO1xuICAgIH1cblxuICAgIGdldCBzZWxlY3RlZEhvdXIoKTogT2JzZXJ2YWJsZTxDbG9ja0ZhY2VUaW1lPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHNldCBtaW51dGUobWludXRlOiBDbG9ja0ZhY2VUaW1lKSB7XG4gICAgICAgIHRoaXMubWludXRlU3ViamVjdC5uZXh0KG1pbnV0ZSk7XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdGVkTWludXRlKCk6IE9ic2VydmFibGU8Q2xvY2tGYWNlVGltZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5taW51dGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHNldCBwZXJpb2QocGVyaW9kOiBUaW1lUGVyaW9kKSB7XG4gICAgICAgIGNvbnN0IGlzUGVyaW9kVmFsaWQgPSAocGVyaW9kID09PSBUaW1lUGVyaW9kLkFNKSB8fCAocGVyaW9kID09PSBUaW1lUGVyaW9kLlBNKTtcblxuICAgICAgICBpZiAoaXNQZXJpb2RWYWxpZCkge1xuICAgICAgICAgICAgdGhpcy5wZXJpb2RTdWJqZWN0Lm5leHQocGVyaW9kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBzZWxlY3RlZFBlcmlvZCgpOiBPYnNlcnZhYmxlPFRpbWVQZXJpb2Q+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyaW9kU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cblxuICAgIHNldERlZmF1bHRUaW1lSWZBdmFpbGFibGUodGltZTogc3RyaW5nLCBtaW46IERhdGVUaW1lLCBtYXg6IERhdGVUaW1lLCBmb3JtYXQ6IG51bWJlciwgbWludXRlc0dhcD86IG51bWJlcikge1xuICAgICAgICAvKiBXb3JrYXJvdW5kIHRvIGRvdWJsZSBlcnJvciBtZXNzYWdlKi9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChUaW1lQWRhcHRlci5pc1RpbWVBdmFpbGFibGUodGltZSwgbWluLCBtYXgsICdtaW51dGVzJywgbWludXRlc0dhcCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHRUaW1lKFRpbWVBZGFwdGVyLmZvcm1hdFRpbWUodGltZSwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEZ1bGxUaW1lKGZvcm1hdDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaG91ciA9IHRoaXMuaG91clN1YmplY3QuZ2V0VmFsdWUoKS50aW1lO1xuICAgICAgICBjb25zdCBtaW51dGUgPSB0aGlzLm1pbnV0ZVN1YmplY3QuZ2V0VmFsdWUoKS50aW1lO1xuICAgICAgICBjb25zdCBwZXJpb2QgPSBmb3JtYXQgPT09IDEyID8gdGhpcy5wZXJpb2RTdWJqZWN0LmdldFZhbHVlKCkgOiAnJztcblxuICAgICAgICByZXR1cm4gVGltZUFkYXB0ZXIuZm9ybWF0VGltZShgJHtob3VyfToke21pbnV0ZX0gJHtwZXJpb2R9YCwgZm9ybWF0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldERlZmF1bHRUaW1lKHRpbWU6IHN0cmluZywgZm9ybWF0OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFRpbWUgPSBUaW1lQWRhcHRlci5jb252ZXJ0VGltZVRvRGF0ZVRpbWUodGltZSwgZm9ybWF0KS50b0pTRGF0ZSgpO1xuXG4gICAgICAgIGlmIChEYXRlVGltZS5mcm9tSlNEYXRlKGRlZmF1bHRUaW1lKS5pc1ZhbGlkKSB7XG4gICAgICAgICAgICBjb25zdCBwZXJpb2QgPSB0aW1lLnN1YnN0cih0aW1lLmxlbmd0aCAtIDIpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBob3VyID0gZGVmYXVsdFRpbWUuZ2V0SG91cnMoKTtcblxuICAgICAgICAgICAgdGhpcy5ob3VyID0gey4uLkRFRkFVTFRfSE9VUiwgdGltZTogZm9ybWF0SG91ckJ5UGVyaW9kKGhvdXIsIHBlcmlvZCBhcyBUaW1lUGVyaW9kKX07XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZSA9IHsuLi5ERUZBVUxUX01JTlVURSwgdGltZTogZGVmYXVsdFRpbWUuZ2V0TWludXRlcygpfTtcbiAgICAgICAgICAgIHRoaXMucGVyaW9kID0gcGVyaW9kIGFzIFRpbWVQZXJpb2Q7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0VGltZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3VyID0gey4uLkRFRkFVTFRfSE9VUn07XG4gICAgICAgIHRoaXMubWludXRlID0gey4uLkRFRkFVTFRfTUlOVVRFfTtcbiAgICAgICAgdGhpcy5wZXJpb2QgPSBUaW1lUGVyaW9kLkFNO1xuICAgIH1cbn1cblxuLyoqKlxuICogIEZvcm1hdCBob3VyIGluIDI0aG91cnMgZm9ybWF0IHRvIG1lcmlkaWFuIChBTSBvciBQTSkgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdEhvdXJCeVBlcmlvZChob3VyOiBudW1iZXIsIHBlcmlvZDogVGltZVBlcmlvZCk6IG51bWJlciB7XG4gICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgY2FzZSBUaW1lUGVyaW9kLkFNOlxuICAgICAgICAgICAgcmV0dXJuIGhvdXIgPT09IDAgPyAxMiA6IGhvdXI7XG4gICAgICAgIGNhc2UgVGltZVBlcmlvZC5QTTpcbiAgICAgICAgICAgIHJldHVybiBob3VyID09PSAxMiA/IDEyIDogaG91ciAtIDEyO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgfVxufVxuIl19