feat(ai-analysis): 添加详情页智能分析入口
Some checks failed
Deploy Production / Build, push, deploy, verify (push) Has been cancelled
Some checks failed
Deploy Production / Build, push, deploy, verify (push) Has been cancelled
This commit is contained in:
@@ -19,6 +19,8 @@ import { calcGroupProgress as calcDevTaskProgress, aggregateDevTaskHours } from
|
||||
import { CapsuleStages } from '@/components/version/CapsuleStages';
|
||||
import { MemberChips } from '@/components/version/MemberChips';
|
||||
import { ProjectMemberPanel } from '@/components/project/ProjectMemberPanel';
|
||||
import { AnalysisContextDrawer } from '@/components/analysis/AnalysisContextDrawer';
|
||||
import { AnalysisEntryButton } from '@/components/analysis/AnalysisEntryButton';
|
||||
import { getRequirementCoverageSummary, type VersionPlan } from '@/lib/version-plan';
|
||||
import { buildVersionTimelineSummary, calcStageEffortMetrics, formatVersionOverviewDateTime, getVersionCardDefaultExpanded, mergeStageProgressWithEffort } from '@/lib/version-overview';
|
||||
import { calcScopedVersionProgress } from '@/lib/version-progress';
|
||||
@@ -327,6 +329,7 @@ export default function ProjectDetailPage() {
|
||||
const { testCases, fetchTestCases } = useTestCaseStore();
|
||||
const { bugs, fetchBugs } = useBugStore();
|
||||
const [statusFilter, setStatusFilter] = useState<string>('all');
|
||||
const [showAnalysisDrawer, setShowAnalysisDrawer] = useState(false);
|
||||
|
||||
useEffect(() => { fetchOverview(); }, [fetchOverview]);
|
||||
useEffect(() => { fetchRequirements(); }, [fetchRequirements]);
|
||||
@@ -340,6 +343,10 @@ export default function ProjectDetailPage() {
|
||||
const user = useAuthStore((s) => s.user);
|
||||
const currentUserName = user?.name || '';
|
||||
const { roles } = useMemberStore();
|
||||
const currentPermissions = useMemo(
|
||||
() => roles.find((role) => role.id === user?.roleId)?.permissions ?? [],
|
||||
[roles, user?.roleId],
|
||||
);
|
||||
const isSuperAdmin = useMemo(() => {
|
||||
const r = roles.find((x) => x.id === user?.roleId);
|
||||
return !!r && r.permissions.includes('*');
|
||||
@@ -435,8 +442,11 @@ export default function ProjectDetailPage() {
|
||||
<span className="ml-2 text-[var(--ink-muted)]">/</span>
|
||||
<span className="ml-2 text-[15px] font-semibold text-[var(--ink)]">{project.name}</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-1.5 rounded-full bg-[var(--bg-subtle)] px-2.5 py-1 text-xs text-[var(--ink-soft)]">
|
||||
<Package className="h-3 w-3" /><span>{project.productName}</span>
|
||||
<div className="flex items-center gap-2">
|
||||
<AnalysisEntryButton onClick={() => setShowAnalysisDrawer(true)} />
|
||||
<div className="flex items-center gap-1.5 rounded-full bg-[var(--bg-subtle)] px-2.5 py-1 text-xs text-[var(--ink-soft)]">
|
||||
<Package className="h-3 w-3" /><span>{project.productName}</span>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
@@ -482,6 +492,13 @@ export default function ProjectDetailPage() {
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
<AnalysisContextDrawer
|
||||
open={showAnalysisDrawer}
|
||||
title={`项目智能分析 · ${project.name}`}
|
||||
context={{ surface: 'project_detail', projectId: project.id }}
|
||||
permissions={currentPermissions}
|
||||
onClose={() => setShowAnalysisDrawer(false)}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user