ToolBar.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import { FC, useMemo } from 'react';
  2. import {
  3. Grid,
  4. Typography,
  5. makeStyles,
  6. Theme,
  7. createStyles,
  8. IconButton,
  9. } from '@material-ui/core';
  10. import CustomButton from '../customButton/CustomButton';
  11. import Icons from '../icons/Icons';
  12. import { ToolBarConfig, ToolBarType } from './Types';
  13. import SearchInput from '../customInput/SearchInput';
  14. import TableSwitch from './TableSwitch';
  15. import { throwErrorForDev } from '../../utils/Common';
  16. import CustomIconButton from '../customButton/CustomIconButton';
  17. const useStyles = makeStyles((theme: Theme) =>
  18. createStyles({
  19. countLabel: {
  20. display: 'flex',
  21. alignItems: 'center',
  22. justifyContent: 'flex-end',
  23. color: theme.palette.common.black,
  24. opacity: 0.4,
  25. },
  26. btn: {
  27. // marginLeft: theme.spacing(1),
  28. marginRight: '12px',
  29. },
  30. gridEnd: {
  31. display: 'flex',
  32. justifyContent: 'flex-end',
  33. alignItems: 'center',
  34. },
  35. })
  36. );
  37. const CustomToolBar: FC<ToolBarType> = props => {
  38. const { toolbarConfigs, selected = [] } = props;
  39. const classes = useStyles();
  40. // remove hidden button
  41. const leftConfigs = useMemo(() => {
  42. return toolbarConfigs.filter(
  43. (c: ToolBarConfig) =>
  44. !c.hidden &&
  45. c.icon !== 'search' &&
  46. c.type !== 'switch' &&
  47. c.position !== 'right'
  48. );
  49. }, [toolbarConfigs]);
  50. const rightConfigs = useMemo(() => {
  51. return toolbarConfigs.filter(
  52. c => c.icon === 'search' || c.type === 'switch' || c.position === 'right'
  53. );
  54. }, [toolbarConfigs]);
  55. return (
  56. <>
  57. <Grid container>
  58. <Grid item xs={8}>
  59. {leftConfigs.map((c, i) => {
  60. const isSelect = c.type === 'select' || c.type === 'groupSelect';
  61. if (isSelect) {
  62. return c.component;
  63. }
  64. const Icon = c.icon ? Icons[c.icon!]() : '';
  65. const disabled = c.disabled ? c.disabled(selected) : false;
  66. // when disabled "disabledTooltip" will replace "tooltip"
  67. const tooltip = disabled && c.disabledTooltip ? c.disabledTooltip : c.tooltip;
  68. const isIcon = c.type === 'iconBtn';
  69. const btn = (
  70. <CustomButton
  71. key={i}
  72. size="small"
  73. onClick={c.onClick}
  74. startIcon={Icon}
  75. color="primary"
  76. disabled={disabled}
  77. // use contained variant as default
  78. variant={c.btnVariant || 'contained'}
  79. tooltip={tooltip}
  80. className={classes.btn}
  81. >
  82. <Typography variant="button">{c.label}</Typography>
  83. </CustomButton>
  84. );
  85. const iconBtn = (
  86. <CustomIconButton
  87. key={i}
  88. onClick={c.onClick}
  89. tooltip={tooltip}
  90. disabled={disabled}
  91. >
  92. {Icon}
  93. </CustomIconButton>
  94. );
  95. return isIcon ? iconBtn : btn;
  96. })}
  97. </Grid>
  98. {rightConfigs.length > 0 && (
  99. <Grid className={classes.gridEnd} item xs={4}>
  100. {rightConfigs.map((c, i) => {
  101. if (c.icon === 'search') {
  102. if (!c.onSearch) {
  103. return throwErrorForDev(
  104. `if icon is search onSearch event handler is required`
  105. );
  106. }
  107. return (
  108. <SearchInput
  109. onClear={c.onClear}
  110. onSearch={c.onSearch}
  111. searchText={c.searchText}
  112. placeholder={c.placeholder}
  113. key={i}
  114. />
  115. );
  116. }
  117. switch (c.type) {
  118. case 'switch':
  119. if (!c.onAppClick || !c.onListClick) {
  120. return throwErrorForDev(
  121. `if type is switch need onAppClick onListClick event handler`
  122. );
  123. }
  124. return (
  125. <TableSwitch
  126. onAppClick={c.onAppClick}
  127. onListClick={c.onListClick}
  128. key={i}
  129. />
  130. );
  131. case 'select':
  132. case 'groupSelect':
  133. if (!c.component) {
  134. return throwErrorForDev(`component prop is required`);
  135. }
  136. return c.component;
  137. default:
  138. const Icon = c.icon ? Icons[c.icon]() : '';
  139. return Icon ? (
  140. <IconButton onClick={c.onClick} key={i}>
  141. {Icon}
  142. </IconButton>
  143. ) : (
  144. <div key={i}>Need Icon</div>
  145. );
  146. }
  147. })}
  148. </Grid>
  149. )}
  150. </Grid>
  151. </>
  152. );
  153. };
  154. export default CustomToolBar;