diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b073615..eabdacc 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,6 +10,9 @@ "dependencies": { "@emotion/react": "^11.11.3", "@emotion/styled": "^11.11.0", + "@fullcalendar/core": "^6.1.17", + "@fullcalendar/daygrid": "^6.1.17", + "@fullcalendar/react": "^6.1.17", "@mui/icons-material": "^5.15.10", "@mui/material": "^5.15.10", "@testing-library/jest-dom": "^5.17.0", @@ -2454,6 +2457,32 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fullcalendar/core": { + "version": "6.1.17", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.17.tgz", + "integrity": "sha512-0W7lnIrv18ruJ5zeWBeNZXO8qCWlzxDdp9COFEsZnyNjiEhUVnrW/dPbjRKYpL0edGG0/Lhs0ghp1z/5ekt8ZA==", + "dependencies": { + "preact": "~10.12.1" + } + }, + "node_modules/@fullcalendar/daygrid": { + "version": "6.1.17", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.17.tgz", + "integrity": "sha512-K7m+pd7oVJ9fW4h7CLDdDGJbc9szJ1xDU1DZ2ag+7oOo1aCNLv44CehzkkknM6r8EYlOOhgaelxQpKAI4glj7A==", + "peerDependencies": { + "@fullcalendar/core": "~6.1.17" + } + }, + "node_modules/@fullcalendar/react": { + "version": "6.1.17", + "resolved": "https://registry.npmjs.org/@fullcalendar/react/-/react-6.1.17.tgz", + "integrity": "sha512-AA8soHhlfRH5dUeqHnfAtzDiXa2vrgWocJSK/F5qzw/pOxc9MqpuoS/nQBROWtHHg6yQUg3DoGqOOhi7dmylXQ==", + "peerDependencies": { + "@fullcalendar/core": "~6.1.17", + "react": "^16.7.0 || ^17 || ^18 || ^19", + "react-dom": "^16.7.0 || ^17 || ^18 || ^19" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -13068,6 +13097,15 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, + "node_modules/preact": { + "version": "10.12.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz", + "integrity": "sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -18406,6 +18444,26 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==" }, + "@fullcalendar/core": { + "version": "6.1.17", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.17.tgz", + "integrity": "sha512-0W7lnIrv18ruJ5zeWBeNZXO8qCWlzxDdp9COFEsZnyNjiEhUVnrW/dPbjRKYpL0edGG0/Lhs0ghp1z/5ekt8ZA==", + "requires": { + "preact": "~10.12.1" + } + }, + "@fullcalendar/daygrid": { + "version": "6.1.17", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.17.tgz", + "integrity": "sha512-K7m+pd7oVJ9fW4h7CLDdDGJbc9szJ1xDU1DZ2ag+7oOo1aCNLv44CehzkkknM6r8EYlOOhgaelxQpKAI4glj7A==", + "requires": {} + }, + "@fullcalendar/react": { + "version": "6.1.17", + "resolved": "https://registry.npmjs.org/@fullcalendar/react/-/react-6.1.17.tgz", + "integrity": "sha512-AA8soHhlfRH5dUeqHnfAtzDiXa2vrgWocJSK/F5qzw/pOxc9MqpuoS/nQBROWtHHg6yQUg3DoGqOOhi7dmylXQ==", + "requires": {} + }, "@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -25831,6 +25889,11 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, + "preact": { + "version": "10.12.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz", + "integrity": "sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==" + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index d268744..4c4efb8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -7,6 +7,9 @@ "dependencies": { "@emotion/react": "^11.11.3", "@emotion/styled": "^11.11.0", + "@fullcalendar/core": "^6.1.17", + "@fullcalendar/daygrid": "^6.1.17", + "@fullcalendar/react": "^6.1.17", "@mui/icons-material": "^5.15.10", "@mui/material": "^5.15.10", "@testing-library/jest-dom": "^5.17.0", diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 2f0c096..618fe8c 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -14,6 +14,9 @@ import './App.css'; // 必要なインポートを追加 import AddDishes1 from './pages/AddDishes1'; import AddDishes2 from './pages/AddDishes2'; +//カレンダーライブラリ +import FullCalendar from '@fullcalendar/react'; +import dayGridPlugin from "@fullcalendar/daygrid"; /** * アプリケーション全体のMaterial UIテーマを定義 @@ -55,6 +58,15 @@ const theme = createTheme({ }, }); +const Calendar = () => { + return ( + + ); +} + /** * 認証が必要なルートを保護するためのコンポーネント * ローカルストレージにトークンがない場合はログインページにリダイレクト diff --git a/frontend/src/pages/TaskListPage.tsx b/frontend/src/pages/TaskListPage.tsx index f10f248..d577f1e 100644 --- a/frontend/src/pages/TaskListPage.tsx +++ b/frontend/src/pages/TaskListPage.tsx @@ -34,7 +34,7 @@ import { Add as AddIcon, Delete as DeleteIcon, ShoppingBasket as ShoppingBasketIcon, SoupKitchen as SoupKitchenIcon } from '@mui/icons-material'; -import { ToBuy, Stuff, Stock } from '../types/types'; +import { ToBuy, Stuff, /*Stock*/ } from '../types/types'; import { TOBUY_ERRORS } from '../constants/errorMessages'; //import { FaCarrot } from "react-icons/fa6"; //エラー起きる いったん保留 @@ -64,7 +64,7 @@ const TaskListPage: React.FC = () => { //在庫登録ダイアログの表示状態 const [openInfoDialog, setOpenInfoDialog] = useState(false); - + const [selectedTask, setSelectedTask] = useState(0); const [newToBuy, setNewToBuy] = useState(EMPTY_TOBUY); @@ -73,6 +73,8 @@ const TaskListPage: React.FC = () => { const [newStock, setNewStock] = useState(EMPTY_STOCK); + const [newPrice, setNewPrice] = useState("");//入力用の価格(文字列) + // コンポーネントマウント時にタスク一覧を取得 useEffect(() => { @@ -126,14 +128,21 @@ const TaskListPage: React.FC = () => { console.error(`${TOBUY_ERRORS.DELETE_FAILED}:`, error); } }; - + /** * 買うものリストの在庫登録(購入処理)を行うハンドラー */ const handleBuy = async (tobuyId: number) => { try { const today = new Date().toISOString().substring(0, 10); - await toBuyApi.buy({tobuyId, ...newStock, lastUpdate: today}); + const parsedPrice = parseInt(newPrice, 10); + if (!isNaN(parsedPrice)) { + setNewStock({ ...newStock, price: parsedPrice }); + }else{ + alert('入力が無効です') + return + } + await toBuyApi.buy({ tobuyId, ...newStock, lastUpdate: today }); //データベースに送信 fetchTasks(); // 削除後の買うもの一覧を再取得 } catch (error) { console.error(`${TOBUY_ERRORS.BUY_FAILED}:`, error); @@ -253,12 +262,13 @@ const TaskListPage: React.FC = () => { {setOpenDialog(true); - //handleNavigate('/AddDishies1'); + onClick={() => { + setOpenDialog(true); + //handleNavigate('/AddDishies1'); }} - //selected={isSelected('/test')} + //selected={isSelected('/test')} + - > @@ -286,7 +296,7 @@ const TaskListPage: React.FC = () => {