fix: 优化报销创建页面样式与洞察面板交互
修复侧边栏和审计视图样式细节,完善差旅报销洞察面板和消息 组件布局,优化报销创建页面会话管理和流程状态持久化,增强 申请预览工具函数和导航图标,补充单元测试。
This commit is contained in:
@@ -16,6 +16,7 @@ import {
|
||||
normalizeApplicationPreview,
|
||||
shouldUseLocalApplicationPreview
|
||||
} from '../src/utils/expenseApplicationPreview.js'
|
||||
import { renderMarkdown } from '../src/utils/markdown.js'
|
||||
|
||||
const submitComposerScript = readFileSync(
|
||||
fileURLToPath(new URL('../src/views/scripts/useTravelReimbursementSubmitComposer.js', import.meta.url)),
|
||||
@@ -29,6 +30,14 @@ const createViewTemplate = readFileSync(
|
||||
fileURLToPath(new URL('../src/views/TravelReimbursementCreateView.vue', import.meta.url)),
|
||||
'utf8'
|
||||
)
|
||||
const messageItemTemplate = readFileSync(
|
||||
fileURLToPath(new URL('../src/components/travel/TravelReimbursementMessageItem.vue', import.meta.url)),
|
||||
'utf8'
|
||||
)
|
||||
const messageItemStyles = readFileSync(
|
||||
fileURLToPath(new URL('../src/assets/styles/components/travel-reimbursement-message-item.css', import.meta.url)),
|
||||
'utf8'
|
||||
)
|
||||
const conversationModelScript = readFileSync(
|
||||
fileURLToPath(new URL('../src/views/scripts/travelReimbursementConversationModel.js', import.meta.url)),
|
||||
'utf8'
|
||||
@@ -96,6 +105,7 @@ test('application preview renders ordered editable rows and submit text uses edi
|
||||
)
|
||||
assert.equal(rows.find((row) => row.key === 'amount')?.value, '1900元')
|
||||
assert.equal(rows.find((row) => row.key === 'amount')?.highlight, true)
|
||||
assert.equal(rows.find((row) => row.key === 'grade')?.editable, false)
|
||||
assert.equal(rows.find((row) => row.key === 'lodgingDailyCap')?.editable, false)
|
||||
assert.match(buildApplicationPreviewSubmitText(editedPreview), /事由:客户现场项目支持/)
|
||||
assert.match(buildApplicationPreviewSubmitText(editedPreview), /用户预估费用:1900元/)
|
||||
@@ -200,6 +210,7 @@ test('application quick start renders a template without model review', () => {
|
||||
assert.equal(preview.fields.applicant, '李文静')
|
||||
assert.equal(preview.fields.department, '财务部')
|
||||
assert.equal(preview.fields.grade, 'P5')
|
||||
assert.equal(buildApplicationPreviewRows(preview).find((row) => row.key === 'grade')?.editable, false)
|
||||
assert.match(message, /不调用大模型/)
|
||||
assert.match(message, /点击对应行直接填写/)
|
||||
assert.doesNotMatch(message, /#application-submit/)
|
||||
@@ -238,26 +249,56 @@ test('application session shows intent flow, persists preview, and supports inli
|
||||
assert.match(conversationModelScript, /applicationPreview: null/)
|
||||
assert.match(conversationModelScript, /applicationPreview: message\.applicationPreview \|\| null/)
|
||||
|
||||
assert.match(createViewTemplate, /class="application-preview-table"/)
|
||||
assert.match(createViewTemplate, /class="application-preview-footer message-answer-content message-answer-markdown"/)
|
||||
assert.match(createViewTemplate, /v-html="renderMarkdown\(buildApplicationPreviewFooterText\(message\)\)"/)
|
||||
assert.match(messageItemTemplate, /class="application-preview-table"/)
|
||||
assert.match(messageItemTemplate, /class="application-preview-footer application-preview-footer-missing"/)
|
||||
assert.match(messageItemTemplate, /application-preview-missing-chip/)
|
||||
assert.match(messageItemTemplate, /当前还需要补充:/)
|
||||
assert.match(messageItemTemplate, /补齐后我再帮您提交申请。/)
|
||||
assert.match(messageItemTemplate, /class="application-preview-footer message-answer-content message-answer-markdown"/)
|
||||
assert.match(messageItemTemplate, /v-html="ui\.renderMarkdown\(ui\.buildApplicationPreviewFooterText\(message\)\)"/)
|
||||
assert.match(createViewTemplate, /'has-insight': hasInsightPanelContent && showInsightPanel/)
|
||||
assert.match(createViewTemplate, /v-model="applicationPreviewEditor\.draftValue"/)
|
||||
assert.match(createViewTemplate, /application-preview-select/)
|
||||
assert.match(createViewTemplate, /resolveApplicationPreviewEditorOptions/)
|
||||
assert.match(createViewTemplate, /row\.editable && !isApplicationPreviewEditing\(message, row\.key\).*openApplicationPreviewEditor\(message, row\.key, row\.value\)"/)
|
||||
assert.match(createViewTemplate, /@keydown\.enter\.prevent="row\.editable && !isApplicationPreviewEditing\(message, row\.key\).*openApplicationPreviewEditor\(message, row\.key, row\.value\)"/)
|
||||
assert.match(createViewTemplate, /@keydown\.stop="handleApplicationPreviewEditorKeydown\(\$event, message\)"/)
|
||||
assert.match(createViewTemplate, /mdi mdi-pencil-outline/)
|
||||
assert.match(createViewTemplate, /@click\.stop="openApplicationPreviewEditor\(message, row\.key, row\.value\)"/)
|
||||
assert.match(createViewTemplate, /openApplicationPreviewEditor/)
|
||||
assert.match(createViewTemplate, /commitApplicationPreviewEditor/)
|
||||
assert.match(messageItemTemplate, /v-model="ui\.applicationPreviewEditor\.draftValue"/)
|
||||
assert.match(messageItemTemplate, /application-preview-select/)
|
||||
assert.match(messageItemTemplate, /resolveApplicationPreviewEditorOptions/)
|
||||
assert.match(messageItemTemplate, /row\.editable && !ui\.isApplicationPreviewEditing\(message, row\.key\).*ui\.openApplicationPreviewEditor\(message, row\.key, row\.value\)"/)
|
||||
assert.match(messageItemTemplate, /@keydown\.enter\.prevent="row\.editable && !ui\.isApplicationPreviewEditing\(message, row\.key\).*ui\.openApplicationPreviewEditor\(message, row\.key, row\.value\)"/)
|
||||
assert.match(messageItemTemplate, /@keydown\.stop="ui\.handleApplicationPreviewEditorKeydown\(\$event, message\)"/)
|
||||
assert.match(messageItemTemplate, /mdi mdi-pencil-outline/)
|
||||
assert.match(messageItemTemplate, /@click\.stop="ui\.openApplicationPreviewEditor\(message, row\.key, row\.value\)"/)
|
||||
assert.match(messageItemTemplate, /openApplicationPreviewEditor/)
|
||||
assert.match(messageItemTemplate, /commitApplicationPreviewEditor/)
|
||||
assert.match(createViewScript, /resolveApplicationPreviewMissingFields/)
|
||||
|
||||
assert.match(previewEditorScript, /normalizeApplicationPreview/)
|
||||
assert.match(previewEditorScript, /APPLICATION_TRANSPORT_MODE_OPTIONS/)
|
||||
assert.match(previewEditorScript, /buildLocalApplicationPreviewMessage/)
|
||||
assert.match(previewEditorScript, /targetRow\.editable === false/)
|
||||
assert.match(previewEditorScript, /\[editor\.fieldKey\]: nextValue/)
|
||||
|
||||
assert.match(messageItemStyles, /\.application-preview-row\.missing \{[\s\S]*--theme-primary-rgb/)
|
||||
assert.match(messageItemStyles, /\.application-preview-table \{[\s\S]*border: 1px solid #d7e4f2;[\s\S]*background: #ffffff;/)
|
||||
assert.match(messageItemStyles, /\.application-preview-row \{[\s\S]*grid-template-columns: 108px minmax\(0, 1fr\);/)
|
||||
assert.match(messageItemStyles, /\.application-preview-text \{[\s\S]*overflow-wrap: anywhere;/)
|
||||
assert.match(messageItemStyles, /\.application-preview-select \{[\s\S]*width: 100%;/)
|
||||
assert.match(messageItemStyles, /\.application-preview-footer-missing \{[\s\S]*margin-top: 48px;[\s\S]*background: transparent;/)
|
||||
assert.match(messageItemStyles, /\.application-preview-missing-chip \{[\s\S]*background: rgba\(var\(--theme-primary-rgb/)
|
||||
})
|
||||
|
||||
test('assistant markdown tables render with component-scoped table styling', () => {
|
||||
const rendered = renderMarkdown([
|
||||
'| 项目 | 标准口径 | 天数 | 小计 |',
|
||||
'| --- | --- | ---: | ---: |',
|
||||
'| 住宿费 | 武汉 / P5 标准:330.00 元/天 | 1 | 330.00 元 |',
|
||||
'| 出差补贴 | 其他地区:伙食 55.00 元 + 基本 35.00 元 | 1 | 90.00 元 |'
|
||||
].join('\n'))
|
||||
|
||||
assert.match(rendered, /<div class="markdown-table-wrap">/)
|
||||
assert.match(rendered, /<table>/)
|
||||
assert.match(rendered, /<th/)
|
||||
assert.match(rendered, /<td/)
|
||||
assert.match(messageItemStyles, /\.message-answer-markdown :deep\(\.markdown-table-wrap\) \{[\s\S]*overflow-x: auto;[\s\S]*border: 1px solid #dbe4ee;/)
|
||||
assert.match(messageItemStyles, /\.message-answer-markdown :deep\(table\) \{[\s\S]*min-width: 460px;[\s\S]*border-collapse: separate;/)
|
||||
assert.match(messageItemStyles, /\.message-answer-markdown :deep\(th\),[\s\S]*\.message-answer-markdown :deep\(td\) \{[\s\S]*padding: 8px 10px;/)
|
||||
})
|
||||
|
||||
test('application preview merges rule center travel estimate into highlighted rows', () => {
|
||||
|
||||
Reference in New Issue
Block a user