Start project
This commit is contained in:
1 parent
3cc7ebe6d5
commit
6bf7f18bb5
3 files changed
+17385
-167
No files matched your search
Generated
+17195
-149
File diff suppressed because it is too large.
Load diff
@@ -3,6 +3,11 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@date-io/dayjs": "^2.13.1",
|
||||||
|
"@emotion/react": "^11.9.0",
|
||||||
|
"@emotion/styled": "^11.8.1",
|
||||||
|
"@mui/material": "^5.6.2",
|
||||||
|
"@mui/x-date-pickers": "^5.0.0-alpha.1",
|
||||||
"@testing-library/jest-dom": "^5.16.4",
|
"@testing-library/jest-dom": "^5.16.4",
|
||||||
"@testing-library/react": "^13.1.1",
|
"@testing-library/react": "^13.1.1",
|
||||||
"@testing-library/user-event": "^13.5.0",
|
"@testing-library/user-event": "^13.5.0",
|
||||||
@@ -10,6 +15,7 @@
|
|||||||
"@types/node": "^16.11.27",
|
"@types/node": "^16.11.27",
|
||||||
"@types/react": "^18.0.6",
|
"@types/react": "^18.0.6",
|
||||||
"@types/react-dom": "^18.0.2",
|
"@types/react-dom": "^18.0.2",
|
||||||
|
"dayjs": "^1.11.1",
|
||||||
"react": "^18.0.0",
|
"react": "^18.0.0",
|
||||||
"react-dom": "^18.0.0",
|
"react-dom": "^18.0.0",
|
||||||
"react-scripts": "5.0.1",
|
"react-scripts": "5.0.1",
|
||||||
|
|||||||
+184
-18
@@ -1,25 +1,191 @@
|
|||||||
import React from 'react';
|
import React, { useState } from 'react';
|
||||||
import logo from './logo.svg';
|
|
||||||
import './App.css';
|
import './App.css';
|
||||||
|
import { AppBar, Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Grid, TextField, Toolbar, Typography } from '@mui/material';
|
||||||
|
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
|
||||||
|
import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
|
||||||
|
import dayjs from 'dayjs';
|
||||||
|
import { DatePicker } from '@mui/x-date-pickers';
|
||||||
|
|
||||||
|
type Todo = {
|
||||||
|
name: string,
|
||||||
|
id: string,
|
||||||
|
done: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
function TodoItem({todo,setDone}: {todo: Todo, setDone: (done: boolean) => void}){
|
||||||
|
return (
|
||||||
|
<li>
|
||||||
|
{todo.name}
|
||||||
|
<input type="checkbox" checked={todo.done} onChange={(e) => setDone(e.target.checked)}></input>
|
||||||
|
</li>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function ChangeTodo({todo, setTodo, handleCancel}: {todo: Todo, setTodo: (todo: Todo) => void, handleCancel: () => void}){
|
||||||
|
|
||||||
|
const [name, setName] = React.useState<string>(todo.name)
|
||||||
|
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setName(event.target.value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const [id, setId] = React.useState<string>(todo.id)
|
||||||
|
|
||||||
|
const [done, setDone] = React.useState<boolean>(todo.done)
|
||||||
|
|
||||||
|
const [from, setFrom] = React.useState<Date | null>(
|
||||||
|
new Date('2022-04-18T21:11:54'),
|
||||||
|
);
|
||||||
|
const handleFrom = (newValue: Date | null) => {
|
||||||
|
setFrom(newValue);
|
||||||
|
};
|
||||||
|
|
||||||
|
const [to, setTo] = React.useState<Date | null>(
|
||||||
|
new Date('2022-05-18T21:11:54'),
|
||||||
|
);
|
||||||
|
const handleTo = (newValue: Date | null) => {
|
||||||
|
setTo(newValue);
|
||||||
|
};
|
||||||
|
|
||||||
|
const saveTodo=() => {
|
||||||
|
const newtodo = {
|
||||||
|
name: name,
|
||||||
|
id: id === "" ? Math.random().toString() : id,
|
||||||
|
done: done
|
||||||
|
};
|
||||||
|
setTodo(newtodo);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<DialogContent>
|
||||||
|
<TextField
|
||||||
|
id="name"
|
||||||
|
value={name}
|
||||||
|
label="Name"
|
||||||
|
onChange={handleChange}
|
||||||
|
/>
|
||||||
|
<TextField
|
||||||
|
id="description"
|
||||||
|
label="Description"
|
||||||
|
/>
|
||||||
|
<LocalizationProvider dateAdapter={AdapterDayjs} locale={dayjs().locale('de')}>
|
||||||
|
<DatePicker
|
||||||
|
mask={'__.__.____'}
|
||||||
|
label="From:"
|
||||||
|
value={from}
|
||||||
|
onChange={handleFrom}
|
||||||
|
renderInput={(params: any) => <TextField {...params} />}
|
||||||
|
/>
|
||||||
|
</LocalizationProvider>
|
||||||
|
<LocalizationProvider dateAdapter={AdapterDayjs} locale={dayjs().locale('de')}>
|
||||||
|
<DatePicker
|
||||||
|
mask={'__.__.____'}
|
||||||
|
label="To:"
|
||||||
|
value={to}
|
||||||
|
onChange={handleTo}
|
||||||
|
renderInput={(params: any) => <TextField {...params} />}
|
||||||
|
/>
|
||||||
|
</LocalizationProvider>
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<Button onClick={handleCancel}>Cancel</Button>
|
||||||
|
<Button onClick={saveTodo}>Save</Button>
|
||||||
|
</DialogActions>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function Todos() {
|
||||||
|
const [todos, setTodos] = useState<Todo[]>([]);
|
||||||
|
const setDone=(i: number,todo: Todo) => (done: boolean) => setTodos([...todos.slice(0,i),{name: todo.name, id: todo.id, done: done},...todos.slice(i+1)]);
|
||||||
|
|
||||||
|
const setTodo= (todo: Todo) => {
|
||||||
|
handleClose();
|
||||||
|
setTodos([...todos, todo]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
|
const handleClickOpen = () => {
|
||||||
|
setOpen(true);
|
||||||
|
};
|
||||||
|
const handleClose = () => {
|
||||||
|
setOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Typography variant="h2">ToDo's</Typography>
|
||||||
|
<ul>
|
||||||
|
{todos.map((todo, i) =>
|
||||||
|
<TodoItem key={todo.id} todo={todo} setDone={setDone(i, todo)}></TodoItem>
|
||||||
|
)}
|
||||||
|
</ul>
|
||||||
|
<Button onClick={handleClickOpen}>Add Todo</Button>
|
||||||
|
<Dialog open={open} onClose={handleClose}>
|
||||||
|
<DialogTitle>New Todo</DialogTitle>
|
||||||
|
<ChangeTodo todo={{id: "", name: "", done: false}} setTodo={setTodo} handleCancel={handleClose}></ChangeTodo>
|
||||||
|
</Dialog>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function Calendar(){
|
||||||
|
return(
|
||||||
|
<Typography variant="h2">Calendar</Typography>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function Dinos(){
|
||||||
|
return(
|
||||||
|
<Typography variant="h2">Dinos</Typography>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function Overview(){
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Typography variant="h2">Overview</Typography>
|
||||||
|
<Grid
|
||||||
|
container
|
||||||
|
justifyContent="space-evenly"
|
||||||
|
alignItems="flex-start"
|
||||||
|
spacing={2}>
|
||||||
|
<Todos/>
|
||||||
|
<Todos/>
|
||||||
|
</Grid>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const pages = ['Overview', 'Todos', 'Calendar', 'Dinos'];
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
|
const [page,setPage] = useState<string>("Overview");
|
||||||
return (
|
return (
|
||||||
<div className="App">
|
<>
|
||||||
<header className="App-header">
|
<AppBar>
|
||||||
<img src={logo} className="App-logo" alt="logo" />
|
<Toolbar>
|
||||||
<p>
|
<Typography variant="h5"
|
||||||
Edit <code>src/App.tsx</code> and save to reload.
|
noWrap
|
||||||
</p>
|
component="div"
|
||||||
<a
|
//sx={{ flexGrow: 0, display: { xs: 'flex', md: 'none' } }}
|
||||||
className="App-link"
|
>
|
||||||
href="https://reactjs.org"
|
ToDinos
|
||||||
target="_blank"
|
</Typography>
|
||||||
rel="noopener noreferrer"
|
<Box sx={{ flexGrow: 1, display: { xs: 'none', md: 'flex' } }}>
|
||||||
>
|
{pages.map((page) =>
|
||||||
Learn React
|
<Button key={page} onClick={() => setPage(page)} sx={{ my: 2, color: 'white', display: 'block' }}>
|
||||||
</a>
|
{page}
|
||||||
</header>
|
</Button>
|
||||||
</div>
|
)}
|
||||||
|
</Box>
|
||||||
|
</Toolbar>
|
||||||
|
</AppBar>
|
||||||
|
{page === "Overview" && <Overview/>}
|
||||||
|
{page === "Todos" && <Todos/>}
|
||||||
|
{page === "Calendar" && <Calendar/>}
|
||||||
|
{page === "Dinos" && <Dinos/>}
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user