ngx-bootstrap
Version:
Angular Bootstrap
1 lines • 65 kB
Source Map (JSON)
{"version":3,"file":"ngx-bootstrap-timepicker.mjs","sources":["../../../../src/timepicker/reducer/timepicker.actions.ts","../../../../src/timepicker/timepicker.utils.ts","../../../../src/timepicker/timepicker-controls.util.ts","../../../../src/timepicker/timepicker.config.ts","../../../../src/timepicker/reducer/timepicker.reducer.ts","../../../../src/timepicker/reducer/timepicker.store.ts","../../../../src/timepicker/timepicker.component.ts","../../../../src/timepicker/timepicker.component.html","../../../../src/timepicker/timepicker.module.ts","../../../../src/timepicker/ngx-bootstrap-timepicker.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Action } from 'ngx-bootstrap/mini-ngrx';\nimport {\n TimeChangeEvent,\n TimepickerComponentState,\n Time\n} from '../timepicker.models';\n\n@Injectable({providedIn: 'platform'})\nexport class TimepickerActions {\n static readonly WRITE_VALUE = '[timepicker] write value from ng model';\n static readonly CHANGE_HOURS = '[timepicker] change hours';\n static readonly CHANGE_MINUTES = '[timepicker] change minutes';\n static readonly CHANGE_SECONDS = '[timepicker] change seconds';\n static readonly SET_TIME_UNIT = '[timepicker] set time unit';\n static readonly UPDATE_CONTROLS = '[timepicker] update controls';\n\n writeValue(value?: Date | string) {\n return {\n type: TimepickerActions.WRITE_VALUE,\n payload: value\n };\n }\n\n changeHours(event: TimeChangeEvent) {\n return {\n type: TimepickerActions.CHANGE_HOURS,\n payload: event\n };\n }\n\n changeMinutes(event: TimeChangeEvent) {\n return {\n type: TimepickerActions.CHANGE_MINUTES,\n payload: event\n };\n }\n\n changeSeconds(event: TimeChangeEvent): Action {\n return {\n type: TimepickerActions.CHANGE_SECONDS,\n payload: event\n };\n }\n\n setTime(value: Time): Action {\n return {\n type: TimepickerActions.SET_TIME_UNIT,\n payload: value\n };\n }\n\n updateControls(value: TimepickerComponentState): Action {\n return {\n type: TimepickerActions.UPDATE_CONTROLS,\n payload: value\n };\n }\n}\n","import { Time, TimepickerComponentState } from './timepicker.models';\n\nconst dex = 10;\nconst hoursPerDay = 24;\nconst hoursPerDayHalf = 12;\nconst minutesPerHour = 60;\nconst secondsPerMinute = 60;\n\nexport function isValidDate(value?: string | Date): boolean {\n if (!value) {\n return false;\n }\n\n if (value instanceof Date && isNaN(value.getHours())) {\n return false;\n }\n\n if (typeof value === 'string') {\n return isValidDate(new Date(value));\n }\n\n return true;\n}\n\nexport function isValidLimit(controls: TimepickerComponentState, newDate: Date): boolean {\n if (controls.min && newDate < controls.min) {\n return false;\n }\n\n if (controls.max && newDate > controls.max) {\n return false;\n }\n\n return true;\n}\n\nexport function toNumber(value?: string | number): number {\n if (typeof value === 'undefined') {\n return NaN;\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n return parseInt(value, dex);\n}\n\nexport function isNumber(value: string | number): value is number {\n return !isNaN(toNumber(value));\n}\n\nexport function parseHours(\n value?: string | number,\n isPM = false\n): number {\n const hour = toNumber(value);\n if (\n isNaN(hour) ||\n hour < 0 ||\n hour > (isPM ? hoursPerDayHalf : hoursPerDay)\n ) {\n return NaN;\n }\n\n return hour;\n}\n\nexport function parseMinutes(value?: string | number): number {\n const minute = toNumber(value);\n if (isNaN(minute) || minute < 0 || minute > minutesPerHour) {\n return NaN;\n }\n\n return minute;\n}\n\nexport function parseSeconds(value?: string | number): number {\n const seconds = toNumber(value);\n if (isNaN(seconds) || seconds < 0 || seconds > secondsPerMinute) {\n return NaN;\n }\n\n return seconds;\n}\n\nexport function parseTime(value?: string | Date): Date | undefined {\n if (typeof value === 'string') {\n return new Date(value);\n }\n\n return value;\n}\n\nexport function changeTime(value?: Date, diff?: Time): Date {\n if (!value) {\n return changeTime(createDate(new Date(), 0, 0, 0), diff);\n }\n\n if (!diff) {\n return value;\n }\n\n let hour = value.getHours();\n let minutes = value.getMinutes();\n let seconds = value.getSeconds();\n\n if (diff.hour) {\n hour = hour + toNumber(diff.hour);\n }\n\n if (diff.minute) {\n minutes = minutes + toNumber(diff.minute);\n }\n\n if (diff.seconds) {\n seconds = seconds + toNumber(diff.seconds);\n }\n\n return createDate(value, hour, minutes, seconds);\n}\n\nexport function setTime(value: Date | undefined, opts: Time): Date | undefined {\n let hour = parseHours(opts.hour);\n const minute = parseMinutes(opts.minute);\n const seconds = parseSeconds(opts.seconds) || 0;\n\n if (opts.isPM && hour !== 12) {\n hour += hoursPerDayHalf;\n }\n\n if (!value) {\n if (!isNaN(hour) && !isNaN(minute)) {\n return createDate(new Date(), hour, minute, seconds);\n }\n\n return value;\n }\n\n if (isNaN(hour) || isNaN(minute)) {\n return value;\n }\n\n return createDate(value, hour, minute, seconds);\n}\n\nexport function createDate(\n value: Date,\n hours: number,\n minutes: number,\n seconds: number\n): Date {\n const newValue = new Date(\n value.getFullYear(),\n value.getMonth(),\n value.getDate(),\n hours,\n minutes,\n seconds,\n value.getMilliseconds()\n );\n // #3139 ensure date part remains unchanged\n newValue.setFullYear(value.getFullYear());\n newValue.setMonth(value.getMonth());\n newValue.setDate(value.getDate());\n\n return newValue;\n}\n\nexport function padNumber(value: number): string {\n const _value = value.toString();\n if (_value.length > 1) {\n return _value;\n }\n\n return `0${_value}`;\n}\n\nexport function isHourInputValid(hours: string, isPM: boolean): boolean {\n return !isNaN(parseHours(hours, isPM));\n}\n\nexport function isMinuteInputValid(minutes: string): boolean {\n return !isNaN(parseMinutes(minutes));\n}\n\nexport function isSecondInputValid(seconds: string): boolean {\n return !isNaN(parseSeconds(seconds));\n}\n\nexport function isInputLimitValid(diff: Time, max?: Date, min?: Date): boolean {\n const newDate = setTime(new Date(), diff);\n\n if (!newDate) {\n return false;\n }\n\n if (max && newDate > max) {\n return false;\n }\n\n if (min && newDate < min) {\n return false;\n }\n\n return true;\n}\n\nexport function isOneOfDatesEmpty(hours: string, minutes: string, seconds: string): boolean {\n return hours.length === 0 || minutes.length === 0 || seconds.length === 0;\n}\n\nexport function isInputValid(\n hours: string,\n minutes = '0',\n seconds = '0',\n isPM: boolean\n): boolean {\n return isHourInputValid(hours, isPM)\n && isMinuteInputValid(minutes)\n && isSecondInputValid(seconds);\n}\n","import { changeTime } from './timepicker.utils';\nimport {\n TimeChangeEvent,\n TimepickerComponentState,\n TimepickerControls\n} from './timepicker.models';\n\nexport function canChangeValue(\n state: TimepickerComponentState,\n event?: TimeChangeEvent\n): boolean {\n if (state.readonlyInput || state.disabled) {\n return false;\n }\n\n if (event) {\n if (event.source === 'wheel' && !state.mousewheel) {\n return false;\n }\n\n if (event.source === 'key' && !state.arrowkeys) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function canChangeHours(\n event: TimeChangeEvent,\n controls: TimepickerControls\n): boolean {\n if (!event.step) {\n return false;\n }\n\n if (event.step > 0 && !controls.canIncrementHours) {\n return false;\n }\n\n if (event.step < 0 && !controls.canDecrementHours) {\n return false;\n }\n\n return true;\n}\n\nexport function canChangeMinutes(\n event: TimeChangeEvent,\n controls: TimepickerControls\n): boolean {\n if (!event.step) {\n return false;\n }\n if (event.step > 0 && !controls.canIncrementMinutes) {\n return false;\n }\n if (event.step < 0 && !controls.canDecrementMinutes) {\n return false;\n }\n\n return true;\n}\n\nexport function canChangeSeconds(\n event: TimeChangeEvent,\n controls: TimepickerControls\n): boolean {\n if (!event.step) {\n return false;\n }\n if (event.step > 0 && !controls.canIncrementSeconds) {\n return false;\n }\n if (event.step < 0 && !controls.canDecrementSeconds) {\n return false;\n }\n\n return true;\n}\n\nexport function getControlsValue(\n state: TimepickerComponentState\n): TimepickerComponentState {\n const {\n hourStep,\n minuteStep,\n secondsStep,\n readonlyInput,\n disabled,\n mousewheel,\n arrowkeys,\n showSpinners,\n showMeridian,\n showSeconds,\n meridians,\n min,\n max\n } = state;\n\n return {\n hourStep,\n minuteStep,\n secondsStep,\n readonlyInput,\n disabled,\n mousewheel,\n arrowkeys,\n showSpinners,\n showMeridian,\n showSeconds,\n meridians,\n min,\n max\n };\n}\n\nexport function timepickerControls(value: Date | undefined, state: TimepickerComponentState): TimepickerControls {\n const hoursPerDay = 24;\n const hoursPerDayHalf = 12;\n const { min, max, hourStep, minuteStep, secondsStep, showSeconds } = state;\n const res: TimepickerControls = {\n canIncrementHours: true,\n canIncrementMinutes: true,\n canIncrementSeconds: true,\n\n canDecrementHours: true,\n canDecrementMinutes: true,\n canDecrementSeconds: true,\n\n canToggleMeridian: true\n };\n\n if (!value) {\n return res;\n }\n\n // compare dates\n if (max) {\n const _newHour = changeTime(value, { hour: hourStep });\n res.canIncrementHours = max > _newHour && (value.getHours() + hourStep) < hoursPerDay;\n\n if (!res.canIncrementHours) {\n const _newMinutes = changeTime(value, { minute: minuteStep });\n res.canIncrementMinutes = showSeconds\n ? max > _newMinutes\n : max >= _newMinutes;\n }\n\n if (!res.canIncrementMinutes) {\n const _newSeconds = changeTime(value, { seconds: secondsStep });\n res.canIncrementSeconds = max >= _newSeconds;\n }\n\n if (value.getHours() < hoursPerDayHalf) {\n res.canToggleMeridian = changeTime(value, { hour: hoursPerDayHalf }) < max;\n }\n }\n\n if (min) {\n const _newHour = changeTime(value, { hour: -hourStep });\n res.canDecrementHours = min < _newHour;\n\n if (!res.canDecrementHours) {\n const _newMinutes = changeTime(value, { minute: -minuteStep });\n res.canDecrementMinutes = showSeconds\n ? min < _newMinutes\n : min <= _newMinutes;\n }\n\n if (!res.canDecrementMinutes) {\n const _newSeconds = changeTime(value, { seconds: -secondsStep });\n res.canDecrementSeconds = min <= _newSeconds;\n }\n\n if (value.getHours() >= hoursPerDayHalf) {\n res.canToggleMeridian = changeTime(value, { hour: -hoursPerDayHalf }) > min;\n }\n }\n\n return res;\n}\n","import { Injectable } from '@angular/core';\n\n/** Provides default configuration values for timepicker */\n@Injectable({\n providedIn: 'root'\n})\nexport class TimepickerConfig {\n /** hours change step */\n hourStep = 1;\n /** minutes change step */\n minuteStep = 5;\n /** seconds changes step */\n secondsStep = 10;\n /** if true works in 12H mode and displays AM/PM. If false works in 24H mode and hides AM/PM */\n showMeridian = true;\n /** meridian labels based on locale */\n meridians = ['AM', 'PM'];\n /** if true hours and minutes fields will be readonly */\n readonlyInput = false;\n /** if true hours and minutes fields will be disabled */\n disabled = false;\n /** if true emptyTime is not marked as invalid */\n allowEmptyTime = false;\n /** if true scroll inside hours and minutes inputs will change time */\n mousewheel = true;\n /** if true the values of hours and minutes can be changed using the up/down arrow keys on the keyboard */\n arrowkeys = true;\n /** if true spinner arrows above and below the inputs will be shown */\n showSpinners = true;\n /** show seconds in timepicker */\n showSeconds = false;\n /** show minutes in timepicker */\n showMinutes = true;\n /** minimum time user can select */\n min?: Date;\n /** maximum time user can select */\n max?: Date;\n /** placeholder for hours field in timepicker */\n hoursPlaceholder = 'HH';\n /** placeholder for minutes field in timepicker */\n minutesPlaceholder = 'MM';\n /** placeholder for seconds field in timepicker */\n secondsPlaceholder = 'SS';\n /** hours aria label */\n ariaLabelHours = 'hours';\n /** minutes aria label */\n ariaLabelMinutes = 'minutes';\n /** seconds aria label */\n ariaLabelSeconds = 'seconds';\n}\n","import { Action } from 'ngx-bootstrap/mini-ngrx';\nimport {\n canChangeHours,\n canChangeMinutes,\n canChangeSeconds,\n canChangeValue,\n timepickerControls\n} from '../timepicker-controls.util';\nimport { TimepickerConfig } from '../timepicker.config';\nimport {\n TimepickerComponentState,\n TimepickerControls\n} from '../timepicker.models';\nimport { changeTime, setTime, isValidLimit } from '../timepicker.utils';\nimport { TimepickerActions } from './timepicker.actions';\n\nexport interface TimepickerState {\n value?: Date;\n config: TimepickerComponentState;\n controls: TimepickerControls;\n}\n\nexport const initialState: TimepickerState = {\n value: void 0,\n config: new TimepickerConfig(),\n controls: {\n canIncrementHours: true,\n canIncrementMinutes: true,\n canIncrementSeconds: true,\n\n canDecrementHours: true,\n canDecrementMinutes: true,\n canDecrementSeconds: true,\n\n canToggleMeridian: true\n }\n};\n\nexport function timepickerReducer(state = initialState, action: Action) {\n switch (action.type) {\n case TimepickerActions.WRITE_VALUE: {\n return Object.assign({}, state, { value: action.payload });\n }\n\n case TimepickerActions.CHANGE_HOURS: {\n if (\n !canChangeValue(state.config, action.payload) ||\n !canChangeHours(action.payload, state.controls)\n ) {\n return state;\n }\n\n const _newTime = changeTime(state.value, { hour: action.payload.step });\n\n if ((state.config.max || state.config.min) && !isValidLimit(state.config, _newTime)) {\n return state;\n }\n\n return Object.assign({}, state, { value: _newTime });\n }\n\n case TimepickerActions.CHANGE_MINUTES: {\n if (\n !canChangeValue(state.config, action.payload) ||\n !canChangeMinutes(action.payload, state.controls)\n ) {\n return state;\n }\n\n const _newTime = changeTime(state.value, { minute: action.payload.step });\n\n if ((state.config.max || state.config.min) && !isValidLimit(state.config, _newTime)) {\n return state;\n }\n\n return Object.assign({}, state, { value: _newTime });\n }\n\n case TimepickerActions.CHANGE_SECONDS: {\n if (\n !canChangeValue(state.config, action.payload) ||\n !canChangeSeconds(action.payload, state.controls)\n ) {\n return state;\n }\n\n const _newTime = changeTime(state.value, {\n seconds: action.payload.step\n });\n\n if ((state.config.max || state.config.min) && !isValidLimit(state.config, _newTime)) {\n return state;\n }\n\n return Object.assign({}, state, { value: _newTime });\n }\n\n case TimepickerActions.SET_TIME_UNIT: {\n if (!canChangeValue(state.config)) {\n return state;\n }\n\n const _newTime = setTime(state.value, action.payload);\n\n return Object.assign({}, state, { value: _newTime });\n }\n\n case TimepickerActions.UPDATE_CONTROLS: {\n const _newControlsState = timepickerControls(state.value, action.payload);\n const _newState: TimepickerState = {\n value: state.value,\n config: action.payload,\n controls: _newControlsState\n };\n\n if (state.config.showMeridian !== _newState.config.showMeridian) {\n if (state.value) {\n _newState.value = new Date(state.value);\n }\n }\n\n return Object.assign({}, state, _newState);\n }\n\n default:\n return state;\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n timepickerReducer,\n TimepickerState,\n initialState\n} from './timepicker.reducer';\nimport { BehaviorSubject } from 'rxjs';\n\nimport { Action, MiniStore, MiniState } from 'ngx-bootstrap/mini-ngrx';\n\n@Injectable({providedIn: 'platform'})\nexport class TimepickerStore extends MiniStore<TimepickerState> {\n constructor() {\n const _dispatcher = new BehaviorSubject<Action>({\n type: '[mini-ngrx] dispatcher init'\n });\n const state = new MiniState<TimepickerState>(\n initialState,\n _dispatcher,\n timepickerReducer\n );\n super(_dispatcher, timepickerReducer, state);\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n forwardRef,\n OnChanges,\n OnDestroy,\n ViewEncapsulation,\n input,\n output\n} from '@angular/core';\n\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { Subscription } from 'rxjs';\n\nimport { ControlValueAccessorModel } from './models';\n\nimport { TimepickerActions } from './reducer/timepicker.actions';\nimport { TimepickerStore } from './reducer/timepicker.store';\nimport { getControlsValue } from './timepicker-controls.util';\nimport { TimepickerConfig } from './timepicker.config';\n\nimport { TimeChangeSource, TimepickerComponentState, TimepickerControls } from './timepicker.models';\n\nimport {\n isHourInputValid,\n isInputLimitValid,\n isInputValid,\n isMinuteInputValid,\n isOneOfDatesEmpty,\n isSecondInputValid,\n isValidDate,\n padNumber,\n parseTime\n} from './timepicker.utils';\n\n\nexport const TIMEPICKER_CONTROL_VALUE_ACCESSOR: ControlValueAccessorModel = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TimepickerComponent),\n multi: true\n};\n\n@Component({\n selector: 'timepicker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [TIMEPICKER_CONTROL_VALUE_ACCESSOR, TimepickerStore, TimepickerActions],\n templateUrl: './timepicker.component.html',\n styles: [`\n .bs-chevron {\n border-style: solid;\n display: block;\n width: 9px;\n height: 9px;\n position: relative;\n border-width: 3px 0px 0 3px;\n }\n\n .bs-chevron-up {\n -webkit-transform: rotate(45deg);\n transform: rotate(45deg);\n top: 2px;\n }\n\n .bs-chevron-down {\n -webkit-transform: rotate(-135deg);\n transform: rotate(-135deg);\n top: -2px;\n }\n\n .bs-timepicker-field {\n width: 65px;\n padding: .375rem .55rem;\n }\n `],\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: []\n})\nexport class TimepickerComponent\n implements ControlValueAccessor,\n TimepickerControls,\n OnChanges,\n OnDestroy {\n /** hours change step */\n hourStep = input<number>(this._config.hourStep);\n /** minutes change step */\n minuteStep = input<number>(this._config.minuteStep);\n /** seconds change step */\n secondsStep = input<number>(this._config.secondsStep);\n /** if true hours and minutes fields will be readonly */\n readonlyInput = input<boolean>(this._config.readonlyInput);\n /** if true hours and minutes fields will be disabled */\n // eslint-disable-next-line @angular-eslint/no-input-rename\n disabledInput = input<boolean>(this._config.disabled, { alias: 'disabled' });\n /** if true scroll inside hours and minutes inputs will change time */\n mousewheel = input<boolean>(this._config.mousewheel);\n /** if true the values of hours and minutes can be changed using the up/down arrow keys on the keyboard */\n arrowkeys = input<boolean>(this._config.arrowkeys);\n /** if true spinner arrows above and below the inputs will be shown */\n showSpinners = input<boolean>(this._config.showSpinners);\n /** if true meridian button will be shown */\n showMeridian = input<boolean>(this._config.showMeridian);\n /** show minutes in timepicker */\n showMinutes = input<boolean>(this._config.showMinutes);\n /** show seconds in timepicker */\n showSeconds = input<boolean>(this._config.showSeconds);\n /** meridian labels based on locale */\n meridians = input<string[]>(this._config.meridians);\n /** minimum time user can select */\n min = input<Date | undefined>(this._config.min);\n /** maximum time user can select */\n max = input<Date | undefined>(this._config.max);\n /** placeholder for hours field in timepicker */\n hoursPlaceholder = input<string>(this._config.hoursPlaceholder);\n /** placeholder for minutes field in timepicker */\n minutesPlaceholder = input<string>(this._config.minutesPlaceholder);\n /** placeholder for seconds field in timepicker */\n secondsPlaceholder = input<string>(this._config.secondsPlaceholder);\n /** emits true if value is a valid date */\n isValid = output<boolean>();\n /** emits value of meridian*/\n meridianChange = output<string>();\n // ui variables\n hours = '';\n minutes = '';\n seconds = '';\n meridian = '';\n disabled = false;\n // min\\max validation for input fields\n invalidHours = false;\n invalidMinutes = false;\n invalidSeconds = false;\n // aria-label variables\n labelHours = 'hours';\n labelMinutes = 'minutes';\n labelSeconds = 'seconds';\n // time picker controls state\n canIncrementHours = true;\n canIncrementMinutes = true;\n canIncrementSeconds = true;\n canDecrementHours = true;\n canDecrementMinutes = true;\n canDecrementSeconds = true;\n canToggleMeridian = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange = Function.prototype;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onTouched = Function.prototype;\n\n config: TimepickerConfig;\n\n // Helper method to convert input signals to TimepickerComponentState\n private getComponentState(): TimepickerComponentState {\n return {\n hourStep: this.hourStep(),\n minuteStep: this.minuteStep(),\n secondsStep: this.secondsStep(),\n readonlyInput: this.readonlyInput(),\n disabled: this.disabled,\n mousewheel: this.mousewheel(),\n arrowkeys: this.arrowkeys(),\n showSpinners: this.showSpinners(),\n showMeridian: this.showMeridian(),\n showSeconds: this.showSeconds(),\n meridians: this.meridians(),\n min: this.min(),\n max: this.max()\n };\n }\n\n // control value accessor methods\n timepickerSub?: Subscription;\n constructor(\n private _config: TimepickerConfig,\n private _cd: ChangeDetectorRef,\n private _store: TimepickerStore,\n private _timepickerActions: TimepickerActions\n ) {\n this.config = _config;\n this.timepickerSub = _store.select(state => state.value)\n .subscribe((value: Date | undefined) => {\n // update UI values if date changed\n this._renderTime(value);\n this.onChange(value);\n\n this._store.dispatch(\n this._timepickerActions.updateControls(getControlsValue(this.getComponentState()))\n );\n });\n\n _store.select(state => state.controls)\n .subscribe((controlsState: TimepickerControls) => {\n const isTimepickerInputValid = isInputValid(this.hours, this.minutes, this.seconds, this.isPM());\n const isValidResult = this.config.allowEmptyTime?\n this.isOneOfDatesIsEmpty() || isTimepickerInputValid\n : isTimepickerInputValid;\n this.isValid.emit(isValidResult);\n Object.assign(this, controlsState);\n _cd.markForCheck();\n });\n }\n\n /** @deprecated - please use `isEditable` instead */\n get isSpinnersVisible(): boolean {\n return this.showSpinners() && !this.readonlyInput();\n }\n\n get isEditable(): boolean {\n return !(this.readonlyInput() || this.disabled);\n }\n\n resetValidation(): void {\n this.invalidHours = false;\n this.invalidMinutes = false;\n this.invalidSeconds = false;\n }\n\n isPM(): boolean {\n return this.showMeridian() && this.meridian === this.meridians()[1];\n }\n\n prevDef($event: Event) {\n $event.preventDefault();\n }\n\n wheelSign($event: WheelEventInit): number {\n return Math.sign($event.deltaY || 0) * -1;\n }\n\n ngOnChanges(): void {\n this._store.dispatch(\n this._timepickerActions.updateControls(getControlsValue(this.getComponentState()))\n );\n }\n\n changeHours(step: number, source: TimeChangeSource = ''): void {\n this.resetValidation();\n this._store.dispatch(this._timepickerActions.changeHours({ step, source }));\n }\n\n changeMinutes(step: number, source: TimeChangeSource = ''): void {\n this.resetValidation();\n this._store.dispatch(\n this._timepickerActions.changeMinutes({ step, source })\n );\n }\n\n changeSeconds(step: number, source: TimeChangeSource = ''): void {\n this.resetValidation();\n this._store.dispatch(\n this._timepickerActions.changeSeconds({ step, source })\n );\n }\n\n updateHours(target?: Partial<EventTarget> | null): void {\n this.resetValidation();\n this.hours = (target as HTMLInputElement).value;\n\n const isTimepickerInputValid = isHourInputValid(this.hours, this.isPM()) && this.isValidLimit();\n const isValidResult = this.config.allowEmptyTime ?\n this.isOneOfDatesIsEmpty() || isTimepickerInputValid\n : isTimepickerInputValid;\n\n if (!isValidResult) {\n this.invalidHours = true;\n this.isValid.emit(false);\n this.onChange(null);\n\n return;\n }\n\n this._updateTime();\n }\n\n updateMinutes(target: Partial<EventTarget> | null) {\n this.resetValidation();\n this.minutes = (target as HTMLInputElement).value;\n\n const isTimepickerInputValid = isMinuteInputValid(this.minutes) && this.isValidLimit();\n const isValidResult = this.config.allowEmptyTime ?\n this.isOneOfDatesIsEmpty() || isTimepickerInputValid\n : isTimepickerInputValid;\n\n if (!isValidResult) {\n this.invalidMinutes = true;\n this.isValid.emit(false);\n this.onChange(null);\n\n return;\n }\n\n this._updateTime();\n }\n\n updateSeconds(target: Partial<EventTarget> | null) {\n this.resetValidation();\n this.seconds = (target as HTMLInputElement).value;\n\n const isTimepickerInputValid = isSecondInputValid(this.seconds) && this.isValidLimit();\n const isValidResult = this.config.allowEmptyTime ?\n this.isOneOfDatesIsEmpty() || isTimepickerInputValid\n : isTimepickerInputValid;\n\n if (!isValidResult) {\n this.invalidSeconds = true;\n this.isValid.emit(false);\n this.onChange(null);\n\n return;\n }\n\n this._updateTime();\n }\n\n isValidLimit(): boolean {\n return isInputLimitValid({\n hour: this.hours,\n minute: this.minutes,\n seconds: this.seconds,\n isPM: this.isPM()\n }, this.max(), this.min());\n }\n\n isOneOfDatesIsEmpty(): boolean {\n return isOneOfDatesEmpty(\n this.hours,\n this.minutes,\n this.seconds);\n }\n\n _updateTime() {\n const _seconds = this.showSeconds() ? this.seconds : void 0;\n const _minutes = this.showMinutes() ? this.minutes : void 0;\n const isTimepickerInputValid = isInputValid(this.hours, _minutes, _seconds, this.isPM());\n const isValidResult = this.config.allowEmptyTime ?\n this.isOneOfDatesIsEmpty() || isTimepickerInputValid\n : isTimepickerInputValid;\n if (!isValidResult) {\n this.isValid.emit(false);\n this.onChange(null);\n\n return;\n }\n\n this._store.dispatch(\n this._timepickerActions.setTime({\n hour: this.hours,\n minute: this.minutes,\n seconds: this.seconds,\n isPM: this.isPM()\n })\n );\n }\n\n toggleMeridian(): void {\n if (!this.showMeridian() || !this.isEditable) {\n return;\n }\n\n const _hoursPerDayHalf = 12;\n this._store.dispatch(\n this._timepickerActions.changeHours({\n step: _hoursPerDayHalf,\n source: ''\n })\n );\n }\n\n /**\n * Write a new value to the element.\n */\n writeValue(obj?: string | Date): void {\n if (isValidDate(obj)) {\n this.resetValidation();\n this._store.dispatch(this._timepickerActions.writeValue(parseTime(obj)));\n } else if (obj == null) {\n this._store.dispatch(this._timepickerActions.writeValue());\n }\n }\n\n /**\n * Set the function to be called when the control receives a change event.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registerOnChange(fn: (_: any) => void): void {\n this.onChange = fn;\n }\n\n /**\n * Set the function to be called when the control receives a touch event.\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /**\n * This function is called when the control status changes to or from \"disabled\".\n * Depending on the value, it will enable or disable the appropriate DOM element.\n *\n * @param isDisabled\n */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this._cd.markForCheck();\n }\n\n ngOnDestroy(): void {\n this.timepickerSub?.unsubscribe();\n }\n\n private _renderTime(value?: string | Date): void {\n if (!value || !isValidDate(value)) {\n this.hours = '';\n this.minutes = '';\n this.seconds = '';\n this.meridian = this.meridians()[0];\n this.meridianChange.emit(this.meridian);\n return;\n }\n\n const _value = parseTime(value);\n if (!_value) {\n return;\n }\n\n const _hoursPerDayHalf = 12;\n let _hours = _value.getHours();\n\n if (this.showMeridian()) {\n this.meridian = this.meridians()[_hours >= _hoursPerDayHalf ? 1 : 0];\n this.meridianChange.emit(this.meridian);\n _hours = _hours % _hoursPerDayHalf;\n // should be 12 PM, not 00 PM\n if (_hours === 0) {\n _hours = _hoursPerDayHalf;\n }\n }\n\n this.hours = padNumber(_hours);\n this.minutes = padNumber(_value.getMinutes());\n this.seconds = padNumber(_value.getUTCSeconds());\n }\n}\n","<table>\n <tbody>\n <tr class=\"text-center\" [hidden]=\"!showSpinners()\">\n <!-- increment hours button-->\n <td>\n <a class=\"btn btn-link\" [class.disabled]=\"!canIncrementHours || !isEditable\"\n (click)=\"changeHours(hourStep())\"\n href=\"javascript:void(0);\"\n ><span class=\"bs-chevron bs-chevron-up\"></span></a>\n </td>\n <!-- divider -->\n @if (showMinutes()) {\n <td> </td>\n }\n <!-- increment minutes button -->\n @if (showMinutes()) {\n <td>\n <a class=\"btn btn-link\" [class.disabled]=\"!canIncrementMinutes || !isEditable\"\n (click)=\"changeMinutes(minuteStep())\"\n href=\"javascript:void(0);\"\n ><span class=\"bs-chevron bs-chevron-up\"></span></a>\n </td>\n }\n <!-- divider -->\n @if (showSeconds()) {\n <td> </td>\n }\n <!-- increment seconds button -->\n @if (showSeconds()) {\n <td>\n <a class=\"btn btn-link\" [class.disabled]=\"!canIncrementSeconds || !isEditable\"\n (click)=\"changeSeconds(secondsStep())\"\n href=\"javascript:void(0);\"\n >\n <span class=\"bs-chevron bs-chevron-up\"></span>\n </a>\n </td>\n }\n <!-- space between -->\n @if (showMeridian()) {\n <td> </td>\n }\n <!-- meridian placeholder-->\n @if (showMeridian()) {\n <td></td>\n }\n </tr>\n <tr>\n <!-- hours -->\n <td class=\"form-group mb-3\" [class.has-error]=\"invalidHours\">\n <input type=\"text\" [class.is-invalid]=\"invalidHours\"\n class=\"form-control text-center bs-timepicker-field\"\n [placeholder]=\"hoursPlaceholder()\"\n maxlength=\"2\"\n [readonly]=\"readonlyInput()\"\n [disabled]=\"disabled\"\n [value]=\"hours\"\n (wheel)=\"prevDef($event);changeHours(hourStep() * wheelSign($event), 'wheel')\"\n (keydown.ArrowUp)=\"changeHours(hourStep(), 'key')\"\n (keydown.ArrowDown)=\"changeHours(-hourStep(), 'key')\"\n (change)=\"updateHours($event.target)\" [attr.aria-label]=\"labelHours\"></td>\n <!-- divider -->\n @if (showMinutes()) {\n <td> : </td>\n }\n <!-- minutes -->\n @if (showMinutes()) {\n <td class=\"form-group mb-3\" [class.has-error]=\"invalidMinutes\">\n <input type=\"text\" [class.is-invalid]=\"invalidMinutes\"\n class=\"form-control text-center bs-timepicker-field\"\n [placeholder]=\"minutesPlaceholder()\"\n maxlength=\"2\"\n [readonly]=\"readonlyInput()\"\n [disabled]=\"disabled\"\n [value]=\"minutes\"\n (wheel)=\"prevDef($event);changeMinutes(minuteStep() * wheelSign($event), 'wheel')\"\n (keydown.ArrowUp)=\"changeMinutes(minuteStep(), 'key')\"\n (keydown.ArrowDown)=\"changeMinutes(-minuteStep(), 'key')\"\n (change)=\"updateMinutes($event.target)\" [attr.aria-label]=\"labelMinutes\">\n </td>\n }\n <!-- divider -->\n @if (showSeconds()) {\n <td> : </td>\n }\n <!-- seconds -->\n @if (showSeconds()) {\n <td class=\"form-group mb-3\" [class.has-error]=\"invalidSeconds\">\n <input type=\"text\" [class.is-invalid]=\"invalidSeconds\"\n class=\"form-control text-center bs-timepicker-field\"\n [placeholder]=\"secondsPlaceholder()\"\n maxlength=\"2\"\n [readonly]=\"readonlyInput()\"\n [disabled]=\"disabled\"\n [value]=\"seconds\"\n (wheel)=\"prevDef($event);changeSeconds(secondsStep() * wheelSign($event), 'wheel')\"\n (keydown.ArrowUp)=\"changeSeconds(secondsStep(), 'key')\"\n (keydown.ArrowDown)=\"changeSeconds(-secondsStep(), 'key')\"\n (change)=\"updateSeconds($event.target)\" [attr.aria-label]=\"labelSeconds\">\n </td>\n }\n <!-- space between -->\n @if (showMeridian()) {\n <td> </td>\n }\n <!-- meridian -->\n @if (showMeridian()) {\n <td>\n <button type=\"button\" class=\"btn btn-default text-center\"\n [disabled]=\"!isEditable || !canToggleMeridian\"\n [class.disabled]=\"!isEditable || !canToggleMeridian\"\n (click)=\"toggleMeridian()\"\n >{{ meridian }}\n </button>\n </td>\n }\n </tr>\n <tr class=\"text-center\" [hidden]=\"!showSpinners()\">\n <!-- decrement hours button-->\n <td>\n <a class=\"btn btn-link\" [class.disabled]=\"!canDecrementHours || !isEditable\"\n (click)=\"changeHours(-hourStep())\"\n href=\"javascript:void(0);\"\n >\n <span class=\"bs-chevron bs-chevron-down\"></span>\n </a>\n </td>\n <!-- divider -->\n @if (showMinutes()) {\n <td> </td>\n }\n <!-- decrement minutes button-->\n @if (showMinutes()) {\n <td>\n <a class=\"btn btn-link\" [class.disabled]=\"!canDecrementMinutes || !isEditable\"\n (click)=\"changeMinutes(-minuteStep())\"\n href=\"javascript:void(0);\"\n >\n <span class=\"bs-chevron bs-chevron-down\"></span>\n </a>\n </td>\n }\n <!-- divider -->\n @if (showSeconds()) {\n <td> </td>\n }\n <!-- decrement seconds button-->\n @if (showSeconds()) {\n <td>\n <a class=\"btn btn-link\" [class.disabled]=\"!canDecrementSeconds || !isEditable\"\n (click)=\"changeSeconds(-secondsStep())\"\n href=\"javascript:void(0);\"\n >\n <span class=\"bs-chevron bs-chevron-down\"></span>\n </a>\n </td>\n }\n <!-- space between -->\n @if (showMeridian()) {\n <td> </td>\n }\n <!-- meridian placeholder-->\n @if (showMeridian()) {\n <td></td>\n }\n </tr>\n </tbody>\n</table>\n","import { NgModule } from '@angular/core';\n\nimport { TimepickerComponent } from './timepicker.component';\n\n@NgModule({\n imports: [TimepickerComponent],\n exports: [TimepickerComponent],\n})\nexport class TimepickerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.TimepickerConfig","i2.TimepickerStore","i3.TimepickerActions"],"mappings":"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