feat: add product selection step before meal planning

Inserts a new PlanProductsSheet as step 1 of the planning flow.
Users see their current products as a multi-select checklist (all
selected by default) before choosing the planning mode and dates.

- Empty state explains the benefit and offers "Add products" CTA
  while always allowing "Plan without products" to skip
- Selected product IDs flow through PlanMenuSheet →
  PlanDatePickerSheet → MenuService.generateForDates → backend
- Backend: added ProductIDs field to generate-menu request body;
  uses ListForPromptByIDs when set, ListForPrompt otherwise
- Backend: added Repository.ListForPromptByIDs (filtered SQL query)
- All 12 ARB locale files updated with planProducts* keys

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
dbastrikin
2026-03-23 16:07:28 +02:00
parent b6c75a3488
commit b38190ff5b
33 changed files with 1007 additions and 77 deletions

View File

@@ -16,6 +16,7 @@ class PlanDatePickerSheet extends ConsumerStatefulWidget {
super.key,
required this.mode,
required this.defaultStart,
required this.selectedProductIds,
});
final PlanMode mode;
@@ -24,6 +25,10 @@ class PlanDatePickerSheet extends ConsumerStatefulWidget {
/// planned date.
final DateTime defaultStart;
/// Product IDs selected in the previous step. Empty list means the AI
/// will use all of the user's products (default behaviour).
final List<String> selectedProductIds;
@override
ConsumerState<PlanDatePickerSheet> createState() =>
_PlanDatePickerSheetState();
@@ -107,6 +112,7 @@ class _PlanDatePickerSheetState extends ConsumerState<PlanDatePickerSheet> {
await ref.read(planMenuServiceProvider).generateForDates(
dates: dates,
mealTypes: mealTypes,
productIds: widget.selectedProductIds,
);
if (mounted) {
Navigator.pop(context);