- useDashboard hook 改为接受 refetchInterval 动态参数,移除固定 8 秒常量 - Header operations 区域重构为 RadioGroup(手动/10秒/30秒/1分钟/5分钟)+ 倒计时/刷新按钮 - 新增 formatCountdown 工具函数及单元测试 - 新增 .dashboard-refresh-control 和 .dashboard-countdown CSS 类 - 同步更新 DEVELOPMENT.md、README.md、主 specs
66 lines
2.4 KiB
Markdown
66 lines
2.4 KiB
Markdown
## Purpose
|
||
|
||
定义 Header 刷新频率选择器组件的交互行为:频率切换、倒计时显示、手动刷新按钮、布局稳定性。
|
||
|
||
## Requirements
|
||
|
||
### Requirement: 刷新频率选择器
|
||
HeadMenu operations 区域 SHALL 提供 RadioGroup 组件供用户选择刷新频率。
|
||
|
||
#### Scenario: RadioGroup 渲染
|
||
- **WHEN** Dashboard 页面渲染
|
||
- **THEN** HeadMenu operations 区域 SHALL 显示 RadioGroup(theme="button", variant="default-filled"),选项为:手动、10秒、30秒、1分钟、5分钟
|
||
|
||
#### Scenario: 默认选中
|
||
- **WHEN** 页面首次加载
|
||
- **THEN** RadioGroup SHALL 默认选中"30秒"
|
||
|
||
#### Scenario: 切换频率立即刷新
|
||
- **WHEN** 用户切换刷新频率选项
|
||
- **THEN** 系统 SHALL 立即触发一次数据刷新,然后应用新的刷新间隔
|
||
|
||
### Requirement: 倒计时显示
|
||
RadioGroup 右侧 SHALL 显示距下次自动刷新的倒计时文本。
|
||
|
||
#### Scenario: 短时间格式
|
||
- **WHEN** 距下次刷新剩余时间小于 60 秒
|
||
- **THEN** 倒计时 SHALL 显示为"xx秒"格式(如"26秒")
|
||
|
||
#### Scenario: 长时间格式
|
||
- **WHEN** 距下次刷新剩余时间大于等于 60 秒
|
||
- **THEN** 倒计时 SHALL 显示为"x分x秒"格式(如"4分30秒")
|
||
|
||
#### Scenario: 无前缀
|
||
- **WHEN** 倒计时显示
|
||
- **THEN** 倒计时文本 SHALL 不包含任何前缀(如"下一次刷新:"),直接显示时间
|
||
|
||
#### Scenario: 刷新中状态
|
||
- **WHEN** 数据正在刷新(isFetching=true 且 isLoading=false)
|
||
- **THEN** 倒计时文本 SHALL 显示为"刷新中..."
|
||
|
||
### Requirement: 手动刷新按钮
|
||
选择"手动"模式时,倒计时区域 SHALL 替换为刷新按钮。
|
||
|
||
#### Scenario: 手动模式显示按钮
|
||
- **WHEN** 用户选择"手动"刷新频率
|
||
- **THEN** 倒计时区域 SHALL 替换为刷新图标按钮
|
||
|
||
#### Scenario: 点击刷新
|
||
- **WHEN** 用户点击刷新按钮
|
||
- **THEN** 系统 SHALL 触发一次数据刷新
|
||
|
||
#### Scenario: 刷新中禁用
|
||
- **WHEN** 数据正在刷新
|
||
- **THEN** 刷新按钮 SHALL 显示 loading 状态且 disabled,防止连续点击
|
||
|
||
### Requirement: 布局稳定性
|
||
倒计时/按钮容器 SHALL 保持布局稳定,避免内容变化导致的抖动。
|
||
|
||
#### Scenario: 数字等宽
|
||
- **WHEN** 倒计时数字变化
|
||
- **THEN** 容器 SHALL 使用 tabular-nums 字体特性,确保数字等宽不抖动
|
||
|
||
#### Scenario: 格式切换不抖动
|
||
- **WHEN** 倒计时在"秒"和"分秒"格式间切换
|
||
- **THEN** 容器 SHALL 使用 min-width 确保最小宽度,避免 RadioGroup 位移
|