[CLAUDE] FE-User: YC-030 Q1/Q2/Q3 — my-contracts layout KHKK-thuần (ContractListPanel) + panel duyệt 3 món + máy duyệt về panel-3 (5 host ×2 app)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-08-12 21:58:08 +07:00
parent 698603625b
commit 59cb121738
12 changed files with 895 additions and 338 deletions

View File

@ -4,6 +4,7 @@
import { useQuery } from '@tanstack/react-query'
import { useNavigate, useParams } from 'react-router-dom'
import { ContractDetailContent } from '@/components/contracts/ContractDetailContent'
import { ContractWorkflowPanel } from '@/components/contracts/ContractWorkflowPanel'
import { WorkflowHistoryPanel } from '@/components/contracts/WorkflowHistoryPanel'
import { api } from '@/lib/api'
import type { ContractDetail } from '@/types/contracts'
@ -27,7 +28,14 @@ export function ContractDetailPage() {
<div className="lg:col-span-2">
<ContractDetailContent contract={detail.data} onBack={() => navigate(-1)} />
</div>
<aside>
<aside className="space-y-4">
{/* [WQ3b S190 · YC-030 Q5] Máy duyệt V2 dời từ ContractDetailContent ra host —
vị trí cột-cạnh khuôn KHKK, không nhân đôi bộ nút. */}
{detail.data.approvalWorkflowId != null && (
<section className="rounded-lg border border-brand-200 bg-white p-5">
<ContractWorkflowPanel contract={detail.data} />
</section>
)}
<WorkflowHistoryPanel contract={detail.data} />
</aside>
</div>

View File

@ -16,6 +16,7 @@ import { useQuery } from '@tanstack/react-query'
import { useNavigate, useSearchParams } from 'react-router-dom'
import { FileText, Search } from 'lucide-react'
import { ContractDetailContent } from '@/components/contracts/ContractDetailContent'
import { ContractWorkflowPanel } from '@/components/contracts/ContractWorkflowPanel'
import { WorkflowHistoryPanel } from '@/components/contracts/WorkflowHistoryPanel'
import { PipelineTreePanel } from '@/components/pipeline/PipelineTreePanel'
import { PhaseBadge } from '@/components/PhaseBadge'
@ -263,7 +264,17 @@ export function ContractsListPage() {
{/* [gate F-1/F-2] Panel-3 TỰ CUỘN ⇒ thân cây `lg:max-h-none` giữ đúng 1 thanh cuộn;
sticky/self-start của khuôn vô hiệu ở host display:block này — by-design. */}
{!selectedId && <PipelineTreePanel currentStage={3} bodyMaxHClass="max-h-[28rem] lg:max-h-none" />}
{selectedId && detail.data && <WorkflowHistoryPanel contract={detail.data} />}
{selectedId && detail.data && (
<div className="space-y-4">
{/* [WQ3b S190 · YC-030 Q5] Máy duyệt V2 dời từ ContractDetailContent ra host. */}
{detail.data.approvalWorkflowId != null && (
<section className="rounded-lg border border-brand-200 bg-white p-5">
<ContractWorkflowPanel contract={detail.data} />
</section>
)}
<WorkflowHistoryPanel contract={detail.data} />
</div>
)}
</aside>
</div>
</div>