diff --git a/frontend/scripts/verify-desktop-release.mjs b/frontend/scripts/verify-desktop-release.mjs index adf48e35..93d2b92d 100644 --- a/frontend/scripts/verify-desktop-release.mjs +++ b/frontend/scripts/verify-desktop-release.mjs @@ -71,6 +71,13 @@ const verifyTauriConfig = async () => { assert(!/\bconnect-src\b[^;]*\bhttp:\b/.test(csp), "Tauri CSP must not allow broad http: API access."); assert(mainWindow?.minWidth === 1180, "Main desktop window must keep the minimum width at 1180."); assert(mainWindow?.minHeight === 760, "Main desktop window must keep the minimum height at 760."); + assert(mainWindow?.decorations === true, "Main desktop window must keep native window decorations enabled."); + assert(mainWindow?.titleBarStyle === "Overlay", "Main desktop window must use the macOS overlay title bar."); + assert(mainWindow?.hiddenTitle === true, "Main desktop window must hide the native title text."); + assert( + mainWindow?.trafficLightPosition?.x === 16 && mainWindow?.trafficLightPosition?.y === 18, + "Main desktop window must keep traffic light controls at x=16 y=18.", + ); }; const verifyCapabilities = async () => { @@ -118,6 +125,9 @@ const verifyCapabilities = async () => { `${file}: notification permission ${identifier} is broader than the CTMS Desktop notification boundary.`, ); } + if (identifier.startsWith("core:window:")) { + fail(`${file}: window permissions are not allowed; use Tauri overlay drag regions instead.`); + } if (identifier.startsWith("opener:")) { assert(identifier === "opener:allow-open-path", `${file}: opener permission ${identifier} is not allowed.`); } diff --git a/frontend/src-tauri/tauri.conf.json b/frontend/src-tauri/tauri.conf.json index 238281de..05c6042b 100644 --- a/frontend/src-tauri/tauri.conf.json +++ b/frontend/src-tauri/tauri.conf.json @@ -17,7 +17,11 @@ "width": 1440, "height": 900, "minWidth": 1180, - "minHeight": 760 + "minHeight": 760, + "decorations": true, + "titleBarStyle": "Overlay", + "hiddenTitle": true, + "trafficLightPosition": { "x": 16, "y": 18 } } ], "security": { diff --git a/frontend/src/audit/export/auditExportService.ts b/frontend/src/audit/export/auditExportService.ts index b6c1182b..5943e2ca 100644 --- a/frontend/src/audit/export/auditExportService.ts +++ b/frontend/src/audit/export/auditExportService.ts @@ -24,9 +24,17 @@ export const exportAuditCsv = async (events: AuditEvent[], options: AuditExportO const rows = formatAuditRows(events); const csv = buildCsv(rows); const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" }); - await saveFileWithFeedback({ - suggestedName: options.fileName.endsWith(".csv") ? options.fileName : `${options.fileName}.csv`, - mimeType: "text/csv;charset=utf-8", - data: blob, - }); + await saveFileWithFeedback( + { + suggestedName: options.fileName.endsWith(".csv") ? options.fileName : `${options.fileName}.csv`, + mimeType: "text/csv;charset=utf-8", + data: blob, + }, + { + kind: "export", + title: "导出审计记录", + pendingDetail: "等待选择保存位置", + completedDetail: "导出文件已保存", + }, + ); }; diff --git a/frontend/src/components/DesktopLayout.vue b/frontend/src/components/DesktopLayout.vue index 4095a5b1..001f8f12 100644 --- a/frontend/src/components/DesktopLayout.vue +++ b/frontend/src/components/DesktopLayout.vue @@ -4,8 +4,7 @@