From 6cc29c37c77b6c20b09933966d34c741a2ce0a3d Mon Sep 17 00:00:00 2001 From: Carter Date: Tue, 3 Jun 2025 09:16:49 -0600 Subject: [PATCH] drag resize is working --- src/common/ResponsiveTable.tsx | 113 +++++++++++++++++++++++++++++++-- src/pages/Devices.tsx | 21 +++--- 2 files changed, 118 insertions(+), 16 deletions(-) diff --git a/src/common/ResponsiveTable.tsx b/src/common/ResponsiveTable.tsx index b2fa240..c2c2bf5 100644 --- a/src/common/ResponsiveTable.tsx +++ b/src/common/ResponsiveTable.tsx @@ -148,6 +148,14 @@ export default function ResponsiveTable(props: Props) { const [handler, setHandler] = useState(undefined); const [columnAnchor, setColumnAnchor] = useState(null) + const [columnSizes, setColumnSizes] = useState>(new Map()) + const [tempWidth, setTempWidth] = useState(undefined) + const [tempWidth2, setTempWidth2] = useState(undefined) + const [dragX, setDragX] = useState(0) + const [dragStart, setDragStart] = useState(undefined) + const [rowWidths, setRowWidths] = useState([]) + const [dragIndex, setDragIndex] = useState(undefined) + const filterKey = window.location.pathname.split('/').pop() + "-table-filter-list"; const [filterList, setFilterList] = useState(() => { @@ -298,8 +306,7 @@ export default function ResponsiveTable(props: Props) { } return ( Object.keys(row).map((key, index) => { - let value = row[key as keyof typeof row] - + const value = row[key as keyof typeof row] return ( @@ -345,7 +352,6 @@ export default function ResponsiveTable(props: Props) { padding: gutterPadding }} onClick={(event) => handleCollapse(index, event)} - // style={{pre}} > (props: Props) { return null; } + const resizeClick = (event: React.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 ( @@ -501,6 +577,7 @@ export default function ResponsiveTable(props: Props) { resizeClick(event, index)} > | @@ -559,15 +636,41 @@ export default function ResponsiveTable(props: Props) { } {columns ? columns.map((column, j) => { + // console.log(j) if (filterList.includes(column.title) || column.hidden) return null if (column.render) return ( - + // + {column.render(row)} ) + // if (column.render && j!==undefined && j === 1) return ( + // // + // + // {column.render(row)} + // + // ) + // if (column.render && j!==undefined && j === 2) return ( + // // + // + // {column.render(row)} + // + // ) + // if (column.render && j!==undefined && j === 3) return ( + // // + // + // {column.render(row)} + // + // ) + // if (column.render) return ( + // // + // + // {column.render(row)} + // + // ) return ( - {Object.values(row)[j].toString()} + {Object.values(row)[j] && Object.values(row)[j].toString()} ) }) diff --git a/src/pages/Devices.tsx b/src/pages/Devices.tsx index e500cef..2bcb7f9 100644 --- a/src/pages/Devices.tsx +++ b/src/pages/Devices.tsx @@ -27,7 +27,6 @@ import StatusSen5x from "common/StatusSen5x"; import StatusDust from "common/StatusDust"; import StatusGas from "common/StatusGas"; import { cloneDeep } from "lodash"; -import { or } from "utils"; import LoadingScreen from "app/LoadingScreen"; const useStyles = makeStyles((theme: Theme) => { @@ -388,12 +387,14 @@ export default function Devices() { let columns: Column[] = [ { title: "State", + // cellStyle: {width: 100000}, // sortKey: "state", render: (device: Device) => { const status = device.status ?? pond.DeviceStatus.create() const deviceStateHelper = getDeviceStateHelper(status.state); return ( - + // + {deviceStateHelper.icon} ) @@ -408,10 +409,12 @@ export default function Devices() { }, { title: "Device", + cellStyle: { width: 160 }, sortKey: "name", render: (device: Device) => { return ( - + // + { const description = device.settings?.description ?? "" let size = (hasCo2 && !groupGas) ? 26 : 36 return ( - + {description.length > size @@ -697,9 +701,7 @@ export default function Devices() { dense > - + @@ -709,10 +711,7 @@ export default function Devices() { dense > - +