172 lines
4.8 KiB
TypeScript
172 lines
4.8 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 { StyleSheet } from "@react-pdf/renderer";
|
|
import TestReportFooter from "./test.report.footer";
|
|
const customStyles = StyleSheet.create({
|
|
testDetails: {
|
|
display: "flex",
|
|
gap: 4,
|
|
},
|
|
});
|
|
|
|
interface Props {
|
|
date: string;
|
|
name: string;
|
|
email: string;
|
|
id: string;
|
|
gender?: string;
|
|
testDetails: ModuleScore[];
|
|
summary: string;
|
|
logo: string;
|
|
qrcode: string;
|
|
renderDetails: React.ReactNode;
|
|
title: string;
|
|
summaryPNG: string;
|
|
summaryScore: string;
|
|
}
|
|
|
|
const TestReport = ({
|
|
title,
|
|
date,
|
|
name,
|
|
email,
|
|
id,
|
|
gender,
|
|
testDetails,
|
|
summary,
|
|
logo,
|
|
qrcode,
|
|
renderDetails,
|
|
summaryPNG,
|
|
summaryScore,
|
|
}: Props) => {
|
|
const defaultTextStyle = [styles.textFont, { fontSize: 8 }];
|
|
const defaultSkillsTextStyle = [styles.textFont, { fontSize: 8 }];
|
|
const defaultSkillsTitleStyle = [
|
|
styles.textFont,
|
|
styles.textColor,
|
|
styles.textBold,
|
|
{ fontSize: 7 },
|
|
];
|
|
return (
|
|
<Document>
|
|
<Page style={styles.body}>
|
|
<View style={styles.alignRightRow}>
|
|
<Image src={logo} fixed style={styles.image64} />
|
|
</View>
|
|
<View style={styles.titleView}>
|
|
<Text
|
|
style={[
|
|
styles.textFont,
|
|
styles.textBold,
|
|
styles.textColor,
|
|
styles.textUnderline,
|
|
styles.title,
|
|
{ fontSize: 14 },
|
|
]}
|
|
>
|
|
{title}
|
|
</Text>
|
|
</View>
|
|
<View style={styles.textMargin}>
|
|
<Text style={defaultTextStyle}>Date of Test: {date}</Text>
|
|
</View>
|
|
<Text style={[styles.textFont, styles.textBold, { fontSize: 11 }]}>
|
|
Candidate Information:
|
|
</Text>
|
|
<View style={styles.textMargin}>
|
|
<Text style={defaultTextStyle}>Name: {name}</Text>
|
|
<Text style={defaultTextStyle}>ID: {id}</Text>
|
|
<Text style={defaultTextStyle}>Email: {email}</Text>
|
|
<Text style={defaultTextStyle}>Gender: {gender}</Text>
|
|
</View>
|
|
<View style={{ height: "120px" }}>
|
|
<Text
|
|
style={[
|
|
styles.textFont,
|
|
styles.textBold,
|
|
styles.textColor,
|
|
{ fontSize: 12 },
|
|
]}
|
|
>
|
|
Test Details:
|
|
</Text>
|
|
<View>{renderDetails}</View>
|
|
</View>
|
|
<View>
|
|
<Text
|
|
style={[
|
|
styles.textFont,
|
|
styles.textBold,
|
|
styles.textColor,
|
|
{ fontSize: 12 },
|
|
]}
|
|
>
|
|
Performance Summary
|
|
</Text>
|
|
<View style={{ display: "flex", flexDirection: "row", gap: 16 }}>
|
|
<View style={{ flex: 1 }}>
|
|
<Text style={[styles.textFont, { fontSize: 8 }]}>{summary}</Text>
|
|
</View>
|
|
<View style={[styles.textFont, styles.radialContainer]}>
|
|
<Image src={summaryPNG} style={styles.image64}></Image>
|
|
<View style={[styles.textColor, styles.radialResultContainer]}>
|
|
<Text style={styles.textBold}>{summaryScore}</Text>
|
|
</View>
|
|
</View>
|
|
</View>
|
|
</View>
|
|
<View style={[{ paddingTop: 30 }, styles.separator]}></View>
|
|
<TestReportFooter />
|
|
</Page>
|
|
<Page style={styles.body}>
|
|
<View>
|
|
<Text
|
|
style={[
|
|
styles.textFont,
|
|
styles.textBold,
|
|
styles.textColor,
|
|
styles.textUnderline,
|
|
{ fontSize: 12, paddingTop: 10 },
|
|
]}
|
|
>
|
|
Skills Feedback
|
|
</Text>
|
|
<View
|
|
style={{
|
|
paddingTop: 10,
|
|
gap: 8,
|
|
}}
|
|
>
|
|
{testDetails
|
|
.filter(
|
|
({ suggestions, evaluation }) => suggestions || evaluation
|
|
)
|
|
.map(({ module, suggestions, evaluation }) => (
|
|
<View key={module} style={customStyles.testDetails}>
|
|
<Text style={[...defaultSkillsTitleStyle, styles.textBold]}>
|
|
{module}
|
|
</Text>
|
|
<Text style={defaultSkillsTextStyle}>{evaluation}</Text>
|
|
<Text style={defaultSkillsTextStyle}>{suggestions}</Text>
|
|
</View>
|
|
))}
|
|
</View>
|
|
<View style={styles.alignRightRow}>
|
|
<Image src={qrcode} style={styles.qrcode} />
|
|
</View>
|
|
</View>
|
|
<View style={[{ paddingBottom: 30 }, styles.separator]}></View>
|
|
<View style={{ flexGrow: 1 }}></View>
|
|
<TestReportFooter />
|
|
</Page>
|
|
</Document>
|
|
);
|
|
};
|
|
|
|
export default TestReport;
|