drag resize is working

This commit is contained in:
Carter 2025-06-03 09:16:49 -06:00
parent bb50975a28
commit 6cc29c37c7
2 changed files with 118 additions and 16 deletions

View file

@ -148,6 +148,14 @@ export default function ResponsiveTable<T extends Object>(props: Props<T>) {
const [handler, setHandler] = useState<NodeJS.Timeout | undefined>(undefined); const [handler, setHandler] = useState<NodeJS.Timeout | undefined>(undefined);
const [columnAnchor, setColumnAnchor] = useState<any>(null) const [columnAnchor, setColumnAnchor] = useState<any>(null)
const [columnSizes, setColumnSizes] = useState<Map<string, number>>(new Map())
const [tempWidth, setTempWidth] = useState<number | undefined>(undefined)
const [tempWidth2, setTempWidth2] = useState<number | undefined>(undefined)
const [dragX, setDragX] = useState<number>(0)
const [dragStart, setDragStart] = useState<number | undefined>(undefined)
const [rowWidths, setRowWidths] = useState<number[]>([])
const [dragIndex, setDragIndex] = useState<number | undefined>(undefined)
const filterKey = window.location.pathname.split('/').pop() + "-table-filter-list"; const filterKey = window.location.pathname.split('/').pop() + "-table-filter-list";
const [filterList, setFilterList] = useState<string[]>(() => { const [filterList, setFilterList] = useState<string[]>(() => {
@ -298,8 +306,7 @@ export default function ResponsiveTable<T extends Object>(props: Props<T>) {
} }
return ( return (
Object.keys(row).map((key, index) => { Object.keys(row).map((key, index) => {
let value = row[key as keyof typeof row] const value = row[key as keyof typeof row]
return ( return (
<Grid2 container direction={"row"} key={"mobile-list-"+index} spacing={1} padding={1}> <Grid2 container direction={"row"} key={"mobile-list-"+index} spacing={1} padding={1}>
<Grid2 size={{ xs: 4 }} alignContent={"center"} > <Grid2 size={{ xs: 4 }} alignContent={"center"} >
@ -345,7 +352,6 @@ export default function ResponsiveTable<T extends Object>(props: Props<T>) {
padding: gutterPadding padding: gutterPadding
}} }}
onClick={(event) => handleCollapse(index, event)} onClick={(event) => handleCollapse(index, event)}
// style={{pre}}
> >
<IconButton <IconButton
sx={{ sx={{
@ -430,6 +436,76 @@ export default function ResponsiveTable<T extends Object>(props: Props<T>) {
return null; return null;
} }
const resizeClick = (event: React.MouseEvent<HTMLDivElement, MouseEvent>, index: number) => {
console.log("click!")
// console.log(event.currentTarget.clientWidth)
// console.log(event.currentTarget.offsetWidth)
// console.log(event.currentTarget.scrollWidth)
// console.log(event.currentTarget.parentElement?.clientWidth)
// console.log(event.currentTarget.parentElement?.offsetWidth)
// console.log(event.currentTarget.parentElement?.scrollWidth)
// console.log(event.currentTarget.parentElement?.childNodes.keys)
let newWidths: number[] = []
event.currentTarget.parentElement?.parentElement?.parentElement?.childNodes.forEach(node => {
// console.log(node.textContent)
// console.log(node)
if (node instanceof HTMLElement) {
// console.log(node.clientWidth);
newWidths.push(node.clientWidth)
}
})
// console.log(event.clientX)
setRowWidths(newWidths)
setTempWidth(event.currentTarget.parentElement?.clientWidth)
setDragStart(event.clientX)
setDragIndex(index)
window.addEventListener('mousemove', resizeDrag);
window.addEventListener('mouseup', resizeUnclick);
// return (
// )
}
// useEffect(() => {
// console.log(tempWidth)
// console.log(tempWidth)
// }, [tempWidth])
const resizeUnclick = () => {
console.log("unclick!")
// setDragStart(undefined)
window.removeEventListener('mousemove', resizeDrag);
window.removeEventListener('mouseup', resizeUnclick);
}
const resizeDrag = (e: any) => {
if (!dragIndex) return
if (!rowWidths[dragIndex]) return
if (!rowWidths[dragIndex+1]) return
if (!dragStart) return
console.log((dragStart - e.clientX))
let newWidths: number[] = [...rowWidths]
newWidths[dragIndex] = newWidths[dragIndex] - (dragStart - e.clientX)
newWidths[dragIndex+1] = newWidths[dragIndex+1] + (dragStart - e.clientX)
setRowWidths(newWidths)
// if (!dragStart) return
// console.log(dragStart)
// console.log(e.clientX)
// if (dragStart) console.log(dragStart - e.clientX)
// console.log("drag!")
// if (dragStart && tempWidth) setTempWidth(tempWidth - (dragStart - e.clientX))
// return (
// )
}
useEffect(() => {
console.log(rowWidths)
}, [rowWidths])
return ( return (
<TableContainer className={classes.tableContainer} component={Paper}> <TableContainer className={classes.tableContainer} component={Paper}>
<Table> <Table>
@ -501,6 +577,7 @@ export default function ResponsiveTable<T extends Object>(props: Props<T>) {
</Grid2> </Grid2>
<Grid2 <Grid2
sx={{ cursor: "col-resize" }} sx={{ cursor: "col-resize" }}
onMouseDown={event => resizeClick(event, index)}
> >
| |
</Grid2> </Grid2>
@ -559,15 +636,41 @@ export default function ResponsiveTable<T extends Object>(props: Props<T>) {
} }
{columns ? {columns ?
columns.map((column, j) => { columns.map((column, j) => {
// console.log(j)
if (filterList.includes(column.title) || column.hidden) return null if (filterList.includes(column.title) || column.hidden) return null
if (column.render) return ( if (column.render) return (
<TableCell key={"row-"+index+"cell-"+j} sx={column.cellStyle ? column.cellStyle : {padding: 0}}> // <TableCell key={"row-"+index+"cell-"+j} sx={column.cellStyle ? column.cellStyle : {padding: 0}}>
<TableCell key={"row-"+index+"cell-"+j} sx={{padding: 0, width: rowWidths[j] ? rowWidths[j] : undefined}}>
{column.render(row)} {column.render(row)}
</TableCell> </TableCell>
) )
// if (column.render && j!==undefined && j === 1) return (
// // <TableCell key={"row-"+index+"cell-"+j} sx={column.cellStyle ? column.cellStyle : {padding: 0}}>
// <TableCell key={"row-"+index+"cell-"+j} sx={{padding: 0}}>
// {column.render(row)}
// </TableCell>
// )
// if (column.render && j!==undefined && j === 2) return (
// // <TableCell key={"row-"+index+"cell-"+j} sx={column.cellStyle ? column.cellStyle : {padding: 0}}>
// <TableCell key={"row-"+index+"cell-"+j} sx={{padding: 0, width: tempWidth ? tempWidth : undefined}}>
// {column.render(row)}
// </TableCell>
// )
// if (column.render && j!==undefined && j === 3) return (
// // <TableCell key={"row-"+index+"cell-"+j} sx={column.cellStyle ? column.cellStyle : {padding: 0}}>
// <TableCell key={"row-"+index+"cell-"+j} sx={{padding: 0, width: tempWidth2 ? tempWidth2 : undefined}}>
// {column.render(row)}
// </TableCell>
// )
// if (column.render) return (
// // <TableCell key={"row-"+index+"cell-"+j} sx={column.cellStyle ? column.cellStyle : {padding: 0}}>
// <TableCell key={"row-"+index+"cell-"+j} sx={{padding: 0}}>
// {column.render(row)}
// </TableCell>
// )
return ( return (
<TableCell key={"row-"+index+"cell-"+j}> <TableCell key={"row-"+index+"cell-"+j}>
{Object.values(row)[j].toString()} {Object.values(row)[j] && Object.values(row)[j].toString()}
</TableCell> </TableCell>
) )
}) })

View file

@ -27,7 +27,6 @@ import StatusSen5x from "common/StatusSen5x";
import StatusDust from "common/StatusDust"; import StatusDust from "common/StatusDust";
import StatusGas from "common/StatusGas"; import StatusGas from "common/StatusGas";
import { cloneDeep } from "lodash"; import { cloneDeep } from "lodash";
import { or } from "utils";
import LoadingScreen from "app/LoadingScreen"; import LoadingScreen from "app/LoadingScreen";
const useStyles = makeStyles((theme: Theme) => { const useStyles = makeStyles((theme: Theme) => {
@ -388,12 +387,14 @@ export default function Devices() {
let columns: Column<Device>[] = [ let columns: Column<Device>[] = [
{ {
title: "State", title: "State",
// cellStyle: {width: 100000},
// sortKey: "state", // sortKey: "state",
render: (device: Device) => { render: (device: Device) => {
const status = device.status ?? pond.DeviceStatus.create() const status = device.status ?? pond.DeviceStatus.create()
const deviceStateHelper = getDeviceStateHelper(status.state); const deviceStateHelper = getDeviceStateHelper(status.state);
return ( return (
<Box className={classes.cellContainer} style={{ width: theme.spacing(0.5)}}> // <Box className={classes.cellContainer} style={{ width: theme.spacing(0.5)}}>
<Box >
<Tooltip title={deviceStateHelper.description}>{deviceStateHelper.icon}</Tooltip> <Tooltip title={deviceStateHelper.description}>{deviceStateHelper.icon}</Tooltip>
</Box> </Box>
) )
@ -408,10 +409,12 @@ export default function Devices() {
}, },
{ {
title: "Device", title: "Device",
cellStyle: { width: 160 },
sortKey: "name", sortKey: "name",
render: (device: Device) => { render: (device: Device) => {
return ( return (
<Box className={classes.cellContainer}> // <Box className={classes.cellContainer}>
<Box >
<Chip <Chip
variant="outlined" variant="outlined"
label={device.settings?.name ? device.settings.name : "Device " + device.settings?.deviceId} label={device.settings?.name ? device.settings.name : "Device " + device.settings?.deviceId}
@ -423,11 +426,12 @@ export default function Devices() {
}, },
{ {
title: "Description", title: "Description",
cellStyle: { width: 400 },
render: (device: Device) => { render: (device: Device) => {
const description = device.settings?.description ?? "" const description = device.settings?.description ?? ""
let size = (hasCo2 && !groupGas) ? 26 : 36 let size = (hasCo2 && !groupGas) ? 26 : 36
return ( return (
<Box className={classes.descriptionCellContainer} width={size*6}> <Box >
<Tooltip title={description}> <Tooltip title={description}>
<span> <span>
{description.length > size {description.length > size
@ -697,9 +701,7 @@ export default function Devices() {
dense dense
> >
<ListItemIcon> <ListItemIcon>
<Checkbox <Checkbox checked={!separateDust} />
checked={!separateDust}
/>
</ListItemIcon> </ListItemIcon>
<ListItemText primary={"Group Dust"} /> <ListItemText primary={"Group Dust"} />
</MenuItem> </MenuItem>
@ -709,10 +711,7 @@ export default function Devices() {
dense dense
> >
<ListItemIcon> <ListItemIcon>
<Checkbox <Checkbox checked={groupGas} />
checked={groupGas}
/>
</ListItemIcon> </ListItemIcon>
<ListItemText primary={"Group Gas"} /> <ListItemText primary={"Group Gas"} />
</MenuItem> </MenuItem>