([]);
@@ -36,6 +40,8 @@ export default function WeekEditor({ monday }: { monday: string }) {
);
const [selectedDish, setSelectedDish] = useState("");
const [dishSearch, setDishSearch] = useState("");
+ // Mobil: ein Tag auf einmal statt aller fünf gleichzeitig
+ const [selectedDayIdx, setSelectedDayIdx] = useState(todayIdx >= 0 ? todayIdx : 0);
function startAdding(iso: string, section: string) {
setAdding({ iso, section });
@@ -108,6 +114,117 @@ export default function WeekEditor({ monday }: { monday: string }) {
? dishes.filter((d) => localized(d, locale).toLowerCase().includes(query))
: dishes;
+ // Inhalt einer Tag/Essenszeit-Zelle: Eintragsliste + "hinzufügen"-Flow.
+ // Identisches Fragment für Desktop-Tabelle und Mobile-Karten, damit der
+ // Bearbeitungs-Zustand (adding/selectedDish/dishSearch) nicht dupliziert
+ // werden muss – nur eine Zelle kann gleichzeitig bearbeitet werden,
+ // unabhängig davon, welche Ansicht gerade rendert.
+ function renderCell(iso: string, sectionKey: string) {
+ const isAdding = adding?.iso === iso && adding?.section === sectionKey;
+ return (
+ <>
+ {entriesFor(entries, iso, sectionKey).map((e) => {
+ const codes = dishCodes(e.dish);
+ return (
+
+
{localized(e.dish, locale)}
+ {codes &&
{codes}}
+ {" – "}
+ {formatPrice(e.dish.price)}
+
+
+
+
+ );
+ })}
+ {isAdding ? (
+
+ {selectedDishObj ? (
+
+
+ {localized(selectedDishObj, locale)} (
+ {formatPrice(selectedDishObj.price)})
+
+
+
+ ) : (
+ <>
+
setDishSearch(e.target.value)}
+ />
+
+ {filteredDishes.map((dish) => (
+ -
+
+
+ ))}
+ {filteredDishes.length === 0 && (
+ -
+ {formatMessage(dict.dishManager.noResults, {
+ query: dishSearch,
+ })}
+
+ )}
+
+ >
+ )}
+
+
+
+
+
+ ) : (
+
+ )}
+ >
+ );
+ }
+
+ const selectedDay = days[selectedDayIdx];
+
return (
@@ -136,140 +253,76 @@ export default function WeekEditor({ monday }: { monday: string }) {
{loading ? (
{dict.weekEditor.loading}
) : (
-
-
-
- |
- {days.map((d) => (
-
- {d.weekday}
-
- {formatDateLong(d.iso, dict.dateLocale)}
- |
+ <>
+ {/* Mobil (< "sm"): ein Tag auf einmal, per Tabs gewählt */}
+
+
+ {days.map((d, i) => (
+
))}
-
-
-
- {sections.map((s) => (
-
- |
- {localized(s, locale)}
- {s.time_range}
- |
- {days.map((d) => {
- const isAdding =
- adding?.iso === d.iso && adding?.section === s.key;
- return (
-
- {entriesFor(entries, d.iso, s.key).map((e) => {
- const codes = dishCodes(e.dish);
- return (
-
-
- {localized(e.dish, locale)}
-
- {codes && {codes}}
- {" – "}
- {formatPrice(e.dish.price)}
-
-
-
-
- );
- })}
- {isAdding ? (
-
- {selectedDishObj ? (
-
-
- {localized(selectedDishObj, locale)} (
- {formatPrice(selectedDishObj.price)})
-
-
-
- ) : (
- <>
- setDishSearch(e.target.value)}
- />
-
- {filteredDishes.map((dish) => (
- -
-
-
- ))}
- {filteredDishes.length === 0 && (
- -
- {formatMessage(dict.dishManager.noResults, {
- query: dishSearch,
- })}
-
- )}
-
- >
- )}
-
-
-
-
-
- ) : (
-
- )}
- |
- );
- })}
-
- ))}
-
-
+
+
+ {selectedDay.weekday} · {formatDateLong(selectedDay.iso, dict.dateLocale)}
+
+
+ {sections.map((s) => (
+
+
+ {localized(s, locale)}{" "}
+ · {s.time_range}
+
+
+ {renderCell(selectedDay.iso, s.key)}
+
+
+ ))}
+
+
+
+ {/* Ab "sm": klassische Wochentabelle */}
+
+
+
+
+ |
+ {days.map((d) => (
+
+ {d.weekday}
+
+ {formatDateLong(d.iso, dict.dateLocale)}
+ |
+ ))}
+
+
+
+ {sections.map((s) => (
+
+ |
+ {localized(s, locale)}
+ {s.time_range}
+ |
+ {days.map((d) => (
+
+ {renderCell(d.iso, s.key)}
+ |
+ ))}
+
+ ))}
+
+
+
+ >
)}
{hintBefore}
diff --git a/lib/i18n/dictionaries.ts b/lib/i18n/dictionaries.ts
index 5672ac2..05e0505 100644
--- a/lib/i18n/dictionaries.ts
+++ b/lib/i18n/dictionaries.ts
@@ -40,6 +40,7 @@ const de = {
openSuggestions: "{count} offene Rezeptvorschläge",
viewMenu: "Speisekarte ansehen",
myAccount: "Mein Konto",
+ menuToggle: "Menü öffnen/schließen",
},
login: {
title: "Anmeldung",
@@ -333,6 +334,7 @@ const en: Dict = {
openSuggestions: "{count} open dish suggestions",
viewMenu: "View menu",
myAccount: "My account",
+ menuToggle: "Open/close menu",
},
login: {
title: "Sign in",
@@ -623,6 +625,7 @@ const pl: Dict = {
openSuggestions: "{count} otwartych propozycji dań",
viewMenu: "Zobacz jadłospis",
myAccount: "Moje konto",
+ menuToggle: "Otwórz/zamknij menu",
},
login: {
title: "Logowanie",
diff --git a/package-lock.json b/package-lock.json
index d889565..e40b434 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "canteen-menu",
- "version": "1.8.1",
+ "version": "1.9.5",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "canteen-menu",
- "version": "1.8.1",
+ "version": "1.9.5",
"dependencies": {
"@simplewebauthn/browser": "^13.3.0",
"@simplewebauthn/server": "^13.3.2",
diff --git a/package.json b/package.json
index f124cd4..071a4fd 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "canteen-menu",
- "version": "1.9.0",
+ "version": "1.9.5",
"private": true,
"scripts": {
"predev": "node --env-file-if-exists=.env.local db/migrate.mjs && node --env-file-if-exists=.env.local scripts/bootstrap-admin.mjs",