feat(task-buttons): 外链按钮新增「打开方式」(新窗口/当前窗口)

按钮管理(/page/strategy/admin/task-buttons)的 url 外链按钮可配置打开方式:
- blank=新窗口(默认,window.open(_blank),行为同改前)
- self=当前窗口(window.location.assign,嵌入态即当前 iframe)

新增 TaskButton.openMode 字段贯通前后端:前端 task-buttons.ts 类型+种子+
runTaskButton 打开逻辑、api 客户端 snake⇄camel 映射、TaskButtonsPage 下拉;
后端 router schema + ORM open_mode 列(可空默认 blank,启动自动 ALTER 补列,
无需手动迁移)+ sql/memory store 归一化。仅 url 类型生效。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
fengxiangdebaoziandClaude Opus 4.8 committed 2026-06-19 16:09:01 +08:00
1 parent e906a911b2
commit a9f01bec79
7 files changed
+41 -1

No files matched your search

@@ -15,6 +15,7 @@ import type {
TaskButton,
TaskButtonIdKind,
TaskButtonLinkType,
TaskButtonOpenMode,
} from "@/core/auth/task-buttons";
const BASE = () => `${getBackendBaseURL()}/api/task-buttons`;
@@ -28,6 +29,7 @@ interface ServerButton {
append_task_id: boolean;
id_param: string;
id_kind: string;
open_mode: string;
enabled: boolean;
sort_order: number;
}
@@ -42,6 +44,7 @@ function toButton(s: ServerButton): TaskButton {
appendTaskId: s.append_task_id ?? true,
idParam: s.id_param || "id",
idKind: (s.id_kind as TaskButtonIdKind) ?? "task",
openMode: (s.open_mode as TaskButtonOpenMode) ?? "blank",
enabled: s.enabled ?? true,
sortOrder: s.sort_order ?? 0,
};
@@ -57,6 +60,7 @@ function toBody(b: TaskButton): ServerButton {
append_task_id: b.appendTaskId,
id_param: b.idParam,
id_kind: b.idKind,
open_mode: b.openMode,
enabled: b.enabled,
sort_order: b.sortOrder,
};