修「填了显示名却说还没有中文名」,并给枚举拼错拦一道
用户报:把某行的导出值改成 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:
@@ -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) + '」');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user