|
|
|
@ -27,21 +27,26 @@ import { |
|
|
|
|
MenuItem, |
|
|
|
|
} from '@mui/material'; |
|
|
|
|
import { STOCK_ERRORS } from '../constants/errorMessages'; |
|
|
|
|
import DatePicker, { registerLocale } from 'react-datepicker'; |
|
|
|
|
import { ja } from 'date-fns/locale/ja'; // date-fnsの日本語ロケールをインポート
|
|
|
|
|
|
|
|
|
|
// 新規在庫の初期状態
|
|
|
|
|
const EMPTY_STOCK: Omit<Stock, 'stockId' | 'stuffId'> & { stuffId: number | null } & { newAddition: boolean } = { |
|
|
|
|
stuffId: null, |
|
|
|
|
stuffName: '', |
|
|
|
|
amount: 0, |
|
|
|
|
amount: 1, |
|
|
|
|
price: 0, |
|
|
|
|
lastUpdate: '', |
|
|
|
|
buyDate: '', |
|
|
|
|
buyDate: new Date().toISOString(), |
|
|
|
|
expDate: '', |
|
|
|
|
category: '', |
|
|
|
|
newAddition: false, // 材料を新規作成するか否か
|
|
|
|
|
// shop '',
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 日本語ロケールを登録
|
|
|
|
|
registerLocale('ja', ja); |
|
|
|
|
|
|
|
|
|
const StockPage: React.FC = () => { |
|
|
|
|
|
|
|
|
|
const [stocks, setStocks] = useState<Stock[]>([]); |
|
|
|
@ -86,6 +91,9 @@ const StockPage: React.FC = () => { |
|
|
|
|
if (newStock.newAddition) { |
|
|
|
|
newStock.stuffId = null; |
|
|
|
|
} |
|
|
|
|
if (isNaN(newStock.amount)) return; |
|
|
|
|
if (isNaN(newStock.price)) return; |
|
|
|
|
|
|
|
|
|
console.log(newStock) |
|
|
|
|
const today = new Date().toISOString().substring(0, 10); |
|
|
|
|
|
|
|
|
@ -381,7 +389,7 @@ const StockPage: React.FC = () => { |
|
|
|
|
在庫一覧 |
|
|
|
|
</Typography> |
|
|
|
|
|
|
|
|
|
<Box sx={{textAlign: 'right'}}> |
|
|
|
|
<Box sx={{ textAlign: 'right' }}> |
|
|
|
|
{/* 在庫の食材追加ボタン */} |
|
|
|
|
<Button variant="contained" color="primary" onClick={handleOpenAdd} sx={{ mt: 3, mb: 2, mr: 1 }}> |
|
|
|
|
追加 |
|
|
|
@ -453,7 +461,7 @@ const StockPage: React.FC = () => { |
|
|
|
|
onChange={(e) => { |
|
|
|
|
const value = e.target.value; |
|
|
|
|
const parsedValue = parseInt(value, 10); // 数値に変換
|
|
|
|
|
if (!isNaN(parsedValue)) { |
|
|
|
|
if (isNaN(parsedValue) || parsedValue >= 1) { // 入力欄をいったん空欄にできるようにする,ただし空欄でない場合は1以上のみOK
|
|
|
|
|
setNewStock({ ...newStock, amount: parsedValue }); // number型で保存
|
|
|
|
|
} |
|
|
|
|
}} |
|
|
|
@ -470,7 +478,7 @@ const StockPage: React.FC = () => { |
|
|
|
|
onChange={(e) => { |
|
|
|
|
const value = e.target.value; |
|
|
|
|
const parsedValue = parseInt(value, 10); // 数値に変換
|
|
|
|
|
if (!isNaN(parsedValue)) { |
|
|
|
|
if (isNaN(parsedValue) || parsedValue >= 0) { // 入力欄をいったん空欄にできるようにする,ただし空欄でない場合は0以上のみOK
|
|
|
|
|
setNewStock({ ...newStock, price: parsedValue }); // number型で保存
|
|
|
|
|
} |
|
|
|
|
}} |
|
|
|
@ -479,23 +487,54 @@ const StockPage: React.FC = () => { |
|
|
|
|
inputProps={{ inputMode: "numeric", pattern: "[0-9]*" }} // ここで整数のみ許可
|
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
{/* 購入日入力フィールド */} |
|
|
|
|
<TextField |
|
|
|
|
margin="dense" |
|
|
|
|
label="購入日(yyyy/MM/dd)" |
|
|
|
|
fullWidth |
|
|
|
|
value={newStock.buyDate} |
|
|
|
|
onChange={(e) => setNewStock({ ...newStock, buyDate: e.target.value })} |
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
{/* 賞味・消費期限入力フィールド */} |
|
|
|
|
<TextField |
|
|
|
|
margin="dense" |
|
|
|
|
label="消費・賞味期限(yyyy/MM/dd)" |
|
|
|
|
fullWidth |
|
|
|
|
value={newStock.expDate} |
|
|
|
|
onChange={(e) => setNewStock({ ...newStock, expDate: e.target.value })} |
|
|
|
|
/> |
|
|
|
|
{/* 購入日・消費期限を横並びに */} |
|
|
|
|
<Box sx={{ display: 'flex', gap: 2, mb: 2 }}> |
|
|
|
|
{/* 購入日入力フィールド */} |
|
|
|
|
<DatePicker |
|
|
|
|
popperClassName="custom-datepicker-popper" |
|
|
|
|
selected={newStock.buyDate ? new Date(newStock.buyDate) : null} |
|
|
|
|
onChange={(date) => |
|
|
|
|
setNewStock({ ...newStock, buyDate: date ? date.toISOString().split('T')[0] : '' }) |
|
|
|
|
} |
|
|
|
|
dateFormat="yyyy/MM/dd" |
|
|
|
|
customInput={ |
|
|
|
|
<TextField |
|
|
|
|
margin="dense" |
|
|
|
|
label="購入日(yyyy/MM/dd)" |
|
|
|
|
fullWidth |
|
|
|
|
/> |
|
|
|
|
} |
|
|
|
|
isClearable |
|
|
|
|
//withPortal // ← 他の文字との重なり対策
|
|
|
|
|
/> |
|
|
|
|
{/* |
|
|
|
|
<TextField |
|
|
|
|
margin="dense" |
|
|
|
|
label="購入日(yyyy/MM/dd)" |
|
|
|
|
fullWidth |
|
|
|
|
value={newStock.buyDate} |
|
|
|
|
onChange={(e) => setNewStock({ ...newStock, buyDate: e.target.value })} |
|
|
|
|
/> |
|
|
|
|
*/} |
|
|
|
|
{/* 消費・賞味期限入力フィールド */} |
|
|
|
|
<DatePicker |
|
|
|
|
popperClassName="custom-datepicker-popper" |
|
|
|
|
selected={newStock.expDate ? new Date(newStock.expDate) : null} |
|
|
|
|
onChange={(date) => |
|
|
|
|
setNewStock({ ...newStock, expDate: date ? date.toISOString().split('T')[0] : '' }) |
|
|
|
|
} |
|
|
|
|
dateFormat="yyyy/MM/dd" |
|
|
|
|
customInput={ |
|
|
|
|
<TextField |
|
|
|
|
margin="dense" |
|
|
|
|
label="消費・賞味期限(yyyy/MM/dd)" |
|
|
|
|
fullWidth |
|
|
|
|
/> |
|
|
|
|
} |
|
|
|
|
isClearable |
|
|
|
|
//withPortal
|
|
|
|
|
/> |
|
|
|
|
</Box> |
|
|
|
|
</Box> |
|
|
|
|
</DialogContent> |
|
|
|
|
<DialogActions> |
|
|
|
|