@xpyjs/gantt-core 0.0.1-alpha.3 → 0.0.1-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,11 @@
1
- import { EmitData } from ".";
1
+ import { EmitData, EmitBaseline } from ".";
2
2
  import { IChartOptions } from "./chart";
3
3
  import { ILink } from "./link";
4
4
  import { IPattern } from "./styles";
5
5
  import { ITableOptions } from "./table";
6
6
 
7
7
  export type XGanttUnit = "hour" | "day" | "week" | "month" | "quarter";
8
+ export type TaskType = "task" | "milestone" | "summary";
8
9
 
9
10
  export interface IGanttOptions {
10
11
  /** 日志 level。 默认 info */
@@ -13,6 +14,30 @@ export interface IGanttOptions {
13
14
  /** 源数据 */
14
15
  data: any[];
15
16
 
17
+ /** 字段映射配置 */
18
+ fields: {
19
+ /** ID字段 */
20
+ id: string;
21
+
22
+ /** 开始时间字段 */
23
+ startTime: string;
24
+
25
+ /** 结束时间字段 */
26
+ endTime: string;
27
+
28
+ /** 名称字段 */
29
+ name: string;
30
+
31
+ /** 进度字段 */
32
+ progress: string;
33
+
34
+ /** 子项字段 */
35
+ children: string;
36
+
37
+ /** 任务类型字段 */
38
+ type: string;
39
+ };
40
+
16
41
  /** 关联配置 */
17
42
  links: {
18
43
  /**
@@ -38,6 +63,18 @@ export interface IGanttOptions {
38
63
  key: string;
39
64
  /** 是否展示关联线。不支持单独配置 */
40
65
  show: boolean;
66
+ /** 移动相关设置 */
67
+ move: {
68
+ /**
69
+ * 是否允许移动连线到新节点。
70
+ *
71
+ * @default false
72
+ *
73
+ * @description 开启时,所有连线将按照 from 与 to 属性规则允许移动
74
+ * @description 需要注意的是,开启移动后,需要主动添加对应 'update:link' 事件,否则会导致显示异常
75
+ */
76
+ enabled: boolean;
77
+ };
41
78
  /** 创建相关设置 */
42
79
  create: {
43
80
  /**
@@ -87,10 +124,10 @@ export interface IGanttOptions {
87
124
  * @argument {"F"} - 允许以 F,也就是右侧结束点作为终点创建连线
88
125
  */
89
126
  to:
90
- | boolean
91
- | "S"
92
- | "F"
93
- | ((row: EmitData, from: EmitData) => boolean | "S" | "F");
127
+ | boolean
128
+ | "S"
129
+ | "F"
130
+ | ((row: EmitData, from: EmitData) => boolean | "S" | "F");
94
131
  };
95
132
  /** 默认关连线的颜色。每一条线可以单独配置后覆盖当前颜色。默认主色 */
96
133
  color?: string;
@@ -119,6 +156,277 @@ export interface IGanttOptions {
119
156
  radius: number;
120
157
  };
121
158
 
159
+ /** 基线配置 */
160
+ baselines: {
161
+ /**
162
+ * 基线数据集合
163
+ *
164
+ * - 每条基线数据需要包含对应任务的关联ID
165
+ * - 基线数据应包含开始时间、结束时间等信息
166
+ * - 支持多条基线数据对应同一个任务
167
+ *
168
+ * @example
169
+ * const baselines = [
170
+ * {
171
+ * id: 'baseline_1',
172
+ * taskId: 'task_1', // 对应任务的ID
173
+ * startTime: '2024-01-01',
174
+ * endTime: '2024-01-15',
175
+ * name: '原计划'
176
+ * }
177
+ * ]
178
+ */
179
+ data: any[];
180
+
181
+ /** 是否展示基线 */
182
+ show: boolean;
183
+
184
+ /** 指定关联任务 id 的字段。默认 'taskId' */
185
+ taskKey: string;
186
+
187
+ /** 数据字段支持单独配置。默认与 data 保持一致,共享 fields 配置。 */
188
+ fields: {
189
+ /** 开始时间字段 */
190
+ startTime: string;
191
+ /** 结束时间字段 */
192
+ endTime: string;
193
+ /** 名称字段 */
194
+ name: string;
195
+ /** 基线数据 id */
196
+ id: string;
197
+ /** 禁用高亮对比的字段。该字段默认值为 true */
198
+ highlight: string;
199
+ /** 指定指示器的字段 */
200
+ target: string;
201
+ };
202
+
203
+ /**
204
+ * 基线展示形式
205
+ *
206
+ * @param shadow - 以阴影形式展示基线
207
+ * @param line - 以线条形式展示基线
208
+ *
209
+ * @description 'line'
210
+ */
211
+ mode: 'shadow' | 'line';
212
+
213
+ /**
214
+ * 基线条高度
215
+ *
216
+ * @description 当 mode 为 'shadow' 时,默认与 bar 的高度一致;
217
+ * @description 当 mode 为 'line' 时,默认 5px
218
+ */
219
+ height?: number | string;
220
+
221
+ /**
222
+ * 与 bar 的偏移展示量。
223
+ *
224
+ * @description 为保证可视化的时间不会出现偏移,只在 y 轴上做偏移
225
+ * @description 正数向下偏移,负数向上偏移
226
+ * @description 在 'line' 模式下使用 offset,会影响 position 的最终位置
227
+ */
228
+ offset?: number;
229
+
230
+ /**
231
+ * 基线条相对任务条的位置。默认 'bottom'
232
+ *
233
+ * @description 仅当 mode 为 'line' 时有效。
234
+ */
235
+ position: 'top' | 'bottom' | 'center';
236
+
237
+ /** 基线条背景颜色。默认 #999 */
238
+ backgroundColor: string;
239
+
240
+ /** 基线条透明度。默认 0.6 */
241
+ opacity: number;
242
+
243
+ /** 基线条圆角。默认 2 */
244
+ radius: number | number[];
245
+
246
+ /** 基线标签配置 */
247
+ label: {
248
+ /** 是否显示标签。默认 false */
249
+ show: boolean;
250
+ /** 标签内容。默认使用 name 字段 */
251
+ field?: string;
252
+ /** 强制显示标签
253
+ *
254
+ * @description 当基线过小时,系统会自动隐藏。如果你需要强制显示标签,可以设置为 true,不过可能文本显示会很奇怪,建议配合 fontSize 使用。
255
+ */
256
+ forceDisplay?: boolean;
257
+ /** 标签文字颜色。默认 #666 */
258
+ color: string;
259
+ /** 标签字体大小。默认 10 */
260
+ fontSize: number;
261
+ /** 标签字体。默认 'Arial' */
262
+ fontFamily: string;
263
+ /** 标签位置。默认 'right' */
264
+ position: 'left' | 'right' | 'center';
265
+ };
266
+
267
+ /**
268
+ * 基线对比分析配置
269
+ *
270
+ * @description 如果一个任务配置了多个基线,默认情况下:
271
+ * - 1、 高亮状态是和所有基线匹配。如果不希望某条基线进行对比,请在基线数据中添加 `highlight: false` 字段。
272
+ * - 2、 指示器只会和第一个基线进行匹配。如果需要指定对比基线,请在基线数据中添加 `target: true` 字段。
273
+ */
274
+ compare: {
275
+ /** 是否启用对比功能。默认 false */
276
+ enabled: boolean;
277
+ /** 时间容差(天)。在此范围内认为是准时完成。默认 0.5 */
278
+ tolerance: number;
279
+ /** 差异显示模式 */
280
+ mode: 'highlight' | 'indicator' | 'both';
281
+ /** 以何种基准展示对比。基线高亮只会以一种(起始/结束)基线进行对比。默认以结束时间为基准('end') */
282
+ target: 'start' | 'end'
283
+
284
+ /** 超期任务的高亮配置 */
285
+ delayed: {
286
+ /** 高亮颜色。默认 #ff4444 */
287
+ backgroundColor: string;
288
+ /** 高亮颜色的透明度。默认 0.8 */
289
+ opacity: number;
290
+ };
291
+
292
+ /** 提前完成任务的高亮配置 */
293
+ ahead: {
294
+ /** 高亮颜色。默认 #44ff44 */
295
+ backgroundColor: string;
296
+ /** 高亮颜色透明度。默认 0.8 */
297
+ opacity: number;
298
+ };
299
+
300
+ /**
301
+ * 差异指示器配置
302
+ *
303
+ * @description 展示在任务条左右两侧,用于显示与基线时间差异的内容
304
+ */
305
+ indicator: {
306
+ /**
307
+ * 是否展示指示器
308
+ *
309
+ * @default true
310
+ *
311
+ * @description 可以配置展示起始、结束,或者同时展示。
312
+ * @description true 与 'both' 效果一致,两侧都会展示。
313
+ */
314
+ show: boolean | 'start' | 'end' | 'both';
315
+ /** 显示位置。当前支持任务条两侧的上端或者下端 */
316
+ position: 'top' | 'bottom';
317
+ /** 超期指示器大小。默认 6 */
318
+ size: number;
319
+ /** 标签字体大小。默认 10 */
320
+ fontSize: number;
321
+ /** 标签字体。默认 'Arial' */
322
+ fontFamily: string;
323
+
324
+ /** 提前任务指示器配置 */
325
+ ahead: {
326
+ /** 任务提前,是否显示指示器。默认展示 */
327
+ show: boolean;
328
+ /** 显示文本。如果不需要展示文本,请设置为空字符 */
329
+ text?: string | ((diff: number, row: EmitBaseline) => string);
330
+ /** 提前指示器颜色。默认 #1baf1b */
331
+ color: string;
332
+ /** 高亮颜色透明度 */
333
+ opacity: number;
334
+ };
335
+ /** 超期任务指示器配置 */
336
+ delayed: {
337
+ /** 任务超期,是否显示指示器。默认展示 */
338
+ show: boolean;
339
+ /** 显示文本。如果不需要展示文本,请设置为空字符 */
340
+ text?: string | ((diff: number, row: EmitBaseline) => string);
341
+ /** 超期指示器颜色。默认 #af1b1b */
342
+ color: string;
343
+ /** 高亮颜色透明度 */
344
+ opacity: number;
345
+ };
346
+ /** 按时任务指示器配置 */
347
+ ontime: {
348
+ /** 任务正常,是否显示指示器。默认不展示 */
349
+ show: boolean;
350
+ /** 显示文本。如果不需要展示文本,请设置为空字符 */
351
+ text?: string | ((diff: number, row: EmitBaseline) => string);
352
+ /** 按时的指示器颜色。默认 #999 */
353
+ color: string;
354
+ /** 高亮颜色透明度 */
355
+ opacity: number;
356
+ };
357
+ };
358
+ };
359
+ };
360
+
361
+ /**
362
+ * 里程碑配置
363
+ *
364
+ * @description 里程碑是一个特殊的任务类型,通常用于标记项目中的重要节点或事件。它没有持续时间,默认只会使用开始时间
365
+ */
366
+ milestone: {
367
+ /**
368
+ * 启用里程碑模式
369
+ *
370
+ * @description 默认情况下,所有任务都是普通任务模式。启用里程碑模式后,会将标记为里程碑的任务展示为特殊形状。
371
+ */
372
+ show: boolean;
373
+ /** 里程碑形状。默认 'diamond' */
374
+ shape: 'diamond' | 'star' | 'triangle' | 'circle' | ((row: EmitData) => 'diamond' | 'star' | 'triangle' | 'circle');
375
+ /** 形状大小。默认形状半径与 bar 大小一致。但最大不会超过整行高度 */
376
+ size?: number | ((row: EmitData) => number | undefined);
377
+ /** 里程碑颜色。默认与 bar 颜色保持一致 */
378
+ color?: string | ((row: EmitData) => string | undefined);
379
+ /** 边框样式配置 */
380
+ border: {
381
+ width?: number | ((row: EmitData) => number | undefined);
382
+ color?: string | ((row: EmitData) => string | undefined);
383
+ };
384
+
385
+ /** 里程碑标签配置 */
386
+ label: {
387
+ /** 是否显示里程碑标签。默认 false */
388
+ show: boolean | ((row: EmitData) => boolean);
389
+ /** 标签文本 */
390
+ text: string | ((row: EmitData) => string);
391
+ /** 标签位置。默认 'top-right' */
392
+ position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | ((row: EmitData) => 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right');
393
+ /** 标签字体大小。默认 12 */
394
+ fontSize: number | ((row: EmitData) => number);
395
+ /** 标签字体粗细 */
396
+ fontFamily: string | ((row: EmitData) => string);
397
+ /** 标签颜色。默认与里程碑的颜色保持一致 */
398
+ color?: string | ((row: EmitData) => string | undefined);
399
+ };
400
+ };
401
+
402
+ /** 汇总集合配置 */
403
+ summary: {
404
+ /**
405
+ * 是否启用汇总集合
406
+ *
407
+ * @default false
408
+ *
409
+ * @description 启用后,所有标记为汇总集合的任务将会被特殊处理。
410
+ */
411
+ show: boolean;
412
+ /** 汇总集合的颜色。默认与 bar 颜色保持一致 */
413
+ color?: string | ((row: EmitData) => string | undefined);
414
+ /** 移动相关配置 */
415
+ move: {
416
+ /** 是否启用移动。默认情况,汇总是不允许主动移动的 */
417
+ enabled: boolean;
418
+ };
419
+ /**
420
+ * 展示模式
421
+ *
422
+ * @default 'expand'
423
+ *
424
+ * - 'always' 永远展示为汇总集合形式
425
+ * - 'expand' 展开时展示为汇总集合形式,当任务收起后,展示为普通类型
426
+ */
427
+ mode: "always" | "expand"
428
+ };
429
+
122
430
  /** 主色调。默认 #eca710 */
123
431
  primaryColor: string;
124
432
 
@@ -192,27 +500,6 @@ export interface IGanttOptions {
192
500
  */
193
501
  highlight?: boolean;
194
502
 
195
- /** 字段映射配置 */
196
- fields: {
197
- /** ID字段 */
198
- id: string;
199
-
200
- /** 开始时间字段 */
201
- startTime: string;
202
-
203
- /** 结束时间字段 */
204
- endTime: string;
205
-
206
- /** 名称字段 */
207
- name: string;
208
-
209
- /** 进度字段 */
210
- progress: string;
211
-
212
- /** 子项字段 */
213
- children: string;
214
- };
215
-
216
503
  /** 表格配置 */
217
504
  table: ITableOptions;
218
505
 
@@ -314,7 +601,14 @@ export interface IGanttOptions {
314
601
  *
315
602
  * @default 20
316
603
  */
317
- height: number | string;
604
+ height: number | string | ((row: EmitData) => string | number);
605
+
606
+ /**
607
+ * 是否显示任务条
608
+ *
609
+ * @default true
610
+ */
611
+ show?: boolean | ((row: EmitData) => boolean);
318
612
 
319
613
  /**
320
614
  * 显示在任务条上的字段内容。如果配置了 label,则会显示 label 的内容。支持点语法对嵌套字段进行访问
@@ -340,6 +634,20 @@ export interface IGanttOptions {
340
634
  left?: boolean | ((row: EmitData) => boolean);
341
635
  /** 是否允许右移 */
342
636
  right?: boolean | ((row: EmitData) => boolean);
637
+ /**
638
+ * 左右移动手柄的背景颜色
639
+ *
640
+ * @default bar.backgroundColor.brighten(30)
641
+ */
642
+ backgroundColor?: string;
643
+ /** 左右移动手柄的透明度 */
644
+ opacity?: number;
645
+ /**
646
+ * 允许给手柄设置一个 svg 图标。设为 null 可以置空。
647
+ *
648
+ * @description 仅支持 svg 图标,`<svg>...</svg>` 的字符串形式。
649
+ */
650
+ icon?: string | null;
343
651
  };
344
652
  /**
345
653
  * 是否按单位移动
@@ -367,31 +675,31 @@ export interface IGanttOptions {
367
675
  };
368
676
  };
369
677
  /** 背景颜色 */
370
- backgroundColor?: string;
678
+ backgroundColor?: string | ((row: EmitData) => string | undefined);
371
679
  /** 圆角 */
372
- radius?: number | number[];
680
+ radius?: number | number[] | ((row: EmitData) => number | number[] | undefined);
373
681
  /** 阴影颜色 */
374
- shadowColor?: string;
682
+ shadowColor?: string | ((row: EmitData) => string | undefined);
375
683
  /** 阴影模糊度 */
376
- shadowBlur?: number;
684
+ shadowBlur?: number | ((row: EmitData) => number | undefined);
377
685
  /** 阴影偏移量 */
378
- shadowOffsetX?: number;
686
+ shadowOffsetX?: number | ((row: EmitData) => number | undefined);
379
687
  /** 阴影偏移量 */
380
- shadowOffsetY?: number;
688
+ shadowOffsetY?: number | ((row: EmitData) => number | undefined);
381
689
  /** 文字颜色 */
382
- color?: string;
690
+ color?: string | ((row: EmitData) => string | undefined);
383
691
  /** 任务条的字体大小 */
384
- fontSize?: number;
692
+ fontSize?: number | ((row: EmitData) => number | undefined);
385
693
  /** 任务条的字体 */
386
- fontFamily?: string;
694
+ fontFamily?: string | ((row: EmitData) => string | undefined);
387
695
  /** 任务条的文本对齐方式 */
388
- align?: "left" | "center" | "right";
696
+ align?: "left" | "center" | "right" | ((row: EmitData) => "left" | "center" | "right" | undefined);
389
697
  /** 任务条的文本垂直对齐方式 */
390
- verticalAlign?: "top" | "middle" | "bottom";
698
+ verticalAlign?: "top" | "middle" | "bottom" | ((row: EmitData) => "top" | "middle" | "bottom" | undefined);
391
699
  /** 进度样式 */
392
700
  progress?: {
393
701
  /** 是否显示进度 */
394
- show?: boolean;
702
+ show?: boolean | ((row: EmitData) => boolean);
395
703
  /**
396
704
  * 进度百分比的基准值。数据中的进度值将会以这个值作为 100% 的基准值
397
705
  *
@@ -401,9 +709,9 @@ export interface IGanttOptions {
401
709
  */
402
710
  targetVal?: number;
403
711
  /** 颜色 */
404
- backgroundColor?: string;
712
+ backgroundColor?: string | ((row: EmitData) => string | undefined);
405
713
  /** 文本颜色 */
406
- color?: string;
714
+ color?: string | ((row: EmitData) => string | undefined);
407
715
  /**
408
716
  * 基于任务条颜色的高亮百分比 0-100
409
717
  *
@@ -413,9 +721,9 @@ export interface IGanttOptions {
413
721
  */
414
722
  amount?: number;
415
723
  /** 透明度 */
416
- opacity?: number;
724
+ opacity?: number | ((row: EmitData) => number | undefined);
417
725
  /** 圆角 */
418
- radius?: number | number[];
726
+ radius?: number | number[] | ((row: EmitData) => number | number[] | undefined);
419
727
  /** 进度小数位 0-10 */
420
728
  decimal?: number;
421
729
  /**
@@ -425,11 +733,11 @@ export interface IGanttOptions {
425
733
  * - right 在进度条右侧外部
426
734
  * - inside 在进度条右侧内部
427
735
  */
428
- textAlign?: "top" | "right" | "inside";
736
+ textAlign?: "top" | "right" | "inside" | ((row: EmitData) => "top" | "right" | "inside" | undefined);
429
737
  /** 字体大小。默认 10 */
430
- fontSize?: number;
738
+ fontSize?: number | ((row: EmitData) => number | undefined);
431
739
  /** 字体样式。默认斜体 */
432
- fontStyle?: string;
740
+ fontStyle?: string | ((row: EmitData) => string | undefined);
433
741
  };
434
742
  };
435
743
 
@@ -127,6 +127,11 @@ export interface ITableOptions {
127
127
  */
128
128
  emptyText: string;
129
129
 
130
+ /**
131
+ * 允许收起表格。开启后,中线会显示一个折叠按钮,点击后可以收起表格
132
+ */
133
+ collapsible?: boolean;
134
+
130
135
  /**
131
136
  * 列配置
132
137
  */
@@ -41,3 +41,7 @@ export declare function getStandardPercent(value: number, full?: number): number
41
41
  * 2、被格式化的数字,如果小数位都位 0,默认不展示。但是如果 forceDisplay 为 true,则保留
42
42
  */
43
43
  export declare function formatNumber(value: number, precision?: number, forceDisplay?: boolean): string;
44
+ /**
45
+ * svg to image - 简化版本,通过正则表达式处理 SVG
46
+ */
47
+ export declare function svgToImage(svg: string, width?: number, height?: number): Promise<HTMLImageElement>;