feat: New Open Tab dialog with search and optional customer email. Drinks are now grouped per order. Payments trigger cha-ching and money rain.

This commit is contained in:
2026-10-28 02:11:32 +01:00
parent 1aee0541c4
commit 29ceb51177
41 changed files with 2771 additions and 812 deletions
+15 -1
View File
@@ -125,6 +125,14 @@
"incorrectPin": "Incorrect PIN.",
"tooManyPinAttempts": "Too many attempts. Try again later.",
"removed": "Removed",
"removedCount": "{count} removed",
"@removedCount": {"placeholders": {"count": {"type": "int"}}},
"orderStartedToday": "{time} today",
"@orderStartedToday": {"placeholders": {"time": {"type": "String"}}},
"orderStartedYesterday": "{time} yesterday",
"@orderStartedYesterday": {"placeholders": {"time": {"type": "String"}}},
"orderStartedOn": "{date} {time}",
"@orderStartedOn": {"placeholders": {"date": {"type": "String"}, "time": {"type": "String"}}},
"enterPrice": "Enter a price.",
"enterValidPrice": "Enter a valid price.",
"enterValidStock": "Enter a valid stock amount.",
@@ -365,5 +373,11 @@
"creditsEveryoneAtTheBar": "Everyone at the bar",
"creditsDrinkResponsibly": "Drink responsibly. Mostly.",
"lazyPinRemark": "🤨 Really?",
"rainbowRoad": "Rainbow road 🌈"
"rainbowRoad": "Rainbow road 🌈",
"newCustomer": "New customer",
"emailOptional": "Email (optional)",
"invalidEmail": "Enter a valid email address",
"allTabsOpen": "Every tab is already open",
"noTabsFound": "No tabs found",
"nameRequired": "Enter a name"
}
+60
View File
@@ -800,6 +800,30 @@ abstract class AppLocalizations {
/// **'Removed'**
String get removed;
/// No description provided for @removedCount.
///
/// In en, this message translates to:
/// **'{count} removed'**
String removedCount(int count);
/// No description provided for @orderStartedToday.
///
/// In en, this message translates to:
/// **'{time} today'**
String orderStartedToday(String time);
/// No description provided for @orderStartedYesterday.
///
/// In en, this message translates to:
/// **'{time} yesterday'**
String orderStartedYesterday(String time);
/// No description provided for @orderStartedOn.
///
/// In en, this message translates to:
/// **'{date} {time}'**
String orderStartedOn(String date, String time);
/// No description provided for @enterPrice.
///
/// In en, this message translates to:
@@ -2089,6 +2113,42 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Rainbow road 🌈'**
String get rainbowRoad;
/// No description provided for @newCustomer.
///
/// In en, this message translates to:
/// **'New customer'**
String get newCustomer;
/// No description provided for @emailOptional.
///
/// In en, this message translates to:
/// **'Email (optional)'**
String get emailOptional;
/// No description provided for @invalidEmail.
///
/// In en, this message translates to:
/// **'Enter a valid email address'**
String get invalidEmail;
/// No description provided for @allTabsOpen.
///
/// In en, this message translates to:
/// **'Every tab is already open'**
String get allTabsOpen;
/// No description provided for @noTabsFound.
///
/// In en, this message translates to:
/// **'No tabs found'**
String get noTabsFound;
/// No description provided for @nameRequired.
///
/// In en, this message translates to:
/// **'Enter a name'**
String get nameRequired;
}
class _AppLocalizationsDelegate
+38
View File
@@ -393,6 +393,26 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get removed => 'Removed';
@override
String removedCount(int count) {
return '$count removed';
}
@override
String orderStartedToday(String time) {
return '$time today';
}
@override
String orderStartedYesterday(String time) {
return '$time yesterday';
}
@override
String orderStartedOn(String date, String time) {
return '$date $time';
}
@override
String get enterPrice => 'Enter a price.';
@@ -1110,4 +1130,22 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get rainbowRoad => 'Rainbow road 🌈';
@override
String get newCustomer => 'New customer';
@override
String get emailOptional => 'Email (optional)';
@override
String get invalidEmail => 'Enter a valid email address';
@override
String get allTabsOpen => 'Every tab is already open';
@override
String get noTabsFound => 'No tabs found';
@override
String get nameRequired => 'Enter a name';
}
+41 -3
View File
@@ -334,7 +334,7 @@ class AppLocalizationsNl extends AppLocalizations {
String get total => 'Totaal';
@override
String get closeTab => 'Poef sluiten';
String get closeTab => 'Poef afsluiten';
@override
String productStockSummary(String category, String price, int stock) {
@@ -397,6 +397,26 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get removed => 'Verwijderd';
@override
String removedCount(int count) {
return '$count verwijderd';
}
@override
String orderStartedToday(String time) {
return '$time vandaag';
}
@override
String orderStartedYesterday(String time) {
return '$time gisteren';
}
@override
String orderStartedOn(String date, String time) {
return '$date $time';
}
@override
String get enterPrice => 'Voer een prijs in.';
@@ -441,7 +461,7 @@ class AppLocalizationsNl extends AppLocalizations {
String get couldNotCloseTab => 'Poef kon niet worden gesloten.';
@override
String get closingTab => 'Poef sluiten…';
String get closingTab => 'Poef afsluiten…';
@override
String get slideToConfirmClosing => 'Schuif om het sluiten te bevestigen';
@@ -977,7 +997,7 @@ class AppLocalizationsNl extends AppLocalizations {
}
@override
String get remoteCommandCloseTab => 'Poef sluiten via dashboard';
String get remoteCommandCloseTab => 'Poef afsluiten via dashboard';
@override
String remoteCommandUnknown(String type) {
@@ -1124,4 +1144,22 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get rainbowRoad => 'Regenboogweg 🌈';
@override
String get newCustomer => 'Nieuwe klant';
@override
String get emailOptional => 'E-mail (optioneel)';
@override
String get invalidEmail => 'Geef een geldig e-mailadres in';
@override
String get allTabsOpen => 'Alle poefs zijn al open';
@override
String get noTabsFound => 'Geen poefs gevonden';
@override
String get nameRequired => 'Geef een naam in';
}
+14 -4
View File
@@ -104,7 +104,7 @@
"@tabItemCount": {"placeholders": {"count": {"type": "int"}}},
"tapProductsToAdd": "Tik op producten om ze toe te voegen",
"total": "Totaal",
"closeTab": "Poef sluiten",
"closeTab": "Poef afsluiten",
"productStockSummary": "{category} • {price} • Voorraad: {stock}",
"@productStockSummary": {"placeholders": {"category": {"type": "String"}, "price": {"type": "String"}, "stock": {"type": "int"}}},
"infiniteStock": "Oneindige voorraad",
@@ -125,6 +125,10 @@
"incorrectPin": "Onjuiste PIN.",
"tooManyPinAttempts": "Te veel pogingen. Probeer het later opnieuw.",
"removed": "Verwijderd",
"removedCount": "{count} verwijderd",
"orderStartedToday": "{time} vandaag",
"orderStartedYesterday": "{time} gisteren",
"orderStartedOn": "{date} {time}",
"enterPrice": "Voer een prijs in.",
"enterValidPrice": "Voer een geldige prijs in.",
"enterValidStock": "Voer een geldige voorraad in.",
@@ -140,7 +144,7 @@
"currentTotal": "Huidig totaal: {total}",
"@currentTotal": {"placeholders": {"total": {"type": "String"}}},
"couldNotCloseTab": "Poef kon niet worden gesloten.",
"closingTab": "Poef sluiten…",
"closingTab": "Poef afsluiten…",
"slideToConfirmClosing": "Schuif om het sluiten te bevestigen",
"errorScreen": "Foutscherm",
"unexpectedError": "Er is een onverwachte fout opgetreden.\nProbeer de app opnieuw te starten.",
@@ -307,7 +311,7 @@
"justNow": "zonet",
"minutesAgo": "{count, plural, =1{1 minuut geleden} other{{count} minuten geleden}}",
"hoursAgo": "{count, plural, =1{1 uur geleden} other{{count} uur geleden}}",
"remoteCommandCloseTab": "Poef sluiten via dashboard",
"remoteCommandCloseTab": "Poef afsluiten via dashboard",
"remoteCommandUnknown": "Onbekende opdracht ({type})",
"commandCompleted": "Uitgevoerd",
"commandConflict": "Conflict",
@@ -353,5 +357,11 @@
"creditsEveryoneAtTheBar": "Iedereen aan de toog",
"creditsDrinkResponsibly": "Drink met mate. Meestal.",
"lazyPinRemark": "🤨 Echt?",
"rainbowRoad": "Regenboogweg 🌈"
"rainbowRoad": "Regenboogweg 🌈",
"newCustomer": "Nieuwe klant",
"emailOptional": "E-mail (optioneel)",
"invalidEmail": "Geef een geldig e-mailadres in",
"allTabsOpen": "Alle poefs zijn al open",
"noTabsFound": "Geen poefs gevonden",
"nameRequired": "Geef een naam in"
}