Dialog.tsx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. import React, { useEffect } from 'react';
  2. import {
  3. makeStyles,
  4. Theme,
  5. createStyles,
  6. Typography,
  7. Button,
  8. IconButton,
  9. Dialog,
  10. DialogActions,
  11. DialogContent,
  12. DialogTitle,
  13. } from '@material-ui/core';
  14. import CloseIcon from '@material-ui/icons/Close';
  15. import CachedIcon from '@material-ui/icons/Cached';
  16. import ConditionGroup from './ConditionGroup';
  17. import CopyBtn from './CopyButton';
  18. import DialogTemplate from '../customDialog/DialogTemplate';
  19. import { DialogProps } from './Types';
  20. const AdvancedDialog = (props: DialogProps) => {
  21. const {
  22. open,
  23. onClose,
  24. onSubmit,
  25. onReset,
  26. onCancel,
  27. handleConditions,
  28. conditions: flatConditions,
  29. isLegal,
  30. expression: filterExpression,
  31. title,
  32. fields,
  33. ...others
  34. } = props;
  35. const { addCondition } = handleConditions;
  36. const classes = useStyles();
  37. useEffect(() => {
  38. flatConditions.length === 0 && addCondition();
  39. // Only need add one condition after dialog's first mount.
  40. // eslint-disable-next-line react-hooks/exhaustive-deps
  41. }, []);
  42. // const childRef: any = useRef();
  43. return (
  44. <>
  45. {/* <Dialog
  46. onClose={onClose}
  47. aria-labelledby="customized-dialog-title"
  48. open={open}
  49. maxWidth="xl"
  50. className={classes.wrapper}
  51. {...others}
  52. >
  53. <DialogTitle className={classes.dialogTitle} disableTypography>
  54. <Typography variant="h5" component="h2">
  55. {title}
  56. </Typography>
  57. <IconButton
  58. aria-label="close"
  59. className={classes.closeButton}
  60. onClick={onCancel}
  61. size="small"
  62. >
  63. <CloseIcon />
  64. </IconButton>
  65. </DialogTitle>
  66. <DialogContent>
  67. <div
  68. className={`${classes.expResult} ${
  69. !isLegal && 'disable-exp'
  70. } testcopy`}
  71. >
  72. {`${isLegal ? filterExpression : 'Filter Expression'}`}
  73. {isLegal && (
  74. <CopyBtn label="copy expression" value={filterExpression} />
  75. )}
  76. </div>
  77. <div className={classes.expWrapper}>
  78. <ConditionGroup
  79. // ref={childRef}
  80. fields={fields}
  81. handleConditions={handleConditions}
  82. conditions={flatConditions}
  83. />
  84. </div>
  85. </DialogContent>
  86. <DialogActions className={classes.dialogActions}>
  87. <Button
  88. onClick={onReset}
  89. color="primary"
  90. className={classes.resetBtn}
  91. size="small"
  92. >
  93. <CachedIcon />
  94. Reset
  95. </Button>
  96. <div>
  97. <Button
  98. autoFocus
  99. onClick={onCancel}
  100. color="primary"
  101. className={classes.cancelBtn}
  102. >
  103. Cancel
  104. </Button>
  105. <Button
  106. onClick={onSubmit}
  107. variant="contained"
  108. color="primary"
  109. className={classes.applyBtn}
  110. disabled={!isLegal}
  111. >
  112. Apply Filters
  113. </Button>
  114. </div>
  115. </DialogActions>
  116. </Dialog> */}
  117. <DialogTemplate
  118. title={title}
  119. handleClose={onClose}
  120. showCloseIcon
  121. handleConfirm={onSubmit}
  122. confirmLabel="Apply Filters"
  123. confirmDisabled={!isLegal}
  124. handleCancel={onCancel}
  125. cancelLabel="Cancel"
  126. leftActions={
  127. <Button
  128. onClick={onReset}
  129. color="primary"
  130. className={classes.resetBtn}
  131. size="small"
  132. >
  133. <CachedIcon />
  134. Reset
  135. </Button>
  136. }
  137. >
  138. <div
  139. className={`${classes.expResult} ${
  140. !isLegal && 'disable-exp'
  141. } testcopy`}
  142. >
  143. {`${isLegal ? filterExpression : 'Filter Expression'}`}
  144. {isLegal && (
  145. <CopyBtn label="copy expression" value={filterExpression} />
  146. )}
  147. </div>
  148. <div className={classes.expWrapper}>
  149. <ConditionGroup
  150. // ref={childRef}
  151. fields={fields}
  152. handleConditions={handleConditions}
  153. conditions={flatConditions}
  154. />
  155. </div>
  156. </DialogTemplate>
  157. </>
  158. );
  159. };
  160. AdvancedDialog.defaultProps = {
  161. open: false,
  162. onClose: () => {},
  163. onSubmit: () => {},
  164. title: 'Advanced Filter',
  165. fields: [],
  166. onReset: () => {},
  167. onCancel: () => {},
  168. handleConditions: {},
  169. conditions: [],
  170. isLegal: false,
  171. expression: '',
  172. };
  173. AdvancedDialog.displayName = 'AdvancedDialog';
  174. const useStyles = makeStyles((theme: Theme) =>
  175. createStyles({
  176. root: {},
  177. wrapper: {
  178. '& .disable-exp': {
  179. userSelect: 'none',
  180. color: '#AEAEBB',
  181. },
  182. },
  183. closeButton: {
  184. color: 'black',
  185. },
  186. dialogTitle: {
  187. display: 'flex',
  188. alignItems: 'center',
  189. justifyContent: 'space-between',
  190. },
  191. dialogActions: {
  192. justifyContent: 'space-between',
  193. },
  194. resetBtn: {},
  195. cancelBtn: {
  196. marginRight: '32px',
  197. },
  198. applyBtn: {
  199. backgroundColor: '#06AFF2',
  200. color: 'white',
  201. },
  202. copyButton: {
  203. borderRadius: '0',
  204. },
  205. expResult: {
  206. background: '#F9F9F9',
  207. borderRadius: '8px',
  208. display: 'flex',
  209. justifyContent: 'space-between',
  210. alignItems: 'center',
  211. minHeight: '40px',
  212. marginBottom: '16px',
  213. padding: '0 16px',
  214. fontFamily: 'Source Code Pro',
  215. fontStyle: 'normal',
  216. fontWeight: 'normal',
  217. fontSize: '16px',
  218. lineHeight: '24px',
  219. },
  220. expWrapper: {
  221. background: '#F9F9F9',
  222. borderRadius: '8px',
  223. minWidth: '480px',
  224. minHeight: '104px',
  225. padding: '12px',
  226. },
  227. })
  228. );
  229. export default AdvancedDialog;