Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 17 additions & 6 deletions src/components/TableMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,45 +23,50 @@ interface TableMenuProps {
placement: Placement;
}

export const TableMenu = (props: TableMenuProps) => {
export const TableMenu = (props: TableMenuProps): JSX.Element => {
const { remove: handleRemove } = props;
const [dialog, setDialog] = useState<{
type: string;
callback: (count: number) => void;
} | null>(null);

const [count, setCount] = useState<string | undefined>('');
// Keep `count` always a string so the TextInput is controlled for the component lifetime.
const [count, setCount] = useState<string>('');

const updateCount: FormEventHandler<HTMLInputElement> = e => {
setCount(e.currentTarget.value);
};

const addRows = () => {
setDialog({ type: 'rows', callback: c => props.addRows(c) });
setCount(''); // ensure input starts controlled when dialog opens
};

const addRowAt = () => {
setDialog({ type: 'rows', callback: index => props.addRowAt(index) });
setCount('');
};

const addColumns = () => {
setDialog({
type: 'columns',
callback: c => props.addColumns(c),
});
setCount('');
};

const addColumnsAt = () => {
setDialog({ type: 'columns', callback: index => props.addColumnAt(index) });
setCount('');
};

const onConfirm = () => {
const parsedCount = parseInt(count ?? '0', 10);
const parsedCount = parseInt(count || '0', 10);

if (parsedCount < 100) {
setDialog(null);
dialog?.callback(parsedCount);
setCount(undefined);
setCount('');
}
};

Expand All @@ -71,7 +76,10 @@ export const TableMenu = (props: TableMenuProps) => {
<Dialog
header={`Add ${dialog.type}`}
id="dialog-add"
onClose={() => setDialog(null)}
onClose={() => {
setDialog(null);
setCount('');
}}
zOffset={1000}
>
<Card padding={4}>
Expand All @@ -88,7 +96,10 @@ export const TableMenu = (props: TableMenuProps) => {
<Button
text="Cancel"
mode="ghost"
onClick={() => setDialog(null)}
onClick={() => {
setDialog(null);
setCount('');
}}
/>
<Button text="Confirm" tone="critical" onClick={onConfirm} />
</Inline>
Expand Down