@@ -591,23 +591,34 @@ function UserDetails({ users }) {
591591 ) ;
592592}
593593
594- function Details ( { details, daily } ) {
594+ function Details ( { details, daily, partitions = [ ] , accounts = [ ] , users = [ ] } ) {
595595 const [ expanded , setExpanded ] = useState ( null ) ;
596596 const [ dateRange , setDateRange ] = useState ( '30' ) ;
597597 const [ filters , setFilters ] = useState ( {
598598 partition : '' ,
599599 account : '' ,
600- department : '' ,
601- pi : ''
600+ user : ''
602601 } ) ;
603602
604603 function toggle ( account ) {
605604 setExpanded ( prev => ( prev === account ? null : account ) ) ;
606605 }
607606
607+ const filteredDetails = details
608+ . map ( d => {
609+ if ( filters . account && d . account !== filters . account ) return null ;
610+ let userList = d . users || [ ] ;
611+ if ( filters . user ) {
612+ userList = userList . filter ( u => u . user === filters . user ) ;
613+ if ( ! userList . length ) return null ;
614+ }
615+ return { ...d , users : userList } ;
616+ } )
617+ . filter ( Boolean ) ;
618+
608619 function exportCSV ( ) {
609620 const rows = [ [ 'Account' , 'Core Hours' , 'Cost' ] ] ;
610- details . forEach ( d => {
621+ filteredDetails . forEach ( d => {
611622 rows . push ( [ d . account , d . core_hours , d . cost ] ) ;
612623 ( d . users || [ ] ) . forEach ( u => {
613624 rows . push ( [ ` ${ u . user } ` , u . core_hours , u . cost ] ) ;
@@ -648,17 +659,21 @@ function Details({ details, daily }) {
648659 React . createElement ( 'option' , { value : 'q' } , 'Q-to-date' ) ,
649660 React . createElement ( 'option' , { value : 'y' } , 'Year' )
650661 ) ,
651- [ 'Partition' , 'Account' , 'Department' , 'PI' ] . map ( name =>
652- React . createElement (
662+ [ 'Partition' , 'Account' , 'User' ] . map ( name => {
663+ const opts =
664+ name === 'Partition' ? partitions : name === 'Account' ? accounts : users ;
665+ const key = name . toLowerCase ( ) ;
666+ return React . createElement (
653667 'select' ,
654668 {
655669 key : name ,
656- onChange : e =>
657- setFilters ( { ...filters , [ name . toLowerCase ( ) ] : e . target . value } )
670+ value : filters [ key ] ,
671+ onChange : e => setFilters ( { ...filters , [ key ] : e . target . value } )
658672 } ,
659- React . createElement ( 'option' , { value : '' } , name )
660- )
661- ) ,
673+ React . createElement ( 'option' , { value : '' } , name ) ,
674+ opts . map ( o => React . createElement ( 'option' , { key : o , value : o } , o ) )
675+ ) ;
676+ } ) ,
662677 React . createElement ( 'button' , { onClick : exportCSV } , 'Export' )
663678 ) ,
664679 React . createElement (
@@ -681,7 +696,7 @@ function Details({ details, daily }) {
681696 React . createElement (
682697 'tbody' ,
683698 null ,
684- details . reduce ( ( acc , d ) => {
699+ filteredDetails . reduce ( ( acc , d ) => {
685700 acc . push (
686701 React . createElement (
687702 'tr' ,
@@ -980,7 +995,13 @@ function App() {
980995 } ) ,
981996 data &&
982997 view === 'details' &&
983- React . createElement ( Details , { details : data . details , daily : data . daily } ) ,
998+ React . createElement ( Details , {
999+ details : data . details ,
1000+ daily : data . daily ,
1001+ partitions : data . partitions ,
1002+ accounts : data . accounts ,
1003+ users : data . users
1004+ } ) ,
9841005 view === 'settings' && React . createElement ( Rates , { onRatesUpdated : reload } )
9851006 ) ;
9861007}
0 commit comments