diff --git a/templates/resources/index.php b/templates/resources/index.php index c47058e..1d7a32f 100644 --- a/templates/resources/index.php +++ b/templates/resources/index.php @@ -532,6 +532,47 @@ $myPerson = (int)\App\Auth::personId(); 会丢掉滚动位置;既然列表页已经有 `#resListHost` 这样的容器就顺手接上。 */ var addBtn = document.getElementById('resAddBtn'); var addCard = document.getElementById('resAddCard'); + + /* 🔴 工单 #19(用户 2026-10-28):「资源模块,新建资源,会把之前的附件带进来, + 就是说,附件那里不是空的。」 + 【根因】`#resAddCard` 是新建/编辑**共用**同一个弹窗(v42 第 7 条), + 但附件区**从来没被复位过**: + · 缩略图卡片与隐藏令牌 `stage_token[]` 是 queueDrop() 上传成功后 + **动态插进 `.stage-list`** 的(assets/js/app.js:668), + 只有点卡片上那个「×」才会移除; + · 关弹窗只做 `addCard.hidden = true`,DOM 原样留着 ⇒ 下次打开就看见上一次的附件。 + ⇒ 复位函数 `resetToCreate()` 清了标题/正文/归属人/共享人,**唯独漏了附件**。 + + ⚠️ 这不只是"看着脏":上传后**没保存就关掉**的那批,暂存目录还在(没被认领), + 令牌残留在表单里 ⇒ 下次点「确定」时会被 `StagedUpload::claim()` 认领到 + **新资源**上 —— 实测「新建的资源莫名多了 1 张照片」 + (见 `_tooling/_b36_res_attach_reset.py` 的 D1)。 + ⚠️ 编辑态**也要清**:`openEdit()` 并不灌附件(已有附件走列表里独立的「附件」弹窗), + 所以编辑时看到的任何附件都是"上一次没做完的残留" ⇒ 保存时会被挂到这条资源上。 + ⚠️ 为什么"只清 DOM"就够了:卡片在**拖入时**就已经 append 进 `.stage-list` + (app.js:600,同步执行),上传完成的回调是在那个**已脱离文档**的节点上 + 改样式、塞令牌,不会再回到表单里 ⇒ 不需要额外加"代/epoch"计数器。 + ⚠️ 除了卡片,还要兜底清 `input[name="stage_token[]"]`: + 用户看不见令牌,但它才是真正会被提交的东西(#456 同族:DOM 删了、数据还在)。 */ + function clearStaged() { + var form = document.getElementById('resForm'); + if (!form) { return; } + var list = form.querySelector('[data-stage-list]'); + if (list) { + Array.prototype.forEach.call(list.querySelectorAll('.stage-cell'), function (c) { + if (c.parentNode) { c.parentNode.removeChild(c); } + }); + // 一张不剩就藏回去(模板初始就 hidden,别留一条空边框) + list.hidden = true; + } + Array.prototype.forEach.call(form.querySelectorAll('input[name="stage_token[]"]'), + function (i) { + if (i.parentNode) { i.parentNode.removeChild(i); } + }); + var tip = form.querySelector('[data-stage-tip]'); + if (tip) { tip.textContent = ''; tip.hidden = true; } + } + function setResOpen(on) { if (!addCard) { return; } addCard.hidden = !on; @@ -611,6 +652,10 @@ $myPerson = (int)\App\Auth::personId(); ids = arr.map(function (o) { return o.id; }); } catch (e) { ids = []; } setPickerValues('share_ids[]', ids); + /* 🔴 工单 #19:编辑态**也要清**暂存区 —— openEdit 并不灌附件(已有附件走 + 列表里独立的「附件」弹窗,见下面的 openPane),所以此刻表单里若还有卡片/令牌, + 那一定是"上一次拖进来没保存"的残留 ⇒ 不清的话会被挂到**这条资源**上。 */ + clearStaged(); setResOpen(true); /* 🔴 v42:编辑态才显示底栏的「共享」「附件」两颗按钮(新建时资源还不存在, 没有"共享给谁/挂哪些附件"可说)。 */ @@ -666,6 +711,8 @@ $myPerson = (int)\App\Auth::personId(); if (el) { el.hidden = true; el.removeAttribute('data-res-id'); } }); setPickerValues('share_ids[]', []); + /* 🔴 工单 #19:附件也要清 —— 否则新建时带着上一次的附件,见 clearStaged 的注释 */ + clearStaged(); } /* 事件委托:列表里的「编辑」按钮(AJAX 换过列表后仍然有效) */