Добавление модалки создание задачи, добавление formik либы (#62)
This commit is contained in:
@ -47,7 +47,7 @@
|
|||||||
"import/extensions": 0,
|
"import/extensions": 0,
|
||||||
"react/prop-types": 0,
|
"react/prop-types": 0,
|
||||||
"no-underscore-dangle": 0,
|
"no-underscore-dangle": 0,
|
||||||
"import/imports-first": ["error", "absolute-first"],
|
"import/imports-first": ["warn", "absolute-first"],
|
||||||
"import/prefer-default-export": 0,
|
"import/prefer-default-export": 0,
|
||||||
"import/no-unresolved": 0,
|
"import/no-unresolved": 0,
|
||||||
"import/newline-after-import": "error",
|
"import/newline-after-import": "error",
|
||||||
|
|||||||
31
package-lock.json
generated
31
package-lock.json
generated
@ -7942,6 +7942,27 @@
|
|||||||
"mime-types": "^2.1.12"
|
"mime-types": "^2.1.12"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"formik": {
|
||||||
|
"version": "2.2.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/formik/-/formik-2.2.6.tgz",
|
||||||
|
"integrity": "sha512-Kxk2zQRafy56zhLmrzcbryUpMBvT0tal5IvcifK5+4YNGelKsnrODFJ0sZQRMQboblWNym4lAW3bt+tf2vApSA==",
|
||||||
|
"requires": {
|
||||||
|
"deepmerge": "^2.1.1",
|
||||||
|
"hoist-non-react-statics": "^3.3.0",
|
||||||
|
"lodash": "^4.17.14",
|
||||||
|
"lodash-es": "^4.17.14",
|
||||||
|
"react-fast-compare": "^2.0.1",
|
||||||
|
"tiny-warning": "^1.0.2",
|
||||||
|
"tslib": "^1.10.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"deepmerge": {
|
||||||
|
"version": "2.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
|
||||||
|
"integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"forwarded": {
|
"forwarded": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
|
||||||
@ -11476,6 +11497,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
||||||
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
|
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
|
||||||
},
|
},
|
||||||
|
"lodash-es": {
|
||||||
|
"version": "4.17.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.20.tgz",
|
||||||
|
"integrity": "sha512-JD1COMZsq8maT6mnuz1UMV0jvYD0E0aUsSOdrr1/nAG3dhqQXwRRgeW0cSqH1U43INKcqxaiVIQNOUDld7gRDA=="
|
||||||
|
},
|
||||||
"lodash._reinterpolate": {
|
"lodash._reinterpolate": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
|
||||||
@ -16046,6 +16072,11 @@
|
|||||||
"integrity": "sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw==",
|
"integrity": "sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"react-fast-compare": {
|
||||||
|
"version": "2.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
|
||||||
|
"integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
|
||||||
|
},
|
||||||
"react-is": {
|
"react-is": {
|
||||||
"version": "17.0.1",
|
"version": "17.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz",
|
||||||
|
|||||||
@ -12,6 +12,7 @@
|
|||||||
"axios": "^0.21.0",
|
"axios": "^0.21.0",
|
||||||
"convert-layout": "^0.8.2",
|
"convert-layout": "^0.8.2",
|
||||||
"date-fns": "^2.16.1",
|
"date-fns": "^2.16.1",
|
||||||
|
"formik": "^2.2.6",
|
||||||
"fp-ts": "^2.8.5",
|
"fp-ts": "^2.8.5",
|
||||||
"history": "^5.0.0",
|
"history": "^5.0.0",
|
||||||
"lodash": "^4.17.20",
|
"lodash": "^4.17.20",
|
||||||
|
|||||||
94
src/app/components/create-task-modal/CreateTaskModal.tsx
Normal file
94
src/app/components/create-task-modal/CreateTaskModal.tsx
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
import React, {FC, memo} from 'react';
|
||||||
|
import {format} from 'date-fns';
|
||||||
|
import {useFormik} from 'formik';
|
||||||
|
import Dialog from '@material-ui/core/Dialog';
|
||||||
|
import DialogActions from '@material-ui/core/DialogActions';
|
||||||
|
import DialogContent from '@material-ui/core/DialogContent';
|
||||||
|
import DialogTitle from '@material-ui/core/DialogTitle';
|
||||||
|
import {Task} from '_types/common';
|
||||||
|
import {VIEW_DATE_TIME} from '_consts/common';
|
||||||
|
import {Button, TextField} from '@material-ui/core';
|
||||||
|
import {LABELS} from '../../consts';
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
isOpen: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
const now = format(new Date(), VIEW_DATE_TIME);
|
||||||
|
|
||||||
|
const CreateTaskModal: FC<Props> = ({isOpen}) => {
|
||||||
|
const form = useFormik<Partial<Task>>({
|
||||||
|
initialValues: {
|
||||||
|
title: '',
|
||||||
|
body: '',
|
||||||
|
start_at: now,
|
||||||
|
end_at: '',
|
||||||
|
},
|
||||||
|
onSubmit: () => {
|
||||||
|
// В аргументах приходят values. Ждем задачи со сторами для формы
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Dialog open={isOpen}>
|
||||||
|
<form onSubmit={form.handleSubmit}>
|
||||||
|
<DialogTitle id="form-dialog-title">{LABELS.CREATE_TASK}</DialogTitle>
|
||||||
|
<DialogContent>
|
||||||
|
<TextField
|
||||||
|
autoFocus
|
||||||
|
value={form.values.title}
|
||||||
|
id="title"
|
||||||
|
onChange={form.handleChange}
|
||||||
|
margin="dense"
|
||||||
|
label={LABELS.TITLE}
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
|
<TextField
|
||||||
|
value={form.values.body}
|
||||||
|
id="body"
|
||||||
|
onChange={form.handleChange}
|
||||||
|
margin="dense"
|
||||||
|
label={LABELS.DESCRIPTION}
|
||||||
|
rowsMax={4}
|
||||||
|
multiline
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
|
<TextField
|
||||||
|
id="start_at"
|
||||||
|
value={form.values.start_at}
|
||||||
|
label={LABELS.START_AT}
|
||||||
|
type="datetime-local"
|
||||||
|
onChange={form.handleChange}
|
||||||
|
margin="dense"
|
||||||
|
InputLabelProps={{
|
||||||
|
shrink: true,
|
||||||
|
}}
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
|
<TextField
|
||||||
|
id="end_at"
|
||||||
|
value={form.values.end_at}
|
||||||
|
label={LABELS.END_AT}
|
||||||
|
type="datetime-local"
|
||||||
|
onChange={form.handleChange}
|
||||||
|
margin="dense"
|
||||||
|
InputLabelProps={{
|
||||||
|
shrink: true,
|
||||||
|
}}
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<Button color="primary" type="button">
|
||||||
|
{LABELS.CANCEL}
|
||||||
|
</Button>
|
||||||
|
<Button color="primary" type="submit">
|
||||||
|
{LABELS.CREATE}
|
||||||
|
</Button>
|
||||||
|
</DialogActions>
|
||||||
|
</form>
|
||||||
|
</Dialog>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(CreateTaskModal);
|
||||||
1
src/app/components/create-task-modal/index.ts
Normal file
1
src/app/components/create-task-modal/index.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export {default} from './CreateTaskModal';
|
||||||
@ -1,7 +1,6 @@
|
|||||||
import React, {Fragment, memo} from 'react';
|
import React, {Fragment, memo, useMemo} from 'react';
|
||||||
import {Route, Switch} from 'react-router-dom';
|
import {Route, Switch} from 'react-router-dom';
|
||||||
import {Container, createStyles, makeStyles, useScrollTrigger} from '@material-ui/core';
|
import {Container, createStyles, makeStyles, useScrollTrigger} from '@material-ui/core';
|
||||||
|
|
||||||
import mainPageRouter from '_pages/main/routing';
|
import mainPageRouter from '_pages/main/routing';
|
||||||
import chaosBoxPageRouter from '_pages/chaos-box/routing';
|
import chaosBoxPageRouter from '_pages/chaos-box/routing';
|
||||||
import calendarPageRouter from '_pages/calendar/routing';
|
import calendarPageRouter from '_pages/calendar/routing';
|
||||||
@ -11,9 +10,13 @@ import settingsPageRouter from '_pages/settings/routing';
|
|||||||
import signInPageRouter from '_pages/sign-in/routing';
|
import signInPageRouter from '_pages/sign-in/routing';
|
||||||
import tagsPageRouter from '_pages/tags/routing';
|
import tagsPageRouter from '_pages/tags/routing';
|
||||||
import NotFoundPage from '_pages/not-found/components/page';
|
import NotFoundPage from '_pages/not-found/components/page';
|
||||||
|
import {useQuery} from '_hooks/useQuery';
|
||||||
import TopMenu from '../top-menu';
|
import TopMenu from '../top-menu';
|
||||||
import './Page.scss';
|
import './Page.scss';
|
||||||
import BothMenu from '../both-menu';
|
import BothMenu from '../both-menu';
|
||||||
|
import {queryParsers} from '../../utils';
|
||||||
|
import {ModalType} from '../../enums';
|
||||||
|
import CreateTaskModal from '../create-task-modal';
|
||||||
|
|
||||||
const useStyles = makeStyles(() =>
|
const useStyles = makeStyles(() =>
|
||||||
createStyles({
|
createStyles({
|
||||||
@ -28,6 +31,8 @@ const useStyles = makeStyles(() =>
|
|||||||
const Page: React.FC = () => {
|
const Page: React.FC = () => {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
const trigger = useScrollTrigger();
|
const trigger = useScrollTrigger();
|
||||||
|
const {modal} = useQuery(queryParsers);
|
||||||
|
const isOpenCreateTaskModal = useMemo(() => modal === ModalType.CreateTask, [modal]);
|
||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<div className={classes.container}>
|
<div className={classes.container}>
|
||||||
@ -49,6 +54,7 @@ const Page: React.FC = () => {
|
|||||||
</Container>
|
</Container>
|
||||||
<BothMenu trigger={trigger} />
|
<BothMenu trigger={trigger} />
|
||||||
</div>
|
</div>
|
||||||
|
<CreateTaskModal isOpen={isOpenCreateTaskModal} />
|
||||||
</Fragment>
|
</Fragment>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -104,8 +104,9 @@ const TopMenu: React.FC<Props> = ({trigger}) => {
|
|||||||
<IconButton
|
<IconButton
|
||||||
edge="start"
|
edge="start"
|
||||||
color="inherit"
|
color="inherit"
|
||||||
|
onClick={handleToggleSearch}
|
||||||
>
|
>
|
||||||
<SearchIcon onClick={handleToggleSearch} />
|
<SearchIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,13 @@ export const LABELS = {
|
|||||||
ADD_TASK: 'Добавить задачу',
|
ADD_TASK: 'Добавить задачу',
|
||||||
ADD_FOLDER: 'Добавить папку',
|
ADD_FOLDER: 'Добавить папку',
|
||||||
ADD_TAG: 'Добавить тег',
|
ADD_TAG: 'Добавить тег',
|
||||||
|
CREATE_TASK: 'Создание задачи',
|
||||||
|
CREATE: 'Создать',
|
||||||
|
CANCEL: 'Отмена',
|
||||||
|
TITLE: 'Заголовок',
|
||||||
|
DESCRIPTION: 'Описание',
|
||||||
|
START_AT: 'Начало',
|
||||||
|
END_AT: 'Окончание',
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const BOTH_MENU_LINKS = [
|
export const BOTH_MENU_LINKS = [
|
||||||
|
|||||||
3
src/app/enums.ts
Normal file
3
src/app/enums.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export enum ModalType {
|
||||||
|
CreateTask = 'createTask',
|
||||||
|
}
|
||||||
5
src/app/types.ts
Normal file
5
src/app/types.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import {ModalType} from './enums';
|
||||||
|
|
||||||
|
export type QueryParams = {
|
||||||
|
modal?: ModalType;
|
||||||
|
};
|
||||||
7
src/app/utils.ts
Normal file
7
src/app/utils.ts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import {QueryParsers} from '_utils/getQueryFromUrl';
|
||||||
|
import {stringParser} from '_utils/queryParsers';
|
||||||
|
import {QueryParams} from './types';
|
||||||
|
|
||||||
|
export const queryParsers: QueryParsers<QueryParams> = {
|
||||||
|
modal: stringParser(),
|
||||||
|
};
|
||||||
@ -21,3 +21,5 @@ export const PAGE_TITLE = {
|
|||||||
[PageType.Settings]: 'Settings',
|
[PageType.Settings]: 'Settings',
|
||||||
[PageType.SigIn]: 'SigIn',
|
[PageType.SigIn]: 'SigIn',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const VIEW_DATE_TIME = 'yyyy-MM-dd\'T\'HH:mm';
|
||||||
|
|||||||
Reference in New Issue
Block a user