fix: remove moments from recent cards, pin footer to bottom of card

This commit is contained in:
jlightner 2026-04-03 05:14:17 +00:00
parent 00cb865507
commit caedc9c224
4 changed files with 19 additions and 26 deletions

View file

@ -42,8 +42,9 @@ Four issues identified with root causes already diagnosed:
| 2 | Mobile job cards show vertical text ("C h e e") | `.pipeline-video__creator` missing overflow rules (App.css:4477) | Add `overflow: hidden; text-overflow: ellipsis; white-space: nowrap` (matches `.pipeline-video__filename` pattern) | | 2 | Mobile job cards show vertical text ("C h e e") | `.pipeline-video__creator` missing overflow rules (App.css:4477) | Add `overflow: hidden; text-overflow: ellipsis; white-space: nowrap` (matches `.pipeline-video__filename` pattern) |
| 3 | No stage direction chevrons | Pipeline stages listed without visual flow indicator | Add CSS chevron/arrow between stage indicators using `::after` pseudo-elements or inline SVG | | 3 | No stage direction chevrons | Pipeline stages listed without visual flow indicator | Add CSS chevron/arrow between stage indicators using `::after` pseudo-elements or inline SVG |
| 4 | Filter text box should be replaced with button group | Current text input for status filter; should be "ALL \| Not Started \| In Progress \| Complete" buttons, end-aligned | Replace `<input>` with `<div className="filter-buttons">` flexbox, `justify-content: flex-end`, verify vertical alignment against adjacent elements | | 4 | Filter text box should be replaced with button group | Current text input for status filter; should be "ALL \| Not Started \| In Progress \| Complete" buttons, end-aligned | Replace `<input>` with `<div className="filter-buttons">` flexbox, `justify-content: flex-end`, verify vertical alignment against adjacent elements |
| 5 | Creators dropdown never populates (422 error) | Frontend requests `fetchCreators({ limit: 200 })` but backend validates `le=100` (line 1126) | Change to `limit: 100` |
**Verification:** Test collapse toggle on most-recent run, resize to 375px and check creator name truncation, confirm chevrons render between stages, confirm filter buttons align right and sit level with row. **Verification:** Test collapse toggle on most-recent run, resize to 375px and check creator name truncation, confirm chevrons render between stages, confirm filter buttons align right and sit level with row, confirm creator filter dropdown populates.
--- ---
@ -135,8 +136,8 @@ Recommended execution order: **S01 → S02 → S03 → S04 → S05 → S06**
## Out of Scope (for this milestone) ## Out of Scope (for this milestone)
- Creator landing page redesign (depends on backend social links API — see M017) - Creator landing page redesign (depends on backend social links API — see backend session workplan)
- Auto-avatar images (backend-gated — see M017) - Auto-avatar images (backend-gated — see backend session workplan)
- Embed tab (needs backend investigation first — see M017) - Embed tab (needs backend investigation first — see backend session workplan)
- Any backend Python changes - Any backend Python changes
- M015 S04/S05 leftovers (trending searches block, admin dropdown hover) — should be completed by M015's own GSD session first - M015 S04/S05 leftovers (trending searches block, admin dropdown hover) — should be completed by M015's own GSD session first

View file

@ -1,14 +1,14 @@
# M017: Backend Performance & Creator Features # Backend Performance & Creator Features — Session Workplan
> **Stream:** Backend — intended for a separate Claude Code session (not GSD) > **Stream:** Backend — run in a separate Claude Code session while GSD executes M016
> **Conflict zone:** `backend/` only + one frontend API client fix > **Conflict zone:** `backend/` only — zero frontend changes
> **Deploy cadence:** commit-build-redeploy after each task group > **Deploy cadence:** commit-build-redeploy after each task group
--- ---
## Goal ## Goal
Fix critical performance bottlenecks in the admin pipeline API, implement auto-avatar fetching for creators, and lay the backend groundwork for creator landing page improvements. Almost entirely backend Python — minimal frontend changes. Fix critical performance bottlenecks in the admin pipeline API, implement auto-avatar fetching for creators, and lay the backend groundwork for creator landing page improvements. Purely backend Python — no frontend changes (the creators 422 fix moved to M016 S02).
--- ---
@ -31,11 +31,8 @@ stats = await asyncio.to_thread(inspector.stats) or {}
Also consider: reduce inspect timeout to 0.5s, add Redis cache with 10-15s TTL to avoid repeated slow calls. Also consider: reduce inspect timeout to 0.5s, add Redis cache with 10-15s TTL to avoid repeated slow calls.
**Impact:** Page load drops from ~3s to ~50ms. **Impact:** Page load drops from ~3s to ~50ms.
#### 1b. Fix creators endpoint 422 error #### ~~1b. Fix creators endpoint 422 error~~ → Moved to M016 S02
**File (frontend):** `frontend/src/pages/AdminPipeline.tsx` line 1126 The frontend `fetchCreators({ limit: 200 })` fix (AdminPipeline.tsx line 1126) is now part of M016's pipeline UI fixes slice, since that slice already owns AdminPipeline.tsx.
**File (backend):** `backend/routers/creators.py` line 28
**Problem:** Frontend requests `fetchCreators({ limit: 200 })` but backend validates `le=100`. Returns 422 on every pipeline page load — creator filter dropdown never populates.
**Fix:** Change frontend call to `limit: 100`. (This is the ONE frontend file touch in this stream.)
--- ---
@ -141,24 +138,23 @@ As each endpoint is touched, also consider:
| File | What changes | | File | What changes |
|------|-------------| |------|-------------|
| `backend/routers/pipeline.py` | worker-status async fix, stale-pages rewrite, videos pagination, avatar endpoints | | `backend/routers/pipeline.py` | worker-status async fix, stale-pages rewrite, videos pagination, avatar admin endpoints |
| `backend/routers/creators.py` | Creator detail expansion, social links | | `backend/routers/creators.py` | Creator detail expansion, social links, admin editing |
| `backend/routers/techniques.py` | Related techniques optimization | | `backend/routers/techniques.py` | Related techniques optimization |
| `backend/models.py` | Creator model additions (avatar, social_links, bio) | | `backend/models.py` | Creator model additions (avatar, social_links, bio) |
| `backend/schemas.py` | New response schemas | | `backend/schemas.py` | New response schemas |
| `backend/services/avatar.py` | New — TheAudioDB integration | | `backend/services/avatar.py` | New — TheAudioDB integration |
| `backend/tasks.py` | New avatar fetch task | | `backend/tasks.py` | New avatar fetch task |
| `alembic/versions/014_*.py` | Migration for creator columns | | `alembic/versions/014_*.py` | Migration for creator columns |
| `frontend/src/pages/AdminPipeline.tsx` | Line 1126 only — fix limit: 200 → 100 |
--- ---
## Merge Coordination with M016 ## Merge Coordination with M016
These two streams are designed to have minimal file overlap: These two streams have **zero file overlap:**
- **M016 touches:** `App.css`, `Home.tsx`, `TechniquePage.tsx`, `TableOfContents.tsx`, `AdminPipeline.tsx` (CSS/JSX only), new frontend components, static assets - **M016 touches:** `frontend/src/` only — `App.css`, `Home.tsx`, `TechniquePage.tsx`, `TableOfContents.tsx`, `AdminPipeline.tsx`, new frontend components, static assets
- **M017 touches:** `backend/` (routers, models, schemas, services, tasks), `alembic/`, one line in `AdminPipeline.tsx` - **This session touches:** `backend/` only — routers, models, schemas, services, tasks, `alembic/`
The single conflict point is `AdminPipeline.tsx` — M017's creators limit fix (line 1126) vs M016's pipeline UI fixes (collapse bug at line 729, filter buttons, chevrons). Resolve by merging M017's one-liner first, then M016's broader changes on top. No merge conflicts expected. The creators 422 fix (the former single overlap point) now lives in M016 S02.
For the avatar/social-links frontend wiring: M017 ships the API, M016 (or a follow-up) consumes it. No conflict — just sequencing. For avatar/social-links frontend wiring: this session ships the API, M016 (or a follow-up) consumes it. No conflict — just sequencing.

View file

@ -1619,6 +1619,7 @@ a.app-footer__repo:hover {
align-items: center; align-items: center;
gap: 0.5rem; gap: 0.5rem;
flex-wrap: wrap; flex-wrap: wrap;
flex: 1;
} }
.recent-card__summary { .recent-card__summary {

View file

@ -330,11 +330,6 @@ export default function Home() {
<span className="recent-card__creator"> <span className="recent-card__creator">
{t.creator_name || ''} {t.creator_name || ''}
</span> </span>
{t.key_moment_count > 0 && (
<span className="recent-card__moments">
{t.key_moment_count} moment{t.key_moment_count !== 1 ? 's' : ''}
</span>
)}
{t.created_at && ( {t.created_at && (
<span className="recent-card__date"> <span className="recent-card__date">
{new Date(t.created_at).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} {new Date(t.created_at).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}