update: bump 'common' version to 0.1.15

This commit is contained in:
2026-05-26 11:59:46 +08:00
parent b3fadc99f3
commit 7cb59b5122
3 changed files with 213 additions and 192 deletions

View File

@@ -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>