代码修改
This commit is contained in:
1 parent
030ede6887
commit
151384b26d
3 files changed
+67
-16
No files matched your search
@@ -230,23 +230,32 @@ function DisposalReal({ data }: { data: DisposalData }) {
|
||||
key={i}
|
||||
className="rounded-md border border-slate-200 bg-slate-50/60 p-4 dark:border-[var(--dash-border)] dark:bg-[var(--dash-elev)]"
|
||||
>
|
||||
{/* 标题行:序号 + 建议内容 + 口径基调 */}
|
||||
<div className="mb-3 flex items-start gap-2.5">
|
||||
{/* 标题行:序号 + 建议内容(基调移到下方独立成行,长文不再挤压标题) */}
|
||||
<div className="flex items-start gap-2.5">
|
||||
<span className="mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-red-600 text-[11px] font-bold text-white">
|
||||
{i + 1}
|
||||
</span>
|
||||
<div className="min-w-0 flex-1 text-xs font-semibold leading-relaxed text-slate-800 dark:text-[var(--dash-text-strong)]">
|
||||
{d.content || "—"}
|
||||
</div>
|
||||
{d.tone && (
|
||||
<span className="shrink-0">
|
||||
<Tag tone="amber">{d.tone}</Tag>
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
{/* 基调:拆成关键词小药丸,整行自适应换行——长基调不再被压成右侧一长条。
|
||||
与序号对齐缩进(序号 20px + gap 10px = 30px)。 */}
|
||||
{d.tone && (
|
||||
<div className="mt-2 flex flex-wrap items-center gap-1.5 pl-[30px]">
|
||||
<span className="text-[11px] font-semibold text-slate-400 dark:text-[var(--dash-text-dim)]">
|
||||
基调
|
||||
</span>
|
||||
{splitTone(d.tone).map((t, ti) => (
|
||||
<Tag key={ti} tone="amber">
|
||||
{t}
|
||||
</Tag>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
{/* 其余字段:带标签两列网格 */}
|
||||
{(d.method || d.effect || d.subject || d.basis) && (
|
||||
<dl className="grid grid-cols-1 gap-x-6 gap-y-2.5 border-t border-dashed border-slate-200 pt-3 dark:border-[var(--dash-border)] sm:grid-cols-2">
|
||||
<dl className="mt-3 grid grid-cols-1 gap-x-6 gap-y-2.5 border-t border-dashed border-slate-200 pt-3 dark:border-[var(--dash-border)] sm:grid-cols-2">
|
||||
{d.method && <Field label="处置方式与步骤" value={d.method} />}
|
||||
{d.effect && <Field label="预期效果" value={d.effect} />}
|
||||
{d.subject && <Field label="主责单位" value={d.subject} />}
|
||||
@@ -262,6 +271,21 @@ function DisposalReal({ data }: { data: DisposalData }) {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 把「基调」串按常见分隔符(顿号 / 逗号 / 斜杠 / 分号 / 竖线 / 空白)拆成关键词数组,去空去重。
|
||||
* 整串无分隔符(单个词或一句话)则原样返回单个元素——既支持「悲愤、追责、人道主义审判」拆成
|
||||
* 三枚药丸,也兼容只有一个基调词的情况。
|
||||
*/
|
||||
function splitTone(raw: string): string[] {
|
||||
const parts = raw
|
||||
.split(/[、,,//;;||\s]+/)
|
||||
.map((s) => s.trim())
|
||||
.filter(Boolean);
|
||||
const seen = new Set<string>();
|
||||
const uniq = parts.filter((p) => (seen.has(p) ? false : (seen.add(p), true)));
|
||||
return uniq.length > 0 ? uniq : [raw.trim()];
|
||||
}
|
||||
|
||||
/** 处置建议卡片里的「标签 + 值」字段(标签红色小字,值正文)。 */
|
||||
function Field({ label, value }: { label: string; value: string }) {
|
||||
const ds = useDesensitize();
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
||||
import { useLocation, useSearchParams } from "react-router-dom";
|
||||
import { toast } from "sonner";
|
||||
import { Loader2, RefreshCw, Sparkles } from "lucide-react";
|
||||
import { Inbox, Loader2, RefreshCw, Sparkles } from "lucide-react";
|
||||
|
||||
import { fetchDashboardInputJson } from "@/core/auth/dashboard-input";
|
||||
import { readCopTaskDetail } from "@/core/auth/task-deeplink";
|
||||
@@ -77,6 +77,16 @@ function deepDesensitize<T>(value: T, fn: (s: string) => string): T {
|
||||
type DashView = "chat" | "page";
|
||||
type RenderMode = "app" | "html";
|
||||
|
||||
/**
|
||||
* 战情报告是否含可展示内容。`parseSqReport` **永远**返回非 null 的 SqReport 对象(各类目可为 null),
|
||||
* 故判空必须看「是否至少有一个类目非空」,不能用 `!!report`——否则全类目皆空时仍误判为有数据,
|
||||
* 进而渲染出 DEMO 兜底的大屏标题 + 空导航 Tab。全空 → 整页走空状态(不渲染大屏标题/导航/页脚)。
|
||||
*/
|
||||
function sqReportHasContent(r: SqReport | null): boolean {
|
||||
if (!r) return false;
|
||||
return !!(r.enemy || r.ours || r.environment || r.judgement || r.decision || r.disposal);
|
||||
}
|
||||
|
||||
/**
|
||||
* 静态页面阶段开关(先按设计图搭总览版式,动态数据后续再接):
|
||||
* - 默认落在「大屏页面」视图,直接展示 SituationOverview 静态版式;
|
||||
@@ -284,9 +294,10 @@ export default function DashboardAgentPage() {
|
||||
}
|
||||
}, [sqReport, desensitizeText]);
|
||||
|
||||
// 是否有可展示的真实数据:战情报告(safeReport)或已生成的大屏(report-json / HTML)。
|
||||
// 三者皆无 → 不渲染大屏的导航栏与标题,仅显示「暂无数据」。
|
||||
const hasData = !!safeReport || !!dashboardData || !!dashboardHtml;
|
||||
// 是否有可展示的真实数据:战情报告**至少一个类目非空**(safeReport 恒为非 null 对象,不能用
|
||||
// `!!safeReport` 判空,见 sqReportHasContent),或已生成的大屏(report-json / HTML)。
|
||||
// 三者皆无 → 不渲染大屏的导航栏与标题,改显示整页空状态。
|
||||
const hasData = sqReportHasContent(safeReport) || !!dashboardData || !!dashboardHtml;
|
||||
|
||||
// 战情多页:总览 + 六个详情页;详情页传入对应的(脱敏后)真实数据(无则页面回退占位)。
|
||||
// 导航 Tab 文本(label)也经 desensitizeText 脱敏后再传给 DashboardApp 渲染导航栏。
|
||||
@@ -410,9 +421,25 @@ export default function DashboardAgentPage() {
|
||||
</div>
|
||||
) : view === "page" ? (
|
||||
!hasData ? (
|
||||
// 无数据:隐藏大屏导航栏与顶部标题,仅显示「暂无数据」。
|
||||
<div className="flex flex-1 items-center justify-center text-sm text-slate-400">
|
||||
暂无数据
|
||||
// 无数据:不渲染大屏标题/导航 Tab/页脚,整页改为一个干净的空状态(图标 + 文案 + 重试)。
|
||||
<div className="flex flex-1 flex-col items-center justify-center px-6 py-16 text-center">
|
||||
<div className="relative mb-5">
|
||||
<div className="absolute inset-0 -z-10 rounded-full bg-rose-100/50 blur-2xl dark:bg-rose-500/10" />
|
||||
<div className="flex h-20 w-20 items-center justify-center rounded-2xl border border-rose-100 bg-gradient-to-b from-rose-50 to-white text-rose-500 shadow-sm dark:border-[var(--dash-border)] dark:from-[var(--dash-card)] dark:to-[var(--dash-page)] dark:text-[var(--dash-primary)]">
|
||||
<Inbox className="h-9 w-9" strokeWidth={1.5} />
|
||||
</div>
|
||||
</div>
|
||||
<h3 className="mb-1.5 text-base font-bold text-slate-700 dark:text-[var(--dash-text-strong)]">
|
||||
暂无大屏数据
|
||||
</h3>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => void initialize()}
|
||||
className="inline-flex items-center gap-1.5 rounded-xl border border-slate-200 bg-white px-4 py-2 text-xs font-bold text-slate-600 shadow-sm transition hover:border-rose-200 hover:text-rose-600 dark:border-[var(--dash-border)] dark:bg-[var(--dash-card)] dark:text-[var(--dash-text)] dark:hover:text-[var(--dash-primary)]"
|
||||
>
|
||||
<RefreshCw className="h-3.5 w-3.5" />
|
||||
重新请求
|
||||
</button>
|
||||
</div>
|
||||
) : renderMode === "html" && htmlBlobUrl ? (
|
||||
<iframe
|
||||
|
||||
Reference in new issue
Block a user