1.0.6: Priority dishes, day rules, auto-assign CTA, tap-to-replace, export incomplete weeks, Sunday notification

- Dish.isPriority: mark dishes as priority; auto-assign gives them 2.5x weight
- Tag.dayRestriction: restrict tags to weekdays or weekend only
- Auto-assign CTA banner shown when there are empty slots (was hidden in context menu)
- Tap on filled slot opens picker to replace dish directly (no need to remove first)
- Export callout visible as soon as ≥1 slot is filled (not only when week is complete)
- WeekPlanShareView shows localized "TBD" / "Eating out" for empty/eating-out slots
- Second Sunday 17:00 push notification to plan next week
- DishDrawer sorts: priority first, then by historical usage, then alphabetically
- Search in SlotDishPickerSheet already shipped in 1.0.5 (verified ✓)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
alexandrev-tibco
2026-04-30 00:00:53 +02:00
parent 92f97f855d
commit a4dfb38feb
22 changed files with 344 additions and 26 deletions
@@ -11,6 +11,7 @@ struct WeekCalendarView: View {
let tags: [Tag]
@ObservedObject var viewModel: HomeViewModel
var onTapEmptySlot: ((MealSlot) -> Void)?
var onTapFilledSlot: ((MealSlot) -> Void)?
private var dayRange: ClosedRange<Int> {
settings.includeWeekends ? 0...6 : 0...4
@@ -279,6 +280,12 @@ struct WeekCalendarView: View {
viewModel.removeDish(from: live, plan: plan, settings: settings)
} : nil
)
.contentShape(Rectangle())
.onTapGesture {
guard viewModel.canEditCurrentWeek, onTapFilledSlot != nil else { return }
guard let live = liveSlot(for: slot) else { return }
onTapFilledSlot?(live)
}
.draggable("slot:\(slot.slotId.uuidString)")
} else if let slot = slot, slot.isEatingOut {
EatingOutSlotView(mealType: mealType)