feat(meal-plan): add servings field to MealPlanEntry and update related functionality

feat(products): implement bulk update for product categories

feat(recipes): add servings input to WriteRecipePage and update MealPlanClient for servings management

refactor(types): enhance Product and Category types with additional properties
This commit is contained in:
Nils-Johan Gynther
2026-04-17 22:50:41 +02:00
parent a81bd6b460
commit 21dc06829a
12 changed files with 323 additions and 52 deletions
@@ -42,6 +42,7 @@ export default function WriteRecipePage() {
const [editedName, setEditedName] = useState('');
const [editedDescription, setEditedDescription] = useState('');
const [editedInstructions, setEditedInstructions] = useState('');
const [editedServings, setEditedServings] = useState<number | null>(null);
const [imageUrl, setImageUrl] = useState<string | null>(null);
const [ingredients, setIngredients] = useState<ParsedIngredientRow[]>([]);
const [allProducts, setAllProducts] = useState<Product[]>([]);
@@ -180,6 +181,7 @@ export default function WriteRecipePage() {
description: editedDescription || undefined,
instructions: editedInstructions || undefined,
imageUrl: imageUrl || undefined,
servings: editedServings ?? undefined,
ingredients: validIngredients.map((ing) => ({
productId: ing.selectedProductId,
quantity: Number(ing.editedQuantity),
@@ -358,6 +360,20 @@ Stek löken i lite smör. Tillsätt köttfärsen...`}</pre>
style={{ width: '100%', padding: '0.75rem', border: '1px solid #ddd', borderRadius: '4px', fontSize: '1rem', minHeight: '150px', fontFamily: 'monospace', boxSizing: 'border-box' }}
/>
</div>
<div>
<label style={{ display: 'block', marginBottom: '0.5rem', fontWeight: 600 }}>Portioner</label>
<input
type="number"
min={1}
step={1}
value={editedServings ?? ''}
onChange={(e) => setEditedServings(e.target.value ? Number(e.target.value) : null)}
placeholder="t.ex. 4"
style={{ width: '120px', padding: '0.5rem 0.75rem', border: '1px solid #ddd', borderRadius: '4px', fontSize: '1rem' }}
/>
<p style={{ fontSize: '0.82rem', color: '#888', margin: '0.3rem 0 0' }}>Anges portioner kan mängderna skalas receptsidan.</p>
</div>
</div>
{/* Ingredienser */}