フォーマット調整

feature-frontend-bug-fixes
Masaharu.Kato 4 months ago
parent 8b4afe5731
commit 525a52bbb8
  1. 24
      frontend/src/App.css
  2. 3
      frontend/src/components/BuyDialog.tsx
  3. 28
      frontend/src/components/CategoryDropDown.tsx
  4. 457
      frontend/src/pages/DishList.tsx

@ -7,18 +7,24 @@ body {
/* アプリケーションのルートコンテナスタイル */
.app {
display: flex;
flex-direction: column; /* 子要素を縦方向に配置 */
min-height: 100vh; /* ビューポートの高さいっぱいに広げる */
background-color: #f5f5f5; /* 薄いグレーの背景色 */
flex-direction: column;
/* 子要素を縦方向に配置 */
min-height: 100vh;
/* ビューポートの高さいっぱいに広げる */
background-color: #f5f5f5;
/* 薄いグレーの背景色 */
}
/* メインコンテンツエリアのスタイル */
.main-content {
flex: 1; /* 利用可能なスペースをすべて使用 */
flex: 1;
/* 利用可能なスペースをすべて使用 */
padding: 24px;
width: 100%;
max-width: 1200px; /* コンテンツの最大幅を制限 */
margin: 0 auto; /* 中央揃え */
max-width: 1200px;
/* コンテンツの最大幅を制限 */
margin: 0 auto;
/* 中央揃え */
}
/* Material UIのコンテナコンポーネントのカスタマイズ */
@ -29,14 +35,16 @@ body {
/* Material UIのペーパーコンポーネントのカスタマイズ */
.MuiPaper-root {
background-color: white; /* 白背景を確保 */
background-color: white;
/* 白背景を確保 */
}
.mainContainer {
padding-top: 0;
padding-left: 0;
padding-right: 0;
padding-bottom: 80px; /* ボトムナビゲーションバーで隠れる分 */
padding-bottom: 80px;
/* ボトムナビゲーションバーで隠れる分 */
}
.mainTitle {

@ -10,7 +10,7 @@ import {
} from '@mui/material';
import { NewStock } from '../types/types';
import BuyExpDateSelect from './BuyExpDateSelect';
/*import DatePicker, { registerLocale } from 'react-datepicker';
/*import DatePicker, { registerLocale } from 'react-datepicker';F
import { ja } from 'date-fns/locale/ja'; // date-fnsの日本語ロケールをインポート*/
/*// yyyy-MM-dd形式で返す関数
@ -42,7 +42,6 @@ const BuyDialog = ({
return (
<Dialog open={openDialog} onClose={() => setOpenDialog(false)} disableScrollLock={true} PaperProps={{ sx: { minHeight: '600px', maxHeight: '80vh' } }}
>
<DialogTitle></DialogTitle>

@ -1,28 +0,0 @@
import React, { useState } from "react";
import MenuItem from "@mui/material/MenuItem";
import Select from "@mui/material/Select";
import FormControl from "@mui/material/FormControl";
import InputLabel from "@mui/material/InputLabel";
const CategoryDropDown = () => {
const [selectedValue, setSelectedValue] = useState(""); // 選択された値の状態管理
return (
<FormControl sx={{ width: "50%", marginBottom:2 }}>
<InputLabel id="demo-simple-select-label"></InputLabel>
<Select
labelId="demo-simple-select-label"
value={selectedValue}
onChange={(event) => setSelectedValue(event.target.value)}
>
<MenuItem value="乳製品"></MenuItem>
<MenuItem value="魚・肉"></MenuItem>
<MenuItem value="野菜"></MenuItem>
<MenuItem value="調味料">調</MenuItem>
<MenuItem value="その他"></MenuItem>
</Select>
</FormControl>
);
};
export default CategoryDropDown;

@ -1,457 +0,0 @@
import React, { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import { toBuyApi } from '../services/api';
import {
Container,
Typography,
Tooltip,
List,
ListItem,
ListItemText,
ListItemSecondaryAction,
IconButton,
Checkbox,
Fab,
Dialog,
DialogTitle,
DialogContent,
DialogActions,
TextField,
Button,
Box,
FormControlLabel,
FormGroup,
MenuItem,
Select,
FormControl,
InputLabel
} from '@mui/material';
import {
Add as AddIcon, Delete as DeleteIcon, ShoppingBasket as ShoppingBasketIcon,
SoupKitchen as SoupKitchenIcon
} from '@mui/icons-material';
import { ToBuy, Stuff } from '../types/types';
import { GENERAL_ERRORS } from '../constants/errorMessages';
import CategoryDropDown from "../components/CategoryDropDown";
const DishList: React.FC = () => {
const navigate = useNavigate();
// 料理リストの料理名を格納する配列
// const dishes = ;
// タスク一覧の状態管理
const [tobuys, setToBuys] = useState<ToBuy[]>([]);
const test = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1];
// APIができるまでのテスト用の型
interface Dish {
id:number,
name:string,
amount:number
}
// APIができるまでの食材配列
const testdish : Dish[] = [
{ id: 1, name: 'ジャガイモ', amount:1 },
{ id: 2, name: '人参', amount:2 },
{ id: 3, name: '人参', amount:2 },
{ id: 4, name: '人参', amount:2 }
];
// 画面表示用の食材情報配列
const [testDishArray, setTestDishArray] = useState<Dish[]>(testdish);
// エラーメッセージの状態管理
const [error, setError] = useState(false);
// 選択した料理の情報を表示するダイアログの表示状態
const [openDialog, setOpenDialog] = useState(false);
// 料理リスト編集ダイアログの表示状態
const [openChangeDialog, setOpenChangeDialog] = useState(false);
// 料理リストの食材の個数編集ダイアログの表示状態
const [openChangeItemDialog, setOpenChangeItemDialog] = useState(false);
const changeDialog = () => {
setOpenDialog(false);
setOpenChangeDialog(true);
setTestDishArray(testdish);
};
const cancelChange = () => {
setOpenDialog(true);
setOpenChangeDialog(false);
};
/**
*
* IDのタスクをAPIを通じて削除
*/
const handleDeleteStuffTemp = async (dish_id: number) => {
try {
let testDishArrayCopy = [...testDishArray]; // 配列をコピー
testDishArrayCopy.splice(dish_id, 1);
setTestDishArray(testDishArrayCopy);
// fetchTasks(); // 削除後のタスク一覧を再取得
} catch (error) {
// console.error(`${TASK_ERRORS.DELETE_FAILED}:`, error);
}
};
// コンポーネントマウント時にタスク一覧を取得
useEffect(() => {
fetchTasks();
}, []);
/**
* APIからタスク一覧を取得する関数
* state(tasks)
*/
// const fetchTasks = async () => {
// try {
// const tasks = await taskApi.getTasks();
// setTasks(tasks);
// } catch (error) {
// console.error(`${TASK_ERRORS.FETCH_FAILED}:`, error);
// }
// };
const fetchTasks = async () => {
try {
const tobuys = await toBuyApi.getToBuys();
setToBuys(tobuys);
} catch (error) {
// console.error(`${TASK_ERRORS.FETCH_FAILED}:`, error);
}
};
return (
<Container>
<Box>
<div>
<h1 style={{fontSize: "40px", textAlign: "center"}}></h1>
</div>
<div style = {{border: '3px solid black', borderRadius: '8px', height: '500px',
overflowY: 'auto', padding: '20px'}}>
{/* <List> */}
{/* タスク一覧をマップして各タスクをリストアイテムとして表示 */}
{test.map((test, index) => (
<FormGroup>
<Button
// <ListItem
key={index}
sx={{
bgcolor: 'background.paper',
mb: 1,
borderRadius: 1,
boxShadow: 1,
fontSize: '40px'
}}
onClick={() => setOpenDialog(true)}
>
{test}
{/* タスクのタイトルと説明 - 完了状態に応じて取り消し線を表示 */}
{/* <ListItemText
primary={test}
//secondary={tobuy.amount}
sx={{
textDecoration: false ? 'line-through' : 'none',
}}
/> */}
</Button>
</FormGroup>
// </ListItem>
))}
{/* </List> */}
</div>
<div style={{width: "100%", position: "fixed", left: "50%", transform: 'translateX(-50%)', bottom: "64px"}}>
<Button variant='contained' sx={{
width: "60%",
fontSize: "24px", left: "50%", transform: 'translateX(-50%)' }}
color="primary"
onClick={() => navigate('/add1')}
>
</Button>
</div>
{/*新規料理追加ボタン - 画面下部に固定表示 */}
<Tooltip title="料理から追加">
<Fab
color="primary"
sx={{ position: 'fixed', bottom: 106, left: '60%', transform: 'translateX(-50%)' }}
onClick={() => setOpenDialog(true)}
>
<SoupKitchenIcon />
</Fab>
</Tooltip>
</Box>
{/* 新規タスク作成ダイアログ */}
<Dialog open={openDialog} onClose={() => setOpenDialog(false)} disableScrollLock={true}
maxWidth="lg"
fullWidth
>
<Box display="flex" alignItems="center">
<DialogTitle sx={{ flexGrow: 1 }}></DialogTitle>
</Box>
<FormGroup>
{/* <List> */}
{/* タスク一覧をマップして各タスクをリストアイテムとして表示 */}
{test.map((test, index) => (
<Button onClick={() => setOpenDialog(true)} key = {index}>
{test}
</Button>
// <ListItem
// key={index}
// sx={{
// bgcolor: 'background.paper',
// mb: 1,
// borderRadius: 1,
// boxShadow: 2,
// }}
// >
// {/* タスクのタイトルと説明 - 完了状態に応じて取り消し線を表示 */}
// <ListItemText
// primary={test}
// //secondary={tobuy.amount}
// primaryTypographyProps={{ fontSize: '40px', margin: '10px' }}
// sx={{
// textDecoration: false ? 'line-through' : 'none',
// }}
// />
// </ListItem>
))}
{/* </List> */}
</FormGroup>
<DialogActions>
<Button onClick={() => setOpenDialog(false)}></Button>
<Button onClick={() => changeDialog()} variant="contained"
style={{width: '40%', fontSize: '40px'}}
>
</Button>
</DialogActions>
</Dialog>
{/* 食材の個数の編集ダイアログ */}
<Dialog open={openChangeDialog} onClose={() => setOpenChangeDialog(false)} disableScrollLock={true}
maxWidth="lg"
fullWidth
>
<Box display="flex" alignItems="center">
<DialogTitle sx={{ flexGrow: 1 }}></DialogTitle>
</Box>
<FormGroup>
{/* <List> */}
{/* タスク一覧をマップして各タスクをリストアイテムとして表示 */}
{testDishArray.map((test, id) => (
<ListItem
key={id}
sx={{
bgcolor: 'background.paper',
mb: 1,
borderRadius: 1,
boxShadow: 1,
}}
>
{/*
<Checkbox
checked={task.completed}
onChange={() => handleToggleComplete(task.id)}
/> */}
{/* タスクのタイトルと説明 - 完了状態に応じて取り消し線を表示 */}
<ListItemText
primary={test.name}
// secondary={task.description}
sx={{width: '80%'}}
/>
{/* 食材の個数を表示 */}
<ListItemText
primary={<Typography style={{textAlign:"center"}}><br />
{test.amount}
</Typography>
}
// secondary={task.description}
sx={{ align: "right", fontSize: "20px" }}
/>
{/* 買い物リスト:食材情報記入ボタン */}
<ListItemSecondaryAction>
<Tooltip title="食材情報追加">
<IconButton
edge="end"
aria-label="食材情報追加"
//onClick={() => handleDeleteTask(task.id)}
>
<ShoppingBasketIcon />
</IconButton>
</Tooltip>
{/* 買い物リスト:食材削除ボタン */}
<Tooltip title="項目を削除"
componentsProps={{
tooltip: {
sx: {
backgroundColor: "white",
color: "red",
fontSize: "0.8rem",
padding: "6px",
borderRadius: "6px",
},
},
}}
>
<IconButton
edge="end"
aria-label="delete"
onClick={() => handleDeleteStuffTemp(id)}
>
<DeleteIcon />
</IconButton>
</Tooltip>
</ListItemSecondaryAction>
</ListItem>
// <Button onClick={() => setOpenDialog(true)} key = {index}>
// {test}
// </Button>
// <ListItem
// key={index}
// sx={{
// bgcolor: 'background.paper',
// mb: 1,
// borderRadius: 1,
// boxShadow: 2,
// }}
// >
// {/* タスクのタイトルと説明 - 完了状態に応じて取り消し線を表示 */}
// <ListItemText
// primary={test}
// //secondary={tobuy.amount}
// primaryTypographyProps={{ fontSize: '40px', margin: '10px' }}
// sx={{
// textDecoration: false ? 'line-through' : 'none',
// }}
// />
// </ListItem>
))}
{/* </List> */}
</FormGroup>
<DialogActions>
<Button onClick={() => cancelChange()}></Button>
<Button onClick={() => setOpenDialog(false)} variant="contained"
style={{width: '40%', fontSize: '40px'}}
>
</Button>
</DialogActions>
</Dialog>
{/* 食材編集ダイアログ */}
<Dialog open={openChangeDialog} onClose={() => setOpenChangeDialog(false)} disableScrollLock={true}
maxWidth="lg"
fullWidth
>
<Box display="flex" alignItems="center">
<DialogTitle sx={{ flexGrow: 1 }}></DialogTitle>
</Box>
<FormGroup>
{/* <List> */}
{/* タスク一覧をマップして各タスクをリストアイテムとして表示 */}
{testDishArray.map((test, id) => (
<ListItem
key={id}
sx={{
bgcolor: 'background.paper',
mb: 1,
borderRadius: 1,
boxShadow: 1,
}}
>
{/*
<Checkbox
checked={task.completed}
onChange={() => handleToggleComplete(task.id)}
/> */}
{/* タスクのタイトルと説明 - 完了状態に応じて取り消し線を表示 */}
<ListItemText
primary={test.name}
// secondary={task.description}
sx={{width: '80%'}}
/>
{/* 食材の個数を表示 */}
<ListItemText
primary={<Typography style={{textAlign:"center"}}><br />
{test.amount}
</Typography>
}
// secondary={task.description}
sx={{ align: "right", fontSize: "20px" }}
/>
{/* 買い物リスト:食材情報記入ボタン */}
<ListItemSecondaryAction>
<Tooltip title="食材情報追加">
<IconButton
edge="end"
aria-label="食材情報追加"
//onClick={() => handleDeleteTask(task.id)}
>
<ShoppingBasketIcon />
</IconButton>
</Tooltip>
{/* 買い物リスト:食材削除ボタン */}
<Tooltip title="項目を削除"
componentsProps={{
tooltip: {
sx: {
backgroundColor: "white",
color: "red",
fontSize: "0.8rem",
padding: "6px",
borderRadius: "6px",
},
},
}}
>
<IconButton
edge="end"
aria-label="delete"
onClick={() => handleDeleteStuffTemp(id)}
>
<DeleteIcon />
</IconButton>
</Tooltip>
</ListItemSecondaryAction>
</ListItem>
// <Button onClick={() => setOpenDialog(true)} key = {index}>
// {test}
// </Button>
// <ListItem
// key={index}
// sx={{
// bgcolor: 'background.paper',
// mb: 1,
// borderRadius: 1,
// boxShadow: 2,
// }}
// >
// {/* タスクのタイトルと説明 - 完了状態に応じて取り消し線を表示 */}
// <ListItemText
// primary={test}
// //secondary={tobuy.amount}
// primaryTypographyProps={{ fontSize: '40px', margin: '10px' }}
// sx={{
// textDecoration: false ? 'line-through' : 'none',
// }}
// />
// </ListItem>
))}
{/* </List> */}
</FormGroup>
<DialogActions>
<Button onClick={() => cancelChange()}></Button>
<Button onClick={() => setOpenDialog(false)} variant="contained"
style={{width: '40%', fontSize: '40px'}}
>
</Button>
</DialogActions>
</Dialog>
</Container>
);
};
export default DishList;
Loading…
Cancel
Save