Fixes for site

This commit is contained in:
2026-02-03 13:49:49 -05:00
parent 403d015dbe
commit c2e7ed01b4
9 changed files with 346 additions and 82 deletions

View File

@@ -61,6 +61,16 @@
<!-- System Stats & Reset -->
<div class="col-md-6 mb-4">
<div class="card shadow-sm mb-4">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="fas fa-sliders-h me-2"></i>Configuration</h5>
</div>
<div class="card-body">
<p class="text-muted small">Manage global AI writing rules and banned words.</p>
<a href="{{ url_for('admin_style_guidelines') }}" class="btn btn-outline-primary w-100"><i class="fas fa-spell-check me-2"></i>Edit Style Guidelines</a>
</div>
</div>
<div class="card shadow-sm mb-4">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="fas fa-chart-pie me-2"></i>System Stats</h5>

View File

@@ -0,0 +1,48 @@
{% extends "base.html" %}
{% block content %}
<div class="row justify-content-center">
<div class="col-md-8">
<div class="d-flex justify-content-between align-items-center mb-4">
<h2><i class="fas fa-spell-check me-2 text-primary"></i>Style Guidelines</h2>
<a href="{{ url_for('admin_dashboard') }}" class="btn btn-outline-secondary">Back to Admin</a>
</div>
<div class="card shadow-sm">
<div class="card-body">
<p class="text-muted">
These lists are used by the <strong>Editor Persona</strong> to critique chapters and by the <strong>Writer</strong> to refine text.
The AI will be penalized for using words in these lists.
</p>
<form method="POST">
<div class="mb-4">
<label class="form-label fw-bold text-danger">
<i class="fas fa-ban me-2"></i>Banned "AI-isms" & Clichés
</label>
<div class="form-text mb-2">Common tropes that make text sound robotic (e.g., "testament to", "tapestry"). One per line.</div>
<textarea name="ai_isms" class="form-control font-monospace" rows="10">{{ data.ai_isms|join('\n') }}</textarea>
</div>
<div class="mb-4">
<label class="form-label fw-bold text-warning">
<i class="fas fa-filter me-2"></i>Filter Words
</label>
<div class="form-text mb-2">Words that create distance between the reader and the POV (e.g., "felt", "saw", "realized"). One per line.</div>
<textarea name="filter_words" class="form-control font-monospace" rows="6">{{ data.filter_words|join('\n') }}</textarea>
</div>
<div class="d-grid gap-2">
<button type="submit" class="btn btn-primary btn-lg">
<i class="fas fa-save me-2"></i>Save Guidelines
</button>
<button type="submit" formaction="{{ url_for('optimize_models') }}" class="btn btn-outline-info w-100 mt-2">
<i class="fas fa-magic me-2"></i>Auto-Refresh with AI
</button>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -197,7 +197,16 @@
<div class="d-flex justify-content-between align-items-start mb-2">
<span class="badge bg-light text-dark border">Book {{ book.book_number }}</span>
{% if generated_books.get(book.book_number) %}
<span class="badge bg-success"><i class="fas fa-check me-1"></i>Generated</span>
<div class="btn-group">
<button type="button" class="btn btn-sm btn-success dropdown-toggle" data-bs-toggle="dropdown">
<i class="fas fa-check me-1"></i>Generated
</button>
<ul class="dropdown-menu">
{% set gb = generated_books.get(book.book_number) %}
{% if gb.epub %}<li><a class="dropdown-item" href="/project/{{ gb.run_id }}/download?file={{ gb.epub }}"><i class="fas fa-file-epub me-2"></i>Download EPUB</a></li>{% endif %}
{% if gb.docx %}<li><a class="dropdown-item" href="/project/{{ gb.run_id }}/download?file={{ gb.docx }}"><i class="fas fa-file-word me-2"></i>Download DOCX</a></li>{% endif %}
</ul>
</div>
{% else %}
<span class="badge bg-secondary">Planned</span>
{% endif %}

View File

@@ -109,54 +109,64 @@
</div>
</div>
<div class="row">
<!-- Left Column: Cover Art -->
<div class="col-md-4 mb-4">
<div class="card shadow-sm h-100">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="fas fa-image me-2"></i>Cover Art</h5>
<!-- Generated Books in this Run -->
{% for book in books %}
<div class="card shadow-sm mb-4">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="fas fa-book me-2"></i>{{ book.folder }}</h5>
</div>
<div class="card-body">
<div class="row">
<!-- Left Column: Cover Art -->
<div class="col-md-4 mb-3">
<div class="text-center">
{% if book.cover %}
<img src="{{ url_for('download_artifact', run_id=run.id, file=book.cover) }}" class="img-fluid rounded shadow-sm mb-3" alt="Book Cover" style="max-height: 400px;">
{% else %}
<div class="alert alert-secondary py-5">
<i class="fas fa-image fa-3x mb-3"></i><br>No cover.
</div>
{% endif %}
{% if loop.first %}
<form action="{{ url_for('regenerate_artifacts', run_id=run.id) }}" method="POST" class="mt-2">
<textarea name="feedback" class="form-control mb-2 form-control-sm" rows="1" placeholder="Cover Feedback..."></textarea>
<button type="submit" class="btn btn-sm btn-outline-primary w-100">
<i class="fas fa-sync me-2"></i>Regenerate All
</button>
</form>
{% endif %}
</div>
</div>
<div class="card-body text-center">
{% if has_cover %}
<img src="{{ url_for('download_artifact', run_id=run.id, file='cover.png') }}" class="img-fluid rounded shadow-sm mb-3" alt="Book Cover">
{% else %}
<div class="alert alert-secondary py-5">
<i class="fas fa-image fa-3x mb-3"></i><br>
No cover generated yet.
</div>
{% endif %}
<!-- Right Column: Blurb -->
<div class="col-md-8">
<h6 class="fw-bold">Back Cover Blurb</h6>
<div class="p-3 bg-light rounded mb-3">
{% if book.blurb %}
<p class="mb-0" style="white-space: pre-wrap;">{{ book.blurb }}</p>
{% else %}
<p class="text-muted fst-italic mb-0">No blurb generated.</p>
{% endif %}
</div>
<hr>
<form action="{{ url_for('regenerate_artifacts', run_id=run.id) }}" method="POST">
<label class="form-label text-start w-100 small fw-bold">Regenerate Art & Files</label>
<textarea name="feedback" class="form-control mb-2" rows="2" placeholder="Feedback (e.g. 'Make the font larger', 'Use a darker theme')..."></textarea>
<button type="submit" class="btn btn-primary w-100">
<i class="fas fa-sync me-2"></i>Regenerate
</button>
</form>
<h6 class="fw-bold">Artifacts</h6>
<div class="d-flex flex-wrap gap-2">
{% for art in book.artifacts %}
<a href="{{ url_for('download_artifact', run_id=run.id, file=art.path) }}" class="btn btn-sm btn-outline-success">
<i class="fas fa-download me-1"></i> {{ art.name }}
</a>
{% else %}
<span class="text-muted small">No files found.</span>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
{% endfor %}
<!-- Right Column: Blurb & Stats -->
<div class="col-md-8 mb-4">
<!-- Blurb -->
<div class="card shadow-sm mb-4">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="fas fa-align-left me-2"></i>Blurb</h5>
</div>
<div class="card-body">
{% if blurb %}
<p class="card-text" style="white-space: pre-wrap;">{{ blurb }}</p>
{% else %}
<p class="text-muted fst-italic">Blurb not generated yet.</p>
{% endif %}
</div>
</div>
<!-- Stats -->
<div class="row mb-4">
<div class="row mb-4">
<div class="col-6">
<div class="card shadow-sm text-center">
<div class="card-body">