mirror of
https://github.com/qingchencloud/clawpanel.git
synced 2026-07-12 16:01:56 +08:00
feat(ux): toast 智能行动按钮 + 拓展 ⓘ 到 gateway/agents + sidebar 加术语表入口
延续上一轮小白 UX 改造的尾声三连:
## 1. toast 智能行动按钮(U2 收尾)
- humanizeError 输出新增 action 字段:{ label, route?, handler?, kind }
- 自动按错误 kind 给默认按钮:
· gatewayDown → [去启动 Gateway] → /services
· cmdMissing / permission → [打开设置] → /settings
· auth → [检查 API Key] → /models
· network / timeout / rateLimit / generic → 不给(重试由用户控制)
- toast 结构化分支渲染 .toast-action-btn 按钮,点击后用 navigate(route) 或调 handler,并自动关闭 toast
- common.js 加 errorAction.* 三个按钮文案 i18n(11 语言)
## 2. ⓘ 拓展到 gateway / agents
- gateway.js: token label 后加 ⓘ(apikey 术语),renderConfig 末尾 attachTermTooltips
- agents.js: addAgent 弹窗 workspace 字段 label 加 ⓘ,setTimeout 扫 document.body 绑定
- term-tooltip.js 精简表新增 4 个术语:workspace / provider / baseurl + scope(已有)
## 3. sidebar 加术语表入口
- 在两个引擎(OpenClaw + Hermes)的最后一个 section 加「术语」条目
- sidebar.js i18n 新增 glossary 键(11 语言)
- 之前只能从 dashboard quick-actions 进入,现在 sidebar 永久可达
## 4. 顺手 bug 修复
- gateway.js 文件末尾历史残留的多余 `}` (line 348) syntax 错误,删除
- 与之前 hermes/cron.js 同类问题,本次改 ⓘ 时被 node --check 暴露
## 累计变动
- 10 个文件修改
- 7 个新 i18n 键(11 语言)
- Build OK
This commit is contained in:
@@ -10,6 +10,7 @@ import { CHANNEL_LABELS } from '../lib/channel-labels.js'
|
||||
import { t } from '../lib/i18n.js'
|
||||
import { listAgentsCompat } from '../lib/api-compat.js'
|
||||
import { hasFeature } from '../lib/kernel.js'
|
||||
import { termHelpHtml, attachTermTooltips } from '../lib/term-tooltip.js'
|
||||
|
||||
export async function render() {
|
||||
const page = document.createElement('div')
|
||||
@@ -216,6 +217,7 @@ async function showAddAgentDialog(page, state) {
|
||||
return
|
||||
}
|
||||
|
||||
setTimeout(() => attachTermTooltips(document.body), 0)
|
||||
showModal({
|
||||
title: t('agents.addTitle'),
|
||||
fields: [
|
||||
@@ -223,7 +225,7 @@ async function showAddAgentDialog(page, state) {
|
||||
{ name: 'name', label: t('agents.agentName'), value: '', placeholder: t('agents.agentNamePlaceholder') },
|
||||
{ name: 'emoji', label: t('agents.agentEmoji'), value: '', placeholder: t('agents.agentEmojiPlaceholder') },
|
||||
{ name: 'model', label: t('agents.agentModel'), type: 'select', value: models[0]?.value || '', options: models },
|
||||
{ name: 'workspace', label: t('agents.agentWorkspace'), value: '', placeholder: t('agents.agentWorkspacePlaceholder') },
|
||||
{ name: 'workspace', label: t('agents.agentWorkspace') + termHelpHtml('workspace'), value: '', placeholder: t('agents.agentWorkspacePlaceholder') },
|
||||
],
|
||||
onConfirm: async (result) => {
|
||||
const id = (result.id || '').trim()
|
||||
|
||||
@@ -154,7 +154,7 @@ function renderConfig(page, state) {
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" id="gw-auth-token-group" style="${gw.auth?.mode === 'password' ? 'display:none' : ''}">
|
||||
<label class="form-label">${t('gateway.tokenLabel')}</label>
|
||||
<label class="form-label">${t('gateway.tokenLabel')}${termHelpHtml('apikey')}</label>
|
||||
<div style="display:flex;gap:8px">
|
||||
<input class="form-input" id="gw-token" type="password" value="${_tokenDisplayStr(gw.auth?.token || gw.authToken)}" placeholder="${t('gateway.tokenPlaceholder')}" style="flex:1" ${_isSecretRef(gw.auth?.token) ? 'readonly' : ''}>
|
||||
<button class="btn btn-sm btn-secondary" id="btn-toggle-token">${t('gateway.show')}</button>
|
||||
@@ -242,6 +242,7 @@ function renderConfig(page, state) {
|
||||
`
|
||||
|
||||
bindConfigEvents(el)
|
||||
attachTermTooltips(el)
|
||||
}
|
||||
|
||||
function bindConfigEvents(el) {
|
||||
|
||||
Reference in New Issue
Block a user