From 88a6d750fb497ecf0771425a08e367dd100aee55 Mon Sep 17 00:00:00 2001 From: Nanin <7017924+nanin@users.noreply.github.com> Date: Thu, 6 Aug 2026 21:32:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E7=AB=AF=E5=AF=BC=E5=87=BA=E6=B6=88=E6=81=AF=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E4=B8=8E=E8=AE=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 调整移动端消息栈宽度,统一约束来源标签与消息内容\n- 精简档案计数文案,移除虚拟窗口已显示数量\n- 补充搜索前后消息保持单行展示的移动端回归测试 --- src/main/export-html-template.ts | 8 +++----- tests/e2e/export-archive.spec.ts | 16 ++++++++++++++++ tests/unit/export-media.test.ts | 20 +++++--------------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/main/export-html-template.ts b/src/main/export-html-template.ts index 7666dfd..b5e7c50 100644 --- a/src/main/export-html-template.ts +++ b/src/main/export-html-template.ts @@ -789,8 +789,8 @@ body { overscroll-behavior-x: none; touch-action: pan-y; } - .message:not(.system) .bubble { max-width: calc(100% - 50px); } - .message:not(.system) .row.has-locate .bubble { max-width: calc(100% - 90px); } + .message:not(.system) .message-stack { max-width: calc(100% - 50px); } + .message:not(.system) .row.has-locate .message-stack { max-width: calc(100% - 90px); } .audio-wrap { width: min(260px, 100%); } } ` @@ -1367,12 +1367,10 @@ const renderExportScript = (name: string): string => ` }) } const updateCount = () => { - const shown = Math.max(0, windowEnd - windowStart) const scopeTotal = activeConversation === 'all' ? allMessages.length : allMessages.filter((message) => message.exportConversationId === activeConversation).length - const scopeLabel = activeConversation === 'all' ? '全部' : '当前聊天' - count.textContent = '已显示 ' + shown + ' / 筛选 ' + filtered.length + ' / ' + scopeLabel + ' ' + scopeTotal + count.textContent = '筛选 ' + filtered.length + ' / 全部 ' + scopeTotal } const setScrollTop = (value) => { scrollLoadSuppressed = true diff --git a/tests/e2e/export-archive.spec.ts b/tests/e2e/export-archive.spec.ts index ac2321a..b9ee47a 100644 --- a/tests/e2e/export-archive.spec.ts +++ b/tests/e2e/export-archive.spec.ts @@ -256,6 +256,21 @@ test('EXPORT-ARCHIVE-01 merged v2 archive is usable offline on desktop and mobil ).toBeLessThanOrEqual(1) expect(compactControlBounds.searchWidth).toBeGreaterThan(compactControlBounds.conversationWidth) expect(compactControlBounds.searchFontSize).toBe('16px') + const personalMessageContent = page + .locator('.message') + .filter({ hasText: '个人聊天消息' }) + .locator('.content') + const expectPersonalMessageOnOneLine = async (): Promise => { + const metrics = await personalMessageContent.evaluate((element) => { + const styles = getComputedStyle(element) + return { + height: element.getBoundingClientRect().height, + lineHeight: Number.parseFloat(styles.lineHeight) + } + }) + expect(metrics.height).toBeLessThanOrEqual(metrics.lineHeight + 1) + } + await expectPersonalMessageOnOneLine() await expect(conversationTrigger.locator('.conversation-switch-icon')).toHaveCSS( 'width', '13px' @@ -276,6 +291,7 @@ test('EXPORT-ARCHIVE-01 merged v2 archive is usable offline on desktop and mobil await expect(searchInput).toBeVisible() await searchInput.fill('个人聊天消息') await expect(page.locator('.search-highlight')).toHaveText('个人聊天消息') + await expectPersonalMessageOnOneLine() const mobileSearchResult = page.locator('.message') const mobileLocateButton = mobileSearchResult.getByRole('button', { name: '定位到聊天位置' diff --git a/tests/unit/export-media.test.ts b/tests/unit/export-media.test.ts index 0df05ee..0cb7f50 100644 --- a/tests/unit/export-media.test.ts +++ b/tests/unit/export-media.test.ts @@ -73,9 +73,7 @@ describe('export media', () => { dom.window.eval(inlineScriptOf(html)) expect(dom.window.document.querySelectorAll('.message')).toHaveLength(EXPORT_PAGE_SIZE) - expect(dom.window.document.querySelector('#count')?.textContent).toBe( - '已显示 240 / 筛选 500 / 全部 500' - ) + expect(dom.window.document.querySelector('#count')?.textContent).toBe('筛选 500 / 全部 500') const list = dom.window.document.querySelector('#messages')! expect(list.querySelector('.message')?.getAttribute('data-index')).toBe('260') @@ -154,9 +152,7 @@ describe('export media', () => { 'https://example.com/xi' ) expect(dom.window.document.querySelectorAll('.search-highlight')).toHaveLength(1) - expect(dom.window.document.querySelector('#count')?.textContent).toBe( - '已显示 1 / 筛选 1 / 全部 2' - ) + expect(dom.window.document.querySelector('#count')?.textContent).toBe('筛选 1 / 全部 2') dom.window.close() }) @@ -191,25 +187,19 @@ describe('export media', () => { expect(trigger.textContent).toContain('全部聊天') expect(menu.querySelectorAll('[data-conversation-id]')).toHaveLength(3) expect(dom.window.document.querySelectorAll('.conversation-source')).toHaveLength(3) - expect(dom.window.document.querySelector('#count')?.textContent).toBe( - '已显示 3 / 筛选 3 / 全部 3' - ) + expect(dom.window.document.querySelector('#count')?.textContent).toBe('筛选 3 / 全部 3') trigger.click() ;(menu.querySelector('[data-conversation-id="alpha"]') as HTMLButtonElement).click() expect(dom.window.document.querySelectorAll('.message')).toHaveLength(2) expect(dom.window.document.querySelectorAll('.conversation-source')).toHaveLength(0) - expect(dom.window.document.querySelector('#count')?.textContent).toBe( - '已显示 2 / 筛选 2 / 当前聊天 2' - ) + expect(dom.window.document.querySelector('#count')?.textContent).toBe('筛选 2 / 全部 2') expect(dom.window.document.querySelectorAll('.timeline-month')).toHaveLength(2) const search = dom.window.document.querySelector('#query') as HTMLInputElement search.value = '共同关键词' search.dispatchEvent(new dom.window.Event('input')) expect(dom.window.document.querySelectorAll('.message')).toHaveLength(1) - expect(dom.window.document.querySelector('#count')?.textContent).toBe( - '已显示 1 / 筛选 1 / 当前聊天 2' - ) + expect(dom.window.document.querySelector('#count')?.textContent).toBe('筛选 1 / 全部 2') dom.window.close() })