151 lines
4.2 KiB
JavaScript
151 lines
4.2 KiB
JavaScript
import { OptionBase, Popup, createElement } from "../ui";
|
|
|
|
export default class Signature extends OptionBase {
|
|
_var = {
|
|
/**
|
|
* @private
|
|
* @type {HTMLCanvasElement}
|
|
*/
|
|
canvas: null,
|
|
/**
|
|
* @private
|
|
* @type {Popup}
|
|
*/
|
|
popup: null,
|
|
isDrawing: false,
|
|
/**
|
|
* @private
|
|
* @type {{x: number, y: number}[]}
|
|
*/
|
|
points: [],
|
|
/**
|
|
* @private
|
|
* @type {{x: number, y: number}[][]}
|
|
*/
|
|
allPoints: []
|
|
};
|
|
|
|
/**
|
|
* @event
|
|
* @type {(this: Signature, singature: string) => void}
|
|
*/
|
|
onSignatured;
|
|
|
|
constructor(opt = {}) {
|
|
super(opt);
|
|
}
|
|
|
|
async show() {
|
|
const popup = new Popup({
|
|
title: this.r('FLTL_02770', 'Signature'),
|
|
content: this._var.canvas = createElement('canvas', canvas => {
|
|
canvas.style.width = '100%';
|
|
canvas.style.height = '100%';
|
|
}),
|
|
resolve: result => {
|
|
if (result.result === 'ok' && this._var.allPoints.length > 0) {
|
|
if (typeof this.onSignatured === 'function') {
|
|
const data = this._var.canvas.toDataURL('image/png');
|
|
this.onSignatured(data);
|
|
}
|
|
} else {
|
|
if (typeof this.onSignatured === 'function') {
|
|
this.onSignatured();
|
|
}
|
|
}
|
|
},
|
|
buttons: [
|
|
{
|
|
text: this.r('FLTL_02057', 'OK'),
|
|
trigger: () => {
|
|
if (this._var.allPoints.length === 0) {
|
|
return false;
|
|
}
|
|
return 'ok';
|
|
}
|
|
},
|
|
{
|
|
text: this.r('FLTL_02479', 'Reset'),
|
|
trigger: () => {
|
|
const ctx = this._var.canvas.getContext('2d');
|
|
ctx.clearRect(0, 0, this._var.canvas.width, this._var.canvas.height);
|
|
return false
|
|
}
|
|
},
|
|
{ text: this.r('FLTL_00499', 'Cancel') }
|
|
]
|
|
});
|
|
this._var.popup = popup;
|
|
popup.create();
|
|
popup.container.classList.add('ui-popup-signature');
|
|
const mask = await popup.show();
|
|
this.init();
|
|
return mask;
|
|
}
|
|
|
|
init() {
|
|
const canvas = this._var.canvas;
|
|
canvas.width = canvas.clientWidth;
|
|
canvas.height = canvas.clientHeight;
|
|
const ctx = canvas.getContext('2d');
|
|
ctx.lineWidth = 3;
|
|
ctx.strokeStyle = '#000';
|
|
|
|
canvas.addEventListener('mousedown', e => this._down(ctx, e.offsetX, e.offsetY), false);
|
|
canvas.addEventListener('mousemove', e => this._move(ctx, e.offsetX, e.offsetY), false);
|
|
canvas.addEventListener('mouseup', () => this._up(ctx), false);
|
|
}
|
|
|
|
/**
|
|
* @private
|
|
* @param {CanvasRenderingContext2D} ctx
|
|
* @param {number} x1
|
|
* @param {number} y1
|
|
* @param {number} x2
|
|
* @param {number} y2
|
|
*/
|
|
_draw(ctx, x1, y1, x2, y2) {
|
|
ctx.moveTo(x1, y1);
|
|
ctx.lineTo(x2, y2);
|
|
ctx.stroke();
|
|
}
|
|
|
|
/**
|
|
* @private
|
|
* @param {CanvasRenderingContext2D} ctx
|
|
* @param {number} x
|
|
* @param {number} y
|
|
*/
|
|
_down(ctx, x, y) {
|
|
this._var.isDrawing = true;
|
|
this._var.points.push({ x, y });
|
|
ctx.beginPath();
|
|
}
|
|
|
|
/**
|
|
* @private
|
|
* @param {CanvasRenderingContext2D} ctx
|
|
* @param {number} x
|
|
* @param {number} y
|
|
*/
|
|
_move(ctx, x, y) {
|
|
if (this._var.isDrawing) {
|
|
const lastPoint = this._var.points.at(-1);
|
|
this._draw(ctx, lastPoint.x, lastPoint.y, x, y);
|
|
this._var.points.push({ x, y });
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @private
|
|
* @param {CanvasRenderingContext2D} ctx
|
|
*/
|
|
_up(ctx) {
|
|
if (this._var.isDrawing) {
|
|
this._var.isDrawing = false;
|
|
ctx.closePath();
|
|
this._var.allPoints.push(this._var.points);
|
|
this._var.points = [];
|
|
}
|
|
}
|
|
} |