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 - ) }} +
+ {{ 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 + ) }} +
+ + + Upload New Version + +
+
{% 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; + } +}