feat(desktop): 收口桌面工作台视觉与活动反馈
This commit is contained in:
@@ -6,14 +6,17 @@ const readLayoutSource = () => readFileSync(resolve(__dirname, "./Layout.vue"),
|
||||
const readDesktopLayoutSource = () => readFileSync(resolve(__dirname, "./DesktopLayout.vue"), "utf8");
|
||||
const readWebLayoutSource = () => readFileSync(resolve(__dirname, "./WebLayout.vue"), "utf8");
|
||||
const readNavigationSource = () => readFileSync(resolve(__dirname, "./layout/navigation.ts"), "utf8");
|
||||
const readTauriConfigSource = () => readFileSync(resolve(__dirname, "../../src-tauri/tauri.conf.json"), "utf8");
|
||||
const readDesktopPreferencesSource = () => readFileSync(resolve(__dirname, "../views/DesktopPreferences.vue"), "utf8");
|
||||
const readDesktopServerSettingsSource = () => readFileSync(resolve(__dirname, "../views/DesktopServerSettings.vue"), "utf8");
|
||||
const readDesktopUpdateManagerSource = () => readFileSync(resolve(__dirname, "../session/desktopUpdateManager.ts"), "utf8");
|
||||
const readDesktopActivityCenterSource = () => readFileSync(resolve(__dirname, "../session/desktopActivityCenter.ts"), "utf8");
|
||||
const readProfileSettingsSource = () => readFileSync(resolve(__dirname, "../views/ProfileSettings.vue"), "utf8");
|
||||
const readLoginSource = () => readFileSync(resolve(__dirname, "../views/Login.vue"), "utf8");
|
||||
const readFileTaskFeedbackSource = () => readFileSync(resolve(__dirname, "../utils/fileTaskFeedback.ts"), "utf8");
|
||||
const readAttachmentListSource = () => readFileSync(resolve(__dirname, "./attachments/AttachmentList.vue"), "utf8");
|
||||
const readDocumentDetailSource = () => readFileSync(resolve(__dirname, "../views/documents/DocumentDetail.vue"), "utf8");
|
||||
const readMainStyleSource = () => readFileSync(resolve(__dirname, "../styles/main.css"), "utf8");
|
||||
|
||||
describe("desktop layout shell", () => {
|
||||
it("routes desktop and web shells through the runtime flag", () => {
|
||||
@@ -46,19 +49,49 @@ describe("desktop layout shell", () => {
|
||||
it("keeps desktop context labels and command entry points de-duplicated", () => {
|
||||
const source = readDesktopLayoutSource();
|
||||
|
||||
expect(source).toContain("<h1>{{ TEXT.common.appName }} Desktop</h1>");
|
||||
expect(source).toContain("<h1>{{ TEXT.common.appName }}</h1>");
|
||||
expect(source).toContain('const DESKTOP_ADMIN_SECTION_LABEL = "系统管理";');
|
||||
expect(source).toContain('data-tauri-drag-region');
|
||||
expect(source).toContain('class="toolbar-title"');
|
||||
expect(source).toContain('class="toolbar-subtitle"');
|
||||
expect(source).toContain("desktopToolbarTitle");
|
||||
expect(source).toContain("desktopToolbarSubtitle");
|
||||
expect(source).not.toContain("desktopBreadcrumbs");
|
||||
expect(source).not.toContain("breadcrumb-chip");
|
||||
expect(source).not.toContain("history-controls");
|
||||
expect(source).not.toContain('title="后退"');
|
||||
expect(source).not.toContain('title="前进"');
|
||||
expect(source).not.toContain('title="刷新当前视图"');
|
||||
expect(source).not.toContain("const sidebarTitle");
|
||||
expect(source).not.toContain('title="搜索命令"');
|
||||
expect(source).not.toContain("desktop-statusbar");
|
||||
expect(source).not.toContain("status-item");
|
||||
expect(source).not.toContain("accountProjectRoleLabel");
|
||||
expect(source).not.toContain("projectStatusLabel");
|
||||
expect(source).toContain("grid-template-rows: 48px auto minmax(0, 1fr);");
|
||||
expect(source).toContain("grid-template-rows: 52px auto minmax(0, 1fr);");
|
||||
expect(source).toContain("const adminDesktopNavigationItems");
|
||||
expect(source).toContain("const projectDesktopNavigationItems");
|
||||
expect(source).toContain('id: "desktop:refresh"');
|
||||
expect(source).toContain('shortcut: "⌘R"');
|
||||
expect(source).toContain('command === "ctms.desktop.back"');
|
||||
expect(source).toContain('command === "ctms.desktop.forward"');
|
||||
expect(source).not.toContain("const root = study.currentStudy?.name || TEXT.menu.currentProject");
|
||||
});
|
||||
|
||||
it("uses macOS overlay titlebar without adding window permissions", () => {
|
||||
const tauriConfig = readTauriConfigSource();
|
||||
const layout = readDesktopLayoutSource();
|
||||
|
||||
expect(tauriConfig).toContain('"decorations": true');
|
||||
expect(tauriConfig).toContain('"titleBarStyle": "Overlay"');
|
||||
expect(tauriConfig).toContain('"hiddenTitle": true');
|
||||
expect(tauriConfig).toContain('"trafficLightPosition": { "x": 16, "y": 18 }');
|
||||
expect(layout).toContain("padding: 54px 16px 14px;");
|
||||
expect(layout).toContain("-webkit-app-region: drag;");
|
||||
expect(layout).toContain("-webkit-app-region: no-drag;");
|
||||
expect(layout).not.toContain(["@tauri-apps", "api", "window"].join("/"));
|
||||
});
|
||||
|
||||
it("renders desktop preferences as a split settings panel", () => {
|
||||
const preferences = readDesktopPreferencesSource();
|
||||
const desktopLayout = readDesktopLayoutSource();
|
||||
@@ -218,7 +251,7 @@ describe("desktop layout shell", () => {
|
||||
expect(preferences).toContain("当前已是最新版本");
|
||||
expect(desktopUpdateManager).not.toContain("当前构建未启用桌面端自动更新");
|
||||
expect(desktopUpdateManager).not.toContain("该版本已选择稍后提醒");
|
||||
expect(desktopUpdateManager).not.toContain("当前已是最新版本");
|
||||
expect(desktopUpdateManager).toContain("当前已是最新版本");
|
||||
expect(desktopUpdateManager).toContain("桌面端更新检查失败,请稍后重试或联系管理员。");
|
||||
expect(desktopLayout).toContain("desktopUpdateNoticeVisible");
|
||||
expect(desktopLayout).toContain("listenDesktopUpdateStatus");
|
||||
@@ -233,9 +266,15 @@ describe("desktop layout shell", () => {
|
||||
expect(helper).toContain("export const pickFilesWithFeedback");
|
||||
expect(helper).toContain("export const saveFileWithFeedback");
|
||||
expect(helper).toContain("export const openFileWithFeedback");
|
||||
expect(helper).toContain("startDesktopActivity");
|
||||
expect(helper).toContain("finishDesktopActivity");
|
||||
expect(helper).toContain("desktopFileActivitiesEnabled");
|
||||
expect(attachments).toContain("pickFilesWithFeedback");
|
||||
expect(attachments).toContain("saveFileWithFeedback");
|
||||
expect(attachments).toContain("openFileWithFeedback");
|
||||
expect(attachments).toContain("startDesktopActivity");
|
||||
expect(attachments).toContain('title: "下载附件"');
|
||||
expect(attachments).toContain('title: "上传附件"');
|
||||
expect(documentDetail).toContain("pickFilesWithFeedback");
|
||||
expect(documentDetail).toContain("saveFileWithFeedback");
|
||||
expect(documentDetail).toContain("openFileWithFeedback");
|
||||
@@ -243,6 +282,42 @@ describe("desktop layout shell", () => {
|
||||
expect(documentDetail).not.toContain("openFile, pickFiles, saveFile");
|
||||
});
|
||||
|
||||
it("surfaces persistent desktop activity feedback without local task persistence", () => {
|
||||
const desktopLayout = readDesktopLayoutSource();
|
||||
const activityCenter = readDesktopActivityCenterSource();
|
||||
const updateManager = readDesktopUpdateManagerSource();
|
||||
|
||||
expect(desktopLayout).toContain('popper-class="desktop-activity-popover"');
|
||||
expect(desktopLayout).toContain("desktopActivities");
|
||||
expect(desktopLayout).toContain("listenDesktopActivities");
|
||||
expect(desktopLayout).toContain("clearFinishedDesktopActivities");
|
||||
expect(desktopLayout).toContain("desktopActivityBadgeCount");
|
||||
expect(activityCenter).toContain("DESKTOP_ACTIVITY_CHANGED_EVENT");
|
||||
expect(activityCenter).toContain("safeActivityText");
|
||||
expect(activityCenter).toContain("unsafeActivityTextPattern");
|
||||
expect(activityCenter).not.toContain("localStorage");
|
||||
expect(activityCenter).not.toContain("sessionStorage");
|
||||
expect(updateManager).toContain('title: "检查桌面更新"');
|
||||
expect(updateManager).toContain('title: "安装桌面更新"');
|
||||
expect(updateManager).toContain("finishUpdateActivity");
|
||||
});
|
||||
|
||||
it("keeps desktop business pages dense and workbench-like", () => {
|
||||
const styles = readMainStyleSource();
|
||||
|
||||
expect(styles).toContain("/* Desktop workbench density */");
|
||||
expect(styles).toContain(".desktop-workbench .desktop-route-shell .table-card");
|
||||
expect(styles).toContain(".desktop-workbench .desktop-route-shell .hero-banner");
|
||||
expect(styles).toContain(".desktop-workbench .desktop-route-shell .faq-hero");
|
||||
expect(styles).toContain("box-shadow: none !important;");
|
||||
expect(styles).toContain(".desktop-workbench .desktop-route-shell .el-table th.el-table__cell");
|
||||
expect(styles).toContain("height: 34px;");
|
||||
expect(styles).toContain(".desktop-workbench .desktop-route-shell .el-table td.el-table__cell");
|
||||
expect(styles).toContain("padding: 7px 10px;");
|
||||
expect(styles).toContain(".desktop-workbench .desktop-route-shell .el-drawer__body");
|
||||
expect(styles).toContain(":root[data-ctms-theme=\"dark\"] .desktop-workbench .desktop-route-shell .hero-stat");
|
||||
});
|
||||
|
||||
it("keeps desktop entry surfaces stable at the minimum window size", () => {
|
||||
const login = readLoginSource();
|
||||
const serverSettings = readDesktopServerSettingsSource();
|
||||
|
||||
Reference in New Issue
Block a user