merge src/master

This commit is contained in:
qiuchengw
2025-12-11 20:26:56 +08:00
25 changed files with 2240 additions and 267 deletions
+39
View File
@@ -47,6 +47,8 @@ const props = withDefaults(defineProps<Props>(), {
taskBarConfig: undefined,
autoSortByStartDate: false,
allowDragAndResize: true,
enableTaskRowMove: false,
assigneeOptions: () => [],
})
const emit = defineEmits([
@@ -75,6 +77,8 @@ const emit = defineEmits([
// 任务关系事件
'add-predecessor',
'add-successor',
// TaskRow拖拽事件
'task-row-moved',
])
const { showMessage } = useMessage()
@@ -128,6 +132,12 @@ interface Props {
autoSortByStartDate?: boolean
// 是否允许拖拽和拉伸(默认为 true)
allowDragAndResize?: boolean
// 是否启用TaskRow拖拽移动功能(默认为 false)
enableTaskRowMove?: boolean
// 指派人员选项列表(用于TaskDrawer中的assignee下拉菜单)
// 格式:{ key?: string | number, value: string | number, label: string }
// key 为可选项,若不存在则使用 value 作为选项的唯一标识
assigneeOptions?: Array<{ key?: string | number; value: string | number; label: string }>
}
// TaskList的固定总长度(所有列的最小宽度之和 + 边框等额外空间)
@@ -285,6 +295,16 @@ const timelineContainerWidth = ref<number>(0)
// 任务拖拽/拉伸触发器(用于触发timeline范围重新计算)
const updateTaskTrigger = ref<number>(0)
// 监听props.tasks变化,自动触发Timeline更新
// 这对于TaskRow移动等操作很重要,因为外部更新tasks后需要通知Timeline重新渲染
watch(
() => props.tasks,
() => {
updateTaskTrigger.value++
},
{ deep: true },
)
// 时间刻度状态
const currentTimeScale = ref<TimelineScale>(TimelineScale.DAY)
@@ -597,6 +617,22 @@ const handleExpandAll = () => {
}
}
// 处理TaskRow移动事件
const handleTaskRowMoved = (payload: {
draggedTask: Task
targetTask: Task
position: 'after' | 'child'
oldParent: Task | null
newParent: Task | null
}) => {
// TaskList已经通过对象引用直接修改了props.tasks的内容
// 但computed不会因为对象内部变化而重新计算,需要手动触发
updateTaskTrigger.value++
// 向外传递事件,让外部组件进行额外处理(完全可选)
emit('task-row-moved', payload)
}
// 全部折叠任务
const handleCollapseAll = () => {
if (props.onCollapseAll && typeof props.onCollapseAll === 'function') {
@@ -2262,12 +2298,14 @@ function handleMilestoneDialogDelete(milestoneId: number) {
:tasks="tasksForTaskList"
:use-default-drawer="props.useDefaultDrawer"
:task-list-config="props.taskListConfig"
:enable-task-row-move="props.enableTaskRowMove"
@task-collapse-change="handleTaskCollapseChange"
@start-timer="handleStartTimer"
@stop-timer="handleStopTimer"
@add-predecessor="handleAddPredecessor"
@add-successor="handleAddSuccessor"
@delete="handleTaskDelete"
@task-row-moved="handleTaskRowMoved"
>
<template v-if="$slots['custom-task-content']" #custom-task-content="rowScope">
<slot name="custom-task-content" v-bind="rowScope" />
@@ -2363,6 +2401,7 @@ function handleMilestoneDialogDelete(milestoneId: number) {
v-model:visible="taskDrawerVisible"
:task="taskDrawerTask"
:is-edit="taskDrawerEditMode"
:assignee-options="props.assigneeOptions"
@submit="handleTaskDrawerSubmit"
@close="taskDrawerVisible = false"
@start-timer="handleStartTimer"