@material-extra/timepicker
Version:
Material timepicker component
153 lines • 19.6 kB
JavaScript
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