Dialog.tsx 5.8 KB

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