数据编辑页加「活动与类别」卡片:改名 / 删除 / 新增 / 合并
活动的管理能力其实后端早就有(create/update/delete 三个端点),但入口只藏在 「到访记录」卡片里——要先在下拉里选中某个活动,再点按钮弹 prompt,看不见 「哪些活动一条到访都没挂」(实测有 0 条的活动);类别则完全没有集中入口。 现在页首多了一张卡片(唯一默认展开的),两个表格都带用量: - 活动:名称行内改、删除(有引用时二次确认并报条数)、新增, 另有一条「把[A]并到[B]」——改名解决不了「两个名字指同一件事」, 合并会把到访转过去、把 is_home/is_work 抄成目标的,再删源活动、清它的原始行留档。 - 类别:类别没有独立的表,值就长在 places.poi_category 上,所以「改名 / 清空」 都是按值批量作用到地点;改成另一个已有值就是合并,不另做按钮。 新增端点:/admin/edit/category/rename、/admin/edit/category/clear、 /admin/edit/activity/merge。编辑页那条 DISTINCT poi_category 查询顺手改成 GROUP BY 带计数,一份数据两用。 顺带修一处会静默失效的写法:新表原来只写了 tb-stack,漏了配对的 tb, 而 CSS 全是 `.tw > table.tb.tb-stack …` ⇒ 一条堆叠规则都没命中,窄屏下表仍是 640px 底宽。横滑是在 .tw 里滚的、页面不溢出,肉眼很难发现,守卫测试也只查 「有没有 tb-stack」——已补上「有 tb-stack 必须有 tb」并做了变异验证。
This commit is contained in:
@@ -208,6 +208,13 @@ func checkWideTablesOutsideGrid(t *testing.T, path, body string) int {
|
||||
continue
|
||||
}
|
||||
seen++
|
||||
// 两个类是成对的:app.css 里每一条堆叠规则都写成 `.tw > table.tb.tb-stack …`。
|
||||
// 只写 tb-stack 一条都命中不了,表格退回 `.tw > table.tb` 的 640px 底宽,
|
||||
// 窄屏照旧横滑——而且横滑是在 .tw 里滚的,页面本身不溢出,肉眼很难发现
|
||||
// (2026-09-20 加「活动与类别」卡片时就这么漏过一次)。
|
||||
if m := classRe.FindStringSubmatch(tag); m == nil || !strings.Contains(" "+m[1]+" ", " tb ") {
|
||||
t.Errorf("%s:tb-stack 表少了 tb 类(class=%q)——堆叠规则匹配不到,窄屏只能横滑", path, tag)
|
||||
}
|
||||
// 只有标了 tb-stack 的才算「宽表」;普通的窄表放进 g2 没问题,不该报。
|
||||
if inG2 {
|
||||
t.Errorf("%s:一张宽表被放在 g2 网格里(卡片只剩半宽,桌面端要横滑)", path)
|
||||
|
||||
Reference in New Issue
Block a user