update: bump 'common' version to 0.1.15
This commit is contained in:
264
index.html
264
index.html
@@ -128,157 +128,151 @@
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<script type="text/javascript">
|
||||
const $ = (selectors) => {
|
||||
return document.querySelector(selectors);
|
||||
};
|
||||
<script type="module">
|
||||
import { default as $, Rpc2, LogRecord } from '/';
|
||||
if (performance.getEntriesByType('navigation')[0].type === 'reload') await Rpc2.invoke('exit');
|
||||
|
||||
const $$ = (selectors) => {
|
||||
return document.querySelectorAll(selectors);
|
||||
};
|
||||
let error = null;
|
||||
let status = null;
|
||||
let { profiles, parameters } = await Rpc2.invoke('context');
|
||||
|
||||
const $$$ = (selectors, event, listener) => {
|
||||
$(selectors).addEventListener(event, listener);
|
||||
};
|
||||
let date = new Date();
|
||||
let day = date.getDay() || 7;
|
||||
$('#datefrom').valueAsNumber = date.setHours(-24 * (day - 1)) - date.getTimezoneOffset() * 60 * 1000;
|
||||
$('#dateto').valueAsNumber = date.setHours(24 * 7) + date.getTimezoneOffset() * 60 * 1000;
|
||||
$('#all').dispatchEvent(new Event('change'));
|
||||
|
||||
function main(profiles, args, status=null, error=null) {
|
||||
$$$('#begin', 'click', async () => {
|
||||
switch (status) {
|
||||
case 'READY':
|
||||
let name = $('#name').value;
|
||||
let options = { profile: name };
|
||||
|
||||
for (let element of $$("input[type='checkbox']:not(.local-only)")) {
|
||||
options[element.id] = element.checked;
|
||||
}
|
||||
$.set('#begin', 'click', async () => {
|
||||
switch (status) {
|
||||
case 'READY':
|
||||
let name = $('#name').value;
|
||||
let options = { profile: name };
|
||||
|
||||
for (let element of $.all("input[type='checkbox']:not(.local-only)")) {
|
||||
options[element.id] = element.checked;
|
||||
}
|
||||
|
||||
for (let element of $$("input[type='date']")) {
|
||||
options[element.id] = element.value;
|
||||
}
|
||||
for (let element of $.all("input[type='date']")) {
|
||||
options[element.id] = element.value;
|
||||
}
|
||||
|
||||
for (let element of $$("input[type='number']")) {
|
||||
args[element.id] = element.valueAsNumber;
|
||||
}
|
||||
for (let element of $.all("input[type='number']")) {
|
||||
parameters[element.id] = element.valueAsNumber;
|
||||
}
|
||||
|
||||
await Rpc2.invoke('begin', options, args);
|
||||
break;
|
||||
case 'RUNNING':
|
||||
await Rpc2.invoke('pause');
|
||||
break;
|
||||
case 'STANDBY':
|
||||
await Rpc2.invoke('resume');
|
||||
break;
|
||||
}
|
||||
});
|
||||
await Rpc2.invoke('begin', options, parameters);
|
||||
break;
|
||||
case 'RUNNING':
|
||||
await Rpc2.invoke('pause');
|
||||
break;
|
||||
case 'STANDBY':
|
||||
await Rpc2.invoke('resume');
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
$$$('#begin', 'click', () => {
|
||||
$('#begin > span.icon').removeAttribute('hidden');
|
||||
$('#begin > span.text').innerText = '';
|
||||
$('#begin').classList.remove('pulse');
|
||||
$('#begin').disabled = true;
|
||||
});
|
||||
$.set('#begin', 'click', () => {
|
||||
$('#begin > span.icon').removeAttribute('hidden');
|
||||
$('#begin > span.text').innerText = '';
|
||||
$('#begin').classList.remove('pulse');
|
||||
$('#begin').disabled = true;
|
||||
});
|
||||
|
||||
$$$('#cancel', 'click', async () => {
|
||||
$('#cancel').disabled = true;
|
||||
await Rpc2.invoke('cancel');
|
||||
});
|
||||
$.set('#cancel', 'click', async () => {
|
||||
$('#cancel').disabled = true;
|
||||
await Rpc2.invoke('cancel');
|
||||
});
|
||||
|
||||
$$$('#skip', 'click', async () => {
|
||||
$('#skip').disabled = true;
|
||||
await Rpcs.invoke('skip');
|
||||
});
|
||||
$.set('#skip', 'click', async () => {
|
||||
$('#skip').disabled = true;
|
||||
await Rpcs.invoke('skip');
|
||||
});
|
||||
|
||||
$$$('#logs', 'change', (e) => {
|
||||
if (e.target.checked) $('#messages').removeAttribute('hidden');
|
||||
else $('#messages').setAttribute('hidden', '');
|
||||
});
|
||||
$.set('#logs', 'change', (e) => {
|
||||
if (e.target.checked) $('#messages').removeAttribute('hidden');
|
||||
else $('#messages').setAttribute('hidden', '');
|
||||
});
|
||||
|
||||
$$$('#name', 'change', (e) => {
|
||||
let p = profiles.find(o => o.name === e.target.value);
|
||||
for (let k of Object.keys(p)) $(`#${k}`)?.setAttribute('value', p[k] ?? '');
|
||||
});
|
||||
$.set('#name', 'change', (e) => {
|
||||
let p = profiles.find(o => o.name === e.target.value);
|
||||
for (let k of Object.keys(p)) $(`#${k}`)?.setAttribute('value', p[k] ?? '');
|
||||
});
|
||||
|
||||
$$$('#all', 'change', (e) => {
|
||||
$('#name').disabled = e.target.checked;
|
||||
});
|
||||
$.set('#all', 'change', (e) => {
|
||||
$('#name').disabled = e.target.checked;
|
||||
});
|
||||
|
||||
for (let item of profiles) {
|
||||
$('#name').add(new Option(item.name, item.name));
|
||||
$('#name').dispatchEvent(new Event('change'));
|
||||
if (parameters['account'] && parameters['password']) {
|
||||
let account = new String(parameters['account']);
|
||||
let name = account.split('@', 1).pop();
|
||||
name = name.charAt(0).toLocaleUpperCase() + name.slice(1);
|
||||
document.title += ` (${name})`;
|
||||
}
|
||||
|
||||
for (let item of profiles) {
|
||||
$('#name').add(new Option(item.name, item.name));
|
||||
$('#name').dispatchEvent(new Event('change'));
|
||||
}
|
||||
|
||||
for (let item of $.all("input[type='number']")) {
|
||||
item.value = parameters[item.id];
|
||||
}
|
||||
|
||||
while (await new Promise(o => setTimeout(o, 1000, true))) {
|
||||
let history = await Rpc2.invoke('history').catch(() => []);
|
||||
let logs = Array.from(history);
|
||||
|
||||
for (let record of logs) {
|
||||
if ($('#messages').childNodes.length >= 500) $('#messages').childNodes.item(0)?.remove();
|
||||
if (record.levelno >= 40) error = record;
|
||||
let message = LogRecord.format(record);
|
||||
let node = document.createTextNode(new String(message).concat('\n'));
|
||||
$('#messages').appendChild(node);
|
||||
$('#messages').scrollTop = $('#messages').scrollHeight;
|
||||
}
|
||||
|
||||
for (let item of $$("input[type='number']")) {
|
||||
item.value = args[item.id];
|
||||
status = await Rpc2.invoke('status').catch(() => null);
|
||||
$('#statusLabel').innerText = status ? status.charAt(0).toUpperCase() + status.slice(1).toLowerCase() : '';
|
||||
|
||||
switch (status) {
|
||||
case 'IDLE':
|
||||
continue;
|
||||
case 'READY':
|
||||
$('#begin > span.text').innerText = 'Begin';
|
||||
$('#begin').classList.remove('pulse');
|
||||
$('#progressLabel').innerText = '';
|
||||
$('#remainingLabel').innerText = '';
|
||||
break;
|
||||
case 'RUNNING':
|
||||
$('#begin > span.text').innerText = 'Pause';
|
||||
$('#begin').classList.add('pulse');
|
||||
|
||||
let progress = await Rpc2.invoke('progress').catch(() => new Object());
|
||||
let { task, number, index, limit } = progress;
|
||||
$('#numberLabel').innerText = number ?? '';
|
||||
$('#progressLabel').innerText = limit ? `${task}, ${parseFloat((index / limit * 100).toFixed(2))}% (${index}/${limit})` : task;
|
||||
|
||||
let [t1, t2] = await Rpc2.invoke('uptime').catch(() => []);
|
||||
$('#uptimeLabel').innerText = Temporal.Duration.from({ seconds: t1 ?? 0 }).round({ largestUnit: 'hours' }).toLocaleString('en', { style: 'digital' });
|
||||
|
||||
let remaining = index && limit && t2 ? Math.floor((limit - index) / (index / t2)) : 0;
|
||||
$('#remainingLabel').innerHTML = remaining ? Temporal.Duration.from({ seconds: remaining }).round({ largestUnit: 'hours' }).toLocaleString('en') : '';
|
||||
break;
|
||||
case 'STANDBY':
|
||||
if (error !== null) {
|
||||
alert(`(${error.levelname}) ${error.msg}\n${error.exc_text ?? ''}`);
|
||||
error = null;
|
||||
}
|
||||
$('#begin > span.text').innerText = 'Resume';
|
||||
$('#begin').classList.remove('pulse');
|
||||
break;
|
||||
}
|
||||
$('#begin > span.icon').setAttribute('hidden', '');
|
||||
$('#begin').disabled = false;
|
||||
|
||||
let date = new Date();
|
||||
let day = date.getDay() || 7;
|
||||
$('#datefrom').valueAsNumber = date.setHours(-24 * (day - 1)) - date.getTimezoneOffset() * 60 * 1000;
|
||||
$('#dateto').valueAsNumber = date.setHours(24 * 7) + date.getTimezoneOffset() * 60 * 1000;
|
||||
$('#all').dispatchEvent(new Event('change'));
|
||||
|
||||
if (args['account'] && args['password']) {
|
||||
let account = new String(args['account']);
|
||||
let name = account.split('@', 1).pop();
|
||||
name = name.charAt(0).toLocaleUpperCase() + name.slice(1);
|
||||
document.title += ` (${name})`;
|
||||
}
|
||||
|
||||
setInterval(async () => {
|
||||
let history = await Rpc2.invoke('history');
|
||||
let logs = Array.from(history);
|
||||
|
||||
for (let record of logs) {
|
||||
if (record.levelno >= 40) error = record;
|
||||
let message = LogRecord.format(record);
|
||||
let node = document.createTextNode(new String(message).concat('\n'));
|
||||
$('#messages').appendChild(node);
|
||||
$('#messages').scrollTop = $('#messages').scrollHeight;
|
||||
}
|
||||
|
||||
status = await Rpc2.invoke('status');
|
||||
$('#statusLabel').innerText = status.charAt(0).toUpperCase() + status.slice(1).toLowerCase();
|
||||
|
||||
switch (status) {
|
||||
case 'IDLE':
|
||||
return;
|
||||
case 'READY':
|
||||
$('#begin > span.text').innerText = 'Begin';
|
||||
$('#begin').classList.remove('pulse');
|
||||
$('#progressLabel').innerText = '';
|
||||
$('#remainingLabel').innerText = '';
|
||||
break;
|
||||
case 'RUNNING':
|
||||
$('#begin > span.text').innerText = 'Pause';
|
||||
$('#begin').classList.add('pulse');
|
||||
|
||||
let progress = await Rpc2.invoke('progress');
|
||||
let { task, number, index, limit } = progress;
|
||||
$('#numberLabel').innerText = number ?? '';
|
||||
$('#progressLabel').innerText = limit ? `${task}, ${parseFloat((index / limit * 100).toFixed(2))}% (${index}/${limit})` : task;
|
||||
|
||||
let [t1, t2] = await Rpc2.invoke('uptime').catch(() => []);
|
||||
$('#uptimeLabel').innerText = Temporal.Duration.from({ seconds: t1 ?? 0 }).round({ largestUnit: 'hours' }).toLocaleString('en', { style: 'digital' });
|
||||
|
||||
let remaining = index && limit && t2 ? Math.floor((limit - index) / (index / t2)) : 0;
|
||||
$('#remainingLabel').innerHTML = remaining ? Temporal.Duration.from({ seconds: remaining }).round({ largestUnit: 'hours' }).toLocaleString('en') : '';
|
||||
break;
|
||||
case 'STANDBY':
|
||||
if (error !== null) {
|
||||
alert(`(${error.levelname}) ${error.msg}\n${error.exc_text ?? ''}`);
|
||||
error = null;
|
||||
}
|
||||
$('#begin > span.text').innerText = 'Resume';
|
||||
$('#begin').classList.remove('pulse');
|
||||
break;
|
||||
}
|
||||
$('#begin > span.icon').setAttribute('hidden', '');
|
||||
$('#begin').disabled = false;
|
||||
|
||||
let actions = await Rpc2.invoke('actions');
|
||||
$('#cancel').disabled = !actions['Cancel'];
|
||||
$('#skip').disabled = !actions['Skip'];
|
||||
}, 1000);
|
||||
let actions = await Rpc2.invoke('actions').catch(() => new Object());
|
||||
$('#cancel').disabled = !actions['Cancel'];
|
||||
$('#skip').disabled = !actions['Skip'];
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -357,4 +351,4 @@ label {
|
||||
opacity: 0.6;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user