- 新增布局管理器支持拖拽调整面板宽度 - 新增状态管理器实现布局持久化 - 重构前端页面结构优化四栏式布局 - 新增 Jest 测试框架和完整测试用例 - 完善项目文档(PRD/FD/TDD/TODO/LOG) - 清理 Python 缓存文件并更新 .gitignore Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6.0 KiB
6.0 KiB
执行日志:可调整布局系统(00003)
- 日期:2026-02-27
- 目的:按
docs/TODO/TODO-可调整布局系统.md推进未完成项(阶段五/六为主),补齐 恢复默认布局(F3)/窗口尺寸适配(F5)/键盘可访问性(F6),并用可验证证据(测试/文档)确保不回归主业务功能。
2026-02-27
启动记录
- 本轮开始依据的目标文档:
docs/TODO/TODO-可调整布局系统.md - 约束:
- 不引入前端构建链(保持零构建、外链 CSS/JS)。
- 现有主业务功能(分组/账号/邮件)行为不回归。
- 关键路径用 Jest(
tests/layout-system/)提供可验证证据。
计划推进范围
- 阶段五:恢复默认布局(F3.1~F3.4)
- 阶段六:窗口适配与键盘支持(F5.1
F5.3、F6.1F6.4)
阶段五(进行中):恢复默认布局(F3)
- 决策:沿用现有
.modal/.show交互模式(与 addGroup/addAccount 等一致),不引入新依赖;重置逻辑在LayoutManager.resetLayout()内完成,且显式取消未到期的保存防抖,避免“重置后又被定时器写回”导致 localStorage 未真正清空。
产出
- 导航栏增加恢复按钮:
templates/index.html
- 恢复确认对话框:
templates/partials/modals.html(#resetLayoutModal)
- 重置动画与按钮样式:
static/css/layout.css(.layout-resetting、.reset-layout-btn、#resetLayoutModal .text-muted)
- 重置逻辑与动画封装:
static/js/layout-manager.js(resetLayout()、withResettingAnimation()、debounce 增加cancel())
- UI 绑定(show/hide/confirm + ESC 关闭):
static/js/layout-bootstrap.js
阶段六(进行中):窗口适配与键盘支持(F5/F6)
- 决策:
- 窗口适配以
LayoutManager统一处理:resize防抖 200ms(FD F5.1),断点自动折叠/恢复仅作用于 autoCollapsed 面板(避免覆盖用户手动折叠偏好)。 - 键盘宽度调整直接复用
calculateNewWidth(),确保与鼠标拖动共享同一套最小/最大/详情最小宽度约束。 - 兼容既有“移动端隐藏列表”逻辑:隐藏时同步将 Grid 列宽置 0,避免出现“元素 display:none 但列宽仍占位”的空白列回归。
- 窗口适配以
产出
- 窗口适配 + 键盘调整:
static/js/layout-manager.js(handleWindowResize()、onWindowResize()、onResizerKeydown()、expandPanel(panelType, auto))
- 业务隐藏邮件列表与 Grid 列宽联动:
static/js/features/emails.js(syncEmailListVisibility(),替换原.hidden仅改 display 的实现)
验证
- 布局系统 Jest(含新增 F3/F5/F6 用例):
npm test通过(11 suites / 93 tests) - 全量 Python 单测回归:
python -m unittest discover -s tests -v通过(95 tests)
UI 问题修复:窄屏下“全部折叠后无法再展开”(F2/F5 交互回归)
现象
- 当窗口较窄(触发
@media (max-width: 768px))且 LayoutManager 自动折叠/用户折叠侧边栏后:- 分组面板 / 账号面板的折叠指示器会被一起移出屏幕(left 为负值),导致用户看起来“面板消失且再也打不开”。
- 若同时触发业务侧的“隐藏邮件列表”(
.email-list-panel.hidden),则左侧三个区域都不可恢复,交互卡死。
根因定位
static/css/main.css在窄屏下仍保留历史规则:.group-panel,.account-panel { position: fixed; left:-280px; }- 新的可调整布局系统(
static/js/layout-manager.js)在折叠时把 Grid 列宽置 0,并依赖 折叠指示器 提供“展开入口”。 - 当历史规则把面板整体移出屏幕时,折叠指示器作为面板子元素也一并移出,造成不可展开。
修复方案
- 在布局系统初始化时,为
<html>添加标记类:layout-system-enabled。 - 将窄屏历史侧栏滑入样式限定在 “布局系统未启用” 的场景:
- 仅对
html:not(.layout-system-enabled)生效,避免影响 LayoutManager 的折叠/指示器逻辑。
- 仅对
变更点
static/js/layout-bootstrap.js:LayoutManager 初始化前添加layout-system-enabled。static/css/main.css:@media (max-width: 768px)内的.group-panel/.account-panel固定定位规则增加html:not(.layout-system-enabled)限定。
验证
npm test通过(11 suites / 93 tests)。- Playwright 窄屏复现验证(viewport=600):
- 修复前:groups/accounts 指示器
x < 0(不可见) - 修复后:groups/accounts/emails 指示器分别落在
x=0/48/96(可见且可点击展开)
- 修复前:groups/accounts 指示器
UI 问题修复:折叠后页面出现滚动条、指示器高度观感异常(“太长”)
现象
- 在桌面宽屏下手动折叠侧边栏(如:账号/邮件列表)后,页面右侧出现 body 滚动条。
- 因 body 被撑出滚动高度,用户会看到主容器整体被滚动,折叠指示器与布局区域的高度/对齐出现“太长/不正确”的观感。
根因定位
- 折叠时 Grid 列宽被置为
0px(layout-width),但我们仅用opacity:0隐藏面板内容:- 面板内容仍参与布局计算;
- 在
0宽度下文本/控件会被强制换行,导致折叠面板内部出现异常的“高度溢出”; - 溢出内容默认
overflow: visible,会把 body 的滚动高度撑大。
修复方案
static/css/layout.css:.main-container增加overflow: hidden;,阻止溢出影响 body 滚动条;.main-container > *增加min-height: 0;,允许 Grid 子项在固定高度下正确收缩;.resizable-panel.collapsed > :not(.collapsed-indicator)增加display: none;,让折叠时隐藏内容不参与布局与滚动高度计算。
验证
- Playwright 复现验证(宽屏,折叠 accounts/emails):
- 修复前:
documentElement.scrollHeight > clientHeight(出现滚动条) - 修复后:
documentElement.scrollHeight === clientHeight(滚动条消失),折叠指示器高度与主容器一致
- 修复前: