236 lines
7.0 KiB
TypeScript
236 lines
7.0 KiB
TypeScript
/* eslint-disable jsx-a11y/alt-text */
|
|
import React from "react";
|
|
import { Document, Page, View, Text, Image } from "@react-pdf/renderer";
|
|
import { ModuleScore } from "@/interfaces/module.scores";
|
|
import { styles } from "./styles";
|
|
import TestReportFooter from "./test.report.footer";
|
|
|
|
import { StyleSheet } from "@react-pdf/renderer";
|
|
|
|
const customStyles = StyleSheet.create({
|
|
testDetails: {
|
|
display: "flex",
|
|
gap: 4,
|
|
},
|
|
testDetailsContainer: {
|
|
display: "flex",
|
|
gap: 16,
|
|
},
|
|
table: {
|
|
width: "100%",
|
|
},
|
|
tableRow: {
|
|
flexDirection: "row",
|
|
},
|
|
tableCol70: {
|
|
width: "70%", // First column width (50%)
|
|
borderStyle: "solid",
|
|
borderWidth: 1,
|
|
borderColor: "#000",
|
|
// padding: 5,
|
|
},
|
|
tableCol25: {
|
|
width: "16.67%", // Remaining four columns each get 1/6 of the total width (50% / 3 = 16.67%)
|
|
borderStyle: "solid",
|
|
borderWidth: 1,
|
|
borderColor: "#000",
|
|
padding: 5,
|
|
},
|
|
tableCol20: {
|
|
width: "20%", // Width for each of the 5 sub-columns (50% / 5 = 20%)
|
|
borderStyle: "solid",
|
|
borderWidth: 1,
|
|
borderColor: "#000",
|
|
padding: 5,
|
|
},
|
|
tableCol10: {
|
|
width: "10%", // Width for each of the 5 sub-columns (50% / 5 = 20%)
|
|
borderStyle: "solid",
|
|
borderWidth: 1,
|
|
borderColor: "#000",
|
|
padding: 5,
|
|
},
|
|
tableCellHeader: {
|
|
fontSize: 12,
|
|
textAlign: "center",
|
|
},
|
|
tableCellHeaderColor: {
|
|
backgroundColor: "#d3d3d3",
|
|
},
|
|
tableCell: {
|
|
fontSize: 10,
|
|
textAlign: "center",
|
|
},
|
|
});
|
|
|
|
interface Props {
|
|
date: string;
|
|
name: string;
|
|
email: string;
|
|
id: string;
|
|
gender?: string;
|
|
passportId: string;
|
|
corporateName: string;
|
|
downloadDate: string;
|
|
userId: string;
|
|
uniqueExercises: { name: string; result: string }[];
|
|
timeSpent: string;
|
|
score: string;
|
|
}
|
|
|
|
const LevelTestReport = ({
|
|
date,
|
|
name,
|
|
email,
|
|
id,
|
|
gender,
|
|
passportId,
|
|
corporateName,
|
|
downloadDate,
|
|
userId,
|
|
uniqueExercises,
|
|
timeSpent,
|
|
score,
|
|
}: Props) => {
|
|
const defaultTextStyle = [styles.textFont, { fontSize: 8 }];
|
|
return (
|
|
<Document>
|
|
<Page style={styles.body} orientation="landscape">
|
|
<Text style={[styles.textFont, styles.textBold, { fontSize: 11 }]}>
|
|
Corporate Name: {corporateName}
|
|
</Text>
|
|
<View style={styles.textMargin}>
|
|
<Text style={defaultTextStyle}>
|
|
Report Download date: {downloadDate}
|
|
</Text>
|
|
</View>
|
|
<Text style={[styles.textFont, styles.textBold, { fontSize: 11 }]}>
|
|
Test Information: {id}
|
|
</Text>
|
|
<View style={styles.textMargin}>
|
|
<Text style={defaultTextStyle}>Date of Test: {date}</Text>
|
|
<Text style={defaultTextStyle}>Candidates name: {name}</Text>
|
|
<Text style={defaultTextStyle}>Email: {email}</Text>
|
|
<Text style={defaultTextStyle}>National ID: {passportId}</Text>
|
|
|
|
<Text style={defaultTextStyle}>Gender: {gender}</Text>
|
|
<Text style={defaultTextStyle}>Candidate ID: {userId}</Text>
|
|
</View>
|
|
|
|
<View style={customStyles.table}>
|
|
{/* Header Row */}
|
|
<View style={customStyles.tableRow}>
|
|
<View
|
|
style={[
|
|
customStyles.tableCol70,
|
|
customStyles.tableCellHeaderColor,
|
|
]}
|
|
>
|
|
<Text style={[customStyles.tableCellHeader, { padding: 5 }]}>
|
|
Test sections
|
|
</Text>
|
|
</View>
|
|
<View
|
|
style={[
|
|
customStyles.tableCol20,
|
|
customStyles.tableCellHeaderColor,
|
|
]}
|
|
>
|
|
<Text style={customStyles.tableCellHeader}>Time spent</Text>
|
|
</View>
|
|
<View
|
|
style={[
|
|
customStyles.tableCol10,
|
|
customStyles.tableCellHeaderColor,
|
|
]}
|
|
>
|
|
<Text style={customStyles.tableCellHeader}>Score</Text>
|
|
</View>
|
|
</View>
|
|
<View style={customStyles.tableRow}>
|
|
<View style={customStyles.tableCol70}>
|
|
<View style={customStyles.tableRow}>
|
|
{uniqueExercises.map((exercise, index) => (
|
|
<View
|
|
style={[
|
|
customStyles.tableCol20,
|
|
index !== uniqueExercises.length - 1
|
|
? { borderWidth: 0, borderRightWidth: 1 }
|
|
: { borderWidth: 0 },
|
|
]}
|
|
key={index}
|
|
>
|
|
<Text style={customStyles.tableCell}>Part {index + 1}</Text>
|
|
</View>
|
|
))}
|
|
</View>
|
|
</View>
|
|
<View style={customStyles.tableCol20}>
|
|
<Text style={customStyles.tableCell}></Text>
|
|
</View>
|
|
<View style={customStyles.tableCol10}>
|
|
<Text style={customStyles.tableCell}></Text>
|
|
</View>
|
|
</View>
|
|
|
|
<View style={customStyles.tableRow}>
|
|
<View style={customStyles.tableCol70}>
|
|
<View style={customStyles.tableRow}>
|
|
{uniqueExercises.map((exercise, index) => (
|
|
<View
|
|
style={[
|
|
customStyles.tableCol20,
|
|
index !== uniqueExercises.length - 1
|
|
? { borderWidth: 0, borderRightWidth: 1 }
|
|
: { borderWidth: 0 },
|
|
]}
|
|
key={index}
|
|
>
|
|
<Text style={customStyles.tableCell}>{exercise.name}</Text>
|
|
</View>
|
|
))}
|
|
</View>
|
|
</View>
|
|
<View style={customStyles.tableCol20}>
|
|
<Text style={customStyles.tableCell}></Text>
|
|
</View>
|
|
<View style={customStyles.tableCol10}>
|
|
<Text style={customStyles.tableCell}></Text>
|
|
</View>
|
|
</View>
|
|
<View style={customStyles.tableRow}>
|
|
<View style={customStyles.tableCol70}>
|
|
<View style={customStyles.tableRow}>
|
|
{uniqueExercises.map((exercise, index) => (
|
|
<View
|
|
style={[
|
|
customStyles.tableCol20,
|
|
index !== uniqueExercises.length - 1
|
|
? { borderWidth: 0, borderRightWidth: 1 }
|
|
: { borderWidth: 0 },
|
|
]}
|
|
key={index}
|
|
>
|
|
<Text style={customStyles.tableCell}>
|
|
{exercise.result}
|
|
</Text>
|
|
</View>
|
|
))}
|
|
</View>
|
|
</View>
|
|
<View style={customStyles.tableCol20}>
|
|
<Text style={customStyles.tableCell}>{timeSpent}</Text>
|
|
</View>
|
|
<View style={customStyles.tableCol10}>
|
|
<Text style={customStyles.tableCell}>{score}</Text>
|
|
</View>
|
|
</View>
|
|
</View>
|
|
<TestReportFooter userId={userId} />
|
|
</Page>
|
|
</Document>
|
|
);
|
|
};
|
|
|
|
export default LevelTestReport;
|