fix crawling + correct date/time format
This commit is contained in:
+20
-17
@@ -70,8 +70,8 @@ function updateDaysSummary() {
|
||||
? `${days.length} day(s), ${U.fmtDur(total)} total` + (errors.length ? ` — ${errors.join('; ')}` : '')
|
||||
: errors.join('; ');
|
||||
$('days-summary').className = errors.length ? 'warn' : 'muted';
|
||||
if (days.length && !$('from').value) $('from').value = days[0].date;
|
||||
if (days.length && !$('to').value) $('to').value = days[days.length - 1].date;
|
||||
if (days.length && !$('from').value) U.setField($('from'), days[0].date);
|
||||
if (days.length && !$('to').value) U.setField($('to'), days[days.length - 1].date);
|
||||
}
|
||||
|
||||
$('days').addEventListener('input', () => {
|
||||
@@ -95,7 +95,7 @@ $('parse-raw').addEventListener('click', () => {
|
||||
async function buildPlan() {
|
||||
$('plan-status').textContent = 'Loading Kimai entries…';
|
||||
$('plan-status').className = 'muted';
|
||||
const from = $('from').value, to = $('to').value;
|
||||
const from = U.getField($('from')), to = U.getField($('to'));
|
||||
const days = currentDays().days.filter((d) => (!from || d.date >= from) && (!to || d.date <= to));
|
||||
if (!days.length) throw new Error('No Abacus days in range');
|
||||
|
||||
@@ -134,7 +134,7 @@ function renderPlan() {
|
||||
type: 'checkbox', checked: p.include, disabled: !p.entries.length,
|
||||
onchange: (ev) => { p.include = ev.target.checked; },
|
||||
})),
|
||||
h('td', { class: 'num' }, `${U.weekdayName(p.date)} ${p.date}`),
|
||||
h('td', { class: 'num' }, `${U.weekdayName(p.date)} ${U.fmtDate(p.date)}`),
|
||||
h('td', { class: 'num' }, U.fmtDur(p.target)),
|
||||
h('td', { class: 'num' }, U.fmtDur(p.existingMin)),
|
||||
h('td', { class: 'num' }, p.plannedMin ? U.fmtDur(p.plannedMin) : '—'),
|
||||
@@ -205,13 +205,13 @@ function resetRuleForm(rule = null) {
|
||||
$('rule-form-title').textContent = rule ? `Edit rule “${rule.name}”` : 'New rule';
|
||||
$('r-name').value = rule?.name || '';
|
||||
$('r-hours').value = rule && +rule.minutes ? U.fmtDur(rule.minutes) : '';
|
||||
$('r-start').value = rule?.startTime || '';
|
||||
U.setField($('r-start'), rule?.startTime);
|
||||
$('r-enabled').checked = rule ? rule.enabled : true;
|
||||
$('r-desc').value = rule?.description || '';
|
||||
$('r-every').value = rule?.everyNWeeks || 1;
|
||||
$('r-anchor').value = rule?.anchorDate || '';
|
||||
$('r-from').value = rule?.validFrom || '';
|
||||
$('r-to').value = rule?.validTo || '';
|
||||
U.setField($('r-anchor'), rule?.anchorDate);
|
||||
U.setField($('r-from'), rule?.validFrom);
|
||||
U.setField($('r-to'), rule?.validTo);
|
||||
const wd = rule?.weekdays || [1];
|
||||
$('r-weekdays').querySelectorAll('input').forEach((i) => { i.checked = wd.includes(+i.value); });
|
||||
fillProjectSelect($('r-project'), rule?.project);
|
||||
@@ -227,6 +227,8 @@ $('r-save').addEventListener('click', async () => {
|
||||
const weekdays = [...$('r-weekdays').querySelectorAll('input:checked')].map((i) => +i.value);
|
||||
const err = (m) => { $('r-status').textContent = m; $('r-status').className = 'err'; };
|
||||
if (hoursRaw && !minutes) return err('Invalid hours');
|
||||
const bad = ['r-start', 'r-anchor', 'r-from', 'r-to'].find((id) => $(id).value.trim() && !U.getField($(id)));
|
||||
if (bad) return err(`Invalid ${$(bad).dataset.kind === 'date' ? 'date (dd/mm/yyyy)' : 'time (hh:mm)'}`);
|
||||
if (!weekdays.length) return err('Pick at least one weekday');
|
||||
if (!$('r-project').value || !$('r-activity').value) return err('Pick project and activity');
|
||||
|
||||
@@ -235,14 +237,14 @@ $('r-save').addEventListener('click', async () => {
|
||||
name: $('r-name').value.trim() || 'Rule',
|
||||
enabled: $('r-enabled').checked,
|
||||
weekdays, minutes,
|
||||
startTime: $('r-start').value,
|
||||
startTime: U.getField($('r-start')),
|
||||
project: +$('r-project').value,
|
||||
activity: +$('r-activity').value,
|
||||
description: $('r-desc').value.trim(),
|
||||
everyNWeeks: Math.max(1, +$('r-every').value || 1),
|
||||
anchorDate: $('r-anchor').value,
|
||||
validFrom: $('r-from').value,
|
||||
validTo: $('r-to').value,
|
||||
anchorDate: U.getField($('r-anchor')),
|
||||
validFrom: U.getField($('r-from')),
|
||||
validTo: U.getField($('r-to')),
|
||||
};
|
||||
const i = state.rules.findIndex((r) => r.id === rule.id);
|
||||
if (i >= 0) state.rules[i] = rule; else state.rules.push(rule);
|
||||
@@ -256,7 +258,7 @@ function describeWhen(r) {
|
||||
let s = r.weekdays.map((d) => U.WEEKDAYS[d - 1]).join(', ');
|
||||
if (+r.everyNWeeks > 1) s += ` · every ${r.everyNWeeks} weeks`;
|
||||
if (r.startTime) s += ` @ ${r.startTime}`;
|
||||
if (r.validFrom || r.validTo) s += ` · ${r.validFrom || '…'} → ${r.validTo || '…'}`;
|
||||
if (r.validFrom || r.validTo) s += ` · ${U.fmtDate(r.validFrom) || '…'} → ${U.fmtDate(r.validTo) || '…'}`;
|
||||
return s;
|
||||
}
|
||||
|
||||
@@ -296,7 +298,7 @@ function loadSettingsForm() {
|
||||
$('s-token').value = s.kimaiToken;
|
||||
$('s-desc').value = s.defaultDescription;
|
||||
$('s-tags').value = s.tags;
|
||||
$('s-daystart').value = s.dayStart;
|
||||
U.setField($('s-daystart'), s.dayStart);
|
||||
$('s-skip').checked = s.skipIfRulePresent;
|
||||
$('p-selector').value = s.parse.rowSelector;
|
||||
$('p-mode').value = s.parse.timeMode;
|
||||
@@ -319,7 +321,7 @@ function readSettingsForm() {
|
||||
defaultActivity: +$('s-activity').value || null,
|
||||
defaultDescription: $('s-desc').value.trim(),
|
||||
tags: $('s-tags').value.trim(),
|
||||
dayStart: $('s-daystart').value || '08:00',
|
||||
dayStart: U.getField($('s-daystart')) || '08:00',
|
||||
skipIfRulePresent: $('s-skip').checked,
|
||||
parse: {
|
||||
rowSelector: $('p-selector').value.trim(),
|
||||
@@ -410,13 +412,14 @@ $('s-import').addEventListener('change', async (ev) => {
|
||||
|
||||
/* ---------- init ---------- */
|
||||
(async () => {
|
||||
U.setupFields();
|
||||
const s = await Store.get();
|
||||
state.settings = s.settings;
|
||||
state.rules = s.rules;
|
||||
state.catalog = s.catalog;
|
||||
$('days').value = s.daysText;
|
||||
if (s.extractInfo) {
|
||||
$('extract-info').textContent = `Last extraction: ${s.extractInfo.count} day(s) from ${s.extractInfo.url} at ${new Date(s.extractInfo.at).toLocaleString()}`;
|
||||
$('extract-info').textContent = `Last extraction: ${s.extractInfo.count} day(s) from ${s.extractInfo.url} at ${U.fmtDateTime(new Date(s.extractInfo.at))}`;
|
||||
$('raw-last').textContent = (s.extractInfo.raw || []).join('\n');
|
||||
}
|
||||
loadSettingsForm();
|
||||
@@ -436,7 +439,7 @@ browser.storage.onChanged.addListener((changes) => {
|
||||
}
|
||||
if (changes.extractInfo?.newValue) {
|
||||
const i = changes.extractInfo.newValue;
|
||||
$('extract-info').textContent = `Last extraction: ${i.count} day(s) from ${i.url} at ${new Date(i.at).toLocaleString()}`;
|
||||
$('extract-info').textContent = `Last extraction: ${i.count} day(s) from ${i.url} at ${U.fmtDateTime(new Date(i.at))}`;
|
||||
$('raw-last').textContent = (i.raw || []).join('\n');
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user