({
label?: string;
bottomText?: string;
error?: string;
- items: Array<{ value: V; resolvedLabel: string }>;
+ items: Array<{
+ value: V;
+ resolvedLabel: string;
+ description?: React.ReactNode;
+ }>;
value: V | null;
onChange: (value: V | null) => void;
onBlur?: () => void;
clearable?: boolean;
disabled?: boolean;
- searchPlaceholder: string;
+ searchPlaceholder?: string;
}) {
const { translatedLabel } = useTranslatedTexts({ label });
- const selectItems = items.map((item) => ({
- id: item.value,
- textValue: item.resolvedLabel,
- }));
+ const hasDescriptions = items.some((item) => item.description);
+
+ // the Autocomplete wrapper of searchable selects drops falsy keys, so only
+ // plain selects render the clear choice as a list item like the native
+ // select's "—" option; searchable ones keep the clear button
+ const hasEmptyItem = Boolean(clearable && !searchPlaceholder);
+
+ const selectItems = [
+ ...(hasEmptyItem
+ ? [{ id: "", textValue: "—", description: undefined }]
+ : []),
+ ...items.map((item) => ({
+ id: item.value as string,
+ textValue: item.resolvedLabel,
+ description: item.description,
+ })),
+ ];
return (
{
const newValue = key === "" ? null : (key as V);
onChange(newValue);
onBlur?.();
}}
items={selectItems}
- search={{ placeholder: searchPlaceholder }}
- clearable={clearable}
+ search={
+ searchPlaceholder ? { placeholder: searchPlaceholder } : undefined
+ }
+ clearable={clearable && !hasEmptyItem}
isDisabled={disabled}
+ estimatedRowHeight={hasDescriptions ? TWO_LINE_ROW_HEIGHT : undefined}
>
{(item) => (
- {item.textValue}
+ {item.description ? (
+
+ {item.textValue}
+
+ {item.description}
+
+
+ ) : (
+ item.textValue
+ )}
)}
diff --git a/app/form/types.ts b/app/form/types.ts
index de732c9fa..e4e01eef8 100644
--- a/app/form/types.ts
+++ b/app/form/types.ts
@@ -1,3 +1,4 @@
+import type * as React from "react";
import type * as v from "valibot";
import type { TeamSearchResult } from "~/components/elements/TeamSearch";
import type { TournamentSearchItem } from "~/components/elements/TournamentSearch";
@@ -59,6 +60,8 @@ interface FormFieldInGameName extends FormFieldBase {
interface FormFieldItem {
label: string | number | ((lang: string) => string);
value: V;
+ /** Second line rendered under the label in the dropdown. Any item having one switches the field to the custom select. */
+ description?: React.ReactNode;
}
interface FormFieldItemWithImage extends FormFieldItem {
@@ -251,6 +254,8 @@ export type TrophyOption = {
export type SelectOption = {
value: string;
label: string;
+ /** Second line rendered under the label in the dropdown. Any option having one switches the field to the custom select. */
+ description?: React.ReactNode;
};
/** Brand type to encode required options directly in schema types */
diff --git a/e2e/pages/tournament/tournament-register-page.ts b/e2e/pages/tournament/tournament-register-page.ts
index 1e85f06b6..a118bc9a9 100644
--- a/e2e/pages/tournament/tournament-register-page.ts
+++ b/e2e/pages/tournament/tournament-register-page.ts
@@ -47,6 +47,15 @@ export class TournamentRegisterPage {
return this.page.getByTestId(`member-num-${number}`);
}
+ availabilityRow(userId: number) {
+ return this.page.getByTestId(`availability-row-${userId}`);
+ }
+
+ /** Opens the quick add dropdown so its player rows render. */
+ async openQuickAdd() {
+ await this.page.getByTestId("quick-add-select").getByRole("button").click();
+ }
+
stepCheckmark(number: number) {
return this.page.getByTestId(`checkmark-icon-num-${number}`);
}
diff --git a/e2e/tournament.spec.ts b/e2e/tournament.spec.ts
index 47cc73aae..591cbf111 100644
--- a/e2e/tournament.spec.ts
+++ b/e2e/tournament.spec.ts
@@ -81,13 +81,13 @@ test.describe("Tournament", () => {
page,
factories,
}) => {
- const [partialMember, unknownMember, stranger, friend] =
- await factories.UserFactory.createMany(4);
+ const [captain, partialMember, unknownMember, stranger, friend] =
+ await factories.UserFactory.createMany(5);
await factories.TeamFactory.create({
- memberUserIds: [ADMIN_ID, partialMember.id, unknownMember.id],
+ memberUserIds: [captain.id, partialMember.id, unknownMember.id],
});
await factories.FriendshipFactory.create({
- userOneId: ADMIN_ID,
+ userOneId: captain.id,
userTwoId: friend.id,
});
@@ -99,7 +99,7 @@ test.describe("Tournament", () => {
await factories.TournamentTeamFactory.create({
tournamentId: tournament.id,
memberUserIds: [
- ADMIN_ID,
+ captain.id,
partialMember.id,
unknownMember.id,
stranger.id,
@@ -114,7 +114,7 @@ test.describe("Tournament", () => {
startsAt: dateToDatabaseTimestamp(startsAt),
endsAt: dateToDatabaseTimestamp(addHours(startsAt, 5)),
};
- for (const userId of [ADMIN_ID, friend.id]) {
+ for (const userId of [captain.id, friend.id]) {
await factories.AvailabilityWeekFactory.create({
userId,
weekStartsAt,
@@ -134,14 +134,13 @@ test.describe("Tournament", () => {
],
});
- await impersonate(page);
+ await impersonate(page, captain.id);
await setTimezoneCookie(page);
const register = new TournamentRegisterPage(page);
await register.goto(tournament.id);
- const row = (userId: number) =>
- page.getByTestId(`availability-row-${userId}`);
- await expect(row(ADMIN_ID)).toHaveAttribute("data-status", "available");
+ const row = (userId: number) => register.availabilityRow(userId);
+ await expect(row(captain.id)).toHaveAttribute("data-status", "available");
await expect(row(partialMember.id)).toHaveAttribute(
"data-status",
"partial",
@@ -153,7 +152,8 @@ test.describe("Tournament", () => {
// on the tournament roster without being a teammate or a friend, so
// their schedule is not the viewer's to see
await expect(row(stranger.id)).toHaveAttribute("data-status", "hidden");
- // the friend with an overlapping submitted range lands in the sub row
+ // the friend with an overlapping submitted range is offered in quick add
+ await register.openQuickAdd();
await expect(row(friend.id)).toHaveAttribute("data-status", "available");
});
diff --git a/locales/da/common.json b/locales/da/common.json
index 25445b424..f4413345f 100644
--- a/locales/da/common.json
+++ b/locales/da/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "Privat",
"or": "Eller",
+ "inviteLink": "",
"yes": "Ja",
"no": "Nej",
"leaderboard.tabs.players": "",
diff --git a/locales/da/tournament.json b/locales/da/tournament.json
index 6065bf5fb..4cdebbe67 100644
--- a/locales/da/tournament.json
+++ b/locales/da/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "Udfyld holdmedlemslisten",
"pre.roster.footer": "Mindst {{atLeastCount}} holdmedlemmer kræves for at deltage. Der kan maks være {{maxCount}} på holdet",
"pre.roster.footer.noSubs": "",
- "pre.roster.addFriend.header": "",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "Fjern medlem",
- "pre.roster.delete.header": "Medlem der fjernes",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "Vælg banepulje",
"pre.pool.banned": "Bandlyst",
"pre.pool.tiebreaker.short": "Tiebreaker",
@@ -153,7 +154,6 @@
"staff.divider.addedForEvent": "",
"staff.editOrganization": "",
"actions.addSub": "tilføj Suppleant",
- "actions.shareLink": "Del invitationslinket for at tilføje medlemmer: {{inviteLink}}",
"actions.sub.prompt_one": "Du kan stadigvæk tilføje {{count}} Suppleant til din holdliste",
"actions.sub.prompt_other": "Du kan stadigvæk tilføje {{count}} Suppleanter til din holdliste",
"actions.sub.prompt_zero": "Din holdliste er fuld, så du kan ikke tilføje flere Suppleanter",
diff --git a/locales/de/common.json b/locales/de/common.json
index b88ca0d4e..804deb45b 100644
--- a/locales/de/common.json
+++ b/locales/de/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "",
"or": "",
+ "inviteLink": "",
"yes": "",
"no": "",
"leaderboard.tabs.players": "",
diff --git a/locales/de/tournament.json b/locales/de/tournament.json
index 72c36c752..0acb9ba0c 100644
--- a/locales/de/tournament.json
+++ b/locales/de/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "Roster füllen",
"pre.roster.footer": "Mindestens {{atLeastCount}} Teammitglieder sind zum Spielen erforderlich. Maximale Rostergröße ist {{maxCount}}",
"pre.roster.footer.noSubs": "",
- "pre.roster.addFriend.header": "",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "Mitglied löschen",
- "pre.roster.delete.header": "Zu entfernendes Mitglied",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "Arenenpool wählen",
"pre.pool.banned": "Gebannt",
"pre.pool.tiebreaker.short": "Tiebreaker",
@@ -153,7 +154,6 @@
"staff.divider.addedForEvent": "",
"staff.editOrganization": "",
"actions.addSub": "Ersatzspieler hinzufügen",
- "actions.shareLink": "Teile deinen Invite-Link, um Mitglieder hinzuzufügen: {{inviteLink}}",
"actions.sub.prompt_one": "Du kannst noch {{count}} Ersatzspieler zu deinem Roster hinzufügen",
"actions.sub.prompt_other": "Du kannst noch {{count}} Ersatzspieler zu deinem Roster hinzufügen",
"actions.sub.prompt_zero": "Dein Roster ist voll und keine weiteren Ersatzspieler können hinzugefügt werden",
diff --git a/locales/en/common.json b/locales/en/common.json
index bd45a0ba0..909e6caec 100644
--- a/locales/en/common.json
+++ b/locales/en/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "Without a link to the player page the request can not be considered. Screenshots are not necessary unless asked for.",
"build.private": "Private",
"or": "Or",
+ "inviteLink": "Invite link",
"yes": "Yes",
"no": "No",
"leaderboard.tabs.players": "Players",
diff --git a/locales/en/tournament.json b/locales/en/tournament.json
index 0b225d3a0..bb2e74d9b 100644
--- a/locales/en/tournament.json
+++ b/locales/en/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "Fill roster",
"pre.roster.footer": "At least {{atLeastCount}} members are required to participate. Max roster size is {{maxCount}}.",
"pre.roster.footer.noSubs": "Format is {{format}}. No subs allowed.",
- "pre.roster.addFriend.header": "Add friends",
- "pre.roster.addFriend.others": "Others",
- "pre.roster.delete.button": "Delete member",
- "pre.roster.delete.header": "Member to delete",
"pre.roster.ignWarning": "Note that you are expected to use the in-game names as listed above. Playing in the event with a different name or using the alias feature might result in disqualification.",
+ "pre.roster.quickAdd": "Quick add",
+ "pre.roster.addMembers": "Add members",
+ "pre.roster.emptySlot": "Empty slot",
+ "pre.roster.emptySlot.optional": "Optional slot",
+ "pre.roster.remove.confirm": "Remove {{name}} from the roster?",
"pre.pool.header": "Pick map pool",
"pre.pool.banned": "Banned",
"pre.pool.tiebreaker.short": "Tiebreaker",
@@ -153,7 +154,6 @@
"staff.divider.addedForEvent": "For this event",
"staff.editOrganization": "Edit organization",
"actions.addSub": "Add sub",
- "actions.shareLink": "Share your invite link to add members: {{inviteLink}}",
"actions.sub.prompt_other": "You can still add {{count}} subs to your roster",
"actions.sub.prompt_one": "You can still add {{count}} sub to your roster",
"actions.sub.prompt_zero": "Your roster is full and more subs can't be added",
diff --git a/locales/es-ES/common.json b/locales/es-ES/common.json
index 74eca0fac..0999aa835 100644
--- a/locales/es-ES/common.json
+++ b/locales/es-ES/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "No se puede tener en cuenta la solicitud sin un enlace a la página de jugador. No hace falta adjuntar capturas a menos que se pidan.",
"build.private": "Privado",
"or": "O",
+ "inviteLink": "",
"yes": "Sí",
"no": "No",
"leaderboard.tabs.players": "",
diff --git a/locales/es-ES/tournament.json b/locales/es-ES/tournament.json
index a658e54bc..e07c3b283 100644
--- a/locales/es-ES/tournament.json
+++ b/locales/es-ES/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "Llenar equipo",
"pre.roster.footer": "Se requieren al menos {{atLeastCount}} miembros para participar. La cantidad máxima es {{maxCount}}",
"pre.roster.footer.noSubs": "El formato es {{format}}. No se permiten subs.",
- "pre.roster.addFriend.header": "Añadir amigos",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "Borrar miembro",
- "pre.roster.delete.header": "Miembro que quieres borrar",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "Escoger grupo de mapas",
"pre.pool.banned": "Prohibidos",
"pre.pool.tiebreaker.short": "Desempate",
@@ -154,7 +155,6 @@
"staff.divider.addedForEvent": "Para este evento",
"staff.editOrganization": "Editar organización",
"actions.addSub": "Añadir sub",
- "actions.shareLink": "Comparte enlace de invitación para añadir miembros: {{inviteLink}}",
"actions.sub.prompt_one": "Aún puedes añadir {{count}} sub a tu equipo",
"actions.sub.prompt_many": "",
"actions.sub.prompt_other": "Aún puedes añadir {{count}} subs a tu equipo",
diff --git a/locales/es-US/common.json b/locales/es-US/common.json
index 088361e5b..fc397756a 100644
--- a/locales/es-US/common.json
+++ b/locales/es-US/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "No se puede tener en cuenta la solicitud sin un enlace a la página de jugador. No hace falta adjuntar capturas a menos que se pidan.",
"build.private": "Privado",
"or": "O",
+ "inviteLink": "",
"yes": "Sí",
"no": "No",
"leaderboard.tabs.players": "",
diff --git a/locales/es-US/tournament.json b/locales/es-US/tournament.json
index c21641bf5..27dee619e 100644
--- a/locales/es-US/tournament.json
+++ b/locales/es-US/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "Llenar equipo",
"pre.roster.footer": "Se requieren al menos {{atLeastCount}} miembros para participar. La cantidad máxima es {{maxCount}}",
"pre.roster.footer.noSubs": "El formato es {{format}}. No se permiten subs.",
- "pre.roster.addFriend.header": "Añadir amigos",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "Borrar miembro",
- "pre.roster.delete.header": "Miembro que quieres borrar",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "Escoger grupo de escenarios",
"pre.pool.banned": "Prohibidos",
"pre.pool.tiebreaker.short": "Desempate",
@@ -154,7 +155,6 @@
"staff.divider.addedForEvent": "Para este evento",
"staff.editOrganization": "Editar organización",
"actions.addSub": "Añadir sub",
- "actions.shareLink": "Comparte enlace de invitación para añadir miembros: {{inviteLink}}",
"actions.sub.prompt_one": "Aún puedes añadir {{count}} sub a tu equipo",
"actions.sub.prompt_many": "",
"actions.sub.prompt_other": "Aún puedes añadir {{count}} subs a tu equipo",
diff --git a/locales/fr-CA/common.json b/locales/fr-CA/common.json
index 88d6efcfb..54200edb0 100644
--- a/locales/fr-CA/common.json
+++ b/locales/fr-CA/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "Privé",
"or": "Ou",
+ "inviteLink": "",
"yes": "Oui",
"no": "Non",
"leaderboard.tabs.players": "",
diff --git a/locales/fr-CA/tournament.json b/locales/fr-CA/tournament.json
index 9de3b4e3c..eb2ee09dd 100644
--- a/locales/fr-CA/tournament.json
+++ b/locales/fr-CA/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "Remplir la liste",
"pre.roster.footer": "Au moins {{atLeastCount}} membres sont requis pour participer. La taille maximum est de {{maxCount}}",
"pre.roster.footer.noSubs": "",
- "pre.roster.addFriend.header": "",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "Effacer membre",
- "pre.roster.delete.header": "Membre à effacer",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "Sélection de stage",
"pre.pool.banned": "",
"pre.pool.tiebreaker.short": "",
@@ -154,7 +155,6 @@
"staff.divider.addedForEvent": "",
"staff.editOrganization": "",
"actions.addSub": "Ajouter remplaçant",
- "actions.shareLink": "Partagez votre lien d'invitation pour ajouter des membres: {{inviteLink}}",
"actions.sub.prompt_one": "Vous pouvez encore ajouter {{count}} remplaçant à votre liste",
"actions.sub.prompt_many": "",
"actions.sub.prompt_other": "Vous pouvez encore ajouter {{count}} remplaçants à votre liste",
diff --git a/locales/fr-EU/common.json b/locales/fr-EU/common.json
index e59d41185..927a88c05 100644
--- a/locales/fr-EU/common.json
+++ b/locales/fr-EU/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "Privé",
"or": "Ou",
+ "inviteLink": "",
"yes": "Oui",
"no": "Non",
"leaderboard.tabs.players": "",
diff --git a/locales/fr-EU/tournament.json b/locales/fr-EU/tournament.json
index 8ba5e4c73..5ee8d9408 100644
--- a/locales/fr-EU/tournament.json
+++ b/locales/fr-EU/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "Remplir la liste",
"pre.roster.footer": "Au moins {{atLeastCount}} membres sont requis pour participer. La taille maximum est de {{maxCount}}",
"pre.roster.footer.noSubs": "",
- "pre.roster.addFriend.header": "",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "Effacer membre",
- "pre.roster.delete.header": "Membre à effacer",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "Sélection de stage",
"pre.pool.banned": "Bannis",
"pre.pool.tiebreaker.short": "Manche décisive",
@@ -154,7 +155,6 @@
"staff.divider.addedForEvent": "",
"staff.editOrganization": "",
"actions.addSub": "Ajouter remplaçant",
- "actions.shareLink": "Partagez votre lien d'invitation pour ajouter des membres: {{inviteLink}}",
"actions.sub.prompt_one": "Vous pouvez encore ajouter {{count}} remplaçant à votre liste",
"actions.sub.prompt_many": "",
"actions.sub.prompt_other": "Vous pouvez encore ajouter {{count}} remplaçants à votre liste",
diff --git a/locales/he/common.json b/locales/he/common.json
index 0c4460ded..37655eb30 100644
--- a/locales/he/common.json
+++ b/locales/he/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "פרטי",
"or": "או",
+ "inviteLink": "",
"yes": "כן",
"no": "לא",
"leaderboard.tabs.players": "",
diff --git a/locales/he/tournament.json b/locales/he/tournament.json
index 3555e5576..7d2b59b4b 100644
--- a/locales/he/tournament.json
+++ b/locales/he/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "מלא צוות",
"pre.roster.footer": "לפחות {{atLeastCount}} חברי צוות נדרשים כדי להשתתף. גודל הצוות המרבי הוא {{maxCount}}",
"pre.roster.footer.noSubs": "",
- "pre.roster.addFriend.header": "",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "מחקו חבר צוות",
- "pre.roster.delete.header": "חבר צוות למחיקה",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "בחרו מאגר מפות",
"pre.pool.banned": "",
"pre.pool.tiebreaker.short": "",
@@ -154,7 +155,6 @@
"staff.divider.addedForEvent": "",
"staff.editOrganization": "",
"actions.addSub": "הוסיפו ממלא מקום",
- "actions.shareLink": "שתפו קישור הזמנה להוספת חברי צוות: {{inviteLink}}",
"actions.sub.prompt_one": "אתם עדיין יכולים להוסיף {{count}} ממלא מקום לצוות שלכם",
"actions.sub.prompt_two": "",
"actions.sub.prompt_other": "אתם עדיין יכולים להוסיף {{count}} ממלאי מקום לצוות שלכם",
diff --git a/locales/it/common.json b/locales/it/common.json
index 379706b0b..5c018c72c 100644
--- a/locales/it/common.json
+++ b/locales/it/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "Privato",
"or": "O",
+ "inviteLink": "",
"yes": "Sì",
"no": "No",
"leaderboard.tabs.players": "",
diff --git a/locales/it/tournament.json b/locales/it/tournament.json
index 3c6e54276..56e96581f 100644
--- a/locales/it/tournament.json
+++ b/locales/it/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "Riempi roster",
"pre.roster.footer": "Sono necessari almeno {{atLeastCount}} membri per partecipare. La dimensione massima del roster è {{maxCount}}",
"pre.roster.footer.noSubs": "",
- "pre.roster.addFriend.header": "",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "Elimina membro",
- "pre.roster.delete.header": "Membro da eliminare",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "Scegli pool mappe",
"pre.pool.banned": "Banneta",
"pre.pool.tiebreaker.short": "Spareggio",
@@ -154,7 +155,6 @@
"staff.divider.addedForEvent": "",
"staff.editOrganization": "",
"actions.addSub": "Aggiungi sub",
- "actions.shareLink": "Condividi il tuo link d'invito per aggiungere membri: {{inviteLink}}",
"actions.sub.prompt_one": "Puoi ancora aggiungere {{count}} sub al tuo roster",
"actions.sub.prompt_many": "",
"actions.sub.prompt_other": "Puoi ancora aggiungere {{count}} sub al tuo roster",
diff --git a/locales/ja/common.json b/locales/ja/common.json
index f02a9d7b3..242eab479 100644
--- a/locales/ja/common.json
+++ b/locales/ja/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "非公開",
"or": "または",
+ "inviteLink": "",
"yes": "はい",
"no": "いいえ",
"leaderboard.tabs.players": "",
diff --git a/locales/ja/tournament.json b/locales/ja/tournament.json
index 030b0d28b..313eb7df3 100644
--- a/locales/ja/tournament.json
+++ b/locales/ja/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "参加プレイヤーを登録",
"pre.roster.footer": "少なくとも {{atLeastCount}} 人の参加が必要です。最大メンバー数は {{maxCount}} です。",
"pre.roster.footer.noSubs": "",
- "pre.roster.addFriend.header": "",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "メンバーを削除する",
- "pre.roster.delete.header": "削除するメンバー",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "マッププールを選択する",
"pre.pool.banned": "禁止",
"pre.pool.tiebreaker.short": "タイブレイカー",
@@ -151,7 +152,6 @@
"staff.divider.addedForEvent": "",
"staff.editOrganization": "",
"actions.addSub": "サブを追加",
- "actions.shareLink": "メンバー招待リンクをシェアする: {{inviteLink}}",
"actions.sub.prompt_zero": "メンバーが上限に達しているので、これ以上サブを追加することができません",
"actions.finalize": "",
"actions.finalize.button": "",
diff --git a/locales/ko/common.json b/locales/ko/common.json
index 22e38c156..a0b27a283 100644
--- a/locales/ko/common.json
+++ b/locales/ko/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "Private",
"or": "또는",
+ "inviteLink": "",
"yes": "네",
"no": "아니오",
"leaderboard.tabs.players": "",
diff --git a/locales/ko/tournament.json b/locales/ko/tournament.json
index bef3bf695..bfb94770a 100644
--- a/locales/ko/tournament.json
+++ b/locales/ko/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "",
"pre.roster.footer": "",
"pre.roster.footer.noSubs": "",
- "pre.roster.addFriend.header": "",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "",
- "pre.roster.delete.header": "",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "",
"pre.pool.banned": "",
"pre.pool.tiebreaker.short": "",
@@ -151,7 +152,6 @@
"staff.divider.addedForEvent": "",
"staff.editOrganization": "",
"actions.addSub": "",
- "actions.shareLink": "",
"actions.sub.prompt_zero": "",
"actions.finalize": "",
"actions.finalize.button": "",
diff --git a/locales/nl/common.json b/locales/nl/common.json
index 1df29613d..b548ac021 100644
--- a/locales/nl/common.json
+++ b/locales/nl/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "",
"or": "",
+ "inviteLink": "",
"yes": "",
"no": "",
"leaderboard.tabs.players": "",
diff --git a/locales/nl/tournament.json b/locales/nl/tournament.json
index 0e768460f..c80ec0b42 100644
--- a/locales/nl/tournament.json
+++ b/locales/nl/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "",
"pre.roster.footer": "",
"pre.roster.footer.noSubs": "",
- "pre.roster.addFriend.header": "",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "",
- "pre.roster.delete.header": "",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "",
"pre.pool.banned": "",
"pre.pool.tiebreaker.short": "",
@@ -153,7 +154,6 @@
"staff.divider.addedForEvent": "",
"staff.editOrganization": "",
"actions.addSub": "",
- "actions.shareLink": "",
"actions.sub.prompt_one": "",
"actions.sub.prompt_other": "",
"actions.sub.prompt_zero": "",
diff --git a/locales/pl/common.json b/locales/pl/common.json
index 74f7b186b..2ad53ffbe 100644
--- a/locales/pl/common.json
+++ b/locales/pl/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "",
"or": "",
+ "inviteLink": "",
"yes": "",
"no": "",
"leaderboard.tabs.players": "",
diff --git a/locales/pl/tournament.json b/locales/pl/tournament.json
index 45d245417..dcf9c2abb 100644
--- a/locales/pl/tournament.json
+++ b/locales/pl/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "",
"pre.roster.footer": "",
"pre.roster.footer.noSubs": "",
- "pre.roster.addFriend.header": "",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "",
- "pre.roster.delete.header": "",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "",
"pre.pool.banned": "",
"pre.pool.tiebreaker.short": "",
@@ -155,7 +156,6 @@
"staff.divider.addedForEvent": "",
"staff.editOrganization": "",
"actions.addSub": "",
- "actions.shareLink": "",
"actions.sub.prompt_one": "",
"actions.sub.prompt_few": "",
"actions.sub.prompt_many": "",
diff --git a/locales/pt-BR/common.json b/locales/pt-BR/common.json
index 6a21b22e4..d75a4dd7f 100644
--- a/locales/pt-BR/common.json
+++ b/locales/pt-BR/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "Privada",
"or": "Ou",
+ "inviteLink": "",
"yes": "Sim",
"no": "Não",
"leaderboard.tabs.players": "",
diff --git a/locales/pt-BR/tournament.json b/locales/pt-BR/tournament.json
index c44589c13..637ea2159 100644
--- a/locales/pt-BR/tournament.json
+++ b/locales/pt-BR/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "Preencher lista",
"pre.roster.footer": "Pelo menos {{atLeastCount}} membros são necessários para participar. O número máximo da lista de participantes é de {{maxCount}}",
"pre.roster.footer.noSubs": "",
- "pre.roster.addFriend.header": "",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "Excluir membro",
- "pre.roster.delete.header": "Membro a ser excluído",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "Escolher seleção de mapas",
"pre.pool.banned": "Banido",
"pre.pool.tiebreaker.short": "Desempate",
@@ -154,7 +155,6 @@
"staff.divider.addedForEvent": "",
"staff.editOrganization": "",
"actions.addSub": "Adicionar substituto(a)",
- "actions.shareLink": "Compartilhe seu link de convite para adicionar membros: {{inviteLink}}",
"actions.sub.prompt_one": "Você ainda pode adicionar {{count}} substituto(a) à sua lista",
"actions.sub.prompt_many": "",
"actions.sub.prompt_other": "Você ainda pode adicionar {{count}} substitutos(as) à sua lista",
diff --git a/locales/ru/common.json b/locales/ru/common.json
index aa691577d..e22052721 100644
--- a/locales/ru/common.json
+++ b/locales/ru/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "Приватный",
"or": "Или",
+ "inviteLink": "",
"yes": "Да",
"no": "Нет",
"leaderboard.tabs.players": "",
diff --git a/locales/ru/tournament.json b/locales/ru/tournament.json
index 4e7e5bff4..868ee9d2d 100644
--- a/locales/ru/tournament.json
+++ b/locales/ru/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "Заполните состав",
"pre.roster.footer": "Необходимый минимум игроков для данного турнира: {{atLeastCount}}. Максимальное количество игроков в составе: {{maxCount}}",
"pre.roster.footer.noSubs": "",
- "pre.roster.addFriend.header": "",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "Удалить участника",
- "pre.roster.delete.header": "Участник для удаления",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "Выберите пул арен",
"pre.pool.banned": "Запрещено",
"pre.pool.tiebreaker.short": "Тайбрейк",
@@ -155,7 +156,6 @@
"staff.divider.addedForEvent": "",
"staff.editOrganization": "",
"actions.addSub": "Добавить запасного",
- "actions.shareLink": "Ссылка приглашения в команду: {{inviteLink}}",
"actions.sub.prompt_one": "Вы ещё можете добавить {{count}} запасного",
"actions.sub.prompt_few": "",
"actions.sub.prompt_many": "",
diff --git a/locales/zh/common.json b/locales/zh/common.json
index 5aef5d4a8..255324406 100644
--- a/locales/zh/common.json
+++ b/locales/zh/common.json
@@ -360,6 +360,7 @@
"xsearch.link.noScreenshots": "",
"build.private": "私人",
"or": "或",
+ "inviteLink": "",
"yes": "是",
"no": "否",
"leaderboard.tabs.players": "",
diff --git a/locales/zh/tournament.json b/locales/zh/tournament.json
index b9b53fff4..3dc548979 100644
--- a/locales/zh/tournament.json
+++ b/locales/zh/tournament.json
@@ -57,11 +57,12 @@
"pre.roster.header": "填写阵容",
"pre.roster.footer": "至少需要 {{atLeastCount}} 名成员才能参赛。最大阵容人数为 {{maxCount}} 人。",
"pre.roster.footer.noSubs": "赛制为 {{format}}。不允许替补。",
- "pre.roster.addFriend.header": "添加好友",
- "pre.roster.addFriend.others": "",
- "pre.roster.delete.button": "删除成员",
- "pre.roster.delete.header": "要删除的成员",
"pre.roster.ignWarning": "",
+ "pre.roster.quickAdd": "",
+ "pre.roster.addMembers": "",
+ "pre.roster.emptySlot": "",
+ "pre.roster.emptySlot.optional": "",
+ "pre.roster.remove.confirm": "",
"pre.pool.header": "选择场地池",
"pre.pool.banned": "已禁用",
"pre.pool.tiebreaker.short": "决胜局场地",
@@ -152,7 +153,6 @@
"staff.divider.addedForEvent": "仅限此赛事",
"staff.editOrganization": "编辑组织",
"actions.addSub": "添加替补",
- "actions.shareLink": "分享您的邀请链接以添加成员: {{inviteLink}}",
"actions.sub.prompt": "您仍可以向阵容中添加 {{count}} 名替补",
"actions.sub.prompt_zero": "您的阵容已满,无法添加更多替补",
"actions.finalize": "正在结束赛事",