edit reported team in admin ui
All checks were successful
deploy / build-and-deploy (/testvaro, /opt/website-test, website-test) (push) Successful in 28s
deploy / build-and-deploy (/varo, /opt/website, website) (push) Successful in 13s

This commit is contained in:
2025-06-22 00:11:10 +02:00
parent e9e44f67a2
commit d7b05deff2
7 changed files with 52 additions and 10 deletions

View File

@ -117,6 +117,20 @@ export const report = {
}; };
} }
}), }),
editReport: defineAction({
input: z.object({
reportId: z.number(),
reported: z.number().nullable()
}),
handler: async (input, context) => {
Session.actionSessionFromCookies(context.cookies, Permissions.Reports);
await db.editReport({
id: input.reportId,
reportedTeamId: input.reported
});
}
}),
reportStatus: defineAction({ reportStatus: defineAction({
input: z.object({ input: z.object({
reportId: z.number() reportId: z.number()

View File

@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import type { Report, ReportStatus, StrikeReasons } from './reports.ts'; import { editReport, type Report, type ReportStatus, type StrikeReasons } from './reports.ts';
import Input from '@components/input/Input.svelte'; import Input from '@components/input/Input.svelte';
import Textarea from '@components/input/Textarea.svelte'; import Textarea from '@components/input/Textarea.svelte';
import Select from '@components/input/Select.svelte'; import Select from '@components/input/Select.svelte';
@ -17,6 +17,7 @@
let { strikeReasons, report }: Props = $props(); let { strikeReasons, report }: Props = $props();
// states // states
let reportedTeam = $state<{ id: number; name: string } | null>(report?.reported ?? null);
let status = $state<'open' | 'closed' | null>(null); let status = $state<'open' | 'closed' | null>(null);
let notice = $state<string | null>(null); let notice = $state<string | null>(null);
let statement = $state<string | null>(null); let statement = $state<string | null>(null);
@ -46,13 +47,18 @@
$confirmPopupState = { $confirmPopupState = {
title: 'Änderungen speichern?', title: 'Änderungen speichern?',
message: 'Sollen die Änderungen am Report gespeichert werden?', message: 'Sollen die Änderungen am Report gespeichert werden?',
onConfirm: async () => onConfirm: async () => {
editReportStatus(report!, { if (reportedTeam?.id != report?.reported?.id) {
report!.reported = reportedTeam;
await editReport(report!);
}
await editReportStatus(report!, {
status: status, status: status,
notice: notice, notice: notice,
statement: statement, statement: statement,
strikeReasonId: Number(strikeReason) strikeReasonId: Number(strikeReason)
} as ReportStatus) } as ReportStatus);
}
}; };
} }
</script> </script>
@ -64,7 +70,7 @@
<button class="btn btn-sm btn-circle btn-ghost absolute right-2 top-2" onclick={() => (report = null)}>✕</button> <button class="btn btn-sm btn-circle btn-ghost absolute right-2 top-2" onclick={() => (report = null)}>✕</button>
<div class="w-[34rem]"> <div class="w-[34rem]">
<TeamSearch value={report?.reporter.name} label="Report Team" readonly mustMatch /> <TeamSearch value={report?.reporter.name} label="Report Team" readonly mustMatch />
<TeamSearch value={report?.reported?.name} label="Reportetes Team" /> <TeamSearch value={report?.reported?.name} label="Reportetes Team" onSubmit={(team) => (reportedTeam = team)} />
<Textarea bind:value={notice} label="Interne Notizen" rows={8} /> <Textarea bind:value={notice} label="Interne Notizen" rows={8} />
</div> </div>
<div class="divider divider-horizontal"></div> <div class="divider divider-horizontal"></div>

View File

@ -59,6 +59,17 @@ export async function getReportStatus(report: Report) {
return data.reportStatus; return data.reportStatus;
} }
export async function editReport(report: Report) {
const { error } = await actions.report.editReport({
reportId: report.id,
reported: report.reported?.id ?? null
});
if (error) {
actionErrorPopup(error);
}
}
export async function editReportStatus(report: Report, reportStatus: ReportStatus) { export async function editReportStatus(report: Report, reportStatus: ReportStatus) {
const { error } = await actions.report.editReportStatus({ const { error } = await actions.report.editReportStatus({
reportId: report.id, reportId: report.id,

View File

@ -48,10 +48,7 @@
<tr> <tr>
<td> <td>
<div class="flex items-center gap-x-2"> <div class="flex items-center gap-x-2">
<div <div class="rounded-sm min-w-3 w-3 min-h-3 h-3" style="background-color: {team.color}"></div>
class="rounded-sm min-w-3 w-3 min-h-3 h-3"
style="background-color: {team.color}"
></div>
<h3 <h3
class="text-xs sm:text-xl break-all" class="text-xs sm:text-xl break-all"
class:line-through={team.memberOne.dead && team.memberTwo.dead} class:line-through={team.memberOne.dead && team.memberTwo.dead}

View File

@ -107,6 +107,8 @@ import {
import { import {
addReport, addReport,
type AddReportReq, type AddReportReq,
editReport,
type EditReportReq,
getReportById, getReportById,
type GetReportById, type GetReportById,
getReportByUrlHash, getReportByUrlHash,
@ -270,6 +272,7 @@ export class Database {
/* report */ /* report */
addReport = (values: AddReportReq) => addReport(this.db, values); addReport = (values: AddReportReq) => addReport(this.db, values);
editReport = (values: EditReportReq) => editReport(this.db, values);
submitReport = (values: SubmitReportReq) => submitReport(this.db, values); submitReport = (values: SubmitReportReq) => submitReport(this.db, values);
getReports = (values: GetReportsReq) => getReports(this.db, values); getReports = (values: GetReportsReq) => getReports(this.db, values);
getReportById = (values: GetReportById) => getReportById(this.db, values); getReportById = (values: GetReportById) => getReportById(this.db, values);

View File

@ -28,6 +28,11 @@ export type AddReportReq = {
reportedTeamId?: number | null; reportedTeamId?: number | null;
}; };
export type EditReportReq = {
id: number;
reportedTeamId: number | null;
};
export type SubmitReportReq = { export type SubmitReportReq = {
urlHash: string; urlHash: string;
reason: string; reason: string;
@ -65,6 +70,12 @@ export async function addReport(db: Database, values: AddReportReq) {
return Object.assign(r[0], { url: `${BASE_PATH}/report/${urlHash}` }); return Object.assign(r[0], { url: `${BASE_PATH}/report/${urlHash}` });
} }
export async function editReport(db: Database, values: EditReportReq) {
return db.update(report).set({
reportedTeamId: values.reportedTeamId
});
}
export async function submitReport(db: Database, values: SubmitReportReq) { export async function submitReport(db: Database, values: SubmitReportReq) {
return db return db
.update(report) .update(report)

View File

@ -23,7 +23,7 @@ export async function sendWebhook<T extends WebhookAction>(action: T, data: Webh
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'x-webhook-action': action 'x-webhook-action': action
}, },
body: JSON.stringify(data), body: JSON.stringify(data)
}); });
if (response.status === 200) return; if (response.status === 200) return;