@@ -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