106 lines
3.3 KiB
JavaScript
106 lines
3.3 KiB
JavaScript
|
|
import { ref } from 'vue'
|
||
|
|
|
||
|
|
import {
|
||
|
|
APPLICATION_TRANSPORT_MODE_OPTIONS,
|
||
|
|
buildApplicationPreviewRows,
|
||
|
|
buildLocalApplicationPreviewMessage,
|
||
|
|
normalizeApplicationPreview
|
||
|
|
} from '../../utils/expenseApplicationPreview.js'
|
||
|
|
|
||
|
|
export function useApplicationPreviewEditor({ persistSessionState, toast } = {}) {
|
||
|
|
const applicationPreviewEditor = ref({
|
||
|
|
messageId: '',
|
||
|
|
fieldKey: '',
|
||
|
|
draftValue: ''
|
||
|
|
})
|
||
|
|
|
||
|
|
function resolveApplicationPreviewRows(message) {
|
||
|
|
return buildApplicationPreviewRows(message?.applicationPreview || {})
|
||
|
|
}
|
||
|
|
|
||
|
|
function resolveApplicationPreviewEditorControl(fieldKey) {
|
||
|
|
return fieldKey === 'transportMode' ? 'select' : 'text'
|
||
|
|
}
|
||
|
|
|
||
|
|
function resolveApplicationPreviewEditorOptions(fieldKey) {
|
||
|
|
return fieldKey === 'transportMode' ? APPLICATION_TRANSPORT_MODE_OPTIONS : []
|
||
|
|
}
|
||
|
|
|
||
|
|
function isApplicationPreviewEditing(message, fieldKey) {
|
||
|
|
return (
|
||
|
|
String(applicationPreviewEditor.value.messageId || '') === String(message?.id || '') &&
|
||
|
|
applicationPreviewEditor.value.fieldKey === fieldKey
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
function openApplicationPreviewEditor(message, fieldKey, value) {
|
||
|
|
if (!message?.applicationPreview || !fieldKey) return
|
||
|
|
const targetRow = buildApplicationPreviewRows(message.applicationPreview)
|
||
|
|
.find((row) => row.key === fieldKey)
|
||
|
|
if (targetRow && targetRow.editable === false) return
|
||
|
|
const normalizedValue = String(value || '').trim() === '待补充' ? '' : String(value || '')
|
||
|
|
applicationPreviewEditor.value = {
|
||
|
|
messageId: String(message.id || ''),
|
||
|
|
fieldKey,
|
||
|
|
draftValue: fieldKey === 'transportMode' && !APPLICATION_TRANSPORT_MODE_OPTIONS.includes(normalizedValue)
|
||
|
|
? ''
|
||
|
|
: normalizedValue
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function cancelApplicationPreviewEditor() {
|
||
|
|
applicationPreviewEditor.value = {
|
||
|
|
messageId: '',
|
||
|
|
fieldKey: '',
|
||
|
|
draftValue: ''
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function commitApplicationPreviewEditor(message) {
|
||
|
|
const editor = applicationPreviewEditor.value
|
||
|
|
if (!message?.applicationPreview || String(editor.messageId || '') !== String(message.id || '') || !editor.fieldKey) {
|
||
|
|
cancelApplicationPreviewEditor()
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
|
||
|
|
const nextValue = String(editor.draftValue || '').trim()
|
||
|
|
const nextPreview = normalizeApplicationPreview({
|
||
|
|
...message.applicationPreview,
|
||
|
|
fields: {
|
||
|
|
...(message.applicationPreview.fields || {}),
|
||
|
|
[editor.fieldKey]: nextValue
|
||
|
|
}
|
||
|
|
})
|
||
|
|
message.applicationPreview = nextPreview
|
||
|
|
message.text = buildLocalApplicationPreviewMessage(nextPreview)
|
||
|
|
cancelApplicationPreviewEditor()
|
||
|
|
persistSessionState?.()
|
||
|
|
toast?.('已更新核对表内容。')
|
||
|
|
return true
|
||
|
|
}
|
||
|
|
|
||
|
|
function handleApplicationPreviewEditorKeydown(event, message) {
|
||
|
|
if (event.key === 'Enter') {
|
||
|
|
event.preventDefault()
|
||
|
|
commitApplicationPreviewEditor(message)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if (event.key === 'Escape') {
|
||
|
|
event.preventDefault()
|
||
|
|
cancelApplicationPreviewEditor()
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
applicationPreviewEditor,
|
||
|
|
resolveApplicationPreviewRows,
|
||
|
|
resolveApplicationPreviewEditorControl,
|
||
|
|
resolveApplicationPreviewEditorOptions,
|
||
|
|
isApplicationPreviewEditing,
|
||
|
|
openApplicationPreviewEditor,
|
||
|
|
commitApplicationPreviewEditor,
|
||
|
|
cancelApplicationPreviewEditor,
|
||
|
|
handleApplicationPreviewEditorKeydown
|
||
|
|
}
|
||
|
|
}
|