跳到正文

这是开发版文档,跟随主分支更新,可能包含尚未发布的功能。

甘特图 ​

@dou-ui/gantt 提供甘特图 DouGantt:左边是任务表格,右边是时间轴上的任务条,任务之间可以有依赖。适合项目排期、迭代计划这类有起止时间和前后关系的任务。

安装 ​

甘特图是单独的包,需要和 dou-ui 一起使用:

sh
bun add dou-ui @dou-ui/gantt

引入样式,再注册组件:

ts
import 'dou-ui/style.css'
import '@dou-ui/gantt/style.css'
import { DouGantt } from '@dou-ui/gantt'

app.use(DouGantt)

基础用法 ​

v-model 绑定一份排期,里面的 tasks 是任务列表,links 是任务之间的依赖,格式见文档数据。

上下键选择任务,左右键收起或展开,空格选中;Alt 加左右键移动任务,Alt 加 Shift 加左右键调整结束时间;L 添加依赖;F2 重命名,菜单键打开菜单
任务
开始
工期
发布 2.0
10月25日
18 天
需求评审
10月25日
2 天
交互与视觉设计
10月28日
4 天
前端开发
11月3日
8 天
接口开发
11月1日
6 天
联调测试
11月13日
3 天
  • 有子任务的任务是汇总任务,它的起止时间和进度由子任务算出;
  • type: 'milestone' 的任务是里程碑,画成一个菱形;
  • 不设置 readonly 时可以直接拖动编辑,见编辑。

表格与任务条 ​

columns 设置左侧表格的列,默认是名称、开始和工期,写法见列。tableWidth 是表格的初始宽度,rowHeight 是行高。

barLabel 决定任务名放在哪里:

  • auto(默认):放得下时在任务条内,否则在任务条旁;
  • inside、outside:总是在条内或条旁;
  • none:不显示。

bar 插槽可以替换任务条里的内容,cell 插槽可以替换表格的单元格。

窄屏 ​

宽度小于 520px 时表格自动收起,只显示时间轴。任务名显示在任务条上或旁边;任务条不在视野里的行,任务名固定显示在时间轴左侧。也可以用 :table="false" 主动隐藏表格。

语言 ​

甘特图里的文字(表头、菜单、提示、读屏播报等)跟随 ConfigProvider 的语言,内置简体中文、繁体中文和英文。

messages 可以改写其中几条,只需写要改的部分。ganttLocales 是内置的三份文案,按语言名称索引;useGanttMessages(override?) 返回当前语言的文案,在扩展或插槽里需要相同的文字时使用。

API ​

Gantt Props ​

名称说明类型默认值
v-model排期:任务和依赖,见文档数据GanttDocument{ version: 1, tasks: [], links: [] }
v-model:selection选中的任务 idstring[][]
v-model:scale时间刻度,见时间轴GanttScale按内容自动选择
columns表格的列,见列GanttColumn[]名称、开始、工期
table显示左侧的表格;窄于 520px 时自动收起booleantrue
tableWidth表格的初始宽度(px)number360
rowHeight行高(px)number36
barLabel任务名放在哪里:auto 放得下时在条内,否则在条旁'auto' | 'inside' | 'outside' | 'none''auto'
range固定时间轴的范围;不设时两端随滚动延伸[string, string]—
today显示当前时间线booleantrue
weekStart一周的第一天:0 周日,1 周一0 | 1跟随语言
calendar工作日历,见工作日历GanttCalendar—
schedulingmanual 只改动拖动的任务;auto 同时把后续任务往后推,见自动排期'manual' | 'auto''manual'
critical高亮关键路径,见关键路径booleanfalse
markers标记线,见标记线GanttMarker[]—
baseline基线,见基线GanttBaselineItem[]—
addRow可编辑时在表格最下方显示添加任务的一行booleantrue
menu显示内置的菜单项,见右键菜单booleantrue
contextMenu自己的菜单项,排在最前面(target: GanttMenuTarget) => ContextMenuItem[]—
canLink连依赖前的最后一道检查,返回 true 允许,返回字符串时显示为原因,见依赖的限制(link: Pick<GanttLink, 'from' | 'to' | 'type'>, doc: GanttDocument) => boolean | string—
canMove写入新的时间前的最后一道检查,见移动的限制(move: GanttMove, doc: GanttDocument) => boolean | string—
readonly只读:不能拖动、连线和在表格里编辑,撤销重做的快捷键也不响应;代码调用 transact 仍然生效booleanfalse
extensions扩展,见扩展(GanttExtension | GanttExtension[])[]—
ariaLabel甘特图的无障碍名称string—
messages覆盖文案,只需写要改的部分GanttMessagesOverride—

Gantt Events ​

名称说明参数
transaction每次修改后触发,包括撤销和重做,在 v-model 更新之后,见用代码修改(tr: GanttTransaction)
transactionCancel修改被扩展取消时触发(tr: GanttTransaction)
link拖动连好一条依赖(link: GanttLink)
taskClick / taskDblclick点击、双击任务(task: GanttTask, event: MouseEvent)
taskContextmenu在任务上打开菜单前触发,event.preventDefault() 可以不打开(task: GanttTask, event: MouseEvent)
linkClick点击依赖线(link: GanttLink, event: MouseEvent)
linkContextmenu在依赖线上打开菜单前触发,event.preventDefault() 可以不打开(link: GanttLink, event: MouseEvent)

Gantt Slots ​

名称说明参数
cell表格的单元格{ task, row, column, text }
bar任务条里的内容,替换任务名{ task, row }
default画在甘特图上面的内容,比如面板,可以用 useGantt()—

Gantt Exposes ​

名称说明类型
transact在一个事务里修改,算作一步撤销(fn: (tr) => void, meta?) => GanttTransaction
undo / redo撤销、重做() => boolean
canUndo / canRedo能否撤销、重做boolean
schedule移动任务让所有依赖都满足,算作一步撤销;只往后推,pull 为 true 时也往前拉(options?: { pull?: boolean }) => GanttSchedule
insertTask在某个任务之后(或里面)添加一个任务并开始编辑名称,返回它的 id(near: string | null, options?: GanttInsertOptions) => string
indentTask / outdentTask缩进、取消缩进(id: string) => boolean
editCell开始编辑表格的单元格,默认名称;不能编辑时返回 false(id: string, key?: string) => boolean
fit选一个能放下全部任务的日宽,并滚动到第一个任务() => void
scrollToDate滚动到某个时间(date: string) => void
scrollToToday滚动到现在() => void
scrollToTask滚动到某个任务(id: string) => void
focusTask让键盘停在某个任务上,滚动到它并聚焦任务条(id: string) => void
zoomIn / zoomOut放大、缩小时间轴,视图中间的时间不动() => void
exportSVG导出 SVG 文本,见导出与打印(options?: GanttExportOptions) => string
exportPNG导出 PNG(options?: GanttImageOptions) => Promise<Blob>
toCSV导出 CSV 文本(options?: GanttCSVExportOptions) => string
readCSV读取 CSV 里的任务,不放进甘特图,见导入(text: string) => GanttCSVResult
importCSV把 CSV 里的任务放进甘特图,一步撤销;只读时返回 null(text: string, options?: GanttCSVImportOptions) => GanttCSVResult | null
print打印全部行(options?: GanttPrintOptions) => void