diff --git a/packages/lsd-react/src/components/Table/Table.stories.tsx b/packages/lsd-react/src/components/Table/Table.stories.tsx index 867c020..ba20649 100644 --- a/packages/lsd-react/src/components/Table/Table.stories.tsx +++ b/packages/lsd-react/src/components/Table/Table.stories.tsx @@ -27,18 +27,16 @@ export default { }, } as Meta -const content = ( - - Content 1 - Content 2 - Content 3 - Content 4 - Content 5 - Content 6 - Content 7 - Content 8 - -) +const itemContentArray = [ + 'Content 1', + 'Content 2', + 'Content 3', + 'Content 4', + 'Content 5', + 'Content 6', + 'Content 7', + 'Content 8', +] const header = (
({ export const Root: Story = ({ type, pages, ...args }) => { const [rows, setRows] = useState(1) const [footerContent, setFooterContent] = useState('Footer content goes here') - + const [allChecked, setAllChecked] = useState(false) + const [rowsChecked, setRowsChecked] = useState(Array(rows).fill(false)) const onPageChange = (page: number) => { setFooterContent(`Page ${page} of ${pages}`) } + const handleHeaderCheckboxChange = () => { + const newAllChecked = !allChecked + setAllChecked(newAllChecked) + // Update all rows based on the header checkbox. + setRowsChecked(Array(rows).fill(newAllChecked)) + } + + const handleRowCheckboxChange = (index: number) => { + const updatedRowsChecked = [...rowsChecked] + updatedRowsChecked[index] = !updatedRowsChecked[index] + setRowsChecked(updatedRowsChecked) + + // Check if all rows are selected or if any row is unchecked + if (updatedRowsChecked.every((val) => val)) { + setAllChecked(true) + } else { + setAllChecked(false) + } + } + const toolbar = ( <>
= ({ type, pages, ...args }) => { {...args} onPageChange={onPageChange} > - - {headerOptions.map((item) => ( - {item.name} + + {headerOptions.map((item, index) => ( + {item.name} ))} {Array(rows) .fill(true) - .map(() => content)} + .map((row, rowIndex) => ( + handleRowCheckboxChange(rowIndex)} + key={rowIndex} + > + {itemContentArray.map((itemContent, itemIndex) => ( + + {itemContent} + + ))} + + ))}
) diff --git a/packages/lsd-react/src/components/TableFooter/TableFooter.tsx b/packages/lsd-react/src/components/TableFooter/TableFooter.tsx index e95fa53..e5f79f8 100644 --- a/packages/lsd-react/src/components/TableFooter/TableFooter.tsx +++ b/packages/lsd-react/src/components/TableFooter/TableFooter.tsx @@ -81,7 +81,7 @@ export const TableFooter: React.FC & { size={size} onClick={() => dispatch({ type: 'DECREMENT_PAGE' })} > - + & { size={size} onClick={() => dispatch({ type: 'INCREMENT_PAGE' })} > - +
)} diff --git a/packages/lsd-react/src/components/TableRow/TableRow.tsx b/packages/lsd-react/src/components/TableRow/TableRow.tsx index e79ee9c..b714c2b 100644 --- a/packages/lsd-react/src/components/TableRow/TableRow.tsx +++ b/packages/lsd-react/src/components/TableRow/TableRow.tsx @@ -15,6 +15,9 @@ export type TableRowProps = CommonProps & React.HTMLAttributes & { size?: 'large' | 'medium' | 'small' type?: 'default' | 'checkbox' | 'radio' + onSelectChange?: (rowId?: string) => void + rowId?: string + checked?: boolean } export const TableRow: React.FC & { @@ -23,12 +26,31 @@ export const TableRow: React.FC & { size: _size = 'large', type: _type = 'default', children, + onSelectChange, + rowId, + checked: isCheckedProp, ...props }) => { const commonProps = useCommonProps(props) const table = useTableContext() const type = table?.type ?? _type + // State for uncontrolled component behavior + const [isChecked, setIsChecked] = React.useState(false) + const isControlled = isCheckedProp !== undefined + + // Set internal state here, if the component is controlled. + if (isControlled && isCheckedProp != isChecked) setIsChecked(isCheckedProp) + + const handleCheckboxChange = () => { + if (!isControlled) { + // Only toggle the internal state if it's an uncontrolled component + setIsChecked(!isChecked) + } + + onSelectChange && onSelectChange(rowId) + } + return ( & { > {type === 'checkbox' && ( - + )} {type === 'radio' && ( - + )} {children}