From eaf0bc353dc939842daefd373526da2b0a62b2cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20H=C3=A1jek?= Date: Sat, 1 Feb 2025 23:42:10 +0100 Subject: [PATCH] =?UTF-8?q?V=C3=BDb=C4=9Br=20ob=C4=9Bdu=20kliknut=C3=ADm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/App.tsx | 25 ++++++++++++++++--------- server/src/service.ts | 12 ++++++++++-- types/Types.ts | 1 + 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/client/src/App.tsx b/client/src/App.tsx index aba63fb..33ae9ad 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -189,6 +189,13 @@ function App() { } }, [auth?.login, easterEgg?.duration, easterEgg?.url, eggImage]); + const doAddClickFoodChoice = async (location: Locations, foodIndex: number) => { + const locationKey = Object.keys(Locations).find(key => Locations[key as keyof typeof Locations] === location) as LocationKey; + if (auth?.login) { + await errorHandler(() => addChoice(locationKey, foodIndex, dayIndex)); + } + } + const doAddChoice = async (event: React.ChangeEvent) => { const locationKey = event.target.value as LocationKey; if (auth?.login) { @@ -331,15 +338,15 @@ function App() { } } - const renderFoodTable = (name: string, menu: DayMenu) => { + const renderFoodTable = (name: string, location: Locations, menu: DayMenu) => { let content; if (menu?.closed) { content =

Zavřeno

} else if (menu?.food?.length > 0) { content = - + {menu.food.filter(f => (settings?.hideSoups ? !f.isSoup : true)).map((f: any, index: number) => - + doAddClickFoodChoice(location, index)}> @@ -401,8 +408,8 @@ function App() { Poslední změny: {dayIndex != null && @@ -413,11 +420,11 @@ function App() { } - {food[Restaurants.SLADOVNICKA] && renderFoodTable('Sladovnická', food[Restaurants.SLADOVNICKA])} + {food[Restaurants.SLADOVNICKA] && renderFoodTable('Sladovnická', Locations.SLADOVNICKA, food[Restaurants.SLADOVNICKA])} {/* {food[Restaurants.UMOTLIKU] && renderFoodTable('U Motlíků', food[Restaurants.UMOTLIKU])} */} - {food[Restaurants.TECHTOWER] && renderFoodTable('TechTower', food[Restaurants.TECHTOWER])} - {food[Restaurants.ZASTAVKAUMICHALA] && renderFoodTable('Zastávka u Michala', food[Restaurants.ZASTAVKAUMICHALA])} - {food[Restaurants.SENKSERIKOVA] && renderFoodTable('Pivovarský šenk Šeříková', food[Restaurants.SENKSERIKOVA])} + {food[Restaurants.TECHTOWER] && renderFoodTable('TechTower', Locations.TECHTOWER, food[Restaurants.TECHTOWER])} + {food[Restaurants.ZASTAVKAUMICHALA] && renderFoodTable('Zastávka u Michala', Locations.ZASTAVKAUMICHALA, food[Restaurants.ZASTAVKAUMICHALA])} + {food[Restaurants.SENKSERIKOVA] && renderFoodTable('Pivovarský šenk Šeříková', Locations.SENKSERIKOVA, food[Restaurants.SENKSERIKOVA])}
diff --git a/server/src/service.ts b/server/src/service.ts index 244c9e5..f201446 100644 --- a/server/src/service.ts +++ b/server/src/service.ts @@ -268,14 +268,19 @@ export async function removeChoice(login: string, trusted: boolean, locationKey: } /** - * Odstraní kompletně volbu uživatele. + * Odstraní kompletně volbu uživatele, vyjma ignoredLocationKey (pokud byla předána a existuje). * * @param login login uživatele + * @param date datum, ke kterému se volby vztahují + * @param ignoredLocationKey volba, která nebude odstraněna, pokud existuje */ -async function removeChoiceIfPresent(login: string, date: string) { +async function removeChoiceIfPresent(login: string, date: string, ignoredLocationKey?: LocationKey) { let data: DayData = await storage.getData(date); for (const key of Object.keys(data.choices)) { const locationKey = key as LocationKey; + if (ignoredLocationKey != null && ignoredLocationKey == locationKey) { + continue; + } if (data.choices[locationKey] && login in data.choices[locationKey]) { delete data.choices[locationKey][login]; if (Object.keys(data.choices[locationKey]).length === 0) { @@ -329,6 +334,9 @@ export async function addChoice(login: string, trusted: boolean, locationKey: Lo // Pokud měníme pouze lokaci, mažeme případné předchozí if (foodIndex == null) { data = await removeChoiceIfPresent(login, selectedDate); + } else { + // Mažeme případné ostatní volby (měla by být maximálně jedna) + removeChoiceIfPresent(login, selectedDate, locationKey); } // TODO vytáhnout inicializaci "prázdné struktury" do vlastní funkce if (!(data.choices[locationKey])) { diff --git a/types/Types.ts b/types/Types.ts index 82112f9..84b91ea 100644 --- a/types/Types.ts +++ b/types/Types.ts @@ -111,6 +111,7 @@ export type Food = { } // TODO tohle je dost špatné pojmenování, vzhledem k tomu co to obsahuje +// TODO pokud by se použilo ovládáni výběru obědu kliknutím, pak bych restaurace z tohoto výčtu vyhodil export enum Locations { SLADOVNICKA = 'Sladovnická', // UMOTLIKU = 'U Motlíků',
{f.amount} {f.name} {f.price}