jordium-gantt-vue3 1.1.0 → 1.3.0

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
@@ -56,36 +56,75 @@ pnpm add jordium-gantt-vue3
56
56
 
57
57
  ---
58
58
 
59
- > 💡 **徽章下载**:
60
- > - npm 版本徽章:https://img.shields.io/npm/v/jordium-gantt-vue3.svg
61
- > - MIT 许可证徽章:https://img.shields.io/badge/license-MIT-blue.svg
62
- > - Vue 版本徽章:https://img.shields.io/badge/vue-3.x-green.svg
63
- > - TypeScript 徽章:https://img.shields.io/badge/typescript-5.x-blue.svg
64
-
65
59
  ## 📁 项目结构
66
60
 
67
61
  ```
68
62
  jordium-gantt-vue3/
69
- ├── src/ # 源码目录
70
- │ ├── components/ # 核心组件
71
- │ │ ├── GanttChart.vue # 主入口组件
72
- │ │ ├── TaskList.vue # 任务列表
73
- │ │ ├── Timeline.vue # 时间轴
74
- │ │ ├── TaskBar.vue # 任务条
75
- │ │ ├── MilestonePoint.vue # 里程碑
76
- │ │ └── ... # 其他组件
77
- │ ├── models/ # 数据模型
78
- │ │ ├── classes/ # 类定义
79
- │ │ └── configs/ # 配置接口
80
- │ ├── composables/ # 组合式函数
81
- ├── styles/ # 样式文件
82
- └── index.ts # 导出入口
83
- ├── demo/ # 开发演示
84
- ├── dist/ # 构建产物
85
- ├── docs/ # 文档
86
- └── package.json
63
+ ├── src/ # 组件源码与核心逻辑
64
+ │ ├── components/ # 主要 Vue 组件
65
+ │ │ ├── GanttChart.vue # 主入口组件
66
+ │ │ ├── TaskList.vue # 任务列表
67
+ │ │ ├── Timeline.vue # 时间轴组件
68
+ │ │ ├── TaskBar.vue # 任务条
69
+ │ │ ├── TaskDrawer.vue # 任务编辑抽屉
70
+ │ │ ├── TaskContextMenu.vue # 任务右键菜单
71
+ ├── GanttToolbar.vue # 工具栏
72
+ │ │ ├── MilestonePoint.vue # 里程碑点
73
+ │ │ ├── MilestoneDialog.vue # 里程碑对话框
74
+ ├── DatePicker.vue # 日期选择器
75
+ │ └── ... # 其他组件
76
+ ├── models/ # 数据模型与配置
77
+ │ │ ├── classes/ # 类定义
78
+ │ │ │ ├── Task.ts # 任务模型
79
+ │ │ │ ├── Milestone.ts # 里程碑模型
80
+ │ │ │ └── Language.ts # 语言配置
81
+ │ │ ├── configs/ # 配置接口
82
+ │ │ │ ├── TimelineConfig.ts # 时间轴配置
83
+ │ │ │ └── ToolbarConfig.ts # 工具栏配置
84
+ │ │ └── types/ # 类型定义
85
+ │ │ └── TimelineScale.ts # 时间刻度类型
86
+ │ ├── composables/ # 组合式函数
87
+ │ │ ├── useI18n.ts # 国际化工具
88
+ │ │ └── useMessage.ts # 消息提示工具
89
+ │ ├── styles/ # 样式文件
90
+ │ │ ├── app.css # 主样式
91
+ │ │ └── theme-variables.css # 主题变量
92
+ │ ├── utils/ # 工具函数
93
+ │ │ └── predecessorUtils.ts # 前置依赖工具
94
+ │ └── index.ts # 入口导出
95
+ ├── demo/ # 组件开发与交互演示(本地开发/预览用)
96
+ │ ├── App.vue # 演示应用主组件
97
+ │ ├── data.json # 演示数据(包含药物临床试验案例)
98
+ │ ├── main.ts # 演示应用入口
99
+ │ └── ... # 其他演示文件
100
+ ├── packageDemo/ # npm 包集成演示(模拟外部项目集成效果)
101
+ ├── dist/ # 构建产物(发布/静态站点/打包输出)
102
+ ├── docs/ # 相关文档(如部署、API 说明等)
103
+ ├── design/ # 设计资源与截图
104
+ │ └── screenshots/ # 主题截图
105
+ ├── public/ # 公共静态资源
106
+ │ └── assets/ # 静态资源文件
107
+ ├── README.md # 中文说明文档
108
+ ├── README-EN.md # 英文说明文档
109
+ ├── package.json # 项目配置
110
+ ├── vite.config.ts # Vite开发配置
111
+ ├── vite.config.lib.ts # Vite库构建配置
112
+ ├── tsconfig.json # TypeScript配置
113
+ └── ... # 其他配置、脚本与元数据
87
114
  ```
88
115
 
116
+ ### 目录说明
117
+
118
+ - **`src/components/`**:核心Vue组件,包含甘特图的所有功能组件
119
+ - **`src/models/`**:数据模型、类型定义和配置接口
120
+ - **`src/composables/`**:Vue 3组合式函数,提供可复用的逻辑
121
+ - **`src/styles/`**:样式文件,包含主题系统和CSS变量
122
+ - **`src/utils/`**:工具函数,处理业务逻辑和数据转换
123
+ - **`demo/`**:本地开发和功能演示,包含完整的交互页面和药物临床试验样例数据
124
+ - **`packageDemo/`**:模拟npm包在外部项目中的集成与使用场景
125
+ - **`dist/`**:构建输出目录,包含发布到npm或静态站点的产物
126
+ - **`docs/`**:项目文档,包括部署说明、API参考等
127
+
89
128
  ## 🔧 API 参考
90
129
 
91
130
  ### GanttChart 属性
@@ -99,8 +138,22 @@ jordium-gantt-vue3/
99
138
  | `showToolbar` | `boolean` | `true` | 是否显示工具栏 |
100
139
  | `toolbarConfig` | `ToolbarConfig` | `{}` | 工具栏配置 |
101
140
  | `localeMessages` | `Partial<Messages['zh-CN']>` | - | 自定义多语言配置 |
141
+ | `workingHours` | `WorkingHours` | - | 工作时间配置 |
102
142
  | `onTaskDoubleClick` | `(task: Task) => void` | - | 任务双击事件回调 |
103
- | `onTaskDelete` | `(task: Task) => void` | - | 任务删除事件回调 |
143
+ | `onTaskDelete` | `(task: Task, deleteChildren?: boolean) => void` | - | 任务删除事件回调 |
144
+ | `onTaskUpdate` | `(task: Task) => void` | - | 任务更新事件回调 |
145
+ | `onTaskAdd` | `(task: Task) => void` | - | 任务添加事件回调 |
146
+ | `onMilestoneSave` | `(milestone: Task) => void` | - | 里程碑保存事件回调 |
147
+ | `onMilestoneDelete` | `(milestoneId: number) => void` | - | 里程碑删除事件回调 |
148
+ | `onMilestoneIconChange` | `(milestoneId: number, icon: string) => void` | - | 里程碑图标变更事件回调 |
149
+ | `onAddTask` | `() => void` | - | 新增任务工具栏事件回调 |
150
+ | `onAddMilestone` | `() => void` | - | 新增里程碑工具栏事件回调 |
151
+ | `onTodayLocate` | `() => void` | - | 定位今天工具栏事件回调 |
152
+ | `onExportCsv` | `() => boolean \| void` | - | 导出CSV工具栏事件回调 |
153
+ | `onExportPdf` | `() => void` | - | 导出PDF工具栏事件回调 |
154
+ | `onLanguageChange` | `(lang: 'zh-CN' \| 'en-US') => void` | - | 语言切换工具栏事件回调 |
155
+ | `onThemeChange` | `(isDark: boolean) => void` | - | 主题切换工具栏事件回调 |
156
+ | `onFullscreenChange` | `(isFullscreen: boolean) => void` | - | 全屏切换工具栏事件回调 |
104
157
  | `onTaskUpdate` | `(task: Task) => void` | - | 任务更新事件回调 |
105
158
  | `onTaskAdd` | `(task: Task) => void` | - | 任务添加事件回调 |
106
159
  | `onMilestoneSave` | `(milestone: Task) => void` | - | 里程碑保存事件回调 |
@@ -117,11 +170,72 @@ jordium-gantt-vue3/
117
170
 
118
171
  ### GanttChart 事件
119
172
 
120
- | 事件名 | 参数 | 说明 |
121
- |--------|------|------|
173
+ | 事件名 | 参数 | 说明 |
174
+ |----------------------|----------------------------|------------------------------|
122
175
  | `taskbar-drag-end` | `task: Task` | 任务条拖拽结束 |
123
176
  | `taskbar-resize-end` | `task: Task` | 任务条大小调整结束 |
124
177
  | `milestone-drag-end` | `milestone: Task` | 里程碑拖拽结束 |
178
+ | `predecessor-added` | `{ targetTask, newTask }` | 添加前置任务后触发。<br>参数说明:<br>• `targetTask`:被添加前置任务的目标任务(Task对象)<br>• `newTask`:新添加的前置任务(Task对象) |
179
+ | `successor-added` | `{ targetTask, newTask }` | 添加后置任务后触发。<br>参数说明:<br>• `targetTask`:被添加后置任务的目标任务(Task对象)<br>• `newTask`:新添加的后置任务(Task对象) |
180
+ | `task-deleted` | `{ task }` | 删除任务后触发 |
181
+ | `task-added` | `{ task }` | 新建任务后触发 |
182
+ | `task-updated` | `{ task }` | 更新任务后触发 |
183
+
184
+ #### 计时事件用法示例
185
+
186
+ ```vue
187
+ <GanttChart
188
+ ...
189
+ @timer-started="onTimerStarted"
190
+ @timer-stopped="onTimerStopped"
191
+ />
192
+
193
+ <script setup>
194
+ function onTimerStarted(task) {
195
+ // 这里可以自定义提示、日志或业务逻辑
196
+ alert(`任务【${task.name}】开始计时:${new Date(task.timerStartTime).toLocaleString()}`)
197
+ }
198
+ function onTimerStopped(task) {
199
+ alert(`任务【${task.name}】停止计时`)
200
+ }
201
+ </script>
202
+ ```
203
+
204
+ #### 任务事件用法示例
205
+
206
+ ```vue
207
+ <GanttChart
208
+ ...
209
+ @predecessor-added="onPredecessorAdded"
210
+ @successor-added="onSuccessorAdded"
211
+ @task-deleted="onTaskDeleted"
212
+ @task-added="onTaskAdded"
213
+ @task-updated="onTaskUpdated"
214
+ />
215
+
216
+ <script setup>
217
+ function onPredecessorAdded(e) {
218
+ // e: { targetTask: Task, newTask: Task }
219
+ alert(`任务【${e.targetTask.name}】添加前置任务【${e.newTask.name}】`)
220
+ }
221
+ function onSuccessorAdded(e) {
222
+ // e: { targetTask: Task, newTask: Task }
223
+ alert(`任务【${e.targetTask.name}】添加后置任务【${e.newTask.name}】`)
224
+ }
225
+ function onTaskDeleted(e) {
226
+ // e: { task: Task }
227
+ alert(`任务【${e.task.name}】已删除`)
228
+ }
229
+ function onTaskAdded(e) {
230
+ // e: { task: Task }
231
+ alert(`任务【${e.task.name}】已创建`)
232
+ }
233
+ function onTaskUpdated(e) {
234
+ // e: { task: Task }
235
+ alert(`任务【${e.task.name}】已更新`)
236
+ }
237
+ </script>
238
+ ```
125
239
 
126
240
  ### 数据类型
127
241
 
@@ -129,24 +243,30 @@ jordium-gantt-vue3/
129
243
 
130
244
  **Task 任务类型**
131
245
  ```typescript
132
- interface Task {
133
- id: number // 任务唯一标识
134
- name: string // 任务名称
135
- predecessor?: string // 前置任务ID
136
- assignee?: string // 负责人
137
- startDate?: string // 开始日期 (YYYY-MM-DD格式)
138
- endDate?: string // 结束日期 (YYYY-MM-DD格式)
139
- progress?: number // 完成进度 (0-100)
140
- estimatedHours?: number // 预估工时
141
- actualHours?: number // 实际工时
142
- parentId?: number // 上级任务ID
143
- children?: Task[] // 子任务数组(支持嵌套结构)
144
- collapsed?: boolean // 是否折叠子任务
145
- isParent?: boolean // 是否为父级任务
146
- type?: string // 任务类型 (task/story/bug/milestone)
147
- description?: string // 任务描述
148
- icon?: string // 任务图标
149
- level?: number // 任务层级
246
+ export interface Task {
247
+ id: number // 任务唯一ID
248
+ name: string // 任务名称
249
+ predecessor?: number[] // 前置任务ID数组
250
+ assignee?: string // 负责人
251
+ startDate?: string // 开始日期(ISO字符串)
252
+ endDate?: string // 结束日期(ISO字符串)
253
+ progress?: number // 进度百分比 0-100
254
+ estimatedHours?: number // 预估工时(支持小数,最多2位)
255
+ actualHours?: number // 实际工时(支持小数,最多2位)
256
+ parentId?: number // 上级任务ID
257
+ children?: Task[] // 子任务数组
258
+ collapsed?: boolean // 是否折叠
259
+ isParent?: boolean // 是否为父任务
260
+ type?: string // 任务类型(如 taskstorymilestone 等)
261
+ description?: string // 任务描述
262
+ icon?: string // 图标
263
+ level?: number // 层级
264
+ // 计时相关字段
265
+ isTimerRunning?: boolean // 计时是否进行中
266
+ timerStartTime?: number // 计时开始时间(时间戳)
267
+ timerEndTime?: number // 计时结束时间(时间戳)
268
+ timerStartDesc?: string // 计时开始时的描述
269
+ timerElapsedTime?: number // 已累计计时时长(秒)
150
270
  }
151
271
  ```
152
272
 
@@ -193,6 +313,86 @@ interface ToolbarConfig {
193
313
  }
194
314
  ```
195
315
 
316
+ **WorkingHours 工作时间配置**
317
+ ```typescript
318
+ interface WorkingHours {
319
+ morning?: { start: number; end: number } // 上午工作时间,如 { start: 8, end: 11 }
320
+ afternoon?: { start: number; end: number } // 下午工作时间,如 { start: 13, end: 17 }
321
+ }
322
+ ```
323
+
324
+ **TimelineScale 时间刻度类型**
325
+ ```typescript
326
+ // 时间轴显示刻度类型
327
+ type TimelineScale = 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year'
328
+
329
+ // 时间刻度常量
330
+ export const TimelineScale = {
331
+ HOUR: 'hour', // 小时视图 - 每列显示一小时
332
+ DAY: 'day', // 日视图 - 每列显示一天
333
+ WEEK: 'week', // 周视图 - 每列显示一周
334
+ MONTH: 'month', // 月视图 - 每列显示一个月
335
+ QUARTER: 'quarter', // 季度视图 - 每列显示一个季度
336
+ YEAR: 'year', // 年视图 - 每列显示一年
337
+ }
338
+
339
+ // 时间刻度配置
340
+ interface TimelineScaleConfig {
341
+ scale: TimelineScale // 刻度类型
342
+ cellWidth: number // 每个时间单元的宽度(px)
343
+ headerLevels: number // 表头层级数
344
+ formatters: {
345
+ primary: string // 主要时间标签格式
346
+ secondary?: string // 次要时间标签格式
347
+ }
348
+ }
349
+ ```
350
+
351
+ ### 🕐 时间刻度功能说明
352
+
353
+ 组件支持多种时间刻度显示,用户可以通过工具栏的日/周/月按钮组或者编程方式切换时间轴的显示粒度:
354
+
355
+ #### 内置刻度配置
356
+
357
+ | 刻度类型 | 单元宽度 | 主标签格式 | 副标签格式 | 适用场景 |
358
+ |----------|----------|------------|------------|----------|
359
+ | `hour` | 40px | yyyy/MM/dd | HH | 精确到小时的项目, 例如药物临床试验 |
360
+ | `day` | 30px | yyyy年MM月 | dd | 日常项目管理的标准视图 |
361
+ | `week` | 120px | yyyy年MM月 | W | 中期项目的周计划视图 |
362
+ | `month` | 180px | yyyy | MM | 长期项目的月度视图 |
363
+ | `quarter` | 360px | yyyy | Q | 战略规划的季度视图 |
364
+ | `year` | 360px | yyyy | 上半年\|下半年 | 超长期项目年度视图 |
365
+
366
+ #### 使用示例
367
+
368
+ ```vue
369
+ <script setup>
370
+ import { ref } from 'vue'
371
+ import { GanttChart, TimelineScale } from 'jordium-gantt-vue3'
372
+
373
+ const tasks = ref([/* 任务数据 */])
374
+
375
+ // 工具栏配置 - 启用时间刻度切换按钮
376
+ const toolbarConfig = {
377
+ showTimeScale: true // 显示日|周|月按钮组
378
+ }
379
+
380
+ // 监听刻度切换(可选)
381
+ const handleTimeScaleChange = (scale) => {
382
+ console.log('时间刻度切换至:', scale)
383
+ // 可以在这里做一些业务逻辑,如保存用户偏好设置
384
+ }
385
+ </script>
386
+
387
+ <template>
388
+ <GanttChart
389
+ :tasks="tasks"
390
+ :toolbar-config="toolbarConfig"
391
+ @timescale-changed="handleTimeScaleChange"
392
+ />
393
+ </template>
394
+ ```
395
+
196
396
  #### 组合式函数 (src/composables)
197
397
 
198
398
  **useI18n 国际化工具**
@@ -322,15 +522,15 @@ import { GanttChart } from 'jordium-gantt-vue3'
322
522
 
323
523
  // 工具栏配置
324
524
  const toolbarConfig = {
325
- showLanguage: true,
326
- showTheme: true,
327
- showAddTask: true,
328
- showAddMilestone: true,
329
- showTodayLocate: true,
330
- showExportCsv: true,
331
- showExportPdf: true,
332
- showFullscreen: true,
333
- showTimeScale: true // 控制日|周|月时间刻度按钮组的可见性
525
+ showLanguage: true, // 语言切换
526
+ showTheme: true, // 主题切换
527
+ showAddTask: true, // 新增任务
528
+ showAddMilestone: true, // 新增里程碑
529
+ showTodayLocate: true, // 定位今天
530
+ showExportCsv: true, // 导出CSV
531
+ showExportPdf: true, // 导出PDF
532
+ showFullscreen: true, // 全屏模式
533
+ showTimeScale: true // 时间刻度切换(日|周|月按钮组)
334
534
  }
335
535
 
336
536
  // 自定义多语言配置
@@ -347,6 +547,17 @@ const handleLanguageChange = (lang) => {
347
547
  const handleThemeChange = (isDark) => {
348
548
  console.log('主题切换到:', isDark ? '暗色' : '亮色')
349
549
  }
550
+
551
+ // 监听时间刻度变化
552
+ const handleTimeScaleChange = (scale) => {
553
+ console.log('时间刻度切换至:', scale)
554
+ // 根据刻度调整显示逻辑
555
+ if (scale === 'day') {
556
+ // 日视图下的特殊处理
557
+ } else if (scale === 'week') {
558
+ // 周视图下的特殊处理
559
+ }
560
+ }
350
561
  </script>
351
562
 
352
563
  <template>
@@ -357,10 +568,51 @@ const handleThemeChange = (isDark) => {
357
568
  :locale-messages="customLocaleMessages"
358
569
  :on-language-change="handleLanguageChange"
359
570
  :on-theme-change="handleThemeChange"
571
+ @timescale-changed="handleTimeScaleChange"
572
+ />
573
+ </template>
574
+ ```
575
+
576
+ ### 🔧 工作时间配置
577
+
578
+ 组件支持设置工作时间,影响任务时长计算和进度显示:
579
+
580
+ ```vue
581
+ <script setup lang="ts">
582
+ // 配置工作时间(24小时制)
583
+ const workingHours = {
584
+ morning: { start: 9, end: 12 }, // 上午9点-12点
585
+ afternoon: { start: 14, end: 18 } // 下午2点-6点
586
+ }
587
+ </script>
588
+
589
+ <template>
590
+ <GanttChart
591
+ :tasks="tasks"
592
+ :working-hours="workingHours"
360
593
  />
361
594
  </template>
362
595
  ```
363
596
 
597
+ ### 📊 高精度工时管理
598
+
599
+ 组件支持精确到小数点后2位的工时记录,适合需要精确计费的项目:
600
+
601
+ ```vue
602
+ <script setup lang="ts">
603
+ const tasks = ref([
604
+ {
605
+ id: 1,
606
+ name: '高精度任务',
607
+ estimatedHours: 8.75, // 8小时45分钟
608
+ actualHours: 7.25, // 7小时15分钟
609
+ startDate: '2025-01-01',
610
+ endDate: '2025-01-02'
611
+ }
612
+ ])
613
+ </script>
614
+ ```
615
+
364
616
  ## 🤝 贡献与合作
365
617
 
366
618
  ### 参与贡献