评论附件支持拖拽 + 首页卡片同步标题 (#79)
用户 2026-11-05: 「评论框下面的附件也需要可以拖动添加。」 「首页卡片没有刷新。」 ① 评论附件拖拽 给 `.cmt-attach-row` 挂 `data-cmt-drop`,由 task_panel.js 接管 dragover / dragenter / dragleave / drop。 🔴 核心技术点:`<input type=file>.files` 是**只读**的, 不能直接 `input.files = event.dataTransfer.files`(某些内核静默失败)。 必须用 DataTransfer 重建 FileList 再赋回去: var dt = new DataTransfer(); dt.items.add(file); input.files = dt.files; ← 这个赋值是允许的 而且**必须真的赋给 input** —— 否则只是"看起来加上了", 表单提交时浏览器一个文件都不带。 ⚠️ 累加语义:用户可能先拖一张再拖一张,所以每次把 input.files 现有内容 + 新拖入的合并后写回。 ⚠️ 去重:按 name+size+lastModified 判重,否则"只拖一次却传上去两张一样的"。 ⚠️ dragover 必须 preventDefault(不拦的话浏览器把文件当"打开", 直接跳走、当前页面全丢)。 ⚠️ 与「任务附件」那条 `[data-tk-drop-box]` 是**两条独立的路**: 那个是"点了/拖了立刻上传"(任务已存在), 这个是"挂到评论表单、点发表才一起提交"。 实测(Playwright + 真实 DataTransfer): 拖入 a.txt+b.png => count=2 ✅ 再拖 c.jpg => count=3 ✅ 累加 重复拖 a.txt => count=3 ✅ 去重 FormData(form) => ["a.txt","b.png","c.jpg"] ✅ 提交时真会传 ② 首页卡片同步标题 根因:`syncRow()` 原来**只管状态徽标和复选框**,代码第一行就是 `if (!d || !d.status) return;`,压根不碰标题。 而 #78 之后面板里能改标题了 ⇒ 改完点保存,卡片上还是旧标题。 改两处: · `task_panel_json()` 返回值补 `title`(服务端直接给,不依赖 DOM 还在) · `syncRow()` 补标题同步:`.dash-what` 的文本 + `title` 属性 (`title` 是悬停提示,不同步会出现"悬停是旧标题"的怪事), 并把 `data-fb-entry` 里的 JSON title 一并改掉 (否则"卡片上是新标题、再点开浮层显示旧标题")。 读不到 d.title 时兜底从 `#tkp-title` 输入框读。
This commit is contained in:
@@ -435,12 +435,23 @@ $tpLate = $tpDue !== '' && $tpStatus !== 'done' && \App\Task::isOverdue($tpD
|
||||
占位文案,见 comment_add 的处理。
|
||||
⚠️ 用原生 `<input type=file>` 而不是拖拽框:评论是一次性提交,
|
||||
拖拽框那套(`data-tk-drop-box`)是"点了立刻上传",两者语义不同。 */ ?>
|
||||
<div class="cmt-attach-row">
|
||||
<?php /* 🔴 #79(用户 2026-11-05):「评论框下面的附件也需要可以拖动添加。」
|
||||
|
||||
⇒ 给这片区域挂上拖拽落点(`data-cmt-drop`,由 task_panel.js 接管)。
|
||||
两个要点:
|
||||
① `dragover` 必须 `preventDefault()` —— 不拦的话浏览器
|
||||
会把文件当"打开"处理(直接跳走,当前页面全丢)。
|
||||
② 拖进来的文件**要写回真正的 `<input type=file>`** ——
|
||||
`<input>` 的 `files` 是只读的,得用 `DataTransfer` 重建
|
||||
一个 FileList 赋回去。这样表单提交时浏览器才会真的带上文件,
|
||||
否则只是"看起来加上了",提交是空的。 */ ?>
|
||||
<div class="cmt-attach-row" data-cmt-drop>
|
||||
<label class="cmt-attach-pick">
|
||||
<input type="file" name="attach[]" multiple class="sr-only">
|
||||
<input type="file" name="attach[]" multiple class="sr-only"
|
||||
id="tkp-cmt-files" data-cmt-file-input>
|
||||
<span aria-hidden="true">📎</span> 添加附件
|
||||
</label>
|
||||
<span class="cmt-attach-name" data-cmt-file-name></span>
|
||||
<span class="cmt-attach-name" data-cmt-file-name>可点击选择,也可把文件拖进来</span>
|
||||
</div>
|
||||
<div class="btn-row"><button class="btn btn-sm" type="submit">发表</button></div>
|
||||
</form>
|
||||
|
||||
Reference in New Issue
Block a user