初始化实例
html
<div id="gantt"></div>
javascript
import Gantt from 'bbl-gantt'
const gantt = new Gantt({
// options
})
Options
ts
export type GanttOptions = {
el: ContainerType // 容器元素,可以是选择器字符串或 HTMLElement 对象
mode?: GanttMode // 模式,normal 表示普通模式,duration 表示持续时间模式
durationModeOptions?: DurationModeOptions // 仅在 mode=duration 模式下生效
readOnly?: boolean // 是否只读,只读模式下无法编辑数据
column?: Column // 列配置
// 行配置
row?: {
height?: number // 行高
}
// 头部配置
header?: {
height?: number // 头部高度
}
// 视图配置
view?: {
timeFullWidth?: boolean //是否时间铺满整个宽度,然后按照宽度和起止时间自动计算 gantt.column.timeMetric 和 gantt.column.width, 仅在 mode=duration 模式下生效
headerTimeFormat?: (args: HeaderTimeFormatArgs) => string //格式化时间显示
whileShowScrollReduceScrollBarSize?: boolean // 当展示滚动条的时候容器是否减去滚动条的大小
whileRowsLessContainerAutoReduceHeight?: boolean //当行数小于容器高度的时候是否自动减少容器高度
showScrollBar?: boolean //是否展示滚动条
showTicks?: boolean //是否展示刻度
showTickText?: boolean //是否展示刻度文字
showTimeTicks?: boolean //是否展示时间度量的刻度
showTimeTickText?: boolean //是否展示时间度量的刻度文字
headerTickTextTickNeeded?: boolean //有些刻度文字会重叠,但是我们只想展示不重叠的文字(设置overrideHeaderTitle为true即可),设置此属性为true会将没有文字部分的刻度隐藏
showEventTimeRange?: boolean //是否展示事件的时间范围
overrideHeaderTitle?: boolean //是否覆盖头部重叠的文字
/**
* event item 矩形样式的 padding-top 和 padding-bottom 值,默认是 0.25
* <1认为是百分比,>1认为是像素
* */
eventRectStylePadY?: number
}
//操作配置
action?: {
/**
* 鼠标在header上是否可以缩放度量时间
* min 和 max 表示缩放的最小最大值,单位是毫秒
* */
headerWheelTimeMetric?:
| boolean
| {
min?: number
max?: number
}
moveOrResizeStep?: boolean //移动事件和调整事件大小是否以tick为单位移动
enableEventMove?: boolean //是否允许事件移动
enableEventResize?: boolean //是否允许事件调整大小
enableCurrentTime?: boolean //容器点击是否允许显示当前时间
enableMoveOrResizeOutOfEdge?: boolean //是否允许移动或调整大小超出边界
enableNewEventItem?: boolean //是否允许新增事件项
}
data?: GanttItem[] //数据
//格式化配置
format?: {
eventItemTime?: (time: Dayjs) => GanttEventItemTime // 当 normal 模式 eventItem 时间改变时候,格式化 options.data 中的时间的格式
}
}
export type Column = {
width: number //每列的宽度
timeMetric: number | TimeMetric //毫秒数或者时间度量,代表每列的时间长度
padding: {
//duration模式不生效,都为0
//根据所有数据算出整个数据需要划分为多少列,这里的padding代表在这些列的前后要留多少空白列
left: number
right: number
}
}
export enum TimeMetric {
SECOND = 'SECOND',
MINUTE = 'MINUTE',
QUARTER_HOUR = 'QUARTER_HOUR',
HALF_HOUR = 'HALF_HOUR',
HOUR = 'HOUR',
QUARTER_DAY = 'QUARTER_DAY',
HALF_DAY = 'HALF_DAY',
DAY = 'DAY',
WEEK = 'WEEK',
MONTH = 'MONTH',
YEAR = 'YEAR',
}
export type HeaderTimeFormatArgs = {
gantt: Gantt
time: Dayjs
unit: UnitType
type: 'currentTime' | 'timeRange' | 'tick'
}
export type DurationModeOptions = {
duration: number //总时长 以秒为单位,小数后三位为毫秒 如:56.321
}
export type ContainerType = string | HTMLElement
export enum GanttMode {
Normal = 'normal',
Duration = 'duration',
}
export type GanttItem = {
id: string
name: string
events: GanttEventItem[]
children?: GanttItem[]
bg?: string
[key: string]: any
}
export type GanttEventItem = {
id: string
start: GanttEventItemTime
end: GanttEventItemTime
name: string
shape?: EventShapeType
color?: string
textColor?: string
[key: string]: any
}
export type GanttEventItemTime = string | number | Date | Dayjs
export enum EventShapeType {
rect = 'rect',
line = 'line',
}