mirror of
https://github.com/acid-info/lsd.git
synced 2025-02-10 07:56:25 +00:00
fix: fix header checkbox logic and other minor fixes
This commit is contained in:
parent
29e8bd3342
commit
eec1d2bfdb
@ -27,18 +27,16 @@ export default {
|
|||||||
},
|
},
|
||||||
} as Meta
|
} as Meta
|
||||||
|
|
||||||
const content = (
|
const itemContentArray = [
|
||||||
<TableRow>
|
'Content 1',
|
||||||
<TableItem>Content 1</TableItem>
|
'Content 2',
|
||||||
<TableItem>Content 2</TableItem>
|
'Content 3',
|
||||||
<TableItem>Content 3</TableItem>
|
'Content 4',
|
||||||
<TableItem>Content 4</TableItem>
|
'Content 5',
|
||||||
<TableItem>Content 5</TableItem>
|
'Content 6',
|
||||||
<TableItem>Content 6</TableItem>
|
'Content 7',
|
||||||
<TableItem>Content 7</TableItem>
|
'Content 8',
|
||||||
<TableItem>Content 8</TableItem>
|
]
|
||||||
</TableRow>
|
|
||||||
)
|
|
||||||
|
|
||||||
const header = (
|
const header = (
|
||||||
<div
|
<div
|
||||||
@ -65,17 +63,42 @@ const headerOptions = new Array(8).fill(null).map((value, index) => ({
|
|||||||
export const Root: Story<TableProps> = ({ type, pages, ...args }) => {
|
export const Root: Story<TableProps> = ({ type, pages, ...args }) => {
|
||||||
const [rows, setRows] = useState(1)
|
const [rows, setRows] = useState(1)
|
||||||
const [footerContent, setFooterContent] = useState('Footer content goes here')
|
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) => {
|
const onPageChange = (page: number) => {
|
||||||
setFooterContent(`Page ${page} of ${pages}`)
|
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 = (
|
const toolbar = (
|
||||||
<>
|
<>
|
||||||
<Dropdown
|
<Dropdown
|
||||||
size="medium"
|
size="medium"
|
||||||
options={dropdownOptions}
|
options={dropdownOptions}
|
||||||
value={dropdownOptions[0].value}
|
value={dropdownOptions[0].value}
|
||||||
|
style={{
|
||||||
|
width: 'auto',
|
||||||
|
minWidth: '113px',
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
@ -124,14 +147,29 @@ export const Root: Story<TableProps> = ({ type, pages, ...args }) => {
|
|||||||
{...args}
|
{...args}
|
||||||
onPageChange={onPageChange}
|
onPageChange={onPageChange}
|
||||||
>
|
>
|
||||||
<TableRow>
|
<TableRow
|
||||||
{headerOptions.map((item) => (
|
onSelectChange={handleHeaderCheckboxChange}
|
||||||
<TableItem>{item.name}</TableItem>
|
checked={allChecked}
|
||||||
|
>
|
||||||
|
{headerOptions.map((item, index) => (
|
||||||
|
<TableItem key={index}>{item.name}</TableItem>
|
||||||
))}
|
))}
|
||||||
</TableRow>
|
</TableRow>
|
||||||
{Array(rows)
|
{Array(rows)
|
||||||
.fill(true)
|
.fill(true)
|
||||||
.map(() => content)}
|
.map((row, rowIndex) => (
|
||||||
|
<TableRow
|
||||||
|
checked={rowsChecked[rowIndex]}
|
||||||
|
onSelectChange={() => handleRowCheckboxChange(rowIndex)}
|
||||||
|
key={rowIndex}
|
||||||
|
>
|
||||||
|
{itemContentArray.map((itemContent, itemIndex) => (
|
||||||
|
<TableItem key={`${rowIndex}-${itemIndex}`}>
|
||||||
|
{itemContent}
|
||||||
|
</TableItem>
|
||||||
|
))}
|
||||||
|
</TableRow>
|
||||||
|
))}
|
||||||
</Table>
|
</Table>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
@ -81,7 +81,7 @@ export const TableFooter: React.FC<TableFooterProps> & {
|
|||||||
size={size}
|
size={size}
|
||||||
onClick={() => dispatch({ type: 'DECREMENT_PAGE' })}
|
onClick={() => dispatch({ type: 'DECREMENT_PAGE' })}
|
||||||
>
|
>
|
||||||
<NavigateBeforeIcon />
|
<NavigateBeforeIcon color="primary" />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
<Dropdown
|
<Dropdown
|
||||||
{...commonProps}
|
{...commonProps}
|
||||||
@ -96,7 +96,7 @@ export const TableFooter: React.FC<TableFooterProps> & {
|
|||||||
size={size}
|
size={size}
|
||||||
onClick={() => dispatch({ type: 'INCREMENT_PAGE' })}
|
onClick={() => dispatch({ type: 'INCREMENT_PAGE' })}
|
||||||
>
|
>
|
||||||
<NavigateNextIcon />
|
<NavigateNextIcon color="primary" />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
@ -15,6 +15,9 @@ export type TableRowProps = CommonProps &
|
|||||||
React.HTMLAttributes<HTMLDivElement> & {
|
React.HTMLAttributes<HTMLDivElement> & {
|
||||||
size?: 'large' | 'medium' | 'small'
|
size?: 'large' | 'medium' | 'small'
|
||||||
type?: 'default' | 'checkbox' | 'radio'
|
type?: 'default' | 'checkbox' | 'radio'
|
||||||
|
onSelectChange?: (rowId?: string) => void
|
||||||
|
rowId?: string
|
||||||
|
checked?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export const TableRow: React.FC<TableRowProps> & {
|
export const TableRow: React.FC<TableRowProps> & {
|
||||||
@ -23,12 +26,31 @@ export const TableRow: React.FC<TableRowProps> & {
|
|||||||
size: _size = 'large',
|
size: _size = 'large',
|
||||||
type: _type = 'default',
|
type: _type = 'default',
|
||||||
children,
|
children,
|
||||||
|
onSelectChange,
|
||||||
|
rowId,
|
||||||
|
checked: isCheckedProp,
|
||||||
...props
|
...props
|
||||||
}) => {
|
}) => {
|
||||||
const commonProps = useCommonProps(props)
|
const commonProps = useCommonProps(props)
|
||||||
const table = useTableContext()
|
const table = useTableContext()
|
||||||
const type = table?.type ?? _type
|
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 (
|
return (
|
||||||
<tr
|
<tr
|
||||||
{...omitCommonProps(props)}
|
{...omitCommonProps(props)}
|
||||||
@ -40,12 +62,16 @@ export const TableRow: React.FC<TableRowProps> & {
|
|||||||
>
|
>
|
||||||
{type === 'checkbox' && (
|
{type === 'checkbox' && (
|
||||||
<td className={tableItemClasses.root}>
|
<td className={tableItemClasses.root}>
|
||||||
<Checkbox />
|
<Checkbox checked={isChecked} onChange={handleCheckboxChange} />
|
||||||
</td>
|
</td>
|
||||||
)}
|
)}
|
||||||
{type === 'radio' && (
|
{type === 'radio' && (
|
||||||
<td className={tableItemClasses.root}>
|
<td className={tableItemClasses.root}>
|
||||||
<RadioButton value="1" />
|
<RadioButton
|
||||||
|
value="1"
|
||||||
|
checked={isChecked}
|
||||||
|
onChange={handleCheckboxChange}
|
||||||
|
/>
|
||||||
</td>
|
</td>
|
||||||
)}
|
)}
|
||||||
{children}
|
{children}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user