From 339c438e4f9f0fa8373e4ef0fda9c93a85d77d18 Mon Sep 17 00:00:00 2001 From: Chris Brooker Date: Mon, 23 Feb 2026 14:38:21 -0600 Subject: [PATCH 1/3] Add applied indicator to job cards on HTML dashboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Applied job cards now show a green "✓ Applied on [date]" banner across the top, a dark green card background, and a green left border so they stand out immediately from unreviewed jobs. A "Hide Applied" toggle button in the filter bar lets the user focus on jobs not yet submitted. Co-Authored-By: Claude Sonnet 4.6 --- src/applypilot/view.py | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/src/applypilot/view.py b/src/applypilot/view.py index ff42fec..63d952f 100644 --- a/src/applypilot/view.py +++ b/src/applypilot/view.py @@ -76,7 +76,8 @@ def generate_dashboard(output_path: str | None = None) -> str: jobs = conn.execute(""" SELECT url, title, salary, description, location, site, strategy, full_description, application_url, detail_error, - fit_score, score_reasoning + fit_score, score_reasoning, + applied_at, apply_status FROM jobs WHERE fit_score >= 5 ORDER BY fit_score DESC, site, title @@ -178,8 +179,23 @@ def generate_dashboard(output_path: str | None = None) -> str: if apply_url: apply_html = f'Apply' + # Applied indicator + was_applied = j["apply_status"] == "applied" and j["applied_at"] + applied_banner = "" + applied_attr = "" + if was_applied: + try: + from datetime import datetime as _dt + applied_dt = _dt.fromisoformat(j["applied_at"].replace("Z", "+00:00")) + applied_date_str = applied_dt.strftime("%b %-d, %Y") + except (ValueError, AttributeError): + applied_date_str = j["applied_at"][:10] + applied_banner = f'
✓ Applied on {applied_date_str}
' + applied_attr = ' data-applied="true"' + job_sections += f""" -
+
+ {applied_banner}
{score} {title} @@ -291,6 +307,13 @@ def generate_dashboard(output_path: str | None = None) -> str: .hidden {{ display: none !important; }} .job-count {{ color: #94a3b8; font-size: 0.85rem; margin-bottom: 1rem; }} + /* Applied indicator */ + .job-card--applied {{ border-left-color: #10b981 !important; background: #0d2b1e; }} + .job-card--applied:hover {{ box-shadow: 0 4px 16px #10b98133; }} + .applied-banner {{ background: #10b981; color: #022c22; font-size: 0.75rem; font-weight: 700; + padding: 0.3rem 0.75rem; margin: -1rem -1rem 0.75rem -1rem; border-radius: 7px 7px 0 0; + letter-spacing: 0.03em; }} + @media (max-width: 768px) {{ .summary {{ grid-template-columns: repeat(2, 1fr); }} .score-section {{ grid-template-columns: 1fr; }} @@ -319,6 +342,7 @@ def generate_dashboard(output_path: str | None = None) -> str: Search: +
@@ -339,10 +363,11 @@ def generate_dashboard(output_path: str | None = None) -> str: