Article triage UI — tabs, Clear, and Restore #96

Closed
opened 2026-03-18 14:48:56 +01:00 by myrmidex · 0 comments
Owner

Summary

Rework the articles page into a tabbed triage interface for managing route_articles (per-route approval).

Architecture context (from #85)

Approval status now lives on RouteArticle (not Article). Each article can have multiple route_articles — one per route. The triage UI works with route_articles, not articles directly.

Tabs

  • Pending: All route_articles with approval_status = pending. This is the main working view — route_articles awaiting review. Each row shows article title + route name (feed → channel) so it's clear what you're approving.
  • All: Every route_article regardless of status (pending, approved, rejected). Searchable. Shows declined/archived route_articles.

When per-route keyword filtering is enabled (#85), non-matching articles are auto-rejected at ingest, so only relevant route_articles appear in Pending.

Clear button

  • Lives on the Pending tab
  • Rejects all currently visible pending route_articles (calls RouteArticle::reject())
  • Confirmation dialog before executing ("Reject all X pending route articles?")

Restore button

  • Available on rejected route_articles in the All tab
  • Moves a rejected route_article back to pending status
  • Route_article will re-appear in the Pending tab

Approve button

  • Available on pending route_articles
  • Calls RouteArticle::approve() which sets approval_status = approved and dispatches RouteArticleApproved event → triggers PublishApprovedArticleListener to publish to that route's channel

Display

  • Each row shows: article title, route name (feed → channel), approval status badge, validated_at timestamp
  • Link to original article URL
  • Single flat list (not nested by route) — all route_articles visible at once

Tasks

  • Create new Livewire component for route_article triage (or repurpose Articles component)
  • Add tab navigation (Pending / All)
  • Pending tab: shows only pending route_articles with article title + route name
  • All tab: shows all route_articles with status indicator, searchable
  • Approve button on pending route_articles (calls RouteArticle::approve())
  • Clear button on Pending tab with confirmation dialog (bulk reject)
  • Restore button on rejected route_articles in All tab
  • API endpoints for route_article approve/reject (see #98)
  • Tests for approve, bulk reject (Clear), and restore functionality
  • Tests for tab filtering logic

Dependencies

  • Depends on #85 (Configurable article validation rules) — done
  • Depends on #98 (RouteArticle API endpoints)
## Summary Rework the articles page into a tabbed triage interface for managing route_articles (per-route approval). ## Architecture context (from #85) Approval status now lives on `RouteArticle` (not Article). Each article can have multiple route_articles — one per route. The triage UI works with route_articles, not articles directly. ## Tabs - **Pending**: All route_articles with `approval_status = pending`. This is the main working view — route_articles awaiting review. Each row shows article title + route name (feed → channel) so it's clear what you're approving. - **All**: Every route_article regardless of status (pending, approved, rejected). Searchable. Shows declined/archived route_articles. When per-route keyword filtering is enabled (#85), non-matching articles are auto-rejected at ingest, so only relevant route_articles appear in Pending. ## Clear button - Lives on the **Pending** tab - Rejects all currently visible pending route_articles (calls `RouteArticle::reject()`) - Confirmation dialog before executing ("Reject all X pending route articles?") ## Restore button - Available on rejected route_articles in the **All** tab - Moves a rejected route_article back to `pending` status - Route_article will re-appear in the Pending tab ## Approve button - Available on pending route_articles - Calls `RouteArticle::approve()` which sets `approval_status = approved` and dispatches `RouteArticleApproved` event → triggers `PublishApprovedArticleListener` to publish to that route's channel ## Display - Each row shows: article title, route name (feed → channel), approval status badge, validated_at timestamp - Link to original article URL - Single flat list (not nested by route) — all route_articles visible at once ## Tasks - [ ] Create new Livewire component for route_article triage (or repurpose Articles component) - [ ] Add tab navigation (Pending / All) - [ ] Pending tab: shows only `pending` route_articles with article title + route name - [ ] All tab: shows all route_articles with status indicator, searchable - [ ] Approve button on pending route_articles (calls `RouteArticle::approve()`) - [ ] Clear button on Pending tab with confirmation dialog (bulk reject) - [ ] Restore button on rejected route_articles in All tab - [ ] API endpoints for route_article approve/reject (see #98) - [ ] Tests for approve, bulk reject (Clear), and restore functionality - [ ] Tests for tab filtering logic ## Dependencies - Depends on #85 (Configurable article validation rules) — ✅ done - Depends on #98 (RouteArticle API endpoints)
myrmidex added this to the v1.3.0 milestone 2026-03-18 14:48:56 +01:00
myrmidex added the
enhancement
label 2026-03-18 14:48:57 +01:00
myrmidex self-assigned this 2026-03-18 17:32:53 +01:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lvl0/fedi-feed-router#96
No description provided.