diff --git a/app/routes/main.py b/app/routes/main.py
index 9739820..dced326 100644
--- a/app/routes/main.py
+++ b/app/routes/main.py
@@ -537,10 +537,15 @@ async def dashboard(request: Request, db: AsyncSession = Depends(get_db)):
session.pop("current_preview_url_hash", None)
# Get user's published papers with subject names (exclude html_content for performance)
+ # Only show the latest version of each scroll series
published_papers = await db.execute(
select(Scroll, Subject.name.label("subject_name"))
.join(Subject)
- .where(Scroll.user_id == current_user.id, Scroll.status == "published")
+ .where(
+ Scroll.user_id == current_user.id,
+ Scroll.status == "published",
+ _latest_version_filter(),
+ )
.options(
load_only(
Scroll.title,
@@ -553,6 +558,7 @@ async def dashboard(request: Request, db: AsyncSession = Depends(get_db)):
Scroll.doi_status,
Scroll.slug,
Scroll.publication_year,
+ Scroll.scroll_series_id,
)
)
.order_by(Scroll.created_at.desc())
diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html
index 034a87e..0e3f8d5 100644
--- a/app/templates/dashboard.html
+++ b/app/templates/dashboard.html
@@ -57,19 +57,27 @@
Your Scrolls ({{ papers|length }})
{% for paper_row in papers %}
{% set paper = paper_row[0] %}
{% set subject_name = paper_row[1] %}
- {{ scroll_card(
- paper.title,
- paper.authors,
- paper.abstract,
- paper.keywords,
- subject_name,
- "recently",
- "v" + paper.version|string,
- paper.url_hash,
- doi=paper.doi,
- doi_status=paper.doi_status,
- canonical_url=paper.canonical_url
- ) }}
+
{% endfor %}
{% else %}
@@ -555,6 +563,41 @@ Delete Account
padding: var(--space-sm) var(--space-md);
font-size: var(--text-sm);
}
+
+.scroll-card-wrapper {
+ border: 1px solid var(--gray-lightest);
+ border-radius: var(--border-radius);
+ overflow: hidden;
+}
+
+.scroll-card-wrapper .scroll.preview {
+ border: none;
+ border-radius: 0;
+}
+
+.scroll-card-actions {
+ padding: 0.5rem 1rem;
+ border-top: 1px solid var(--gray-lightest);
+ background: var(--gray-bg);
+ display: flex;
+ justify-content: flex-end;
+}
+
+.scroll-card-actions .btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.375rem;
+}
+
+@media (max-width: 768px) {
+ .scroll-card-actions {
+ justify-content: center;
+ }
+ .scroll-card-actions .btn {
+ width: 100%;
+ justify-content: center;
+ }
+}