+
+
${escapeHtml(e.name)}
@@ -1353,7 +1648,7 @@ function renderFiles(data) {
el.style.cursor = "pointer";
el.onclick = () => {
const rel = el.dataset.rel;
- if (el.dataset.isdir === "true") { state.filesPath = rel; loadFiles(); }
+ if (el.dataset.isdir === "true") { navFiles(rel); }
else { openFilePreview(rel); }
};
});
@@ -1365,6 +1660,35 @@ function renderFiles(data) {
showMenu(btn, fileMenuItems(e));
};
});
+ $("file-list").querySelectorAll(".row-cb").forEach((cb) => {
+ cb.onclick = (ev) => ev.stopPropagation(); // 防 row 命中导航
+ cb.onchange = (ev) => {
+ const rel = cb.dataset.rel;
+ if (cb.checked) state.selectedFiles.add(rel);
+ else state.selectedFiles.delete(rel);
+ const row = cb.closest(".file-row");
+ if (row) row.classList.toggle("selected", cb.checked);
+ syncBulkBar();
+ };
+ });
+ syncBulkBar();
+}
+
+// 同步多选 toolbar 显隐 + 计数 + 顶栏全选 checkbox(全选 / 半选 / 未选三态)
+function syncBulkBar() {
+ const n = state.selectedFiles.size;
+ $("files-bulk-count").textContent = String(n);
+ $("files-bulkbar").classList.toggle("show", n > 0);
+ const rels = Object.keys(state.entriesByRel || {});
+ const cb = $("files-selall");
+ if (!rels.length) {
+ cb.checked = false; cb.indeterminate = false; cb.disabled = true;
+ } else {
+ cb.disabled = false;
+ const selN = rels.reduce((acc, r) => acc + (state.selectedFiles.has(r) ? 1 : 0), 0);
+ cb.checked = selN === rels.length;
+ cb.indeterminate = selN > 0 && selN < rels.length;
+ }
}
function fileMenuItems(e) {
@@ -1671,9 +1995,10 @@ $("file-preview-modal").addEventListener("click", (e) => {
if (e.target.id === "file-preview-modal") closeFilePreview();
});
document.addEventListener("keydown", (e) => {
- if (e.key === "Escape" && $("file-preview-modal").classList.contains("show")) {
- closeFilePreview();
- }
+ if (e.key !== "Escape") return;
+ // 多模态共存:优先关靠前栈顶 — 目录选择(z 95)→ 文件预览(z 90)→ 新任务(z 80)
+ if ($("dir-picker-modal").classList.contains("show")) { closeDirPicker(); return; }
+ if ($("file-preview-modal").classList.contains("show")) { closeFilePreview(); return; }
});
async function uploadSelected() {