feat: make server owner of tabs

This commit is contained in:
2026-10-20 16:15:14 +02:00
parent 5754ae742d
commit 93acfe15a9
26 changed files with 3654 additions and 389 deletions
+3 -15
View File
@@ -9,7 +9,6 @@ import '../../l10n/app_localizations.dart';
import '../../l10n/app_localizations_helpers.dart';
import '../../models/product.dart';
import '../../models/remote_command.dart';
import '../../services/product_service.dart';
import '../../utils/app_updater.dart';
import '../../viewmodels/admin_pin_view_model.dart';
import '../../viewmodels/bar_screen_view_model.dart';
@@ -85,15 +84,9 @@ class _BarScreenViewState extends State<BarScreenView> {
await viewModel.addProductToSelectedTab(product);
} catch (e) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
e is InsufficientStockException
? l10n.productOutOfStock
: l10n.couldNotAddProductToTab,
),
),
);
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text(l10n.couldNotAddProductToTab)));
}
}
@@ -108,10 +101,6 @@ class _BarScreenViewState extends State<BarScreenView> {
final viewModel = context.watch<BarScreenViewModel>();
final productsViewModel = context.watch<ProductListViewModel>();
final settings = context.watch<SettingsViewModel>().settings;
final stockByProductId = {
for (final product in productsViewModel.products)
if (!product.infiniteStock) product.id: product.stockQuantity,
};
return Scaffold(
appBar: AppBar(
@@ -206,7 +195,6 @@ class _BarScreenViewState extends State<BarScreenView> {
tabs: viewModel.tabs,
selectedTab: viewModel.selectedTab,
selectedTabId: viewModel.selectedTabId,
stockByProductId: stockByProductId,
showSearch: _showSearch,
onTabSelected: viewModel.selectTab,
onItemQuantityChanged: viewModel.changeItemQuantity,
+4 -20
View File
@@ -3,19 +3,16 @@ import 'package:flutter/material.dart';
import '../../l10n/app_localizations.dart';
import '../../models/bar_tab.dart';
import '../../models/tab_item.dart';
import '../../services/product_service.dart';
import '../../utils/money.dart';
class SelectedTabDetails extends StatelessWidget {
final BarTab tab;
final Map<String, int> stockByProductId;
final Future<void> Function(TabItem item, int delta) onItemQuantityChanged;
final VoidCallback onCloseTabPressed;
const SelectedTabDetails({
super.key,
required this.tab,
required this.stockByProductId,
required this.onItemQuantityChanged,
required this.onCloseTabPressed,
});
@@ -55,7 +52,6 @@ class SelectedTabDetails extends StatelessWidget {
return TabItemRow(
item: item,
stockByProductId: stockByProductId,
onQuantityChanged: onItemQuantityChanged,
);
},
@@ -108,13 +104,11 @@ class SelectedTabDetails extends StatelessWidget {
class TabItemRow extends StatelessWidget {
final TabItem item;
final Map<String, int> stockByProductId;
final Future<void> Function(TabItem item, int delta) onQuantityChanged;
const TabItemRow({
super.key,
required this.item,
required this.stockByProductId,
required this.onQuantityChanged,
});
@@ -125,23 +119,15 @@ class TabItemRow extends StatelessWidget {
await onQuantityChanged(item, delta);
} catch (e) {
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
e is InsufficientStockException
? l10n.productOutOfStock
: l10n.couldNotUpdateQuantity,
),
),
);
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text(l10n.couldNotUpdateQuantity)));
}
}
@override
Widget build(BuildContext context) {
final scheme = Theme.of(context).colorScheme;
final availableStock = stockByProductId[item.productId];
final canIncrease = availableStock == null || availableStock > 0;
return Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
@@ -188,9 +174,7 @@ class TabItemRow extends StatelessWidget {
),
IconButton(
visualDensity: VisualDensity.compact,
onPressed: canIncrease
? () => _changeQuantity(context, 1)
: null,
onPressed: () => _changeQuantity(context, 1),
icon: const Icon(Icons.add_rounded, size: 18),
),
],
-4
View File
@@ -39,7 +39,6 @@ class TabPanel extends StatefulWidget {
final List<BarTab> tabs;
final BarTab? selectedTab;
final String? selectedTabId;
final Map<String, int> stockByProductId;
final bool showSearch;
final ValueChanged<String> onTabSelected;
final Future<void> Function(TabItem item, int delta) onItemQuantityChanged;
@@ -52,7 +51,6 @@ class TabPanel extends StatefulWidget {
required this.tabs,
required this.selectedTab,
required this.selectedTabId,
required this.stockByProductId,
required this.showSearch,
required this.onTabSelected,
required this.onItemQuantityChanged,
@@ -409,8 +407,6 @@ class _TabPanelState extends State<TabPanel> {
)
: SelectedTabDetails(
tab: widget.selectedTab!,
stockByProductId:
widget.stockByProductId,
onItemQuantityChanged:
widget.onItemQuantityChanged,
onCloseTabPressed: