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

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
  /**
@@ -87,10 +112,10 @@ export interface IGanttOptions {
87
112
  * @argument {"F"} - 允许以 F,也就是右侧结束点作为终点创建连线
88
113
  */
89
114
  to:
90
- | boolean
91
- | "S"
92
- | "F"
93
- | ((row: EmitData, from: EmitData) => boolean | "S" | "F");
115
+ | boolean
116
+ | "S"
117
+ | "F"
118
+ | ((row: EmitData, from: EmitData) => boolean | "S" | "F");
94
119
  };
95
120
  /** 默认关连线的颜色。每一条线可以单独配置后覆盖当前颜色。默认主色 */
96
121
  color?: string;
@@ -119,6 +144,249 @@ export interface IGanttOptions {
119
144
  radius: number;
120
145
  };
121
146
 
147
+ /** 基线配置 */
148
+ baselines: {
149
+ /**
150
+ * 基线数据集合
151
+ *
152
+ * - 每条基线数据需要包含对应任务的关联ID
153
+ * - 基线数据应包含开始时间、结束时间等信息
154
+ * - 支持多条基线数据对应同一个任务
155
+ *
156
+ * @example
157
+ * const baselines = [
158
+ * {
159
+ * id: 'baseline_1',
160
+ * taskId: 'task_1', // 对应任务的ID
161
+ * startTime: '2024-01-01',
162
+ * endTime: '2024-01-15',
163
+ * name: '原计划'
164
+ * }
165
+ * ]
166
+ */
167
+ data: any[];
168
+
169
+ /** 是否展示基线 */
170
+ show: boolean;
171
+
172
+ /** 指定关联任务 id 的字段。默认 'taskId' */
173
+ taskKey: string;
174
+
175
+ /** 数据字段支持单独配置。默认与 data 保持一致,共享 fields 配置。 */
176
+ fields: {
177
+ /** 开始时间字段 */
178
+ startTime: string;
179
+ /** 结束时间字段 */
180
+ endTime: string;
181
+ /** 名称字段 */
182
+ name: string;
183
+ /** 基线数据 id */
184
+ id: string;
185
+ /** 禁用高亮对比的字段。该字段默认值为 true */
186
+ highlight: string;
187
+ /** 指定指示器的字段 */
188
+ target: string;
189
+ };
190
+
191
+ /**
192
+ * 基线展示形式
193
+ *
194
+ * @param shadow - 以阴影形式展示基线
195
+ * @param line - 以线条形式展示基线
196
+ *
197
+ * @description 'line'
198
+ */
199
+ mode: 'shadow' | 'line';
200
+
201
+ /**
202
+ * 基线条高度
203
+ *
204
+ * @description 当 mode 为 'shadow' 时,默认与 bar 的高度一致;
205
+ * @description 当 mode 为 'line' 时,默认 5px
206
+ */
207
+ height?: number | string;
208
+
209
+ /**
210
+ * 与 bar 的偏移展示量。
211
+ *
212
+ * @description 为保证可视化的时间不会出现偏移,只在 y 轴上做偏移
213
+ * @description 正数向下偏移,负数向上偏移
214
+ * @description 在 'line' 模式下使用 offset,会影响 position 的最终位置
215
+ */
216
+ offset?: number;
217
+
218
+ /**
219
+ * 基线条相对任务条的位置。默认 'bottom'
220
+ *
221
+ * @description 仅当 mode 为 'line' 时有效。
222
+ */
223
+ position: 'top' | 'bottom' | 'center';
224
+
225
+ /** 基线条背景颜色。默认 #999 */
226
+ backgroundColor: string;
227
+
228
+ /** 基线条透明度。默认 0.6 */
229
+ opacity: number;
230
+
231
+ /** 基线条圆角。默认 2 */
232
+ radius: number | number[];
233
+
234
+ /** 基线标签配置 */
235
+ label: {
236
+ /** 是否显示标签。默认 false */
237
+ show: boolean;
238
+ /** 标签内容。默认使用 name 字段 */
239
+ field?: string;
240
+ /** 强制显示标签
241
+ *
242
+ * @description 当基线过小时,系统会自动隐藏。如果你需要强制显示标签,可以设置为 true,不过可能文本显示会很奇怪,建议配合 fontSize 使用。
243
+ */
244
+ forceDisplay?: boolean;
245
+ /** 标签文字颜色。默认 #666 */
246
+ color: string;
247
+ /** 标签字体大小。默认 10 */
248
+ fontSize: number;
249
+ /** 标签字体。默认 'Arial' */
250
+ fontFamily: string;
251
+ /** 标签位置。默认 'right' */
252
+ position: 'left' | 'right' | 'center';
253
+ };
254
+
255
+ /**
256
+ * 基线对比分析配置
257
+ *
258
+ * @description 如果一个任务配置了多个基线,默认情况下:
259
+ * - 1、 高亮状态是和所有基线匹配。如果不希望某条基线进行对比,请在基线数据中添加 `highlight: false` 字段。
260
+ * - 2、 指示器只会和第一个基线进行匹配。如果需要指定对比基线,请在基线数据中添加 `target: true` 字段。
261
+ */
262
+ compare: {
263
+ /** 是否启用对比功能。默认 false */
264
+ enabled: boolean;
265
+ /** 时间容差(天)。在此范围内认为是准时完成。默认 0.5 */
266
+ tolerance: number;
267
+ /** 差异显示模式 */
268
+ mode: 'highlight' | 'indicator' | 'both';
269
+ /** 以何种基准展示对比。基线高亮只会以一种(起始/结束)基线进行对比。默认以结束时间为基准('end') */
270
+ target: 'start' | 'end'
271
+
272
+ /** 超期任务的高亮配置 */
273
+ delayed: {
274
+ /** 高亮颜色。默认 #ff4444 */
275
+ backgroundColor: string;
276
+ /** 高亮颜色的透明度。默认 0.8 */
277
+ opacity: number;
278
+ };
279
+
280
+ /** 提前完成任务的高亮配置 */
281
+ ahead: {
282
+ /** 高亮颜色。默认 #44ff44 */
283
+ backgroundColor: string;
284
+ /** 高亮颜色透明度。默认 0.8 */
285
+ opacity: number;
286
+ };
287
+
288
+ /**
289
+ * 差异指示器配置
290
+ *
291
+ * @description 展示在任务条左右两侧,用于显示与基线时间差异的内容
292
+ */
293
+ indicator: {
294
+ /**
295
+ * 是否展示指示器
296
+ *
297
+ * @default true
298
+ *
299
+ * @description 可以配置展示起始、结束,或者同时展示。
300
+ * @description true 与 'both' 效果一致,两侧都会展示。
301
+ */
302
+ show: boolean | 'start' | 'end' | 'both';
303
+ /** 显示位置。当前支持任务条两侧的上端或者下端 */
304
+ position: 'top' | 'bottom';
305
+ /** 超期指示器大小。默认 6 */
306
+ size: number;
307
+ /** 标签字体大小。默认 10 */
308
+ fontSize: number;
309
+ /** 标签字体。默认 'Arial' */
310
+ fontFamily: string;
311
+
312
+ /** 提前任务指示器配置 */
313
+ ahead: {
314
+ /** 任务提前,是否显示指示器。默认展示 */
315
+ show: boolean;
316
+ /** 显示文本。如果不需要展示文本,请设置为空字符 */
317
+ text?: string | ((diff: number, row: EmitBaseline) => string);
318
+ /** 提前指示器颜色。默认 #1baf1b */
319
+ color: string;
320
+ /** 高亮颜色透明度 */
321
+ opacity: number;
322
+ };
323
+ /** 超期任务指示器配置 */
324
+ delayed: {
325
+ /** 任务超期,是否显示指示器。默认展示 */
326
+ show: boolean;
327
+ /** 显示文本。如果不需要展示文本,请设置为空字符 */
328
+ text?: string | ((diff: number, row: EmitBaseline) => string);
329
+ /** 超期指示器颜色。默认 #af1b1b */
330
+ color: string;
331
+ /** 高亮颜色透明度 */
332
+ opacity: number;
333
+ };
334
+ /** 按时任务指示器配置 */
335
+ ontime: {
336
+ /** 任务正常,是否显示指示器。默认不展示 */
337
+ show: boolean;
338
+ /** 显示文本。如果不需要展示文本,请设置为空字符 */
339
+ text?: string | ((diff: number, row: EmitBaseline) => string);
340
+ /** 按时的指示器颜色。默认 #999 */
341
+ color: string;
342
+ /** 高亮颜色透明度 */
343
+ opacity: number;
344
+ };
345
+ };
346
+ };
347
+ };
348
+
349
+ /**
350
+ * 里程碑配置
351
+ *
352
+ * @description 里程碑是一个特殊的任务类型,通常用于标记项目中的重要节点或事件。它没有持续时间,默认只会使用开始时间
353
+ */
354
+ milestone: {
355
+ /**
356
+ * 启用里程碑模式
357
+ *
358
+ * @description 默认情况下,所有任务都是普通任务模式。启用里程碑模式后,会将标记为里程碑的任务展示为特殊形状。
359
+ */
360
+ show: boolean;
361
+ /** 里程碑形状。默认 'diamond' */
362
+ shape: 'diamond' | 'star' | 'triangle' | 'circle' | ((row: EmitData) => 'diamond' | 'star' | 'triangle' | 'circle');
363
+ /** 形状大小。默认形状半径与 bar 大小一致。但最大不会超过整行高度 */
364
+ size?: number | ((row: EmitData) => number | undefined);
365
+ /** 里程碑颜色。默认与 bar 颜色保持一致 */
366
+ color?: string | ((row: EmitData) => string | undefined);
367
+ /** 边框样式配置 */
368
+ border: {
369
+ width?: number | ((row: EmitData) => number | undefined);
370
+ color?: string | ((row: EmitData) => string | undefined);
371
+ };
372
+
373
+ /** 里程碑标签配置 */
374
+ label: {
375
+ /** 是否显示里程碑标签。默认 false */
376
+ show: boolean | ((row: EmitData) => boolean);
377
+ /** 标签文本 */
378
+ text: string | ((row: EmitData) => string);
379
+ /** 标签位置。默认 'top-right' */
380
+ position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | ((row: EmitData) => 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right');
381
+ /** 标签字体大小。默认 12 */
382
+ fontSize: number | ((row: EmitData) => number);
383
+ /** 标签字体粗细 */
384
+ fontFamily: string | ((row: EmitData) => string);
385
+ /** 标签颜色。默认与里程碑的颜色保持一致 */
386
+ color?: string | ((row: EmitData) => string | undefined);
387
+ };
388
+ };
389
+
122
390
  /** 主色调。默认 #eca710 */
123
391
  primaryColor: string;
124
392
 
@@ -192,27 +460,6 @@ export interface IGanttOptions {
192
460
  */
193
461
  highlight?: boolean;
194
462
 
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
463
  /** 表格配置 */
217
464
  table: ITableOptions;
218
465
 
@@ -314,7 +561,14 @@ export interface IGanttOptions {
314
561
  *
315
562
  * @default 20
316
563
  */
317
- height: number | string;
564
+ height: number | string | ((row: EmitData) => string | number);
565
+
566
+ /**
567
+ * 是否显示任务条
568
+ *
569
+ * @default true
570
+ */
571
+ show?: boolean | ((row: EmitData) => boolean);
318
572
 
319
573
  /**
320
574
  * 显示在任务条上的字段内容。如果配置了 label,则会显示 label 的内容。支持点语法对嵌套字段进行访问
@@ -340,6 +594,20 @@ export interface IGanttOptions {
340
594
  left?: boolean | ((row: EmitData) => boolean);
341
595
  /** 是否允许右移 */
342
596
  right?: boolean | ((row: EmitData) => boolean);
597
+ /**
598
+ * 左右移动手柄的背景颜色
599
+ *
600
+ * @default bar.backgroundColor.brighten(30)
601
+ */
602
+ backgroundColor?: string;
603
+ /** 左右移动手柄的透明度 */
604
+ opacity?: number;
605
+ /**
606
+ * 允许给手柄设置一个 svg 图标。设为 null 可以置空。
607
+ *
608
+ * @description 仅支持 svg 图标,`<svg>...</svg>` 的字符串形式。
609
+ */
610
+ icon?: string | null;
343
611
  };
344
612
  /**
345
613
  * 是否按单位移动
@@ -367,31 +635,31 @@ export interface IGanttOptions {
367
635
  };
368
636
  };
369
637
  /** 背景颜色 */
370
- backgroundColor?: string;
638
+ backgroundColor?: string | ((row: EmitData) => string | undefined);
371
639
  /** 圆角 */
372
- radius?: number | number[];
640
+ radius?: number | number[] | ((row: EmitData) => number | number[] | undefined);
373
641
  /** 阴影颜色 */
374
- shadowColor?: string;
642
+ shadowColor?: string | ((row: EmitData) => string | undefined);
375
643
  /** 阴影模糊度 */
376
- shadowBlur?: number;
644
+ shadowBlur?: number | ((row: EmitData) => number | undefined);
377
645
  /** 阴影偏移量 */
378
- shadowOffsetX?: number;
646
+ shadowOffsetX?: number | ((row: EmitData) => number | undefined);
379
647
  /** 阴影偏移量 */
380
- shadowOffsetY?: number;
648
+ shadowOffsetY?: number | ((row: EmitData) => number | undefined);
381
649
  /** 文字颜色 */
382
- color?: string;
650
+ color?: string | ((row: EmitData) => string | undefined);
383
651
  /** 任务条的字体大小 */
384
- fontSize?: number;
652
+ fontSize?: number | ((row: EmitData) => number | undefined);
385
653
  /** 任务条的字体 */
386
- fontFamily?: string;
654
+ fontFamily?: string | ((row: EmitData) => string | undefined);
387
655
  /** 任务条的文本对齐方式 */
388
- align?: "left" | "center" | "right";
656
+ align?: "left" | "center" | "right" | ((row: EmitData) => "left" | "center" | "right" | undefined);
389
657
  /** 任务条的文本垂直对齐方式 */
390
- verticalAlign?: "top" | "middle" | "bottom";
658
+ verticalAlign?: "top" | "middle" | "bottom" | ((row: EmitData) => "top" | "middle" | "bottom" | undefined);
391
659
  /** 进度样式 */
392
660
  progress?: {
393
661
  /** 是否显示进度 */
394
- show?: boolean;
662
+ show?: boolean | ((row: EmitData) => boolean);
395
663
  /**
396
664
  * 进度百分比的基准值。数据中的进度值将会以这个值作为 100% 的基准值
397
665
  *
@@ -401,9 +669,9 @@ export interface IGanttOptions {
401
669
  */
402
670
  targetVal?: number;
403
671
  /** 颜色 */
404
- backgroundColor?: string;
672
+ backgroundColor?: string | ((row: EmitData) => string | undefined);
405
673
  /** 文本颜色 */
406
- color?: string;
674
+ color?: string | ((row: EmitData) => string | undefined);
407
675
  /**
408
676
  * 基于任务条颜色的高亮百分比 0-100
409
677
  *
@@ -413,9 +681,9 @@ export interface IGanttOptions {
413
681
  */
414
682
  amount?: number;
415
683
  /** 透明度 */
416
- opacity?: number;
684
+ opacity?: number | ((row: EmitData) => number | undefined);
417
685
  /** 圆角 */
418
- radius?: number | number[];
686
+ radius?: number | number[] | ((row: EmitData) => number | number[] | undefined);
419
687
  /** 进度小数位 0-10 */
420
688
  decimal?: number;
421
689
  /**
@@ -425,11 +693,11 @@ export interface IGanttOptions {
425
693
  * - right 在进度条右侧外部
426
694
  * - inside 在进度条右侧内部
427
695
  */
428
- textAlign?: "top" | "right" | "inside";
696
+ textAlign?: "top" | "right" | "inside" | ((row: EmitData) => "top" | "right" | "inside" | undefined);
429
697
  /** 字体大小。默认 10 */
430
- fontSize?: number;
698
+ fontSize?: number | ((row: EmitData) => number | undefined);
431
699
  /** 字体样式。默认斜体 */
432
- fontStyle?: string;
700
+ fontStyle?: string | ((row: EmitData) => string | undefined);
433
701
  };
434
702
  };
435
703
 
@@ -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>;