fix: task slicing limit calculation
This commit is contained in:
+21
-23
@@ -173,11 +173,11 @@
|
||||
<div class="inline-flex">
|
||||
<div class="pure-u-1-2">
|
||||
<label for="offset">Offset</label>
|
||||
<input id="offset" class="slicing local-only pure-u-23-24" type="number" min="0" disabled/>
|
||||
<input id="offset" class="slicing local-only pure-u-23-24" type="number" min="0" value="0" disabled/>
|
||||
</div>
|
||||
<div class="pure-u-1-2">
|
||||
<label for="limit">Max. (limit)</label>
|
||||
<input id="limit" class="slicing local-only pure-u-23-24" type="number" readonly disabled/>
|
||||
<input id="limit" class="slicing local-only pure-u-23-24" type="number" min="0" value="0" readonly disabled/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -188,8 +188,8 @@
|
||||
<script type="module">
|
||||
import { default as $, LogRecord, Rpc2 } from '/';
|
||||
|
||||
let limit = 0;
|
||||
let length = 0;
|
||||
let major = 0;
|
||||
let minor = 0;
|
||||
let busy = false;
|
||||
let status = null;
|
||||
let locale = null;
|
||||
@@ -199,7 +199,7 @@ let filereader = null;
|
||||
let subcategories = [];
|
||||
|
||||
window.addEventListener('beforeunload', (e) => {
|
||||
writable?.abort().catch(() => void 0);
|
||||
writable?.abort();
|
||||
Rpc2.notify('exit');
|
||||
e.preventDefault();
|
||||
e.returnValue = '';
|
||||
@@ -234,7 +234,7 @@ async function handlePrimaryButtonClick() {
|
||||
|
||||
let [file, buffer] = await filereader().catch(e => alert('(ERROR) ' + new String(e ?? 'Unable to read data')));
|
||||
writable = await handle.createWritable().catch(() => null);
|
||||
limit = await Rpc2.invoke('ready', file.name, new Uint8Array(buffer).toBase64());
|
||||
major = await Rpc2.invoke('ready', file.name, new Uint8Array(buffer).toBase64());
|
||||
$.get('#fileLabel').innerText = file.name;
|
||||
$.get('#fromLabel').innerText = parameters.account;
|
||||
$.all('.columns').forEach(e => e.dispatchEvent(new Event('change')));
|
||||
@@ -265,7 +265,7 @@ async function handlePrimaryButtonClick() {
|
||||
|
||||
if (options.slice) {
|
||||
options.start = $('#offset').valueAsNumber * $('#chunksize').valueAsNumber + 2;
|
||||
options.limit = length;
|
||||
options.limit = Math.min(minor || major, $('#chunksize').valueAsNumber);
|
||||
options.subcategories = subcategories.length > 0 ? subcategories: null;
|
||||
}
|
||||
|
||||
@@ -374,26 +374,19 @@ $.set('#groupby', 'change', (e) => {
|
||||
$.set('#subcategory', 'change', (e) => {
|
||||
if (!unique) return;
|
||||
subcategories = Array.from(e.target.options).filter(o => o.selected).map(o => o.value);
|
||||
length = Object.entries(unique).filter(([k]) => subcategories.includes(k)).reduce((o, [_, v]) => o + v, 0);
|
||||
minor = Object.entries(unique).filter(([k]) => subcategories.includes(k)).reduce((o, [_, v]) => o + v, 0);
|
||||
$('#chunksize').dispatchEvent(new Event('change'));
|
||||
});
|
||||
|
||||
$.set('#chunksize', 'change', (e) => {
|
||||
let n = length || limit;
|
||||
let size = Math.floor(n / e.target.valueAsNumber);
|
||||
$('#limit').value = size;
|
||||
$('#offset').max = size;
|
||||
let limit = minor || major - 1;
|
||||
let value = Math.floor(limit / e.target.valueAsNumber);
|
||||
$('#limit').value = value;
|
||||
$('#offset').max = value;
|
||||
$('#offset').value = 0;
|
||||
$('#offset').dispatchEvent(new Event('change'));
|
||||
});
|
||||
|
||||
$.set('#offset', 'change', (e) => {
|
||||
let n = length || limit;
|
||||
let size = $('#chunksize').valueAsNumber;
|
||||
let offset = n - size * e.target.valueAsNumber;
|
||||
length = Math.min(size, offset);
|
||||
});
|
||||
|
||||
for (let item of Array.from(locales)) {
|
||||
$('#locale').add(new Option(item.name.toUpperCase(), item.name));
|
||||
$('#locale').dispatchEvent(new Event('change'));
|
||||
@@ -455,16 +448,21 @@ while (await new Promise(o => setTimeout(o, 1000, true))) {
|
||||
$('#send').classList.add('pulse');
|
||||
$('#timezoneLabel').innerText = Temporal.Now.zonedDateTimeISO(locale.timezone).toLocaleString(locale.name);
|
||||
|
||||
let { done, email, subject, recipient } = await Rpc2.invoke('progress').catch(() => new Object());
|
||||
$('#progressLabel').innerText = `${parseFloat(done / (length || limit) * 100).toFixed(2)}% (${done}/${length || limit})`
|
||||
let { done, skip, email, subject, recipient } = await Rpc2.invoke('progress').catch(() => new Object());
|
||||
let index = done + skip;
|
||||
let limit = minor || major - 1;
|
||||
let chunk = $('#chunksize').valueAsNumber;
|
||||
let total = $('#slice').checked ? Math.min(chunk, limit - chunk * $('#offset').valueAsNumber) : limit;
|
||||
|
||||
$('#progressLabel').innerText = `${parseFloat(index / total * 100).toFixed(2)}% (${index}/${total})`
|
||||
$('#subjectLabel').innerText = subject ?? '';
|
||||
$('#recipientLabel').innerText = recipient ? `${recipient} <${email}>` : email ?? '';
|
||||
|
||||
let uptime = await Rpc2.invoke('uptime').catch(() => 0);
|
||||
$('#uptimeLabel').innerText = Temporal.Duration.from({ seconds: uptime }).round({ largestUnit: 'hours' }).toLocaleString('en', { style: 'digital' });
|
||||
|
||||
let rate = done / uptime
|
||||
let remaining = done ? Math.floor(((length || limit) - done) / rate) : 0;
|
||||
let rate = index / uptime
|
||||
let remaining = index ? Math.floor((total - index) / rate) : 0;
|
||||
$('#remainingLabel').innerText = remaining ? `${Temporal.Duration.from({ seconds: remaining }).round({ largestUnit: 'hours' }).toLocaleString('en')} (${rate.toFixed(2)}/min)` : '';
|
||||
break;
|
||||
case 'STANDBY':
|
||||
|
||||
Reference in New Issue
Block a user