Add meal plan feature with cross-device sync and automatic stale data cleanup
Introduces weekly meal planning with a calendar-based tab view, per-recipe date assignments synced via Nextcloud Cookbook custom metadata, and 30-day automatic pruning of old entries on load, save, and sync merge. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -74,6 +74,11 @@
|
||||
D1A0CE052D0A000300000003 /* GroceryListManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A0CE042D0A000300000003 /* GroceryListManager.swift */; };
|
||||
E1B0CF072D0B000400000004 /* GroceryStateModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1B0CF062D0B000400000004 /* GroceryStateModels.swift */; };
|
||||
E1B0CF092D0B000500000005 /* GroceryStateSyncManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1B0CF082D0B000500000005 /* GroceryStateSyncManager.swift */; };
|
||||
F1A0DE022E0C000100000001 /* MealPlanModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A0DE012E0C000100000001 /* MealPlanModels.swift */; };
|
||||
F1A0DE042E0C000200000002 /* MealPlanManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A0DE032E0C000200000002 /* MealPlanManager.swift */; };
|
||||
F1A0DE062E0C000300000003 /* MealPlanSyncManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A0DE052E0C000300000003 /* MealPlanSyncManager.swift */; };
|
||||
F1A0DE082E0C000400000004 /* MealPlanTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A0DE072E0C000400000004 /* MealPlanTabView.swift */; };
|
||||
F1A0DE0A2E0C000500000005 /* AddToMealPlanSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A0DE092E0C000500000005 /* AddToMealPlanSheet.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@@ -165,6 +170,11 @@
|
||||
D1A0CE042D0A000300000003 /* GroceryListManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroceryListManager.swift; sourceTree = "<group>"; };
|
||||
E1B0CF062D0B000400000004 /* GroceryStateModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroceryStateModels.swift; sourceTree = "<group>"; };
|
||||
E1B0CF082D0B000500000005 /* GroceryStateSyncManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroceryStateSyncManager.swift; sourceTree = "<group>"; };
|
||||
F1A0DE012E0C000100000001 /* MealPlanModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MealPlanModels.swift; sourceTree = "<group>"; };
|
||||
F1A0DE032E0C000200000002 /* MealPlanManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MealPlanManager.swift; sourceTree = "<group>"; };
|
||||
F1A0DE052E0C000300000003 /* MealPlanSyncManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MealPlanSyncManager.swift; sourceTree = "<group>"; };
|
||||
F1A0DE072E0C000400000004 /* MealPlanTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MealPlanTabView.swift; sourceTree = "<group>"; };
|
||||
F1A0DE092E0C000500000005 /* AddToMealPlanSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddToMealPlanSheet.swift; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -307,6 +317,9 @@
|
||||
D1A0CE042D0A000300000003 /* GroceryListManager.swift */,
|
||||
E1B0CF062D0B000400000004 /* GroceryStateModels.swift */,
|
||||
E1B0CF082D0B000500000005 /* GroceryStateSyncManager.swift */,
|
||||
F1A0DE012E0C000100000001 /* MealPlanModels.swift */,
|
||||
F1A0DE032E0C000200000002 /* MealPlanManager.swift */,
|
||||
F1A0DE052E0C000300000003 /* MealPlanSyncManager.swift */,
|
||||
);
|
||||
path = Data;
|
||||
sourceTree = "<group>";
|
||||
@@ -385,6 +398,7 @@
|
||||
A977D0DD2B600300009783A9 /* SearchTabView.swift */,
|
||||
A977D0DF2B600318009783A9 /* RecipeTabView.swift */,
|
||||
A977D0E12B60034E009783A9 /* GroceryListTabView.swift */,
|
||||
F1A0DE072E0C000400000004 /* MealPlanTabView.swift */,
|
||||
);
|
||||
path = Tabs;
|
||||
sourceTree = "<group>";
|
||||
@@ -415,6 +429,7 @@
|
||||
A9D89AAF2B4FE97800F49D92 /* TimerView.swift */,
|
||||
A97B4D342B80B82A00EC1A88 /* ShareView.swift */,
|
||||
C1F0AB012D0B000100000001 /* ImportURLSheet.swift */,
|
||||
F1A0DE092E0C000500000005 /* AddToMealPlanSheet.swift */,
|
||||
);
|
||||
path = Recipes;
|
||||
sourceTree = "<group>";
|
||||
@@ -646,6 +661,11 @@
|
||||
D1A0CE052D0A000300000003 /* GroceryListManager.swift in Sources */,
|
||||
E1B0CF072D0B000400000004 /* GroceryStateModels.swift in Sources */,
|
||||
E1B0CF092D0B000500000005 /* GroceryStateSyncManager.swift in Sources */,
|
||||
F1A0DE022E0C000100000001 /* MealPlanModels.swift in Sources */,
|
||||
F1A0DE042E0C000200000002 /* MealPlanManager.swift in Sources */,
|
||||
F1A0DE062E0C000300000003 /* MealPlanSyncManager.swift in Sources */,
|
||||
F1A0DE082E0C000400000004 /* MealPlanTabView.swift in Sources */,
|
||||
F1A0DE0A2E0C000500000005 /* AddToMealPlanSheet.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user