Advertisement
genkid2020

Untitled

Aug 20th, 2020
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.47 KB | None | 0 0
  1. import React, { useState, useEffect } from 'react';
  2. import history from '@history';
  3. import { makeStyles, createMuiTheme, MuiThemeProvider } from '@material-ui/core/styles';
  4. import { useSelector } from 'react-redux';
  5. import MUIDataTable from 'mui-datatables';
  6. import FuseLoading from '@fuse/core/FuseLoading';
  7. import TextField from '@material-ui/core/TextField';
  8. import Paper from '@material-ui/core/Paper';
  9. import EditIcon from '@material-ui/icons/Edit';
  10. import DeleteIcon from '@material-ui/icons/Delete';
  11. import Dialog from '@material-ui/core/Dialog';
  12. import DialogActions from '@material-ui/core/DialogActions';
  13. import IconButton from '@material-ui/core/IconButton';
  14. import CloseIcon from '@material-ui/icons/Close';
  15. import DialogTitle from '@material-ui/core/DialogTitle';
  16. import store from 'app/store';
  17. import Button from '@material-ui/core/Button';
  18. import { openDialog, closeDialog, setToolbarTitle } from 'app/store/actions';
  19. import { useForm } from '@fuse/hooks';
  20. import * as Actions from '../store/actions';
  21.  
  22. const useStyles = makeStyles(theme => ({
  23. addButton: {
  24. position: 'absolute',
  25. top: '15px',
  26. right: '270px',
  27. width: '112px',
  28. fontSize: '14px',
  29. fontWeight: 'normal',
  30. [theme.breakpoints.down('xs')]: {
  31. position: 'static'
  32. }
  33. },
  34. closeButton: {
  35. position: 'absolute',
  36. right: theme.spacing(1),
  37. top: theme.spacing(1),
  38. color: theme.palette.grey[500]
  39. },
  40. dialogContent: {
  41. padding: '16px',
  42. width: '350px',
  43. [theme.breakpoints.down('xs')]: {
  44. width: '100%'
  45. }
  46. }
  47. }));
  48.  
  49. function TableActions(props) {
  50. const { protosList, index, deleteProto, openEditModal } = props;
  51.  
  52. return (
  53. <div>
  54. <EditIcon className="text-black" />
  55. <DeleteIcon
  56. className="md:ml-32 ml-12 text-black"
  57. onClick={e => {
  58. e.stopPropagation();
  59. store.dispatch(
  60. openDialog({
  61. children: (
  62. <>
  63. <DialogTitle id="alert-dialog-title">
  64. {`Подтвердите удаление бизнес-процесса ${protosList[index].name}?`}
  65. </DialogTitle>
  66.  
  67. <DialogActions>
  68. <Button onClick={() => store.dispatch(closeDialog())} color="primary">
  69. Отмена
  70. </Button>
  71. <Button
  72. onClick={() => deleteProto(protosList[index].id)}
  73. color="primary"
  74. autoFocus
  75. >
  76. Удалить
  77. </Button>
  78. </DialogActions>
  79. </>
  80. )
  81. })
  82. );
  83. }}
  84. />
  85. </div>
  86. );
  87. }
  88.  
  89. function ProjectsProtos(props) {
  90. const [isAddModalOpen, setIsAddModalOpen] = useState(false);
  91. const [isEditModalOpen, setIsEditModalOpen] = useState(false);
  92.  
  93. const classes = useStyles();
  94.  
  95. useEffect(() => {
  96. store.dispatch(Actions.getProjectsProtos());
  97. store.dispatch(setToolbarTitle('Бизнес-процессы'));
  98. }, []);
  99.  
  100. const protosList = useSelector(({ settings }) => settings.projectProto.projectProtos);
  101. const isProjectProtosPending = useSelector(({ settings }) => settings.projectProto.isProjectProtosPending);
  102. const isProjectProtoPending = useSelector(({ settings }) => settings.projectProto.isProjectProtoPending);
  103. const isDataPending = isProjectProtosPending || isProjectProtoPending;
  104. const protosList1 = useSelector(({ settings }) => settings.projectProto.proto);
  105. const { form, handleChange, resetForm, setForm } = useForm({
  106. name: ''
  107. });
  108.  
  109. const openEditModal = index => {
  110. setForm(protosList[index]);
  111. setIsEditModalOpen(true);
  112. };
  113.  
  114. const closeEditModal = () => {
  115. resetForm();
  116. setIsEditModalOpen(false);
  117. };
  118.  
  119. const openAddModal = () => {
  120. resetForm();
  121. setIsAddModalOpen(true);
  122. };
  123.  
  124. const closeAddModal = () => {
  125. resetForm();
  126. setIsAddModalOpen(false);
  127. };
  128.  
  129. const createProto = () => {
  130. const proto = {
  131. name: form.name
  132. };
  133. store.dispatch(Actions.addProjectProto(proto));
  134. closeAddModal();
  135. };
  136.  
  137. const deleteProto = id => {
  138. store.dispatch(Actions.deleteProjectProto(id));
  139. store.dispatch(closeDialog());
  140. };
  141.  
  142. const updateProto = () => {
  143. const proto = {
  144. name: form.name
  145. };
  146.  
  147. store.dispatch(Actions.updateProjectProto(form.id, proto));
  148. closeEditModal();
  149. resetForm();
  150. };
  151.  
  152. const columns = [
  153. {
  154. name: '№',
  155. label: '',
  156. viewColumns: false,
  157. options: {
  158. filter: false,
  159. sort: false,
  160. customBodyRenderLite: dataIndex => {
  161. return <span>{dataIndex + 1}</span>;
  162. },
  163. setCellHeaderProps: value => {
  164. return {
  165. style: {
  166. width: '150px'
  167. }
  168. };
  169. }
  170. }
  171. },
  172. {
  173. name: 'name',
  174. label: 'Название',
  175. options: {
  176. filter: true,
  177. sort: false
  178. }
  179. },
  180.  
  181. {
  182. name: 'actions',
  183. label: 'Действия',
  184. options: {
  185. filter: false,
  186. sort: false,
  187. customBodyRenderLite: dataIndex => {
  188. return (
  189. <TableActions
  190. index={dataIndex}
  191. protosList={protosList}
  192. openEditModal={openEditModal}
  193. closeEditModal={closeEditModal}
  194. deleteProto={deleteProto}
  195. />
  196. );
  197. },
  198. setCellHeaderProps: value => {
  199. return {
  200. style: {
  201. width: '150px'
  202. }
  203. };
  204. }
  205. }
  206. }
  207. ];
  208. const options = {
  209. filter: true,
  210. filterType: 'dropdown',
  211. responsive: 'scroll',
  212. tableBodyHeight: '100%',
  213. tableBodyMaxHeight: '100%',
  214. fixedSelectColumn: false,
  215. selectableRows: 'none',
  216. customToolbar: propsA => {
  217. return (
  218. <Button variant="contained" color="primary" className={classes.addButton} onClick={openAddModal}>
  219. Добавить
  220. </Button>
  221. );
  222. },
  223.  
  224. onRowClick: (rowIndex, rowMeta) => history.push(`/settings/projectproto/${protosList[rowMeta.dataIndex].id}`),
  225.  
  226. textLabels: {
  227. body: {
  228. noMatch: 'Данных нет',
  229. toolTip: 'Sort',
  230. columnHeaderTooltip: column => `Sort for ${column.label}`
  231. },
  232. pagination: {
  233. next: 'Следующая страница',
  234. previous: 'Предыдущая страница',
  235. rowsPerPage: 'Записей на странице:',
  236. displayRows: 'из'
  237. },
  238. toolbar: {
  239. search: 'Поиск',
  240. downloadCsv: 'Загрузить в облако',
  241. print: 'Печать',
  242. viewColumns: 'Посмотреть столбцы',
  243. filterTable: 'Фильтрация'
  244. },
  245. filter: {
  246. all: 'Все',
  247. title: 'ФИЛЬТРЫ',
  248. reset: 'Сбросить'
  249. },
  250. viewColumns: {
  251. title: 'Показать столбцы',
  252. titleAria: 'Show/Hide Table Columns'
  253. },
  254. selectedRows: {
  255. text: 'row(s) selected',
  256. delete: 'Delete',
  257. deleteAria: 'Delete Selected Rows'
  258. }
  259. }
  260. };
  261.  
  262. return isDataPending ? (
  263. <FuseLoading />
  264. ) : (
  265. <>
  266. <Paper className="md:m-32 m-12">
  267. <MuiThemeProvider
  268. theme={theme =>
  269. createMuiTheme({
  270. ...theme,
  271. overrides: {
  272. MUIDataTableToolbar: {
  273. root: {
  274. color: theme.palette.secondary.main
  275. }
  276. },
  277. MUIDataTableHeadCell: {
  278. root: {
  279. color: theme.palette.secondary.main
  280. }
  281. },
  282. MUIDataTableBodyCell: {
  283. root: {
  284. color: theme.palette.secondary.main
  285. }
  286. },
  287. MUIDataTableFilter: {
  288. title: {
  289. color: theme.palette.secondary.main,
  290. fontWeight: 'bold'
  291. },
  292. resetLink: {
  293. color: theme.palette.primary.main,
  294. fontWeight: 'normal'
  295. }
  296. }
  297. }
  298. })
  299. }
  300. >
  301. <MUIDataTable
  302. title="Список бизнес-процессов"
  303. data={protosList}
  304. columns={columns}
  305. options={options}
  306. />
  307. </MuiThemeProvider>
  308. <Dialog open={isEditModalOpen} onClose={closeEditModal} aria-labelledby="form-dialog-title">
  309. <IconButton aria-label="close" className={classes.closeButton} onClick={closeEditModal}>
  310. <CloseIcon />
  311. </IconButton>
  312. <DialogTitle id="alert-dialog-title">Редактирование бизнес-процесса</DialogTitle>
  313. <div className={classes.dialogContent}>
  314. <TextField
  315. className="mb-16"
  316. label="Название"
  317. autoFocus
  318. type="text"
  319. name="name"
  320. value={form.name}
  321. onChange={handleChange}
  322. variant="outlined"
  323. required
  324. fullWidth
  325. />
  326. </div>
  327. <DialogActions>
  328. <Button onClick={closeEditModal} color="primary">
  329. Отмена
  330. </Button>
  331. <Button onClick={updateProto} color="primary" autoFocus>
  332. Сохранить
  333. </Button>
  334. </DialogActions>
  335. </Dialog>
  336. <Dialog open={isAddModalOpen} onClose={closeAddModal} aria-labelledby="form-dialog-title">
  337. <IconButton aria-label="close" className={classes.closeButton} onClick={closeAddModal}>
  338. <CloseIcon />
  339. </IconButton>
  340. <DialogTitle id="alert-dialog-title">Новый бизнес-процесс</DialogTitle>
  341. <div className={classes.dialogContent}>
  342. <TextField
  343. className="mb-16"
  344. label="Название"
  345. autoFocus
  346. type="text"
  347. name="name"
  348. value={form.name}
  349. onChange={handleChange}
  350. variant="outlined"
  351. required
  352. fullWidth
  353. />
  354. </div>
  355. <DialogActions>
  356. <Button onClick={closeAddModal} color="primary">
  357. Отмена
  358. </Button>
  359. <Button disabled={form.name === ''} onClick={createProto} color="primary" autoFocus>
  360. Сохранить
  361. </Button>
  362. </DialogActions>
  363. </Dialog>
  364. </Paper>
  365. </>
  366. );
  367. }
  368.  
  369. export default ProjectsProtos;
  370.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement