+ {tCommon("error.loadFailed", { message: String(error) })} +
+{label}
+{value}
++ {t("analytics.emptyDistribution")} +
+ ); + } + const maxCount = Math.max(...items.map((i) => i.count), 1); + return ( ++ {t("analytics.emptyQuestionAccuracy")} +
+ ); + } + return ( +| {t("analytics.colOrder")} | ++ {t("analytics.colQuestionTitle")} + | ++ {t("analytics.colCorrectRate")} + | ++ {t("analytics.colAvgScore")} + | ++ {t("analytics.colMaxScore")} + | +
|---|---|---|---|---|
| {item.order} | +{item.questionTitle} | ++ + = 0.8 + ? "text-emerald-600" + : item.correctRate >= 0.6 + ? "text-amber-600" + : "text-destructive" + } + > + {formatPercent(item.correctRate)} + + + + + + | +{formatScore(item.avgScore)} | +{formatScore(item.maxScore)} | +
+ {t("analytics.emptyRankings")} +
+ ); + } + return ( +| {t("analytics.colRank")} | ++ {t("analytics.colStudentNo")} + | ++ {t("analytics.colStudentName")} + | ++ {t("analytics.colTotalScore")} + | +{t("analytics.colLevel")} | +
|---|---|---|---|---|
| {item.rank} | +{item.studentNo} | +{item.studentName} | +{formatScore(item.totalScore)} | ++ + {item.level} + + | +
+ {tCommon("error.loadFailed", { message: String(error) })} +
++ {t("build.loadingLibrary")} +
+ ) : error ? ( ++ {t("build.loadLibraryFailed")} +
+ ) : items.length === 0 ? ( ++ {t("build.libraryEmpty")} +
+ ) : ( +{item.content}
++ {item.type} + {item.difficulty} + + {item.score} {t("build.unitScore")} + +
++ {t("build.libraryTotal", { total: data.total })} +
+ ) : null} ++ {t("build.selectedEmpty")} +
+ ) : ( +{node.content}
++ {t("build.previewTotal")} +
+{total}
++ {t("build.previewBaseline", { baseline: totalScoreBaseline })} + {diff !== 0 ? ( + 0 ? "text-amber-600" : "text-destructive"} + > + {" "} + ({diff > 0 ? "+" : ""} + {diff}) + + ) : null} +
++ {t("build.previewPassScore")} +
+{passScore}
++ {t("build.previewTypeBreakdown")} +
+ {Object.keys(typeCounts).length === 0 ? ( +--
+ ) : ( ++ {tCommon("error.loadFailed", { message: String(error) })} +
++ {t("edit.propExamId")} +
+{data.examId}
++ {t("edit.propTotalScore")} +
+{data.totalScore}
++ {t("edit.propQuestionCount")} +
+{data.questionCount}
++ {t("edit.propUpdatedAt")} +
+{data.updatedAt}
++ {t("edit.contractPending")} +
+${text}
`; + case "question": { + const order = node.order as number; + const options = (node.options as string[]) ?? []; + const optsHtml = options.map((opt) => `