Fix category handling, recipe management, and dark mode toggle tint
- Map uncategorized category between * (internal) and empty string (API) so selecting Sonstige/Other correctly persists to the server - Default new recipes to Other (*) category and remove None option - Add "New Category" option to category picker in recipe edit view - Include newly created/imported recipes in recently viewed list and pre-fetch thumbnails so images display immediately - Remove deleted recipes from recently viewed list - Remove broad .tint(.primary) from RecipeTabView that caused white toggles in Settings during dark mode - Rename German "Other" translation from Andere to Sonstige - Add missing translations for Servings stepper and new category strings Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -487,6 +487,8 @@ struct RecipeViewToolBar: ToolbarContent {
|
||||
let _ = await appState.getRecipe(id: id, fetchMode: .onlyServer, save: true)
|
||||
// Fetch the image after upload so it displays in view mode
|
||||
viewModel.recipeImage = await appState.getImage(id: id, size: .FULL, fetchMode: .onlyServer)
|
||||
// Pre-fetch thumbnail so it's cached for recents and category lists
|
||||
let _ = await appState.getImage(id: id, size: .THUMB, fetchMode: .onlyServer)
|
||||
// Update recipe reference so the view tracks the server-assigned id
|
||||
viewModel.recipe = Recipe(
|
||||
name: viewModel.observableRecipeDetail.name,
|
||||
@@ -497,6 +499,7 @@ struct RecipeViewToolBar: ToolbarContent {
|
||||
imagePlaceholderUrl: "",
|
||||
recipe_id: id
|
||||
)
|
||||
appState.addToRecentRecipes(viewModel.recipe)
|
||||
}
|
||||
viewModel.newRecipe = false
|
||||
viewModel.editMode = false
|
||||
|
||||
@@ -33,9 +33,8 @@ struct RecipeMetadataSection: View {
|
||||
.textFieldStyle(.roundedBorder)
|
||||
|
||||
Picker("Choose", selection: $viewModel.observableRecipeDetail.recipeCategory) {
|
||||
Text("").tag("")
|
||||
ForEach(categories, id: \.self) { item in
|
||||
Text(item)
|
||||
Text(item == "*" ? String(localized: "Other") : item).tag(item)
|
||||
}
|
||||
}
|
||||
.pickerStyle(.menu)
|
||||
@@ -93,19 +92,50 @@ struct RecipeEditMetadataSection: View {
|
||||
@EnvironmentObject var appState: AppState
|
||||
@ObservedObject var viewModel: RecipeView.ViewModel
|
||||
|
||||
@State private var showNewCategoryAlert = false
|
||||
@State private var newCategoryName = ""
|
||||
|
||||
private let newCategoryTag = "\0_new_category_"
|
||||
|
||||
var categories: [String] {
|
||||
appState.categories.map { $0.name }
|
||||
var list = appState.categories.map { $0.name }
|
||||
let current = viewModel.observableRecipeDetail.recipeCategory
|
||||
if !current.isEmpty && current != newCategoryTag && !list.contains(current) {
|
||||
list.append(current)
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
Section("Details") {
|
||||
Picker("Category", selection: $viewModel.observableRecipeDetail.recipeCategory) {
|
||||
Text("None").tag("")
|
||||
ForEach(categories, id: \.self) { item in
|
||||
Text(item).tag(item)
|
||||
Text(item == "*" ? String(localized: "Other") : item).tag(item)
|
||||
}
|
||||
Divider()
|
||||
Text("New Category…").tag(newCategoryTag)
|
||||
}
|
||||
.pickerStyle(.menu)
|
||||
.onChange(of: viewModel.observableRecipeDetail.recipeCategory) { _, newValue in
|
||||
if newValue == newCategoryTag {
|
||||
newCategoryName = ""
|
||||
showNewCategoryAlert = true
|
||||
}
|
||||
}
|
||||
.alert("New Category", isPresented: $showNewCategoryAlert) {
|
||||
TextField("Category name", text: $newCategoryName)
|
||||
Button("Cancel", role: .cancel) {
|
||||
viewModel.observableRecipeDetail.recipeCategory = "*"
|
||||
}
|
||||
Button("Add") {
|
||||
let trimmed = newCategoryName.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
if !trimmed.isEmpty {
|
||||
viewModel.observableRecipeDetail.recipeCategory = trimmed
|
||||
} else {
|
||||
viewModel.observableRecipeDetail.recipeCategory = "*"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Stepper("Servings: \(viewModel.observableRecipeDetail.recipeYield)", value: $viewModel.observableRecipeDetail.recipeYield, in: 1...99)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user