vxe-gantt 4.0.27 → 4.1.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.
@@ -47,9 +47,10 @@ export default defineVxeComponent({
47
47
  });
48
48
  })),
49
49
  h('thead', {}, headerGroups.map(({ scaleItem, columns }, $rowIndex) => {
50
- const { type, titleMethod, headerCellStyle, slots } = scaleItem;
50
+ const { type, titleFormat, titleMethod, headerCellStyle, slots } = scaleItem;
51
51
  const titleSlot = slots ? slots.title : null;
52
- const todayValue = showNowLine && $rowIndex === headerGroups.length - 1 ? todayDateMaps[type] : null;
52
+ const isLast = $rowIndex === headerGroups.length - 1;
53
+ const todayValue = isLast && showNowLine ? todayDateMaps[type] : null;
53
54
  return h('tr', {
54
55
  key: $rowIndex
55
56
  }, columns.map((column, cIndex) => {
@@ -63,6 +64,11 @@ export default defineVxeComponent({
63
64
  label = getI18n(`vxe.gantt.${!$rowIndex && headerGroups.length > 1 ? 'tFullFormat' : 'tSimpleFormat'}.${type}`, dateObj);
64
65
  }
65
66
  }
67
+ else {
68
+ if (isLast && scaleItem.type === 'week') {
69
+ label = getI18n(`vxe.gantt.tSimpleFormat.${type}`, dateObj);
70
+ }
71
+ }
66
72
  let cellVNs = label;
67
73
  const ctParams = { source: sourceType, type: viewType, column, scaleObj: scaleItem, title: label, dateObj: dateObj, $rowIndex };
68
74
  if (titleSlot) {
@@ -71,6 +77,9 @@ export default defineVxeComponent({
71
77
  else if (titleMethod) {
72
78
  cellVNs = `${titleMethod(ctParams)}`;
73
79
  }
80
+ else if (titleFormat) {
81
+ cellVNs = XEUtils.toDateString(dateObj.date, titleFormat);
82
+ }
74
83
  let cellStys = {};
75
84
  if (headerCellStyle) {
76
85
  if (XEUtils.isFunction(headerCellStyle)) {
@@ -1,14 +1,16 @@
1
- import { h, ref, reactive, nextTick, inject, watch, provide, onMounted, onUnmounted } from 'vue';
1
+ import { h, ref, reactive, nextTick, inject, watch, provide, computed, onMounted, onUnmounted } from 'vue';
2
2
  import { defineVxeComponent } from '../../ui/src/comp';
3
3
  import { setScrollTop, setScrollLeft, removeClass, addClass } from '../../ui/src/dom';
4
4
  import { VxeUI } from '@vxe-ui/core';
5
- import { getRefElem } from './util';
5
+ import { getRefElem, getStandardGapTime } from './util';
6
6
  import XEUtils from 'xe-utils';
7
7
  import GanttViewHeaderComponent from './gantt-header';
8
8
  import GanttViewBodyComponent from './gantt-body';
9
9
  import GanttViewFooterComponent from './gantt-footer';
10
10
  const { globalEvents } = VxeUI;
11
11
  const sourceType = 'gantt';
12
+ const minuteMs = 1000 * 60;
13
+ const dayMs = minuteMs * 60 * 24;
12
14
  function createInternalData() {
13
15
  return {
14
16
  xeTable: null,
@@ -40,7 +42,7 @@ export default defineVxeComponent({
40
42
  setup(props, context) {
41
43
  const xID = XEUtils.uniqueId();
42
44
  const $xeGantt = inject('$xeGantt', {});
43
- const { computeTaskOpts, computeStartField, computeEndField, computeScrollbarOpts, computeScrollbarXToTop, computeScrollbarYToLeft } = $xeGantt.getComputeMaps();
45
+ const { computeTaskOpts, computeStartField, computeEndField, computeScrollbarOpts, computeScrollbarXToTop, computeScrollbarYToLeft, computeScaleUnit, computeWeekScale, computeMinScale } = $xeGantt.getComputeMaps();
44
46
  const refElem = ref();
45
47
  const refScrollXVirtualElem = ref();
46
48
  const refScrollYVirtualElem = ref();
@@ -89,7 +91,72 @@ export default defineVxeComponent({
89
91
  const refMaps = {
90
92
  refElem
91
93
  };
92
- const computeMaps = {};
94
+ const computeScaleDateList = computed(() => {
95
+ const { minViewDate, maxViewDate } = reactData;
96
+ const minScale = computeMinScale.value;
97
+ const dateList = [];
98
+ if (!minViewDate || !maxViewDate) {
99
+ return dateList;
100
+ }
101
+ const startTime = minViewDate.getTime();
102
+ const endTime = maxViewDate.getTime();
103
+ switch (minScale.type) {
104
+ case 'year': {
105
+ let currDate = XEUtils.getWhatYear(minViewDate, 0, 'first');
106
+ while (currDate <= maxViewDate) {
107
+ const itemDate = currDate;
108
+ dateList.push(itemDate);
109
+ currDate = XEUtils.getWhatYear(currDate, 1);
110
+ }
111
+ break;
112
+ }
113
+ case 'quarter': {
114
+ let currDate = XEUtils.getWhatQuarter(minViewDate, 0, 'first');
115
+ while (currDate <= maxViewDate) {
116
+ const itemDate = currDate;
117
+ dateList.push(itemDate);
118
+ currDate = XEUtils.getWhatQuarter(currDate, 1);
119
+ }
120
+ break;
121
+ }
122
+ case 'month': {
123
+ let currDate = XEUtils.getWhatMonth(minViewDate, 0, 'first');
124
+ while (currDate <= maxViewDate) {
125
+ const itemDate = currDate;
126
+ dateList.push(itemDate);
127
+ currDate = XEUtils.getWhatMonth(currDate, 1);
128
+ }
129
+ break;
130
+ }
131
+ case 'week': {
132
+ let currDate = XEUtils.getWhatWeek(minViewDate, 0, minScale.startDay, minScale.startDay);
133
+ while (currDate <= maxViewDate) {
134
+ const itemDate = currDate;
135
+ dateList.push(itemDate);
136
+ currDate = XEUtils.getWhatWeek(currDate, 1);
137
+ }
138
+ break;
139
+ }
140
+ case 'day':
141
+ case 'date':
142
+ case 'hour':
143
+ case 'minute':
144
+ case 'second': {
145
+ const gapTime = getStandardGapTime(minScale.type);
146
+ let currTime = startTime;
147
+ while (currTime <= endTime) {
148
+ const itemDate = new Date(currTime);
149
+ dateList.push(itemDate);
150
+ currTime += gapTime;
151
+ }
152
+ break;
153
+ }
154
+ }
155
+ return dateList;
156
+ });
157
+ const computeMaps = {
158
+ computeScaleDateList
159
+ };
93
160
  const $xeGanttView = {
94
161
  xID,
95
162
  props,
@@ -126,36 +193,16 @@ export default defineVxeComponent({
126
193
  second: `${yyyy}_${MM}_${dd}_${HH}_${mm}_${ss}`
127
194
  };
128
195
  };
129
- const handleParseColumn = () => {
130
- const ganttProps = $xeGantt.props;
196
+ const handleColumnHeader = () => {
131
197
  const ganttReactData = $xeGantt.reactData;
132
- const { treeConfig } = ganttProps;
133
198
  const { taskScaleList } = ganttReactData;
134
- const { minViewDate, maxViewDate } = reactData;
135
- const minScale = XEUtils.last(taskScaleList);
199
+ const scaleUnit = computeScaleUnit.value;
200
+ const minScale = computeMinScale.value;
201
+ const weekScale = computeWeekScale.value;
202
+ const scaleDateList = computeScaleDateList.value;
136
203
  const fullCols = [];
137
204
  const groupCols = [];
138
- if (minScale && minViewDate && maxViewDate) {
139
- const minSType = minScale.type;
140
- const weekScale = taskScaleList.find(item => item.type === 'week');
141
- let gapTime = 1000 * 60 * 60 * 24;
142
- switch (minScale.type) {
143
- case 'hour':
144
- gapTime = 1000 * 60 * 60;
145
- break;
146
- case 'minute':
147
- gapTime = 1000 * 60;
148
- break;
149
- case 'second':
150
- gapTime = 1000;
151
- break;
152
- default: {
153
- break;
154
- }
155
- }
156
- const currTime = minViewDate.getTime();
157
- const diffDayNum = maxViewDate.getTime() - minViewDate.getTime();
158
- const countSize = Math.max(5, Math.floor(diffDayNum / gapTime) + 1);
205
+ if (minScale && scaleUnit && scaleDateList.length) {
159
206
  const renderListMaps = {
160
207
  year: [],
161
208
  quarter: [],
@@ -179,7 +226,7 @@ export default defineVxeComponent({
179
226
  second: {}
180
227
  };
181
228
  const handleData = (type, colMaps, minCol) => {
182
- if (minSType === type) {
229
+ if (minScale.type === type) {
183
230
  return;
184
231
  }
185
232
  const currCol = colMaps[type];
@@ -197,14 +244,14 @@ export default defineVxeComponent({
197
244
  currGpCol.children.push(minCol);
198
245
  }
199
246
  };
200
- for (let i = 0; i < countSize; i++) {
201
- const itemDate = new Date(currTime + (i * gapTime));
247
+ for (let i = 0; i < scaleDateList.length; i++) {
248
+ const itemDate = scaleDateList[i];
202
249
  const [yyyy, MM, dd, HH, mm, ss] = XEUtils.toDateString(itemDate, 'yyyy-M-d-H-m-s').split('-');
203
250
  const e = itemDate.getDay();
204
251
  const E = e + 1;
205
252
  const q = Math.ceil((itemDate.getMonth() + 1) / 3);
206
253
  const W = XEUtils.getYearWeek(itemDate, weekScale ? weekScale.startDay : undefined);
207
- const dateObj = { yy: yyyy, M: MM, d: dd, H: HH, m: mm, s: ss, q, W, E, e };
254
+ const dateObj = { date: itemDate, yy: yyyy, M: MM, d: dd, H: HH, m: mm, s: ss, q, W, E, e };
208
255
  const colMaps = {
209
256
  year: {
210
257
  field: yyyy,
@@ -252,7 +299,7 @@ export default defineVxeComponent({
252
299
  dateObj
253
300
  }
254
301
  };
255
- const minCol = colMaps[minSType];
302
+ const minCol = colMaps[minScale.type];
256
303
  if (minScale.level < 19) {
257
304
  handleData('year', colMaps, minCol);
258
305
  }
@@ -280,7 +327,7 @@ export default defineVxeComponent({
280
327
  fullCols.push(minCol);
281
328
  }
282
329
  taskScaleList.forEach(scaleItem => {
283
- if (scaleItem.type === minSType) {
330
+ if (scaleItem.type === minScale.type) {
284
331
  groupCols.push({
285
332
  scaleItem,
286
333
  columns: fullCols
@@ -299,6 +346,211 @@ export default defineVxeComponent({
299
346
  columns: list
300
347
  });
301
348
  });
349
+ }
350
+ return {
351
+ fullCols,
352
+ groupCols
353
+ };
354
+ };
355
+ const createChartRender = (fullCols) => {
356
+ const { minViewDate } = reactData;
357
+ const minScale = computeMinScale.value;
358
+ const scaleUnit = computeScaleUnit.value;
359
+ const weekScale = computeWeekScale.value;
360
+ switch (scaleUnit) {
361
+ case 'year': {
362
+ const indexMaps = {};
363
+ fullCols.forEach(({ dateObj }, i) => {
364
+ const yyyyMM = XEUtils.toDateString(dateObj.date, 'yyyy');
365
+ indexMaps[yyyyMM] = i;
366
+ });
367
+ return (startValue, endValue) => {
368
+ const startDate = parseStringDate(startValue);
369
+ const endDate = parseStringDate(endValue);
370
+ const startStr = XEUtils.toDateString(startDate, 'yyyy');
371
+ const startFirstDate = XEUtils.getWhatYear(startDate, 0, 'first');
372
+ const endStr = XEUtils.toDateString(endDate, 'yyyy');
373
+ const endFirstDate = XEUtils.getWhatYear(endDate, 0, 'first');
374
+ const dateSize = Math.floor((XEUtils.getWhatYear(endDate, 1, 'first').getTime() - endFirstDate.getTime()) / dayMs);
375
+ const subtract = (startDate.getTime() - startFirstDate.getTime()) / dayMs / dateSize;
376
+ const addSize = Math.max(0, (endDate.getTime() - endFirstDate.getTime()) / dayMs + 1) / dateSize;
377
+ const offsetLeftSize = (indexMaps[startStr] || 0) + subtract;
378
+ return {
379
+ offsetLeftSize,
380
+ offsetWidthSize: (indexMaps[endStr] || 0) - offsetLeftSize + addSize
381
+ };
382
+ };
383
+ }
384
+ case 'quarter': {
385
+ const indexMaps = {};
386
+ fullCols.forEach(({ dateObj }, i) => {
387
+ const q = XEUtils.toDateString(dateObj.date, 'yyyy-q');
388
+ indexMaps[q] = i;
389
+ });
390
+ return (startValue, endValue) => {
391
+ const startDate = parseStringDate(startValue);
392
+ const endDate = parseStringDate(endValue);
393
+ const startStr = XEUtils.toDateString(startDate, 'yyyy-q');
394
+ const startFirstDate = XEUtils.getWhatQuarter(startDate, 0, 'first');
395
+ const endStr = XEUtils.toDateString(endDate, 'yyyy-q');
396
+ const endFirstDate = XEUtils.getWhatQuarter(endDate, 0, 'first');
397
+ const dateSize = Math.floor((XEUtils.getWhatQuarter(endDate, 1, 'first').getTime() - endFirstDate.getTime()) / dayMs);
398
+ const subtract = (startDate.getTime() - startFirstDate.getTime()) / dayMs / dateSize;
399
+ const addSize = Math.max(0, (endDate.getTime() - endFirstDate.getTime()) / dayMs + 1) / dateSize;
400
+ const offsetLeftSize = (indexMaps[startStr] || 0) + subtract;
401
+ return {
402
+ offsetLeftSize,
403
+ offsetWidthSize: (indexMaps[endStr] || 0) - offsetLeftSize + addSize
404
+ };
405
+ };
406
+ }
407
+ case 'month': {
408
+ const indexMaps = {};
409
+ fullCols.forEach(({ dateObj }, i) => {
410
+ const yyyyMM = XEUtils.toDateString(dateObj.date, 'yyyy-MM');
411
+ indexMaps[yyyyMM] = i;
412
+ });
413
+ return (startValue, endValue) => {
414
+ const startDate = parseStringDate(startValue);
415
+ const endDate = parseStringDate(endValue);
416
+ const startStr = XEUtils.toDateString(startDate, 'yyyy-MM');
417
+ const startFirstDate = XEUtils.getWhatMonth(startDate, 0, 'first');
418
+ const endStr = XEUtils.toDateString(endDate, 'yyyy-MM');
419
+ const endFirstDate = XEUtils.getWhatMonth(endDate, 0, 'first');
420
+ const dateSize = Math.floor((XEUtils.getWhatMonth(endDate, 1, 'first').getTime() - endFirstDate.getTime()) / dayMs);
421
+ const subtract = (startDate.getTime() - startFirstDate.getTime()) / dayMs / dateSize;
422
+ const addSize = Math.max(0, (endDate.getTime() - endFirstDate.getTime()) / dayMs + 1) / dateSize;
423
+ const offsetLeftSize = (indexMaps[startStr] || 0) + subtract;
424
+ return {
425
+ offsetLeftSize,
426
+ offsetWidthSize: (indexMaps[endStr] || 0) - offsetLeftSize + addSize
427
+ };
428
+ };
429
+ }
430
+ case 'week': {
431
+ const indexMaps = {};
432
+ fullCols.forEach(({ dateObj }, i) => {
433
+ const yyyyW = XEUtils.toDateString(dateObj.date, 'yyyy-W', { firstDay: weekScale ? weekScale.startDay : undefined });
434
+ indexMaps[yyyyW] = i;
435
+ });
436
+ return (startValue, endValue) => {
437
+ const startDate = parseStringDate(startValue);
438
+ const endDate = parseStringDate(endValue);
439
+ const startStr = XEUtils.toDateString(startDate, 'yyyy-W', { firstDay: weekScale ? weekScale.startDay : undefined });
440
+ const startFirstDate = XEUtils.getWhatWeek(startDate, 0, weekScale ? weekScale.startDay : undefined, weekScale ? weekScale.startDay : undefined);
441
+ const endStr = XEUtils.toDateString(endDate, 'yyyy-W', { firstDay: weekScale ? weekScale.startDay : undefined });
442
+ const endFirstDate = XEUtils.getWhatWeek(endDate, 0, weekScale ? weekScale.startDay : undefined, weekScale ? weekScale.startDay : undefined);
443
+ const dateSize = Math.floor((XEUtils.getWhatWeek(endDate, 1, weekScale ? weekScale.startDay : undefined, weekScale ? weekScale.startDay : undefined).getTime() - endFirstDate.getTime()) / dayMs);
444
+ const subtract = (startDate.getTime() - startFirstDate.getTime()) / dayMs / dateSize;
445
+ const addSize = Math.max(0, (endDate.getTime() - endFirstDate.getTime()) / dayMs + 1) / dateSize;
446
+ const offsetLeftSize = (indexMaps[startStr] || 0) + subtract;
447
+ return {
448
+ offsetLeftSize,
449
+ offsetWidthSize: (indexMaps[endStr] || 0) - offsetLeftSize + addSize
450
+ };
451
+ };
452
+ }
453
+ case 'day':
454
+ case 'date': {
455
+ const indexMaps = {};
456
+ fullCols.forEach(({ dateObj }, i) => {
457
+ const yyyyMM = XEUtils.toDateString(dateObj.date, 'yyyy-MM-dd');
458
+ indexMaps[yyyyMM] = i;
459
+ });
460
+ return (startValue, endValue) => {
461
+ const startDate = parseStringDate(startValue);
462
+ const endDate = parseStringDate(endValue);
463
+ const startStr = XEUtils.toDateString(startDate, 'yyyy-MM-dd');
464
+ const startFirstDate = XEUtils.getWhatDay(startDate, 0, 'first');
465
+ const endStr = XEUtils.toDateString(endDate, 'yyyy-MM-dd');
466
+ const endFirstDate = XEUtils.getWhatDay(endDate, 0, 'first');
467
+ const minuteSize = Math.floor((XEUtils.getWhatDay(endDate, 1, 'first').getTime() - endFirstDate.getTime()) / minuteMs);
468
+ const subtract = (startDate.getTime() - startFirstDate.getTime()) / minuteMs / minuteSize;
469
+ const addSize = Math.max(0, (endDate.getTime() - endFirstDate.getTime()) / minuteMs + 1) / minuteSize;
470
+ const offsetLeftSize = (indexMaps[startStr] || 0) + subtract;
471
+ return {
472
+ offsetLeftSize,
473
+ offsetWidthSize: (indexMaps[endStr] || 0) - offsetLeftSize + addSize
474
+ };
475
+ };
476
+ }
477
+ case 'hour': {
478
+ const indexMaps = {};
479
+ fullCols.forEach(({ dateObj }, i) => {
480
+ const yyyyMM = XEUtils.toDateString(dateObj.date, 'yyyy-MM-dd HH');
481
+ indexMaps[yyyyMM] = i;
482
+ });
483
+ return (startValue, endValue) => {
484
+ const startDate = parseStringDate(startValue);
485
+ const endDate = parseStringDate(endValue);
486
+ const startStr = XEUtils.toDateString(startDate, 'yyyy-MM-dd HH');
487
+ const startFirstDate = XEUtils.getWhatHours(startDate, 0, 'first');
488
+ const endStr = XEUtils.toDateString(endDate, 'yyyy-MM-dd HH');
489
+ const endFirstDate = XEUtils.getWhatHours(endDate, 0, 'first');
490
+ const minuteSize = Math.floor((XEUtils.getWhatHours(endDate, 1, 'first').getTime() - endFirstDate.getTime()) / minuteMs);
491
+ const subtract = (startDate.getTime() - startFirstDate.getTime()) / minuteMs / minuteSize;
492
+ const addSize = Math.max(0, (endDate.getTime() - endFirstDate.getTime()) / minuteMs + 1) / minuteSize;
493
+ const offsetLeftSize = (indexMaps[startStr] || 0) + subtract;
494
+ return {
495
+ offsetLeftSize,
496
+ offsetWidthSize: (indexMaps[endStr] || 0) - offsetLeftSize + addSize
497
+ };
498
+ };
499
+ }
500
+ case 'minute': {
501
+ const indexMaps = {};
502
+ fullCols.forEach(({ dateObj }, i) => {
503
+ const yyyyMM = XEUtils.toDateString(dateObj.date, 'yyyy-MM-dd HH:mm');
504
+ indexMaps[yyyyMM] = i;
505
+ });
506
+ return (startValue, endValue) => {
507
+ const startDate = parseStringDate(startValue);
508
+ const endDate = parseStringDate(endValue);
509
+ const startStr = XEUtils.toDateString(startDate, 'yyyy-MM-dd HH:mm');
510
+ const startFirstDate = XEUtils.getWhatMinutes(startDate, 0, 'first');
511
+ const endStr = XEUtils.toDateString(endDate, 'yyyy-MM-dd HH:mm');
512
+ const endFirstDate = XEUtils.getWhatMinutes(endDate, 0, 'first');
513
+ const minuteSize = Math.floor((XEUtils.getWhatMinutes(endDate, 1, 'first').getTime() - endFirstDate.getTime()) / minuteMs);
514
+ const subtract = (startDate.getTime() - startFirstDate.getTime()) / minuteMs / minuteSize;
515
+ const addSize = Math.max(0, (endDate.getTime() - endFirstDate.getTime()) / minuteMs + 1) / minuteSize;
516
+ const offsetLeftSize = (indexMaps[startStr] || 0) + subtract;
517
+ return {
518
+ offsetLeftSize,
519
+ offsetWidthSize: (indexMaps[endStr] || 0) - offsetLeftSize + addSize
520
+ };
521
+ };
522
+ }
523
+ case 'second': {
524
+ const gapTime = getStandardGapTime(minScale.type);
525
+ return (startValue, endValue) => {
526
+ const startDate = parseStringDate(startValue);
527
+ const endDate = parseStringDate(endValue);
528
+ let offsetLeftSize = 0;
529
+ let offsetWidthSize = 0;
530
+ if (minViewDate) {
531
+ offsetLeftSize = (startDate.getTime() - minViewDate.getTime()) / gapTime;
532
+ offsetWidthSize = ((endDate.getTime() - startDate.getTime()) / gapTime) + 1;
533
+ }
534
+ return {
535
+ offsetLeftSize,
536
+ offsetWidthSize
537
+ };
538
+ };
539
+ }
540
+ }
541
+ return () => {
542
+ return {
543
+ offsetLeftSize: 0,
544
+ offsetWidthSize: 0
545
+ };
546
+ };
547
+ };
548
+ const handleParseColumn = () => {
549
+ const ganttProps = $xeGantt.props;
550
+ const { treeConfig } = ganttProps;
551
+ const { minViewDate, maxViewDate } = reactData;
552
+ const { fullCols, groupCols } = handleColumnHeader();
553
+ if (minViewDate && maxViewDate && fullCols.length) {
302
554
  const $xeTable = internalData.xeTable;
303
555
  if ($xeTable) {
304
556
  const startField = computeStartField.value;
@@ -313,20 +565,18 @@ export default defineVxeComponent({
313
565
  const { transform } = treeOpts;
314
566
  const childrenField = treeOpts.children || treeOpts.childrenField;
315
567
  const ctMaps = {};
568
+ const renderFn = createChartRender(fullCols);
316
569
  const handleParseRender = (row) => {
317
570
  const rowid = $xeTable.getRowid(row);
318
571
  const startValue = XEUtils.get(row, startField);
319
572
  const endValue = XEUtils.get(row, endField);
320
573
  if (startValue && endValue) {
321
- const startDate = parseStringDate(startValue);
322
- const endDate = parseStringDate(endValue);
323
- const oLeftSize = Math.floor((startDate.getTime() - minViewDate.getTime()) / gapTime);
324
- const oWidthSize = Math.floor((endDate.getTime() - startDate.getTime()) / gapTime) + 1;
574
+ const { offsetLeftSize, offsetWidthSize } = renderFn(startValue, endValue);
325
575
  ctMaps[rowid] = {
326
576
  row,
327
577
  rowid,
328
- oLeftSize,
329
- oWidthSize
578
+ oLeftSize: offsetLeftSize,
579
+ oWidthSize: offsetWidthSize
330
580
  };
331
581
  }
332
582
  };
@@ -575,11 +825,11 @@ export default defineVxeComponent({
575
825
  return new Promise(resolve => {
576
826
  const { rceTimeout, rceRunTime } = internalData;
577
827
  const $xeTable = internalData.xeTable;
578
- let refreshDelay = 50;
828
+ let refreshDelay = 30;
579
829
  if ($xeTable) {
580
830
  const { computeResizeOpts } = $xeTable.getComputeMaps();
581
831
  const resizeOpts = computeResizeOpts.value;
582
- refreshDelay = resizeOpts.refreshDelay || 50;
832
+ refreshDelay = resizeOpts.refreshDelay || refreshDelay;
583
833
  }
584
834
  if (rceTimeout) {
585
835
  clearTimeout(rceTimeout);
@@ -880,7 +1130,14 @@ export default defineVxeComponent({
880
1130
  const ganttViewMethods = {
881
1131
  refreshData() {
882
1132
  handleUpdateData();
883
- return handleLazyRecalculate();
1133
+ handleRecalculateStyle();
1134
+ return nextTick().then(() => {
1135
+ const $xeTable = internalData.xeTable;
1136
+ handleRecalculateStyle();
1137
+ if ($xeTable) {
1138
+ return $xeTable.recalculate();
1139
+ }
1140
+ });
884
1141
  },
885
1142
  updateViewData() {
886
1143
  const $xeTable = internalData.xeTable;
@@ -155,6 +155,18 @@ export default defineVxeComponent({
155
155
  const computeTaskSplitOpts = computed(() => {
156
156
  return Object.assign({}, getConfig().gantt.taskSplitConfig, props.taskSplitConfig);
157
157
  });
158
+ const computeScaleUnit = computed(() => {
159
+ const minScale = computeMinScale.value;
160
+ return minScale ? minScale.type : 'date';
161
+ });
162
+ const computeMinScale = computed(() => {
163
+ const { taskScaleList } = reactData;
164
+ return XEUtils.last(taskScaleList);
165
+ });
166
+ const computeWeekScale = computed(() => {
167
+ const { taskScaleList } = reactData;
168
+ return taskScaleList.find(item => item.type === 'week');
169
+ });
158
170
  const computeTaskScaleConfs = computed(() => {
159
171
  const taskViewOpts = computeTaskViewOpts.value;
160
172
  const { scales } = taskViewOpts;
@@ -373,6 +385,9 @@ export default defineVxeComponent({
373
385
  computeTaskBarResizeOpts,
374
386
  computeTaskSplitOpts,
375
387
  computeTaskScaleConfs,
388
+ computeScaleUnit,
389
+ computeMinScale,
390
+ computeWeekScale,
376
391
  computeTitleField,
377
392
  computeStartField,
378
393
  computeEndField,
@@ -2075,6 +2090,7 @@ export default defineVxeComponent({
2075
2090
  });
2076
2091
  watch(computeTaskScaleConfs, () => {
2077
2092
  handleTaskScaleConfig();
2093
+ $xeGantt.refreshTaskView();
2078
2094
  });
2079
2095
  hooks.forEach((options) => {
2080
2096
  const { setupGantt } = options;
@@ -16,3 +16,14 @@ export function getCalcHeight(height) {
16
16
  export function getCellRestHeight(rowRest, cellOpts, rowOpts, defaultRowHeight) {
17
17
  return rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight;
18
18
  }
19
+ export function getStandardGapTime(type) {
20
+ switch (type) {
21
+ case 'hour':
22
+ return 1000 * 60 * 60;
23
+ case 'minute':
24
+ return 1000 * 60;
25
+ case 'second':
26
+ return 1000;
27
+ }
28
+ return 1000 * 60 * 60 * 24;
29
+ }
package/es/ui/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { VxeUI } from '@vxe-ui/core';
2
2
  import { errLog } from './src/log';
3
3
  const { setConfig, setIcon, checkVersion } = VxeUI;
4
- VxeUI.ganttVersion = "4.0.27";
4
+ VxeUI.ganttVersion = "4.1.0";
5
5
  setConfig({
6
6
  gantt: {
7
7
  // size: null,
package/es/ui/src/log.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { VxeUI } from '@vxe-ui/core';
2
2
  const { log } = VxeUI;
3
- const version = `gantt v${"4.0.27"}`;
3
+ const version = `gantt v${"4.1.0"}`;
4
4
  export const warnLog = log.create('warn', version);
5
5
  export const errLog = log.create('error', version);
@@ -69,12 +69,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
69
69
  }, $rowIndex) => {
70
70
  const {
71
71
  type,
72
+ titleFormat,
72
73
  titleMethod,
73
74
  headerCellStyle,
74
75
  slots
75
76
  } = scaleItem;
76
77
  const titleSlot = slots ? slots.title : null;
77
- const todayValue = showNowLine && $rowIndex === headerGroups.length - 1 ? todayDateMaps[type] : null;
78
+ const isLast = $rowIndex === headerGroups.length - 1;
79
+ const todayValue = isLast && showNowLine ? todayDateMaps[type] : null;
78
80
  return (0, _vue.h)('tr', {
79
81
  key: $rowIndex
80
82
  }, columns.map((column, cIndex) => {
@@ -90,6 +92,10 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
90
92
  } else {
91
93
  label = getI18n(`vxe.gantt.${!$rowIndex && headerGroups.length > 1 ? 'tFullFormat' : 'tSimpleFormat'}.${type}`, dateObj);
92
94
  }
95
+ } else {
96
+ if (isLast && scaleItem.type === 'week') {
97
+ label = getI18n(`vxe.gantt.tSimpleFormat.${type}`, dateObj);
98
+ }
93
99
  }
94
100
  let cellVNs = label;
95
101
  const ctParams = {
@@ -105,6 +111,8 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
105
111
  cellVNs = $xeGantt.callSlot(titleSlot, ctParams);
106
112
  } else if (titleMethod) {
107
113
  cellVNs = `${titleMethod(ctParams)}`;
114
+ } else if (titleFormat) {
115
+ cellVNs = _xeUtils.default.toDateString(dateObj.date, titleFormat);
108
116
  }
109
117
  let cellStys = {};
110
118
  if (headerCellStyle) {
@@ -1 +1 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _vue=require("vue"),_comp=require("../../ui/src/comp"),_core=require("@vxe-ui/core"),_xeUtils=_interopRequireDefault(require("xe-utils"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}let getI18n=_core.VxeUI.getI18n,sourceType="gantt",viewType="header";var _default=exports.default=(0,_comp.defineVxeComponent)({name:"VxeGanttViewHeader",setup(){let w=(0,_vue.inject)("$xeGantt",{}),t=(0,_vue.inject)("$xeGanttView",{}),a=w.getComputeMaps().computeTaskViewOpts,{reactData:n,internalData:u}=t,o=(0,_vue.ref)(),i=(0,_vue.ref)(),v=(0,_vue.ref)(),s=(0,_vue.ref)();return(0,_vue.onMounted)(()=>{var e=u.elemStore,t="main-header-";e[t+"wrapper"]=o,e[t+"scroll"]=i,e[t+"table"]=v,e[t+"xSpace"]=s}),(0,_vue.onUnmounted)(()=>{var e=u.elemStore,t="main-header-";e[t+"wrapper"]=null,e[t+"scroll"]=null,e[t+"table"]=null,e[t+"xSpace"]=null}),()=>{let{headerGroups:x,viewCellWidth:l}=n,{todayDateMaps:r,visibleColumn:e}=u;let m=a.value.showNowLine;return(0,_vue.h)("div",{ref:o,class:"vxe-gantt-view--header-wrapper"},[(0,_vue.h)("div",{ref:i,class:"vxe-gantt-view--header-inner-wrapper",onScroll:t.triggerHeaderScrollEvent},[(0,_vue.h)("div",{ref:s,class:"vxe-body--x-space"}),(0,_vue.h)("table",{ref:v,class:"vxe-gantt-view--header-table"},[(0,_vue.h)("colgroup",{},e.map((e,t)=>(0,_vue.h)("col",{key:t,style:{width:l+"px"}}))),(0,_vue.h)("thead",{},x.map(({scaleItem:v,columns:e},s)=>{let{type:p,titleMethod:d,headerCellStyle:c,slots:t}=v,_=t?t.title:null,h=m&&s===x.length-1?r[p]:null;return(0,_vue.h)("tr",{key:s},e.map((e,t)=>{var{field:l,childCount:r,dateObj:a}=e;let n=""+e.title,u=n=s<x.length-1?"day"===v.type?getI18n("vxe.gantt.dayss.w"+a.e):getI18n(`vxe.gantt.${!s&&1<x.length?"tFullFormat":"tSimpleFormat"}.`+p,a):n,o={source:sourceType,type:viewType,column:e,scaleObj:v,title:n,dateObj:a,$rowIndex:s},i=(_?u=w.callSlot(_,o):d&&(u=""+d(o)),{});return c&&(i=_xeUtils.default.isFunction(c)?c(o):c),(0,_vue.h)("th",{key:t,class:["vxe-gantt-view--header-column",{"is--now":m&&h&&h===l}],colspan:r||null,title:_?null:n,style:i,onContextmenu(e){w.handleTaskHeaderContextmenuEvent(e,o)}},u)}))}))])])])}}});
1
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _vue=require("vue"),_comp=require("../../ui/src/comp"),_core=require("@vxe-ui/core"),_xeUtils=_interopRequireDefault(require("xe-utils"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}let getI18n=_core.VxeUI.getI18n,sourceType="gantt",viewType="header";var _default=exports.default=(0,_comp.defineVxeComponent)({name:"VxeGanttViewHeader",setup(){let f=(0,_vue.inject)("$xeGantt",{}),t=(0,_vue.inject)("$xeGanttView",{}),r=f.getComputeMaps().computeTaskViewOpts,{reactData:n,internalData:u}=t,o=(0,_vue.ref)(),i=(0,_vue.ref)(),v=(0,_vue.ref)(),s=(0,_vue.ref)();return(0,_vue.onMounted)(()=>{var e=u.elemStore,t="main-header-";e[t+"wrapper"]=o,e[t+"scroll"]=i,e[t+"table"]=v,e[t+"xSpace"]=s}),(0,_vue.onUnmounted)(()=>{var e=u.elemStore,t="main-header-";e[t+"wrapper"]=null,e[t+"scroll"]=null,e[t+"table"]=null,e[t+"xSpace"]=null}),()=>{let{headerGroups:g,viewCellWidth:l}=n,{todayDateMaps:a,visibleColumn:e}=u;let w=r.value.showNowLine;return(0,_vue.h)("div",{ref:o,class:"vxe-gantt-view--header-wrapper"},[(0,_vue.h)("div",{ref:i,class:"vxe-gantt-view--header-inner-wrapper",onScroll:t.triggerHeaderScrollEvent},[(0,_vue.h)("div",{ref:s,class:"vxe-body--x-space"}),(0,_vue.h)("table",{ref:v,class:"vxe-gantt-view--header-table"},[(0,_vue.h)("colgroup",{},e.map((e,t)=>(0,_vue.h)("col",{key:t,style:{width:l+"px"}}))),(0,_vue.h)("thead",{},g.map(({scaleItem:v,columns:e},s)=>{let{type:p,titleFormat:d,titleMethod:c,headerCellStyle:_,slots:t}=v,h=t?t.title:null,m=s===g.length-1,x=m&&w?a[p]:null;return(0,_vue.h)("tr",{key:s},e.map((e,t)=>{var{field:l,childCount:a,dateObj:r}=e;let n=""+e.title,u=(s<g.length-1?n="day"===v.type?getI18n("vxe.gantt.dayss.w"+r.e):getI18n(`vxe.gantt.${!s&&1<g.length?"tFullFormat":"tSimpleFormat"}.`+p,r):m&&"week"===v.type&&(n=getI18n("vxe.gantt.tSimpleFormat."+p,r)),n),o={source:sourceType,type:viewType,column:e,scaleObj:v,title:n,dateObj:r,$rowIndex:s},i=(h?u=f.callSlot(h,o):c?u=""+c(o):d&&(u=_xeUtils.default.toDateString(r.date,d)),{});return _&&(i=_xeUtils.default.isFunction(_)?_(o):_),(0,_vue.h)("th",{key:t,class:["vxe-gantt-view--header-column",{"is--now":w&&x&&x===l}],colspan:a||null,title:h?null:n,style:i,onContextmenu(e){f.handleTaskHeaderContextmenuEvent(e,o)}},u)}))}))])])])}}});