Files
X-Financial/web/src/composables/useWorkbenchComposerDate.js
caoxiaozhu ee730aa31c feat(web): AI 工作台文件预览/附件关联任务与草稿分支
- 新增 WorkbenchAiFilePreviewDialog 附件预览对话框及 useWorkbenchAiFilePreview,附件支持点击预览
- 新增 attachmentAssociationJobs/linkedReimbursementDraftJobs 前端服务与对应 composable,接入后台任务轮询与状态展示
- 新增 travelReimbursementDraftBranchModel 草稿分支模型,报销关联门控支持跳过/选择草稿
- PersonalWorkbenchAiMode 及各 composable(expense/document/steward/application-preview/attachment-association)重构适配,WorkbenchAiComposer/FileStrip 样式与交互完善
- DocumentsCenter/ReceiptFolder/TravelReimbursementCreate 等视图及 scripts 重构,风险/差旅规划/审批等工具适配
- 新增/更新前端测试:application-result-card、reimbursement-list-preview-fetch、guided-flow、composer-components 等
2026-06-24 10:42:50 +08:00

149 lines
4.2 KiB
JavaScript

import { computed, ref } from 'vue'
import {
buildWorkbenchDateLabel,
canApplyWorkbenchDateSelection,
getTodayDateValue,
mergeWorkbenchDateLabelIntoDraft,
stripWorkbenchDateLabelFromDraft
} from '../utils/workbenchComposerDate.js'
export function useWorkbenchComposerDate({ draft, focusInput } = {}) {
const workbenchDatePickerOpen = ref(false)
const workbenchDateMode = ref('single')
const workbenchSingleDate = ref(getTodayDateValue())
const workbenchRangeStartDate = ref(getTodayDateValue())
const workbenchRangeEndDate = ref(getTodayDateValue())
const workbenchDateTagLabel = ref('')
const workbenchCanApplyDateSelection = computed(() =>
canApplyWorkbenchDateSelection({
mode: workbenchDateMode.value,
singleDate: workbenchSingleDate.value,
rangeStartDate: workbenchRangeStartDate.value,
rangeEndDate: workbenchRangeEndDate.value
})
)
function clearWorkbenchDateSelection() {
const today = getTodayDateValue()
workbenchDatePickerOpen.value = false
workbenchDateMode.value = 'single'
workbenchSingleDate.value = today
workbenchRangeStartDate.value = today
workbenchRangeEndDate.value = today
workbenchDateTagLabel.value = ''
}
function ensureWorkbenchDateDefaults() {
const today = getTodayDateValue()
workbenchSingleDate.value ||= today
workbenchRangeStartDate.value ||= workbenchSingleDate.value || today
workbenchRangeEndDate.value ||= workbenchRangeStartDate.value || today
}
function toggleWorkbenchDatePicker() {
if (workbenchDatePickerOpen.value) {
workbenchDatePickerOpen.value = false
return
}
ensureWorkbenchDateDefaults()
workbenchDatePickerOpen.value = true
}
function closeWorkbenchDatePicker() {
workbenchDatePickerOpen.value = false
}
function setWorkbenchDateMode(mode) {
const today = getTodayDateValue()
const nextMode = mode === 'range' ? 'range' : 'single'
if (nextMode === 'range') {
const baseDate = workbenchSingleDate.value || today
workbenchRangeStartDate.value ||= baseDate
workbenchRangeEndDate.value ||= workbenchRangeStartDate.value
} else {
workbenchSingleDate.value ||= workbenchRangeStartDate.value || today
}
workbenchDateMode.value = nextMode
}
function handleWorkbenchDatePickerOutside(event) {
if (!workbenchDatePickerOpen.value) {
return
}
if (event.target instanceof Element && event.target.closest('.workbench-date-anchor')) {
return
}
workbenchDatePickerOpen.value = false
}
function applyWorkbenchDateSelection() {
const label = buildWorkbenchDateLabel({
mode: workbenchDateMode.value,
singleDate: workbenchSingleDate.value,
rangeStartDate: workbenchRangeStartDate.value,
rangeEndDate: workbenchRangeEndDate.value
})
if (!label) {
return
}
workbenchDateTagLabel.value = label
draft.value = stripWorkbenchDateLabelFromDraft(draft.value)
workbenchDatePickerOpen.value = false
focusInput?.()
}
function handleWorkbenchDateInputChange(part = 'single') {
if (workbenchDateMode.value !== 'range' || part === 'single') {
applyWorkbenchDateSelection()
return
}
if (part === 'range-start') {
if (!workbenchRangeEndDate.value || workbenchRangeEndDate.value < workbenchRangeStartDate.value) {
workbenchRangeEndDate.value = workbenchRangeStartDate.value
}
return
}
if (part === 'range-end') {
return
}
applyWorkbenchDateSelection()
}
function removeWorkbenchDateTag() {
workbenchDateTagLabel.value = ''
focusInput?.()
}
function buildWorkbenchPromptText(rawText = draft.value) {
return mergeWorkbenchDateLabelIntoDraft(rawText, workbenchDateTagLabel.value)
}
return {
workbenchDatePickerOpen,
workbenchDateMode,
workbenchSingleDate,
workbenchRangeStartDate,
workbenchRangeEndDate,
workbenchDateTagLabel,
workbenchCanApplyDateSelection,
clearWorkbenchDateSelection,
toggleWorkbenchDatePicker,
closeWorkbenchDatePicker,
setWorkbenchDateMode,
handleWorkbenchDatePickerOutside,
applyWorkbenchDateSelection,
handleWorkbenchDateInputChange,
removeWorkbenchDateTag,
buildWorkbenchPromptText
}
}