From 7a0bc34eb0832111eb06ab08cb802625ba766267 Mon Sep 17 00:00:00 2001 From: "Yuna.Suzuki" Date: Mon, 9 Jun 2025 15:17:24 +0900 Subject: [PATCH] =?UTF-8?q?=E7=B7=A8=E9=9B=86=E3=83=80=E3=82=A4=E3=82=A2?= =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=81=A8=E5=89=8A=E9=99=A4=E3=83=80=E3=82=A4?= =?UTF-8?q?=E3=82=A2=E3=83=AD=E3=82=B0=E3=82=92=E4=BD=9C=E6=88=90=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/StockPage.tsx | 392 +++++++++++++++---------------- 1 file changed, 191 insertions(+), 201 deletions(-) diff --git a/frontend/src/pages/StockPage.tsx b/frontend/src/pages/StockPage.tsx index a634342..ef8f92f 100644 --- a/frontend/src/pages/StockPage.tsx +++ b/frontend/src/pages/StockPage.tsx @@ -25,16 +25,12 @@ import { TASK_ERRORS } from '../constants/errorMessages'; const StockPage: React.FC = () => { const [stocks, setStocks] = useState([]); + // セル選択の表示状態 + const [selectedRow, setSelectedRow] = useState(null); // 編集ダイアロボックスの表示状態 const [isEditOpen, setIsEditOpen] = useState(false); - const handleOpenEdit = () => setIsEditOpen(true); - const handleCloseEdit = () => setIsEditOpen(false); // 削除メッセージダイアログの表示状態 const [isDeleteOpen, setIsDeleteOpen] = useState(false); - const handleOpenDelete = () => setIsDeleteOpen(true); - const handleCloseDelete = () => setIsDeleteOpen(false); - // セル選択の表示状態 - const [selectedRow, setSelectedRow] = useState(null); // コンポーネントマウント時にタスク一覧を取得 useEffect(() => { @@ -74,10 +70,74 @@ const StockPage: React.FC = () => { */ /** - * セルを選択する関数 + * セルを選択する関数. 再度クリックで選択解除 */ - const handleRowClick = (id: number) => { - setSelectedRow(prevSelected => (prevSelected === id ? null : id)); // クリックで選択・解除を切り替え + const handleRowClick = (stock: Stock) => { + setSelectedRow(prev => (prev?.stock_id === stock.stock_id ? null : stock)); + }; + + /** 編集ボタンを押したときにダイアログを開く */ + const handleOpenEdit = () => { + if (selectedRow) { + setIsEditOpen(true); + } else { + alert("編集する食材を選択してください。"); + } + }; + /** 編集ダイアログを閉じる */ + const handleCloseEdit = () => { + setIsEditOpen(false); + }; + + /** 削除ボタンを押したときにダイアログを開く */ + const handleOpenDelete = () => { + if (selectedRow) { + setIsDeleteOpen(true); + } else { + alert("削除する食材を選択してください。"); + } + }; + /** 編集ダイアログを閉じる */ + const handleCloseDelete = () => { + setIsDeleteOpen(false); + }; + + /** テーブルを表示する関数 */ + const StockTable = (stocks: Stock[], categories: string[]) => { + const filteredStocks = stocks.filter(stock => categories.includes(stock.category)); + + if (filteredStocks.length === 0) return null; + + return ( + + + + + 食材名 + 数量 + 購入価格 + 賞味・消費期限 + 購入日 + + + + {filteredStocks.map(stock => ( + handleRowClick(stock)} + style={{ backgroundColor: selectedRow?.stock_id === stock.stock_id ? "yellow" : "white", cursor: "pointer" }} + > + {stock.stuff_name} + {stock.amount} + {stock.price} + {formatDate(stock.exp_date)} + {formatDate(stock.buy_date)} + + ))} + +
+
+ ); }; @@ -87,22 +147,10 @@ const StockPage: React.FC = () => { 在庫一覧 - {/* タスク編集ボタン */} - {/* */} - - - 在庫の編集 - - 選択した食材の在庫を編集します - - - + {/* タスク編集ボタン(全テーブル共通) */} + {/* タスク削除ボタン */} @@ -115,198 +163,140 @@ const StockPage: React.FC = () => { - - 乳製品 - - {/* 乳製品一覧表示エリア - 青い背景のコンテナ */} + {/* 在庫一覧リスト */} + {/* 乳製品 */} + 乳製品
+ {StockTable(stocks, ["乳製品"])} + + {/* 編集ダイアログ */} + + 在庫の編集 + + {selectedRow && ( + <> + 選択した食材の在庫を編集します + + + + + + + + )} + + - {/* 要素が無かったら表示しない */} - {stocks.filter(stock => stock.category === "乳製品").length === 0 ? null : ( - - - - - 食材名 - 数量 - 購入価格 - 賞味・消費期限 - 購入日 - - - - {stocks - .filter(stock => stock.category == "乳製品") // 乳製品だけ抽出 - .map(stock => ( - handleRowClick(stock.stock_id)} - style={{ backgroundColor: selectedRow === stock.stock_id ? "yellow" : "white", cursor: "pointer" }}> - {stock.stuff_name} - {stock.amount} - {stock.price} - {formatDate(stock.exp_date)} - {formatDate(stock.buy_date)} - - ))} - -
-
- )}
- - 肉・魚 - - {/* 肉・魚一覧表示エリア - 青い背景のコンテナ */} + {/* 肉・魚 */} + 肉・魚
+ {StockTable(stocks, ["肉", "魚"])} - {stocks.filter(stock => stock.category == "肉" || stock.category == "魚").length === 0 ? null : ( - - - - - 食材名 - 数量 - 購入価格 - 賞味・消費期限 - 購入日 - - - - {stocks - .filter(stock => stock.category == "肉" || stock.category == "魚") // 肉と魚だけ抽出 - .map(stock => ( - handleRowClick(stock.stock_id)} - style={{ backgroundColor: selectedRow === stock.stock_id ? "yellow" : "white", cursor: "pointer" }}> - {stock.stuff_name} - {stock.amount} - {stock.price} - {formatDate(stock.exp_date)} - {formatDate(stock.buy_date)} - - ))} - -
-
- )} + {/* 編集ダイアログ */} + + 在庫の編集 + + {selectedRow && ( + <> + 選択した食材の在庫を編集します + + + + + + + + )} + +
- - 野菜 - - {/* 野菜一覧表示エリア - 青い背景のコンテナ */} + {/* 野菜 */} + 野菜
- {stocks.filter(stock => stock.category === "野菜").length === 0 ? null : ( - - - - - 食材名 - 数量 - 購入価格 - 賞味・消費期限 - 購入日 - - - - {stocks - .filter(stock => stock.category == "野菜") // 野菜だけ抽出 - .map(stock => ( - handleRowClick(stock.stock_id)} - style={{ backgroundColor: selectedRow === stock.stock_id ? "yellow" : "white", cursor: "pointer" }}> - {stock.stuff_name} - {stock.amount} - {stock.price} - {formatDate(stock.exp_date)} - {formatDate(stock.buy_date)} - - ))} - -
-
- )} + {StockTable(stocks, ["野菜"])} + + {/* 編集ダイアログ */} + + 在庫の編集 + + {selectedRow && ( + <> + 選択した食材の在庫を編集します + + + + + + + + )} + + +
- - 調味料 - - {/* 調味料一覧表示エリア - 青い背景のコンテナ */} + {/* 調味料 */} + 調味料
- {stocks.filter(stock => stock.category === "調味料").length === 0 ? null : ( - - - - - 食材名 - 数量 - 購入価格 - 賞味・消費期限 - 購入日 - - - - {stocks - .filter(stock => stock.category == "調味料") // 調味料だけ抽出 - .map(stock => ( - handleRowClick(stock.stock_id)} - style={{ backgroundColor: selectedRow === stock.stock_id ? "yellow" : "white", cursor: "pointer" }}> - {stock.stuff_name} - {stock.amount} - {stock.price} - {formatDate(stock.exp_date)} - {formatDate(stock.buy_date)} - - ))} - -
-
- )} + {StockTable(stocks, ["調味料"])} + + {/* 編集ダイアログ */} + + 在庫の編集 + + {selectedRow && ( + <> + 選択した食材の在庫を編集します + + + + + + + + )} + + +
- - その他 - - {/* その他一覧表示エリア - 青い背景のコンテナ */} + {/* その他 */} + その他
- {stocks.filter(stock => stock.category === "その他").length === 0 ? null : ( - - - - - 食材名 - 数量 - 購入価格 - 賞味・消費期限 - 購入日 - - - - {stocks - .filter(stock => stock.category == "その他") // その他だけ抽出 - .map(stock => ( - handleRowClick(stock.stock_id)} - style={{ backgroundColor: selectedRow === stock.stock_id ? "yellow" : "white", cursor: "pointer" }}> - {stock.stuff_name} - {stock.amount} - {stock.price} - {formatDate(stock.exp_date)} - {formatDate(stock.buy_date)} - - ))} - -
-
- )} + {StockTable(stocks, ["その他"])} + + {/* 編集ダイアログ */} + + 在庫の編集 + + {selectedRow && ( + <> + 選択した食材の在庫を編集します + + + + + + + + )} + + +
);