3.4 KiB
3.4 KiB
选股执行状态抽屉与紧凑布局技术设计
1. Boundaries
本任务的产品边界在 zhixing-web:
SelectionResultsPage继续拥有执行状态、当前结果和局部抽屉开关状态。features/selection/components新增执行状态抽屉与未完成评估表格,组件只消费SelectionFailure等 feature 类型。PageLayout负责收紧跨页面的内容节奏;选股页面负责工作台内部的密度和滚动边界。shared/ui/dialog.tsx作为底层弹层 primitive 复用,不新增后端或全局状态。
不改变 API adapter、query key、TanStack Query 状态和路由 search 参数。
2. Component Shape
建议的组件关系:
SelectionResultsPage
├─ PageLayout
│ ├─ ExecutionToolbar
│ ├─ ResultMetrics(onOpenExecutionStatus)
│ └─ ResultState
│ └─ SelectionResultsWorkbench
└─ ExecutionStatusDrawer
├─ status summary
└─ IncompleteEvaluationTable
FailureList 从 ResultState 移除。ResultMetrics 的执行状态入口通过回调通知页面,不把 Dialog 状态放进 Zustand,也不把失败列表复制到本地 state。
抽屉使用 Dialog 的受控 open/onOpenChange,通过 feature 局部 class 将 popup 定位到右侧、设置 width: min(600px, 100vw)、height: 100svh 和紧凑边框圆角。这样保留 Base UI 的焦点陷阱、Escape 和遮罩语义,同时避免为一次性业务交互新增浅层 shared primitive。
3. Data Flow
SelectionResults.failures
│
├─ ResultMetrics: failure count/status trigger
└─ ExecutionStatusDrawer: read-only props
└─ IncompleteEvaluationTable: rows
抽屉不请求数据、不轮询、不修改 URL。抽屉展示的每一行直接对应 SelectionFailure,状态和原因只做前端文案格式化;缺失原因显示 —。
4. Layout and Density
Desktop
AppLayout → main → PageLayout → ResultState → workbench保持连续的flex: 1、min-height: 0高度链。- 操作区、指标区、筛选栏、分页均使用
shrink-0。 - 主从工作台使用剩余空间;表格
overflow-auto,分页留在面板底部。 - 页面 gutter 由当前 24px 收紧为 16px 级别;内部 panel/filter/detail 使用 8–16px 级别的间距。
Mobile
- 保留日期、策略、执行按钮的语义和触控尺寸,不为了压缩而降低到桌面 32px。
- 内容容器采用紧凑 gutter 和较小 section gap;页面恢复自然滚动。
- 抽屉宽度随视口收缩,不产生横向溢出;表格必要时只在抽屉内部横向处理长文本,优先让原因换行。
5. Compatibility and Rollback
- 旧结果结构仍可直接渲染;只有失败列表的呈现位置改变。
- 若 Drawer 样式影响 Base UI Dialog,可回退为同一受控 Dialog 的居中呈现,不影响数据流和页面其他交互。
- 若高度链修复造成无结果/错误状态被压缩,保留这些状态的最小可读高度,并只让成功结果工作台承担剩余高度。
6. Verification Strategy
- 页面测试:抽屉打开、表格内容、空表状态、关闭和焦点入口;确认主页面不再直接渲染失败卡片。
- 质量门禁:Prettier、ESLint、TypeScript、Vitest、Vite build。
- 浏览器:使用可控 mock 结果验证 1440×900、1280×800、390×844、375×812;检查抽屉宽度、分页底部位置、数据区滚动和无水平溢出。