@@ -772,167 +772,168 @@ const SessionReportDocument: React.FC<SessionReportDocumentProps> = ({ report })
772772 </ Page >
773773 ) ) }
774774
775- { report . members . map ( ( member ) => (
776- < Page key = { member . id } size = "A4" style = { styles . page } >
777- { renderPageHeader ( report , `${ member . name } Session Detail` ) }
778-
779- < View style = { styles . memberMetricsRow } wrap = { false } >
780- < View style = { styles . memberMetricsCard } >
781- < Text style = { styles . statCardLabel } > Squad / Year</ Text >
782- < Text style = { styles . statCardValue } > { `S${ member . squad } / ${ member . year } ` } </ Text >
783- < Text style = { styles . statCardHint } > { member . isSquadLeader ? 'Squad leader' : 'Member' } </ Text >
784- </ View >
785- < View style = { styles . memberMetricsCard } >
786- < Text style = { styles . statCardLabel } > Attendance</ Text >
787- < Text style = { styles . statCardValue } > { `${ formatNumber ( member . attendanceRate ) } %` } </ Text >
788- < Text style = { styles . statCardHint } > { `${ member . attendanceCount } present, ${ member . absenceCount } absent` } </ Text >
789- </ View >
790- < View style = { styles . memberMetricsCard } >
791- < Text style = { styles . statCardLabel } > Total Marks</ Text >
792- < Text style = { styles . statCardValue } > { formatNumber ( member . totalMarks ) } </ Text >
793- < Text style = { styles . statCardHint } > { `Avg ${ formatNumber ( member . averageScoreWhenPresent ) } when present` } </ Text >
775+ { report . members . flatMap ( ( member ) => {
776+ const continuationChunks = chunk < MemberMeetingRecord > ( member . meetings . slice ( 14 ) , 22 ) ;
777+
778+ return [
779+ < Page key = { member . id } size = "A4" style = { styles . page } >
780+ { renderPageHeader ( report , `${ member . name } Session Detail` ) }
781+
782+ < View style = { styles . memberMetricsRow } wrap = { false } >
783+ < View style = { styles . memberMetricsCard } >
784+ < Text style = { styles . statCardLabel } > Squad / Year</ Text >
785+ < Text style = { styles . statCardValue } > { `S${ member . squad } / ${ member . year } ` } </ Text >
786+ < Text style = { styles . statCardHint } > { member . isSquadLeader ? 'Squad leader' : 'Member' } </ Text >
787+ </ View >
788+ < View style = { styles . memberMetricsCard } >
789+ < Text style = { styles . statCardLabel } > Attendance</ Text >
790+ < Text style = { styles . statCardValue } > { `${ formatNumber ( member . attendanceRate ) } %` } </ Text >
791+ < Text style = { styles . statCardHint } > { `${ member . attendanceCount } present, ${ member . absenceCount } absent` } </ Text >
792+ </ View >
793+ < View style = { styles . memberMetricsCard } >
794+ < Text style = { styles . statCardLabel } > Total Marks</ Text >
795+ < Text style = { styles . statCardValue } > { formatNumber ( member . totalMarks ) } </ Text >
796+ < Text style = { styles . statCardHint } > { `Avg ${ formatNumber ( member . averageScoreWhenPresent ) } when present` } </ Text >
797+ </ View >
794798 </ View >
795- </ View >
796799
797- < View style = { styles . twoColumn } wrap = { false } >
798- < View style = { styles . column } >
799- < View style = { styles . card } >
800- < Text style = { styles . cardTitle } > Member Summary</ Text >
801- < View style = { styles . keyRow } >
802- < Text style = { styles . keyLabel } > Best night</ Text >
803- < Text style = { styles . keyValue } >
804- { member . bestNightDate ? `${ formatNumber ( member . bestNightScore ) } on ${ formatDate ( member . bestNightDate ) } ` : 'N/A' }
805- </ Text >
806- </ View >
807- < View style = { styles . keyRow } >
808- < Text style = { styles . keyLabel } > Last attended</ Text >
809- < Text style = { styles . keyValue } > { member . lastAttendedDate ? formatDate ( member . lastAttendedDate ) : 'N/A' } </ Text >
800+ < View style = { styles . twoColumn } wrap = { false } >
801+ < View style = { styles . column } >
802+ < View style = { styles . card } >
803+ < Text style = { styles . cardTitle } > Member Summary</ Text >
804+ < View style = { styles . keyRow } >
805+ < Text style = { styles . keyLabel } > Best night</ Text >
806+ < Text style = { styles . keyValue } >
807+ { member . bestNightDate ? `${ formatNumber ( member . bestNightScore ) } on ${ formatDate ( member . bestNightDate ) } ` : 'N/A' }
808+ </ Text >
809+ </ View >
810+ < View style = { styles . keyRow } >
811+ < Text style = { styles . keyLabel } > Last attended</ Text >
812+ < Text style = { styles . keyValue } > { member . lastAttendedDate ? formatDate ( member . lastAttendedDate ) : 'N/A' } </ Text >
813+ </ View >
814+ { report . section === 'junior' && (
815+ < View style = { styles . keyRow } >
816+ < Text style = { styles . keyLabel } > Uniform total</ Text >
817+ < Text style = { styles . keyValue } > { formatNumber ( member . uniformTotal ?? 0 ) } </ Text >
818+ </ View >
819+ ) }
820+ { report . section === 'junior' && (
821+ < View style = { [ styles . keyRow , { borderBottom : 0 } ] } >
822+ < Text style = { styles . keyLabel } > Behaviour total</ Text >
823+ < Text style = { styles . keyValue } > { formatNumber ( member . behaviourTotal ?? 0 ) } </ Text >
824+ </ View >
825+ ) }
826+ { report . section === 'company' && (
827+ < View style = { [ styles . keyRow , { borderBottom : 0 } ] } >
828+ < Text style = { styles . keyLabel } > Recorded meetings</ Text >
829+ < Text style = { styles . keyValue } > { member . meetings . length } </ Text >
830+ </ View >
831+ ) }
810832 </ View >
811- { report . section === 'junior' && (
833+ </ View >
834+
835+ < View style = { styles . column } >
836+ < View style = { styles . card } >
837+ < Text style = { styles . cardTitle } > Session Performance</ Text >
812838 < View style = { styles . keyRow } >
813- < Text style = { styles . keyLabel } > Uniform total </ Text >
814- < Text style = { styles . keyValue } > { formatNumber ( member . uniformTotal ?? 0 ) } </ Text >
839+ < Text style = { styles . keyLabel } > Attendance record </ Text >
840+ < Text style = { styles . keyValue } > { ` ${ member . attendanceCount } / ${ member . meetings . length } ` } </ Text >
815841 </ View >
816- ) }
817- { report . section === 'junior' && (
818- < View style = { [ styles . keyRow , { borderBottom : 0 } ] } >
819- < Text style = { styles . keyLabel } > Behaviour total</ Text >
820- < Text style = { styles . keyValue } > { formatNumber ( member . behaviourTotal ?? 0 ) } </ Text >
842+ < View style = { styles . keyRow } >
843+ < Text style = { styles . keyLabel } > Best score</ Text >
844+ < Text style = { styles . keyValue } > { formatNumber ( member . bestNightScore ) } </ Text >
845+ </ View >
846+ < View style = { styles . keyRow } >
847+ < Text style = { styles . keyLabel } > Attendance rate</ Text >
848+ < Text style = { styles . keyValue } > { `${ formatNumber ( member . attendanceRate ) } %` } </ Text >
821849 </ View >
822- ) }
823- { report . section === 'company' && (
824850 < View style = { [ styles . keyRow , { borderBottom : 0 } ] } >
825- < Text style = { styles . keyLabel } > Recorded meetings </ Text >
826- < Text style = { styles . keyValue } > { member . meetings . length } </ Text >
851+ < Text style = { styles . keyLabel } > Average when present </ Text >
852+ < Text style = { styles . keyValue } > { formatNumber ( member . averageScoreWhenPresent ) } </ Text >
827853 </ View >
828- ) }
829- </ View >
830- </ View >
831-
832- < View style = { styles . column } >
833- < View style = { styles . card } >
834- < Text style = { styles . cardTitle } > Session Performance</ Text >
835- < View style = { styles . keyRow } >
836- < Text style = { styles . keyLabel } > Attendance record</ Text >
837- < Text style = { styles . keyValue } > { `${ member . attendanceCount } / ${ member . meetings . length } ` } </ Text >
838- </ View >
839- < View style = { styles . keyRow } >
840- < Text style = { styles . keyLabel } > Best score</ Text >
841- < Text style = { styles . keyValue } > { formatNumber ( member . bestNightScore ) } </ Text >
842- </ View >
843- < View style = { styles . keyRow } >
844- < Text style = { styles . keyLabel } > Attendance rate</ Text >
845- < Text style = { styles . keyValue } > { `${ formatNumber ( member . attendanceRate ) } %` } </ Text >
846- </ View >
847- < View style = { [ styles . keyRow , { borderBottom : 0 } ] } >
848- < Text style = { styles . keyLabel } > Average when present</ Text >
849- < Text style = { styles . keyValue } > { formatNumber ( member . averageScoreWhenPresent ) } </ Text >
850854 </ View >
851855 </ View >
852856 </ View >
853- </ View >
854857
855- < View style = { styles . memberTableSection } >
856- < View style = { styles . table } >
857- < View style = { [ styles . tableRow , styles . tableHead ] } >
858- < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '22%' } ] } > Date</ Text >
859- < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '14%' } ] } > Status</ Text >
860- < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : report . section === 'junior' ? '14%' : '64%' } ] } > Score</ Text >
861- { report . section === 'junior' && (
862- < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '25%' } ] } > Uniform</ Text >
863- ) }
864- { report . section === 'junior' && (
865- < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '25%' } ] } > Behaviour</ Text >
866- ) }
867- </ View >
868- { member . meetings . slice ( 0 , 14 ) . map ( ( meeting , index ) => (
869- < View key = { meeting . date } style = { [ styles . tableRow , index % 2 === 1 ? styles . tableRowAlt : null ] } >
870- < Text style = { [ styles . tableCell , { width : '22%' } ] } > { formatDate ( meeting . date ) } </ Text >
871- < Text style = { [ styles . tableCell , { width : '14%' } ] } > { meeting . attended ? 'Present' : 'Absent' } </ Text >
872- < Text style = { [ styles . tableCell , { width : report . section === 'junior' ? '14%' : '64%' } ] } >
873- { meeting . attended ? formatNumber ( meeting . score ) : '-' }
874- </ Text >
858+ < View style = { styles . memberTableSection } >
859+ < View style = { styles . table } >
860+ < View style = { [ styles . tableRow , styles . tableHead ] } >
861+ < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '22%' } ] } > Date</ Text >
862+ < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '14%' } ] } > Status</ Text >
863+ < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : report . section === 'junior' ? '14%' : '64%' } ] } > Score</ Text >
875864 { report . section === 'junior' && (
876- < Text style = { [ styles . tableCell , { width : '25%' } ] } >
877- { meeting . attended ? formatNumber ( meeting . uniformScore ?? 0 ) : '-' }
878- </ Text >
865+ < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '25%' } ] } > Uniform</ Text >
879866 ) }
880867 { report . section === 'junior' && (
881- < Text style = { [ styles . tableCell , { width : '25%' } ] } >
882- { meeting . attended ? formatNumber ( meeting . behaviourScore ?? 0 ) : '-' }
883- </ Text >
868+ < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '25%' } ] } > Behaviour</ Text >
884869 ) }
885870 </ View >
886- ) ) }
887- </ View >
888- </ View >
889- { renderPageFooter ( report ) }
890- </ Page >
891- ) ) }
892-
893- { report . members . flatMap ( ( member ) =>
894- chunk < MemberMeetingRecord > ( member . meetings . slice ( 14 ) , 22 ) . map ( ( meetingChunk , index ) => (
895- < Page key = { `${ member . id } -continued-${ index } ` } size = "A4" style = { styles . page } >
896- { renderPageHeader ( report , `${ member . name } Session Detail Continued` ) }
897- < Text style = { styles . sectionCopy } >
898- Continued meeting-by-meeting record for this member.
899- </ Text >
900- < View style = { styles . table } >
901- < View style = { [ styles . tableRow , styles . tableHead ] } >
902- < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '22%' } ] } > Date</ Text >
903- < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '14%' } ] } > Status</ Text >
904- < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : report . section === 'junior' ? '14%' : '64%' } ] } > Score</ Text >
905- { report . section === 'junior' && (
906- < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '25%' } ] } > Uniform</ Text >
907- ) }
908- { report . section === 'junior' && (
909- < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '25%' } ] } > Behaviour</ Text >
910- ) }
871+ { member . meetings . slice ( 0 , 14 ) . map ( ( meeting , index ) => (
872+ < View key = { meeting . date } style = { [ styles . tableRow , index % 2 === 1 ? styles . tableRowAlt : null ] } >
873+ < Text style = { [ styles . tableCell , { width : '22%' } ] } > { formatDate ( meeting . date ) } </ Text >
874+ < Text style = { [ styles . tableCell , { width : '14%' } ] } > { meeting . attended ? 'Present' : 'Absent' } </ Text >
875+ < Text style = { [ styles . tableCell , { width : report . section === 'junior' ? '14%' : '64%' } ] } >
876+ { meeting . attended ? formatNumber ( meeting . score ) : '-' }
877+ </ Text >
878+ { report . section === 'junior' && (
879+ < Text style = { [ styles . tableCell , { width : '25%' } ] } >
880+ { meeting . attended ? formatNumber ( meeting . uniformScore ?? 0 ) : '-' }
881+ </ Text >
882+ ) }
883+ { report . section === 'junior' && (
884+ < Text style = { [ styles . tableCell , { width : '25%' } ] } >
885+ { meeting . attended ? formatNumber ( meeting . behaviourScore ?? 0 ) : '-' }
886+ </ Text >
887+ ) }
888+ </ View >
889+ ) ) }
911890 </ View >
912- { meetingChunk . map ( ( meeting , meetingIndex ) => (
913- < View key = { meeting . date } style = { [ styles . tableRow , meetingIndex % 2 === 1 ? styles . tableRowAlt : null ] } >
914- < Text style = { [ styles . tableCell , { width : '22%' } ] } > { formatDate ( meeting . date ) } </ Text >
915- < Text style = { [ styles . tableCell , { width : '14%' } ] } > { meeting . attended ? 'Present' : 'Absent' } </ Text >
916- < Text style = { [ styles . tableCell , { width : report . section === 'junior' ? '14%' : '64%' } ] } >
917- { meeting . attended ? formatNumber ( meeting . score ) : '-' }
918- </ Text >
891+ </ View >
892+ { renderPageFooter ( report ) }
893+ </ Page > ,
894+ ...continuationChunks . map ( ( meetingChunk , index ) => (
895+ < Page key = { `${ member . id } -continued-${ index } ` } size = "A4" style = { styles . page } >
896+ { renderPageHeader ( report , `${ member . name } Session Detail Continued` ) }
897+ < Text style = { styles . sectionCopy } >
898+ Continued meeting-by-meeting record for this member.
899+ </ Text >
900+ < View style = { styles . table } >
901+ < View style = { [ styles . tableRow , styles . tableHead ] } >
902+ < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '22%' } ] } > Date</ Text >
903+ < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '14%' } ] } > Status</ Text >
904+ < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : report . section === 'junior' ? '14%' : '64%' } ] } > Score</ Text >
919905 { report . section === 'junior' && (
920- < Text style = { [ styles . tableCell , { width : '25%' } ] } >
921- { meeting . attended ? formatNumber ( meeting . uniformScore ?? 0 ) : '-' }
922- </ Text >
906+ < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '25%' } ] } > Uniform</ Text >
923907 ) }
924908 { report . section === 'junior' && (
925- < Text style = { [ styles . tableCell , { width : '25%' } ] } >
926- { meeting . attended ? formatNumber ( meeting . behaviourScore ?? 0 ) : '-' }
927- </ Text >
909+ < Text style = { [ styles . tableCell , styles . tableHeadCell , { width : '25%' } ] } > Behaviour</ Text >
928910 ) }
929911 </ View >
930- ) ) }
931- </ View >
932- { renderPageFooter ( report ) }
933- </ Page >
934- ) ) ,
935- ) }
912+ { meetingChunk . map ( ( meeting , meetingIndex ) => (
913+ < View key = { meeting . date } style = { [ styles . tableRow , meetingIndex % 2 === 1 ? styles . tableRowAlt : null ] } >
914+ < Text style = { [ styles . tableCell , { width : '22%' } ] } > { formatDate ( meeting . date ) } </ Text >
915+ < Text style = { [ styles . tableCell , { width : '14%' } ] } > { meeting . attended ? 'Present' : 'Absent' } </ Text >
916+ < Text style = { [ styles . tableCell , { width : report . section === 'junior' ? '14%' : '64%' } ] } >
917+ { meeting . attended ? formatNumber ( meeting . score ) : '-' }
918+ </ Text >
919+ { report . section === 'junior' && (
920+ < Text style = { [ styles . tableCell , { width : '25%' } ] } >
921+ { meeting . attended ? formatNumber ( meeting . uniformScore ?? 0 ) : '-' }
922+ </ Text >
923+ ) }
924+ { report . section === 'junior' && (
925+ < Text style = { [ styles . tableCell , { width : '25%' } ] } >
926+ { meeting . attended ? formatNumber ( meeting . behaviourScore ?? 0 ) : '-' }
927+ </ Text >
928+ ) }
929+ </ View >
930+ ) ) }
931+ </ View >
932+ { renderPageFooter ( report ) }
933+ </ Page >
934+ ) ) ,
935+ ] ;
936+ } ) }
936937 </ Document >
937938 ) ;
938939} ;
0 commit comments