Compare commits

...

3 Commits

Author SHA1 Message Date
bff1a4bda6 strike through team name if both members are dead
All checks were successful
deploy / build-and-deploy (/testvaro, /opt/website-test, website-test) (push) Successful in 17s
deploy / build-and-deploy (/varo, /opt/website, website) (push) Successful in 18s
2025-06-21 22:40:54 +02:00
46494ed8dc do not show team text when signup is deactivated 2025-06-21 22:39:02 +02:00
4e615fe211 fix report edit 2025-06-21 22:37:19 +02:00
8 changed files with 38 additions and 10 deletions

View File

@ -151,6 +151,8 @@ export const report = {
reportId: input.reportId, reportId: input.reportId,
strikeReasonId: input.strikeReasonId strikeReasonId: input.strikeReasonId
}); });
} else {
await db.deleteStrike({ reportId: input.reportId });
} }
}); });

View File

@ -20,12 +20,12 @@
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);
let strikeReason = $state<string | null>(null); let strikeReason = $state<string | null>(String(report?.strike?.strikeReasonId ?? null));
// consts // consts
const strikeReasonValues = strikeReasons.reduce( const strikeReasonValues = strikeReasons.reduce(
(prev, curr) => Object.assign(prev, { [curr.id]: `${curr.name} (${curr.weight})` }), (prev, curr) => Object.assign(prev, { [curr.id]: `${curr.name} (${curr.weight})` }),
{} { [null]: 'Kein Vergehen' }
); );
// lifetime // lifetime
@ -82,8 +82,7 @@
label="Bearbeitungsstatus" label="Bearbeitungsstatus"
dynamicWidth dynamicWidth
/> />
<Select bind:value={strikeReason} values={strikeReasonValues} defaultValue="" label="Vergehen" dynamicWidth <Select bind:value={strikeReason} values={strikeReasonValues} label="Vergehen" dynamicWidth></Select>
></Select>
<div class="divider mt-0 mb-2"></div> <div class="divider mt-0 mb-2"></div>
<button class="btn mt-auto" onclick={onSaveButtonClick}>Speichern</button> <button class="btn mt-auto" onclick={onSaveButtonClick}>Speichern</button>
</div> </div>

View File

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

View File

@ -1,6 +1,7 @@
<script lang="ts"> <script lang="ts">
import type { Snippet } from 'svelte'; import type { Snippet } from 'svelte';
// types
interface Props { interface Props {
id?: string; id?: string;
value?: string | null; value?: string | null;
@ -19,6 +20,7 @@
notice?: Snippet; notice?: Snippet;
} }
// inputs
let { let {
id, id,
value = $bindable(), value = $bindable(),

View File

@ -130,6 +130,8 @@ import {
deleteStrikeReason deleteStrikeReason
} from '@db/schema/strikeReason.ts'; } from '@db/schema/strikeReason.ts';
import { import {
deleteStrike,
type DeleteStrikeReq,
editStrike, editStrike,
type EditStrikeReq, type EditStrikeReq,
getStrikeByReportId, getStrikeByReportId,
@ -288,6 +290,7 @@ export class Database {
/* strikes */ /* strikes */
editStrike = (values: EditStrikeReq) => editStrike(this.db, values); editStrike = (values: EditStrikeReq) => editStrike(this.db, values);
deleteStrike = (values: DeleteStrikeReq) => deleteStrike(this.db, values);
getStrikeByReportId = (values: GetStrikeByReportIdReq) => getStrikeByReportId(this.db, values); getStrikeByReportId = (values: GetStrikeByReportIdReq) => getStrikeByReportId(this.db, values);
getStrikesByTeamId = (values: GetStrikesByTeamIdReq) => getStrikesByTeamId(this.db, values); getStrikesByTeamId = (values: GetStrikesByTeamIdReq) => getStrikesByTeamId(this.db, values);

View File

@ -5,6 +5,8 @@ import { reportStatus } from './reportStatus.ts';
import { generateRandomString } from '@util/random.ts'; import { generateRandomString } from '@util/random.ts';
import { team } from '@db/schema/team.ts'; import { team } from '@db/schema/team.ts';
import { BASE_PATH } from 'astro:env/server'; import { BASE_PATH } from 'astro:env/server';
import { strikeReason } from '@db/schema/strikeReason.ts';
import { strike } from '@db/schema/strike.ts';
type Database = MySql2Database<{ report: typeof report }>; type Database = MySql2Database<{ report: typeof report }>;
@ -113,12 +115,17 @@ export async function getReports(db: Database, values: GetReportsReq) {
status: reportStatus.status, status: reportStatus.status,
notice: reportStatus.notice, notice: reportStatus.notice,
statement: reportStatus.statement statement: reportStatus.statement
},
strike: {
strikeReasonId: strikeReason.id
} }
}) })
.from(report) .from(report)
.innerJoin(reporterTeam, eq(report.reporterTeamId, reporterTeam.id)) .innerJoin(reporterTeam, eq(report.reporterTeamId, reporterTeam.id))
.leftJoin(reportedTeam, eq(report.reportedTeamId, reportedTeam.id)) .leftJoin(reportedTeam, eq(report.reportedTeamId, reportedTeam.id))
.leftJoin(reportStatus, eq(report.id, reportStatus.reportId)) .leftJoin(reportStatus, eq(report.id, reportStatus.reportId))
.leftJoin(strike, eq(report.id, strike.reportId))
.leftJoin(strikeReason, eq(strike.strikeReasonId, strikeReason.id))
.where( .where(
and( and(
values.reporter != null ? eq(report.reporterTeamId, reporterIdSubquery!.id) : undefined, values.reporter != null ? eq(report.reporterTeamId, reporterIdSubquery!.id) : undefined,

View File

@ -3,7 +3,6 @@ import { strikeReason } from '@db/schema/strikeReason.ts';
import type { MySql2Database } from 'drizzle-orm/mysql2'; import type { MySql2Database } from 'drizzle-orm/mysql2';
import { eq } from 'drizzle-orm'; import { eq } from 'drizzle-orm';
import { report } from '@db/schema/report.ts'; import { report } from '@db/schema/report.ts';
import { strikeReasons } from '@app/admin/strikeReasons/strikeReasons.ts';
type Database = MySql2Database<{ strike: typeof strike }>; type Database = MySql2Database<{ strike: typeof strike }>;
@ -23,6 +22,10 @@ export type EditStrikeReq = {
strikeReasonId: number; strikeReasonId: number;
}; };
export type DeleteStrikeReq = {
reportId: number;
};
export type GetStrikeByReportIdReq = { export type GetStrikeByReportIdReq = {
reportId: number; reportId: number;
}; };
@ -47,6 +50,10 @@ export async function editStrike(db: Database, values: EditStrikeReq) {
}); });
} }
export async function deleteStrike(db: Database, values: DeleteStrikeReq) {
return db.delete(strike).where(eq(strike.reportId, values.reportId)).limit(1);
}
export async function getStrikeByReportId(db: Database, values: GetStrikeByReportIdReq) { export async function getStrikeByReportId(db: Database, values: GetStrikeByReportIdReq) {
const strikes = await db const strikes = await db
.select({ .select({

View File

@ -103,10 +103,14 @@ const information = [
<div class="bg-base-100 flex flex-col space-y-10 items-center py-10"> <div class="bg-base-100 flex flex-col space-y-10 items-center py-10">
<h2 id="teams" class="text-4xl mb-10">Teams</h2> <h2 id="teams" class="text-4xl mb-10">Teams</h2>
{
signupEnabled && (
<p class="text-sm text-center mb-2 mx-1"> <p class="text-sm text-center mb-2 mx-1">
Bei unvollständigen Teams muss sich der zweite Mitspieler noch registrieren. Unvollständige Teams werden bei Bei unvollständigen Teams muss sich der zweite Mitspieler noch registrieren. Unvollständige Teams werden bei
Anmeldeschluss gelöscht. Anmeldeschluss gelöscht.
</p> </p>
)
}
<Teams {teams} {deaths} /> <Teams {teams} {deaths} />
</div> </div>
</WebsiteLayout> </WebsiteLayout>