Merged in pdf-bullet-points (pull request #48)

Added support for PDF bulletpoints

Approved-by: Tiago Ribeiro
This commit is contained in:
João Ramos
2024-03-24 23:51:53 +00:00
committed by Tiago Ribeiro
4 changed files with 75 additions and 11 deletions

View File

@@ -0,0 +1,24 @@
import { Text, View, StyleSheet } from "@react-pdf/renderer";
const styles = StyleSheet.create({
row: {
display: "flex",
flexDirection: "row",
},
bullet: {
height: "100%",
},
});
const ListItem = ({ text, textStyle }: { text: string, textStyle: any[] }) => {
return (
<View style={styles.row}>
<View style={styles.bullet}>
<Text style={textStyle}>{"\u2022" + " "}</Text>
</View>
<Text style={textStyle}>{text}</Text>
</View>
);
};
export default ListItem;

View File

@@ -6,11 +6,17 @@ import { styles } from "./styles";
import { StyleSheet } from "@react-pdf/renderer"; import { StyleSheet } from "@react-pdf/renderer";
import TestReportFooter from "./test.report.footer"; import TestReportFooter from "./test.report.footer";
import ListItem from "./list.item";
const customStyles = StyleSheet.create({ const customStyles = StyleSheet.create({
testDetails: { testDetails: {
display: "flex", display: "flex",
gap: 4, gap: 4,
}, },
testDetailsContainer: {
display: "flex",
gap: 16,
},
}); });
interface Props { interface Props {
@@ -124,7 +130,7 @@ const TestReport = ({
</View> </View>
</View> </View>
<View style={[{ paddingTop: 30 }, styles.separator]}></View> <View style={[{ paddingTop: 30 }, styles.separator]}></View>
<TestReportFooter userId={id}/> <TestReportFooter userId={id} />
</Page> </Page>
<Page style={styles.body}> <Page style={styles.body}>
<View> <View>
@@ -149,15 +155,46 @@ const TestReport = ({
.filter( .filter(
({ suggestions, evaluation }) => suggestions || evaluation ({ suggestions, evaluation }) => suggestions || evaluation
) )
.map(({ module, suggestions, evaluation }) => ( .map(
<View key={module} style={customStyles.testDetails}> ({
<Text style={[...defaultSkillsTitleStyle, styles.textBold]}> module,
{module} suggestions,
</Text> evaluation,
<Text style={defaultSkillsTextStyle}>{evaluation}</Text> bullet_points = [],
<Text style={defaultSkillsTextStyle}>{suggestions}</Text> }) => (
</View> <View key={module} style={customStyles.testDetailsContainer}>
))} <View style={customStyles.testDetails}>
<Text
style={[...defaultSkillsTitleStyle, styles.textBold]}
>
{module}
</Text>
<Text style={defaultSkillsTextStyle}>{evaluation}</Text>
<Text style={defaultSkillsTextStyle}>{suggestions}</Text>
</View>
<View style={customStyles.testDetails}>
{bullet_points.length > 0 && (
<>
<Text
style={defaultSkillsTitleStyle}
>
How to Improve:
</Text>
<View>
{bullet_points.map((text: string) => (
<ListItem
key={text}
text={text}
textStyle={defaultSkillsTextStyle}
/>
))}
</View>
</>
)}
</View>
</View>
)
)}
</View> </View>
<View style={styles.alignRightRow}> <View style={styles.alignRightRow}>
<Image src={qrcode} style={styles.qrcode} /> <Image src={qrcode} style={styles.qrcode} />
@@ -165,7 +202,7 @@ const TestReport = ({
</View> </View>
<View style={[{ paddingBottom: 30 }, styles.separator]}></View> <View style={[{ paddingBottom: 30 }, styles.separator]}></View>
<View style={{ flexGrow: 1 }}></View> <View style={{ flexGrow: 1 }}></View>
<TestReportFooter userId={id}/> <TestReportFooter userId={id} />
</Page> </Page>
</Document> </Document>
); );

View File

@@ -8,6 +8,7 @@ export interface ModuleScore {
png?: string; png?: string;
evaluation?: string; evaluation?: string;
suggestions?: string; suggestions?: string;
bullet_points?: string[];
} }
export interface StudentData { export interface StudentData {

View File

@@ -79,6 +79,7 @@ interface SkillsFeedbackRequest {
interface SkillsFeedbackResponse extends SkillsFeedbackRequest { interface SkillsFeedbackResponse extends SkillsFeedbackRequest {
evaluation: string; evaluation: string;
suggestions: string; suggestions: string;
bullet_points?: string[];
} }
const getSkillsFeedback = async (sections: SkillsFeedbackRequest[]) => { const getSkillsFeedback = async (sections: SkillsFeedbackRequest[]) => {
@@ -225,6 +226,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) {
...result, ...result,
evaluation: feedback?.evaluation, evaluation: feedback?.evaluation,
suggestions: feedback?.suggestions, suggestions: feedback?.suggestions,
bullet_points: feedback?.bullet_points,
}; };
} }