You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

237 lines
5.7 KiB
JavaScript

function makeDialog(title, text, buttons, additional) {
const $box = document.createElement('div');
$box.className = 'dialog_box';
const $d = document.createElement('div');
$box.append($d);
$d.className = 'ui_col ui_dialog';
if (title) {
const $title = document.createElement('div');
$d.append($title);
$title.className = 'ui_row ui_head';
$title.textContent = title;
}
if (text) {
const $text = document.createElement('div');
$d.append($text);
$text.className = 'ui_row';
const $label = document.createElement('label');
$text.append($label);
$label.className = 'dialog_row';
$label.textContent = text;
}
if (additional) {
const $text = document.createElement('div');
$d.append($text);
$text.className = 'ui_row';
$text.append(additional);
}
if (buttons) {
const $buttons = document.createElement('div');
$d.append($buttons);
$buttons.className = 'ui_row';
$buttons.append(document.createElement('div'));
const $row = document.createElement('div');
$buttons.append($row);
$row.className = 'ui_btn_row';
for (const i of buttons) {
const $btn = document.createElement('button');
$row.append($btn);
$btn.className = 'ui_btn ui_btn_mini';
$btn.textContent = i.text;
$btn.addEventListener('click', i.click);
}
}
document.body.appendChild($box);
return $box;
}
function asyncShowQr($qr, title = null) {
return new Promise(resolve => {
const $box = makeDialog(title, null, [{
text: 'OK',
click: () => {
document.body.removeChild($box);
resolve(true);
}
}], $qr);
});
}
function asyncAlert(text, title = null) {
return new Promise(resolve => {
const $box = makeDialog(title, text, [{
text: 'OK',
click: () => {
document.body.removeChild($box);
resolve(true);
}
}]);
});
}
function asyncConfirm(text, title = null) {
return new Promise(resolve => {
const $box = makeDialog(title, text, [
{
text: lang.pop_yes,
click:() => {
document.body.removeChild($box);
resolve(true);
}
},
{
text: lang.pop_no,
click:() => {
document.body.removeChild($box);
resolve(false);
}
}
]);
});
}
function asyncPrompt(text, placeh = '', title = null) {
return new Promise(resolve => {
const $input = document.createElement('input');
$input.type = 'text';
$input.value = placeh;
$input.className = 'ui_inp';
const $box = makeDialog(title, text, [
{
text: 'OK',
click:() => {
const res = $input.value;
document.body.removeChild($box);
resolve(res);
}
},
{
text: lang.cancel,
click:() => {
document.body.removeChild($box);
resolve(null);
}
}
], $input);
});
}
function makePinDialog(title, canCancel, inputHandler) {
const $box = document.createElement('div');
$box.className = 'dialog_box';
const $d = document.createElement('div');
$box.append($d);
$d.className = 'ui_col ui_dialog';
const $title = document.createElement('div');
$d.append($title);
$title.className = 'ui_row ui_head';
$title.textContent = title;
const $inpRow = document.createElement('div');
$d.append($inpRow);
$inpRow.className = 'ui_row pass_inp_inner';
const $input = document.createElement('input');
$inpRow.append($input);
$input.className = 'ui_inp pass_inp';
$input.type = 'number';
$input.pattern = '[0-9]*';
$input.inputMode = 'numeric';
$d.addEventListener('click', e => {
const $b = e.target;
if (!($b instanceof HTMLButtonElement)) return;
if ($b.classList.contains('pin_cancel')) {
inputHandler(null);
return;
}
if ($b.textContent === '<') $input.value = $input.value.slice(0, -1);
else $input.value += $b.textContent;
inputHandler($input.value);
})
$input.addEventListener('input', () => {
inputHandler($input.value);
});
for (let i = 0; i < 3; i++) {
const $row = document.createElement('div');
$d.append($row);
$row.className = 'ui_row pin_inner';
for (let j = 0; j < 3; j++) {
const $b = document.createElement('button');
$row.append($b);
$b.className = 'ui_btn pin_btn';
$b.textContent = "" + (i * 3 + j + 1);
}
}
const $row = document.createElement('div');
$d.append($row);
$row.className = 'ui_row pin_inner';
{
const $b = document.createElement('button');
$row.append($b);
if (canCancel) {
$b.className = 'ui_btn pin_btn pin_cancel';
$b.textContent = lang.cancel;
} else {
$b.className = 'ui_btn pin_btn pin_no_btn';
}
}
{
const $b = document.createElement('button');
$row.append($b);
$b.className = 'ui_btn pin_btn';
$b.textContent = "0";
}
{
const $b = document.createElement('button');
$row.append($b);
$b.className = 'ui_btn pin_btn pin_red_btn';
$b.textContent = "<";
}
document.body.appendChild($box);
return $box;
}
function asyncAskPin(title, targetPin, canCancel = false) {
return new Promise(resolve => {
const $box = makePinDialog(title, canCancel, value => {
if (value === null || value.hashCode() == targetPin) {
document.body.removeChild($box);
resolve(value !== null);
}
});
});
}
function showPopup(text, color = '#37a93c') {
const $e = document.createElement('div');
$e.className = 'notice';
$e.textContent = text;
$e.style.background = color;
document.body.append($e);
setTimeout(() => { $e.remove(); }, 3500);
}
function showPopupError(text) {
showPopup(text, /*getErrColor()*/'#a93737');
}