← back to AbramsOS
views/deadlines.ejs
45 lines
<%- include('partials/header', { title: 'Deadlines' }) %>
<section class="page-head">
<div>
<h1>Deadlines</h1>
<p class="subtle">Everything time-sensitive across AbramsOS — bill due dates, reorder points, warranty & return windows, recall actions. Regenerated on each visit.</p>
</div>
</section>
<% if (!deadlines.length) { %>
<section class="empty glass"><p>Nothing due in the window. Add <a href="/bills">bills</a> or <a href="/reorders">reorders</a> with due dates and they'll appear here.</p></section>
<% } else { %>
<section class="deadline-list">
<% deadlines.forEach(d => {
const over = d.days_until < 0;
const soon = d.days_until >= 0 && d.days_until <= 7; %>
<article class="deadline glass<%= over ? ' overdue' : '' %>" data-id="<%= d.id %>">
<div class="dl-when">
<% if (over) { %><span class="badge red"><%= Math.abs(d.days_until) %>d overdue</span>
<% } else if (soon) { %><span class="badge amber">in <%= d.days_until %>d</span>
<% } else { %><span class="badge">in <%= d.days_until %>d</span><% } %>
<div class="dl-date"><%= new Date(d.due_at).toLocaleDateString(undefined, { weekday:'short', month:'short', day:'numeric' }) %></div>
</div>
<div class="dl-body">
<h3><%= d.title %></h3>
<% if (d.body) { %><p class="subtle"><%= d.body %></p><% } %>
<span class="chip"><%= d.reason_code.replace(/_/g, ' ') %></span>
</div>
<button class="btn small" data-dismiss="<%= d.id %>">Dismiss</button>
</article>
<% }) %>
</section>
<% } %>
<script>
document.querySelectorAll('[data-dismiss]').forEach((btn) => {
btn.addEventListener('click', async () => {
const res = await fetch(`/api/reminders/${btn.dataset.dismiss}/dismiss`, { method: 'POST' });
if (res.ok) btn.closest('.deadline').remove(); else alert('Dismiss failed');
});
});
</script>
<%- include('partials/footer', {}) %>