fix: 优化移动端导出消息布局与计数

- 调整移动端消息栈宽度,统一约束来源标签与消息内容\n- 精简档案计数文案,移除虚拟窗口已显示数量\n- 补充搜索前后消息保持单行展示的移动端回归测试
This commit is contained in:
Nanin
2026-08-06 21:32:17 +08:00
parent 307d247660
commit 88a6d750fb
3 changed files with 24 additions and 20 deletions
+3 -5
View File
@@ -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
+16
View File
@@ -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<void> => {
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: '定位到聊天位置'
+5 -15
View File
@@ -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()
})