diff --git a/frontend/src/pages/StockPage.tsx b/frontend/src/pages/StockPage.tsx index e97a294..b8f3041 100644 --- a/frontend/src/pages/StockPage.tsx +++ b/frontend/src/pages/StockPage.tsx @@ -27,6 +27,7 @@ import { MenuItem, } from '@mui/material'; import { GENERAL_ERRORS, STOCK_ERRORS } from '../constants/errorMessages'; +import { Add as AddIcon } from '@mui/icons-material'; import DatePicker, { registerLocale } from 'react-datepicker'; import { ja } from 'date-fns/locale/ja'; // date-fnsの日本語ロケールをインポート import { useMessage } from '../components/MessageContext'; @@ -115,6 +116,27 @@ const StockPage: React.FC = () => { newStock.shop = newStock.shop || null; console.log(newStock) + + // 購入日と消費・賞味期限の整合性チェック + const buy = new Date(newStock.buyDate); + const exp = new Date(newStock.expDate); + // 時間をリセットして純粋な“日付のみ”のタイムスタンプを取得 + const buyDateOnly = new Date(buy); + buyDateOnly.setHours(0, 0, 0, 0); + const expDateOnly = new Date(exp); + expDateOnly.setHours(0, 0, 0, 0); + + // console.log("新規作成buy:", buy); + // console.log("新規作成exp:", exp); + // console.log("新規作成buyDateOnly:", buyDateOnly); + // console.log("新規作成expDateOnly:", expDateOnly); + + if (buyDateOnly.getTime() > expDateOnly.getTime()) { + // alert("購入日は消費・賞味期限より前の日付を設定してください。"); + showErrorMessage('購入日は消費・賞味期限より前の日付を設定してください.'); + return; + } + const today = new Date().toISOString().substring(0, 10); const updatedStock = { ...newStock, lastUpdate: today }; // lastUpdate に today を設定 @@ -197,37 +219,42 @@ const StockPage: React.FC = () => { }; /** - * セルを選択する関数. 再度クリックで選択解除 → 行選択ではなくチェックボックスにしたため不要 + * セルを選択して編集画面 */ - // const handleRowClick = (stock: Stock) => { - // setSelectedRow(prev => (prev?.stockId === stock.stockId ? null : stock)); - // }; - // チェックボックス切り替え - const handleCheckboxChange = (stock: Stock) => { - setSelectedRow(prev => (prev?.stockId === stock.stockId ? null : stock)); + const handleRowClick = (stock: Stock) => { + setSelectedRow(stock); // 行選択 + setEditStock({ ...stock }); // 編集対象にセット + setIsEditOpen(true); // 編集ダイアログを開く }; - - /** 編集ボタンを押したときにダイアログを開く */ - // ダイアログを開く際に `selectedRow` の値を `editStock` にセット - const handleOpenEdit = () => { - if (selectedRow) { - setEditStock({ ...selectedRow }); - setIsEditOpen(true); - } else { - showWarningMessage("編集する食材を選択してください。"); - } - }; // 変更を適用. 数量に0を入力したとき、削除ダイアログに飛ぶ機能を追加 const handleApplyChanges = async () => { if (!editStock) return; const {stockId, amount, buyAmount, price, shop, buyDate, expDate, lastUpdate} = editStock; + // 購入日が消費・賞味期限より未来の場合はエラー表示 + const buy = new Date(buyDate); + const exp = new Date(expDate); + // 時間をリセットして純粋な“日付のみ”のタイムスタンプを取得 + const buyDateOnly = new Date(buy); + buyDateOnly.setHours(0, 0, 0, 0); + const expDateOnly = new Date(exp); + expDateOnly.setHours(0, 0, 0, 0); + // console.log("編集buy:", buy); + // console.log("編集exp:", exp); + // console.log("編集buyDateOnly:", buyDateOnly); + // console.log("編集expDateOnly:", expDateOnly); + + if (buy > exp) { + // alert("購入日は消費・賞味期限より前の日付を設定してください。"); + showErrorMessage('購入日は消費・賞味期限より前の日付を設定してください.'); + return; + } try { if (amount === 0) { // 数量が 0 の場合は削除処理へ誘導 - setIsEditOpen(false); // 編集ダイアログを閉じる + // setIsEditOpen(false); // 編集ダイアログを閉じる setSelectedRow(editStock); // 削除対象をセット setIsDeleteOpen(true); // 削除ダイアログを開く return; @@ -297,7 +324,6 @@ const StockPage: React.FC = () => { } }; - /** 編集ダイアログを閉じる */ const handleCloseEdit = () => { setIsEditOpen(false); @@ -308,7 +334,8 @@ const StockPage: React.FC = () => { if (selectedRow) { setIsDeleteOpen(true); } else { - showWarningMessage("削除する食材を選択してください。"); + // showWarningMessage("削除する食材を選択してください。"); + showErrorMessage('削除する食材を選択してください.'); } }; /** 削除ダイアログを閉じる */ @@ -328,37 +355,38 @@ const StockPage: React.FC = () => { - - 食材名 - 数量 - 消費・賞味期限 + 食材名 + 数量 + 消費・賞味期限 {filteredStocks.map(stock => { - const isSelected = selectedRow?.stockId === stock.stockId; const today = new Date(); const expDate = new Date(stock.expDate); - const timeDiff = expDate.getTime() - today.getTime(); + // 時間をリセットして純粋な“日付のみ”のタイムスタンプを取得 + const todayDateOnly = new Date(today); + todayDateOnly.setHours(0, 0, 0, 0); + const expDateOnly = new Date(expDate); + expDateOnly.setHours(0, 0, 0, 0); + const timeDiff = expDateOnly.getTime() - todayDateOnly.getTime(); const daysLeft = Math.ceil(timeDiff / (1000 * 60 * 60 * 24)); + // console.log("テーブルtoday:", today); + // console.log("テーブルexp:", expDate); + // console.log("テーブルtodayDateOnly:", todayDateOnly); + // console.log("テーブルexpDateOnly:", expDateOnly); + // console.log("日数差:", daysLeft); + return ( handleRowClick(stock)} + style={{ backgroundColor: selectedRow?.stockId === stock.stockId ? "yellow" : "white", cursor: "pointer" }} > - - handleCheckboxChange(stock)} - /> - - {stock.stuffName} - {stock.amount} - {stock.stuffName} + {stock.amount} + {formatDate(stock.expDate)} @@ -370,17 +398,20 @@ const StockPage: React.FC = () => {
- {/* 編集ダイアログ */} - 在庫の編集 + + + 在庫の編集 + + {editStock && ( <> {/* 材料名 */} - {editStock.stuffName} - + 【{editStock.stuffName}】 + { - + )} @@ -506,7 +538,11 @@ const StockPage: React.FC = () => { maxWidth="sm" sx={{ overflow: "hidden" }} > - 食材の削除 + + + 食材の削除 + + {selectedRow && ( <> @@ -516,7 +552,7 @@ const StockPage: React.FC = () => { @@ -527,6 +563,7 @@ const StockPage: React.FC = () => { handleDeleteStock(selectedRow.stockId); setIsDeleteOpen(false); setSelectedRow(null); + setIsEditOpen(false); }} > 削除 @@ -540,38 +577,51 @@ const StockPage: React.FC = () => { ); }; - return ( - - 在庫一覧 + + 在庫リスト - {/* */} {/* 在庫の食材追加ボタン */} - + + + 食材の追加 + + + + + {/* 新規タスク作成ダイアログ */} - 在庫に食材を追加 + + + 在庫に食材を追加 + + } @@ -708,17 +758,6 @@ const StockPage: React.FC = () => { - - {/* 在庫の食材編集ボタン(全テーブル共通) */} - - - {/* 在庫の食材削除ボタン (全テーブル共通) */} - - {/* 在庫一覧リスト */} @@ -751,6 +790,7 @@ const StockPage: React.FC = () => {
{StockTable(stocks, ["その他"])}
+ {/* フッターの高さと同じくらいに調整 */}
); };