diff --git a/app/db/tables.ts b/app/db/tables.ts
index 1f7784a61..a55375e40 100644
--- a/app/db/tables.ts
+++ b/app/db/tables.ts
@@ -414,6 +414,8 @@ export interface TournamentSettings {
thirdPlaceMatch?: boolean;
isRanked?: boolean;
enableNoScreenToggle?: boolean;
+ /** Enable the subs tab, default true */
+ enableSubs?: boolean;
deadlines?: "STRICT" | "DEFAULT";
requireInGameNames?: boolean;
isInvitational?: boolean;
diff --git a/app/features/calendar/CalendarRepository.server.ts b/app/features/calendar/CalendarRepository.server.ts
index 909602df9..aed9bb941 100644
--- a/app/features/calendar/CalendarRepository.server.ts
+++ b/app/features/calendar/CalendarRepository.server.ts
@@ -474,6 +474,7 @@ type CreateArgs = Pick<
isInvitational?: boolean;
deadlines: TournamentSettings["deadlines"];
enableNoScreenToggle?: boolean;
+ enableSubs?: boolean;
autonomousSubs?: boolean;
regClosesAt?: number;
rules: string | null;
@@ -506,6 +507,7 @@ export async function create(args: CreateArgs) {
deadlines: args.deadlines,
isInvitational: args.isInvitational,
enableNoScreenToggle: args.enableNoScreenToggle,
+ enableSubs: args.enableSubs,
autonomousSubs: args.autonomousSubs,
regClosesAt: args.regClosesAt,
requireInGameNames: args.requireInGameNames,
@@ -655,6 +657,7 @@ export async function update(args: UpdateArgs) {
deadlines: args.deadlines,
isInvitational: args.isInvitational,
enableNoScreenToggle: args.enableNoScreenToggle,
+ enableSubs: args.enableSubs,
autonomousSubs: args.autonomousSubs,
regClosesAt: args.regClosesAt,
requireInGameNames: args.requireInGameNames,
diff --git a/app/features/calendar/actions/calendar.new.server.ts b/app/features/calendar/actions/calendar.new.server.ts
index ab6409f00..256ecc469 100644
--- a/app/features/calendar/actions/calendar.new.server.ts
+++ b/app/features/calendar/actions/calendar.new.server.ts
@@ -98,6 +98,7 @@ export const action: ActionFunction = async ({ request }) => {
isInvitational: data.isInvitational ?? false,
deadlines: data.strictDeadline ? ("STRICT" as const) : ("DEFAULT" as const),
enableNoScreenToggle: data.enableNoScreenToggle ?? undefined,
+ enableSubs: data.enableSubs ?? undefined,
requireInGameNames: data.requireInGameNames ?? undefined,
autonomousSubs: data.autonomousSubs ?? undefined,
swissGroupCount: data.swissGroupCount ?? undefined,
@@ -274,6 +275,7 @@ export const newCalendarEventActionSchema = z
checkboxValueToBoolean,
z.boolean().nullish(),
),
+ enableSubs: z.preprocess(checkboxValueToBoolean, z.boolean().nullish()),
autonomousSubs: z.preprocess(checkboxValueToBoolean, z.boolean().nullish()),
strictDeadline: z.preprocess(checkboxValueToBoolean, z.boolean().nullish()),
isInvitational: z.preprocess(checkboxValueToBoolean, z.boolean().nullish()),
diff --git a/app/features/calendar/routes/calendar.new.tsx b/app/features/calendar/routes/calendar.new.tsx
index 8fa19d050..88b5fdd13 100644
--- a/app/features/calendar/routes/calendar.new.tsx
+++ b/app/features/calendar/routes/calendar.new.tsx
@@ -239,6 +239,7 @@ function EventForm() {
+
+
+
+
+ Allow users to sign up as "subs" in addition to the normal event
+ sign-up.
+
+
+ );
+}
+
function AutonomousSubsToggle() {
const baseEvent = useBaseEvent();
const [autonomousSubs, setAutonomousSubs] = React.useState(
diff --git a/app/features/tournament-bracket/core/Tournament.ts b/app/features/tournament-bracket/core/Tournament.ts
index c23f43a6c..b4eabbaaf 100644
--- a/app/features/tournament-bracket/core/Tournament.ts
+++ b/app/features/tournament-bracket/core/Tournament.ts
@@ -782,7 +782,7 @@ export class Tournament {
}
get subsFeatureEnabled() {
- return !this.isInvitational;
+ return this.ctx.settings.enableSubs ?? true;
}
get canAddNewSubPost() {