jordium-gantt-vue3 1.4.4 → 1.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -23,8 +23,8 @@
23
23
 
24
24
  <p align="center">
25
25
  <a href="./README.md">中文</a> |
26
- <a href="./README-EN.md">English</a>
27
- <a href="./CHANGELOG.md">更新日志</a>
26
+ <a href="./README-EN.md">English</a> |
27
+ <a href="./README-EN.md">变更日志</a>
28
28
  </p>
29
29
 
30
30
  <p align="center">现代化的 Vue 3 甘特图组件库,为项目管理和任务调度提供完整解决方案</p>
@@ -243,7 +243,7 @@ npm run dev
243
243
  | `milestone-deleted` | `{ milestoneId: number }` | 里程碑删除 |
244
244
  | `milestone-icon-changed` | `{ milestoneId, icon }` | 里程碑图标变更 |
245
245
  | `milestone-drag-end` | `(milestone: Task)` | 拖拽里程碑结束 |
246
- | `task-row-moved` | `payload: { draggedTask: Task targetTask: Taskposition: 'after' 'child'}` | 拖拽TaskRow结束 |
246
+ | `task-row-moved` | `payload: { draggedTask: Task, targetTask: Task, position: 'after' \| 'child', oldParent: Task \| null, newParent: Task \| null }` | 拖拽TaskRow结束(可选) |
247
247
 
248
248
  #### 示例1:最简单的甘特图
249
249
 
@@ -451,7 +451,7 @@ const handleMilestoneSaved = milestone => {
451
451
  | `successor-added` | `{ targetTask: Task, newTask: Task }` | 通过右键菜单添加后置任务后 | `targetTask` 是原任务,`newTask` 是新创建的后置任务(其 predecessor 已包含 targetTask.id) |
452
452
  | `timer-started` | `(task: Task) => void` | 任务计时器启动时 | 开始记录任务工时 |
453
453
  | `timer-stopped` | `(task: Task) => void` | 任务计时器停止时 | 停止记录任务工时 |
454
- | `task-row-moved` | `payload: { draggedTask: Task targetTask: Taskposition: 'after' 'child'}` | 拖拽TaskRow结束 | TaskList中的TasRow按住拖拽,完成前后排放位置放置后
454
+ | `task-row-moved` | `payload: { draggedTask: Task, targetTask: Task, position: 'after' \| 'child', oldParent: Task \| null, newParent: Task \| null }` | 拖拽TaskRow结束(可选) | 组件已自动完成数据移动和TaskList/Timeline同步。监听此事件为完全可选,仅用于显示提示、调用API保存等。`position`: 'after'=同级放置,'child'=作为子任务 |
455
455
 
456
456
  **数据同步说明**:
457
457
 
@@ -764,31 +764,41 @@ const tasks = ref<Task[]>([
764
764
  },
765
765
  ])
766
766
 
767
- // 任务行拖拽完成事件
768
- const handleTaskRowMoved = (payload: {
767
+ // 任务行拖拽完成事件(可选)
768
+ const handleTaskRowMoved = async (payload: {
769
769
  draggedTask: Task
770
770
  targetTask: Task
771
771
  position: 'after' | 'child'
772
+ oldParent: Task | null
773
+ newParent: Task | null
772
774
  }) => {
773
- const { draggedTask, targetTask, position } = payload
775
+ const { draggedTask, targetTask, position, oldParent, newParent } = payload
774
776
 
775
- console.log(`任务 [${draggedTask.name}] 被拖拽到任务 [${targetTask.name}] ${position === 'after' ? '之后' : '下方作为子任务'}`)
777
+ // 组件已自动完成任务移动、parentId更新和TaskList/Timeline同步
778
+ // 监听此事件为完全可选,仅用于:
776
779
 
777
- // 组件已自动更新任务的层级关系和位置
778
- // position === 'after': 任务被放置在目标任务之后(同级)
779
- // position === 'child': 任务被放置为目标任务的子任务(第一个子任务位置)
780
+ // 1. 显示自定义提示消息
781
+ const oldParentName = oldParent?.name || '根目录'
782
+ const newParentName = newParent?.name || '根目录'
783
+ const positionText = position === 'after' ? '在目标任务之后' : '作为目标任务的子任务'
784
+ showMessage(`任务 [${draggedTask.name}] 已从 [${oldParentName}] 移动到 [${newParentName}] (${positionText})`, 'success')
780
785
 
781
- // 这里可以:
782
- // 1. 显示确认对话框,让用户确认是否移动
783
786
  // 2. 调用后端 API 保存新的任务层级关系
784
- // 3. 更新相关的依赖关系
787
+ try {
788
+ await api.updateTaskHierarchy({
789
+ taskId: draggedTask.id,
790
+ targetTaskId: targetTask.id,
791
+ position: position,
792
+ oldParentId: oldParent?.id,
793
+ newParentId: newParent?.id,
794
+ })
795
+ } catch (error) {
796
+ console.error('保存任务层级失败:', error)
797
+ showMessage('保存失败,请刷新页面', 'error')
798
+ }
785
799
 
786
- // 示例:调用后端 API
787
- // await api.updateTaskHierarchy({
788
- // taskId: draggedTask.id,
789
- // targetTaskId: targetTask.id,
790
- // position: position
791
- // })
800
+ // 3. 触发其他业务逻辑(如更新关联数据、记录操作日志等)
801
+ // ...
792
802
  }
793
803
  </script>
794
804
  ```
@@ -796,7 +806,7 @@ const handleTaskRowMoved = (payload: {
796
806
  **拖拽排序说明**:
797
807
 
798
808
  - **启用拖拽**:设置 `enable-task-row-move="true"` 启用任务行拖拽功能(默认为 `false`)
799
- - **拖拽算法**:
809
+ - **拖拽算法**(组件内部自动执行):
800
810
  - **算法1(放置在后面)**:当目标任务没有子任务时,被拖拽的任务会放置在目标任务之后(同级),`position='after'`
801
811
  - **算法2(作为子任务)**:当目标任务有子任务时,被拖拽的任务会成为目标任务的第一个子任务,`position='child'`
802
812
  - **视觉反馈**:
@@ -804,7 +814,16 @@ const handleTaskRowMoved = (payload: {
804
814
  - 悬停在有效目标任务上时显示蓝色边框提示
805
815
  - 无子任务的任务显示蓝色底部边框
806
816
  - 有子任务的任务显示蓝色四周边框
807
- - **自动更新**:组件会自动更新任务的 `parentId` 字段和 `children` 数组,外部只需监听事件做额外处理(如保存到后端)
817
+ - **自动同步**:组件内部通过对象引用直接修改 `props.tasks`,自动完成任务移动、`parentId` 更新、`children` 数组调整以及 TaskList/Timeline 同步
818
+ - **事件监听(可选)**:
819
+ - `task-row-moved` 事件为完全可选,仅用于显示提示、调用API保存、记录日志等额外处理
820
+ - 无需手动更新 `tasks.value`,组件已自动完成数据同步
821
+ - **事件参数**:
822
+ - `draggedTask`: 被拖拽的任务
823
+ - `targetTask`: 目标任务
824
+ - `position`: 放置位置('after' 或 'child')
825
+ - `oldParent`: 原父任务(null 表示根目录)
826
+ - `newParent`: 新父任务(null 表示根目录)
808
827
  - **限制条件**:
809
828
  - 不能拖拽到自己身上
810
829
  - 不能拖拽到自己的子任务上(避免循环引用)