UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

361 lines (359 loc) 66.7 kB
/* MIT License Copyright (c) 2019 Temainfo Software Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Input, Component, ViewChild, Output, EventEmitter, Optional, Self, } from '@angular/core'; import { TlLeftPadPipe } from '../internals/pipes/leftpad.pipe'; import { OverlayAnimation } from '../core/directives/overlay-animation'; import { Subscription } from 'rxjs'; import { ValueAccessorBase } from '../input/core/value-accessor'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "../i18n/i18n.service"; import * as i3 from "@angular/common"; import * as i4 from "@angular/cdk/overlay"; import * as i5 from "../input/input"; import * as i6 from "../button/button"; import * as i7 from "../internals/pipes/leftpad.pipe"; export var TIME; (function (TIME) { TIME["MINUTE"] = "minute"; TIME["HOUR"] = "hour"; })(TIME || (TIME = {})); export class TlTimepicker extends ValueAccessorBase { constructor(ngControl, i18n) { super(); this.ngControl = ngControl; this.i18n = i18n; this.format = '24'; this.flatBorder = false; this.showTimeIcon = false; this.label = ''; this.labelPlacement = 'left'; this.labelSize = '100px'; this.height = '23px'; this.readonly = null; this.disabled = null; this.withBorder = true; this.steps = { hour: 1, minute: 1 }; this.availableTimes = []; this.color = 'basic'; this.name = ''; this.isoModel = false; this.min = new Date(1999, 0, 1, 0, 0); this.max = new Date(1999, 0, 1, 23, 59); this.now = new EventEmitter(); this.changeTime = new EventEmitter(); this.confirm = new EventEmitter(); this.cancel = new EventEmitter(); this.isOpen = false; this.nowText = this.i18n.getLocale().TimePicker.now; this.selectedTime = '10:30 AM'; this.minutes = []; this.hours = []; this.minute = 0; this.hour = 0; this.timeZone = 'AM'; this.textConfirm = this.i18n.getLocale().TimePicker.textConfirm; this.textCancel = this.i18n.getLocale().TimePicker.textCancel; this.headerHeight = 45; this.border = 3; this.nullElements = 80; this.itemHeight = 30; this.loaded = false; this.leftPad = new TlLeftPadPipe(); this.listeners = new Subscription(); this.setControl(); } get control() { return this.ngControl?.control; } setControl() { if (this.ngControl) { this.ngControl.valueAccessor = this; } } ngAfterContentInit() { this.handleCreateRing(); if (!this.value) { this.value = new Date(); } this.setModelValue(new Date(this.value)); this.listenControlChanges(); } listenControlChanges() { if (this.control) { this.control.valueChanges.subscribe((date) => { if (!this.loaded) { this.minute = this.leftPad.transform(new Date(date).getMinutes(), 2); this.hour = this.leftPad.transform(new Date(date).getHours(), 2); this.formatTime(); } }); } } handleCreateRing() { this.createHourRing(); this.createMinuteRing(); } createHourRing() { let lastHour = this.min.getHours() - this.steps.hour; for (let i = 0; i <= this.max.getHours(); i++) { if (i === (lastHour + this.steps.hour)) { this.hours.push(i); lastHour = i; } } } createMinuteRing() { let lastMinute = this.min.getMinutes() - this.steps.minute; for (let i = 0; i <= this.max.getMinutes(); i++) { if (i === (lastMinute + this.steps.minute)) { this.minutes.push(i); lastMinute = i; } } } changeOpened() { this.isOpen = !this.isOpen; setTimeout(() => { this.onChangeValue(this.selectedTime); this.loaded = true; }); } setModelValue(value) { if (value instanceof Date) { this.hour = this.leftPad.transform(value.getHours(), 2); this.minute = this.leftPad.transform(value.getMinutes(), 2); this.formatTime(); this.onChangeValue(this.hour + ':' + this.minute); } } onMouseDownContainer($event) { $event.stopPropagation(); } emitClickNow() { this.now.emit(this.isFormat24() ? this.value : { time: this.selectedTime, timeZone: this.timeZone }); } onBlur() { this.propagateTouched(); } onClickNow() { const convert = this.isFormat12() ? this.convertToAmPm(new Date().getHours()) : new Date().getHours(); this.hour = this.leftPad.transform(convert, 2); this.minute = this.leftPad.transform(new Date().getMinutes(), 2); this.formatTime(); this.onChangeValue(this.hour + ':' + this.minute); this.setValue(); this.emitClickNow(); } setValue() { const dateSt = new Date(this.value); const year = dateSt.getFullYear(); const month = dateSt.getMonth(); const date = dateSt.getDate(); const hour = parseInt(this.hour, 10); const minute = parseInt(this.minute, 10); this.value = this.isoModel ? new Date(year, month, date, hour, minute).toISOString() : new Date(year, month, date, hour, minute); } onScrollHour($event) { const scroll = Math.round(($event.target.scrollTop / this.itemHeight)); this.hour = this.steps.hour > 0 ? (scroll * this.steps.hour) : scroll; } onScrollMinutes($event) { const scroll = Math.round(($event.target.scrollTop / this.itemHeight)); this.minute = this.steps.minute > 0 ? (scroll * this.steps.minute) : scroll; } onClickCancel() { this.isOpen = false; this.loaded = false; this.setValue(); this.cancel.emit(this.value); } onClickConfirm() { this.isOpen = false; this.loaded = false; this.setValue(); this.formatTime(); this.confirm.emit(this.value); } onChangeValue(stringTime) { this.selectedTime = stringTime; if (!stringTime) { return; } const split = this.cleanValue(stringTime).split(':'); const hour = split[0]; const min = split[1]; if (min.length >= 2 && hour.length >= 2) { this.hour = this.isFormat12() ? this.leftPad.transform(this.convertToAmPm(hour), 2) : hour; if (this.listHour) { this.setScrollColumn(this.listHour.nativeElement, TIME.HOUR); } this.minute = min; if (this.listMinutes) { this.setScrollColumn(this.listMinutes.nativeElement, TIME.MINUTE); } this.setValue(); } } setScrollColumn(elementScroll, type) { const element = this.getDataIndex(type); if (element) { setTimeout(() => { elementScroll.scrollTop = element.offsetTop - (this.nullElements + this.headerHeight + this.border) - this.itemHeight; }, 100); } } getDataIndex(type) { return type === TIME.HOUR ? this.getItemByDataIndexHour() : this.getItemByDataIndexMinute(); } convertToAmPm(hour) { const timeString = hour + ':00:00'; const hourEnd = timeString.indexOf(':'); const H = +timeString.substr(0, hourEnd); this.timeZone = H < 12 ? 'AM' : 'PM'; this.timeZone === 'AM' ? this.setAm() : this.setPm(); return H % 12 || 12; } getItemByDataIndexMinute() { const strDataIndex = 'div[dataIndexMinute="' + this.minute + '"]'; return document.querySelector(strDataIndex); } getItemByDataIndexHour() { const strDataIndex = 'div[dataIndexHour="' + this.hour + '"]'; return document.querySelector(strDataIndex); } cleanValue(value) { return value.replace(/_/g, ''); } isFormat24() { return this.format === '24'; } isFormat12() { return this.format === '12'; } isTimeZonePM() { return this.timeZone === 'PM'; } isTimeZoneAM() { return this.timeZone === 'AM'; } setMinute(minute) { this.minute = minute; this.formatTime(); this.setValue(); } setHour(hour) { this.hour = hour; this.formatTime(); this.setValue(); } clickListItem(scrollElement, $event) { scrollElement.scrollTop = $event.target.offsetTop - (this.nullElements + this.headerHeight + this.border) - this.itemHeight; } setAm() { this.timeZone = 'AM'; } setPm() { this.timeZone = 'PM'; } onClose() { this.isOpen = false; this.loaded = false; } getFormattedHour() { return this.leftPad.transform(this.hour, 2) + ':' + this.leftPad.transform(this.minute, 2); } formatTime() { this.selectedTime = this.getFormattedHour(); } ngOnChanges(changes) { } ngOnDestroy() { this.listeners.unsubscribe(); } } /** @nocollapse */ TlTimepicker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlTimepicker, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i2.I18nService }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlTimepicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlTimepicker, selector: "tl-timepicker", inputs: { format: "format", flatBorder: "flatBorder", showTimeIcon: "showTimeIcon", label: "label", labelPlacement: "labelPlacement", labelSize: "labelSize", height: "height", readonly: "readonly", disabled: "disabled", withBorder: "withBorder", steps: "steps", availableTimes: "availableTimes", color: "color", name: "name", isoModel: "isoModel", min: "min", max: "max" }, outputs: { now: "now", changeTime: "changeTime", confirm: "confirm", cancel: "cancel" }, viewQueries: [{ propertyName: "listHour", first: true, predicate: ["listHour"], descendants: true }, { propertyName: "listMinutes", first: true, predicate: ["listMinutes"], descendants: true }, { propertyName: "listAmPm", first: true, predicate: ["listAmPm"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"ui-timepicker-wrapper\">\n\n <tl-input (overlayOrigin)=\"trigger = $event\"\n (click)=\"changeOpened()\"\n (keydown.shift.tab)=\"onClose()\"\n (keydown.tab)=\"onClose()\"\n (keydown.enter)=\"onClose()\"\n [mask]=\"'Hh:Mm'\"\n [ngModel]=\"selectedTime\"\n (ngModelChange)=\"onChangeValue($event)\"\n (blur)=\"onBlur()\"\n [flatBorder]=\"flatBorder\"\n [label]=\"label\"\n [labelPlacement]=\"labelPlacement\"\n [labelSize]=\"labelSize\"\n [withBorder]=\"withBorder\"\n [height]=\"height\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [name]=\"name\"\n [textAfter]=\"format === '12' ? timeZone : null\"\n [iconAfter]=\"showTimeIcon ? 'far fa-clock' : null\">\n </tl-input>\n <input notform class=\"hidden-control\" [value]=\"value\">\n\n <ng-template cdkConnectedOverlay\n (backdropClick)=\"onClose()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\">\n <div @overlay [class]=\"'ui-wrapper-content ' + color\" (click)=\"onMouseDownContainer($event)\">\n <div class=\"ui-timepicker-header\">\n <div class=\"ui-selected-time\">\n {{ format === '12' ? (value | date:'hh:mm') : (value | date:'HH:mm') }}\n {{ format === '12' ? timeZone : null }}\n </div>\n <tl-button *ngIf=\"steps.hour === 1 && steps.minute === 1\"\n [flatBorder]=\"true\"\n (click)=\"onClickNow()\"\n [outline]=\"true\"\n [width]=\"'50px'\"\n [text]=\"nowText\"\n [color]=\"'primary'\">\n </tl-button>\n </div>\n <div class=\"ui-title-header\">\n <span class=\"ui-picker-title\">Hour</span>\n <span class=\"ui-picker-title\">Minute</span>\n <span *ngIf=\"format === '12'\" class=\"ui-picker-title\">AM/PM</span>\n </div>\n <div class=\"ui-timepicker-content\">\n <div class=\"ui-transparent-section\"></div>\n <div class=\"ui-controller-section\">\n <span [style.left]=\"format === '24' ? '50%' : '33%'\" class=\"double-dot\">:</span>\n </div>\n <div class=\"ui-hour-content\">\n <div class=\"list\" #listHour (scroll)=\"onScrollHour($event)\">\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div\n class=\"ui-list-item\"\n (click)=\"clickListItem(listHour, $event); setHour(index)\"\n *ngFor=\"let index of hours\"\n [attr.dataIndexHour]=\"index | leftpad:2\"\n [ngClass]=\"{ 'selectedItem': hour === index }\">{{ index | leftpad:2 }}</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n </div>\n </div>\n <div class=\"ui-minute-content\">\n <div class=\"list\" #listMinutes (scroll)=\"onScrollMinutes($event)\">\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div\n class=\"ui-list-item\"\n (click)=\"clickListItem(listMinutes, $event); setMinute(index)\"\n [attr.dataIndexMinute]=\"index | leftpad:2\"\n *ngFor=\"let index of minutes\"\n [ngClass]=\"{ 'selectedItem': minute === index }\">{{ index | leftpad:2 }}</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n </div>\n </div>\n <div *ngIf=\"format === '12'\" class=\"ui-ampm-content\">\n <div class=\"list\" [style.top]=\"isTimeZoneAM() ? 'calc(50% - 23px)' : 'calc(50% - 54px)'\">\n <div [ngClass]=\"{ 'selectedItem': isTimeZoneAM() }\" class=\"ui-list-item\" (click)=\"setAm()\">AM</div>\n <div [ngClass]=\"{ 'selectedItem': isTimeZonePM() }\" class=\"ui-list-item\" (click)=\"setPm()\">PM</div>\n </div>\n </div>\n </div>\n <div class=\"ui-timepicker-footer\">\n <tl-button (click)=\"onClickCancel()\" [flatBorder]=\"true\" [width]=\"'100%'\" [text]=\"textCancel\"></tl-button>\n <tl-button (click)=\"onClickConfirm()\" [flatBorder]=\"true\" [outline]=\"true\" [width]=\"'100%'\" [text]=\"textConfirm\" [color]=\"'primary'\"></tl-button>\n </div>\n </div>\n </ng-template>\n\n</div>\n\n", styles: ["*{box-sizing:border-box}.ui-timepicker-wrapper{position:relative}.ui-timepicker-wrapper .hidden-control{display:none}.ui-wrapper-content{display:flex;flex-direction:column;width:220px;-webkit-user-select:none;user-select:none;cursor:pointer}.ui-wrapper-content>.ui-timepicker-header{display:flex;justify-content:space-between;align-items:center;padding:10px;height:50px}.ui-wrapper-content>.ui-timepicker-header>.ui-selected-time{font-size:1.5em;font-family:Lato,Segoe UI;font-weight:400}.ui-wrapper-content>.ui-timepicker-footer{display:flex;align-items:center;justify-content:space-between;border:1px solid #ccc;background:#fff;padding:10px}.ui-wrapper-content>.ui-timepicker-content{display:flex;flex-direction:row;justify-content:space-around;height:210px}.ui-wrapper-content>.ui-timepicker-content>.ui-transparent-section{width:218px;position:absolute;height:210px;pointer-events:none}.ui-wrapper-content>.ui-timepicker-content>.ui-controller-section{pointer-events:none;height:30px;width:220px;position:absolute;top:calc(50% - 15px);z-index:10}.ui-wrapper-content>.ui-timepicker-content>.ui-controller-section>.double-dot{position:absolute;line-height:25px;font-size:1.2em}.ui-wrapper-content>.ui-timepicker-content>.ui-hour-content{width:100%;display:flex;justify-content:center;transition:background .2s linear}.ui-wrapper-content>.ui-timepicker-content>.ui-minute-content{width:100%;display:flex;justify-content:center;transition:background .2s linear}.ui-wrapper-content>.ui-timepicker-content>.ui-minute-content span{position:absolute}.ui-wrapper-content>.ui-timepicker-content>.ui-ampm-content{width:100%;transition:background .2s linear;position:relative}.ui-wrapper-content>.ui-timepicker-content>.ui-ampm-content>.list{position:absolute;overflow:hidden;transition:top .15s linear;height:60px;top:calc(50% - 23px)}.ui-wrapper-content>.ui-title-header{display:flex;flex-direction:row;justify-content:space-around}.ui-wrapper-content>.ui-title-header>.ui-picker-title{font-size:.8em;color:#505050;font-weight:700}.ui-wrapper-content .list{margin:0;padding:0;width:100%;list-style:none;text-align:center;font-size:1em;scroll-behavior:smooth;scroll-snap-type:y mandatory;overflow:scroll}.ui-wrapper-content .list::-webkit-scrollbar{background:transparent;width:1px}.ui-wrapper-content .list>.ui-list-item{height:30px;font-size:1.2em;scroll-snap-align:center;line-height:30px;font-family:Segoe UI,Lato,\"sans-serif\",Arial}.ui-wrapper-content .selectedItem{font-weight:600}.ui-wrapper-content .list>div:not(.ui-list-item){height:20px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: i5.TlInput, selector: "tl-input", inputs: ["textBefore", "textAfter", "labelPlacement", "labelSize", "name", "label", "color", "iconBefore", "iconAfter", "clearButton", "readonly", "required", "disabled", "autocomplete", "maxlength", "tabindex", "textAlign", "mask", "placeholder", "type", "height", "withBorder", "flatBorder"], outputs: ["clear", "overlayOrigin", "clickAddon", "click", "focus", "blur", "valid", "completeMask"] }, { kind: "component", type: i6.TlButton, selector: "tl-button", inputs: ["text", "iconAddonBefore", "iconAddonAfter", "iconBeforeText", "iconAfterText", "height", "width", "disabled", "flatBorder", "colorIconBefore", "colorIconAfter", "template", "outline", "color", "loaderColor", "isLoading", "indexShortcut", "textLoading"], outputs: ["selected"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "pipe", type: i7.TlLeftPadPipe, name: "leftpad" }], animations: [OverlayAnimation] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlTimepicker, decorators: [{ type: Component, args: [{ selector: 'tl-timepicker', animations: [OverlayAnimation], template: "<div class=\"ui-timepicker-wrapper\">\n\n <tl-input (overlayOrigin)=\"trigger = $event\"\n (click)=\"changeOpened()\"\n (keydown.shift.tab)=\"onClose()\"\n (keydown.tab)=\"onClose()\"\n (keydown.enter)=\"onClose()\"\n [mask]=\"'Hh:Mm'\"\n [ngModel]=\"selectedTime\"\n (ngModelChange)=\"onChangeValue($event)\"\n (blur)=\"onBlur()\"\n [flatBorder]=\"flatBorder\"\n [label]=\"label\"\n [labelPlacement]=\"labelPlacement\"\n [labelSize]=\"labelSize\"\n [withBorder]=\"withBorder\"\n [height]=\"height\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [name]=\"name\"\n [textAfter]=\"format === '12' ? timeZone : null\"\n [iconAfter]=\"showTimeIcon ? 'far fa-clock' : null\">\n </tl-input>\n <input notform class=\"hidden-control\" [value]=\"value\">\n\n <ng-template cdkConnectedOverlay\n (backdropClick)=\"onClose()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\">\n <div @overlay [class]=\"'ui-wrapper-content ' + color\" (click)=\"onMouseDownContainer($event)\">\n <div class=\"ui-timepicker-header\">\n <div class=\"ui-selected-time\">\n {{ format === '12' ? (value | date:'hh:mm') : (value | date:'HH:mm') }}\n {{ format === '12' ? timeZone : null }}\n </div>\n <tl-button *ngIf=\"steps.hour === 1 && steps.minute === 1\"\n [flatBorder]=\"true\"\n (click)=\"onClickNow()\"\n [outline]=\"true\"\n [width]=\"'50px'\"\n [text]=\"nowText\"\n [color]=\"'primary'\">\n </tl-button>\n </div>\n <div class=\"ui-title-header\">\n <span class=\"ui-picker-title\">Hour</span>\n <span class=\"ui-picker-title\">Minute</span>\n <span *ngIf=\"format === '12'\" class=\"ui-picker-title\">AM/PM</span>\n </div>\n <div class=\"ui-timepicker-content\">\n <div class=\"ui-transparent-section\"></div>\n <div class=\"ui-controller-section\">\n <span [style.left]=\"format === '24' ? '50%' : '33%'\" class=\"double-dot\">:</span>\n </div>\n <div class=\"ui-hour-content\">\n <div class=\"list\" #listHour (scroll)=\"onScrollHour($event)\">\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div\n class=\"ui-list-item\"\n (click)=\"clickListItem(listHour, $event); setHour(index)\"\n *ngFor=\"let index of hours\"\n [attr.dataIndexHour]=\"index | leftpad:2\"\n [ngClass]=\"{ 'selectedItem': hour === index }\">{{ index | leftpad:2 }}</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n </div>\n </div>\n <div class=\"ui-minute-content\">\n <div class=\"list\" #listMinutes (scroll)=\"onScrollMinutes($event)\">\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div\n class=\"ui-list-item\"\n (click)=\"clickListItem(listMinutes, $event); setMinute(index)\"\n [attr.dataIndexMinute]=\"index | leftpad:2\"\n *ngFor=\"let index of minutes\"\n [ngClass]=\"{ 'selectedItem': minute === index }\">{{ index | leftpad:2 }}</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n <div>\u00A0</div>\n </div>\n </div>\n <div *ngIf=\"format === '12'\" class=\"ui-ampm-content\">\n <div class=\"list\" [style.top]=\"isTimeZoneAM() ? 'calc(50% - 23px)' : 'calc(50% - 54px)'\">\n <div [ngClass]=\"{ 'selectedItem': isTimeZoneAM() }\" class=\"ui-list-item\" (click)=\"setAm()\">AM</div>\n <div [ngClass]=\"{ 'selectedItem': isTimeZonePM() }\" class=\"ui-list-item\" (click)=\"setPm()\">PM</div>\n </div>\n </div>\n </div>\n <div class=\"ui-timepicker-footer\">\n <tl-button (click)=\"onClickCancel()\" [flatBorder]=\"true\" [width]=\"'100%'\" [text]=\"textCancel\"></tl-button>\n <tl-button (click)=\"onClickConfirm()\" [flatBorder]=\"true\" [outline]=\"true\" [width]=\"'100%'\" [text]=\"textConfirm\" [color]=\"'primary'\"></tl-button>\n </div>\n </div>\n </ng-template>\n\n</div>\n\n", styles: ["*{box-sizing:border-box}.ui-timepicker-wrapper{position:relative}.ui-timepicker-wrapper .hidden-control{display:none}.ui-wrapper-content{display:flex;flex-direction:column;width:220px;-webkit-user-select:none;user-select:none;cursor:pointer}.ui-wrapper-content>.ui-timepicker-header{display:flex;justify-content:space-between;align-items:center;padding:10px;height:50px}.ui-wrapper-content>.ui-timepicker-header>.ui-selected-time{font-size:1.5em;font-family:Lato,Segoe UI;font-weight:400}.ui-wrapper-content>.ui-timepicker-footer{display:flex;align-items:center;justify-content:space-between;border:1px solid #ccc;background:#fff;padding:10px}.ui-wrapper-content>.ui-timepicker-content{display:flex;flex-direction:row;justify-content:space-around;height:210px}.ui-wrapper-content>.ui-timepicker-content>.ui-transparent-section{width:218px;position:absolute;height:210px;pointer-events:none}.ui-wrapper-content>.ui-timepicker-content>.ui-controller-section{pointer-events:none;height:30px;width:220px;position:absolute;top:calc(50% - 15px);z-index:10}.ui-wrapper-content>.ui-timepicker-content>.ui-controller-section>.double-dot{position:absolute;line-height:25px;font-size:1.2em}.ui-wrapper-content>.ui-timepicker-content>.ui-hour-content{width:100%;display:flex;justify-content:center;transition:background .2s linear}.ui-wrapper-content>.ui-timepicker-content>.ui-minute-content{width:100%;display:flex;justify-content:center;transition:background .2s linear}.ui-wrapper-content>.ui-timepicker-content>.ui-minute-content span{position:absolute}.ui-wrapper-content>.ui-timepicker-content>.ui-ampm-content{width:100%;transition:background .2s linear;position:relative}.ui-wrapper-content>.ui-timepicker-content>.ui-ampm-content>.list{position:absolute;overflow:hidden;transition:top .15s linear;height:60px;top:calc(50% - 23px)}.ui-wrapper-content>.ui-title-header{display:flex;flex-direction:row;justify-content:space-around}.ui-wrapper-content>.ui-title-header>.ui-picker-title{font-size:.8em;color:#505050;font-weight:700}.ui-wrapper-content .list{margin:0;padding:0;width:100%;list-style:none;text-align:center;font-size:1em;scroll-behavior:smooth;scroll-snap-type:y mandatory;overflow:scroll}.ui-wrapper-content .list::-webkit-scrollbar{background:transparent;width:1px}.ui-wrapper-content .list>.ui-list-item{height:30px;font-size:1.2em;scroll-snap-align:center;line-height:30px;font-family:Segoe UI,Lato,\"sans-serif\",Arial}.ui-wrapper-content .selectedItem{font-weight:600}.ui-wrapper-content .list>div:not(.ui-list-item){height:20px}\n"] }] }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{ type: Optional }, { type: Self }] }, { type: i2.I18nService }]; }, propDecorators: { format: [{ type: Input }], flatBorder: [{ type: Input }], showTimeIcon: [{ type: Input }], label: [{ type: Input }], labelPlacement: [{ type: Input }], labelSize: [{ type: Input }], height: [{ type: Input }], readonly: [{ type: Input }], disabled: [{ type: Input }], withBorder: [{ type: Input }], steps: [{ type: Input }], availableTimes: [{ type: Input }], color: [{ type: Input }], name: [{ type: Input }], isoModel: [{ type: Input }], min: [{ type: Input }], max: [{ type: Input }], listHour: [{ type: ViewChild, args: ['listHour', { static: false }] }], listMinutes: [{ type: ViewChild, args: ['listMinutes', { static: false }] }], listAmPm: [{ type: ViewChild, args: ['listAmPm', { static: false }] }], now: [{ type: Output }], changeTime: [{ type: Output }], confirm: [{ type: Output }], cancel: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL3RpbWVwaWNrZXIvdGltZXBpY2tlci50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL3RpbWVwaWNrZXIvdGltZXBpY2tlci5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFDTCxLQUFLLEVBRUwsU0FBUyxFQUVULFNBQVMsRUFFVCxNQUFNLEVBQ04sWUFBWSxFQUdELFFBQVEsRUFBRSxJQUFJLEdBQzFCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7QUFRakUsTUFBTSxDQUFOLElBQVksSUFHWDtBQUhELFdBQVksSUFBSTtJQUNkLHlCQUFpQixDQUFBO0lBQ2pCLHFCQUFhLENBQUE7QUFDZixDQUFDLEVBSFcsSUFBSSxLQUFKLElBQUksUUFHZjtBQVFELE1BQU0sT0FBTyxZQUFhLFNBQVEsaUJBQWdDO0lBc0ZoRSxZQUF3QyxTQUFvQixFQUN2QyxJQUFpQjtRQUNwQyxLQUFLLEVBQUUsQ0FBQztRQUY4QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3ZDLFNBQUksR0FBSixJQUFJLENBQWE7UUFyRjdCLFdBQU0sR0FBZ0IsSUFBSSxDQUFDO1FBRTNCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFbkIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFckIsVUFBSyxHQUFHLEVBQUUsQ0FBQztR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RUFBQztnQkFFQSxRQUFRO3NCQUFqRCxTQUFTO3VCQUFFLFVBQVUsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBRTdCLEdBQUc7c0JBQVosTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLE9BQU87c0JBQWhCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiBNSVQgTGljZW5zZVxuXG4gQ29weXJpZ2h0IChjKSAyMDE5IFRlbWFpbmZvIFNvZnR3YXJlXG5cbiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7XG4gIElucHV0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25DaGFuZ2VzLCBPcHRpb25hbCwgU2VsZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUbExlZnRQYWRQaXBlIH0gZnJvbSAnLi4vaW50ZXJuYWxzL3BpcGVzL2xlZnRwYWQucGlwZSc7XG5pbXBvcnQgeyBPdmVybGF5QW5pbWF0aW9uIH0gZnJvbSAnLi4vY29yZS9kaXJlY3RpdmVzL292ZXJsYXktYW5pbWF0aW9uJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi9pMThuL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBWYWx1ZUFjY2Vzc29yQmFzZSB9IGZyb20gJy4uL2lucHV0L2NvcmUvdmFsdWUtYWNjZXNzb3InO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluY3JlbWVudGFsU3RlcHMge1xuICBob3VyOiBudW1iZXI7XG4gIG1pbnV0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgZW51bSBUSU1FIHtcbiAgTUlOVVRFID0gJ21pbnV0ZScsXG4gIEhPVVIgPSAnaG91cidcbn1cblxuQENvbXBvbmVudCgge1xuICBzZWxlY3RvcjogJ3RsLXRpbWVwaWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdGltZXBpY2tlci5odG1sJyxcbiAgc3R5bGVVcmxzOiBbICcuL3RpbWVwaWNrZXIuc2NzcycgXSxcbiAgYW5pbWF0aW9uczogWyBPdmVybGF5QW5pbWF0aW9uIF1cbn0gKVxuZXhwb3J0IGNsYXNzIFRsVGltZXBpY2tlciBleHRlbmRzIFZhbHVlQWNjZXNzb3JCYXNlPERhdGUgfCBzdHJpbmc+IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIGZvcm1hdDogJzEyJyB8ICcyNCcgPSAnMjQnO1xuXG4gIEBJbnB1dCgpIGZsYXRCb3JkZXIgPSBmYWxzZTtcblxuICBASW5wdXQoKSBzaG93VGltZUljb24gPSBmYWxzZTtcblxuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuXG4gIEBJbnB1dCgpIGxhYmVsUGxhY2VtZW50ID0gJ2xlZnQnO1xuXG4gIEBJbnB1dCgpIGxhYmVsU2l6ZSA9ICcxMDBweCc7XG5cbiAgQElucHV0KCkgaGVpZ2h0ID0gJzIzcHgnO1xuXG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gbnVsbDtcblxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IG51bGw7XG5cbiAgQElucHV0KCkgd2l0aEJvcmRlciA9IHRydWU7XG5cbiAgQElucHV0KCkgc3RlcHM6IEluY3JlbWVudGFsU3RlcHMgPSB7IGhvdXI6IDEsIG1pbnV0ZTogMSB9O1xuXG4gIEBJbnB1dCgpIGF2YWlsYWJsZVRpbWVzID0gW107XG5cbiAgQElucHV0KCkgY29sb3IgPSAnYmFzaWMnO1xuXG4gIEBJbnB1dCgpIG5hbWUgPSAnJztcblxuICBASW5wdXQoKSBpc29Nb2RlbCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG1pbjogRGF0ZSA9IG5ldyBEYXRlKCAxOTk5LCAwLCAxLCAwLCAwICk7XG5cbiAgQElucHV0KCkgbWF4OiBEYXRlID0gbmV3IERhdGUoIDE5OTksIDAsIDEsIDIzLCA1OSApO1xuXG4gIEBWaWV3Q2hpbGQoICdsaXN0SG91cicsIHtzdGF0aWM6IGZhbHNlfSApIGxpc3RIb3VyOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoICdsaXN0TWludXRlcycsIHtzdGF0aWM6IGZhbHNlfSApIGxpc3RNaW51dGVzOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoICdsaXN0QW1QbScsIHtzdGF0aWM6IGZhbHNlfSApIGxpc3RBbVBtOiBFbGVtZW50UmVmO1xuXG4gIEBPdXRwdXQoKSBub3c6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2VUaW1lOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgY29uZmlybTogRXZlbnRFbWl0dGVyPERhdGUgfCBzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigp