Skip to content

Commit b37f3d6

Browse files
authored
Merge pull request #557 from captain-Akshay/master
feat(button): action button
2 parents 48c997d + 32f988e commit b37f3d6

File tree

10 files changed

+136
-9
lines changed

10 files changed

+136
-9
lines changed

src/base/Grow/Grow.tsx

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { Grow as MuiGrow, GrowProps as MuiGrowProps } from '@mui/material';
2+
3+
export function Grow(props: MuiGrowProps): JSX.Element {
4+
return <MuiGrow {...props} />;
5+
}

src/base/Grow/index.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { Grow } from './Grow';

src/base/index.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export * from './FormControl';
3131
export * from './FormControlLabel';
3232
export * from './FormGroup';
3333
export * from './Grid';
34+
export * from './Grow';
3435
export * from './IconButton';
3536
export * from './Input';
3637
export * from './InputLabel';
+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import * as React from 'react';
2+
import {
3+
Button,
4+
ButtonGroup,
5+
ClickAwayListener,
6+
MenuItem,
7+
MenuList,
8+
Paper,
9+
Popper
10+
} from '../../base';
11+
import { DropDownIcon } from '../../icons';
12+
interface Option {
13+
icon: React.ReactNode;
14+
label: string;
15+
onClick: (event: React.MouseEvent<HTMLLIElement, MouseEvent>, index: number) => void;
16+
}
17+
18+
interface ActionButtonProps {
19+
defaultActionClick: () => void;
20+
options: Option[];
21+
label: string;
22+
}
23+
24+
export default function ActionButton({
25+
defaultActionClick,
26+
options,
27+
label
28+
}: ActionButtonProps): JSX.Element {
29+
const [open, setOpen] = React.useState(false);
30+
const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);
31+
const handleMenuItemClick = () => {
32+
setOpen(false);
33+
};
34+
35+
const handleToggle = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
36+
event.stopPropagation();
37+
setAnchorEl(event.currentTarget);
38+
setOpen((prevOpen) => !prevOpen);
39+
};
40+
41+
const handleClose = () => {
42+
setAnchorEl(null);
43+
setOpen(false);
44+
};
45+
46+
return (
47+
<React.Fragment>
48+
<ButtonGroup
49+
variant="contained"
50+
style={{ boxShadow: 'none' }}
51+
aria-label="Button group with a nested menu"
52+
>
53+
<Button onClick={defaultActionClick} variant="contained">
54+
{label}
55+
</Button>
56+
<Button size="small" onClick={handleToggle} variant="contained">
57+
<DropDownIcon />
58+
</Button>
59+
</ButtonGroup>
60+
<Popper
61+
sx={{
62+
zIndex: 1
63+
}}
64+
open={open}
65+
anchorEl={anchorEl}
66+
role={undefined}
67+
>
68+
<Paper>
69+
<ClickAwayListener onClickAway={handleClose}>
70+
<MenuList id="split-button-menu" autoFocusItem>
71+
{options.map((option, index) => (
72+
<MenuItem
73+
key={index}
74+
onClick={(event) => {
75+
handleMenuItemClick();
76+
option.onClick(event, index);
77+
}}
78+
>
79+
<div style={{ marginRight: '1rem' }}>{option.icon}</div>
80+
{option.label}
81+
</MenuItem>
82+
))}
83+
</MenuList>
84+
</ClickAwayListener>
85+
</Paper>
86+
</Popper>
87+
</React.Fragment>
88+
);
89+
}

src/custom/ActionButton/index.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import ActionButton from './ActionButton';
2+
3+
export { ActionButton };

src/custom/Feedback/FeedbackButton.tsx

+10-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Typography from '@mui/material/Typography';
2-
import React, { CSSProperties, useRef, useState } from 'react';
2+
import React, { CSSProperties, useState } from 'react';
33
import {
44
CalenderIcon,
55
CloseIcon,
@@ -107,21 +107,23 @@ interface FeedbackComponentProps {
107107
| 'right-top'
108108
| 'right-middle'
109109
| 'right-bottom';
110+
defaultMessage?: string;
111+
defaultOpen?: boolean;
110112
}
111113

112114
const FeedbackComponent: React.FC<FeedbackComponentProps> = ({
113115
onSubmit,
114116
containerStyles,
115117
feedbackOptionStyles,
116-
renderPosition
118+
renderPosition,
119+
defaultMessage = undefined,
120+
defaultOpen = false
117121
}) => {
118-
const [isOpen, setIsOpen] = useState<boolean>(false);
122+
const [isOpen, setIsOpen] = useState<boolean>(defaultOpen);
119123
const [submitted, setSubmitted] = useState<boolean>(false);
120-
const [category, setCategory] = useState<FeedbackDataItem | undefined>();
121-
const [messageValue, setMessageValue] = useState<string | undefined>();
122-
const feedbackTextRef = useRef<HTMLTextAreaElement>(null);
123-
const [isChecked, setIsChecked] = useState<boolean>(false);
124-
124+
const [category, setCategory] = useState<FeedbackDataItem | undefined>(feedbackData[0]);
125+
const [messageValue, setMessageValue] = useState<string | undefined>(defaultMessage);
126+
const [isChecked, setIsChecked] = useState<boolean>(!!defaultMessage);
125127
const handleCheckboxChange = (event: React.ChangeEvent<HTMLInputElement>) => {
126128
setIsChecked(event.target.checked);
127129
};
@@ -229,7 +231,6 @@ const FeedbackComponent: React.FC<FeedbackComponentProps> = ({
229231
onChange={(e) => {
230232
setMessageValue(e.target.value);
231233
}}
232-
ref={feedbackTextRef}
233234
required
234235
placeholder={category.placeholder}
235236
rows={5}

src/custom/index.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ActionButton } from './ActionButton';
12
import CatalogFilter, { CatalogFilterProps } from './CatalogFilter/CatalogFilter';
23
import { ConnectionChip } from './ConnectionChip';
34
import {
@@ -34,6 +35,7 @@ import UniversalFilter, { UniversalFilterProps } from './UniversalFilter';
3435
export { StyledChartDialog } from './ChartDialog';
3536
export { StyledSearchBar } from './StyledSearchBar';
3637
export {
38+
ActionButton,
3739
CatalogFilter,
3840
ConnectionChip,
3941
CustomColumnVisibilityControl,
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { DEFAULT_HEIGHT, DEFAULT_WIDTH } from '../../constants/constants';
2+
import { IconProps } from '../types';
3+
4+
export const DropDownIcon = ({
5+
width = DEFAULT_WIDTH,
6+
height = DEFAULT_HEIGHT,
7+
...props
8+
}: IconProps): JSX.Element => {
9+
return (
10+
<svg
11+
xmlns="http://www.w3.org/2000/svg"
12+
viewBox="-6.5 0 32 32"
13+
width={width}
14+
height={height}
15+
fill={props.fill || 'currentColor'}
16+
{...props}
17+
>
18+
<path d="M18.813 11.406l-7.906 9.906c-0.75 0.906-1.906 0.906-2.625 0l-7.906-9.906c-0.75-0.938-0.375-1.656 0.781-1.656h16.875c1.188 0 1.531 0.719 0.781 1.656z"></path>
19+
</svg>
20+
);
21+
};
22+
23+
export default DropDownIcon;

src/icons/DropDownIcon/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default as DropDownIcon } from './DropDownIcon';

src/icons/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export * from './Delete';
2222
export * from './Deploy';
2323
export * from './Designer';
2424
export * from './Detail';
25+
export * from './DropDownIcon';
2526
export * from './Error';
2627
export * from './Favorite';
2728
export * from './Filter';

0 commit comments

Comments
 (0)