2026-05-06 22:23:42 +08:00
|
|
|
import { computed, ref, watch } from 'vue'
|
|
|
|
|
|
|
|
|
|
import { normalizeRequestForUi } from '../../utils/requestViewModel.js'
|
2026-05-06 11:00:38 +08:00
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
name: 'RequestsView',
|
|
|
|
|
props: {
|
2026-05-06 22:23:42 +08:00
|
|
|
filteredRequests: { type: Array, required: true }
|
|
|
|
|
},
|
|
|
|
|
emits: ['ask', 'approve', 'reject', 'create-request'],
|
2026-05-06 11:00:38 +08:00
|
|
|
setup(props, { emit }) {
|
|
|
|
|
const activeTab = ref('全部')
|
|
|
|
|
const tabs = ['全部', '待提交', '审批中', '待出行', '已完成']
|
|
|
|
|
const filters = ['报销状态', '出差城市', '费用类型']
|
|
|
|
|
|
|
|
|
|
const datePopover = ref(false)
|
|
|
|
|
const rangeStart = ref('')
|
|
|
|
|
const rangeEnd = ref('')
|
|
|
|
|
const appliedStart = ref('')
|
|
|
|
|
const appliedEnd = ref('')
|
|
|
|
|
|
|
|
|
|
const dateRangeLabel = computed(() => {
|
2026-05-06 22:23:42 +08:00
|
|
|
if (appliedStart.value && appliedEnd.value) {
|
|
|
|
|
return `${appliedStart.value} ~ ${appliedEnd.value}`
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-06 11:00:38 +08:00
|
|
|
return '选择时间段'
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
function applyDateRange() {
|
2026-05-06 22:23:42 +08:00
|
|
|
if (!rangeStart.value || !rangeEnd.value) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-06 11:00:38 +08:00
|
|
|
appliedStart.value = rangeStart.value
|
|
|
|
|
appliedEnd.value = rangeEnd.value
|
|
|
|
|
datePopover.value = false
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-06 22:23:42 +08:00
|
|
|
const rows = computed(() =>
|
|
|
|
|
props.filteredRequests
|
|
|
|
|
.map((item) => normalizeRequestForUi(item))
|
|
|
|
|
.filter(Boolean)
|
|
|
|
|
)
|
2026-05-06 11:00:38 +08:00
|
|
|
|
|
|
|
|
const currentPage = ref(1)
|
|
|
|
|
const pageSize = ref(10)
|
|
|
|
|
const pageSizes = [10, 20, 50]
|
|
|
|
|
const pageSizeOpen = ref(false)
|
|
|
|
|
|
|
|
|
|
function changePageSize(size) {
|
|
|
|
|
pageSize.value = size
|
|
|
|
|
pageSizeOpen.value = false
|
|
|
|
|
currentPage.value = 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const filteredRows = computed(() => {
|
2026-05-06 22:23:42 +08:00
|
|
|
if (activeTab.value === '全部') {
|
|
|
|
|
return rows.value
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (activeTab.value === '待提交') {
|
|
|
|
|
return rows.value.filter((row) => row.approval === '待提交')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (activeTab.value === '审批中') {
|
|
|
|
|
return rows.value.filter((row) => row.approval === '审批中')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (activeTab.value === '待出行') {
|
|
|
|
|
return rows.value.filter((row) => row.travel.includes('待'))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (activeTab.value === '已完成') {
|
|
|
|
|
return rows.value.filter((row) => row.approval === '已完成')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return rows.value
|
2026-05-06 11:00:38 +08:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const totalCount = computed(() => filteredRows.value.length)
|
|
|
|
|
const totalPages = computed(() => Math.max(1, Math.ceil(totalCount.value / pageSize.value)))
|
|
|
|
|
|
|
|
|
|
const visibleRows = computed(() => {
|
|
|
|
|
const start = (currentPage.value - 1) * pageSize.value
|
|
|
|
|
return filteredRows.value.slice(start, start + pageSize.value)
|
|
|
|
|
})
|
|
|
|
|
|
2026-05-06 22:23:42 +08:00
|
|
|
watch([activeTab, rows], () => {
|
|
|
|
|
currentPage.value = 1
|
|
|
|
|
})
|
2026-05-06 11:00:38 +08:00
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
emit,
|
|
|
|
|
activeTab,
|
|
|
|
|
tabs,
|
|
|
|
|
filters,
|
|
|
|
|
datePopover,
|
|
|
|
|
rangeStart,
|
|
|
|
|
rangeEnd,
|
|
|
|
|
appliedStart,
|
|
|
|
|
appliedEnd,
|
|
|
|
|
dateRangeLabel,
|
|
|
|
|
applyDateRange,
|
|
|
|
|
rows,
|
|
|
|
|
currentPage,
|
|
|
|
|
pageSize,
|
|
|
|
|
pageSizes,
|
|
|
|
|
pageSizeOpen,
|
|
|
|
|
changePageSize,
|
|
|
|
|
filteredRows,
|
|
|
|
|
totalCount,
|
|
|
|
|
totalPages,
|
|
|
|
|
visibleRows
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|