@visactor/vtable-gantt 1.20.3 → 1.21.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/cjs/Gantt.d.ts +15 -0
- package/cjs/Gantt.js +47 -7
- package/cjs/Gantt.js.map +1 -1
- package/cjs/event/scroll.js +7 -2
- package/cjs/event/scroll.js.map +1 -1
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/state/gantt-table-sync.js +3 -3
- package/cjs/state/gantt-table-sync.js.map +1 -1
- package/cjs/state/state-manager.d.ts +2 -0
- package/cjs/state/state-manager.js +5 -2
- package/cjs/state/state-manager.js.map +1 -1
- package/cjs/ts-types/EVENT_TYPE.d.ts +1 -0
- package/cjs/ts-types/EVENT_TYPE.js +2 -1
- package/cjs/ts-types/EVENT_TYPE.js.map +1 -1
- package/cjs/ts-types/events.d.ts +3 -0
- package/cjs/ts-types/events.js.map +1 -1
- package/cjs/ts-types/gantt-engine.d.ts +2 -0
- package/cjs/ts-types/gantt-engine.js.map +1 -1
- package/cjs/ts-types/index.d.ts +1 -0
- package/cjs/ts-types/index.js +2 -1
- package/cjs/ts-types/index.js.map +1 -1
- package/cjs/ts-types/zoom-scale.d.ts +32 -0
- package/cjs/ts-types/zoom-scale.js +6 -0
- package/cjs/ts-types/zoom-scale.js.map +1 -0
- package/cjs/zoom-scale/DataZoomIntegration.d.ts +50 -0
- package/cjs/zoom-scale/DataZoomIntegration.js +261 -0
- package/cjs/zoom-scale/DataZoomIntegration.js.map +1 -0
- package/cjs/zoom-scale/ZoomScaleManager.d.ts +55 -0
- package/cjs/zoom-scale/ZoomScaleManager.js +327 -0
- package/cjs/zoom-scale/ZoomScaleManager.js.map +1 -0
- package/cjs/zoom-scale/index.d.ts +4 -0
- package/cjs/zoom-scale/index.js +24 -0
- package/cjs/zoom-scale/index.js.map +1 -0
- package/dist/vtable-gantt.js +2066 -207
- package/dist/vtable-gantt.min.js +2 -2
- package/es/Gantt.d.ts +15 -0
- package/es/Gantt.js +48 -7
- package/es/Gantt.js.map +1 -1
- package/es/event/scroll.js +7 -2
- package/es/event/scroll.js.map +1 -1
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/state/gantt-table-sync.js +2 -4
- package/es/state/gantt-table-sync.js.map +1 -1
- package/es/state/state-manager.d.ts +2 -0
- package/es/state/state-manager.js +5 -2
- package/es/state/state-manager.js.map +1 -1
- package/es/ts-types/EVENT_TYPE.d.ts +1 -0
- package/es/ts-types/EVENT_TYPE.js +2 -1
- package/es/ts-types/EVENT_TYPE.js.map +1 -1
- package/es/ts-types/events.d.ts +3 -0
- package/es/ts-types/events.js.map +1 -1
- package/es/ts-types/gantt-engine.d.ts +2 -0
- package/es/ts-types/gantt-engine.js.map +1 -1
- package/es/ts-types/index.d.ts +1 -0
- package/es/ts-types/index.js +2 -0
- package/es/ts-types/index.js.map +1 -1
- package/es/ts-types/zoom-scale.d.ts +32 -0
- package/es/ts-types/zoom-scale.js +2 -0
- package/es/ts-types/zoom-scale.js.map +1 -0
- package/es/zoom-scale/DataZoomIntegration.d.ts +50 -0
- package/es/zoom-scale/DataZoomIntegration.js +253 -0
- package/es/zoom-scale/DataZoomIntegration.js.map +1 -0
- package/es/zoom-scale/ZoomScaleManager.d.ts +55 -0
- package/es/zoom-scale/ZoomScaleManager.js +321 -0
- package/es/zoom-scale/ZoomScaleManager.js.map +1 -0
- package/es/zoom-scale/index.d.ts +4 -0
- package/es/zoom-scale/index.js +4 -0
- package/es/zoom-scale/index.js.map +1 -0
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ts-types/gantt-engine.ts"],"names":[],"mappings":"AA2bA,MAAM,CAAN,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,mDAAiC,CAAA;IACjC,iDAA+B,CAAA;IAC/B,qDAAmC,CAAA;IACnC,mDAAiC,CAAA;AACnC,CAAC,EALW,cAAc,KAAd,cAAc,QAKzB;AACD,MAAM,CAAN,IAAY,aAaX;AAbD,WAAY,aAAa;IAEvB,kDAAiC,CAAA;IAEjC,sDAAqC,CAAA;IAErC,0DAAyC,CAAA;IAEzC,wDAAuC,CAAA;IAEvC,wDAAuC,CAAA;IAEvC,sEAAqD,CAAA;AACvD,CAAC,EAbW,aAAa,KAAb,aAAa,QAaxB;AAID,MAAM,CAAN,IAAY,QAIX;AAJD,WAAY,QAAQ;IAClB,yBAAa,CAAA;IACb,+BAAmB,CAAA;IACnB,mCAAuB,CAAA;AACzB,CAAC,EAJW,QAAQ,KAAR,QAAQ,QAInB","file":"gantt-engine.js","sourcesContent":["import type { ColumnsDefine, TYPES, ListTableConstructorOptions } from '@visactor/vtable';\nimport type { Group } from '@visactor/vtable/es/vrender';\nimport type { Gantt } from '../Gantt';\nexport type LayoutObjectId = number | string;\nimport type { IGanttPlugin } from '../plugins/interface';\nexport interface ITimelineDateInfo {\n days: number;\n endDate: Date;\n startDate: Date;\n title: string;\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n unit: 'year' | 'month' | 'quarter' | 'week' | 'day' | 'hour' | 'minute' | 'second';\n step: number;\n}\n\nexport interface ITimelineHeaderStyle {\n padding?: number | number[];\n fontSize?: number;\n fontWeight?: string;\n color?: string;\n strokeColor?: string;\n // backgroundColor?: string;\n textAlign?: 'center' | 'end' | 'left' | 'right' | 'start'; // 设置单元格内文字的水平对齐方式\n textOverflow?: string;\n textBaseline?: 'alphabetic' | 'bottom' | 'middle' | 'top'; // 设置单元格内文字的垂直对齐方式\n textStick?: boolean;\n}\nexport interface IGrid {\n backgroundColor?: string;\n /** 需要按数据行设置不同背景色 */\n horizontalBackgroundColor?: string[] | ((args: GridHorizontalLineStyleArgumentType) => string);\n /** 需要按日期列设置不同背景色 */\n verticalBackgroundColor?: string[] | ((args: GridVerticalLineStyleArgumentType) => string);\n /** 周末背景色 */\n weekendBackgroundColor?: string;\n\n verticalLine?: ILineStyle | ((args: GridVerticalLineStyleArgumentType) => ILineStyle);\n horizontalLine?: ILineStyle | ((args: GridHorizontalLineStyleArgumentType) => ILineStyle);\n /** 竖线依赖的日期刻度。默认为timelineHeader中scales中的最小时间粒度 */\n verticalLineDependenceOnTimeScale?: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second';\n}\n//#region gantt\nexport interface GanttConstructorOptions {\n /**\n * 数据集合\n */\n records?: any[];\n\n /** 左侧任务信息表格相关配置 */\n taskListTable?: {\n /** 左侧任务列表信息占用的宽度。如果设置为'auto'表示将所有列完全展示 */\n tableWidth?: 'auto' | number;\n /** 左侧任务列表 最小宽度 */\n minTableWidth?: number;\n /** 左侧任务列表 最大宽度 */\n maxTableWidth?: number;\n } & Omit<\n //ListTable表格可配置的属性\n ListTableConstructorOptions,\n | 'container'\n | 'records'\n | 'defaultHeaderRowHeight'\n | 'defaultRowHeight'\n | 'overscrollBehavior'\n | 'rowSeriesNumber'\n | 'scrollStyle'\n | 'pixelRatio'\n | 'title'\n >;\n /** 时间刻度 */\n timelineHeader: {\n backgroundColor?: string;\n colWidth?: number;\n /** 垂直间隔线样式 */\n verticalLine?: ILineStyle;\n /** 水平间隔线样式 */\n horizontalLine?: ILineStyle;\n scales: ITimelineScale[];\n };\n\n /** 任务条相关配置及样式 */\n taskBar?: {\n /** 任务开始日期对应的数据字段名 默认按'startDate' */\n startDateField?: string;\n /** 任务结束日期对应的数据字段名 默认按'endDate' */\n endDateField?: string;\n /** 任务进度对应的数据字段名 */\n progressField?: string;\n /** 任务条展示文字。可以配置固定文本 或者 字符串模版`${fieldName}` */\n labelText?: ITaskBarLabelText;\n /** 任务条文字样式 */\n labelTextStyle?: ITaskBarLabelTextStyle;\n /** 任务条样式 */\n barStyle?: ITaskBarStyle | ((args: TaskBarInteractionArgumentType) => ITaskBarStyle);\n milestoneStyle?: IMilestoneStyle;\n projectStyle?: ITaskBarStyle | ((args: TaskBarInteractionArgumentType) => ITaskBarStyle);\n /** 自定义布局渲染 */\n customLayout?: ITaskBarCustomLayout;\n /** 任务条是否可调整大小 */\n resizable?:\n | boolean\n | [boolean, boolean]\n | ((interactionArgs: TaskBarInteractionArgumentType) => boolean | [boolean, boolean]);\n /** 任务条是否可移动 */\n moveable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);\n /** 任务进度是否可调整 */\n progressAdjustable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);\n /** 任务条拖拽超出当前日期范围时自动扩展日期范围 */\n moveToExtendDateRange?: boolean;\n /** 任务条是否可以被拖拽来改变顺序 */\n dragOrder?: boolean;\n /** 任务条hover时的样式 */\n hoverBarStyle?: ITaskBarHoverStyle;\n /** 任务条选择时的样式 TODO */\n selectedBarStyle?: ITaskBarSelectedStyle;\n /** 任务条是否可选择,默认为true */\n selectable?: boolean;\n /** 任务条右键菜单 */\n menu?: {\n /** 右键菜单。代替原来的option.contextmenu */\n contextMenuItems?:\n | TYPES.MenuListItem[]\n | ((\n record: string,\n index: number,\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number,\n startDate: Date,\n endDate: Date\n ) => TYPES.MenuListItem[]);\n };\n /** 数据没有排期时,可通过创建任务条排期。默认为true */\n scheduleCreatable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);\n /** 针对没有分配日期的任务,可以显示出创建按钮 */\n scheduleCreation?: {\n buttonStyle?: ILineStyle & {\n cornerRadius?: number;\n backgroundColor?: string;\n };\n /** 任务条创建按钮的自定义渲染 */\n customLayout?: ITaskCreationCustomLayout;\n /** 任务条创建按钮的最大宽度 */\n maxWidth?: number;\n /** 任务条创建按钮的最小宽度 */\n minWidth?: number;\n };\n };\n /** 数据条目可唯一标识的字段名,默认为'id' */\n taskKeyField?: string;\n /** 任务之间的依赖关系 */\n dependency?: {\n links: ITaskLink[];\n linkLineStyle?: ILineStyle;\n linkCreatable?: boolean;\n linkSelectable?: boolean;\n linkDeletable?: boolean;\n linkSelectedLineStyle?: ITaskLinkSelectedStyle;\n /** 创建关联线的操作点 */\n linkCreatePointStyle?: IPointStyle;\n /** 创建关联线的操作点响应状态效果 */\n linkCreatingPointStyle?: IPointStyle;\n /** 创建关联线的操作线样式 */\n linkCreatingLineStyle?: ILineStyle;\n };\n /** 网格线配置 */\n grid?: IGrid;\n\n /** 整个外边框及横纵分割线配置。 */\n frame?: {\n outerFrameStyle: IFrameStyle;\n verticalSplitLine?: ILineStyle;\n horizontalSplitLine?: ILineStyle;\n verticalSplitLineMoveable?: boolean;\n //列调整宽度的直线\n verticalSplitLineHighlight?: ILineStyle;\n };\n\n /** 标记线配置 如果配置为true 会自动给今天做标记 */\n markLine?: boolean | IMarkLine | IMarkLine[];\n\n /** 指定整个甘特图的最小日期 */\n minDate?: string;\n /** 指定整个甘特图的最大日期 不设置的话用默认规则*/\n maxDate?: string;\n\n /** 顶部表头部分默认行高。如果想按表头层级依次配置,请配置到timelineHeader.scale中 */\n headerRowHeight?: number;\n\n /** 数据默认行高 */\n rowHeight?: number;\n\n /** 行号配置 */\n rowSeriesNumber?: IRowSeriesNumber;\n\n /**\n * 'auto':和浏览器滚动行为一致 表格滚动到顶部/底部时 触发浏览器默认行为;\n * 设置为 'none' 时, 表格滚动到顶部/底部时, 不再触发父容器滚动\n * */\n overscrollBehavior?: 'auto' | 'none';\n\n scrollStyle?: IScrollStyle;\n\n pixelRatio?: number;\n dateFormat?:\n | 'yyyy-mm-dd'\n | 'dd-mm-yyyy'\n | 'mm/dd/yyyy'\n | 'yyyy/mm/dd'\n | 'dd/mm/yyyy'\n | 'yyyy.mm.dd'\n | 'dd.mm.yyyy'\n | 'mm.dd.yyyy';\n\n /** 表格绘制范围外的canvas上填充的颜色 */\n underlayBackgroundColor?: string;\n groupBy?: true | string | string[];\n /** 展示嵌套结构数据时的模式,默认为full。*/\n tasksShowMode?: TasksShowMode;\n /**\n * 当使用Project_Sub_Tasks_Inline模式时,控制是否启用项目子任务的展开/收起功能\n * 默认值为true\n * 当设置为true(默认值)时,项目节点可以展开/收起其子任务\n * 当设置为false时,项目节点将始终以内联方式显示其子任务,没有展开/收起功能\n */\n projectSubTasksExpandable?: boolean;\n eventOptions?: IEventOptions;\n keyboardOptions?: IKeyboardOptions;\n markLineCreateOptions?: IMarkLineCreateOptions;\n plugins?: IGanttPlugin[];\n}\n/**\n * IBarLabelText\n * 可以配置固定文本 或者 ${fieldName} 或者自定义函数\n */\nexport type ITaskBarLabelText = string; //| string[] | ((args: any) => string | string[]);\nexport interface ITimelineScale {\n rowHeight?: number;\n unit: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second';\n step: number;\n startOfWeek?: 'sunday' | 'monday';\n customLayout?: IDateCustomLayout;\n style?: ITimelineHeaderStyle;\n format?: (date: DateFormatArgumentType) => string;\n visible?: boolean;\n}\nexport interface ITaskBarLabelTextStyle {\n fontFamily?: string;\n fontSize?: number;\n color?: string;\n /** 当文字显示在任务条外侧时的颜色,默认为黑色 */\n outsideColor?: string;\n textAlign?: 'center' | 'end' | 'left' | 'right' | 'start'; // 设置单元格内文字的水平对齐方式\n textOverflow?: string;\n textBaseline?: 'alphabetic' | 'bottom' | 'middle' | 'top'; // 设置单元格内文字的垂直对齐方式\n padding?: number | number[];\n /** 相对于任务条文字方位位置,可选值:'left', 'top', 'right', 'bottom',分别代表左、上、右、下四个方向 */\n orient?: 'left' | 'top' | 'right' | 'bottom';\n /** 只有当文本在 taskbar 中容纳不下时,会根据该方位将文本显示在任务条旁边。当配置 orient 时,该配置无效 */\n orientHandleWithOverflow?: 'left' | 'top' | 'right' | 'bottom';\n}\nexport interface ITaskBarStyle {\n /** 任务条的颜色 */\n barColor?: string;\n /** 已完成部分任务条的颜色 */\n completedBarColor?: string;\n /** 任务条的宽度 */\n width?: number;\n /** 任务条的圆角 */\n cornerRadius?: number;\n /**@deprecated 请配置borderLineWidth */\n borderWidth?: number;\n\n /** 任务条的边框宽度 */\n borderLineWidth?: number;\n /** 边框颜色 */\n borderColor?: string;\n\n /** 任务条的最小尺寸 */\n minSize?: number;\n}\nexport interface IMilestoneStyle {\n /** 里程碑边框颜色 */\n borderColor?: string;\n /** 里程碑边框宽度 */\n borderLineWidth?: number;\n /** 里程碑填充颜色 */\n fillColor?: string;\n /** 里程碑正方形圆角 */\n cornerRadius?: number;\n /** 里程碑默认是个正方形,这个width配置正方形的边长 */\n width?: number;\n /** 里程碑展示文字。可以配置固定文本 或者 字符串模版`${fieldName}` */\n labelText?: ITaskBarLabelText;\n /** 里程碑文字样式 */\n labelTextStyle?: ITaskBarLabelTextStyle;\n // /** 里程碑图标 */\n // icon?: string;\n /** 文字相对于里程碑的位置 */\n textOrient?: 'left' | 'top' | 'right' | 'bottom';\n}\nexport type ILineStyle = {\n lineColor?: string;\n lineWidth?: number;\n lineDash?: number[];\n};\nexport type IPointStyle = {\n strokeColor?: string;\n strokeWidth?: number;\n fillColor?: string;\n radius?: number;\n};\nexport interface IMarkLine {\n date: string;\n content?: string;\n contentStyle?: {\n color?: string;\n fontSize?: number;\n fontWeight?: string;\n lineHeight?: number;\n backgroundColor?: string;\n cornerRadius?: number | number[];\n };\n style?: ILineStyle;\n /** 标记线显示在日期列下的位置 默认为'left' */\n position?: 'left' | 'right' | 'middle' | 'date';\n /** 自动将日期范围内 包括改标记线 */\n scrollToMarkLine?: boolean;\n}\nexport type ITableColumnsDefine = ColumnsDefine;\nexport type IFrameStyle = {\n borderColor?: string;\n borderLineWidth?: number | number[];\n borderLineDash?: number[];\n cornerRadius?: number;\n};\n\nexport type ITableStyle = TYPES.ThemeStyle;\nexport type IRowSeriesNumber = TYPES.IRowSeriesNumber;\nexport type IScrollStyle = TYPES.ScrollStyle;\nexport type IEventOptions = TYPES.TableEventOptions;\n\nexport interface IKeyboardOptions {\n /** 当按下del按键是否删除连线 默认为false */\n deleteLinkOnDel?: boolean;\n /** 当按下back按键是否删除连线 默认为false */\n deleteLinkOnBack?: boolean;\n}\nexport type DateFormatArgumentType = {\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n startDate: Date;\n endDate: Date;\n};\nexport type TaskBarInteractionArgumentType = {\n taskRecord: any;\n index: number;\n subIndex?: number;\n startDate: Date;\n endDate: Date;\n ganttInstance: Gantt;\n};\n\nexport type TaskBarCustomLayoutArgumentType = {\n width: number;\n height: number;\n index: number;\n startDate: Date;\n endDate: Date;\n taskDays: number;\n progress: number;\n taskRecord: any;\n ganttInstance: Gantt;\n};\nexport type ITaskBarCustomLayoutObj = {\n rootContainer?: Group;\n renderDefaultBar?: boolean; // 默认false\n renderDefaultResizeIcon?: boolean; // 默认false\n renderDefaultText?: boolean; // 默认false\n};\nexport type ITaskBarCustomLayout = (args: TaskBarCustomLayoutArgumentType) => ITaskBarCustomLayoutObj; //CustomLayout\n\nexport type DateCustomLayoutArgumentType = {\n width: number;\n height: number;\n index: number;\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n title: string;\n startDate: Date;\n endDate: Date;\n days: number;\n ganttInstance: Gantt;\n};\nexport type IDateCustomLayoutObj = {\n rootContainer: Group;\n renderDefaultText?: boolean; // 默认false\n};\nexport type IDateCustomLayout = (args: DateCustomLayoutArgumentType) => IDateCustomLayoutObj;\n\nexport type GridVerticalLineStyleArgumentType = {\n /** 竖线是第几条线*/\n index: number;\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n /** 如果是竖线,date代表分割线指向的具体时间点 */\n date?: Date;\n ganttInstance: Gantt;\n};\n\nexport type GridHorizontalLineStyleArgumentType = {\n /** 横线是第几条线 也代表了左侧表格的body行号 */\n index: number;\n ganttInstance: Gantt;\n};\n\nexport type TaskCreationCustomLayoutArgumentType = {\n width: number;\n height: number;\n // index: number;\n ganttInstance: Gantt;\n};\nexport type ITaskCreationCustomLayoutObj = {\n rootContainer: Group;\n};\nexport type ITaskCreationCustomLayout = (args: TaskCreationCustomLayoutArgumentType) => ITaskCreationCustomLayoutObj;\n\nexport type ITaskLink = {\n /** 依赖的类型 */\n type: DependencyType;\n /** 依赖线的起始任务唯一标识。如果是tree树形结构的数据 设置数组的话 查找性能会更高 */\n linkedFromTaskKey?: string | number | (string | number)[];\n /** 依赖的终止目标任务唯一标识。如果是tree树形结构的数据 设置数组的话 查找性能会更高 */\n linkedToTaskKey?: string | number | (string | number)[];\n /** 依赖线的样式 */\n linkLineStyle?: ILineStyle;\n};\n\nexport type ITaskLinkSelectedStyle = ILineStyle & {\n shadowBlur?: number; //阴影宽度\n shadowOffset?: number; //偏移\n shadowColor?: string; //阴影颜色\n};\nexport enum DependencyType {\n FinishToStart = 'finish_to_start',\n StartToStart = 'start_to_start',\n FinishToFinish = 'finish_to_finish',\n StartToFinish = 'start_to_finish'\n}\nexport enum TasksShowMode {\n /** 每一个任务节点用单独一行来展示,父任务占用一行,子任务分别占用一行。这是默认的显示效果 */\n Tasks_Separate = 'tasks_separate',\n /** 省去父任务节点不展示,并把所有子任务的节点都放到同一行来展示。 */\n Sub_Tasks_Inline = 'sub_tasks_inline',\n /** 省去父任务节点不展示,且所有子任务的节点分别用一行展示。*/\n Sub_Tasks_Separate = 'sub_tasks_separate',\n /** 省去父任务节点不展示,且所有子任务会维持records中的数据顺序布局,并保证节点不重叠展示 */\n Sub_Tasks_Arrange = 'sub_tasks_arrange',\n /** 省去父任务节点不展示,且所有子任务会按照日期早晚的属性来布局,并保证节点不重叠的紧凑型展示 */\n Sub_Tasks_Compact = 'sub_tasks_compact',\n /** 数据标记为project的节点,会把所有子任务的节点都放到和主任务的同一行来展示。其他节点则保持默认的显示效果即Tasks_Separate */\n Project_Sub_Tasks_Inline = 'project_sub_tasks_inline'\n}\n/**\n * 任务类型枚举,用于区分不同类型的任务\n */\nexport enum TaskType {\n TASK = 'task', // record没有指明type的 会默认使用TASK\n PROJECT = 'project',\n MILESTONE = 'milestone'\n}\nexport type ITaskBarSelectedStyle = {\n shadowBlur?: number; //阴影宽度\n shadowOffsetX?: number; //x方向偏移\n shadowOffsetY?: number; //Y方向偏移\n shadowColor?: string; //阴影颜色\n borderColor?: string; //边框颜色\n borderLineWidth?: number;\n};\nexport type ITaskBarHoverStyle = {\n /** 任务条的圆角 */\n cornerRadius?: number;\n barOverlayColor?: string;\n};\n//#endregion\n\nexport type IMarkLineCreateOptions = {\n markLineCreatable: boolean;\n markLineCreationHoverToolTip?: {\n position?: 'top' | 'bottom';\n tipContent?: string;\n style?: {\n contentStyle?: any;\n panelStyle?: any;\n };\n };\n markLineCreationStyle?: {\n fill?: string;\n size?: number;\n iconSize?: number;\n svg?: string;\n };\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ts-types/gantt-engine.ts"],"names":[],"mappings":"AAicA,MAAM,CAAN,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,mDAAiC,CAAA;IACjC,iDAA+B,CAAA;IAC/B,qDAAmC,CAAA;IACnC,mDAAiC,CAAA;AACnC,CAAC,EALW,cAAc,KAAd,cAAc,QAKzB;AACD,MAAM,CAAN,IAAY,aAaX;AAbD,WAAY,aAAa;IAEvB,kDAAiC,CAAA;IAEjC,sDAAqC,CAAA;IAErC,0DAAyC,CAAA;IAEzC,wDAAuC,CAAA;IAEvC,wDAAuC,CAAA;IAEvC,sEAAqD,CAAA;AACvD,CAAC,EAbW,aAAa,KAAb,aAAa,QAaxB;AAID,MAAM,CAAN,IAAY,QAIX;AAJD,WAAY,QAAQ;IAClB,yBAAa,CAAA;IACb,+BAAmB,CAAA;IACnB,mCAAuB,CAAA;AACzB,CAAC,EAJW,QAAQ,KAAR,QAAQ,QAInB","file":"gantt-engine.js","sourcesContent":["import type { ColumnsDefine, TYPES, ListTableConstructorOptions } from '@visactor/vtable';\nimport type { Group } from '@visactor/vtable/es/vrender';\nimport type { Gantt } from '../Gantt';\nexport type LayoutObjectId = number | string;\nimport type { IGanttPlugin } from '../plugins/interface';\nimport type { IZoomScale } from './zoom-scale';\nexport interface ITimelineDateInfo {\n days: number;\n endDate: Date;\n startDate: Date;\n title: string;\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n unit: 'year' | 'month' | 'quarter' | 'week' | 'day' | 'hour' | 'minute' | 'second';\n step: number;\n}\n\nexport interface ITimelineHeaderStyle {\n padding?: number | number[];\n fontSize?: number;\n fontWeight?: string;\n color?: string;\n strokeColor?: string;\n // backgroundColor?: string;\n textAlign?: 'center' | 'end' | 'left' | 'right' | 'start'; // 设置单元格内文字的水平对齐方式\n textOverflow?: string;\n textBaseline?: 'alphabetic' | 'bottom' | 'middle' | 'top'; // 设置单元格内文字的垂直对齐方式\n textStick?: boolean;\n}\nexport interface IGrid {\n backgroundColor?: string;\n /** 需要按数据行设置不同背景色 */\n horizontalBackgroundColor?: string[] | ((args: GridHorizontalLineStyleArgumentType) => string);\n /** 需要按日期列设置不同背景色 */\n verticalBackgroundColor?: string[] | ((args: GridVerticalLineStyleArgumentType) => string);\n /** 周末背景色 */\n weekendBackgroundColor?: string;\n\n verticalLine?: ILineStyle | ((args: GridVerticalLineStyleArgumentType) => ILineStyle);\n horizontalLine?: ILineStyle | ((args: GridHorizontalLineStyleArgumentType) => ILineStyle);\n /** 竖线依赖的日期刻度。默认为timelineHeader中scales中的最小时间粒度 */\n verticalLineDependenceOnTimeScale?: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second';\n}\n//#region gantt\nexport interface GanttConstructorOptions {\n /**\n * 数据集合\n */\n records?: any[];\n\n /** 左侧任务信息表格相关配置 */\n taskListTable?: {\n /** 左侧任务列表信息占用的宽度。如果设置为'auto'表示将所有列完全展示 */\n tableWidth?: 'auto' | number;\n /** 左侧任务列表 最小宽度 */\n minTableWidth?: number;\n /** 左侧任务列表 最大宽度 */\n maxTableWidth?: number;\n } & Omit<\n //ListTable表格可配置的属性\n ListTableConstructorOptions,\n | 'container'\n | 'records'\n | 'defaultHeaderRowHeight'\n | 'defaultRowHeight'\n | 'overscrollBehavior'\n | 'rowSeriesNumber'\n | 'scrollStyle'\n | 'pixelRatio'\n | 'title'\n >;\n /** 时间刻度 */\n timelineHeader: {\n backgroundColor?: string;\n colWidth?: number;\n /** 垂直间隔线样式 */\n verticalLine?: ILineStyle;\n /** 水平间隔线样式 */\n horizontalLine?: ILineStyle;\n /**\n * ZoomScale 多级别缩放配置(优先级高于 timelineHeader.scales)\n * 当启用时,会根据缩放级别自动切换不同的 scales 组合\n */\n zoomScale?: IZoomScale;\n scales: ITimelineScale[];\n };\n\n /** 任务条相关配置及样式 */\n taskBar?: {\n /** 任务开始日期对应的数据字段名 默认按'startDate' */\n startDateField?: string;\n /** 任务结束日期对应的数据字段名 默认按'endDate' */\n endDateField?: string;\n /** 任务进度对应的数据字段名 */\n progressField?: string;\n /** 任务条展示文字。可以配置固定文本 或者 字符串模版`${fieldName}` */\n labelText?: ITaskBarLabelText;\n /** 任务条文字样式 */\n labelTextStyle?: ITaskBarLabelTextStyle;\n /** 任务条样式 */\n barStyle?: ITaskBarStyle | ((args: TaskBarInteractionArgumentType) => ITaskBarStyle);\n milestoneStyle?: IMilestoneStyle;\n projectStyle?: ITaskBarStyle | ((args: TaskBarInteractionArgumentType) => ITaskBarStyle);\n /** 自定义布局渲染 */\n customLayout?: ITaskBarCustomLayout;\n /** 任务条是否可调整大小 */\n resizable?:\n | boolean\n | [boolean, boolean]\n | ((interactionArgs: TaskBarInteractionArgumentType) => boolean | [boolean, boolean]);\n /** 任务条是否可移动 */\n moveable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);\n /** 任务进度是否可调整 */\n progressAdjustable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);\n /** 任务条拖拽超出当前日期范围时自动扩展日期范围 */\n moveToExtendDateRange?: boolean;\n /** 任务条是否可以被拖拽来改变顺序 */\n dragOrder?: boolean;\n /** 任务条hover时的样式 */\n hoverBarStyle?: ITaskBarHoverStyle;\n /** 任务条选择时的样式 TODO */\n selectedBarStyle?: ITaskBarSelectedStyle;\n /** 任务条是否可选择,默认为true */\n selectable?: boolean;\n /** 任务条右键菜单 */\n menu?: {\n /** 右键菜单。代替原来的option.contextmenu */\n contextMenuItems?:\n | TYPES.MenuListItem[]\n | ((\n record: string,\n index: number,\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number,\n startDate: Date,\n endDate: Date\n ) => TYPES.MenuListItem[]);\n };\n /** 数据没有排期时,可通过创建任务条排期。默认为true */\n scheduleCreatable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);\n /** 针对没有分配日期的任务,可以显示出创建按钮 */\n scheduleCreation?: {\n buttonStyle?: ILineStyle & {\n cornerRadius?: number;\n backgroundColor?: string;\n };\n /** 任务条创建按钮的自定义渲染 */\n customLayout?: ITaskCreationCustomLayout;\n /** 任务条创建按钮的最大宽度 */\n maxWidth?: number;\n /** 任务条创建按钮的最小宽度 */\n minWidth?: number;\n };\n };\n /** 数据条目可唯一标识的字段名,默认为'id' */\n taskKeyField?: string;\n /** 任务之间的依赖关系 */\n dependency?: {\n links: ITaskLink[];\n linkLineStyle?: ILineStyle;\n linkCreatable?: boolean;\n linkSelectable?: boolean;\n linkDeletable?: boolean;\n linkSelectedLineStyle?: ITaskLinkSelectedStyle;\n /** 创建关联线的操作点 */\n linkCreatePointStyle?: IPointStyle;\n /** 创建关联线的操作点响应状态效果 */\n linkCreatingPointStyle?: IPointStyle;\n /** 创建关联线的操作线样式 */\n linkCreatingLineStyle?: ILineStyle;\n };\n /** 网格线配置 */\n grid?: IGrid;\n\n /** 整个外边框及横纵分割线配置。 */\n frame?: {\n outerFrameStyle: IFrameStyle;\n verticalSplitLine?: ILineStyle;\n horizontalSplitLine?: ILineStyle;\n verticalSplitLineMoveable?: boolean;\n //列调整宽度的直线\n verticalSplitLineHighlight?: ILineStyle;\n };\n\n /** 标记线配置 如果配置为true 会自动给今天做标记 */\n markLine?: boolean | IMarkLine | IMarkLine[];\n\n /** 指定整个甘特图的最小日期 */\n minDate?: string;\n /** 指定整个甘特图的最大日期 不设置的话用默认规则*/\n maxDate?: string;\n\n /** 顶部表头部分默认行高。如果想按表头层级依次配置,请配置到timelineHeader.scale中 */\n headerRowHeight?: number;\n\n /** 数据默认行高 */\n rowHeight?: number;\n\n /** 行号配置 */\n rowSeriesNumber?: IRowSeriesNumber;\n\n /**\n * 'auto':和浏览器滚动行为一致 表格滚动到顶部/底部时 触发浏览器默认行为;\n * 设置为 'none' 时, 表格滚动到顶部/底部时, 不再触发父容器滚动\n * */\n overscrollBehavior?: 'auto' | 'none';\n\n scrollStyle?: IScrollStyle;\n\n pixelRatio?: number;\n dateFormat?:\n | 'yyyy-mm-dd'\n | 'dd-mm-yyyy'\n | 'mm/dd/yyyy'\n | 'yyyy/mm/dd'\n | 'dd/mm/yyyy'\n | 'yyyy.mm.dd'\n | 'dd.mm.yyyy'\n | 'mm.dd.yyyy';\n\n /** 表格绘制范围外的canvas上填充的颜色 */\n underlayBackgroundColor?: string;\n groupBy?: true | string | string[];\n /** 展示嵌套结构数据时的模式,默认为full。*/\n tasksShowMode?: TasksShowMode;\n /**\n * 当使用Project_Sub_Tasks_Inline模式时,控制是否启用项目子任务的展开/收起功能\n * 默认值为true\n * 当设置为true(默认值)时,项目节点可以展开/收起其子任务\n * 当设置为false时,项目节点将始终以内联方式显示其子任务,没有展开/收起功能\n */\n projectSubTasksExpandable?: boolean;\n eventOptions?: IEventOptions;\n keyboardOptions?: IKeyboardOptions;\n markLineCreateOptions?: IMarkLineCreateOptions;\n plugins?: IGanttPlugin[];\n}\n/**\n * IBarLabelText\n * 可以配置固定文本 或者 ${fieldName} 或者自定义函数\n */\nexport type ITaskBarLabelText = string; //| string[] | ((args: any) => string | string[]);\nexport interface ITimelineScale {\n rowHeight?: number;\n unit: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second';\n step: number;\n startOfWeek?: 'sunday' | 'monday';\n customLayout?: IDateCustomLayout;\n style?: ITimelineHeaderStyle;\n format?: (date: DateFormatArgumentType) => string;\n visible?: boolean;\n}\nexport interface ITaskBarLabelTextStyle {\n fontFamily?: string;\n fontSize?: number;\n color?: string;\n /** 当文字显示在任务条外侧时的颜色,默认为黑色 */\n outsideColor?: string;\n textAlign?: 'center' | 'end' | 'left' | 'right' | 'start'; // 设置单元格内文字的水平对齐方式\n textOverflow?: string;\n textBaseline?: 'alphabetic' | 'bottom' | 'middle' | 'top'; // 设置单元格内文字的垂直对齐方式\n padding?: number | number[];\n /** 相对于任务条文字方位位置,可选值:'left', 'top', 'right', 'bottom',分别代表左、上、右、下四个方向 */\n orient?: 'left' | 'top' | 'right' | 'bottom';\n /** 只有当文本在 taskbar 中容纳不下时,会根据该方位将文本显示在任务条旁边。当配置 orient 时,该配置无效 */\n orientHandleWithOverflow?: 'left' | 'top' | 'right' | 'bottom';\n}\nexport interface ITaskBarStyle {\n /** 任务条的颜色 */\n barColor?: string;\n /** 已完成部分任务条的颜色 */\n completedBarColor?: string;\n /** 任务条的宽度 */\n width?: number;\n /** 任务条的圆角 */\n cornerRadius?: number;\n /**@deprecated 请配置borderLineWidth */\n borderWidth?: number;\n\n /** 任务条的边框宽度 */\n borderLineWidth?: number;\n /** 边框颜色 */\n borderColor?: string;\n\n /** 任务条的最小尺寸 */\n minSize?: number;\n}\nexport interface IMilestoneStyle {\n /** 里程碑边框颜色 */\n borderColor?: string;\n /** 里程碑边框宽度 */\n borderLineWidth?: number;\n /** 里程碑填充颜色 */\n fillColor?: string;\n /** 里程碑正方形圆角 */\n cornerRadius?: number;\n /** 里程碑默认是个正方形,这个width配置正方形的边长 */\n width?: number;\n /** 里程碑展示文字。可以配置固定文本 或者 字符串模版`${fieldName}` */\n labelText?: ITaskBarLabelText;\n /** 里程碑文字样式 */\n labelTextStyle?: ITaskBarLabelTextStyle;\n // /** 里程碑图标 */\n // icon?: string;\n /** 文字相对于里程碑的位置 */\n textOrient?: 'left' | 'top' | 'right' | 'bottom';\n}\nexport type ILineStyle = {\n lineColor?: string;\n lineWidth?: number;\n lineDash?: number[];\n};\nexport type IPointStyle = {\n strokeColor?: string;\n strokeWidth?: number;\n fillColor?: string;\n radius?: number;\n};\nexport interface IMarkLine {\n date: string;\n content?: string;\n contentStyle?: {\n color?: string;\n fontSize?: number;\n fontWeight?: string;\n lineHeight?: number;\n backgroundColor?: string;\n cornerRadius?: number | number[];\n };\n style?: ILineStyle;\n /** 标记线显示在日期列下的位置 默认为'left' */\n position?: 'left' | 'right' | 'middle' | 'date';\n /** 自动将日期范围内 包括改标记线 */\n scrollToMarkLine?: boolean;\n}\nexport type ITableColumnsDefine = ColumnsDefine;\nexport type IFrameStyle = {\n borderColor?: string;\n borderLineWidth?: number | number[];\n borderLineDash?: number[];\n cornerRadius?: number;\n};\n\nexport type ITableStyle = TYPES.ThemeStyle;\nexport type IRowSeriesNumber = TYPES.IRowSeriesNumber;\nexport type IScrollStyle = TYPES.ScrollStyle;\nexport type IEventOptions = TYPES.TableEventOptions;\n\nexport interface IKeyboardOptions {\n /** 当按下del按键是否删除连线 默认为false */\n deleteLinkOnDel?: boolean;\n /** 当按下back按键是否删除连线 默认为false */\n deleteLinkOnBack?: boolean;\n}\nexport type DateFormatArgumentType = {\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n startDate: Date;\n endDate: Date;\n};\nexport type TaskBarInteractionArgumentType = {\n taskRecord: any;\n index: number;\n subIndex?: number;\n startDate: Date;\n endDate: Date;\n ganttInstance: Gantt;\n};\n\nexport type TaskBarCustomLayoutArgumentType = {\n width: number;\n height: number;\n index: number;\n startDate: Date;\n endDate: Date;\n taskDays: number;\n progress: number;\n taskRecord: any;\n ganttInstance: Gantt;\n};\nexport type ITaskBarCustomLayoutObj = {\n rootContainer?: Group;\n renderDefaultBar?: boolean; // 默认false\n renderDefaultResizeIcon?: boolean; // 默认false\n renderDefaultText?: boolean; // 默认false\n};\nexport type ITaskBarCustomLayout = (args: TaskBarCustomLayoutArgumentType) => ITaskBarCustomLayoutObj; //CustomLayout\n\nexport type DateCustomLayoutArgumentType = {\n width: number;\n height: number;\n index: number;\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n title: string;\n startDate: Date;\n endDate: Date;\n days: number;\n ganttInstance: Gantt;\n};\nexport type IDateCustomLayoutObj = {\n rootContainer: Group;\n renderDefaultText?: boolean; // 默认false\n};\nexport type IDateCustomLayout = (args: DateCustomLayoutArgumentType) => IDateCustomLayoutObj;\n\nexport type GridVerticalLineStyleArgumentType = {\n /** 竖线是第几条线*/\n index: number;\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n /** 如果是竖线,date代表分割线指向的具体时间点 */\n date?: Date;\n ganttInstance: Gantt;\n};\n\nexport type GridHorizontalLineStyleArgumentType = {\n /** 横线是第几条线 也代表了左侧表格的body行号 */\n index: number;\n ganttInstance: Gantt;\n};\n\nexport type TaskCreationCustomLayoutArgumentType = {\n width: number;\n height: number;\n // index: number;\n ganttInstance: Gantt;\n};\nexport type ITaskCreationCustomLayoutObj = {\n rootContainer: Group;\n};\nexport type ITaskCreationCustomLayout = (args: TaskCreationCustomLayoutArgumentType) => ITaskCreationCustomLayoutObj;\n\nexport type ITaskLink = {\n /** 依赖的类型 */\n type: DependencyType;\n /** 依赖线的起始任务唯一标识。如果是tree树形结构的数据 设置数组的话 查找性能会更高 */\n linkedFromTaskKey?: string | number | (string | number)[];\n /** 依赖的终止目标任务唯一标识。如果是tree树形结构的数据 设置数组的话 查找性能会更高 */\n linkedToTaskKey?: string | number | (string | number)[];\n /** 依赖线的样式 */\n linkLineStyle?: ILineStyle;\n};\n\nexport type ITaskLinkSelectedStyle = ILineStyle & {\n shadowBlur?: number; //阴影宽度\n shadowOffset?: number; //偏移\n shadowColor?: string; //阴影颜色\n};\nexport enum DependencyType {\n FinishToStart = 'finish_to_start',\n StartToStart = 'start_to_start',\n FinishToFinish = 'finish_to_finish',\n StartToFinish = 'start_to_finish'\n}\nexport enum TasksShowMode {\n /** 每一个任务节点用单独一行来展示,父任务占用一行,子任务分别占用一行。这是默认的显示效果 */\n Tasks_Separate = 'tasks_separate',\n /** 省去父任务节点不展示,并把所有子任务的节点都放到同一行来展示。 */\n Sub_Tasks_Inline = 'sub_tasks_inline',\n /** 省去父任务节点不展示,且所有子任务的节点分别用一行展示。*/\n Sub_Tasks_Separate = 'sub_tasks_separate',\n /** 省去父任务节点不展示,且所有子任务会维持records中的数据顺序布局,并保证节点不重叠展示 */\n Sub_Tasks_Arrange = 'sub_tasks_arrange',\n /** 省去父任务节点不展示,且所有子任务会按照日期早晚的属性来布局,并保证节点不重叠的紧凑型展示 */\n Sub_Tasks_Compact = 'sub_tasks_compact',\n /** 数据标记为project的节点,会把所有子任务的节点都放到和主任务的同一行来展示。其他节点则保持默认的显示效果即Tasks_Separate */\n Project_Sub_Tasks_Inline = 'project_sub_tasks_inline'\n}\n/**\n * 任务类型枚举,用于区分不同类型的任务\n */\nexport enum TaskType {\n TASK = 'task', // record没有指明type的 会默认使用TASK\n PROJECT = 'project',\n MILESTONE = 'milestone'\n}\nexport type ITaskBarSelectedStyle = {\n shadowBlur?: number; //阴影宽度\n shadowOffsetX?: number; //x方向偏移\n shadowOffsetY?: number; //Y方向偏移\n shadowColor?: string; //阴影颜色\n borderColor?: string; //边框颜色\n borderLineWidth?: number;\n};\nexport type ITaskBarHoverStyle = {\n /** 任务条的圆角 */\n cornerRadius?: number;\n barOverlayColor?: string;\n};\n//#endregion\n\nexport type IMarkLineCreateOptions = {\n markLineCreatable: boolean;\n markLineCreationHoverToolTip?: {\n position?: 'top' | 'bottom';\n tipContent?: string;\n style?: {\n contentStyle?: any;\n panelStyle?: any;\n };\n };\n markLineCreationStyle?: {\n fill?: string;\n size?: number;\n iconSize?: number;\n svg?: string;\n };\n};\n"]}
|
package/es/ts-types/index.d.ts
CHANGED
package/es/ts-types/index.js
CHANGED
package/es/ts-types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ts-types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC","file":"index.js","sourcesContent":["export * from './common';\nexport * from './gantt-engine';\nexport * from './EVENT_TYPE';\nexport * from './events';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ts-types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC","file":"index.js","sourcesContent":["export * from './common';\nexport * from './gantt-engine';\nexport * from './EVENT_TYPE';\nexport * from './events';\nexport * from './zoom-scale';\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ITimelineScale } from './gantt-engine';
|
|
2
|
+
export interface IDataZoomAxisConfig {
|
|
3
|
+
enabled?: boolean;
|
|
4
|
+
containerId?: string;
|
|
5
|
+
width?: number;
|
|
6
|
+
height?: number;
|
|
7
|
+
x?: number;
|
|
8
|
+
y?: number;
|
|
9
|
+
delayTime?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface IZoomScale {
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
dataZoomAxis?: IDataZoomAxisConfig;
|
|
14
|
+
minMillisecondsPerPixel?: number;
|
|
15
|
+
maxMillisecondsPerPixel?: number;
|
|
16
|
+
step?: number;
|
|
17
|
+
levels: ITimelineScale[][];
|
|
18
|
+
}
|
|
19
|
+
export interface ILevelThreshold {
|
|
20
|
+
levelIndex: number;
|
|
21
|
+
minMillisecondsPerPixel: number;
|
|
22
|
+
maxMillisecondsPerPixel: number;
|
|
23
|
+
minUnit: string;
|
|
24
|
+
minUnitMs: number;
|
|
25
|
+
}
|
|
26
|
+
export interface IZoomEventArgs {
|
|
27
|
+
oldWidth: number;
|
|
28
|
+
newWidth: number;
|
|
29
|
+
scale: number;
|
|
30
|
+
oldMillisecondsPerPixel?: number;
|
|
31
|
+
newMillisecondsPerPixel?: number;
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ts-types/zoom-scale.ts"],"names":[],"mappings":"","file":"zoom-scale.js","sourcesContent":["import type { ITimelineScale } from './gantt-engine';\n\n/**\n * DataZoomAxis 配置接口\n */\nexport interface IDataZoomAxisConfig {\n /** 是否启用 DataZoomAxis */\n enabled?: boolean;\n /** DataZoomAxis 容器 ID(可选,如果不提供会自动从 Gantt 实例获取) */\n containerId?: string;\n /** DataZoomAxis 宽度(默认自动使用 Gantt 时间轴区域宽度,即容器宽度减去左侧表头宽度) */\n width?: number;\n /** DataZoomAxis 高度 */\n height?: number;\n /** X 坐标(相对于容器左侧,默认排除左侧表头宽度,与时间轴内容区域对齐) */\n x?: number;\n /** Y 坐标(相对于容器底边界的偏移,正值向下,默认 0) */\n y?: number;\n /** 事件触发延迟时间 */\n delayTime?: number;\n}\n\n/**\n * ZoomScale 配置接口\n * 用于定义多级别的时间轴缩放系统\n */\nexport interface IZoomScale {\n /** 是否启用 ZoomScale 功能 */\n enabled?: boolean;\n\n /** DataZoomAxis 集成配置 */\n dataZoomAxis?: IDataZoomAxisConfig;\n\n /** 最小 millisecondsPerPixel 值(毫秒/像素) */\n minMillisecondsPerPixel?: number;\n\n /** 最大 millisecondsPerPixel 值(毫秒/像素) */\n maxMillisecondsPerPixel?: number;\n\n /** 缩放步长:控制缩放的精细程度,现由系统自动计算 */\n step?: number;\n\n /**\n * 级别定义:二维数组,每个级别是完整的 scales 组合\n */\n levels: ITimelineScale[][];\n}\n\n/**\n * 级别阈值信息\n * 用于级别选择算法\n */\nexport interface ILevelThreshold {\n /** 级别索引 */\n levelIndex: number;\n\n /** 该级别可用的最小 millisecondsPerPixel 值 */\n minMillisecondsPerPixel: number;\n\n /** 该级别可用的最大 millisecondsPerPixel 值 */\n maxMillisecondsPerPixel: number;\n\n /** 最小时间单位描述 */\n minUnit: string;\n\n /** 最小时间单位的毫秒数 */\n minUnitMs: number;\n}\n\n/**\n * 缩放事件参数接口\n * 当 Gantt 发生缩放时触发的事件数据\n */\nexport interface IZoomEventArgs {\n /** 缩放前的列宽 */\n oldWidth: number;\n /** 缩放后的列宽 */\n newWidth: number;\n /** 缩放比例 (newWidth / oldWidth) */\n scale: number;\n /** 缩放前的millisecondsPerPixel */\n oldMillisecondsPerPixel?: number;\n /** 缩放后的millisecondsPerPixel */\n newMillisecondsPerPixel?: number;\n}\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Gantt } from '../Gantt';
|
|
2
|
+
export interface DataZoomConfig {
|
|
3
|
+
containerId?: string;
|
|
4
|
+
start?: number;
|
|
5
|
+
end?: number;
|
|
6
|
+
width?: number;
|
|
7
|
+
height?: number;
|
|
8
|
+
x?: number;
|
|
9
|
+
y?: number;
|
|
10
|
+
delayTime?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface DataZoomLimits {
|
|
13
|
+
minRangeRatio: number;
|
|
14
|
+
maxRangeRatio: number;
|
|
15
|
+
minMillisecondsPerPixel: number;
|
|
16
|
+
maxMillisecondsPerPixel: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class DataZoomIntegration {
|
|
19
|
+
private gantt;
|
|
20
|
+
private dataZoomAxis;
|
|
21
|
+
private stage;
|
|
22
|
+
private canvas;
|
|
23
|
+
private isUpdatingFromDataZoom;
|
|
24
|
+
private isUpdatingFromGantt;
|
|
25
|
+
private lastDataZoomState;
|
|
26
|
+
private cleanupCallbacks;
|
|
27
|
+
private resizeTimeout;
|
|
28
|
+
private isInitializing;
|
|
29
|
+
constructor(gantt: Gantt, config: DataZoomConfig);
|
|
30
|
+
private getContainerId;
|
|
31
|
+
private initializeDataZoom;
|
|
32
|
+
private setupEventListeners;
|
|
33
|
+
private calculateDataZoomLimits;
|
|
34
|
+
private updateDataZoomLimits;
|
|
35
|
+
private getGanttViewBoundaries;
|
|
36
|
+
private applyDataZoomRangeToGantt;
|
|
37
|
+
private syncInitialPosition;
|
|
38
|
+
syncToGantt(): void;
|
|
39
|
+
syncToDataZoom(): void;
|
|
40
|
+
private syncToGanttWithState;
|
|
41
|
+
setRange(start: number, end: number): void;
|
|
42
|
+
getRange(): {
|
|
43
|
+
start: number;
|
|
44
|
+
end: number;
|
|
45
|
+
};
|
|
46
|
+
resize(width?: number, height?: number): void;
|
|
47
|
+
updateResponsive(): void;
|
|
48
|
+
updatePosition(x?: number, y?: number): void;
|
|
49
|
+
destroy(): void;
|
|
50
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { DataZoom, createStage } from "@visactor/vtable/es/vrender";
|
|
2
|
+
|
|
3
|
+
export class DataZoomIntegration {
|
|
4
|
+
constructor(gantt, config) {
|
|
5
|
+
this.isUpdatingFromDataZoom = !1, this.isUpdatingFromGantt = !1, this.lastDataZoomState = {
|
|
6
|
+
start: .2,
|
|
7
|
+
end: .5
|
|
8
|
+
}, this.cleanupCallbacks = [], this.resizeTimeout = null, this.isInitializing = !0,
|
|
9
|
+
this.gantt = gantt, this.initializeDataZoom(config), this.setupEventListeners(),
|
|
10
|
+
this.updateDataZoomLimits();
|
|
11
|
+
}
|
|
12
|
+
getContainerId(providedId) {
|
|
13
|
+
if (providedId) return providedId;
|
|
14
|
+
const ganttContainer = this.gantt.container;
|
|
15
|
+
if (null == ganttContainer ? void 0 : ganttContainer.id) return ganttContainer.id;
|
|
16
|
+
const ganttElements = document.querySelectorAll('[id*="gantt"], [id*="table"], [class*="gantt"], [class*="vtable"]');
|
|
17
|
+
if (ganttElements.length > 0) {
|
|
18
|
+
const element = ganttElements[0];
|
|
19
|
+
if (element.id) return element.id;
|
|
20
|
+
}
|
|
21
|
+
return "vTable";
|
|
22
|
+
}
|
|
23
|
+
initializeDataZoom(config) {
|
|
24
|
+
var _a, _b;
|
|
25
|
+
const containerId = this.getContainerId(config.containerId);
|
|
26
|
+
if (!document.getElementById(containerId)) throw new Error(`DataZoom container with ID "${containerId}" not found`);
|
|
27
|
+
const ganttContainer = this.gantt.container;
|
|
28
|
+
if (!ganttContainer) throw new Error("Gantt container not found");
|
|
29
|
+
const taskTableWidth = this.gantt.taskTableWidth || 0, defaultWidth = (ganttContainer.offsetWidth || 1e3) - taskTableWidth, defaultX = this.gantt.taskTableWidth || 0, {start: start = .2, end: end = .5, width: width = defaultWidth, height: height = 30, x: x = defaultX, y: y = 0, delayTime: delayTime = 10} = config;
|
|
30
|
+
"static" === window.getComputedStyle(ganttContainer).position && (ganttContainer.style.position = "relative");
|
|
31
|
+
const dataZoomWrapper = document.createElement("div");
|
|
32
|
+
dataZoomWrapper.id = "dataZoomWrapper", dataZoomWrapper.style.cssText = `\n width: 100%;\n height: ${height}px;\n position: absolute;\n bottom: ${y}px;\n left: 0px;\n background: transparent;\n overflow: visible;\n pointer-events: none;\n z-index: 1000;\n `,
|
|
33
|
+
this.canvas = document.createElement("canvas"), this.canvas.id = "dataZoomCanvas",
|
|
34
|
+
this.canvas.width = width, this.canvas.height = height, this.canvas.style.cssText = `\n width: ${width}px;\n height: ${height}px;\n position: absolute;\n top: 0px;\n left: ${x}px;\n pointer-events: auto;\n `,
|
|
35
|
+
dataZoomWrapper.appendChild(this.canvas), ganttContainer.appendChild(dataZoomWrapper),
|
|
36
|
+
this.stage = createStage({
|
|
37
|
+
canvas: this.canvas,
|
|
38
|
+
width: width,
|
|
39
|
+
height: height,
|
|
40
|
+
autoRender: !0
|
|
41
|
+
}), this.dataZoomAxis = new DataZoom({
|
|
42
|
+
start: start,
|
|
43
|
+
end: end,
|
|
44
|
+
position: {
|
|
45
|
+
x: 0,
|
|
46
|
+
y: 0
|
|
47
|
+
},
|
|
48
|
+
size: {
|
|
49
|
+
width: width,
|
|
50
|
+
height: height - 1
|
|
51
|
+
},
|
|
52
|
+
showDetail: !1,
|
|
53
|
+
delayTime: delayTime,
|
|
54
|
+
brushSelect: !1,
|
|
55
|
+
backgroundChartStyle: {
|
|
56
|
+
line: {
|
|
57
|
+
visible: !0,
|
|
58
|
+
stroke: "#ddd"
|
|
59
|
+
},
|
|
60
|
+
area: {
|
|
61
|
+
visible: !0,
|
|
62
|
+
fill: "#f5f5f5"
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
startHandlerStyle: {
|
|
66
|
+
symbolType: "M-0.5-2.4h0.9c0.4,0,0.7,0.3,0.7,0.7v3.3c0,0.4-0.3,0.7-0.7,0.7h-0.9c-0.4,0-0.7-0.3-0.7-0.7v-3.3\nC-1.2-2-0.9-2.4-0.5-2.4z M-0.4-1.4L-0.4-1.4c0,0,0,0.1,0,0.1v2.6c0,0.1,0,0.1,0,0.1l0,0c0,0,0-0.1,0-0.1v-2.6\nC-0.4-1.4-0.4-1.4-0.4-1.4z M0.3-1.4L0.3-1.4c0,0,0,0.1,0,0.1v2.6c0,0.1,0,0.1,0,0.1l0,0c0,0,0-0.1,0-0.1v-2.6\nC0.3-1.4,0.3-1.4,0.3-1.4z;",
|
|
67
|
+
fill: "#fff",
|
|
68
|
+
size: null !== (_a = config.width) && void 0 !== _a ? _a : 30,
|
|
69
|
+
stroke: "#c2c8cf",
|
|
70
|
+
lineWidth: 1
|
|
71
|
+
},
|
|
72
|
+
endHandlerStyle: {
|
|
73
|
+
symbolType: "M-0.5-2.4h0.9c0.4,0,0.7,0.3,0.7,0.7v3.3c0,0.4-0.3,0.7-0.7,0.7h-0.9c-0.4,0-0.7-0.3-0.7-0.7v-3.3\nC-1.2-2-0.9-2.4-0.5-2.4z M-0.4-1.4L-0.4-1.4c0,0,0,0.1,0,0.1v2.6c0,0.1,0,0.1,0,0.1l0,0c0,0,0-0.1,0-0.1v-2.6\nC-0.4-1.4-0.4-1.4-0.4-1.4z M0.3-1.4L0.3-1.4c0,0,0,0.1,0,0.1v2.6c0,0.1,0,0.1,0,0.1l0,0c0,0,0-0.1,0-0.1v-2.6\nC0.3-1.4,0.3-1.4,0.3-1.4z;",
|
|
74
|
+
fill: "#fff",
|
|
75
|
+
size: null !== (_b = config.width) && void 0 !== _b ? _b : 30,
|
|
76
|
+
stroke: "#c2c8cf",
|
|
77
|
+
lineWidth: 1
|
|
78
|
+
},
|
|
79
|
+
middleHandlerStyle: {
|
|
80
|
+
visible: !1
|
|
81
|
+
}
|
|
82
|
+
}), this.stage.defaultLayer.add(this.dataZoomAxis), requestAnimationFrame((() => {
|
|
83
|
+
if (this.isInitializing) {
|
|
84
|
+
const boundaries = this.getGanttViewBoundaries();
|
|
85
|
+
this.dataZoomAxis.setStartAndEnd(boundaries.startRatio, boundaries.endRatio), this.isInitializing = !1;
|
|
86
|
+
}
|
|
87
|
+
this.stage.render();
|
|
88
|
+
})), this.lastDataZoomState = {
|
|
89
|
+
start: start,
|
|
90
|
+
end: end
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
setupEventListeners() {
|
|
94
|
+
const dataZoomChangeHandler = event => {
|
|
95
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
96
|
+
if (this.isUpdatingFromGantt) return;
|
|
97
|
+
this.isUpdatingFromDataZoom = !0;
|
|
98
|
+
let start = null !== (_c = null !== (_a = event.start) && void 0 !== _a ? _a : null === (_b = event.detail) || void 0 === _b ? void 0 : _b.start) && void 0 !== _c ? _c : null === (_e = null === (_d = event.currentTarget) || void 0 === _d ? void 0 : _d.attribute) || void 0 === _e ? void 0 : _e.start, end = null !== (_h = null !== (_f = event.end) && void 0 !== _f ? _f : null === (_g = event.detail) || void 0 === _g ? void 0 : _g.end) && void 0 !== _h ? _h : null === (_k = null === (_j = event.currentTarget) || void 0 === _j ? void 0 : _j.attribute) || void 0 === _k ? void 0 : _k.end;
|
|
99
|
+
void 0 !== start && void 0 !== end || (start = this.dataZoomAxis.attribute.start,
|
|
100
|
+
end = this.dataZoomAxis.attribute.end), void 0 === start || void 0 === end || isNaN(start) || isNaN(end) || this.applyDataZoomRangeToGantt(start, end),
|
|
101
|
+
setTimeout((() => {
|
|
102
|
+
this.isUpdatingFromDataZoom = !1;
|
|
103
|
+
}), 50);
|
|
104
|
+
};
|
|
105
|
+
this.dataZoomAxis.addEventListener("change", dataZoomChangeHandler), this.cleanupCallbacks.push((() => {
|
|
106
|
+
this.dataZoomAxis.removeEventListener("change", dataZoomChangeHandler);
|
|
107
|
+
}));
|
|
108
|
+
const ganttScrollHandler = event => {
|
|
109
|
+
if (this.isUpdatingFromDataZoom) return;
|
|
110
|
+
if ("horizontal" !== event.scrollDirection) return;
|
|
111
|
+
this.isUpdatingFromGantt = !0;
|
|
112
|
+
const boundaries = this.getGanttViewBoundaries();
|
|
113
|
+
this.dataZoomAxis.setStartAndEnd(boundaries.startRatio, boundaries.endRatio), this.stage.render(),
|
|
114
|
+
setTimeout((() => {
|
|
115
|
+
this.dataZoomAxis.setAttribute("disableTriggerEvent", !1), this.isUpdatingFromGantt = !1;
|
|
116
|
+
}), 10);
|
|
117
|
+
};
|
|
118
|
+
this.gantt.addEventListener("scroll", ganttScrollHandler), this.cleanupCallbacks.push((() => {
|
|
119
|
+
this.gantt.removeEventListener("scroll", ganttScrollHandler);
|
|
120
|
+
}));
|
|
121
|
+
const windowResizeHandler = () => {
|
|
122
|
+
clearTimeout(this.resizeTimeout), this.resizeTimeout = setTimeout((() => {
|
|
123
|
+
this.updateResponsive(), this.updateDataZoomLimits();
|
|
124
|
+
}), 50);
|
|
125
|
+
};
|
|
126
|
+
window.addEventListener("resize", windowResizeHandler), this.cleanupCallbacks.push((() => {
|
|
127
|
+
window.removeEventListener("resize", windowResizeHandler), this.resizeTimeout && clearTimeout(this.resizeTimeout);
|
|
128
|
+
}));
|
|
129
|
+
const ganttZoomHandler = () => {
|
|
130
|
+
setTimeout((() => {
|
|
131
|
+
this.updateDataZoomLimits(), this.isUpdatingFromDataZoom || this.syncToDataZoom();
|
|
132
|
+
}), 50);
|
|
133
|
+
};
|
|
134
|
+
this.gantt.addEventListener("zoom", ganttZoomHandler), this.cleanupCallbacks.push((() => {
|
|
135
|
+
this.gantt.removeEventListener("zoom", ganttZoomHandler);
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
calculateDataZoomLimits() {
|
|
139
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
140
|
+
let minMillisecondsPerPixel, maxMillisecondsPerPixel;
|
|
141
|
+
this.gantt.zoomScaleManager ? (minMillisecondsPerPixel = (null === (_b = (_a = this.gantt.zoomScaleManager).getGlobalMinMillisecondsPerPixel) || void 0 === _b ? void 0 : _b.call(_a)) || 1e3,
|
|
142
|
+
maxMillisecondsPerPixel = (null === (_d = (_c = this.gantt.zoomScaleManager).getGlobalMaxMillisecondsPerPixel) || void 0 === _d ? void 0 : _d.call(_c)) || 6e6) : (minMillisecondsPerPixel = null !== (_f = null === (_e = this.gantt.parsedOptions.zoom) || void 0 === _e ? void 0 : _e.minMillisecondsPerPixel) && void 0 !== _f ? _f : 1e3,
|
|
143
|
+
maxMillisecondsPerPixel = null !== (_h = null === (_g = this.gantt.parsedOptions.zoom) || void 0 === _g ? void 0 : _g.maxMillisecondsPerPixel) && void 0 !== _h ? _h : 6e6);
|
|
144
|
+
const viewportWidth = this.gantt.tableNoFrameWidth, totalTimeRange = this.gantt.parsedOptions._maxDateTime - this.gantt.parsedOptions._minDateTime, minViewTimeRange = minMillisecondsPerPixel * viewportWidth, minRangeRatio = Math.min(1, minViewTimeRange / totalTimeRange), maxViewTimeRange = maxMillisecondsPerPixel * viewportWidth, maxRangeRatio = Math.min(1, maxViewTimeRange / totalTimeRange);
|
|
145
|
+
return {
|
|
146
|
+
minRangeRatio: Math.min(minRangeRatio, maxRangeRatio),
|
|
147
|
+
maxRangeRatio: Math.max(minRangeRatio, maxRangeRatio),
|
|
148
|
+
minMillisecondsPerPixel: minMillisecondsPerPixel,
|
|
149
|
+
maxMillisecondsPerPixel: maxMillisecondsPerPixel
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
updateDataZoomLimits() {
|
|
153
|
+
const limits = this.calculateDataZoomLimits();
|
|
154
|
+
this.dataZoomAxis.setAttributes({
|
|
155
|
+
minSpan: limits.minRangeRatio,
|
|
156
|
+
maxSpan: limits.maxRangeRatio
|
|
157
|
+
}), this.stage.render();
|
|
158
|
+
}
|
|
159
|
+
getGanttViewBoundaries() {
|
|
160
|
+
const scrollLeft = this.gantt.stateManager.scrollLeft, totalWidth = this.gantt.getAllDateColsWidth(), viewportWidth = this.gantt.tableNoFrameWidth;
|
|
161
|
+
return {
|
|
162
|
+
scrollLeft: scrollLeft,
|
|
163
|
+
totalWidth: totalWidth,
|
|
164
|
+
viewportWidth: viewportWidth,
|
|
165
|
+
startRatio: Math.max(0, Math.min(1, scrollLeft / totalWidth)),
|
|
166
|
+
endRatio: Math.max(0, Math.min(1, (scrollLeft + viewportWidth) / totalWidth))
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
applyDataZoomRangeToGantt(start, end) {
|
|
170
|
+
if (void 0 === start || void 0 === end || isNaN(start) || isNaN(end)) return;
|
|
171
|
+
this.lastDataZoomState = {
|
|
172
|
+
start: start,
|
|
173
|
+
end: end
|
|
174
|
+
};
|
|
175
|
+
const currentViewportWidth = this.gantt.tableNoFrameWidth, currentMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel(), rangeRatio = end - start, targetMillisecondsPerPixel = (this.gantt.parsedOptions._maxDateTime - this.gantt.parsedOptions._minDateTime) * rangeRatio / currentViewportWidth;
|
|
176
|
+
if (Math.abs(targetMillisecondsPerPixel - currentMillisecondsPerPixel) > .01 * currentMillisecondsPerPixel) if (this.gantt.zoomScaleManager) {
|
|
177
|
+
const targetLevel = this.gantt.zoomScaleManager.findOptimalLevel(targetMillisecondsPerPixel);
|
|
178
|
+
targetLevel !== this.gantt.zoomScaleManager.getCurrentLevel() && this.gantt.zoomScaleManager.switchToLevel(targetLevel),
|
|
179
|
+
this.gantt.setMillisecondsPerPixel(targetMillisecondsPerPixel);
|
|
180
|
+
} else this.gantt.setMillisecondsPerPixel(targetMillisecondsPerPixel);
|
|
181
|
+
const targetScrollLeft = start * this.gantt.getAllDateColsWidth();
|
|
182
|
+
this.gantt.stateManager.setScrollLeft(targetScrollLeft);
|
|
183
|
+
}
|
|
184
|
+
syncInitialPosition() {
|
|
185
|
+
setTimeout((() => {
|
|
186
|
+
const boundaries = this.getGanttViewBoundaries();
|
|
187
|
+
(boundaries.startRatio > 0 || boundaries.endRatio < 1) && this.dataZoomAxis.setStartAndEnd(boundaries.startRatio, boundaries.endRatio);
|
|
188
|
+
}), 100);
|
|
189
|
+
}
|
|
190
|
+
syncToGantt() {
|
|
191
|
+
const start = this.dataZoomAxis.attribute.start || 0, end = this.dataZoomAxis.attribute.end || 1;
|
|
192
|
+
this.applyDataZoomRangeToGantt(start, end);
|
|
193
|
+
}
|
|
194
|
+
syncToDataZoom() {
|
|
195
|
+
const boundaries = this.getGanttViewBoundaries();
|
|
196
|
+
this.dataZoomAxis.setStartAndEnd(boundaries.startRatio, boundaries.endRatio);
|
|
197
|
+
}
|
|
198
|
+
syncToGanttWithState(start, end) {
|
|
199
|
+
this.isUpdatingFromDataZoom = !0, this.applyDataZoomRangeToGantt(start, end), setTimeout((() => {
|
|
200
|
+
this.isUpdatingFromDataZoom = !1;
|
|
201
|
+
}), 50);
|
|
202
|
+
}
|
|
203
|
+
setRange(start, end) {
|
|
204
|
+
this.dataZoomAxis.setStartAndEnd(start, end);
|
|
205
|
+
}
|
|
206
|
+
getRange() {
|
|
207
|
+
return {
|
|
208
|
+
start: this.dataZoomAxis.attribute.start || 0,
|
|
209
|
+
end: this.dataZoomAxis.attribute.end || 1
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
resize(width, height) {
|
|
213
|
+
if (void 0 === width) {
|
|
214
|
+
const ganttContainer = this.gantt.container;
|
|
215
|
+
if (ganttContainer) {
|
|
216
|
+
const taskTableWidth = this.gantt.taskTableWidth || 0;
|
|
217
|
+
width = ganttContainer.offsetWidth - taskTableWidth;
|
|
218
|
+
} else width = 1e3;
|
|
219
|
+
}
|
|
220
|
+
void 0 === height && (height = 30), this.canvas.width = width, this.canvas.height = height,
|
|
221
|
+
this.canvas.style.width = `${width}px`, this.canvas.style.height = `${height}px`,
|
|
222
|
+
this.stage.resize(width, height), this.dataZoomAxis.setAttributes({
|
|
223
|
+
size: {
|
|
224
|
+
width: width,
|
|
225
|
+
height: height - 1
|
|
226
|
+
}
|
|
227
|
+
}), this.stage.render();
|
|
228
|
+
}
|
|
229
|
+
updateResponsive() {
|
|
230
|
+
const ganttContainer = this.gantt.container;
|
|
231
|
+
if (!ganttContainer) return;
|
|
232
|
+
const taskTableWidth = this.gantt.taskTableWidth || 0, newWidth = ganttContainer.offsetWidth - taskTableWidth;
|
|
233
|
+
this.resize(newWidth);
|
|
234
|
+
const defaultX = this.gantt.taskTableWidth || 0;
|
|
235
|
+
this.updatePosition(defaultX, 0), setTimeout((() => {
|
|
236
|
+
this.syncToDataZoom();
|
|
237
|
+
}), 10);
|
|
238
|
+
}
|
|
239
|
+
updatePosition(x, y) {
|
|
240
|
+
var _a;
|
|
241
|
+
const xPos = null !== (_a = null != x ? x : this.gantt.taskTableWidth) && void 0 !== _a ? _a : 0;
|
|
242
|
+
this.canvas.style.left = `${xPos}px`;
|
|
243
|
+
}
|
|
244
|
+
destroy() {
|
|
245
|
+
if (this.cleanupCallbacks.forEach((cleanup => cleanup())), this.cleanupCallbacks = [],
|
|
246
|
+
this.canvas && this.canvas.parentNode) {
|
|
247
|
+
const wrapper = this.canvas.parentNode;
|
|
248
|
+
wrapper && "dataZoomWrapper" === wrapper.id && wrapper.parentNode ? wrapper.parentNode.removeChild(wrapper) : wrapper.removeChild(this.canvas);
|
|
249
|
+
}
|
|
250
|
+
this.stage && this.stage.release();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=DataZoomIntegration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/zoom-scale/DataZoomIntegration.ts"],"names":[],"mappings":"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","file":"DataZoomIntegration.js","sourcesContent":["import type { Gantt } from '../Gantt';\nimport { DataZoom, createStage } from '@visactor/vtable/es/vrender';\n\nexport interface DataZoomConfig {\n /** DataZoom 容器 ID(可选,如果不提供会自动从 Gantt 实例获取) */\n containerId?: string;\n /** DataZoom 初始开始位置 (0-1) */\n start?: number;\n /** DataZoom 初始结束位置 (0-1) */\n end?: number;\n /** DataZoom 宽度 */\n width?: number;\n /** DataZoom 高度 */\n height?: number;\n /** X 坐标 */\n x?: number;\n /** Y 坐标 */\n y?: number;\n /** 事件触发延迟时间 */\n delayTime?: number;\n}\n\nexport interface DataZoomLimits {\n minRangeRatio: number;\n maxRangeRatio: number;\n minMillisecondsPerPixel: number;\n maxMillisecondsPerPixel: number;\n}\n\n/**\n * DataZoom 与 Gantt 集成管理器\n * 负责 DataZoom 组件与 Gantt 图表的双向同步\n */\nexport class DataZoomIntegration {\n private gantt: Gantt;\n private dataZoomAxis: DataZoom;\n private stage: any;\n private canvas: HTMLCanvasElement;\n private isUpdatingFromDataZoom = false;\n private isUpdatingFromGantt = false;\n private lastDataZoomState = { start: 0.2, end: 0.5 };\n private cleanupCallbacks: (() => void)[] = [];\n private resizeTimeout: NodeJS.Timeout | null = null;\n private isInitializing = true;\n\n constructor(gantt: Gantt, config: DataZoomConfig) {\n this.gantt = gantt;\n this.initializeDataZoom(config);\n this.setupEventListeners();\n this.updateDataZoomLimits();\n }\n\n /**\n * 获取容器 ID\n */\n private getContainerId(providedId?: string): string {\n if (providedId) {\n return providedId;\n }\n\n // 尝试从 Gantt 实例获取容器 ID\n const ganttContainer = (this.gantt as any).container;\n if (ganttContainer?.id) {\n return ganttContainer.id;\n }\n\n const ganttElements = document.querySelectorAll(\n '[id*=\"gantt\"], [id*=\"table\"], [class*=\"gantt\"], [class*=\"vtable\"]'\n );\n if (ganttElements.length > 0) {\n const element = ganttElements[0] as HTMLElement;\n if (element.id) {\n return element.id;\n }\n }\n\n // 生成默认 ID\n return 'vTable';\n }\n\n /**\n * 初始化 DataZoom 组件\n */\n private initializeDataZoom(config: DataZoomConfig): void {\n // 自动获取容器 ID\n const containerId = this.getContainerId(config.containerId);\n const container = document.getElementById(containerId);\n if (!container) {\n throw new Error(`DataZoom container with ID \"${containerId}\" not found`);\n }\n\n // 获取甘特图容器(VTable 容器)\n const ganttContainer = this.gantt.container as HTMLElement;\n if (!ganttContainer) {\n throw new Error('Gantt container not found');\n }\n\n // 计算 DataZoom 的默认宽度:甘特图容器宽度减去左侧表头宽度\n const taskTableWidth = this.gantt.taskTableWidth || 0;\n const ganttContainerWidth = ganttContainer.offsetWidth || 1000;\n const defaultWidth = ganttContainerWidth - taskTableWidth;\n\n // 计算默认 x 坐标,排除左侧表头宽度\n const defaultX = this.gantt.taskTableWidth || 0;\n\n const {\n start = 0.2,\n end = 0.5,\n width = defaultWidth, // 默认使用容器宽度\n height = 30,\n x = defaultX, // 默认排除左侧表头宽度,与时间轴内容区域对齐\n y = 0, // 默认贴着容器底部\n delayTime = 10\n } = config;\n\n // 确保 VTable 容器有相对定位\n const containerStyle = window.getComputedStyle(ganttContainer);\n if (containerStyle.position === 'static') {\n ganttContainer.style.position = 'relative';\n }\n\n const dataZoomWrapper = document.createElement('div');\n dataZoomWrapper.id = 'dataZoomWrapper';\n dataZoomWrapper.style.cssText = `\n width: 100%;\n height: ${height}px;\n position: absolute;\n bottom: ${y}px;\n left: 0px;\n background: transparent;\n overflow: visible;\n pointer-events: none;\n z-index: 1000;\n `;\n\n // 创建独立的 Canvas 和 Stage\n this.canvas = document.createElement('canvas');\n this.canvas.id = 'dataZoomCanvas';\n this.canvas.width = width;\n this.canvas.height = height;\n\n this.canvas.style.cssText = `\n width: ${width}px;\n height: ${height}px;\n position: absolute;\n top: 0px;\n left: ${x}px;\n pointer-events: auto;\n `;\n\n // 将 Canvas 添加到包装器,再将包装器添加到 VTable 容器\n dataZoomWrapper.appendChild(this.canvas);\n ganttContainer.appendChild(dataZoomWrapper);\n\n this.stage = createStage({\n canvas: this.canvas,\n width,\n height,\n autoRender: true\n });\n\n // 创建 DataZoom 实例\n this.dataZoomAxis = new DataZoom({\n start,\n end,\n position: { x: 0, y: 0 },\n size: { width, height: height - 1 },\n showDetail: false,\n delayTime,\n brushSelect: false,\n backgroundChartStyle: {\n line: { visible: true, stroke: '#ddd' },\n area: { visible: true, fill: '#f5f5f5' }\n },\n startHandlerStyle: {\n symbolType:\n 'M-0.5-2.4h0.9c0.4,0,0.7,0.3,0.7,0.7v3.3c0,0.4-0.3,0.7-0.7,0.7h-0.9c-0.4,0-0.7-0.3-0.7-0.7v-3.3\\n' +\n 'C-1.2-2-0.9-2.4-0.5-2.4z M-0.4-1.4L-0.4-1.4c0,0,0,0.1,0,0.1v2.6c0,0.1,0,0.1,0,0.1l0,0c0,0,0-0.1,0-0.1' +\n 'v-2.6\\nC-0.4-1.4-0.4-1.4-0.4-1.4z M0.3-1.4L0.3-1.4c0,0,0,0.1,0,0.1v2.6c0,0.1,0,0.1,0,0.1l0,0c0,0,' +\n '0-0.1,0-0.1v-2.6\\nC0.3-1.4,0.3-1.4,0.3-1.4z;',\n fill: '#fff',\n size: config.width ?? 30,\n stroke: '#c2c8cf',\n lineWidth: 1\n },\n endHandlerStyle: {\n symbolType:\n 'M-0.5-2.4h0.9c0.4,0,0.7,0.3,0.7,0.7v3.3c0,0.4-0.3,0.7-0.7,0.7h-0.9c-0.4,0-0.7-0.3-0.7-0.7v-3.3\\n' +\n 'C-1.2-2-0.9-2.4-0.5-2.4z M-0.4-1.4L-0.4-1.4c0,0,0,0.1,0,0.1v2.6c0,0.1,0,0.1,0,0.1l0,0c0,0,0-0.1,0-0.1' +\n 'v-2.6\\nC-0.4-1.4-0.4-1.4-0.4-1.4z M0.3-1.4L0.3-1.4c0,0,0,0.1,0,0.1v2.6c0,0.1,0,0.1,0,0.1l0,0c0,0,' +\n '0-0.1,0-0.1v-2.6\\nC0.3-1.4,0.3-1.4,0.3-1.4z;',\n fill: '#fff',\n size: config.width ?? 30,\n stroke: '#c2c8cf',\n lineWidth: 1\n },\n middleHandlerStyle: {\n visible: false\n }\n });\n\n this.stage.defaultLayer.add(this.dataZoomAxis as any);\n\n requestAnimationFrame(() => {\n if (this.isInitializing) {\n const boundaries = this.getGanttViewBoundaries();\n this.dataZoomAxis.setStartAndEnd(boundaries.startRatio, boundaries.endRatio);\n this.isInitializing = false;\n }\n this.stage.render();\n });\n\n this.lastDataZoomState = { start, end };\n }\n\n /**\n * 设置事件监听器\n */\n private setupEventListeners(): void {\n // DataZoom 变化时同步到 Gantt\n const dataZoomChangeHandler = (event: any) => {\n if (this.isUpdatingFromGantt) {\n return;\n }\n\n this.isUpdatingFromDataZoom = true;\n\n let start = event.start ?? event.detail?.start ?? event.currentTarget?.attribute?.start;\n let end = event.end ?? event.detail?.end ?? event.currentTarget?.attribute?.end;\n\n if (start === undefined || end === undefined) {\n start = this.dataZoomAxis.attribute.start;\n end = this.dataZoomAxis.attribute.end;\n }\n\n if (start !== undefined && end !== undefined && !isNaN(start) && !isNaN(end)) {\n this.applyDataZoomRangeToGantt(start, end);\n }\n\n setTimeout(() => {\n this.isUpdatingFromDataZoom = false;\n }, 50);\n };\n\n this.dataZoomAxis.addEventListener('change', dataZoomChangeHandler);\n this.cleanupCallbacks.push(() => {\n this.dataZoomAxis.removeEventListener('change', dataZoomChangeHandler);\n });\n\n // Gantt 滚动时同步到 DataZoom\n const ganttScrollHandler = (event: any) => {\n if (this.isUpdatingFromDataZoom) {\n return;\n }\n if (event.scrollDirection !== 'horizontal') {\n return;\n }\n\n this.isUpdatingFromGantt = true;\n const boundaries = this.getGanttViewBoundaries();\n this.dataZoomAxis.setStartAndEnd(boundaries.startRatio, boundaries.endRatio);\n\n this.stage.render();\n\n setTimeout(() => {\n this.dataZoomAxis.setAttribute('disableTriggerEvent', false);\n this.isUpdatingFromGantt = false;\n }, 10);\n };\n\n this.gantt.addEventListener('scroll', ganttScrollHandler);\n this.cleanupCallbacks.push(() => {\n this.gantt.removeEventListener('scroll', ganttScrollHandler);\n });\n\n // 窗口大小变化时的响应式更新\n const windowResizeHandler = () => {\n clearTimeout(this.resizeTimeout);\n this.resizeTimeout = setTimeout(() => {\n this.updateResponsive();\n this.updateDataZoomLimits();\n }, 50);\n };\n\n window.addEventListener('resize', windowResizeHandler);\n this.cleanupCallbacks.push(() => {\n window.removeEventListener('resize', windowResizeHandler);\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n });\n\n // 监听 Gantt 的缩放事件,重新计算限制并同步 DataZoom 位置\n const ganttZoomHandler = () => {\n setTimeout(() => {\n this.updateDataZoomLimits();\n // 同步 DataZoom 位置到当前 Gantt 视图\n if (!this.isUpdatingFromDataZoom) {\n this.syncToDataZoom();\n }\n }, 50);\n };\n\n this.gantt.addEventListener('zoom', ganttZoomHandler);\n this.cleanupCallbacks.push(() => {\n this.gantt.removeEventListener('zoom', ganttZoomHandler);\n });\n }\n\n /**\n * 计算 DataZoom 的合理范围限制\n */\n private calculateDataZoomLimits(): DataZoomLimits {\n // 获取 Gantt 的缩放限制\n let minMillisecondsPerPixel: number;\n let maxMillisecondsPerPixel: number;\n\n if (this.gantt.zoomScaleManager) {\n minMillisecondsPerPixel = this.gantt.zoomScaleManager.getGlobalMinMillisecondsPerPixel?.() || 1000;\n maxMillisecondsPerPixel = this.gantt.zoomScaleManager.getGlobalMaxMillisecondsPerPixel?.() || 6000000;\n } else {\n minMillisecondsPerPixel = this.gantt.parsedOptions.zoom?.minMillisecondsPerPixel ?? 1000;\n maxMillisecondsPerPixel = this.gantt.parsedOptions.zoom?.maxMillisecondsPerPixel ?? 6000000;\n }\n\n // 获取关键参数\n const viewportWidth = this.gantt.tableNoFrameWidth; // 视口宽度(像素)\n const totalTimeRange = this.gantt.parsedOptions._maxDateTime - this.gantt.parsedOptions._minDateTime; // 总时间范围\n\n // 计算 minSpan:当使用 minMillisecondsPerPixel 时,视口能显示的时间范围占总时间的比例\n const minViewTimeRange = minMillisecondsPerPixel * viewportWidth; // 最小缩放时视口显示的时间范围\n const minRangeRatio = Math.min(1.0, minViewTimeRange / totalTimeRange);\n\n // 计算 maxSpan:当使用 maxMillisecondsPerPixel 时,视口能显示的时间范围占总时间的比例\n const maxViewTimeRange = maxMillisecondsPerPixel * viewportWidth; // 最大缩放时视口显示的时间范围\n const maxRangeRatio = Math.min(1.0, maxViewTimeRange / totalTimeRange);\n\n // 确保逻辑正确:minSpan < maxSpan\n const finalMinRangeRatio = Math.min(minRangeRatio, maxRangeRatio);\n const finalMaxRangeRatio = Math.max(minRangeRatio, maxRangeRatio);\n\n return {\n minRangeRatio: finalMinRangeRatio,\n maxRangeRatio: finalMaxRangeRatio,\n minMillisecondsPerPixel,\n maxMillisecondsPerPixel\n };\n }\n\n /**\n * 更新 DataZoom 的范围限制\n */\n private updateDataZoomLimits(): void {\n const limits = this.calculateDataZoomLimits();\n\n this.dataZoomAxis.setAttributes({\n minSpan: limits.minRangeRatio,\n maxSpan: limits.maxRangeRatio\n });\n\n this.stage.render();\n }\n\n /**\n * 获取 Gantt 视图边界信息\n */\n private getGanttViewBoundaries() {\n const scrollLeft = this.gantt.stateManager.scrollLeft;\n const totalWidth = this.gantt.getAllDateColsWidth();\n const viewportWidth = this.gantt.tableNoFrameWidth;\n\n const startRatio = Math.max(0, Math.min(1, scrollLeft / totalWidth));\n const endRatio = Math.max(0, Math.min(1, (scrollLeft + viewportWidth) / totalWidth));\n\n return {\n scrollLeft,\n totalWidth,\n viewportWidth,\n startRatio,\n endRatio\n };\n }\n\n /**\n * 将 DataZoom 范围应用到 Gantt 视图\n */\n private applyDataZoomRangeToGantt(start: number, end: number): void {\n if (start === undefined || end === undefined || isNaN(start) || isNaN(end)) {\n return;\n }\n\n // 更新状态记录\n this.lastDataZoomState = { start, end };\n\n // 获取当前 Gantt 的基础信息\n const currentViewportWidth = this.gantt.tableNoFrameWidth;\n const currentMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel();\n const rangeRatio = end - start;\n\n // 根据 DataZoom 范围计算目标 millisecondsPerPixel\n const totalTimeRange = this.gantt.parsedOptions._maxDateTime - this.gantt.parsedOptions._minDateTime;\n const selectedTimeRange = totalTimeRange * rangeRatio;\n const targetMillisecondsPerPixel = selectedTimeRange / currentViewportWidth;\n\n // 应用新的 millisecondsPerPixel\n if (Math.abs(targetMillisecondsPerPixel - currentMillisecondsPerPixel) > currentMillisecondsPerPixel * 0.01) {\n if (this.gantt.zoomScaleManager) {\n const targetLevel = this.gantt.zoomScaleManager.findOptimalLevel(targetMillisecondsPerPixel);\n const currentLevel = this.gantt.zoomScaleManager.getCurrentLevel();\n\n if (targetLevel !== currentLevel) {\n this.gantt.zoomScaleManager.switchToLevel(targetLevel);\n }\n\n this.gantt.setMillisecondsPerPixel(targetMillisecondsPerPixel);\n } else {\n this.gantt.setMillisecondsPerPixel(targetMillisecondsPerPixel);\n }\n }\n\n // 重新计算滚动位置\n const newTotalWidth = this.gantt.getAllDateColsWidth();\n const targetScrollLeft = start * newTotalWidth;\n this.gantt.stateManager.setScrollLeft(targetScrollLeft);\n }\n\n /**\n * 同步初始位置\n */\n private syncInitialPosition(): void {\n setTimeout(() => {\n const boundaries = this.getGanttViewBoundaries();\n if (boundaries.startRatio > 0 || boundaries.endRatio < 1) {\n this.dataZoomAxis.setStartAndEnd(boundaries.startRatio, boundaries.endRatio);\n }\n }, 100);\n }\n\n /**\n * 手动同步 DataZoom 到 Gantt 当前视图\n */\n syncToGantt(): void {\n const start = this.dataZoomAxis.attribute.start || 0;\n const end = this.dataZoomAxis.attribute.end || 1;\n this.applyDataZoomRangeToGantt(start, end);\n }\n\n /**\n * 手动同步 Gantt 当前视图到 DataZoom\n */\n syncToDataZoom(): void {\n const boundaries = this.getGanttViewBoundaries();\n\n this.dataZoomAxis.setStartAndEnd(boundaries.startRatio, boundaries.endRatio);\n }\n\n /**\n * 私有方法:同步 DataZoom 范围到 Gantt\n */\n private syncToGanttWithState(start: number, end: number): void {\n this.isUpdatingFromDataZoom = true;\n this.applyDataZoomRangeToGantt(start, end);\n setTimeout(() => {\n this.isUpdatingFromDataZoom = false;\n }, 50);\n }\n\n /**\n * 设置 DataZoom 的范围\n */\n setRange(start: number, end: number): void {\n this.dataZoomAxis.setStartAndEnd(start, end);\n }\n\n /**\n * 获取 DataZoom 当前范围\n */\n getRange(): { start: number; end: number } {\n return {\n start: this.dataZoomAxis.attribute.start || 0,\n end: this.dataZoomAxis.attribute.end || 1\n };\n }\n\n /**\n * 更新 DataZoom 尺寸\n */\n resize(width?: number, height?: number): void {\n if (width === undefined) {\n // 使用甘特图容器而不是外部容器来计算宽度\n const ganttContainer = this.gantt.container as HTMLElement;\n if (ganttContainer) {\n const taskTableWidth = this.gantt.taskTableWidth || 0;\n width = ganttContainer.offsetWidth - taskTableWidth;\n } else {\n width = 1000;\n }\n }\n\n if (height === undefined) {\n height = 30;\n }\n\n this.canvas.width = width;\n this.canvas.height = height;\n this.canvas.style.width = `${width}px`;\n this.canvas.style.height = `${height}px`;\n\n this.stage.resize(width, height);\n this.dataZoomAxis.setAttributes({\n size: { width, height: height - 1 }\n });\n\n // 强制重新渲染\n this.stage.render();\n }\n\n /**\n * 响应式更新 DataZoom 大小和位置\n * 当容器大小或位置发生变化时调用\n */\n updateResponsive(): void {\n const ganttContainer = this.gantt.container as HTMLElement;\n if (!ganttContainer) {\n return;\n }\n\n // 计算新宽度:甘特图容器宽度减去左侧表头宽度\n const taskTableWidth = this.gantt.taskTableWidth || 0;\n const newWidth = ganttContainer.offsetWidth - taskTableWidth;\n\n this.resize(newWidth);\n\n // 更新位置(保持与时间轴内容区域对齐,排除左侧表头)\n const defaultX = this.gantt.taskTableWidth || 0;\n this.updatePosition(defaultX, 0);\n\n // 重新同步 DataZoom 状态,因为视图宽度变化会影响时间范围的显示比例\n setTimeout(() => {\n this.syncToDataZoom();\n }, 10);\n }\n\n /**\n * 更新 DataZoom 位置\n * 当容器位置发生变化时调用\n */\n updatePosition(x?: number, y?: number): void {\n const xPos = x ?? this.gantt.taskTableWidth ?? 0;\n this.canvas.style.left = `${xPos}px`;\n }\n\n /**\n * 销毁 DataZoom 集成\n */\n destroy(): void {\n this.cleanupCallbacks.forEach(cleanup => cleanup());\n this.cleanupCallbacks = [];\n\n // 清理包装器和 Canvas\n if (this.canvas && this.canvas.parentNode) {\n const wrapper = this.canvas.parentNode as HTMLElement;\n if (wrapper && wrapper.id === 'dataZoomWrapper' && wrapper.parentNode) {\n // 移除整个包装器\n wrapper.parentNode.removeChild(wrapper);\n } else {\n // 如果没有包装器,直接移除 Canvas\n wrapper.removeChild(this.canvas);\n }\n }\n\n if (this.stage) {\n this.stage.release();\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Gantt } from '../Gantt';
|
|
2
|
+
import type { IZoomScale } from '../ts-types/zoom-scale';
|
|
3
|
+
import type { ITimelineScale } from '../ts-types/gantt-engine';
|
|
4
|
+
import { DataZoomIntegration, type DataZoomConfig } from './DataZoomIntegration';
|
|
5
|
+
export declare class ZoomScaleManager {
|
|
6
|
+
private readonly gantt;
|
|
7
|
+
readonly config: IZoomScale;
|
|
8
|
+
private currentLevelIndex;
|
|
9
|
+
private levelBoundaries;
|
|
10
|
+
private globalMinMillisecondsPerPixel;
|
|
11
|
+
private globalMaxMillisecondsPerPixel;
|
|
12
|
+
private dataZoomIntegration;
|
|
13
|
+
constructor(gantt: Gantt, config: IZoomScale);
|
|
14
|
+
private initializeZoomLimits;
|
|
15
|
+
private initializeDataZoomIfNeeded;
|
|
16
|
+
handleTableWidthChange(): void;
|
|
17
|
+
private sortLevelsByCoarseness;
|
|
18
|
+
private calculateGlobalMillisecondsPerPixelRange;
|
|
19
|
+
private calculateLevelBoundaries;
|
|
20
|
+
updateZoomLimits(): void;
|
|
21
|
+
getGlobalMinMillisecondsPerPixel(): number;
|
|
22
|
+
getGlobalMaxMillisecondsPerPixel(): number;
|
|
23
|
+
private calculateInitialMillisecondsPerPixel;
|
|
24
|
+
private initializeWithMillisecondsPerPixel;
|
|
25
|
+
private setInitialLevel;
|
|
26
|
+
findOptimalLevel(millisecondsPerPixel: number): number;
|
|
27
|
+
switchToLevel(levelIndex: number): boolean;
|
|
28
|
+
findMinTimeUnit(scales: ITimelineScale[]): ITimelineScale;
|
|
29
|
+
private getUnitMilliseconds;
|
|
30
|
+
private getMinColWidthForUnit;
|
|
31
|
+
getCurrentLevel(): number;
|
|
32
|
+
getInitialMillisecondsPerPixel(): number;
|
|
33
|
+
getCurrentZoomState(): {
|
|
34
|
+
minUnit: "year" | "month" | "quarter" | "week" | "day" | "hour" | "minute" | "second";
|
|
35
|
+
step: number;
|
|
36
|
+
levelNum: number;
|
|
37
|
+
currentColWidth: number;
|
|
38
|
+
};
|
|
39
|
+
setZoomPosition(params: {
|
|
40
|
+
minUnit?: string;
|
|
41
|
+
step?: number;
|
|
42
|
+
levelNum?: number;
|
|
43
|
+
colWidth?: number;
|
|
44
|
+
}): boolean;
|
|
45
|
+
private findLevelByMinUnit;
|
|
46
|
+
zoomIn(factor?: number, center?: boolean, centerX?: number): void;
|
|
47
|
+
zoomOut(factor?: number, center?: boolean, centerX?: number): void;
|
|
48
|
+
zoomByPercentage(percentage: number, center?: boolean, centerX?: number): void;
|
|
49
|
+
getDataZoomIntegration(): DataZoomIntegration | null;
|
|
50
|
+
createDataZoomIntegration(config: DataZoomConfig): DataZoomIntegration;
|
|
51
|
+
destroyDataZoomIntegration(): void;
|
|
52
|
+
updateDataZoomResponsive(): void;
|
|
53
|
+
recalculateTimeScale(): void;
|
|
54
|
+
zoomByFactor(factor: number, keepCenter?: boolean, centerX?: number): void;
|
|
55
|
+
}
|