#61: expiry badge now shows relative + calendar date ("5d · Apr 15") with tooltip "Expires in 5 days (Apr 15)"; traffic-light colors already in place #64: RecipeDetailPanel.handleCook() calls recipesStore.logCook(); SavedRecipesPanel shows "Last made: X ago" below each card using cookLog entries #66: Serving multiplier (1x/2x/3x/4x) in RecipeDetailPanel scales ingredient quantities using regex; handles integers, decimals, fractions (1/2, 3/4), mixed numbers (1 1/2), and ranges (2-3); leaves unrecognised strings unchanged #59: migration 030 adds opened_date column; ExpirationPredictor gains SHELF_LIFE_AFTER_OPENING table + days_after_opening(); POST /inventory/items/{id}/open sets opened_date=today and returns computed opened_expiry_date; InventoryList shows lock-open button for unopened items and an "📂 5d · Apr 15" badge once opened
5 lines
256 B
SQL
5 lines
256 B
SQL
-- Migration 030: open-package tracking
|
|
-- Adds opened_date to track when a multi-use item was first opened,
|
|
-- enabling secondary shelf-life windows (e.g. salsa: 1 year sealed → 2 weeks opened).
|
|
|
|
ALTER TABLE inventory_items ADD COLUMN opened_date TEXT;
|