Ideas (Admin)
The Ideas section of the admin panel provides moderation tools for the Ideas Hub. Admins can review all submitted ideas, change their status, edit content, moderate comments, and manage the categories and tags that users see when submitting ideas.
Where to Find It
Admin sidebar → Ideas. The list lives at /ideas; detail pages at /ideas/\{id\}. Category and tag management are accessible from the Ideas list toolbar.
Ideas List
The list view at /ideas shows all ideas across every status.
Columns
| Column | Description |
|---|---|
| Title | Idea title with a truncated description preview |
| Status | Color-coded badge (open, planned, in_progress, completed, closed) |
| Category | Category name, or "Uncategorized" if none |
| Votes | Up-vote and down-vote counts |
| Comments | Total comment count |
| Author | User's display name |
| Created | Creation timestamp |
Filtering
The toolbar exposes the following filters:
- Status — single-select dropdown; defaults to showing all statuses.
- Category — single-select dropdown with all configured categories.
- Search — debounced full-text search on title and description.
Filters are combined (AND logic) and reflected in the URL as query parameters.
Bulk Actions
Select multiple rows using the checkboxes to apply bulk operations:
| Action | Permission |
|---|---|
| Change status | ideas:moderate_status |
| Delete selected | ideas:moderate_delete |
Bulk status change opens a dialog to pick the target status and provide an optional message that is appended as a timeline entry for each affected idea.
Pin
An individual idea can be pinned from the row action menu (three-dot button). Pinned ideas are surfaced at the top of the public list. Requires ideas:moderate_edit.
Idea Detail
The detail page at /ideas/\{id\} provides a full view of a single idea and all associated data.
Sections
Idea Content
Displays the title, description (rendered Markdown), category, and tags. Admins with ideas:moderate_edit can click the Edit button to open an inline editor for any of these fields. Saving triggers a content_edit timeline entry automatically.
Status
The current status is shown as a badge with a Change Status button. Clicking it opens a modal to:
- Select the new status from the five options.
- Optionally enter a message to accompany the status change (e.g., "Added to Q3 roadmap").
The status change is recorded as a status_change timeline entry. Requires ideas:moderate_status.
Votes
Displays up-vote and down-vote totals. No manual override is available — vote counts are derived from the idea_votes table.
Comments
A nested comment tree showing all top-level comments and replies. Each comment row shows:
- Author display name and avatar
- Comment body (rendered Markdown)
- Timestamp and "edited" label if the body was changed after creation
- Delete button (visible to admins with
ideas:moderate_comment) — soft-deletes the comment; the body is replaced with[deleted]in the public view.
Timeline
A chronological list of all timeline entries for the idea:
status_changeentries show the from/to status transition and any message.editentries show a summary of what fields changed.
Timeline entries are read-only and cannot be removed.
Category Management
Accessible from the Ideas list via the Categories button in the toolbar. Requires ideas:moderate_edit to create, edit, or delete.
Category List
Displays all categories with name, description, color swatch, and a count of ideas using that category.
Creating a Category
Click New Category to open the creation form:
| Field | Required | Description |
|---|---|---|
| Name | Yes | Short category label shown to users |
| Description | No | Optional tooltip text |
| Color | No | Hex color used for the category badge in the UI |
| Sort Order | No | Integer; lower sorts first |
Editing a Category
Click the category row or the Edit button. All fields are editable inline.
Deleting a Category
The Delete button is only active when no ideas reference the category. If ideas exist, a tooltip explains that the category must be reassigned or the ideas deleted first (enforced by ON DELETE RESTRICT on the category_id FK).
Tag Management
Accessible from the Ideas list via the Tags button in the toolbar. Requires ideas:moderate_edit to delete.
Tag List
Displays all tags with their name, slug, and a count of ideas using each tag. Tags are user-created inline when submitting ideas.
Deleting a Tag
Click the Delete button on any tag row. This removes the tag and all idea_tag_assignments join rows; the ideas themselves are not affected. A confirmation dialog is shown first.
There is no UI to create or rename tags from the admin panel — tags are created by users and managed from the idea's own edit view.
Permissions
All Ideas admin actions require admin:access (the dashboard-entry gate). In addition:
| Action | Permission |
|---|---|
| View ideas list and detail | ideas:moderate_read |
| Change idea status | ideas:moderate_status |
| Edit idea content, manage categories and tags, pin/unpin | ideas:moderate_edit |
| Delete ideas | ideas:moderate_delete |
| Delete comments | ideas:moderate_comment |
System admins (is_system = true) implicitly have all permissions.
API
| UI Action | GraphQL | REST |
|---|---|---|
| List ideas | adminIdeas(filter: IdeaFilterInput) | GET /v1/ideas |
| Get idea detail | idea(id: UUID!) | GET /v1/ideas/{id} |
| Edit idea content | updateIdea(input: UpdateIdeaInput!) | PATCH /v1/ideas/{id} |
| Change status | changeIdeaStatus(id: UUID!, ...) | PATCH /v1/ideas/admin/{id}/status |
| Pin / unpin | pinIdea(id: UUID!, pinned: Boolean!) | PATCH /v1/ideas/admin/{id}/pin |
| Delete idea | deleteIdea(id: UUID!) | DELETE /v1/ideas/{id} |
| Delete comment | deleteIdeaComment(id: UUID!) | DELETE /v1/ideas/{id}/comments/{comment_id} |
| List categories | ideaCategories | GET /v1/ideas/categories |
| Create category | createIdeaCategory(input: ...) | POST /v1/ideas/admin/categories |
| Update category | updateIdeaCategory(input: ...) | PATCH /v1/ideas/admin/categories/{id} |
| Delete category | deleteIdeaCategory(id: UUID!) | DELETE /v1/ideas/admin/categories/{id} |
| Delete tag | deleteIdeaTag(id: UUID!) | DELETE /v1/ideas/admin/tags/{id} |
Related
- Feature Flags —
system:ideas_hubandsystem:ideas_hub_publicflags - Ideas Hub feature doc — architecture, data model, WebSocket channels
- Ideas Hub user guide — user-facing functionality