refactor(grades,diagnostic): 成绩和学情诊断模块审计修复
P0-1: 10 个页面补充 requirePermission 权限校验 P0-2: diagnostic/data-access-reports.ts 移除直查 users 表,改用 getUserNamesByIds P0-3: 新增 grade/grades/diagnostic 三组 i18n 翻译文件(zh-CN/en) P0-4: 新增 /management/grade 重定向页面 P1-2: 抽取 toNumber/normalize/buildScopeClassFilter 到 lib/grade-utils.ts P1-3: 为 12 个 Action 新增 Zod safeParse 校验(schema.ts +12 查询 schema) P1-4: 修复 as 断言违规,改用类型守卫函数 P2-2: 移除 diagnostic 组件中 Tailwind 任意值 同步更新架构图文档 004 和 005
This commit is contained in:
@@ -18,6 +18,30 @@ interface GradeDistributionChartProps {
|
||||
data: GradeDistributionResult | null
|
||||
}
|
||||
|
||||
interface DistributionTooltipItem {
|
||||
label: string
|
||||
count: number
|
||||
percentage: number
|
||||
}
|
||||
|
||||
interface DistributionTooltipPayload {
|
||||
payload?: DistributionTooltipItem
|
||||
}
|
||||
|
||||
function isDistributionTooltipPayload(v: unknown): v is DistributionTooltipPayload {
|
||||
if (typeof v !== "object" || v === null) return false
|
||||
const obj = v as Record<string, unknown>
|
||||
const inner = obj.payload
|
||||
if (inner === undefined || inner === null) return true
|
||||
if (typeof inner !== "object") return false
|
||||
const item = inner as Record<string, unknown>
|
||||
return (
|
||||
typeof item.label === "string" &&
|
||||
typeof item.count === "number" &&
|
||||
typeof item.percentage === "number"
|
||||
)
|
||||
}
|
||||
|
||||
export function GradeDistributionChart({ data }: GradeDistributionChartProps) {
|
||||
const isEmpty = !data || data.totalCount === 0
|
||||
|
||||
@@ -64,7 +88,8 @@ export function GradeDistributionChart({ data }: GradeDistributionChartProps) {
|
||||
tooltipClassName="w-[200px]"
|
||||
cellColors={BUCKET_COLORS}
|
||||
tooltipFormatter={(payload: unknown) => {
|
||||
const item = (payload as { payload?: { label: string; count: number; percentage: number } })?.payload
|
||||
if (!isDistributionTooltipPayload(payload)) return null
|
||||
const item = payload.payload
|
||||
if (!item) return null
|
||||
return (
|
||||
<div className="flex w-full flex-col gap-0.5">
|
||||
|
||||
Reference in New Issue
Block a user