merge src/master
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user