fix(admin): 前端功能与安全修复(角色勾选/月视图新建/附件预览/考勤 late 等)

由 OCR(open-codereview.ai,deepseek-v4-flash)审查驱动修复:
- Roles 多组勾选、Schedules 月视图新建、useDirtyGuard 稳定引用
- JinshujuMatchModal success:false、Attendance store 订阅、EditableCell Enter、DynamicChart 空数据、渲染期 ref
- AttachmentsTab 附件预览不再 window.open(防存储型 XSS)+ 请求乱序防护
- 考勤 late 计入出勤率与主状态

Reviewed-by: OCR (open-codereview.ai)
This commit is contained in:
2026-08-09 21:29:54 +08:00
parent f50301148d
commit a32c0a0731
11 changed files with 134 additions and 49 deletions

View File

@@ -201,11 +201,16 @@ interface ChartPreviewProps {
* renders an ECharts option built from it.
*/
const ChartPreview: React.FC<ChartPreviewProps> = ({ chart }) => {
const option = useMemo<EChartsOption>(() => (chart ? buildOption(chart) : {}), [chart]);
// 空/无数据时先短路,避免 buildOption 在空数据集上执行
const hasData = !!chart && !!chart.rows && chart.rows.length > 0;
const option = useMemo<EChartsOption>(
() => (chart && hasData ? buildOption(chart) : {}),
[chart, hasData],
);
const [instance, setInstance] = useState<EChartsType | null>(null);
if (!chart) return null;
// 空数据集:渲染明确占位,而不是一张空白图
if (!chart.rows || chart.rows.length === 0) {
if (!hasData) {
return (
<div className="ai-chat-chart-card">
<div className="ai-chat-chart-card__header">