UNPKG

@material-extra/timepicker

Version:
153 lines 19.6 kB
import { Directive, EventEmitter, HostListener, Output } from '@angular/core'; import * as i0 from "@angular/core"; export class MateTimepickerFace { constructor() { this.innerClockFaceSize = 40; this.switchClock = new EventEmitter(); this.enterPress = new EventEmitter(); } onChange(value) { } onFinish() { } onMousedown(e) { e.preventDefault(); this.moved = false; this.selected = false; this.isStarted = true; } onClick(e) { e.preventDefault(); this.selectTime(e); this.isStarted = false; this.selected = false; this.onFinish(); } onTouchend(e) { this.selectTime(e); if (this.moved) { this.isStarted = false; this.moved = false; this.selected = false; this.onFinish(); } } onMove(e) { this.moved = true; this.selectTime(e); } selectTime(e) { if (!this.isStarted && (e instanceof MouseEvent && e.type !== 'click')) { return; } const clockFaceCords = this.clockFace.nativeElement.getBoundingClientRect(); const centerX = clockFaceCords.left + clockFaceCords.width / 2; const centerY = clockFaceCords.top + clockFaceCords.height / 2; const arc = Math.atan(Math.abs(e.clientX - centerX) / Math.abs(e.clientY - centerY)) * 180 / Math.PI; const circleAngle = this.countAngleByCords(centerX, centerY, e.clientX, e.clientY, arc); const isInnerClockChosen = !!this.innerValues && this.isInnerClockFace(centerX, centerY, e.clientX, e.clientY, ((clockFaceCords.height + clockFaceCords.width) / 4) - this.innerClockFaceSize); let index = this.roundAngle(circleAngle); index = index < 0 ? 0 : index; const value = isInnerClockChosen ? this.innerValues[index % this.innerValues.length] : this.outerValues[index % this.outerValues.length]; this.onChange(value); this.selected = true; } onMouseup(e) { e.preventDefault(); this.isStarted = false; if (this.selected) { this.selected = false; this.onFinish(); } } roundAngle(angle) { return Math.round(angle / this.step); } isInnerClockFace(x0, y0, x, y, border) { return Math.sqrt(Math.pow(x - x0, 2) + Math.pow(y - y0, 2)) < border; } countAngleByCords(x0, y0, x, y, currentAngle) { if (y > y0 && x >= x0) { return 180 - currentAngle; } else if (y > y0 && x < x0) { return 180 + currentAngle; } else if (y < y0 && x < x0) { return 360 - currentAngle; } else { // I quarter return currentAngle; } } valueChange(add) { } onKeydown(event) { switch (event.code) { case 'ArrowLeft': this.switchClock.emit('left'); return; case 'ArrowRight': this.switchClock.emit('right'); return; case 'PageUp': case 'ArrowUp': this.valueChange(1); return; case 'PageDown': case 'ArrowDown': this.valueChange(-1); return; case 'Home': this.switchClock.emit('start'); return; case 'End': this.switchClock.emit('end'); return; case 'Enter': case 'Space': this.enterPress.emit(); return; default: return; } } } MateTimepickerFace.ɵfac = function MateTimepickerFace_Factory(t) { return new (t || MateTimepickerFace)(); }; MateTimepickerFace.ɵdir = i0.ɵɵdefineDirective({ type: MateTimepickerFace, selectors: [["mate-timepicker-face"]], hostBindings: function MateTimepickerFace_HostBindings(rf, ctx) { if (rf & 1) { i0.ɵɵlistener("mousedown", function MateTimepickerFace_mousedown_HostBindingHandler($event) { return ctx.onMousedown($event); })("click", function MateTimepickerFace_click_HostBindingHandler($event) { return ctx.onClick($event); })("touchend", function MateTimepickerFace_touchend_HostBindingHandler($event) { return ctx.onTouchend($event.changedTouches[0]); })("mousemove", function MateTimepickerFace_mousemove_HostBindingHandler($event) { return ctx.onMove($event); })("touchmove", function MateTimepickerFace_touchmove_HostBindingHandler($event) { return ctx.onMove($event.changedTouches[0]); })("mouseup", function MateTimepickerFace_mouseup_HostBindingHandler($event) { return ctx.onMouseup($event); })("mouseup", function MateTimepickerFace_mouseup_HostBindingHandler($event) { return ctx.onMouseup($event); }, false, i0.ɵɵresolveDocument)("keydown", function MateTimepickerFace_keydown_HostBindingHandler($event) { return ctx.onKeydown($event); }, false, i0.ɵɵresolveDocument); } }, outputs: { switchClock: "switchClock", enterPress: "enterPress" } }); /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(MateTimepickerFace, [{ type: Directive, args: [{ selector: 'mate-timepicker-face' }] }], null, { switchClock: [{ type: Output }], enterPress: [{ type: Output }], onMousedown: [{ type: HostListener, args: ['mousedown', ['$event']] }], onClick: [{ type: HostListener, args: ['click', ['$event']] }], onTouchend: [{ type: HostListener, args: ['touchend', ['$event.changedTouches[0]']] }], onMove: [{ type: HostListener, args: ['mousemove', ['$event']] }, { type: HostListener, args: ['touchmove', ['$event.changedTouches[0]']] }], onMouseup: [{ type: HostListener, args: ['mouseup', ['$event']] }, { type: HostListener, args: ['document:mouseup', ['$event']] }], onKeydown: [{ type: HostListener, args: ['document:keydown', ['$event']] }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci1mYWNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJEOi9Eb2N1bWVudHMvTGlicmFyeS9Bbmd1bGFyL21hdGVyaWFsLWV4dGVuZC9wcm9qZWN0cy9tYXRlcmlhbC90aW1lcGlja2VyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi90aW1lcGlja2VyLWZhY2UvdGltZXBpY2tlci1mYWNlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDOztBQUd4RixNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBVVcsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBR3hCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUd6QyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztLQWlJaEQ7SUEvSEcsUUFBUSxDQUFDLEtBQWE7SUFDdEIsQ0FBQztJQUVELFFBQVE7SUFDUixDQUFDO0lBR0QsV0FBVyxDQUFDLENBQTBCO1FBQ2xDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBR0QsT0FBTyxDQUFDLENBQWE7UUFDakIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFHRCxVQUFVLENBQUMsQ0FBUTtRQUNmLElBQUksQ0FB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RUFBRSxDQUFDLDBCQUEwQixDQUFDO1lBYXRELE1BQU07a0JBRkwsWUFBWTttQkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7O2tCQUNwQyxZQUFZO21CQUFDLFdBQVcsRUFBRSxDQUFDLDBCQUEwQixDQUFDO1lBNkJ2RCxTQUFTO2tCQUZSLFlBQVk7bUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDOztrQkFDbEMsWUFBWTttQkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQWtDNUMsU0FBUztrQkFEUixZQUFZO21CQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdtYXRlLXRpbWVwaWNrZXItZmFjZSd9KVxyXG5leHBvcnQgY2xhc3MgTWF0ZVRpbWVwaWNrZXJGYWNlIHtcclxuICAgIHByaXZhdGUgbW92ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIHNlbGVjdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBpc1N0YXJ0ZWQ6IGJvb2xlYW47XHJcblxyXG4gICAgcHVibGljIHN0ZXA6IG51bWJlcjtcclxuICAgIHB1YmxpYyBvdXRlclZhbHVlczogbnVtYmVyW107XHJcbiAgICBwdWJsaWMgaW5uZXJWYWx1ZXM/OiBudW1iZXJbXTtcclxuICAgIHB1YmxpYyBjbG9ja0ZhY2U6IEVsZW1lbnRSZWY7XHJcbiAgICBwdWJsaWMgaW5uZXJDbG9ja0ZhY2VTaXplID0gNDA7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgc3dpdGNoQ2xvY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBlbnRlclByZXNzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIG9uQ2hhbmdlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIH1cclxuXHJcbiAgICBvbkZpbmlzaCgpIHtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxyXG4gICAgb25Nb3VzZWRvd24oZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5tb3ZlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzU3RhcnRlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxyXG4gICAgb25DbGljayhlOiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0VGltZShlKTtcclxuICAgICAgICB0aGlzLmlzU3RhcnRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9uRmluaXNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcigndG91Y2hlbmQnLCBbJyRldmVudC5jaGFuZ2VkVG91Y2hlc1swXSddKVxyXG4gICAgb25Ub3VjaGVuZChlOiBUb3VjaCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0VGltZShlKTtcclxuICAgICAgICBpZiAodGhpcy5tb3ZlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzU3RhcnRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm1vdmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5vbkZpbmlzaCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZW1vdmUnLCBbJyRldmVudCddKVxyXG4gICAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0nXSlcclxuICAgIG9uTW92ZShlOiBNb3VzZUV2ZW50IHwgVG91Y2gpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1vdmVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNlbGVjdFRpbWUoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0VGltZShlOiBNb3VzZUV2ZW50IHwgVG91Y2gpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNTdGFydGVkICYmIChlIGluc3RhbmNlb2YgTW91c2VFdmVudCAmJiBlLnR5cGUgIT09ICdjbGljaycpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2xvY2tGYWNlQ29yZHMgPSB0aGlzLmNsb2NrRmFjZS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICBjb25zdCBjZW50ZXJYID0gY2xvY2tGYWNlQ29yZHMubGVmdCArIGNsb2NrRmFjZUNvcmRzLndpZHRoIC8gMjtcclxuICAgICAgICBjb25zdCBjZW50ZXJZID0gY2xvY2tGYWNlQ29yZHMudG9wICsgY2xvY2tGYWNlQ29yZHMuaGVpZ2h0IC8gMjtcclxuICAgICAgICBjb25zdCBhcmMgPSBNYXRoLmF0YW4oTWF0aC5hYnMoZS5jbGllbnRYIC0gY2VudGVyWCkgLyBNYXRoLmFicyhlLmNsaWVudFkgLSBjZW50ZXJZKSkgKiAxODAgLyBNYXRoLlBJO1xyXG4gICAgICAgIGNvbnN0IGNpcmNsZUFuZ2xlID0gdGhpcy5jb3VudEFuZ2xlQnlDb3JkcyhjZW50ZXJYLCBjZW50ZXJZLCBlLmNsaWVudFgsIGUuY2xpZW50WSwgYXJjKTtcclxuICAgICAgICBjb25zdCBpc0lubmVyQ2xvY2tDaG9zZW4gPSAhIXRoaXMuaW5uZXJWYWx1ZXMgJiYgdGhpcy5pc0lubmVyQ2xvY2tGYWNlKGNlbnRlclgsIGNlbnRlclksIGUuY2xpZW50WCwgZS5jbGllbnRZLFxyXG4gICAgICAgICAgICAoKGNsb2NrRmFjZUNvcmRzLmhlaWdodCArIGNsb2NrRmFjZUNvcmRzLndpZHRoKSAvIDQpIC0gdGhpcy5pbm5lckNsb2NrRmFjZVNpemUpO1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMucm91bmRBbmdsZShjaXJjbGVBbmdsZSk7XHJcbiAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyAwIDogaW5kZXg7XHJcblxyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXNJbm5lckNsb2NrQ2hvc2VuID8gdGhpcy5pbm5lclZhbHVlc1tpbmRleCAlIHRoaXMuaW5uZXJWYWx1ZXMubGVuZ3RoXSA6XHJcbiAgICAgICAgICAgIHRoaXMub3V0ZXJWYWx1ZXNbaW5kZXggJSB0aGlzLm91dGVyVmFsdWVzLmxlbmd0aF07XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZXVwJywgWyckZXZlbnQnXSlcclxuICAgIG9uTW91c2V1cChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLmlzU3RhcnRlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5vbkZpbmlzaCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJvdW5kQW5nbGUoYW5nbGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoYW5nbGUgLyB0aGlzLnN0ZXApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNJbm5lckNsb2NrRmFjZSh4MDogbnVtYmVyLCB5MDogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgYm9yZGVyOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHggLSB4MCwgMikgKyBNYXRoLnBvdyh5IC0geTAsIDIpKSA8IGJvcmRlcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvdW50QW5nbGVCeUNvcmRzKHgwOiBudW1iZXIsIHkwOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyLCBjdXJyZW50QW5nbGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKHkgPiB5MCAmJiB4ID49IHgwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxODAgLSBjdXJyZW50QW5nbGU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh5ID4geTAgJiYgeCA8IHgwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxODAgKyBjdXJyZW50QW5nbGU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh5IDwgeTAgJiYgeCA8IHgwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAzNjAgLSBjdXJyZW50QW5nbGU7XHJcbiAgICAgICAgfSBlbHNlIHsvLyBJIHF1YXJ0ZXJcclxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRBbmdsZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdmFsdWVDaGFuZ2UoYWRkOiBudW1iZXIpIHtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICAgIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xyXG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hDbG9jay5lbWl0KCdsZWZ0Jyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hDbG9jay5lbWl0KCdyaWdodCcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBjYXNlICdQYWdlVXAnOlxyXG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UoMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UoLTEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBjYXNlICdIb21lJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoQ2xvY2suZW1pdCgnc3RhcnQnKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgY2FzZSAnRW5kJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoQ2xvY2suZW1pdCgnZW5kJyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcclxuICAgICAgICAgICAgY2FzZSAnU3BhY2UnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbnRlclByZXNzLmVtaXQoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19