TaskDecay v1.0.0 MVP — smart task review & archive Chrome extension
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const main = document.getElementById('main');
|
||||
const syncStatus = document.getElementById('syncStatus');
|
||||
const countBadge = document.getElementById('countBadge');
|
||||
async function load() {
|
||||
try {
|
||||
const res = await chrome.runtime.sendMessage({ type: 'getReviewTasks' });
|
||||
if (res.error) {
|
||||
syncStatus.textContent = '';
|
||||
renderError(res.error);
|
||||
return;
|
||||
}
|
||||
const review = res.review || [];
|
||||
const total = res.total || 0;
|
||||
const autoArchiveCount = res.autoArchiveCount || 0;
|
||||
syncStatus.textContent = `${total} total tasks synced`;
|
||||
if (review.length === 0) {
|
||||
countBadge.style.display = 'none';
|
||||
renderEmpty();
|
||||
}
|
||||
else {
|
||||
countBadge.textContent = String(review.length);
|
||||
countBadge.style.display = 'inline-block';
|
||||
renderStats(review, autoArchiveCount);
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
syncStatus.textContent = '';
|
||||
renderError(e.message);
|
||||
}
|
||||
}
|
||||
function renderEmpty() {
|
||||
main.innerHTML = `
|
||||
<div class="empty">No decayed tasks found. Great job keeping up!</div>
|
||||
<button class="btn btn-secondary" id="syncBtn">Sync Now</button>
|
||||
<a href="options.html" target="_blank" class="settings">Open Settings</a>
|
||||
`;
|
||||
document.getElementById('syncBtn')?.addEventListener('click', doSync);
|
||||
}
|
||||
function renderError(msg) {
|
||||
main.innerHTML = `
|
||||
<div class="error">${escapeHtml(msg)}</div>
|
||||
<button class="btn btn-secondary" id="syncBtn">Retry Sync</button>
|
||||
<a href="options.html" target="_blank" class="settings">Open Settings</a>
|
||||
`;
|
||||
document.getElementById('syncBtn')?.addEventListener('click', doSync);
|
||||
}
|
||||
function renderStats(review, autoArchiveCount) {
|
||||
const hot = review.filter((r) => r.score.score >= 70).length;
|
||||
const warm = review.filter((r) => r.score.score >= 40 && r.score.score < 70).length;
|
||||
const cold = review.filter((r) => r.score.score < 40).length;
|
||||
const oldest = review.reduce((a, b) => a.score.ageDays > b.score.ageDays ? a : b);
|
||||
main.innerHTML = `
|
||||
<div class="stat-row"><span class="stat-label">Hot (≥70)</span><span class="stat-value hot">${hot}</span></div>
|
||||
<div class="stat-row"><span class="stat-label">Warm (40-69)</span><span class="stat-value warm">${warm}</span></div>
|
||||
<div class="stat-row"><span class="stat-label">Cold (<40)</span><span class="stat-value">${cold}</span></div>
|
||||
<div class="stat-row"><span class="stat-label">Oldest task</span><span class="stat-value">${Math.round(oldest.score.ageDays)} days</span></div>
|
||||
${autoArchiveCount > 0 ? `<div class="stat-row"><span class="stat-label">Auto-archive ready</span><span class="stat-value hot">${autoArchiveCount}</span></div>` : ''}
|
||||
<button class="btn btn-primary" id="reviewBtn">Start Review Session</button>
|
||||
<button class="btn btn-secondary" id="syncBtn">Sync Now</button>
|
||||
<a href="options.html" target="_blank" class="settings">Open Settings</a>
|
||||
`;
|
||||
document.getElementById('reviewBtn')?.addEventListener('click', () => {
|
||||
chrome.runtime.sendMessage({ type: 'openReview' });
|
||||
window.close();
|
||||
});
|
||||
document.getElementById('syncBtn')?.addEventListener('click', doSync);
|
||||
}
|
||||
async function doSync() {
|
||||
const btn = document.getElementById('syncBtn');
|
||||
if (btn)
|
||||
btn.textContent = 'Syncing...';
|
||||
try {
|
||||
const res = await chrome.runtime.sendMessage({ type: 'sync' });
|
||||
if (res.error) {
|
||||
renderError(res.error);
|
||||
return;
|
||||
}
|
||||
await load();
|
||||
}
|
||||
catch (e) {
|
||||
renderError(e.message);
|
||||
}
|
||||
}
|
||||
function escapeHtml(text) {
|
||||
const div = document.createElement('div');
|
||||
div.textContent = text;
|
||||
return div.innerHTML;
|
||||
}
|
||||
load();
|
||||
});
|
||||
export {};
|
||||
Reference in New Issue
Block a user