Skip to content

Commit 1723f7d

Browse files
Merge pull request #4460 from OneCommunityGlobal/sriamsh_materiallist_sorting
Sriamsh - Added sorting functionality for Bought, Used, Available, and Wasted columns.
2 parents 000df81 + fc7188c commit 1723f7d

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
@@ -32,6 +32,13 @@ export default function ItemsTable({
3232
sortOrder: 'default',
3333
});
3434

35+
const [boughtCol, setBoughtCol] = useState({ iconsToDisplay: faSort, sortOrder: 'default' });
36+
const [usedCol, setUsedCol] = useState({ iconsToDisplay: faSort, sortOrder: 'default' });
37+
const [availableCol, setAvailableCol] = useState({
38+
iconsToDisplay: faSort,
39+
});
40+
const [wastedCol, setWastedCol] = useState({ iconsToDisplay: faSort, sortOrder: 'default' });
41+
3542
useEffect(() => {
3643
setData(filteredItems);
3744
}, [filteredItems]);
@@ -98,14 +105,67 @@ export default function ItemsTable({
98105
}
99106
setProjectNameCol({ iconsToDisplay: faSort, sortOrder: 'default' });
100107
}
108+
// Sorting for Bought
109+
if (columnName === 'Bought') {
110+
if (boughtCol.sortOrder === 'default' || boughtCol.sortOrder === 'desc') {
111+
newSortedData.sort((a, b) => (a.stockBought || 0) - (b.stockBought || 0));
112+
setBoughtCol({ iconsToDisplay: faSortUp, sortOrder: 'asc' });
113+
} else {
114+
newSortedData.sort((a, b) => (b.stockBought || 0) - (a.stockBought || 0));
115+
setBoughtCol({ iconsToDisplay: faSortDown, sortOrder: 'desc' });
116+
}
117+
resetOtherDynamicColumns('Bought');
118+
}
119+
120+
// Sorting for Used
121+
if (columnName === 'Used') {
122+
if (usedCol.sortOrder === 'default' || usedCol.sortOrder === 'desc') {
123+
newSortedData.sort((a, b) => (a.stockUsed || 0) - (b.stockUsed || 0));
124+
setUsedCol({ iconsToDisplay: faSortUp, sortOrder: 'asc' });
125+
} else {
126+
newSortedData.sort((a, b) => (b.stockUsed || 0) - (a.stockUsed || 0));
127+
setUsedCol({ iconsToDisplay: faSortDown, sortOrder: 'desc' });
128+
}
129+
resetOtherDynamicColumns('Used');
130+
}
131+
132+
// Sorting for Available
133+
if (columnName === 'Available') {
134+
if (availableCol.sortOrder === 'default' || availableCol.sortOrder === 'desc') {
135+
newSortedData.sort((a, b) => (a.stockAvailable || 0) - (b.stockAvailable || 0));
136+
setAvailableCol({ iconsToDisplay: faSortUp, sortOrder: 'asc' });
137+
} else {
138+
newSortedData.sort((a, b) => (b.stockAvailable || 0) - (a.stockAvailable || 0));
139+
setAvailableCol({ iconsToDisplay: faSortDown, sortOrder: 'desc' });
140+
}
141+
resetOtherDynamicColumns('Available');
142+
}
101143

144+
// Sorting for Wasted
145+
if (columnName === 'Wasted') {
146+
if (wastedCol.sortOrder === 'default' || wastedCol.sortOrder === 'desc') {
147+
newSortedData.sort((a, b) => (a.stockWasted || 0) - (b.stockWasted || 0));
148+
setWastedCol({ iconsToDisplay: faSortUp, sortOrder: 'asc' });
149+
} else {
150+
newSortedData.sort((a, b) => (b.stockWasted || 0) - (a.stockWasted || 0));
151+
setWastedCol({ iconsToDisplay: faSortDown, sortOrder: 'desc' });
152+
}
153+
resetOtherDynamicColumns('Wasted');
154+
}
102155
setData(newSortedData);
103156
};
104157

105158
const getNestedValue = (obj, path) => {
106159
return path.split('.').reduce((acc, part) => (acc ? acc[part] : null), obj);
107160
};
108161

162+
const resetOtherDynamicColumns = active => {
163+
if (active !== 'Bought') setBoughtCol({ iconsToDisplay: faSort, sortOrder: 'default' });
164+
if (active !== 'Used') setUsedCol({ iconsToDisplay: faSort, sortOrder: 'default' });
165+
if (active !== 'Available') setAvailableCol({ iconsToDisplay: faSort, sortOrder: 'default' });
166+
if (active !== 'Wasted') setWastedCol({ iconsToDisplay: faSort, sortOrder: 'default' });
167+
};
168+
109169
return (
110170
<>
111171
{/* Regular Records Modal for Update and Purchase records */}
@@ -141,9 +201,21 @@ export default function ItemsTable({
141201
) : (
142202
<th>Name</th>
143203
)}
144-
{dynamicColumns.map(({ label }) => (
145-
<th key={label}>{label}</th>
146-
))}
204+
{dynamicColumns.map(({ label }) => {
205+
const stateMap = {
206+
Bought: boughtCol,
207+
Used: usedCol,
208+
Available: availableCol,
209+
Wasted: wastedCol,
210+
};
211+
212+
return (
213+
<th key={label} onClick={() => sortData(label)}>
214+
{label}{' '}
215+
<FontAwesomeIcon icon={stateMap[label]?.iconsToDisplay || faSort} size="lg" />
216+
</th>
217+
);
218+
})}
147219
<th>Usage Record</th>
148220
<th>Updates</th>
149221
<th>Purchases</th>

0 commit comments

Comments
 (0)