From e7bba2278403610fe209ea5d39e6d066f0464424 Mon Sep 17 00:00:00 2001 From: bytedream <bytedream@protonmail.com> Date: Fri, 6 Dec 2024 14:59:46 +0100 Subject: [PATCH] update report submitted window (#42) --- src/lib/components/Input/Textarea.svelte | 41 +++++++------ src/routes/admin/reports/+page.svelte | 12 +++- .../report/[...url_hash]/+page.server.ts | 2 + src/routes/report/[...url_hash]/+page.svelte | 12 ++-- .../[...url_hash]/ReportCompleted.svelte | 3 - .../[...url_hash]/ReportSubmitted.svelte | 60 +++++++++++++++++-- 6 files changed, 99 insertions(+), 31 deletions(-) delete mode 100644 src/routes/report/[...url_hash]/ReportCompleted.svelte diff --git a/src/lib/components/Input/Textarea.svelte b/src/lib/components/Input/Textarea.svelte index f737d21..5e83fc4 100644 --- a/src/lib/components/Input/Textarea.svelte +++ b/src/lib/components/Input/Textarea.svelte @@ -1,18 +1,27 @@ <script lang="ts"> - import { createEventDispatcher } from 'svelte'; - - export let id: string | null = null; - export let name: string | null = null; - export let value: string | null = null; - export let label: string | null = null; - export let notice: string | null = null; - export let required = false; - export let disabled = false; - export let readonly = false; - export let size: 'xs' | 'sm' | 'md' | 'lg' = 'md'; - export let rows = 2; - - const dispatch = createEventDispatcher(); + let { + id, + name, + value = $bindable(), + label, + notice, + required, + disabled, + readonly, + size = 'md', + rows = 2 + }: { + id?: string; + name?: string; + value?: string; + label?: string; + notice?: string; + required?: boolean; + disabled?: boolean; + readonly?: boolean; + size?: 'xs' | 'sm' | 'md' | 'lg'; + rows?: number; + } = $props(); </script> <div> @@ -27,12 +36,11 @@ </label> {/if} <textarea - class="textarea w-full" + class="textarea textarea-bordered w-full" class:textarea-xs={size === 'xs'} class:textarea-sm={size === 'sm'} class:textarea-md={size === 'md'} class:textarea-lg={size === 'lg'} - class:textarea-bordered={!readonly} {id} {name} {required} @@ -40,7 +48,6 @@ {readonly} {rows} bind:value - on:click={(e) => dispatch('click', e)} ></textarea> {#if notice} <label class="label" for={id}> diff --git a/src/routes/admin/reports/+page.svelte b/src/routes/admin/reports/+page.svelte index 537e7ae..e04e953 100644 --- a/src/routes/admin/reports/+page.svelte +++ b/src/routes/admin/reports/+page.svelte @@ -146,7 +146,7 @@ goto(`${window.location.href.split('#')[0]}#${report.url_hash}`, { replaceState: true }); - activeReport = report; + activeReport = $state.snapshot(report); activeReport.originalStatus = report.status; }} > @@ -344,7 +344,13 @@ } else { activeReport.reported = undefined; } - reports = [...reports]; + const activeReportIndex = reports.findIndex((r) => r.id === activeReport.id); + if (activeReportIndex === -1) { + return; + } + + reports[activeReportIndex] = activeReport; + if ( activeReport.originalStatus !== 'reviewed' && activeReport.status === 'reviewed' @@ -373,7 +379,7 @@ onSubmit={(e) => { if (!e.draft) $reportCount += 1; reports = [e, ...reports]; - activeReport = reports[0]; + activeReport = $state.snapshot(reports[0]); newReportModal.close(); }} /> diff --git a/src/routes/report/[...url_hash]/+page.server.ts b/src/routes/report/[...url_hash]/+page.server.ts index 6ad33c4..309ab20 100644 --- a/src/routes/report/[...url_hash]/+page.server.ts +++ b/src/routes/report/[...url_hash]/+page.server.ts @@ -18,6 +18,8 @@ export const load: PageServerLoad = async ({ params }) => { draft: report.draft, status: report.status, reason: report.subject, + body: report.body, + statement: report.statement, reporter: { name: report.reporter.username }, diff --git a/src/routes/report/[...url_hash]/+page.svelte b/src/routes/report/[...url_hash]/+page.svelte index 962554d..be71df6 100644 --- a/src/routes/report/[...url_hash]/+page.svelte +++ b/src/routes/report/[...url_hash]/+page.svelte @@ -1,7 +1,6 @@ <script lang="ts"> import { fly } from 'svelte/transition'; import ReportDraft from './ReportDraft.svelte'; - import ReportCompleted from './ReportCompleted.svelte'; import ReportSubmitted from './ReportSubmitted.svelte'; let { data } = $props(); @@ -26,11 +25,16 @@ onsubmit={() => (completed = true)} /> </div> - {:else if data.status === 'reviewed'} - <ReportCompleted /> {:else} <div class="col-[1] row-[1]" transition:fly={{ x: 200, duration: 300 }}> - <ReportSubmitted /> + <ReportSubmitted + reporterName={data.reporter.name} + reportedName={data.reported.name ?? undefined} + status={data.status} + reason={data.reason} + body={data.body} + statement={data.statement} + /> </div> {/if} </div> diff --git a/src/routes/report/[...url_hash]/ReportCompleted.svelte b/src/routes/report/[...url_hash]/ReportCompleted.svelte deleted file mode 100644 index b3ee96d..0000000 --- a/src/routes/report/[...url_hash]/ReportCompleted.svelte +++ /dev/null @@ -1,3 +0,0 @@ -<div> - <h2 class="text-xl text-center">Dieser Report wurde von einem Admin bearbeitet</h2> -</div> diff --git a/src/routes/report/[...url_hash]/ReportSubmitted.svelte b/src/routes/report/[...url_hash]/ReportSubmitted.svelte index 0dbf693..8047766 100644 --- a/src/routes/report/[...url_hash]/ReportSubmitted.svelte +++ b/src/routes/report/[...url_hash]/ReportSubmitted.svelte @@ -1,6 +1,58 @@ +<script lang="ts"> + import Input from '$lib/components/Input/Input.svelte'; + import Textarea from '$lib/components/Input/Textarea.svelte'; + + let { + reporterName, + reportedName, + status, + reason, + body, + statement + }: { + reporterName: string; + reportedName?: string; + status: 'none' | 'review' | 'reviewed'; + reason: string; + body: string; + statement?: string; + } = $props(); +</script> + <div> - <h2 class="text-2xl text-center">Report abgeschickt</h2> - <p class="mt-4"> - Dein Report wurde abgeschickt und wird so schnell wie möglich von einem Admin bearbeitet. - </p> + <h2 class="text-3xl text-center"> + Report von <span class="underline">{reporterName}</span> gegen + <span class="underline">{reportedName ?? 'unbekannt'}</span> + </h2> + <h4 class="text-xl text-center mt-1 mb-0"> + {#if status === 'none'} + <span>Unbearbeitet</span> + {:else if status === 'review'} + <span>In Bearbeitung</span> + {:else if status === 'reviewed'} + <span>Bearbeitet</span> + {/if} + <span class="relative inline-flex h-3 w-3 ml-[1px]"> + {#if status === 'review'} + <span + class="animate-ping absolute inline-flex h-full w-full rounded-full bg-yellow-500 opacity-75" + ></span> + {/if} + <span + class="relative inline-flex rounded-full h-3 w-3" + class:bg-yellow-500={status === 'none' || status === 'review'} + class:bg-green-500={status === 'reviewed'} + ></span> + </span> + </h4> + <div class="my-4"> + <Input type="text" size="sm" value={reason} readonly={true} pickyWidth={false}> + {#snippet label()} + <span>Report Grund</span> + {/snippet} + </Input> + <Textarea readonly={true} rows={4} value={body} label="Report Details" /> + </div> + <div class="divider divider-vertical mb-1"></div> + <Textarea readonly={true} rows={4} label="Admin Kommentar" value={statement} /> </div>