diff --git a/src/cableEstimator/cableEstimator.tsx b/src/cableEstimator/cableEstimator.tsx index f587efd..ac9991f 100644 --- a/src/cableEstimator/cableEstimator.tsx +++ b/src/cableEstimator/cableEstimator.tsx @@ -61,6 +61,8 @@ export default function CableEstimator() { const [tablePage, setTablePage] = useState(0) const [pageSize, setPageSize] = useState(10) const [rowCount, setRowCount] = useState(0) + const [orderBy, setOrderBy] = useState("") + const [order, setOrder] = useState<"asc" | "desc">("asc") const [selectedBin, setSelectedBin] = useState(); const [quoteOpen, setQuoteOpen] = useState(false); const [useCustomBin, setUseCustomBin] = useState(false); @@ -106,47 +108,57 @@ export default function CableEstimator() { const [loading, setLoading] = useState(false) const columns: Column[] = [ - { - title: "Manufacturer", - render: (row: jsonBin) => {row.Manufacturer} - }, - { - title: "Model", - render: (row: jsonBin) => {row.Model} - }, - { - title: "Capacity", - render: (row: jsonBin) => {row.Capacity} - }, - { - title: "Hopper Angle", - render: (row: jsonBin) => {row.HopperAngle} - }, - { - title: "Diameter " + (getDistanceUnit() === pond.DistanceUnit.DISTANCE_UNIT_FEET ? "(ft)" : "(m)"), - render: (row: jsonBin) => {distanceConversion(row.Diameter).toFixed(2)} - }, - { - title: "Sidewall" + (getDistanceUnit() === pond.DistanceUnit.DISTANCE_UNIT_FEET ? "(ft)" : "(m)"), - render: (row: jsonBin) => {distanceConversion(row.Sidewall).toFixed(2)} - }, - { - title: "Peak Height" + (getDistanceUnit() === pond.DistanceUnit.DISTANCE_UNIT_FEET ? "(ft)" : "(m)"), - render: (row: jsonBin) => {distanceConversion(row.Peak).toFixed(2)} - }, - { - title: "Eave To Peak" + (getDistanceUnit() === pond.DistanceUnit.DISTANCE_UNIT_FEET ? "(ft)" : "(m)"), - render: (row: jsonBin) => {distanceConversion(row.EaveToPeak).toFixed(2)} - }, - { - title: "Roof Angle", - render: (row: jsonBin) => {row.RoofAngle} - }, - { - title: "Rings", - render: (row: jsonBin) => {row.Rings} - } - ] + { + title: "Manufacturer", + sortKey: "Manufacturer", + render: (row: jsonBin) => {row.Manufacturer} + }, + { + title: "Model", + sortKey: "Model", + render: (row: jsonBin) => {row.Model} + }, + { + title: "Capacity", + sortKey: "Capacity", + render: (row: jsonBin) => {row.Capacity} + }, + { + title: "Hopper Angle", + sortKey: "HopperAngle", + render: (row: jsonBin) => {row.HopperAngle} + }, + { + title: "Diameter " + (getDistanceUnit() === pond.DistanceUnit.DISTANCE_UNIT_FEET ? "(ft)" : "(m)"), + sortKey: "Diameter", + render: (row: jsonBin) => {distanceConversion(row.Diameter).toFixed(2)} + }, + { + title: "Sidewall" + (getDistanceUnit() === pond.DistanceUnit.DISTANCE_UNIT_FEET ? "(ft)" : "(m)"), + sortKey: "Sidewall", + render: (row: jsonBin) => {distanceConversion(row.Sidewall).toFixed(2)} + }, + { + title: "Peak Height" + (getDistanceUnit() === pond.DistanceUnit.DISTANCE_UNIT_FEET ? "(ft)" : "(m)"), + sortKey: "PeakHeight", + render: (row: jsonBin) => {distanceConversion(row.Peak).toFixed(2)} + }, + { + title: "Eave To Peak" + (getDistanceUnit() === pond.DistanceUnit.DISTANCE_UNIT_FEET ? "(ft)" : "(m)"), + sortKey: "EaveToPeak", + render: (row: jsonBin) => {distanceConversion(row.EaveToPeak).toFixed(2)} + }, + { + title: "Roof Angle", + sortKey: "RoofAngle", + render: (row: jsonBin) => {row.RoofAngle} + }, + { + title: "Rings", + sortKey: "Rings", + render: (row: jsonBin) => {row.Rings} + } + ] useEffect(()=>{ setLoading(true) @@ -154,6 +166,21 @@ export default function CableEstimator() { let clone: jsonBin[] = cloneDeep(binOptions) //having the search filter in here is quite inefficient as it will filter each time you change pages as well //TODO: re-work the filter so it only filters when the search is changed + + // + clone.sort((a, b) => { + if (Object.keys(a).includes(orderBy)) { + let by = orderBy as keyof jsonBin + if (typeof(a[by]) === "string") { + // return a.localeCompare(b) + return (a[by].localeCompare(b[by] as string)) + } + return ((b[by] as any) - (a[by] as any)) + } + return 0 + }) + if (order === "desc") clone.reverse() + if(tableSearch !== ""){ //filter the data in the cloned list clone = clone.filter(bin => { @@ -175,7 +202,7 @@ export default function CableEstimator() { let rows = clone.splice(tablePage * pageSize, pageSize) setDisplayedRows(rows) setLoading(false) - },[binOptions, tablePage, pageSize, tableSearch]) + },[binOptions, tablePage, pageSize, tableSearch, orderBy, order]) const binOpTable = () => { return ( @@ -193,6 +220,10 @@ export default function CableEstimator() { handleRowsPerPageChange={(e) => {setPageSize(e.target.value)}} rows={displayedRows} total={rowCount} + order={order} + setOrder={setOrder} + orderBy={orderBy} + setOrderBy={setOrderBy} /> ); }; diff --git a/src/common/ResponsiveTable.tsx b/src/common/ResponsiveTable.tsx index 5e48220..8cdfe3c 100644 --- a/src/common/ResponsiveTable.tsx +++ b/src/common/ResponsiveTable.tsx @@ -385,20 +385,20 @@ export default function ResponsiveTable(props: Props) { } const columnClick = (column: Column) => { - const sortKey = column.sortKey ? column.sortKey : column.title - console.log(column.sortKey) + const sortKey = column.sortKey ? column.sortKey : column.title.toLowerCase() + // console.log(column.sortKey) if (setOrderBy) setOrderBy(sortKey) if (setOrder && order) setOrder(order === "asc" ? "desc" : "asc") } const showOrderIcon = (column: Column) => { if (!orderBy) return - const sortKey = column.sortKey ? column.sortKey : column.title + const sortKey = column.sortKey ? column.sortKey : column.title.toLowerCase() if (sortKey === orderBy) { if (order === "asc") { - return + return } else { - return + return } } return null; diff --git a/src/pages/Devices.tsx b/src/pages/Devices.tsx index 036d718..09c9ae6 100644 --- a/src/pages/Devices.tsx +++ b/src/pages/Devices.tsx @@ -301,7 +301,7 @@ export default function Devices() { let columns: Column[] = [ { title: "State", - sortKey: "state", + // sortKey: "state", render: (device: Device) => { const status = device.status ?? pond.DeviceStatus.create() const deviceStateHelper = getDeviceStateHelper(status.state); @@ -370,8 +370,8 @@ export default function Devices() { if (hasPlenums) { columns.push({ title: "Plenum", - sortKey: "hi", - disableSort: true, + // sortKey: "hi", + // disableSort: true, render: (device: Device) => { if (device.status.plenum?.temperature) { return ( @@ -390,8 +390,8 @@ export default function Devices() { if (hasSen5x) { columns.push({ title: "Sen5X", - sortKey: "hi", - disableSort: true, + // sortKey: "hi", + // disableSort: true, render: (device: Device) => { if (device.status.sen5x?.temperature) { return (