fix(files): consolidate toolbar actions

This commit is contained in:
caoqianming 2026-08-06 15:14:59 +08:00
parent 02e7d2cb14
commit d7cb88c7ba
6 changed files with 23 additions and 11 deletions

View File

@ -5,6 +5,10 @@
> 所以不是每个版本号都有条目。条目格式 `## <版本> — <日期>`,新条目加在最上面。 > 所以不是每个版本号都有条目。条目格式 `## <版本> — <日期>`,新条目加在最上面。
> 工程口径的完整记录见 `PROGRESS.md` / git log。 > 工程口径的完整记录见 `PROGRESS.md` / git log。
## 0.62.8 — 2026-08-06
- 文件面板把新建文件夹、从其他目录选入和上传文件收进统一的“添加”菜单,减少顶栏按钮数量;隐藏目录、刷新和收起入口保持常驻。
## 0.62.7 — 2026-08-06 ## 0.62.7 — 2026-08-06
- 文件面板的隐藏目录开关现在始终可见,用户根目录中的平台隐藏目录仍不会展示。 - 文件面板的隐藏目录开关现在始终可见,用户根目录中的平台隐藏目录仍不会展示。

View File

@ -2,7 +2,7 @@
> 配合 `DESIGN.md`。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 1-2 句:做了啥 + 关键判断;细节查 `git log` / `git diff` / `DESIGN §7.9` > 配合 `DESIGN.md`。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 1-2 句:做了啥 + 关键判断;细节查 `git log` / `git diff` / `DESIGN §7.9`
最后更新:2026-08-06(文件面板建目录与隐藏开关常驻,bump 0.62.7) 最后更新:2026-08-06(文件顶栏添加操作收拢,bump 0.62.8)
--- ---
@ -23,6 +23,7 @@
### 2026-08-06 ### 2026-08-06
- **08-06 / 0.62.8 / 文件顶栏添加操作收拢**:把新建文件夹、从其他目录选入和上传文件三个同类入口合并为“+ 添加”菜单,`.*` 隐藏目录开关、刷新与收起继续常驻,顶栏操作由 6 个减至 4 个;拖拽上传和各操作原有行为不变。相关静态前端与无 DB 路由共 33 项 unittest、JavaScript 语法及 diff 检查通过;无 schema、migration、HTTP API、依赖或运行方式变化未连接生产 DB。
- **08-06 / 0.62.7 / 文件面板先备料 + 隐藏开关常驻**:文件栏 `.*` 开关不再随浏览路径消失,但后端继续保证 user_root 平台点目录永不展示;新增“+”入口和 `POST /v1/files/mkdir`,可在根目录或当前目录创建直接子目录,创建成功后自动进入并刷新新对话目录候选,形成“建目录→上传/选入→开新对话”流程。目录名复用 working_dir 校验,点目录、路径式名称与重名分别拒绝;相关静态前端及无 DB 路由共 33 项 unittest、JavaScript 语法、Ruff 致命规则和 diff 检查通过。无 schema、migration 或依赖变化,未连接生产 DB。 - **08-06 / 0.62.7 / 文件面板先备料 + 隐藏开关常驻**:文件栏 `.*` 开关不再随浏览路径消失,但后端继续保证 user_root 平台点目录永不展示;新增“+”入口和 `POST /v1/files/mkdir`,可在根目录或当前目录创建直接子目录,创建成功后自动进入并刷新新对话目录候选,形成“建目录→上传/选入→开新对话”流程。目录名复用 working_dir 校验,点目录、路径式名称与重名分别拒绝;相关静态前端及无 DB 路由共 33 项 unittest、JavaScript 语法、Ruff 致命规则和 diff 检查通过。无 schema、migration 或依赖变化,未连接生产 DB。
- **08-06 / 0.62.6 / 模型标签禁止断行**:对话顶部模型控件增加不可断行约束,中栏宽度收紧时优先压缩下拉框,不再把“模型”两个汉字拆成两行;静态前端与更新日志共 12 项 unittest、diff 检查通过。纯样式修复,无 schema、migration、HTTP API、依赖或运行方式变化未连接生产 DB。 - **08-06 / 0.62.6 / 模型标签禁止断行**:对话顶部模型控件增加不可断行约束,中栏宽度收紧时优先压缩下拉框,不再把“模型”两个汉字拆成两行;静态前端与更新日志共 12 项 unittest、diff 检查通过。纯样式修复,无 schema、migration、HTTP API、依赖或运行方式变化未连接生产 DB。
- **08-06 / 0.62.5 / 新对话模型控件单行 + 媒体入口恢复**:新对话顶部改用专用的 `draft-controls` 单行布局,不再复用历史 task meta 的强制换行 spacer模型清单异步加载完成后统一重绘草稿 meta同时恢复既有“⚙ 媒体”入口及生图/生视频选择弹层。相关静态前端、无 DB 路由及更新日志共 34 项 unittest、JavaScript 语法与 diff 检查通过;当前环境无可用浏览器实例,未连接生产 DB。无 schema、migration、HTTP API、依赖或运行方式变化。 - **08-06 / 0.62.5 / 新对话模型控件单行 + 媒体入口恢复**:新对话顶部改用专用的 `draft-controls` 单行布局,不再复用历史 task meta 的强制换行 spacer模型清单异步加载完成后统一重绘草稿 meta同时恢复既有“⚙ 媒体”入口及生图/生视频选择弹层。相关静态前端、无 DB 路由及更新日志共 34 项 unittest、JavaScript 语法与 diff 检查通过;当前环境无可用浏览器实例,未连接生产 DB。无 schema、migration、HTTP API、依赖或运行方式变化。

View File

@ -1,3 +1,3 @@
# zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。 # zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。
# 改版本只动这一行。 # 改版本只动这一行。
__version__ = "0.62.7" __version__ = "0.62.8"

View File

@ -60,7 +60,7 @@ class StaticVendorTests(unittest.TestCase):
self.assertIn(":focus-visible", css) self.assertIn(":focus-visible", css)
self.assertIn("@media (max-width: 640px)", css) self.assertIn("@media (max-width: 640px)", css)
def test_hidden_directory_toggle_stays_visible(self) -> None: def test_file_toolbar_keeps_hidden_toggle_and_groups_add_actions(self) -> None:
html = DEV_HTML.read_text(encoding="utf-8") html = DEV_HTML.read_text(encoding="utf-8")
files_js = (JS_DIR / "files.js").read_text(encoding="utf-8") files_js = (JS_DIR / "files.js").read_text(encoding="utf-8")
@ -71,8 +71,13 @@ class StaticVendorTests(unittest.TestCase):
html, html,
) )
self.assertNotIn("hiddenToggle.hidden", files_js) self.assertNotIn("hiddenToggle.hidden", files_js)
self.assertIn('id="btn-new-folder" class="small"', html) self.assertIn('id="btn-file-add" class="small dd-toggle"', html)
self.assertIn('$("btn-new-folder").onclick = createFolder;', files_js) self.assertNotIn('id="btn-new-folder"', html)
self.assertNotIn('id="btn-src-pick"', html)
self.assertNotIn('id="btn-upload"', html)
self.assertIn('{ act: "mkdir", label: "新建文件夹"', files_js)
self.assertIn('{ act: "pick", label: "从其他目录选入"', files_js)
self.assertIn('{ act: "upload", label: "上传文件"', files_js)
self.assertIn('await api("POST", "/v1/files/mkdir"', files_js) self.assertIn('await api("POST", "/v1/files/mkdir"', files_js)
def test_ui_polish_keeps_mobile_composer_and_reading_rail_contracts(self) -> None: def test_ui_polish_keeps_mobile_composer_and_reading_rail_contracts(self) -> None:

View File

@ -2007,9 +2007,7 @@
<span id="files-proj" class="muted small" style="margin-left:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:0 1 auto;" title=""></span> <span id="files-proj" class="muted small" style="margin-left:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:0 1 auto;" title=""></span>
<span class="spacer"></span> <span class="spacer"></span>
<button id="btn-toggle-hidden" class="small" title="显示点目录" aria-label="显示点目录" aria-pressed="false">.*</button> <button id="btn-toggle-hidden" class="small" title="显示点目录" aria-label="显示点目录" aria-pressed="false">.*</button>
<button id="btn-new-folder" class="small" title="在当前目录新建文件夹" aria-label="新建文件夹"></button> <button id="btn-file-add" class="small dd-toggle" title="添加文件或文件夹" aria-label="添加文件或文件夹"> 添加</button>
<button id="btn-src-pick" class="small" title="选入:从其他目录勾选文件 / 目录,复制或移动到当前主目录"></button>
<button id="btn-upload" class="small" title="上传文件到当前目录(也可直接把文件拖到本面板)"></button>
<button id="btn-refresh-files" class="small"></button> <button id="btn-refresh-files" class="small"></button>
<button id="pane-toggle-right" class="small" title="折叠文件列表"></button> <button id="pane-toggle-right" class="small" title="折叠文件列表"></button>
</div> </div>

View File

@ -21,8 +21,13 @@ $("btn-toggle-hidden").onclick = () => {
state.showHiddenDirs = !state.showHiddenDirs; state.showHiddenDirs = !state.showHiddenDirs;
loadFiles(); loadFiles();
}; };
$("btn-new-folder").onclick = createFolder; $("btn-file-add").onclick = (e) => {
$("btn-upload").onclick = () => $("upload-input").click(); showMenu(e.currentTarget, [
{ act: "mkdir", label: "新建文件夹", onclick: createFolder },
{ act: "pick", label: "从其他目录选入", onclick: openSrcPicker },
{ act: "upload", label: "上传文件", onclick: () => $("upload-input").click() },
]);
};
$("upload-input").addEventListener("change", uploadSelected); $("upload-input").addEventListener("change", uploadSelected);
async function createFolder() { async function createFolder() {
@ -163,7 +168,6 @@ async function doSrcTransfer(mode) {
} }
} }
$("btn-src-pick").onclick = openSrcPicker;
$("sp-cancel").onclick = closeSrcPicker; $("sp-cancel").onclick = closeSrcPicker;
$("sp-copy").onclick = () => doSrcTransfer("copy"); $("sp-copy").onclick = () => doSrcTransfer("copy");
$("sp-move").onclick = () => doSrcTransfer("move"); $("sp-move").onclick = () => doSrcTransfer("move");