|
|
|
|
@ -1,27 +1,36 @@
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
import {
|
|
|
|
|
Back,
|
|
|
|
|
CircleCheck,
|
|
|
|
|
Close,
|
|
|
|
|
Delete,
|
|
|
|
|
ForkSpoon,
|
|
|
|
|
HotWater,
|
|
|
|
|
Memo,
|
|
|
|
|
Menu as MenuIcon,
|
|
|
|
|
MessageBox,
|
|
|
|
|
MoreFilled,
|
|
|
|
|
Phone,
|
|
|
|
|
Star,
|
|
|
|
|
Switch,
|
|
|
|
|
User,
|
|
|
|
|
VideoPause,
|
|
|
|
|
VideoPlay,
|
|
|
|
|
} from "@element-plus/icons-vue";
|
|
|
|
|
import { LogicalPosition } from "@tauri-apps/api/dpi";
|
|
|
|
|
import { Menu } from "@tauri-apps/api/menu";
|
|
|
|
|
import { getCurrentWindow } from "@tauri-apps/api/window";
|
|
|
|
|
import { appWindow } from "@tauri-apps/api/window";
|
|
|
|
|
import { ElMessage } from "element-plus";
|
|
|
|
|
import { computed, onMounted, onUnmounted, ref, watch } from "vue";
|
|
|
|
|
import { api } from "../api";
|
|
|
|
|
import { confirmNative } from "../host/dialog";
|
|
|
|
|
import { showErrorNative } from "../host/dialog";
|
|
|
|
|
import { confirmNative, showErrorNative } from "../host/dialog";
|
|
|
|
|
import { listenMainAction } from "../host/events";
|
|
|
|
|
import { log } from "../host/logger";
|
|
|
|
|
import { getSession } from "../host/session";
|
|
|
|
|
import type { SessionState } from "../host/types";
|
|
|
|
|
import { minimizeWindow, openTicketListWindow, quitApplication } from "../host/window";
|
|
|
|
|
import {
|
|
|
|
|
minimizeWindow,
|
|
|
|
|
openTicketListWindow,
|
|
|
|
|
quitApplication,
|
|
|
|
|
} from "../host/window";
|
|
|
|
|
import type { ActionButton } from "../types/action";
|
|
|
|
|
|
|
|
|
|
type ActionResultLike = {
|
|
|
|
|
@ -56,61 +65,11 @@ let isRankPollingBusy = false;
|
|
|
|
|
let queueCountPollingTimer: ReturnType<typeof setInterval> | null = null;
|
|
|
|
|
let unlistenWindowFocusChanged: (() => void) | null = null;
|
|
|
|
|
let unlistenMainAction: (() => void) | null = null;
|
|
|
|
|
let moreNativeMenuPromise: Promise<Menu> | null = null;
|
|
|
|
|
let pauseNativeMenuPromise: Promise<Menu> | null = null;
|
|
|
|
|
|
|
|
|
|
const EVALUATING_COUNTDOWN_SEC = 15;
|
|
|
|
|
const pauseReasonOptions = ["午休", "休息一下", "整理资料", "其他"];
|
|
|
|
|
const isMainWindowActive = ref(false);
|
|
|
|
|
|
|
|
|
|
function getMoreNativeMenu(): Promise<Menu> {
|
|
|
|
|
if (moreNativeMenuPromise === null) {
|
|
|
|
|
moreNativeMenuPromise = Menu.new({
|
|
|
|
|
items: [
|
|
|
|
|
{
|
|
|
|
|
id: "main",
|
|
|
|
|
text: "办税员窗口",
|
|
|
|
|
action: () => {
|
|
|
|
|
void handleMoreCommand("main");
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: "ticketList",
|
|
|
|
|
text: "票号列表",
|
|
|
|
|
action: () => {
|
|
|
|
|
void handleMoreCommand("ticketList");
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{ item: "Separator" },
|
|
|
|
|
{
|
|
|
|
|
id: "logout",
|
|
|
|
|
text: "退出程序",
|
|
|
|
|
action: () => {
|
|
|
|
|
void handleMoreCommand("logout");
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return moreNativeMenuPromise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getPauseNativeMenu(): Promise<Menu> {
|
|
|
|
|
if (pauseNativeMenuPromise === null) {
|
|
|
|
|
pauseNativeMenuPromise = Menu.new({
|
|
|
|
|
items: pauseReasonOptions.map((reason) => ({
|
|
|
|
|
id: reason,
|
|
|
|
|
text: reason,
|
|
|
|
|
action: () => {
|
|
|
|
|
void confirmPauseReason(reason);
|
|
|
|
|
},
|
|
|
|
|
})),
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return pauseNativeMenuPromise;
|
|
|
|
|
}
|
|
|
|
|
const buttonPanel = ref<"main" | "more" | "pause">("main");
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 记录错误日志。
|
|
|
|
|
@ -123,7 +82,9 @@ async function logErr(context: string, error: unknown): Promise<void> {
|
|
|
|
|
/**
|
|
|
|
|
* 提取后端动作返回对象。
|
|
|
|
|
*/
|
|
|
|
|
function getActionData(res: unknown): NonNullable<ActionResultLike["data"]> | ActionResultLike {
|
|
|
|
|
function getActionData(
|
|
|
|
|
res: unknown,
|
|
|
|
|
): NonNullable<ActionResultLike["data"]> | ActionResultLike {
|
|
|
|
|
const result = (res ?? {}) as ActionResultLike;
|
|
|
|
|
return result.data && typeof result.data === "object" ? result.data : result;
|
|
|
|
|
}
|
|
|
|
|
@ -292,7 +253,10 @@ async function pollQueueCountOnce(): Promise<void> {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const res = await api.action.getQueueCount({ windowUid });
|
|
|
|
|
const count = typeof res.queueCount === "number" ? res.queueCount : Number(res.count ?? 0);
|
|
|
|
|
const count =
|
|
|
|
|
typeof res.queueCount === "number"
|
|
|
|
|
? res.queueCount
|
|
|
|
|
: Number(res.count ?? 0);
|
|
|
|
|
message.value = `欢迎使用紫云呼叫终端,当前窗口等候人数:${count}`;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
await logErr("查询 getQueueCount 失败", error);
|
|
|
|
|
@ -359,7 +323,13 @@ const buttons = computed<ActionButton[]>(() => {
|
|
|
|
|
icon: VideoPlay,
|
|
|
|
|
label: "开始",
|
|
|
|
|
action: "start",
|
|
|
|
|
enabled: !["idle", "paused", "working", "evaluating", "transferring"].includes(callStatus.value),
|
|
|
|
|
enabled: ![
|
|
|
|
|
"idle",
|
|
|
|
|
"paused",
|
|
|
|
|
"working",
|
|
|
|
|
"evaluating",
|
|
|
|
|
"transferring",
|
|
|
|
|
].includes(callStatus.value),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
@ -367,7 +337,9 @@ const buttons = computed<ActionButton[]>(() => {
|
|
|
|
|
icon: Phone,
|
|
|
|
|
label: callBtnText.value,
|
|
|
|
|
action: "call",
|
|
|
|
|
enabled: !["paused", "working", "evaluating", "transferring"].includes(callStatus.value),
|
|
|
|
|
enabled: !["paused", "working", "evaluating", "transferring"].includes(
|
|
|
|
|
callStatus.value,
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
startOrComplete,
|
|
|
|
|
{
|
|
|
|
|
@ -380,19 +352,33 @@ const buttons = computed<ActionButton[]>(() => {
|
|
|
|
|
icon: Switch,
|
|
|
|
|
label: "转移",
|
|
|
|
|
action: "transfer",
|
|
|
|
|
enabled: !["idle", "calling", "paused", "evaluating", "transferring"].includes(callStatus.value),
|
|
|
|
|
enabled: ![
|
|
|
|
|
"idle",
|
|
|
|
|
"calling",
|
|
|
|
|
"paused",
|
|
|
|
|
"evaluating",
|
|
|
|
|
"transferring",
|
|
|
|
|
].includes(callStatus.value),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
icon: VideoPause,
|
|
|
|
|
label: pauseBtnText.value,
|
|
|
|
|
action: "pause",
|
|
|
|
|
enabled: !["calling", "working", "evaluating", "transferring"].includes(callStatus.value),
|
|
|
|
|
enabled: !["calling", "working", "evaluating", "transferring"].includes(
|
|
|
|
|
callStatus.value,
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
icon: Star,
|
|
|
|
|
label: "评价",
|
|
|
|
|
action: "evaluate",
|
|
|
|
|
enabled: !["idle", "calling", "paused", "working", "transferring"].includes(callStatus.value),
|
|
|
|
|
enabled: ![
|
|
|
|
|
"idle",
|
|
|
|
|
"calling",
|
|
|
|
|
"paused",
|
|
|
|
|
"working",
|
|
|
|
|
"transferring",
|
|
|
|
|
].includes(callStatus.value),
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
});
|
|
|
|
|
@ -414,7 +400,11 @@ async function callAction(): Promise<void> {
|
|
|
|
|
const ticketUid = callingTkt.value > 0 ? callingTkt.value : null;
|
|
|
|
|
|
|
|
|
|
if (callStatus.value === "calling" && callingTkt.value > 0) {
|
|
|
|
|
const recallRes = await api.action.recall({ windowUid, empUid, ticketUid: callingTkt.value });
|
|
|
|
|
const recallRes = await api.action.recall({
|
|
|
|
|
windowUid,
|
|
|
|
|
empUid,
|
|
|
|
|
ticketUid: callingTkt.value,
|
|
|
|
|
});
|
|
|
|
|
if (isActionSuccess(recallRes)) {
|
|
|
|
|
updateLog(`已重呼:${getActionTicketNo(recallRes)},请勿重复点击!`);
|
|
|
|
|
await log("info", `重呼成功: ticketNo=${getActionTicketNo(recallRes)}`);
|
|
|
|
|
@ -430,7 +420,10 @@ async function callAction(): Promise<void> {
|
|
|
|
|
callBtnText.value = "重呼";
|
|
|
|
|
callingTkt.value = getActionTicketUid(res);
|
|
|
|
|
updateLog(`正在呼叫:${getActionTicketNo(res)}`);
|
|
|
|
|
await log("info", `呼叫成功: ticketNo=${getActionTicketNo(res)}, ticketUid=${getActionTicketUid(res)}`);
|
|
|
|
|
await log(
|
|
|
|
|
"info",
|
|
|
|
|
`呼叫成功: ticketNo=${getActionTicketNo(res)}, ticketUid=${getActionTicketUid(res)}`,
|
|
|
|
|
);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -554,7 +547,7 @@ async function evaluateAction(): Promise<void> {
|
|
|
|
|
async function pauseAction(): Promise<void> {
|
|
|
|
|
try {
|
|
|
|
|
if (callStatus.value !== "paused") {
|
|
|
|
|
await openPauseContextMenu();
|
|
|
|
|
buttonPanel.value = "pause";
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -594,12 +587,15 @@ async function confirmPauseReason(reason: string): Promise<void> {
|
|
|
|
|
callStatus.value = "paused";
|
|
|
|
|
pauseBtnText.value = "恢复";
|
|
|
|
|
updateLog(`暂停中,原因:${pauseReason}`);
|
|
|
|
|
buttonPanel.value = "main";
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateLog(`暂停未成功: ${getActionMessage(res) || "unknown"}`);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
await logErr("暂停失败", error);
|
|
|
|
|
} finally {
|
|
|
|
|
buttonPanel.value = "main";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -638,43 +634,39 @@ function handleButtonClick(button: ActionButton): void {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function openMoreContextMenu(event: MouseEvent): Promise<void> {
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
const position = new LogicalPosition(event.clientX, event.clientY + 8);
|
|
|
|
|
try {
|
|
|
|
|
const menu = await getMoreNativeMenu();
|
|
|
|
|
await menu.popup(position);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
await logErr("更多菜单 popup 失败", error);
|
|
|
|
|
await showErrorNative("更多菜单弹出失败,请查看日志");
|
|
|
|
|
}
|
|
|
|
|
async function openMoreContextMenu(): Promise<void> {
|
|
|
|
|
buttonPanel.value = "more";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function openPauseContextMenu(): Promise<void> {
|
|
|
|
|
try {
|
|
|
|
|
const menu = await getPauseNativeMenu();
|
|
|
|
|
const pauseButton = document.querySelector<HTMLButtonElement>('[data-action="pause"]');
|
|
|
|
|
if (!pauseButton) {
|
|
|
|
|
await menu.popup(new LogicalPosition(16, 56));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
function backToMainPanel(): void {
|
|
|
|
|
buttonPanel.value = "main";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const rect = pauseButton.getBoundingClientRect();
|
|
|
|
|
await menu.popup(new LogicalPosition(rect.left, rect.bottom + 8));
|
|
|
|
|
} catch (error) {
|
|
|
|
|
await logErr("暂停菜单 popup 失败", error);
|
|
|
|
|
await showErrorNative("暂停菜单弹出失败,请查看日志");
|
|
|
|
|
function getPauseReasonIcon(reason: string) {
|
|
|
|
|
switch (reason) {
|
|
|
|
|
case "午休":
|
|
|
|
|
return ForkSpoon;
|
|
|
|
|
case "休息一下":
|
|
|
|
|
return HotWater;
|
|
|
|
|
case "整理资料":
|
|
|
|
|
return MessageBox;
|
|
|
|
|
case "其他":
|
|
|
|
|
return MoreFilled;
|
|
|
|
|
default:
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理顶部更多菜单动作。
|
|
|
|
|
*/
|
|
|
|
|
async function handleMoreCommand(command: "main" | "ticketList" | "logout"): Promise<void> {
|
|
|
|
|
async function handleMoreCommand(
|
|
|
|
|
command: "main" | "ticketList" | "logout",
|
|
|
|
|
): Promise<void> {
|
|
|
|
|
try {
|
|
|
|
|
if (command === "main") {
|
|
|
|
|
updateLog("当前已在办税员窗口");
|
|
|
|
|
buttonPanel.value = "main";
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -684,6 +676,7 @@ async function handleMoreCommand(command: "main" | "ticketList" | "logout"): Pro
|
|
|
|
|
await minimizeWindow();
|
|
|
|
|
await openTicketList();
|
|
|
|
|
updateLog("票号列表已打开");
|
|
|
|
|
buttonPanel.value = "main";
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -703,6 +696,10 @@ async function handleMoreCommand(command: "main" | "ticketList" | "logout"): Pro
|
|
|
|
|
await logErr(`更多菜单处理失败: ${command}`, error);
|
|
|
|
|
await showErrorNative("操作失败,请查看日志");
|
|
|
|
|
updateLog(`操作失败: ${command}`);
|
|
|
|
|
} finally {
|
|
|
|
|
if (command !== "logout") {
|
|
|
|
|
buttonPanel.value = "main";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -713,7 +710,8 @@ onMounted(async () => {
|
|
|
|
|
empUid: parseOptionalNumber(session.empUid),
|
|
|
|
|
winUid: parseOptionalNumber(session.winUid),
|
|
|
|
|
queueToken:
|
|
|
|
|
typeof session.queueToken === "string" && session.queueToken.trim() !== ""
|
|
|
|
|
typeof session.queueToken === "string" &&
|
|
|
|
|
session.queueToken.trim() !== ""
|
|
|
|
|
? session.queueToken
|
|
|
|
|
: null,
|
|
|
|
|
};
|
|
|
|
|
@ -722,11 +720,19 @@ onMounted(async () => {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const currentWindow = getCurrentWindow();
|
|
|
|
|
isMainWindowActive.value = await currentWindow.isVisible();
|
|
|
|
|
unlistenWindowFocusChanged = await currentWindow.onFocusChanged(({ payload }) => {
|
|
|
|
|
isMainWindowActive.value = payload;
|
|
|
|
|
});
|
|
|
|
|
isMainWindowActive.value = await appWindow.isVisible();
|
|
|
|
|
const onFocus = () => {
|
|
|
|
|
isMainWindowActive.value = true;
|
|
|
|
|
};
|
|
|
|
|
const onBlur = () => {
|
|
|
|
|
isMainWindowActive.value = false;
|
|
|
|
|
};
|
|
|
|
|
window.addEventListener("focus", onFocus);
|
|
|
|
|
window.addEventListener("blur", onBlur);
|
|
|
|
|
unlistenWindowFocusChanged = () => {
|
|
|
|
|
window.removeEventListener("focus", onFocus);
|
|
|
|
|
window.removeEventListener("blur", onBlur);
|
|
|
|
|
};
|
|
|
|
|
} catch (error) {
|
|
|
|
|
await logErr("订阅主窗口焦点事件失败", error);
|
|
|
|
|
}
|
|
|
|
|
@ -762,27 +768,104 @@ onUnmounted(() => {
|
|
|
|
|
<template>
|
|
|
|
|
<div class="main-bg" @dblclick.prevent.stop>
|
|
|
|
|
<div class="btn-div">
|
|
|
|
|
<button class="action-button action-button-menu" type="button" @click="openMoreContextMenu">
|
|
|
|
|
<el-icon class="button-icon">
|
|
|
|
|
<component :is="MenuIcon" />
|
|
|
|
|
</el-icon>
|
|
|
|
|
</button>
|
|
|
|
|
<div class="divider-vertical"></div>
|
|
|
|
|
<button
|
|
|
|
|
v-for="(btn, index) in buttons"
|
|
|
|
|
:key="index"
|
|
|
|
|
type="button"
|
|
|
|
|
class="action-button"
|
|
|
|
|
:data-action="btn.action"
|
|
|
|
|
:class="{ disabled: !btn.enabled }"
|
|
|
|
|
:style="{ color: !btn.enabled ? '#ccc' : textColor }"
|
|
|
|
|
@click="handleButtonClick(btn)"
|
|
|
|
|
>
|
|
|
|
|
<el-icon class="button-icon" :style="{ color: !btn.enabled ? '#ccc' : iconColor }">
|
|
|
|
|
<component :is="btn.icon" />
|
|
|
|
|
</el-icon>
|
|
|
|
|
<span class="button-label">{{ btn.label }}</span>
|
|
|
|
|
</button>
|
|
|
|
|
<template v-if="buttonPanel === 'main'">
|
|
|
|
|
<button
|
|
|
|
|
class="action-button action-button-menu"
|
|
|
|
|
type="button"
|
|
|
|
|
@click="openMoreContextMenu"
|
|
|
|
|
>
|
|
|
|
|
<el-icon class="button-icon">
|
|
|
|
|
<component :is="MenuIcon" />
|
|
|
|
|
</el-icon>
|
|
|
|
|
</button>
|
|
|
|
|
<div class="divider-vertical"></div>
|
|
|
|
|
<button
|
|
|
|
|
v-for="(btn, index) in buttons"
|
|
|
|
|
:key="index"
|
|
|
|
|
type="button"
|
|
|
|
|
class="action-button"
|
|
|
|
|
:data-action="btn.action"
|
|
|
|
|
:class="{ disabled: !btn.enabled }"
|
|
|
|
|
:style="{ color: !btn.enabled ? '#ccc' : textColor }"
|
|
|
|
|
@click="handleButtonClick(btn)"
|
|
|
|
|
>
|
|
|
|
|
<el-icon
|
|
|
|
|
class="button-icon"
|
|
|
|
|
:style="{ color: !btn.enabled ? '#ccc' : iconColor }"
|
|
|
|
|
>
|
|
|
|
|
<component :is="btn.icon" />
|
|
|
|
|
</el-icon>
|
|
|
|
|
<span class="button-label">{{ btn.label }}</span>
|
|
|
|
|
</button>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<template v-else-if="buttonPanel === 'more'">
|
|
|
|
|
<button
|
|
|
|
|
class="action-button action-button-panel"
|
|
|
|
|
type="button"
|
|
|
|
|
@click="handleMoreCommand('main')"
|
|
|
|
|
>
|
|
|
|
|
<el-icon class="button-icon">
|
|
|
|
|
<component :is="User" />
|
|
|
|
|
</el-icon>
|
|
|
|
|
<span class="button-label">办税员窗口</span>
|
|
|
|
|
</button>
|
|
|
|
|
<button
|
|
|
|
|
class="action-button action-button-panel"
|
|
|
|
|
type="button"
|
|
|
|
|
@click="handleMoreCommand('ticketList')"
|
|
|
|
|
>
|
|
|
|
|
<el-icon class="button-icon">
|
|
|
|
|
<component :is="Memo" />
|
|
|
|
|
</el-icon>
|
|
|
|
|
<span class="button-label">票号列表</span>
|
|
|
|
|
</button>
|
|
|
|
|
<button
|
|
|
|
|
class="action-button action-button-panel"
|
|
|
|
|
type="button"
|
|
|
|
|
@click="handleMoreCommand('logout')"
|
|
|
|
|
>
|
|
|
|
|
<el-icon class="button-icon">
|
|
|
|
|
<component :is="Close" />
|
|
|
|
|
</el-icon>
|
|
|
|
|
<span class="button-label">退出程序</span>
|
|
|
|
|
</button>
|
|
|
|
|
<button
|
|
|
|
|
class="action-button action-button-panel action-button-back"
|
|
|
|
|
type="button"
|
|
|
|
|
@click="backToMainPanel"
|
|
|
|
|
>
|
|
|
|
|
<el-icon class="button-icon">
|
|
|
|
|
<component :is="Back" />
|
|
|
|
|
</el-icon>
|
|
|
|
|
<span class="button-label">返回</span>
|
|
|
|
|
</button>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<template v-else>
|
|
|
|
|
<button
|
|
|
|
|
v-for="reason in pauseReasonOptions"
|
|
|
|
|
:key="reason"
|
|
|
|
|
class="action-button action-button-panel"
|
|
|
|
|
type="button"
|
|
|
|
|
@click="confirmPauseReason(reason)"
|
|
|
|
|
>
|
|
|
|
|
<el-icon v-if="getPauseReasonIcon(reason)" class="button-icon">
|
|
|
|
|
<component :is="getPauseReasonIcon(reason)" />
|
|
|
|
|
</el-icon>
|
|
|
|
|
<span class="button-label">{{ reason }}</span>
|
|
|
|
|
</button>
|
|
|
|
|
<button
|
|
|
|
|
class="action-button action-button-panel action-button-back"
|
|
|
|
|
type="button"
|
|
|
|
|
@click="backToMainPanel"
|
|
|
|
|
>
|
|
|
|
|
<el-icon class="button-icon">
|
|
|
|
|
<component :is="Back" />
|
|
|
|
|
</el-icon>
|
|
|
|
|
<span class="button-label">返回</span>
|
|
|
|
|
</button>
|
|
|
|
|
</template>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="divider-horizontal"></div>
|
|
|
|
|
<div class="log-div" data-tauri-drag-region @dblclick.prevent.stop>
|
|
|
|
|
@ -800,8 +883,11 @@ onUnmounted(() => {
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
align-items: center;
|
|
|
|
|
background:
|
|
|
|
|
linear-gradient(180deg, rgba(53, 64, 94, 0.96) 0%, rgba(25, 29, 40, 0.98) 100%);
|
|
|
|
|
background: linear-gradient(
|
|
|
|
|
180deg,
|
|
|
|
|
rgba(53, 64, 94, 0.96) 0%,
|
|
|
|
|
rgba(25, 29, 40, 0.98) 100%
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.btn-div {
|
|
|
|
|
@ -877,9 +963,12 @@ onUnmounted(() => {
|
|
|
|
|
color: #99ccff;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.action-button-panel {
|
|
|
|
|
color: #fff;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.action-button-close {
|
|
|
|
|
margin-left: auto;
|
|
|
|
|
color: #dcdfe6;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
</style>
|
|
|
|
|
|