From a197c002f452556b792dd0191d377300ab38c3c0 Mon Sep 17 00:00:00 2001 From: bytedream Date: Sat, 3 Jan 2026 19:23:30 +0100 Subject: [PATCH] add feedback blank filter option --- src/actions/feedback.ts | 7 +++++-- src/app/admin/feedback/Feedback.svelte | 8 +------- src/app/admin/feedback/SidebarActions.svelte | 19 +++++++++++++++++++ src/app/admin/feedback/feedback.ts | 4 ++-- src/db/schema/feedback.ts | 9 ++++++--- src/db/schema/report.ts | 2 +- src/pages/admin/feedback.astro | 2 ++ 7 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 src/app/admin/feedback/SidebarActions.svelte diff --git a/src/actions/feedback.ts b/src/actions/feedback.ts index 7678052..f35c5dc 100644 --- a/src/actions/feedback.ts +++ b/src/actions/feedback.ts @@ -38,11 +38,14 @@ export const feedback = { } }), feedbacks: defineAction({ - handler: async (_, context) => { + input: z.object({ + includeBlanks: z.boolean() + }), + handler: async (input, context) => { Session.actionSessionFromCookies(context.cookies, Permissions.Feedback); return { - feedbacks: await db.getFeedbacks({}) + feedbacks: await db.getFeedbacks({ includeBlanks: input.includeBlanks }) }; } }) diff --git a/src/app/admin/feedback/Feedback.svelte b/src/app/admin/feedback/Feedback.svelte index 86e3dd2..5e188c4 100644 --- a/src/app/admin/feedback/Feedback.svelte +++ b/src/app/admin/feedback/Feedback.svelte @@ -1,7 +1,6 @@ {#snippet date(value: string)} diff --git a/src/app/admin/feedback/SidebarActions.svelte b/src/app/admin/feedback/SidebarActions.svelte new file mode 100644 index 0000000..e693998 --- /dev/null +++ b/src/app/admin/feedback/SidebarActions.svelte @@ -0,0 +1,19 @@ + + +
+
+ Filter + +
+
diff --git a/src/app/admin/feedback/feedback.ts b/src/app/admin/feedback/feedback.ts index dc25886..6b87d59 100644 --- a/src/app/admin/feedback/feedback.ts +++ b/src/app/admin/feedback/feedback.ts @@ -10,8 +10,8 @@ export type Feedback = Feedbacks[0]; export const feedbacks = writable([]); // actions -export async function fetchFeedbacks(reporter?: string | null, reported?: string | null) { - const { data, error } = await actions.feedback.feedbacks({ reporter: reporter, reported: reported }); +export async function fetchFeedbacks(includeBlanks: boolean) { + const { data, error } = await actions.feedback.feedbacks({ includeBlanks: includeBlanks }); if (error) { actionErrorPopup(error); return; diff --git a/src/db/schema/feedback.ts b/src/db/schema/feedback.ts index 4b9faac..c28fa56 100644 --- a/src/db/schema/feedback.ts +++ b/src/db/schema/feedback.ts @@ -1,7 +1,7 @@ import { int, mysqlTable, text, timestamp, varchar } from 'drizzle-orm/mysql-core'; import { user } from './user.ts'; import type { MySql2Database } from 'drizzle-orm/mysql2'; -import { desc, eq, inArray } from 'drizzle-orm'; +import { desc, eq, inArray, isNotNull } from 'drizzle-orm'; import { generateRandomString } from '@util/random.ts'; type Database = MySql2Database<{ feedback: typeof feedback }>; @@ -32,7 +32,9 @@ export type SubmitFeedbackReq = { content: string; }; -export type GetFeedbacksReq = {}; +export type GetFeedbacksReq = { + includeBlanks?: boolean | null; +}; export type GetFeedbackByUrlHash = { urlHash: string; @@ -76,7 +78,7 @@ export async function submitFeedback(db: Database, values: SubmitFeedbackReq) { .where(eq(feedback.urlHash, values.urlHash)); } -export async function getFeedbacks(db: Database, _values: GetFeedbacksReq) { +export async function getFeedbacks(db: Database, values: GetFeedbacksReq) { return db .select({ id: feedback.id, @@ -89,6 +91,7 @@ export async function getFeedbacks(db: Database, _values: GetFeedbacksReq) { }) .from(feedback) .leftJoin(user, eq(feedback.userId, user.id)) + .where(!values.includeBlanks ? isNotNull(feedback.lastChanged) : undefined) .orderBy(desc(feedback.id)); } diff --git a/src/db/schema/report.ts b/src/db/schema/report.ts index 4b02579..7f44d60 100644 --- a/src/db/schema/report.ts +++ b/src/db/schema/report.ts @@ -133,7 +133,7 @@ export async function getReports(db: Database, values: GetReportsReq) { and( values.reporter != null ? eq(reporter.username, values.reporter) : undefined, values.reported != null ? eq(reported.username, values.reported) : undefined, - values.includeDrafts == false ? isNotNull(report.createdAt) : undefined + !values.includeDrafts ? isNotNull(report.createdAt) : undefined ) ) .orderBy(desc(report.id)); diff --git a/src/pages/admin/feedback.astro b/src/pages/admin/feedback.astro index cd34d44..1a192ce 100644 --- a/src/pages/admin/feedback.astro +++ b/src/pages/admin/feedback.astro @@ -4,11 +4,13 @@ import AdminLayout from '@layouts/admin/AdminLayout.astro'; import { Session } from '@util/session.ts'; import { Permissions } from '@util/permissions.ts'; import { BASE_PATH } from 'astro:env/server'; +import SidebarActions from '@app/admin/feedback/SidebarActions.svelte'; const session = Session.sessionFromCookies(Astro.cookies, Permissions.Feedback); if (!session) return Astro.redirect(`${BASE_PATH}/admin`); --- +