管理员配置发布:点「内容」后在视口里看不到变化(面板渲染在 20 条列表下方),改为渲染后滚动定位 + 标题用发布编号 + 空列表给显式空态
This commit is contained in:
@@ -50,6 +50,6 @@
|
||||
浏览器按**完整 URL** 去重,两条不同 query 会被当成两个模块、**各执行一次**,
|
||||
于是入口里的 `mountShell()` 跑两遍,页面上出现**两份顶部导航与页脚**。
|
||||
改版本号时是**替换**这一行,不是新增一行。 -->
|
||||
<script type="module" src="/static/portal/employee-console/workspace/workspace.js?v=20260914-2"></script>
|
||||
<script type="module" src="/static/portal/employee-console/workspace/workspace.js?v=20260914-3"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -400,6 +400,10 @@ if (requireAdmin()) {
|
||||
const content = state.releaseContent;
|
||||
if (!content?.releaseId) { targets.releaseContent.innerHTML = ''; return; }
|
||||
const { releaseId, items, rules } = content;
|
||||
// 用发布编号(人类可读)而不是数字 id 做标题:列表里看到的是 release_no,
|
||||
// 面板上只写 `版本 354` 的话,点完根本对不上是哪一条。
|
||||
const release = (state.releases || []).find((row) => String(row.id) === String(releaseId));
|
||||
const releaseLabel = release?.release_no ? `${release.release_no}` : `#${releaseId}`;
|
||||
const itemRows = table(
|
||||
items,
|
||||
[['id', '项 ID'], ['namespace', '命名空间'], ['item_key', '键'], ['schema_version', '版本']],
|
||||
@@ -410,13 +414,18 @@ if (requireAdmin()) {
|
||||
[['id', '规则 ID'], ['rule_code', '规则码'], ['agent_type', 'Agent'], ['task_type', '任务'], ['model_policy', '策略'], ['primary_endpoint_id', '主端点']],
|
||||
(rule) => `<div class="admin-release-actions"><button class="button table-action" type="button" data-edit-rule="${rule.id}">编辑</button></div>`,
|
||||
);
|
||||
// `table()` 在空数组时只会渲染一个表头,看着就像"没加载出来" —— 显式给一句空态文案。
|
||||
const emptyHint = (message) => `<div class="operations-empty">${escapeHtml(message)}</div>`;
|
||||
targets.releaseContent.innerHTML = `
|
||||
<section class="panel"><div class="panel__header"><h2 class="panel__title">版本 ${escapeHtml(String(releaseId))} · 配置项</h2><span class="section-heading__meta">${items.length} 条</span></div>${itemRows}<form class="admin-inline-form" data-item-form><label class="form-field"><span class="form-field__label">命名空间</span><select class="form-field__input" name="namespace">${CONFIG_NAMESPACES.map((name) => `<option value="${name}">${name}</option>`).join('')}</select></label><label class="form-field"><span class="form-field__label">键名</span><input class="form-field__input" name="item_key" required maxlength="128" placeholder="customer_service:faq(agent_tools 的键必须是 已注册agent:意图 )"></label><label class="form-field admin-inline-form__wide"><span class="form-field__label">值(JSON)</span><input class="form-field__input" name="value_json" required placeholder='{"allowed_tools":["search_knowledge"]}'></label><button class="button button--primary" type="submit" data-item-submit>新增配置项</button><span class="admin-inline-form__status" data-item-status></span></form></section>
|
||||
<section class="panel"><div class="panel__header"><h2 class="panel__title">版本 ${escapeHtml(String(releaseId))} · 模型路由规则</h2><span class="section-heading__meta">${rules.length} 条</span></div>${ruleRows}<form class="admin-inline-form" data-rule-form><label class="form-field"><span class="form-field__label">规则码</span><input class="form-field__input" name="rule_code" required maxlength="64"></label><label class="form-field"><span class="form-field__label">Agent</span><input class="form-field__input" name="agent_type" required maxlength="32" placeholder="customer_service"></label><label class="form-field"><span class="form-field__label">任务类型</span><input class="form-field__input" name="task_type" required maxlength="48" placeholder="intent_classify"></label><label class="form-field"><span class="form-field__label">模型策略</span><input class="form-field__input" name="model_policy" required maxlength="32" placeholder="primary_only"></label><label class="form-field"><span class="form-field__label">主端点</span><select class="form-field__input" name="primary_endpoint_id" required>${endpointOptions()}</select></label><button class="button button--primary" type="submit" data-rule-submit>新增路由规则</button><span class="admin-inline-form__status" data-rule-status></span></form></section>`;
|
||||
<section class="panel"><div class="panel__header"><h2 class="panel__title">${escapeHtml(releaseLabel)} · 配置项</h2><span class="section-heading__meta">${items.length} 条${release ? ` · ${escapeHtml(release.status)}` : ''}</span></div>${items.length ? itemRows : emptyHint('这个版本还没有配置项,用下面的表单新增后点「提交校验」。')}<form class="admin-inline-form" data-item-form><label class="form-field"><span class="form-field__label">命名空间</span><select class="form-field__input" name="namespace">${CONFIG_NAMESPACES.map((name) => `<option value="${name}">${name}</option>`).join('')}</select></label><label class="form-field"><span class="form-field__label">键名</span><input class="form-field__input" name="item_key" required maxlength="128" placeholder="customer_service:faq(agent_tools 的键必须是 已注册agent:意图 )"></label><label class="form-field admin-inline-form__wide"><span class="form-field__label">值(JSON)</span><input class="form-field__input" name="value_json" required placeholder='{"allowed_tools":["search_knowledge"]}'></label><button class="button button--primary" type="submit" data-item-submit>新增配置项</button><span class="admin-inline-form__status" data-item-status></span></form></section>
|
||||
<section class="panel"><div class="panel__header"><h2 class="panel__title">${escapeHtml(releaseLabel)} · 模型路由规则</h2><span class="section-heading__meta">${rules.length} 条</span></div>${rules.length ? ruleRows : emptyHint('这个版本还没有模型路由规则(没有就意味着沿用其它版本或代码默认值)。')}<form class="admin-inline-form" data-rule-form><label class="form-field"><span class="form-field__label">规则码</span><input class="form-field__input" name="rule_code" required maxlength="64"></label><label class="form-field"><span class="form-field__label">Agent</span><input class="form-field__input" name="agent_type" required maxlength="32" placeholder="customer_service"></label><label class="form-field"><span class="form-field__label">任务类型</span><input class="form-field__input" name="task_type" required maxlength="48" placeholder="intent_classify"></label><label class="form-field"><span class="form-field__label">模型策略</span><input class="form-field__input" name="model_policy" required maxlength="32" placeholder="primary_only"></label><label class="form-field"><span class="form-field__label">主端点</span><select class="form-field__input" name="primary_endpoint_id" required>${endpointOptions()}</select></label><button class="button button--primary" type="submit" data-rule-submit>新增路由规则</button><span class="admin-inline-form__status" data-rule-status></span></form></section>`;
|
||||
targets.releaseContent.querySelector('[data-item-form]').addEventListener('submit', (event) => submitItem(event, releaseId));
|
||||
targets.releaseContent.querySelector('[data-rule-form]').addEventListener('submit', (event) => submitRule(event, releaseId));
|
||||
targets.releaseContent.querySelectorAll('[data-edit-item]').forEach((button) => button.addEventListener('click', () => editItem(button.dataset.editItem)));
|
||||
targets.releaseContent.querySelectorAll('[data-edit-rule]').forEach((button) => button.addEventListener('click', () => editRule(button.dataset.editRule)));
|
||||
// ⚠️ 内容面板渲染在发布列表**下方**,而列表最多 20 条 —— 只渲染不滚动的话,
|
||||
// 用户点完「内容」在视口里看不到任何变化,会以为按钮没反应(2026-09-14 实测反馈)。
|
||||
targets.releaseContent.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||
}
|
||||
|
||||
function editItem(itemId) {
|
||||
|
||||
Reference in New Issue
Block a user