v28 第 28 批(12 条):名册分组改标签 / 资源合并为两按钮 / 首页定位与主题色 / 笔记富文本双模式
其中 4 条是**上批遗漏的真 bug**(1/4/8/9),根因已逐条定位:
1. 首页日程没定位到红线 —— 真根因:刻度区间**不含当前时刻** → $showNow=false
→ 红线**整个不渲染**,而定位脚本用同一个越界比例算目标,被 clamp 到底部。
修:把当前小时并进区间端点(现在必然落在区间内)。
2. 「看整月」→「更多日程」+ 日程主题色;3. 「手头在做」→「近期任务」、
「任务看板」→「全部任务」+ 任务主题色(注入 --hd-c,不再写死白底)。
4. 任务复选框提示还在 —— 真根因:**JS 在点击后**给状态徽标挂 title
(`badge.setAttribute('title',…)`),上批只去了静态渲染,静态断言永远抓不到。
5. 名册「分组」→「标签」(用户:一个人可能既是小学同学又是初中同学,没法分组):
新增 person_tags(每人一份、一人多标签),名册改**平铺 + 顶部标签筛选**;
🔴 迁移用**一次性哨兵**(第一版用 NOT EXISTS,实测被"用户清空标签"绕过 → 旧分组名被灌回)。
6. 名册卡片按钮加语义底色。
7. 资源四按钮 → **编辑 / 删除**两颗:三块内容进一个带页签的弹框(信息/附件/共享)。
8. 财务多选数字不变 —— 真根因:前端发 `kinds=a,b`(逗号串),服务端 `(array)` 收成
单元素 → 求交为空 → **静默回落整本账**。修:两种形状都收。
9. 微信读书偶发很慢 —— 真根因:syncNow 扫 60 本 × 每本 1~3 次网关调用(单次超时 20s),
全同步阻塞在列表页请求里。修:总时长预算 + 单次超时 8s + 自动/手动分批。
10. 新增全局可见的联想接口库(6 个实测可用来源)+ 三种新解析类型。
11. 导航右上角「设置」:默认进"添加网址 + 全部网址",四类设置收进 ?set=1 视图。
12. 笔记:段落/清单支持 Markdown(自研渲染器,**不允许原始 HTML**),
实时预览走服务端(前后端只一份规则);底部附件上传;清单多级;
列表改**定尺寸卡片网格**(溢出显示摘要、图片缩放下方);按用户要求**去掉标签侧栏**。
This commit is contained in:
+19
-10
@@ -824,8 +824,16 @@
|
||||
|
||||
function each(list, fn) { Array.prototype.forEach.call(list, fn); }
|
||||
|
||||
/* 🔴 v28 用户第 5 条:名册从「分栏」改成**平铺**(一个人可挂多个标签,
|
||||
分栏会让他在多栏里重复出现)。拖动因此只剩"排序"这一件事。
|
||||
⇒ 把整个 `.roster` 当成**唯一一栏**返回:下游的 placeAt / save / refreshCounts
|
||||
全都按"栏"来写,只要这里返回一个元素,它们不用改就能继续工作
|
||||
(比重写三条逻辑安全得多,也不会漏掉其中一条)。
|
||||
⚠️ 返回的是 `[roster]` 而不是 `.people-grid`:placeAt 里会 `block.querySelector('.people-grid')`,
|
||||
所以仍要有一个带 `.people-grid` 的容器;模板里 roster 直接包含 .people-grid。 */
|
||||
function blocks() {
|
||||
return roster.querySelectorAll('.group-block');
|
||||
var flat = roster.querySelector('.people-grid');
|
||||
return flat ? [roster] : [];
|
||||
}
|
||||
|
||||
/** 从事件目标往上找那张可拖的卡片(点在卡片里的链接/表单上时也算这张卡) */
|
||||
@@ -848,19 +856,16 @@
|
||||
* 留着一个没人调用的函数只会让下一个人以为还有第二条拖拽路径。
|
||||
*/
|
||||
|
||||
/** 每栏人数与"空栏"标记跟着 DOM 走 —— 不然拖完之后标题上的「N 人」还是旧的 */
|
||||
/** 每栏人数与"空栏"标记跟着 DOM 走 —— 不然拖完之后标题上的「N 人」还是旧的。
|
||||
* ⚠️ v28:平铺之后只剩"一栏"(就是 .roster 本身),它**没有 .group-n 也没有
|
||||
* data-group**,所以下面这些查询都会拿到 null —— 全部做了存在性判断,
|
||||
* 并且**绝不能**再把 `b.hidden` 设成"没人就隐藏":
|
||||
* 那会把整张名册(roster 自己)藏起来。平铺下没有"空栏"这个概念。 */
|
||||
function refreshCounts() {
|
||||
each(blocks(), function (b) {
|
||||
var n = b.querySelectorAll('.people-grid .person').length;
|
||||
var nEl = b.querySelector('.group-n .n');
|
||||
if (nEl) { nEl.textContent = String(n); }
|
||||
b.classList.toggle('is-empty', n === 0);
|
||||
// 🔴 empty 的栏被 filter.js 标了 hidden(筛完没人剩就整栏收起)。
|
||||
// 拖了一张卡进来之后必须**把 hidden 也清掉** —— 只去掉 is-empty 没用:
|
||||
// 作者样式里 .group-block 没有写 display,于是浏览器默认的
|
||||
// [hidden]{display:none} 照样生效,那一栏连同刚放进去的人一起看不见
|
||||
// (症状就是"拖到后面的分组里,松手什么都没有")。
|
||||
b.hidden = (n === 0);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -887,7 +892,11 @@
|
||||
var pid = parseInt(c.getAttribute('data-person'), 10);
|
||||
if (pid > 0) { ids.push(pid); }
|
||||
});
|
||||
cols.push({ g: parseInt(b.getAttribute('data-group'), 10) || 0, ids: ids });
|
||||
/* ⚠️ v28:平铺之后**不报 `g`** —— 见 PersonRoster::applyLayout 的注释:
|
||||
报了组号(哪怕是 0)就会覆盖 group_id,拖一次就把所有人的旧分组清空,
|
||||
而那是"旧分组→同名标签"迁移的数据源、也是 vCard 的读点。
|
||||
不报 `g` = 只更新顺序,这正是"拖动只改先后"的新语义。 */
|
||||
cols.push({ ids: ids });
|
||||
});
|
||||
|
||||
var body = new URLSearchParams();
|
||||
|
||||
Reference in New Issue
Block a user