@@ -26,72 +26,98 @@ const WBS = props => {
2626 } , [ projectId ] ) ;
2727
2828 useEffect ( ( ) => {
29+ if ( ! props . state . wbs . WBSItems ) return ;
30+
2931 const sortedItems = [ ...props . state . wbs . WBSItems ] ;
3032 if ( sortOrder === 'asc' ) {
31- sortedItems . sort ( ( a , b ) => a . wbsName . localeCompare ( b . wbsName ) ) ;
33+ sortedItems . sort ( ( a , b ) => a . wbsName . toLowerCase ( ) . localeCompare ( b . wbsName . toLowerCase ( ) ) ) ;
3234 } else if ( sortOrder === 'desc' ) {
33- sortedItems . sort ( ( a , b ) => b . wbsName . localeCompare ( a . wbsName ) ) ;
35+ sortedItems . sort ( ( a , b ) => b . wbsName . toLowerCase ( ) . localeCompare ( a . wbsName . toLowerCase ( ) ) ) ;
3436 } else {
3537 sortedItems . sort ( ( a , b ) => new Date ( b . modifiedDatetime ) - new Date ( a . modifiedDatetime ) ) ;
3638 }
3739 setSortedWBSItems ( sortedItems ) ;
3840 } , [ props . state . wbs . WBSItems , sortOrder ] ) ;
3941
4042 const handleSortChange = ( newOrder ) => {
41- setSortOrder ( newOrder ) ;
43+ setSortOrder ( prevOrder => prevOrder === newOrder ? 'recent' : newOrder ) ;
4244 } ;
4345
4446 return (
4547 < React . Fragment >
4648 < div className = { darkMode ? 'bg-oxford-blue text-light' : '' } style = { { minHeight : "100%" } } >
4749 < div className = { `container pt-2 ${ darkMode ? 'bg-yinmn-blue-light text-light' : '' } ` } >
4850 < nav aria-label = "breadcrumb" >
49- < ol className = { `breadcrumb ${ darkMode ? 'bg-space-cadet' : '' } ` } style = { darkMode ? boxStyleDark : boxStyle } >
50- < NavItem tag = { Link } to = { `/projects/` } >
51- < button type = "button" className = "btn btn-secondary mr-2" style = { darkMode ? boxStyleDark : boxStyle } >
52- < i className = "fa fa-chevron-circle-left" aria-hidden = "true" > </ i >
53- </ button >
54- < span style = { { marginLeft : '8px' , marginRight :'8px' } } > Return to Project List</ span >
55- </ NavItem >
56- < div id = "member_project__name" style = { { flex : '1' , textAlign : 'center' , fontWeight : 'bold' , display : 'flex' ,
57- alignItems : 'center' , justifyContent : 'center' , } } > Project Name: { projectName } </ div >
58- </ ol >
51+ < div className = { `d-flex align-items-center breadcrumb ${ darkMode ? 'bg-space-cadet' : '' } ` }
52+ style = { {
53+ ...darkMode ? boxStyleDark : boxStyle ,
54+ backgroundColor : darkMode ? '' : '#E9ECEF' ,
55+ margin : '0 0 16px' ,
56+ padding : '12px 16px' ,
57+ position : 'relative'
58+ } } >
59+ < div style = { { position : 'absolute' , left : '1rem' } } >
60+ < NavItem tag = { Link } to = { `/projects/` } >
61+ < button type = "button" className = "btn btn-secondary" style = { darkMode ? boxStyleDark : boxStyle } >
62+ < i className = "fa fa-chevron-circle-left" aria-hidden = "true" > </ i >
63+ < span style = { { marginLeft : '8px' } } > Return to Project List</ span >
64+ </ button >
65+ </ NavItem >
66+ </ div >
67+ < div style = { {
68+ width : '100%' ,
69+ textAlign : 'center' ,
70+ fontWeight : 'bold' ,
71+ fontSize : '1.5rem'
72+ } } > { projectName } </ div >
73+ </ div >
5974 </ nav >
6075
61- < AddWBS projectId = { projectId } />
76+ < AddWBS
77+ projectId = { projectId }
78+ onSortAscending = { ( ) => handleSortChange ( 'asc' ) }
79+ onSortDescending = { ( ) => handleSortChange ( 'desc' ) }
80+ />
6281
63- < table className = { `table table-bordered table-responsive-sm ${ darkMode ? 'bg-yinmn-blue text-light dark-mode' : '' } ` } >
64- < thead >
65- < tr className = { darkMode ? 'bg-space-cadet' : '' } >
66- < th scope = "col" id = "members__order" >
67- #
68- </ th >
69- < th scope = "col" id = "members__name" >
70- Name
71- < span style = { { marginLeft : '8px' , cursor : 'pointer' } } >
72- < i
73- className = { `fa ${ sortOrder === 'recent' ? 'fa-sort' : sortOrder === 'asc' ? 'fa-sort-up' : 'fa-sort-down' } ` }
74- onClick = { ( ) => handleSortChange ( sortOrder === 'asc' ? 'desc' : sortOrder === 'desc' ? 'recent' : 'asc' ) }
75- > </ i >
76- </ span >
77- </ th >
78- < th scope = "col" id = "members__name" > </ th >
79- </ tr >
80- </ thead >
81- < tbody >
82- { sortedWBSItems . map ( ( item , i ) =>
83- item ? (
84- < WBSItem
85- index = { i + 1 }
86- key = { item . _id }
87- wbsId = { item . _id }
88- projectId = { projectId }
89- name = { item . wbsName }
90- />
91- ) : null ,
92- ) }
93- </ tbody >
94- </ table >
82+ { ! props . state . wbs . WBSItems ? (
83+ < div className = "d-flex justify-content-center align-items-center pt-4" >
84+ < div className = "spinner-border text-primary" role = "status" >
85+ < span className = "sr-only" > Loading...</ span >
86+ </ div >
87+ </ div >
88+ ) : (
89+ < table className = { `table table-bordered table-responsive-sm ${ darkMode ? 'bg-yinmn-blue text-light dark-mode' : '' } ` } >
90+ < thead >
91+ < tr className = { darkMode ? 'bg-space-cadet' : '' } >
92+ < th scope = "col" style = { { width : '150px' } } > #</ th >
93+ < th scope = "col" style = { { textAlign : 'left' } } >
94+ Name
95+ < span style = { { marginLeft : '8px' , cursor : 'pointer' } } >
96+ < i
97+ className = { `fa ${ sortOrder === 'recent' ? 'fa-sort' : sortOrder === 'asc' ? 'fa-sort-up' : 'fa-sort-down' } ` }
98+ onClick = { ( ) => handleSortChange ( sortOrder === 'asc' ? 'desc' : sortOrder === 'desc' ? 'recent' : 'asc' ) }
99+ > </ i >
100+ </ span >
101+ </ th >
102+ < th scope = "col" style = { { width : '50px' } } > </ th >
103+ </ tr >
104+ </ thead >
105+ < tbody >
106+ { sortedWBSItems . map ( ( item , i ) =>
107+ item ? (
108+ < WBSItem
109+ index = { i + 1 }
110+ key = { item . _id }
111+ wbsId = { item . _id }
112+ projectId = { projectId }
113+ name = { item . wbsName }
114+ darkMode = { darkMode }
115+ />
116+ ) : null ,
117+ ) }
118+ </ tbody >
119+ </ table >
120+ ) }
95121 </ div >
96122 </ div >
97123 </ React . Fragment >
0 commit comments