反馈改右上角轻提示;侧栏加撤回重做等配置动作

设置页的横幅换成 toast(右滑入、几秒后上移淡出,web/toast.ts 单例):
动作结果看一眼就行,不值得在页面里占一块常驻位置。表单校验类的错误
仍留在各自表单里。

撤回栈就是备份链:撤回把最新备份应用回去并消费掉它,撤回前的状态进
重做栈(.patchbay-redo,同样留 10 份);重做反向;新的正常保存清空
重做栈,不留分叉历史。这两条路复用 applyConfig 的保护链路,用
restoreFrom 参数跳过自建备份——否则备份链会被撤回本身污染,撤两次
等于原地打转。侧栏左下角一排图标:撤回、重做、历史记录(备份列表
弹窗)、更新配置(POST /api/kernel/reload,给 SSH 手改后用)、重启
内核;收拢时容器变窄自动折成一列。

设置页顺手修三处:GEO 行的编辑按钮在输入框开着时再点会闪(blur 关了
click 又开),mousedown.prevent 保焦点、click 显式开关;上传按钮改
「选择或拖放文件」,投放区拖入高亮;恢复策略挪到恢复行下面。
This commit is contained in:
2026-08-12 01:59:22 +08:00
parent 2580c03bfa
commit f761d13579
9 changed files with 798 additions and 106 deletions
+11 -1
View File
@@ -141,7 +141,14 @@ export const api = {
applyConfig: (data: ConfigObject, baseRevision: string) =>
request<ApplySuccess>('PUT', '/api/config', { data, baseRevision }),
listBackups: () => request<{ backups: string[] }>('GET', '/api/config/backups'),
/** 备份链(撤回栈)和重做栈深度。侧栏用它决定撤回/重做按钮亮不亮。 */
listBackups: () => request<{ backups: string[]; redo: number }>('GET', '/api/config/backups'),
/** 撤回最近一次改动:应用最新备份并消费掉它,撤回前的状态进重做栈。 */
undoConfig: () => request<ApplySuccess>('POST', '/api/config/undo'),
/** 重做最近一次被撤回的改动。新的正常保存会清空重做栈。 */
redoConfig: () => request<ApplySuccess>('POST', '/api/config/redo'),
/** 配置文件的原文,给「下载当前配置」用。 */
configRaw: async (): Promise<string> => {
@@ -189,6 +196,9 @@ export const api = {
*/
restartKernel: () => request<{ ok: true }>('POST', '/api/kernel/restart'),
/** 让内核重新加载磁盘上的配置文件。给 SSH 手改过配置的场景用。 */
reloadKernelConfig: () => request<{ ok: true }>('POST', '/api/kernel/reload'),
/**
* 让内核更新 GEO 数据库。同步接口,下载完才回话,可能要等上几十秒。
* 内核只有全量更新这一个口子,没变化的文件靠内容哈希跳过重写。