Add feature requests page with voting and status tracking
Deploy to LXC / deploy (push) Successful in 21s

- feature_requests table with title, description, status, votes, createdBy
- Submit new requests with title and description
- Upvote button sorted by most votes
- Status dropdown: open, planned, in-progress, done, declined
- Color-coded status badges
- Delete button per request
- Sidebar nav item with lightbulb icon

Run db:push on the server to create the new table.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-10 10:03:56 +07:00
parent f6f31341ea
commit e16c50d854
4 changed files with 206 additions and 0 deletions
+5
View File
@@ -58,6 +58,11 @@
label: 'Gallery',
icon: 'M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z'
},
{
href: '/feature-requests',
label: 'Requests',
icon: 'M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z'
},
{
href: '/settings',
label: 'Settings',
+13
View File
@@ -339,3 +339,16 @@ export const todos = pgTable(
check('todos_priority_check', sql`${table.priority} IN (0, 1, 2, 3)`)
]
);
// ─── Feature Requests ───────────────────────────────────────────────
export const featureRequests = pgTable('feature_requests', {
id: uuid('id').defaultRandom().primaryKey(),
title: text('title').notNull(),
description: text('description'),
status: text('status').notNull().default('open'),
votes: integer('votes').notNull().default(0),
createdBy: text('created_by'),
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
});