修「填了显示名却说还没有中文名」,并给枚举拼错拦一道

用户报:把某行的导出值改成 MKPOICategoryCarRent、又手填了显示名「租车」,
保存成功、框里也回填了,页面却仍挂着「还没有中文名」。

两件事叠在一起:

1. 判断错了。Missing 只看内置表,没看有没有自定义覆盖 ——
   填过了还照样提示。改成 categoryLabelMissing(v) && 没有覆盖。
   补 TestCategoryLabelMissingRespectsOverride,并做变异验证(去掉那半个条件即报错)。

2. 值本身是拼错的。MKPOICategoryCarRent 不是真机的枚举,正确是
   MKPOICategoryCarRental(少了个 al)——站内看不出任何异常,但导回手机后
   那个地点显示不出类别。这正是加「显示名」时提醒过的风险,所以补一道防线:
   编辑页把内置枚举名渲染给脚本,往 poi_category 写值的两个入口
   (类别台账的「改名」、地点行内编辑的「自定义类别」)都过 okEnum(),
   不在已知枚举里就 confirm,还能猜「你是不是想写 MKPOICategoryCarRental」。
   中文值和已知枚举不打扰。

另外:这次用脚本往模板写 JS 时,\n 被多转义一层成了真换行,JS 单引号字符串
含裸换行 ⇒ 整块 <script> 语法错误、页面交互全哑,而模板解析测试照样通过。
新增 inline_script_test.go 扫所有内联脚本块(现在 31 个),字符串跨行就报错
并指出文件行号,已做变异验证。
This commit is contained in:
tamakyi
2026-09-20 12:22:11 +08:00
parent 82e63412c0
commit 693ee82ab8
5 changed files with 245 additions and 1 deletions
+36
View File
@@ -1339,6 +1339,41 @@
});
});
// 内置表认得的类别枚举。改「导出值」时拿它比对:真机只认它自己那套枚举名,
// 拼错的串(比如 CarRent 少了 al)站内看不出任何问题,导回手机后那个地点就显示不出类别。
var KNOWN = [{{range .KnownCategories}}"{{.}}",{{end}}];
function enumTypo(v) {
if (KNOWN.indexOf(v) >= 0) return null;
for (var i = 0; i < KNOWN.length; i++) {
var k = KNOWN[i];
if (k.indexOf(v) === 0 || v.indexOf(k) === 0) return k; // 「你是不是想写这个」
}
return '';
}
// 要往 places.poi_category 写一个没记录过的枚举时拦一下。返回 true 表示可以继续。
function okEnum(v) {
if (!/^MKPOICategory/.test(v)) return true;
var near = enumTypo(v);
if (near === null) return true;
var tip = near ? '\n\n你是不是想写「' + near + '」?' : '';
return window.confirm('「' + v + '」不在已知的类别枚举里。' + tip +
'\n\n真机只认它自己那套枚举名:写错的串在站内看着一切正常,' +
'但导出回手机后这个地点就显示不出类别了。');
}
// 地点行内编辑里的「自定义类别」写的是同一列、同样的坑,用同一套提醒。
// 用捕获阶段监听:地点那句「批量改到访活动」的确认也走捕获,两边互不影响。
document.addEventListener('submit', function (e) {
var f = e.target;
if (!f || !f.querySelector) return;
var sel = f.querySelector('select.cat-select');
if (!sel || sel.value !== '__custom__') return;
var box = f.querySelector('.cat-custom input');
if (!okEnum(box ? (box.value || '').trim() : '')) e.preventDefault();
}, true);
document.querySelectorAll('#cat-rows tr').forEach(function (tr) {
var input = tr.querySelector('input[name="cat-value"]');
var from = tr.dataset.value;
@@ -1346,6 +1381,7 @@
var v = (input.value || '').trim();
if (!v) { toast('类别不能为空;要摘掉请用「清空」', true); return; }
if (v === from) { toast('类别没变', true); return; }
if (!okEnum(v)) return;
post('/admin/edit/category/rename', { from: from, to: v }, function (d) {
reload('已把 ' + count(tr, '地点') + ' 个地点的类别改成「' + (d.label || v) + '」');
});