Browse Source

モック作成

develop
sosuke.iwabuchi 2 years ago
parent
commit
191175e0ec
13 changed files with 294 additions and 56 deletions
  1. +24
    -7
      src/layouts/dashbord/navigator.tsx
  2. +4
    -4
      src/pages/auth/login.tsx
  3. +10
    -5
      src/pages/dashboard/contract/detail.tsx
  4. +28
    -0
      src/pages/dashboard/contract/entry.tsx
  5. +6
    -6
      src/pages/dashboard/contract/list.tsx
  6. +1
    -1
      src/pages/dashboard/index.tsx
  7. +53
    -0
      src/pages/dashboard/other/ask.tsx
  8. +55
    -0
      src/pages/dashboard/receipt/download.tsx
  9. +26
    -0
      src/pages/dashboard/user/detail.tsx
  10. +7
    -0
      src/pages/index.ts
  11. +2
    -33
      src/routes/index.tsx
  12. +5
    -0
      src/routes/path.ts
  13. +73
    -0
      src/routes/sub/dashboard.tsx

+ 24
- 7
src/layouts/dashbord/navigator.tsx View File

@@ -1,11 +1,8 @@
import { ExpandLess, ExpandMore } from "@mui/icons-material"; import { ExpandLess, ExpandMore } from "@mui/icons-material";
import HomeIcon from "@mui/icons-material/Home";
import PeopleIcon from "@mui/icons-material/People";
import AccountCircleIcon from "@mui/icons-material/AccountCircle";
import ArticleIcon from "@mui/icons-material/Article"; import ArticleIcon from "@mui/icons-material/Article";
import InfoIcon from "@mui/icons-material/Info";
import SettingsIcon from "@mui/icons-material/Settings"; import SettingsIcon from "@mui/icons-material/Settings";
import AccountBoxIcon from "@mui/icons-material/AccountBox";
import AccountCircleIcon from "@mui/icons-material/AccountCircle";
import AccountBalanceIcon from "@mui/icons-material/AccountBalance";
import { Collapse, Typography } from "@mui/material"; import { Collapse, Typography } from "@mui/material";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import Divider from "@mui/material/Divider"; import Divider from "@mui/material/Divider";
@@ -15,13 +12,13 @@ import ListItem from "@mui/material/ListItem";
import ListItemButton from "@mui/material/ListItemButton"; import ListItemButton from "@mui/material/ListItemButton";
import ListItemIcon from "@mui/material/ListItemIcon"; import ListItemIcon from "@mui/material/ListItemIcon";
import ListItemText from "@mui/material/ListItemText"; import ListItemText from "@mui/material/ListItemText";
import { PageID } from "pages";
import useAuth from "hooks/useAuth"; import useAuth from "hooks/useAuth";
import useNavigateCustom from "hooks/useNavigateCustom"; import useNavigateCustom from "hooks/useNavigateCustom";
import usePage from "hooks/usePage"; import usePage from "hooks/usePage";
import { PageID } from "pages";
import * as React from "react"; import * as React from "react";
import { PathOption, getPath } from "routes/path"; import { PathOption, getPath } from "routes/path";
import PersonIcon from "@mui/icons-material/Person";
type Group = { type Group = {
label: string; label: string;
children: SubGroup[]; children: SubGroup[];
@@ -84,11 +81,31 @@ export default function Navigator(props: DrawerProps) {
icon: <ArticleIcon />, icon: <ArticleIcon />,
id: PageID.DASHBOARD_CONTRACT_LIST, id: PageID.DASHBOARD_CONTRACT_LIST,
}, },
{
label: "新規利用申込",
icon: <ArticleIcon />,
id: PageID.DASHBOARD_CONTRACT_ENTRY,
},
{
label: "領収証ダウンロード",
icon: <ArticleIcon />,
id: PageID.DASHBOARD_RECEIPT_DOWNLOAD,
},
{
label: "問い合わせ",
icon: <InfoIcon />,
id: PageID.DASHBOARD_ASK,
},
], ],
}, },
{ {
label: "アカウント", label: "アカウント",
children: [ children: [
{
label: "利用者情報",
icon: <PersonIcon />,
id: PageID.DASHBOARD_USER_DETAIL,
},
{ label: "ログアウト", icon: <SettingsIcon />, id: PageID.LOGOUT }, { label: "ログアウト", icon: <SettingsIcon />, id: PageID.LOGOUT },
], ],
}, },


+ 4
- 4
src/pages/auth/login.tsx View File

@@ -1,16 +1,15 @@
import { yupResolver } from "@hookform/resolvers/yup"; import { yupResolver } from "@hookform/resolvers/yup";
import { LoadingButton } from "@mui/lab"; import { LoadingButton } from "@mui/lab";
import { Box, Stack, Typography } from "@mui/material";
import { PageID } from "pages";
import { Box, Button, Stack, Typography } from "@mui/material";
import InputAlert from "components/form/InputAlert"; import InputAlert from "components/form/InputAlert";
import { FormProvider, RHFTextField } from "components/hook-form"; import { FormProvider, RHFTextField } from "components/hook-form";
import useAuth from "hooks/useAuth"; import useAuth from "hooks/useAuth";
import useNavigateCustom from "hooks/useNavigateCustom"; import useNavigateCustom from "hooks/useNavigateCustom";
import useSnackbarCustom from "hooks/useSnackbarCustom"; import useSnackbarCustom from "hooks/useSnackbarCustom";
import { useEffect, useState } from "react";
import { PageID } from "pages";
import { useState } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { getPath } from "routes/path"; import { getPath } from "routes/path";
import { StoreId, setStore } from "storage/localstorage";
import * as Yup from "yup"; import * as Yup from "yup";


type FormProps = { type FormProps = {
@@ -74,6 +73,7 @@ export default function Login() {
<LoadingButton loading={sending} type="submit" variant="contained"> <LoadingButton loading={sending} type="submit" variant="contained">
ログイン ログイン
</LoadingButton> </LoadingButton>
<Button variant="outlined">パスワードを忘れた</Button>
</Stack> </Stack>
</Box> </Box>
</FormProvider> </FormProvider>


+ 10
- 5
src/pages/dashboard/contract/detail.tsx View File

@@ -1,7 +1,6 @@
import { import {
Box, Box,
Button, Button,
Grid,
Paper, Paper,
Stack, Stack,
Table, Table,
@@ -10,10 +9,10 @@ import {
TableRow, TableRow,
Typography, Typography,
} from "@mui/material"; } from "@mui/material";
import { PageID, TabID } from "pages";
import useDashboard from "hooks/useDashBoard"; import useDashboard from "hooks/useDashBoard";
import { useEffect } from "react";
import useNavigateCustom from "hooks/useNavigateCustom"; import useNavigateCustom from "hooks/useNavigateCustom";
import { PageID, TabID } from "pages";
import { useEffect } from "react";


export default function ContractDetail() { export default function ContractDetail() {
const { setHeaderTitle, setTabs } = useDashboard( const { setHeaderTitle, setTabs } = useDashboard(
@@ -25,7 +24,7 @@ export default function ContractDetail() {
useEffect(() => { useEffect(() => {
setHeaderTitle("契約詳細"); setHeaderTitle("契約詳細");
setTabs(null); setTabs(null);
}, []);
}, [setHeaderTitle, setTabs]);
return ( return (
<Box sx={{ p: 1, m: 1 }}> <Box sx={{ p: 1, m: 1 }}>
<Stack spacing={2}> <Stack spacing={2}>
@@ -79,13 +78,19 @@ export default function ContractDetail() {
</Paper> </Paper>
<Paper sx={{ p: 2 }}> <Paper sx={{ p: 2 }}>
<Typography variant="h5">各種申請</Typography> <Typography variant="h5">各種申請</Typography>
<Stack direction="row" spacing={2}>
<Stack direction="row" spacing={2} mt={2}>
<Box>
<Button variant="contained">シール再発行申請</Button>
</Box>
<Box> <Box>
<Button variant="contained">駐車証明証申請</Button> <Button variant="contained">駐車証明証申請</Button>
</Box> </Box>
<Box> <Box>
<Button variant="contained">解約申請</Button> <Button variant="contained">解約申請</Button>
</Box> </Box>
<Box>
<Button variant="contained">車両情報変更申請</Button>
</Box>
</Stack> </Stack>
</Paper> </Paper>
</Stack> </Stack>


+ 28
- 0
src/pages/dashboard/contract/entry.tsx View File

@@ -0,0 +1,28 @@
import { Box, Link, Stack, Typography } from "@mui/material";
import useDashboard from "hooks/useDashBoard";
import { PageID, TabID } from "pages";
import { useEffect } from "react";

export default function ContractEntry() {
const { setHeaderTitle, setTabs } = useDashboard(
PageID.DASHBOARD_CONTRACT_ENTRY,
TabID.NONE
);

useEffect(() => {
setHeaderTitle("新規利用申込");
setTabs(null);
}, [setHeaderTitle, setTabs]);

return (
<Stack>
<Box>新規の申込は、こちらよりお願いします。</Box>
<Link href="https://www.kyotopublic.or.jp/" target="_blank">
京都・滋賀駐車場なび
</Link>
<Link href="https://osaka-parking.jp/" target="_blank">
大阪・神戸・奈良駐車場なび
</Link>
</Stack>
);
}

+ 6
- 6
src/pages/dashboard/contract/list.tsx View File

@@ -1,8 +1,8 @@
import { Box, Button, Grid, Paper, Typography } from "@mui/material";
import { PageID, TabID } from "pages";
import { Box, Grid, Paper, Typography } from "@mui/material";
import useDashboard from "hooks/useDashBoard"; import useDashboard from "hooks/useDashBoard";
import { useEffect } from "react";
import useNavigateCustom from "hooks/useNavigateCustom"; import useNavigateCustom from "hooks/useNavigateCustom";
import { PageID, TabID } from "pages";
import { useEffect } from "react";
import { getPath } from "routes/path"; import { getPath } from "routes/path";


export default function ContractList() { export default function ContractList() {
@@ -31,13 +31,13 @@ export default function ContractList() {
useEffect(() => { useEffect(() => {
setHeaderTitle("契約一覧"); setHeaderTitle("契約一覧");
setTabs(null); setTabs(null);
}, []);
}, [setHeaderTitle, setTabs]);
return ( return (
<Box sx={{ p: 1, m: 1 }}> <Box sx={{ p: 1, m: 1 }}>
<Grid container spacing={2}> <Grid container spacing={2}>
{items.map((item) => {
{items.map((item, index) => {
return ( return (
<Grid item xs={12} md={6}>
<Grid item xs={12} md={6} key={index}>
<Paper sx={{ p: 2, cursor: "pointer" }} onClick={moveToDetail}> <Paper sx={{ p: 2, cursor: "pointer" }} onClick={moveToDetail}>
<Typography variant="h5">{item.parkingName}</Typography> <Typography variant="h5">{item.parkingName}</Typography>
<Typography variant="h6">区画:{item.position}</Typography> <Typography variant="h6">区画:{item.position}</Typography>


+ 1
- 1
src/pages/dashboard/index.tsx View File

@@ -12,6 +12,6 @@ export default function Overview() {
useEffect(() => { useEffect(() => {
setHeaderTitle("Dashboard"); setHeaderTitle("Dashboard");
setTabs(null); setTabs(null);
}, []);
}, [setHeaderTitle, setTabs]);
return <Box sx={{ p: 1, m: 1 }}></Box>; return <Box sx={{ p: 1, m: 1 }}></Box>;
} }

+ 53
- 0
src/pages/dashboard/other/ask.tsx View File

@@ -0,0 +1,53 @@
import { AccountBoxSharp } from "@mui/icons-material";
import {
Accordion,
AccordionDetails,
AccordionSummary,
Box,
Button,
Stack,
} from "@mui/material";
import useDashboard from "hooks/useDashBoard";
import { PageID, TabID } from "pages";
import { useEffect } from "react";
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";

export default function Ask() {
const { setHeaderTitle, setTabs } = useDashboard(
PageID.DASHBOARD_ASK,
TabID.NONE
);

useEffect(() => {
setHeaderTitle("問い合わせ");
setTabs(null);
}, [setHeaderTitle, setTabs]);

return (
<Stack>
<Box>よくある質問</Box>
<Box>
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
支払をしたか確認をしたい
</AccordionSummary>
<AccordionDetails>
契約一覧より支払状況が確認できます。
</AccordionDetails>
</Accordion>
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
解約をしたい
</AccordionSummary>
<AccordionDetails>
契約一覧より解約申請をしてください
</AccordionDetails>
</Accordion>
</Box>
<Box>よくある質問で解決しない場合</Box>
<Box>
<Button>問い合わせへ進む</Button>
</Box>
</Stack>
);
}

+ 55
- 0
src/pages/dashboard/receipt/download.tsx View File

@@ -0,0 +1,55 @@
import { Button, Card, Stack } from "@mui/material";
import { FormProvider } from "components/hook-form";
import RHFSelect, { SelectOptionProps } from "components/hook-form/RHFSelect";
import useDashboard from "hooks/useDashBoard";
import { PageID, TabID } from "pages";
import { useEffect, useMemo } from "react";
import { useForm } from "react-hook-form";

type FormProps = {
term: string;
};

export default function ReceiptDownload() {
const { setHeaderTitle, setTabs } = useDashboard(
PageID.DASHBOARD_RECEIPT_DOWNLOAD,
TabID.NONE
);

const options: SelectOptionProps[] = useMemo(() => {
return [
{ value: "2023/08 駐車場利用" },
{ value: "2023/07 駐車場利用" },
{ value: "2023/06 駐車場利用" },
{ value: "車庫証明発行" },
];
}, []);

const form = useForm<FormProps>({
defaultValues: {
term: "",
},
});

const term = form.watch("term");

const canDownload = useMemo(() => {
return term !== "";
}, [term]);

useEffect(() => {
setHeaderTitle("領収証ダウンロード");
setTabs(null);
}, [setHeaderTitle, setTabs]);

return (
<FormProvider methods={form}>
<Card sx={{ maxWidth: 500, m: 1, p: 1 }}>
<Stack>
<RHFSelect name="term" options={options} size="small" />
<Button disabled={!canDownload}>ダウンロード</Button>
</Stack>
</Card>
</FormProvider>
);
}

+ 26
- 0
src/pages/dashboard/user/detail.tsx View File

@@ -0,0 +1,26 @@
import { Button, Stack } from "@mui/material";
import StackRow from "components/stack/StackRow";
import useDashboard from "hooks/useDashBoard";
import { PageID, TabID } from "pages";
import { useEffect } from "react";

export default function UserDetail() {
const { setHeaderTitle, setTabs } = useDashboard(
PageID.DASHBOARD_CONTRACT_DETAIL,
TabID.NONE
);

useEffect(() => {
setHeaderTitle("利用者情報");
setTabs(null);
}, []);

return (
<Stack>
<Button>ユーザー情報変更</Button>
<Button>口座情報変更</Button>
<Button>学生証アップロード</Button>
<Button>障害者手帳アップロード</Button>
</Stack>
);
}

+ 7
- 0
src/pages/index.ts View File

@@ -7,9 +7,16 @@ export const PageID = {


DASHBOARD_OVERVIEW: id++, DASHBOARD_OVERVIEW: id++,


DASHBOARD_CONTRACT_ENTRY: id++,
DASHBOARD_CONTRACT_LIST: id++, DASHBOARD_CONTRACT_LIST: id++,
DASHBOARD_CONTRACT_DETAIL: id++, DASHBOARD_CONTRACT_DETAIL: id++,


DASHBOARD_RECEIPT_DOWNLOAD: id++,

DASHBOARD_USER_DETAIL: id++,

DASHBOARD_ASK: id++,

PAGE_403: id++, PAGE_403: id++,
PAGE_404: id++, PAGE_404: id++,
} as const; } as const;


+ 2
- 33
src/routes/index.tsx View File

@@ -1,13 +1,13 @@
import { PageID } from "pages"; import { PageID } from "pages";
import LoadingScreen from "components/LoadingScreen"; import LoadingScreen from "components/LoadingScreen";
import useAuth from "hooks/useAuth"; import useAuth from "hooks/useAuth";
import DashboardLayout from "layouts/dashbord";
import SimpleLayout from "layouts/simple"; import SimpleLayout from "layouts/simple";
import { ElementType, Suspense, lazy, useMemo } from "react"; import { ElementType, Suspense, lazy, useMemo } from "react";
import { RouteObject, useRoutes } from "react-router-dom"; import { RouteObject, useRoutes } from "react-router-dom";
import { getRoute } from "./path"; import { getRoute } from "./path";
import DashboardRoutes from "./sub/dashboard";


const Loadable = (Component: ElementType) => (props: any) => {
export const Loadable = (Component: ElementType) => (props: any) => {
return ( return (
<Suspense fallback={<LoadingScreen />}> <Suspense fallback={<LoadingScreen />}>
<Component {...props} /> <Component {...props} />
@@ -35,28 +35,6 @@ const AuthRoutes = (): RouteObject => ({
], ],
}); });


const DashboardRoutes = (): RouteObject => {
const children = [
{
path: getRoute(PageID.DASHBOARD_OVERVIEW),
element: <Dashboard />,
},
{
path: getRoute(PageID.DASHBOARD_CONTRACT_LIST),
element: <ContractList />,
},
{
path: getRoute(PageID.DASHBOARD_CONTRACT_DETAIL),
element: <ContractDetail />,
},
];

return {
element: <DashboardLayout />,
children,
};
};

export function Routes() { export function Routes() {
const { initialized } = useAuth(); const { initialized } = useAuth();


@@ -79,15 +57,6 @@ export function Routes() {
const Login = Loadable(lazy(() => import("pages/auth/login"))); const Login = Loadable(lazy(() => import("pages/auth/login")));
const Logout = Loadable(lazy(() => import("pages/auth/logout"))); const Logout = Loadable(lazy(() => import("pages/auth/logout")));


//ダッシュボード ----------------------------
const Dashboard = Loadable(lazy(() => import("pages/dashboard")));
const ContractList = Loadable(
lazy(() => import("pages/dashboard/contract/list"))
);
const ContractDetail = Loadable(
lazy(() => import("pages/dashboard/contract/detail"))
);

// その他 --------------------------------- // その他 ---------------------------------


const Page403 = Loadable(lazy(() => import("pages/common/Page403"))); const Page403 = Loadable(lazy(() => import("pages/common/Page403")));


+ 5
- 0
src/routes/path.ts View File

@@ -31,10 +31,15 @@ const getTabId = (key: PathKey): TabID => {
const PATHS_DASHBOARD = { const PATHS_DASHBOARD = {
[makePathKey(PageID.DASHBOARD_OVERVIEW)]: "/dashboard", [makePathKey(PageID.DASHBOARD_OVERVIEW)]: "/dashboard",
// --契約----------------------- // --契約-----------------------
[makePathKey(PageID.DASHBOARD_CONTRACT_ENTRY)]: "/dashboard/contract/entry",
[makePathKey(PageID.DASHBOARD_CONTRACT_LIST)]: [makePathKey(PageID.DASHBOARD_CONTRACT_LIST)]:
"/dashboard/contract/list/:page", "/dashboard/contract/list/:page",
[makePathKey(PageID.DASHBOARD_CONTRACT_DETAIL)]: [makePathKey(PageID.DASHBOARD_CONTRACT_DETAIL)]:
"/dashboard/contract/detail/:id", "/dashboard/contract/detail/:id",
[makePathKey(PageID.DASHBOARD_RECEIPT_DOWNLOAD)]:
"/dashboard/receipt/download",
[makePathKey(PageID.DASHBOARD_USER_DETAIL)]: "/dashboard/user/detail",
[makePathKey(PageID.DASHBOARD_ASK)]: "/dashboard/ask",
}; };


const PATHS = { const PATHS = {


+ 73
- 0
src/routes/sub/dashboard.tsx View File

@@ -0,0 +1,73 @@
import useAuth from "hooks/useAuth";
import DashboardLayout from "layouts/dashbord";
import { PageID } from "pages";
import { lazy, useMemo } from "react";
import { RouteObject } from "react-router-dom";
import { Loadable } from "routes";
import { getRoute } from "routes/path";

export default function DashboardRoutes(): RouteObject {
const { authenticated } = useAuth();

const children: RouteObject[] = useMemo(() => {
if (!authenticated) return [];

const Dashboard = Loadable(lazy(() => import("pages/dashboard")));
const ContractEntry = Loadable(
lazy(() => import("pages/dashboard/contract/entry"))
);
const ContractList = Loadable(
lazy(() => import("pages/dashboard/contract/list"))
);
const ContractDetail = Loadable(
lazy(() => import("pages/dashboard/contract/detail"))
);
const ReceiptDownload = Loadable(
lazy(() => import("pages/dashboard/receipt/download"))
);
const UserDetail = Loadable(
lazy(() => import("pages/dashboard/user/detail"))
);
const Ask = Loadable(lazy(() => import("pages/dashboard/other/ask")));

const allChildren = [
{
pageId: PageID.DASHBOARD_OVERVIEW,
element: <Dashboard />,
},
{
pageId: PageID.DASHBOARD_CONTRACT_ENTRY,
element: <ContractEntry />,
},
{
pageId: PageID.DASHBOARD_CONTRACT_LIST,
element: <ContractList />,
},
{
pageId: PageID.DASHBOARD_CONTRACT_DETAIL,
element: <ContractDetail />,
},
{
pageId: PageID.DASHBOARD_RECEIPT_DOWNLOAD,
element: <ReceiptDownload />,
},
{
pageId: PageID.DASHBOARD_USER_DETAIL,
element: <UserDetail />,
},
{
pageId: PageID.DASHBOARD_ASK,
element: <Ask />,
},
];
return allChildren.map(({ pageId, ...others }) => ({
...others,
path: getRoute(pageId),
}));
}, [authenticated]);

return {
element: <DashboardLayout />,
children: children,
};
}

Loading…
Cancel
Save