saving progress

This commit is contained in:
bolade
2025-08-11 14:46:35 +01:00
commit ca7df9d598
12 changed files with 1498 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Email Alerts</title>
<link rel="stylesheet" href="/static/styles.css" />
</head>
<body>
<header>
<div class="inner">
<h1>Email Alerts</h1>
<nav>
<a href="/">Threads</a>
<a href="/config">Config</a>
</nav>
</div>
</header>
<main class="container">
{% block content %}{% endblock %}
</main>
</body>
</html>
+90
View File
@@ -0,0 +1,90 @@
{% extends "base.html" %}
{% block content %}
<div class="row mb-2">
<div class="col">
<h2>Configuration</h2>
{% if saved %}
<p class="badge success">Saved</p>
{% endif %}
<p class="muted">Edit core settings for triage, time frames, and processing.</p>
</div>
</div>
<form class="card" method="post" action="/config">
<h3>General</h3>
<div class="row">
<div class="col">
<label>Email Address<br>
<input type="email" name="email_address" value="{{ cfg.email_address }}" />
</label>
</div>
<div class="col">
<label>Days Back to Fetch<br>
<input type="number" name="email_days_back" min="1" max="60" value="{{ cfg.email_days_back }}" />
</label>
</div>
</div>
<div class="row mt-1">
<div class="col">
<label>Agency Domains (comma or newline separated)<br>
<textarea name="agency_domains" rows="3">{{ cfg.agency_domains | join(', ') }}</textarea>
</label>
</div>
</div>
<h3 class="mt-2">Zoho (optional)</h3>
<div class="row">
<div class="col">
<label>Zoho Email<br>
<input type="text" name="zoho_email" value="{{ cfg.zoho_email }}" />
</label>
</div>
<div class="col">
<label>Zoho App Password<br>
<input type="password" name="zoho_app_password" value="{{ cfg.zoho_app_password }}" />
</label>
</div>
</div>
<h3 class="mt-2">Processing</h3>
<div class="row">
<div class="col">
<label><input type="checkbox" name="auto_process" {% if cfg.auto_process %}checked{% endif %}/> Auto Process</label>
</div>
<div class="col">
<label>Process Interval (minutes)<br>
<input type="number" name="auto_process_interval" min="1" max="360" value="{{ cfg.auto_process_interval }}" />
</label>
</div>
</div>
<h3 class="mt-2">Alert Time Frames</h3>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>Name</th>
<th>Hours</th>
<th>Alert Level</th>
</tr>
</thead>
<tbody>
{% set frames = cfg.time_frames %}
{% for i in rows %}
{% set row = frames[i] if frames and i < frames|length else None %}
<tr>
<td><input type="text" name="time_name_{{ i }}" value="{{ row.name if row else '' }}" /></td>
<td><input type="number" name="time_hours_{{ i }}" min="0" max="168" value="{{ row.hours if row else '' }}" /></td>
<td><input type="number" name="time_alert_{{ i }}" min="0" max="10" value="{{ row.alert_level if row else '' }}" /></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="right mt-2">
<button type="submit">Save</button>
</div>
</form>
{% endblock %}
+51
View File
@@ -0,0 +1,51 @@
{% extends "base.html" %}
{% block content %}
<div class="row mb-2">
<div class="col">
<h2>Thread #{{ thread.id }}</h2>
<p class="muted">Subject: <strong>{{ thread.subject }}</strong></p>
<p class="muted">Account: <span class="badge">{{ thread.account_email }}</span></p>
<p>
{% if thread.requires_reply %}
<span class="badge warn">Needs reply</span>
{% else %}
<span class="badge success">Up to date</span>
{% endif %}
</p>
</div>
</div>
<div class="row">
<div class="col">
<div class="card">
<h3>AI Analysis</h3>
<p>
<strong>Actionable:</strong>
{% if ai.actionable %}<span class="badge warn">Yes</span>{% else %}<span class="badge success">No</span>{% endif %}
</p>
<p><strong>Summary:</strong> {{ ai.summary }}</p>
<p class="muted">Confidence: {{ ai.confidence }} • Model: {{ ai.model }}</p>
</div>
</div>
</div>
<div class="row mt-2">
<div class="col">
<h3>Messages</h3>
<div class="messages">
{% for m in messages %}
<div class="msg-item {% if m.is_incoming %}incoming{% else %}outgoing{% endif %}">
<div class="msg-bubble">
<div class="msg-meta">{{ m.date_sent }} • {% if m.is_incoming %}Incoming{% else %}Outgoing{% endif %} • {{ m.folder }}</div>
<div class="msg-meta">From: <span class="pill">{{ m.from_email }}</span> → To: <span class="pill">{{ m.to_email }}</span></div>
<div class="msg-subject">{{ m.subject }}</div>
<div class="msg-body"><pre>{{ m.body }}</pre></div>
</div>
</div>
{% else %}
<p class="muted">No messages.</p>
{% endfor %}
</div>
</div>
</div>
{% endblock %}
+44
View File
@@ -0,0 +1,44 @@
{% extends "base.html" %}
{% block content %}
<div class="row mb-2">
<div class="col">
<h2>Threads{% if account %} for {{ account }}{% endif %}</h2>
<p class="muted">Latest updated threads. Click an ID to view details and AI analysis.</p>
</div>
</div>
<div class="card table-wrap">
<table>
<thead>
<tr>
<th>ID</th>
<th>Subject</th>
<th>Account</th>
<th>Msgs</th>
<th>Requires Reply</th>
<th>Updated</th>
</tr>
</thead>
<tbody>
{% for t in threads %}
<tr>
<td><a href="/thread/{{ t.id }}">{{ t.id }}</a></td>
<td>{{ t.subject }}</td>
<td><span class="badge">{{ t.account_email }}</span></td>
<td><span class="badge brand">{{ t.messages|length }}</span></td>
<td>
{% if t.requires_reply %}
<span class="badge warn">Needs reply</span>
{% else %}
<span class="badge success">Up to date</span>
{% endif %}
</td>
<td class="muted">{{ t.updated_at }}</td>
</tr>
{% else %}
<tr><td colspan="6">No threads yet</td></tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}