Skip to content

Commit fc7188c

Browse files
Added sorting functionality for Bought, Used, Available, and Wasted columns in Materials List
1 parent ff4598c commit fc7188c

1 file changed

Lines changed: 75 additions & 3 deletions

File tree

src/components/BMDashboard/ItemList/ItemsTable.jsx

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ export default function ItemsTable({
2828
sortOrder: 'default',
2929
});
3030

31+
const [boughtCol, setBoughtCol] = useState({ iconsToDisplay: faSort, sortOrder: 'default' });
32+
const [usedCol, setUsedCol] = useState({ iconsToDisplay: faSort, sortOrder: 'default' });
33+
const [availableCol, setAvailableCol] = useState({
34+
iconsToDisplay: faSort,
35+
});
36+
const [wastedCol, setWastedCol] = useState({ iconsToDisplay: faSort, sortOrder: 'default' });
37+
3138
useEffect(() => {
3239
setData(filteredItems);
3340
}, [filteredItems]);
@@ -79,14 +86,67 @@ export default function ItemsTable({
7986
}
8087
setProjectNameCol({ iconsToDisplay: faSort, sortOrder: 'default' });
8188
}
89+
// Sorting for Bought
90+
if (columnName === 'Bought') {
91+
if (boughtCol.sortOrder === 'default' || boughtCol.sortOrder === 'desc') {
92+
newSortedData.sort((a, b) => (a.stockBought || 0) - (b.stockBought || 0));
93+
setBoughtCol({ iconsToDisplay: faSortUp, sortOrder: 'asc' });
94+
} else {
95+
newSortedData.sort((a, b) => (b.stockBought || 0) - (a.stockBought || 0));
96+
setBoughtCol({ iconsToDisplay: faSortDown, sortOrder: 'desc' });
97+
}
98+
resetOtherDynamicColumns('Bought');
99+
}
100+
101+
// Sorting for Used
102+
if (columnName === 'Used') {
103+
if (usedCol.sortOrder === 'default' || usedCol.sortOrder === 'desc') {
104+
newSortedData.sort((a, b) => (a.stockUsed || 0) - (b.stockUsed || 0));
105+
setUsedCol({ iconsToDisplay: faSortUp, sortOrder: 'asc' });
106+
} else {
107+
newSortedData.sort((a, b) => (b.stockUsed || 0) - (a.stockUsed || 0));
108+
setUsedCol({ iconsToDisplay: faSortDown, sortOrder: 'desc' });
109+
}
110+
resetOtherDynamicColumns('Used');
111+
}
112+
113+
// Sorting for Available
114+
if (columnName === 'Available') {
115+
if (availableCol.sortOrder === 'default' || availableCol.sortOrder === 'desc') {
116+
newSortedData.sort((a, b) => (a.stockAvailable || 0) - (b.stockAvailable || 0));
117+
setAvailableCol({ iconsToDisplay: faSortUp, sortOrder: 'asc' });
118+
} else {
119+
newSortedData.sort((a, b) => (b.stockAvailable || 0) - (a.stockAvailable || 0));
120+
setAvailableCol({ iconsToDisplay: faSortDown, sortOrder: 'desc' });
121+
}
122+
resetOtherDynamicColumns('Available');
123+
}
82124

125+
// Sorting for Wasted
126+
if (columnName === 'Wasted') {
127+
if (wastedCol.sortOrder === 'default' || wastedCol.sortOrder === 'desc') {
128+
newSortedData.sort((a, b) => (a.stockWasted || 0) - (b.stockWasted || 0));
129+
setWastedCol({ iconsToDisplay: faSortUp, sortOrder: 'asc' });
130+
} else {
131+
newSortedData.sort((a, b) => (b.stockWasted || 0) - (a.stockWasted || 0));
132+
setWastedCol({ iconsToDisplay: faSortDown, sortOrder: 'desc' });
133+
}
134+
resetOtherDynamicColumns('Wasted');
135+
}
83136
setData(newSortedData);
84137
};
85138

86139
const getNestedValue = (obj, path) => {
87140
return path.split('.').reduce((acc, part) => (acc ? acc[part] : null), obj);
88141
};
89142

143+
const resetOtherDynamicColumns = active => {
144+
if (active !== 'Bought') setBoughtCol({ iconsToDisplay: faSort, sortOrder: 'default' });
145+
if (active !== 'Used') setUsedCol({ iconsToDisplay: faSort, sortOrder: 'default' });
146+
if (active !== 'Available') setAvailableCol({ iconsToDisplay: faSort, sortOrder: 'default' });
147+
if (active !== 'Wasted') setWastedCol({ iconsToDisplay: faSort, sortOrder: 'default' });
148+
};
149+
90150
return (
91151
<>
92152
<RecordsModal
@@ -115,9 +175,21 @@ export default function ItemsTable({
115175
) : (
116176
<th>Name</th>
117177
)}
118-
{dynamicColumns.map(({ label }) => (
119-
<th key={label}>{label}</th>
120-
))}
178+
{dynamicColumns.map(({ label }) => {
179+
const stateMap = {
180+
Bought: boughtCol,
181+
Used: usedCol,
182+
Available: availableCol,
183+
Wasted: wastedCol,
184+
};
185+
186+
return (
187+
<th key={label} onClick={() => sortData(label)}>
188+
{label}{' '}
189+
<FontAwesomeIcon icon={stateMap[label]?.iconsToDisplay || faSort} size="lg" />
190+
</th>
191+
);
192+
})}
121193
<th>Usage Record</th>
122194
<th>Updates</th>
123195
<th>Purchases</th>

0 commit comments

Comments
 (0)