@@ -117,6 +117,22 @@ function getShipLockReason(project) {
117117 return missing . length ? `Locked: ${ missing . join ( ", " ) } .` : "" ;
118118}
119119
120+ function formatHours ( value ) {
121+ return Number ( value ?? 0 ) . toFixed ( 2 ) ;
122+ }
123+
124+ function getLoggedHours ( project ) {
125+ return Number ( project . combinedHours ?? project . totalHours ?? project . journalHours ?? 0 ) ;
126+ }
127+
128+ function getApprovedBankedHours ( project ) {
129+ return Math . max ( Number ( project . approvedHours ?? 0 ) , Number ( project . pastApprovedHours ?? 0 ) ) ;
130+ }
131+
132+ function getUnshippedHours ( project ) {
133+ return Math . max ( 0 , Number ( ( getLoggedHours ( project ) - getApprovedBankedHours ( project ) ) . toFixed ( 2 ) ) ) ;
134+ }
135+
120136export function ProjectsPage ( ) {
121137 const { user } = useAuth ( ) ;
122138 const [ projects , setProjects ] = useState ( [ ] ) ;
@@ -490,6 +506,7 @@ export function ProjectsPage() {
490506
491507function ProjectDetailsModal ( { project, onClose, onEdit, onJournal, onShip, onDelete } ) {
492508 const shipLockReason = getShipLockReason ( project ) ;
509+ const unshippedHours = getUnshippedHours ( project ) ;
493510
494511 return (
495512 < div className = "projects-page__modal-overlay" role = "presentation" onClick = { onClose } >
@@ -518,19 +535,23 @@ function ProjectDetailsModal({ project, onClose, onEdit, onJournal, onShip, onDe
518535 </ div >
519536 < div className = "projects-page__modal-row" >
520537 < span > Hours logged (combined)</ span >
521- < strong > { project . combinedHours ?? project . totalHours ?? 0 } </ strong >
538+ < strong > { formatHours ( getLoggedHours ( project ) ) } </ strong >
522539 </ div >
523540 < div className = "projects-page__modal-row" >
524541 < span > Hours approved</ span >
525- < strong > { project . approvedHours || 0 } </ strong >
542+ < strong > { formatHours ( getApprovedBankedHours ( project ) ) } </ strong >
543+ </ div >
544+ < div className = "projects-page__modal-row" >
545+ < span > Unshipped hours</ span >
546+ < strong > { formatHours ( unshippedHours ) } </ strong >
526547 </ div >
527548 < div className = "projects-page__modal-row" >
528549 < span > Journal hours</ span >
529- < strong > { project . journalHours || 0 } </ strong >
550+ < strong > { formatHours ( project . journalHours ) } </ strong >
530551 </ div >
531552 < div className = "projects-page__modal-row" >
532553 < span > Hackatime hours</ span >
533- < strong > { project . hackatimeHours || 0 } </ strong >
554+ < strong > { formatHours ( project . hackatimeHours ) } </ strong >
534555 </ div >
535556 < div className = "projects-page__modal-row" >
536557 < span > Hackatime projects</ span >
0 commit comments