mirror of
https://github.com/qingchencloud/clawpanel.git
synced 2026-07-07 15:41:28 +08:00
feat: v0.9.1 — 面板设置页、网络代理、后台安装、模型服务商扩展、多项修复
新功能: - 新增独立面板设置页面(网络代理 + 代理测试 + 模型代理开关 + npm源) - 网络代理支持:下载类操作走代理,自动绕过内网地址 - 安装/升级/卸载改为后台执行,不再阻塞界面 - 全局任务状态栏:关闭弹窗后顶部显示进度,可重新查看日志 - 安装/卸载完成后自动刷新界面状态 - 新增多个模型服务商快捷配置(硅基流动、火山引擎、阿里云百炼、智谱AI、MiniMax、NVIDIA NIM、胜算云) - AI助手浮动按钮恢复,首次提示可拖动,实时聊天页隐藏 修复: - 修复版本更新误判(本地版本高于远端不再误弹更新) - 修复Windows下nvm/自定义Node路径CLI检测 - 修复npm EEXIST文件冲突(--force + 安装前自动清理) - 修复汉化版-zh.x后缀版本比较错误 - 修复模型URL自动拼接/v1问题 - 修复切换版本后Gateway重装失败(PATH缓存刷新) - 修复切换助手服务商时旧模型名残留 优化: - macOS图标改用docs/logo.png统一生成 - 内置推荐版本号更新到OpenClaw 2026.3.13 - 错误诊断增强(EEXIST识别) - 弹窗标题根据操作类型显示 - 新增版本维护文档
This commit is contained in:
@@ -197,7 +197,7 @@ export function showUpgradeModal(title) {
|
||||
</div>
|
||||
<div class="upgrade-log-box"></div>
|
||||
<div class="modal-actions">
|
||||
<button class="btn btn-secondary btn-sm" data-action="close" disabled>关闭</button>
|
||||
<button class="btn btn-secondary btn-sm" data-action="close">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
@@ -210,9 +210,51 @@ export function showUpgradeModal(title) {
|
||||
const _logLines = []
|
||||
|
||||
let _onClose = null
|
||||
closeBtn.onclick = () => { overlay.remove(); _onClose?.() }
|
||||
let _finished = false
|
||||
let _taskBar = null
|
||||
|
||||
// 重新打开弹窗(从任务状态栏点击时)
|
||||
function reopenModal() {
|
||||
if (_taskBar) { _taskBar.remove(); _taskBar = null }
|
||||
document.body.appendChild(overlay)
|
||||
}
|
||||
|
||||
// 关闭弹窗:未完成时显示任务状态栏
|
||||
function closeModal() {
|
||||
overlay.remove()
|
||||
if (!_finished) {
|
||||
showTaskBar()
|
||||
} else {
|
||||
if (_taskBar) { _taskBar.remove(); _taskBar = null }
|
||||
_onClose?.()
|
||||
}
|
||||
}
|
||||
|
||||
// 全局任务状态栏:关闭弹窗后显示在页面顶部
|
||||
function showTaskBar() {
|
||||
if (_taskBar) return
|
||||
_taskBar = document.createElement('div')
|
||||
_taskBar.className = 'upgrade-task-bar'
|
||||
_taskBar.innerHTML = `
|
||||
<span class="upgrade-task-bar-text">${text.textContent}</span>
|
||||
<button class="btn btn-sm upgrade-task-bar-open">查看详情</button>
|
||||
<button class="btn btn-sm btn-ghost upgrade-task-bar-dismiss">×</button>
|
||||
`
|
||||
_taskBar.querySelector('.upgrade-task-bar-open').onclick = reopenModal
|
||||
_taskBar.querySelector('.upgrade-task-bar-dismiss').onclick = () => { _taskBar.remove(); _taskBar = null }
|
||||
document.body.appendChild(_taskBar)
|
||||
}
|
||||
|
||||
function updateTaskBar(statusText) {
|
||||
if (_taskBar) {
|
||||
const span = _taskBar.querySelector('.upgrade-task-bar-text')
|
||||
if (span) span.textContent = statusText
|
||||
}
|
||||
}
|
||||
|
||||
closeBtn.onclick = closeModal
|
||||
overlay.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'Escape' && !closeBtn.disabled) { overlay.remove(); _onClose?.() }
|
||||
if (e.key === 'Escape') closeModal()
|
||||
})
|
||||
|
||||
return {
|
||||
@@ -233,25 +275,33 @@ export function showUpgradeModal(title) {
|
||||
getLogText() { return _logLines.join('\n') },
|
||||
setProgress(pct) {
|
||||
fill.style.width = pct + '%'
|
||||
if (pct >= 100) text.textContent = '完成'
|
||||
else if (pct >= 75) text.textContent = '正在安装...'
|
||||
else if (pct >= 30) text.textContent = '正在下载依赖...'
|
||||
else text.textContent = '准备中...'
|
||||
let statusText
|
||||
if (pct >= 100) statusText = '完成'
|
||||
else if (pct >= 75) statusText = '正在安装...'
|
||||
else if (pct >= 30) statusText = '正在下载依赖...'
|
||||
else statusText = '准备中...'
|
||||
text.textContent = statusText
|
||||
updateTaskBar(statusText)
|
||||
},
|
||||
setDone(msg) {
|
||||
_finished = true
|
||||
text.textContent = msg || '升级完成'
|
||||
fill.style.width = '100%'
|
||||
fill.classList.add('done')
|
||||
closeBtn.disabled = false
|
||||
if (_taskBar) { _taskBar.remove(); _taskBar = null }
|
||||
closeBtn.focus()
|
||||
},
|
||||
setError(msg) {
|
||||
_finished = true
|
||||
text.textContent = msg || '升级失败'
|
||||
fill.classList.add('error')
|
||||
closeBtn.disabled = false
|
||||
if (_taskBar) {
|
||||
const span = _taskBar.querySelector('.upgrade-task-bar-text')
|
||||
if (span) { span.textContent = msg || '升级失败'; span.style.color = 'var(--error)' }
|
||||
}
|
||||
closeBtn.focus()
|
||||
},
|
||||
onClose(fn) { _onClose = fn },
|
||||
destroy() { overlay.remove(); _onClose?.() },
|
||||
destroy() { overlay.remove(); if (_taskBar) { _taskBar.remove(); _taskBar = null } _onClose?.() },
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user