diff --git a/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java b/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java index d5753e9..e263330 100644 --- a/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java +++ b/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java @@ -119,7 +119,7 @@ public class ToBuysController { resp.setStuffId(stuff.getStuffId()); resp.setStuffName(stuff.getStuffName()); resp.setAmount(toBuy.getAmount()); - resp.setShop(toBuy.getStore()); + resp.setShop(toBuy.getShop()); return resp; }) .collect(Collectors.toList()); diff --git a/backend/src/main/java/com/example/todoapp/model/ToBuys.java b/backend/src/main/java/com/example/todoapp/model/ToBuys.java index e33edfb..d23a547 100644 --- a/backend/src/main/java/com/example/todoapp/model/ToBuys.java +++ b/backend/src/main/java/com/example/todoapp/model/ToBuys.java @@ -75,7 +75,7 @@ public class ToBuys { * 購入するお店 */ @Column(nullable = false) - private String store; + private String shop; } diff --git a/backend/src/main/java/com/example/todoapp/service/ToBuysService.java b/backend/src/main/java/com/example/todoapp/service/ToBuysService.java index fe3bfe7..4cd3690 100644 --- a/backend/src/main/java/com/example/todoapp/service/ToBuysService.java +++ b/backend/src/main/java/com/example/todoapp/service/ToBuysService.java @@ -104,7 +104,7 @@ public class ToBuysService { toBuys.setUser(user); toBuys.setStuff(stuff); toBuys.setAmount(toBuyDTO.getAmount()); - toBuys.setStore(toBuyDTO.getShop()); + toBuys.setShop(toBuyDTO.getShop()); return toBuysRepository.save(toBuys); } @@ -155,7 +155,7 @@ public class ToBuysService { toBuys.setUser(user); toBuys.setStuff(stuffs); toBuys.setAmount(toBuyDTO.getAmount()); - toBuys.setStore(toBuyDTO.getShop()); + toBuys.setShop(toBuyDTO.getShop()); // データベースに保存 return toBuysRepository.save(toBuys); @@ -248,7 +248,7 @@ public class ToBuysService { toBuy.setUser(user); toBuy.setStuff(stuff); toBuy.setAmount(requiredAmount); - toBuy.setStore(""); + toBuy.setShop(""); } toBuy = toBuysRepository.save(toBuy); diff --git a/frontend/src/pages/AddRecipe.tsx b/frontend/src/pages/AddRecipe.tsx index 8a0e880..75678cf 100644 --- a/frontend/src/pages/AddRecipe.tsx +++ b/frontend/src/pages/AddRecipe.tsx @@ -4,7 +4,6 @@ */ import React, { useState, useEffect } from 'react'; import { - Container, Typography, Tooltip, List, @@ -12,7 +11,6 @@ import { ListItemText, ListItemSecondaryAction, IconButton, - Checkbox, Fab, Dialog, DialogTitle, @@ -21,12 +19,6 @@ import { TextField, Button, Box, - MenuItem, - Select, - FormControl, - InputLabel, - ListItemIcon, - AlertColor } from '@mui/material'; import { Add as AddIcon, Delete as DeleteIcon, ShoppingBasket as ShoppingBasketIcon, @@ -48,6 +40,9 @@ const AddRecipe: React.FC = () => { // 編集時,既存情報を読み込んだかどうか const [recipeLoaded, setRecipeLoaded] = useState(false); + // 何人分かを格納する + const [numOfPeaple, setNumOfPeaple] = useState(1); + const [openNumOfPeapleDialog, setOpenNumOfPeapleDialog] = useState(false); // 料理名,説明 const [recipeName, setRecipeName] = useState(''); const [recipeSummary, setRecipeSummary] = useState(''); @@ -84,17 +79,20 @@ const AddRecipe: React.FC = () => { if (!recipeName) { showErrorMessage('レシピ名が入力されていません!') + console.log("yes1"); return false; } if (!items.length) { showErrorMessage('材料が追加されていません!') + console.log("yes2"); return false; } try { if (!recipeId) { - // 新規追加 + console.log("yes3"); + // 新規追加 const response = await recipeApi.addRecipe({ recipeName, summary: recipeSummary, @@ -113,10 +111,26 @@ const AddRecipe: React.FC = () => { showErrorMessage('レシピの送信に失敗しました。同じ料理名が存在する可能性があります。'); return false; } - + console.log("yes4"); return recipeId; } + const checkRecipeAndItems = async () => { + + if (!recipeName) { + showErrorMessage('レシピ名が入力されていません!') + console.log("yes1"); + return false; + } + + if (!items.length) { + showErrorMessage('材料が追加されていません!') + console.log("yes2"); + return false; + } + return true; + } + const handleSubmit = async () => { const recipeId = await handleSaveRecipe(); if (!recipeId) return; @@ -125,13 +139,34 @@ const AddRecipe: React.FC = () => { } const handleSubmitAndAddToBuy = async () => { + console.log("too"); + console.log(recipeName); const recipeId = await handleSaveRecipe(); + console.log("before"); if (!recipeId) return false; - await toBuyApi.addByRecipe(recipeId); + console.log("ds"); + if (!numOfPeaple) { + showErrorMessage('人数が入力されていません!') + console.log("yes2"); + return false; + } + await toBuyApi.addByRecipe(recipeId, numOfPeaple); showSuccessMessage('レシピが保存されて買うものリストに追加されました!'); navigate('/tasks'); } + const openNumOfPeopleDialog = async () => { + const check = await checkRecipeAndItems(); + if (!check) return false; + setOpenNumOfPeapleDialog(true); + } + + const cancelNumOfPeopleDialog = async () => { + const recipeId = await handleSaveRecipe(); + if (!recipeId) return false; + setOpenNumOfPeapleDialog(false); + } + // コンポーネントマウント時にタスク一覧を取得 useEffect(() => { loadRecipe(); @@ -211,6 +246,7 @@ const AddRecipe: React.FC = () => { ))})} +
@@ -226,7 +262,7 @@ const AddRecipe: React.FC = () => { レシピを保存 - @@ -272,6 +308,45 @@ const AddRecipe: React.FC = () => { setOpenAmountDialog(false); }} /> + {/* 人数入力ダイアログ */} + setOpenNumOfPeapleDialog(false)} disableScrollLock={true} + style={{ width : '100%', position : 'fixed', left: '50%', transform: 'translateX(-50%)' }} + > + + 買うものリストへ追加 + + +
+ {/* 人数入力フィールド */} + { + const value = e.target.value; + const parsedValue = parseInt(value, 10); // 数値に変換 + if (/*!isNaN(parsedValue) && */ isNaN(parsedValue) || parsedValue >= 1) { //負数除外 + setNumOfPeaple(parsedValue); // number型で保存 + } + }} + sx={{ minWidth: "8px", width: "100%" }} + type="number" + inputProps={{ inputMode: "numeric", pattern: "[0-9]*" }} // ここで整数のみ許可 + + /> +
+
+ + + + +
} diff --git a/frontend/src/pages/StockPage.tsx b/frontend/src/pages/StockPage.tsx index bdcde90..5c78c2f 100644 --- a/frontend/src/pages/StockPage.tsx +++ b/frontend/src/pages/StockPage.tsx @@ -39,6 +39,7 @@ const formatDateLocal = (date: Date) => { return `${year}-${month}-${day}`; }; + // 新規在庫の初期状態 const EMPTY_STOCK: Omit & { stuffId: number | null } & { newAddition: boolean } = { stuffId: null, diff --git a/frontend/src/services/api.ts b/frontend/src/services/api.ts index 7a31c9e..f076e74 100644 --- a/frontend/src/services/api.ts +++ b/frontend/src/services/api.ts @@ -132,11 +132,11 @@ export const toBuyApi = { }, - addByRecipe: async (recipeId: number): Promise => { + addByRecipe: async (recipeId: number, servings: number): Promise => { const response = await fetch(`${API_BASE_URL}/api/tobuy/addByRecipe`, { method: 'POST', headers: getHeaders(), - body: JSON.stringify({ recipeId }), + body: JSON.stringify({ recipeId, servings }), }) if (!response.ok) { throw new Error(TOBUY_ERRORS.CREATE_FAILED);