diff --git a/frontend-web/src/core/auth/task-buttons.ts b/frontend-web/src/core/auth/task-buttons.ts
index e7f10d42..edc31642 100644
--- a/frontend-web/src/core/auth/task-buttons.ts
+++ b/frontend-web/src/core/auth/task-buttons.ts
@@ -59,6 +59,9 @@ export type TaskButtonLinkType = "url" | "business" | "purpose";
/** 追加的 id 取哪种:``task``=任务id(默认)/ ``action``=行动id(仅 xdfx 二者不同)。 */
export type TaskButtonIdKind = "task" | "action";
+/** ``url`` 外链打开方式:``blank``=新窗口(默认)/ ``self``=当前窗口(嵌入态即当前 iframe)。 */
+export type TaskButtonOpenMode = "blank" | "self";
+
/** 一个可配置跳转按钮。 */
export interface TaskButton {
id: string;
@@ -76,6 +79,8 @@ export interface TaskButton {
* 实为行动id,任务id 由 action 接口解析。其它业务两者相同。
*/
idKind: TaskButtonIdKind;
+ /** ``url`` 外链打开方式:``blank``=新窗口(默认)/ ``self``=当前窗口。仅 ``url`` 类型有意义。 */
+ openMode: TaskButtonOpenMode;
enabled: boolean;
sortOrder: number;
}
@@ -109,6 +114,7 @@ export function defaultTaskButtons(cfg: TaskDeeplinkConfig): TaskButton[] {
appendTaskId: false,
idParam: "id",
idKind: "task",
+ openMode: "blank",
enabled: true,
sortOrder,
});
@@ -122,6 +128,7 @@ export function defaultTaskButtons(cfg: TaskDeeplinkConfig): TaskButton[] {
appendTaskId: false,
idParam: "id",
idKind: "task",
+ openMode: "blank",
enabled: true,
sortOrder,
});
@@ -136,6 +143,7 @@ export function defaultTaskButtons(cfg: TaskDeeplinkConfig): TaskButton[] {
appendTaskId: true,
idParam: "id",
idKind: "task",
+ openMode: "blank",
enabled: true,
sortOrder: 0,
},
@@ -148,6 +156,7 @@ export function defaultTaskButtons(cfg: TaskDeeplinkConfig): TaskButton[] {
appendTaskId: true,
idParam: "id",
idKind: "task",
+ openMode: "blank",
enabled: true,
sortOrder: 1,
},
@@ -160,6 +169,7 @@ export function defaultTaskButtons(cfg: TaskDeeplinkConfig): TaskButton[] {
appendTaskId: true,
idParam: "id",
idKind: "task",
+ openMode: "blank",
enabled: true,
sortOrder: 2,
},
@@ -227,7 +237,12 @@ export async function runTaskButton(btn: TaskButton, ctx: RunTaskButtonCtx): Pro
const id = btn.idKind === "action" ? ctx.actionId || ctx.taskId : ctx.taskId;
const param = (btn.idParam || "id").trim() || "id";
const url = btn.appendTaskId && id ? appendQueryParam(base, param, id) : base;
- window.open(url, "_blank", "noopener,noreferrer");
+ // 打开方式:self=当前窗口(嵌入态即当前 iframe);否则 blank=新窗口(默认)。
+ if (btn.openMode === "self") {
+ window.location.assign(url);
+ } else {
+ window.open(url, "_blank", "noopener,noreferrer");
+ }
return;
}
// business:内部切换到另一业务
diff --git a/frontend-web/src/pages/TaskButtonsPage.tsx b/frontend-web/src/pages/TaskButtonsPage.tsx
index dfd5f47e..59d8373b 100644
--- a/frontend-web/src/pages/TaskButtonsPage.tsx
+++ b/frontend-web/src/pages/TaskButtonsPage.tsx
@@ -104,6 +104,7 @@ export default function TaskButtonsPage() {
appendTaskId: true,
idParam: "id",
idKind: "task",
+ openMode: "blank",
enabled: true,
sortOrder: maxSort + 1,
},
@@ -305,6 +306,19 @@ export default function TaskButtonsPage() {
)}
)}
+
+
>
) : (