|
|
|
@ -31,6 +31,7 @@ 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'; |
|
|
|
|
import BuyExpDateSelect from '../components/BuyExpDateSelect'; |
|
|
|
|
|
|
|
|
|
/*// 日付をyyyy-MM-dd形式で返す関数 |
|
|
|
|
const formatDateLocal = (date: Date) => { |
|
|
|
@ -107,7 +108,7 @@ const StockPage: React.FC = () => { |
|
|
|
|
newStock.stuffId = null; |
|
|
|
|
} |
|
|
|
|
if (isNaN(newStock.amount)) return; |
|
|
|
|
if (isNaN(newStock.price)) return; |
|
|
|
|
if (newStock.price === null || isNaN(newStock.price)) return; |
|
|
|
|
|
|
|
|
|
if (newStock.buyAmount !== null && isNaN(newStock.buyAmount)) { |
|
|
|
|
newStock.buyAmount = null; |
|
|
|
@ -117,23 +118,25 @@ const StockPage: React.FC = () => { |
|
|
|
|
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; |
|
|
|
|
if (newStock.expDate !== null) { |
|
|
|
|
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); |
|
|
|
@ -231,23 +234,25 @@ const StockPage: React.FC = () => { |
|
|
|
|
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; |
|
|
|
|
if (expDate !== null) { |
|
|
|
|
// 購入日が消費・賞味期限より未来の場合はエラー表示
|
|
|
|
|
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 { |
|
|
|
@ -367,21 +372,25 @@ const StockPage: React.FC = () => { |
|
|
|
|
</TableHead> |
|
|
|
|
<TableBody> |
|
|
|
|
{filteredStocks.map(stock => { |
|
|
|
|
const today = new Date(); |
|
|
|
|
const expDate = new Date(stock.expDate); |
|
|
|
|
// 時間をリセットして純粋な“日付のみ”のタイムスタンプを取得
|
|
|
|
|
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);
|
|
|
|
|
let daysLeft = null; |
|
|
|
|
|
|
|
|
|
if (stock.expDate !== null) { |
|
|
|
|
const today = new Date(); |
|
|
|
|
const expDate = new Date(stock.expDate); |
|
|
|
|
// 時間をリセットして純粋な“日付のみ”のタイムスタンプを取得
|
|
|
|
|
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(); |
|
|
|
|
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 ( |
|
|
|
|
<TableRow |
|
|
|
@ -392,9 +401,9 @@ const StockPage: React.FC = () => { |
|
|
|
|
<TableCell align="center" sx={{ width: '40%', fontSize: '16px' }}>{stock.stuffName}</TableCell> |
|
|
|
|
<TableCell align="center" sx={{ width: '20%', fontSize: '16px' }}>{stock.amount}</TableCell> |
|
|
|
|
<TableCell align="center" sx={{ width: '40%', fontSize: '16px' }} |
|
|
|
|
style={daysLeft <= 3 ? { color: "red", fontWeight: "bold" } : {}} |
|
|
|
|
style={daysLeft !== null && daysLeft <= 3 ? { color: "red", fontWeight: "bold" } : {}} |
|
|
|
|
> |
|
|
|
|
{formatDate(stock.expDate)} |
|
|
|
|
{stock.expDate && formatDate(stock.expDate)} |
|
|
|
|
</TableCell> |
|
|
|
|
</TableRow> |
|
|
|
|
); |
|
|
|
@ -479,79 +488,9 @@ const StockPage: React.FC = () => { |
|
|
|
|
onChange={handleChange} |
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
{/* 購入日・消費期限を横並びに */} |
|
|
|
|
<Box sx={{ display: 'flex', gap: 2, mb: 2 }}> |
|
|
|
|
{/* 購入日 */} |
|
|
|
|
<TextField |
|
|
|
|
margin="normal" |
|
|
|
|
label="購入日" |
|
|
|
|
type="date" |
|
|
|
|
fullWidth |
|
|
|
|
name="buyDate" |
|
|
|
|
value={editStock.buyDate ? editStock.buyDate.substring(0, 10) : ''} |
|
|
|
|
onChange={(e) => setEditStock({ ...editStock, buyDate: e.target.value })} |
|
|
|
|
InputLabelProps={{ shrink: true }} |
|
|
|
|
/> |
|
|
|
|
{/*<DatePicker |
|
|
|
|
selected={editStock.buyDate ? new Date(editStock.buyDate) : null} |
|
|
|
|
onChange={(date) => { |
|
|
|
|
if (editStock) { |
|
|
|
|
setEditStock({ |
|
|
|
|
...editStock, |
|
|
|
|
buyDate: date ? formatDateLocal(date) : '', |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
}} |
|
|
|
|
dateFormat="yyyy/MM/dd" |
|
|
|
|
customInput={ |
|
|
|
|
<TextField |
|
|
|
|
margin="normal" |
|
|
|
|
label="購入日 (yyyy/MM/dd)" |
|
|
|
|
fullWidth |
|
|
|
|
name="buyDate" |
|
|
|
|
/> |
|
|
|
|
} |
|
|
|
|
isClearable |
|
|
|
|
/>*/} |
|
|
|
|
{/* 消費・賞味期限 */} |
|
|
|
|
<TextField |
|
|
|
|
margin="normal" |
|
|
|
|
label="消費・賞味期限" |
|
|
|
|
type="date" |
|
|
|
|
fullWidth |
|
|
|
|
name="expDate" |
|
|
|
|
value={editStock.expDate ? editStock.expDate.substring(0, 10) : ''} |
|
|
|
|
onChange={(e) => setEditStock({ ...editStock, expDate: e.target.value })} |
|
|
|
|
InputLabelProps={{ shrink: true }} |
|
|
|
|
InputProps={{ |
|
|
|
|
inputProps: { |
|
|
|
|
min: newStock.buyDate ? newStock.buyDate.substring(0, 10) : undefined, |
|
|
|
|
} |
|
|
|
|
}} |
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
{/*<DatePicker |
|
|
|
|
selected={editStock.expDate ? new Date(editStock.expDate) : null} |
|
|
|
|
onChange={(date) => { |
|
|
|
|
if (editStock) { |
|
|
|
|
setEditStock({ |
|
|
|
|
...editStock, |
|
|
|
|
expDate: date ? formatDateLocal(date) : '', |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
}} |
|
|
|
|
dateFormat="yyyy/MM/dd" |
|
|
|
|
customInput={ |
|
|
|
|
<TextField |
|
|
|
|
margin="normal" |
|
|
|
|
label="消費・賞味期限 (yyyy/MM/dd)" |
|
|
|
|
fullWidth |
|
|
|
|
name="expDate" |
|
|
|
|
/> |
|
|
|
|
} |
|
|
|
|
isClearable |
|
|
|
|
/>*/} |
|
|
|
|
</Box> |
|
|
|
|
{/* 購入日・賞味期限入力 */} |
|
|
|
|
<BuyExpDateSelect newStock={editStock} setNewStock={({ buyDate, expDate }) => setEditStock({ ...editStock, buyDate, expDate })} /> |
|
|
|
|
|
|
|
|
|
<Box sx={{ display: 'flex', justifyContent: 'flex-end', gap: 2, mt: 3, mb: 2 }}> |
|
|
|
|
<Button onClick={() => { setIsEditOpen(false); setSelectedRow(null); }}> |
|
|
|
|
キャンセル |
|
|
|
@ -767,74 +706,12 @@ const StockPage: React.FC = () => { |
|
|
|
|
label="購入店舗" |
|
|
|
|
fullWidth |
|
|
|
|
value={newStock.shop} |
|
|
|
|
onChange={(e) => setNewStock({...newStock, shop: e.target.value})} |
|
|
|
|
onChange={(e) => setNewStock({ ...newStock, shop: e.target.value })} |
|
|
|
|
/> |
|
|
|
|
{/* 購入日・消費期限を横並びに */} |
|
|
|
|
<Box sx={{ display: 'flex', gap: 2, mb: 2 }}> |
|
|
|
|
{/* 購入日入力フィールド */} |
|
|
|
|
<TextField |
|
|
|
|
margin="dense" |
|
|
|
|
label="購入日" |
|
|
|
|
type="date" |
|
|
|
|
fullWidth |
|
|
|
|
value={newStock.buyDate ? newStock.buyDate.substring(0, 10) : ''} |
|
|
|
|
onChange={(e) => |
|
|
|
|
setNewStock({ ...newStock, buyDate: e.target.value }) |
|
|
|
|
} |
|
|
|
|
InputLabelProps={{ shrink: true }} |
|
|
|
|
/> |
|
|
|
|
{/*<DatePicker |
|
|
|
|
popperClassName="custom-datepicker-popper" |
|
|
|
|
selected={newStock.buyDate ? new Date(newStock.buyDate) : null} |
|
|
|
|
onChange={(date) => |
|
|
|
|
setNewStock({ ...newStock, buyDate: date ? formatDateLocal(date) : '' }) |
|
|
|
|
} |
|
|
|
|
dateFormat="yyyy/MM/dd" |
|
|
|
|
customInput={ |
|
|
|
|
<TextField |
|
|
|
|
margin="dense" |
|
|
|
|
label="購入日(yyyy/MM/dd)" |
|
|
|
|
fullWidth |
|
|
|
|
/> |
|
|
|
|
} |
|
|
|
|
isClearable |
|
|
|
|
//withPortal // ← 他の文字との重なり対策
|
|
|
|
|
/>*/} |
|
|
|
|
{/* 消費・賞味期限入力フィールド */} |
|
|
|
|
<TextField |
|
|
|
|
margin="dense" |
|
|
|
|
label="消費・賞味期限" |
|
|
|
|
type="date" |
|
|
|
|
fullWidth |
|
|
|
|
value={newStock.expDate ? newStock.expDate.substring(0, 10) : ''} |
|
|
|
|
onChange={(e) => |
|
|
|
|
setNewStock({ ...newStock, expDate: e.target.value }) |
|
|
|
|
} |
|
|
|
|
InputLabelProps={{ shrink: true }} |
|
|
|
|
InputProps={{ |
|
|
|
|
inputProps: { |
|
|
|
|
min: newStock.buyDate ? newStock.buyDate.substring(0, 10) : undefined, |
|
|
|
|
} |
|
|
|
|
}} |
|
|
|
|
/> |
|
|
|
|
{/*<DatePicker |
|
|
|
|
popperClassName="custom-datepicker-popper" |
|
|
|
|
selected={newStock.expDate ? new Date(newStock.expDate) : null} |
|
|
|
|
onChange={(date) => |
|
|
|
|
setNewStock({ ...newStock, expDate: date ? formatDateLocal(date) : '' }) |
|
|
|
|
} |
|
|
|
|
dateFormat="yyyy/MM/dd" |
|
|
|
|
customInput={ |
|
|
|
|
<TextField |
|
|
|
|
margin="dense" |
|
|
|
|
label="消費・賞味期限(yyyy/MM/dd)" |
|
|
|
|
fullWidth |
|
|
|
|
/> |
|
|
|
|
} |
|
|
|
|
isClearable |
|
|
|
|
//withPortal
|
|
|
|
|
/>*/} |
|
|
|
|
</Box> |
|
|
|
|
|
|
|
|
|
{/* 購入日・賞味期限入力 */} |
|
|
|
|
<BuyExpDateSelect newStock={newStock} setNewStock={({ buyDate, expDate }) => setNewStock({ ...newStock, buyDate, expDate })} /> |
|
|
|
|
|
|
|
|
|
</Box> |
|
|
|
|
</DialogContent> |
|
|
|
|
<DialogActions> |
|
|
|
|