Dialog.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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 = false,
  23. onClose,
  24. onSubmit,
  25. onReset,
  26. onCancel,
  27. handleConditions = {},
  28. conditions: flatConditions = [],
  29. isLegal = false,
  30. expression: filterExpression = '',
  31. title = 'Advanced Filter',
  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 shouldSowPlaceholder: boolean = !isLegal || !filterExpression;
  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. <div
  67. className={`${classes.expResult} ${
  68. shouldSowPlaceholder && 'disable-exp'
  69. }`}
  70. >
  71. {`${shouldSowPlaceholder ? 'Filter Expression' : filterExpression}`}
  72. {!shouldSowPlaceholder && (
  73. <CopyBtn label="copy expression" value={filterExpression} />
  74. )}
  75. </div>
  76. <DialogContent>
  77. <div className={classes.expWrapper}>
  78. <ConditionGroup
  79. fields={fields}
  80. handleConditions={handleConditions}
  81. conditions={flatConditions}
  82. />
  83. </div>
  84. </DialogContent>
  85. <DialogActions className={classes.dialogActions}>
  86. <Button
  87. onClick={onReset}
  88. color="primary"
  89. className={classes.resetBtn}
  90. size="small"
  91. >
  92. <CachedIcon />
  93. Reset
  94. </Button>
  95. <div>
  96. <Button
  97. autoFocus
  98. onClick={onCancel}
  99. color="primary"
  100. className={classes.cancelBtn}
  101. >
  102. Cancel
  103. </Button>
  104. <Button
  105. onClick={onSubmit}
  106. variant="contained"
  107. color="primary"
  108. className={classes.applyBtn}
  109. disabled={!isLegal}
  110. >
  111. Apply Filters
  112. </Button>
  113. </div>
  114. </DialogActions>
  115. </Dialog>
  116. {/* <DialogTemplate
  117. title={title}
  118. handleClose={onClose}
  119. showCloseIcon
  120. handleConfirm={onSubmit}
  121. confirmLabel="Apply Filters"
  122. confirmDisabled={!isLegal}
  123. handleCancel={onCancel}
  124. cancelLabel="Cancel"
  125. leftActions={
  126. <Button
  127. onClick={onReset}
  128. color="primary"
  129. className={classes.resetBtn}
  130. size="small"
  131. >
  132. <CachedIcon />
  133. Reset
  134. </Button>
  135. }
  136. >
  137. <div
  138. className={`${classes.expResult} ${
  139. !isLegal && 'disable-exp'
  140. } testcopy`}
  141. >
  142. {`${isLegal ? filterExpression : 'Filter Expression'}`}
  143. {isLegal && (
  144. <CopyBtn label="copy expression" value={filterExpression} />
  145. )}
  146. </div>
  147. <div className={classes.expWrapper}>
  148. <ConditionGroup
  149. fields={fields}
  150. handleConditions={handleConditions}
  151. conditions={flatConditions}
  152. />
  153. </div>
  154. </DialogTemplate> */}
  155. </>
  156. );
  157. };
  158. AdvancedDialog.displayName = 'AdvancedDialog';
  159. const useStyles = makeStyles((theme: Theme) =>
  160. createStyles({
  161. root: {},
  162. wrapper: {
  163. '& .disable-exp': {
  164. userSelect: 'none',
  165. color: '#AEAEBB',
  166. },
  167. },
  168. closeButton: {
  169. color: 'black',
  170. },
  171. dialogTitle: {
  172. display: 'flex',
  173. alignItems: 'center',
  174. justifyContent: 'space-between',
  175. },
  176. dialogActions: {
  177. justifyContent: 'space-between',
  178. },
  179. resetBtn: {},
  180. cancelBtn: {
  181. marginRight: '32px',
  182. },
  183. applyBtn: {
  184. backgroundColor: '#06AFF2',
  185. color: 'white',
  186. },
  187. copyButton: {
  188. borderRadius: '0',
  189. },
  190. expResult: {
  191. background: '#F9F9F9',
  192. borderRadius: '8px',
  193. display: 'flex',
  194. justifyContent: 'space-between',
  195. alignItems: 'center',
  196. minHeight: '40px',
  197. margin: '8px 32px',
  198. padding: '0 16px',
  199. fontStyle: 'normal',
  200. fontWeight: 'normal',
  201. fontSize: '16px',
  202. lineHeight: '24px',
  203. },
  204. expWrapper: {
  205. background: '#F9F9F9',
  206. borderRadius: '8px',
  207. minWidth: '480px',
  208. minHeight: '104px',
  209. padding: '12px',
  210. },
  211. })
  212. );
  213. export default AdvancedDialog;