Skip to content
This repository was archived by the owner on May 30, 2026. It is now read-only.

Commit 1ceac67

Browse files
committed
Keep member continuation pages inline
1 parent 2635be5 commit 1ceac67

1 file changed

Lines changed: 139 additions & 138 deletions

File tree

components/reports/SessionReportDocument.tsx

Lines changed: 139 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)