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.
- package/es/gantt/src/gantt-header.js +11 -2
- package/es/gantt/src/gantt-view.js +302 -45
- package/es/gantt/src/gantt.js +16 -0
- package/es/gantt/src/util.js +11 -0
- package/es/ui/index.js +1 -1
- package/es/ui/src/log.js +1 -1
- package/lib/gantt/src/gantt-header.js +9 -1
- package/lib/gantt/src/gantt-header.min.js +1 -1
- package/lib/gantt/src/gantt-view.js +352 -48
- package/lib/gantt/src/gantt-view.min.js +1 -1
- package/lib/gantt/src/gantt.js +20 -0
- package/lib/gantt/src/gantt.min.js +1 -1
- package/lib/gantt/src/util.js +12 -0
- package/lib/gantt/src/util.min.js +1 -1
- package/lib/index.umd.js +397 -53
- package/lib/index.umd.min.js +1 -1
- package/lib/ui/index.js +1 -1
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/log.js +1 -1
- package/lib/ui/src/log.min.js +1 -1
- package/package.json +3 -3
- package/packages/gantt/src/gantt-header.ts +9 -2
- package/packages/gantt/src/gantt-view.ts +305 -44
- package/packages/gantt/src/gantt.ts +19 -0
- package/packages/gantt/src/util.ts +13 -0
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
135
|
-
const minScale =
|
|
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 &&
|
|
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 (
|
|
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 <
|
|
201
|
-
const itemDate =
|
|
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[
|
|
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 ===
|
|
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
|
|
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 =
|
|
828
|
+
let refreshDelay = 30;
|
|
579
829
|
if ($xeTable) {
|
|
580
830
|
const { computeResizeOpts } = $xeTable.getComputeMaps();
|
|
581
831
|
const resizeOpts = computeResizeOpts.value;
|
|
582
|
-
refreshDelay = resizeOpts.refreshDelay ||
|
|
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
|
-
|
|
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;
|
package/es/gantt/src/gantt.js
CHANGED
|
@@ -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;
|
package/es/gantt/src/util.js
CHANGED
|
@@ -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
package/es/ui/src/log.js
CHANGED
|
@@ -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
|
|
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
|
|
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)}))}))])])])}}});
|