vxe-gantt 4.0.4 → 4.0.6
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/emits.js +3 -1
- package/es/gantt/src/gantt-chart.js +18 -4
- package/es/gantt/src/gantt-header.js +29 -6
- package/es/gantt/src/gantt-view.js +232 -89
- package/es/gantt/src/gantt.js +60 -3
- package/es/gantt/src/util.js +6 -0
- package/es/gantt/style.css +2 -0
- package/es/gantt/style.min.css +1 -1
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/ui/index.js +6 -1
- package/es/ui/src/log.js +1 -1
- package/es/vxe-gantt/style.css +2 -0
- package/es/vxe-gantt/style.min.css +1 -1
- package/lib/gantt/src/emits.js +1 -1
- package/lib/gantt/src/emits.min.js +1 -1
- package/lib/gantt/src/gantt-chart.js +24 -4
- package/lib/gantt/src/gantt-chart.min.js +1 -1
- package/lib/gantt/src/gantt-header.js +44 -6
- package/lib/gantt/src/gantt-header.min.js +1 -1
- package/lib/gantt/src/gantt-view.js +255 -99
- package/lib/gantt/src/gantt-view.min.js +1 -1
- package/lib/gantt/src/gantt.js +75 -2
- package/lib/gantt/src/gantt.min.js +1 -1
- package/lib/gantt/src/util.js +7 -0
- package/lib/gantt/src/util.min.js +1 -1
- package/lib/gantt/style/style.css +2 -0
- package/lib/gantt/style/style.min.css +1 -1
- package/lib/index.umd.js +461 -121
- package/lib/index.umd.min.js +1 -1
- package/lib/style.css +1 -1
- package/lib/style.min.css +1 -1
- package/lib/ui/index.js +6 -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/lib/vxe-gantt/style/style.css +2 -0
- package/lib/vxe-gantt/style/style.min.css +1 -1
- package/package.json +3 -3
- package/packages/gantt/src/emits.ts +3 -1
- package/packages/gantt/src/gantt-chart.ts +20 -4
- package/packages/gantt/src/gantt-header.ts +30 -7
- package/packages/gantt/src/gantt-view.ts +243 -93
- package/packages/gantt/src/gantt.ts +69 -2
- package/packages/gantt/src/util.ts +7 -0
- package/packages/ui/index.ts +5 -0
- package/styles/components/gantt-module/gantt-chart.scss +2 -0
- package/styles/theme/base.scss +1 -1
package/es/gantt/src/emits.js
CHANGED
|
@@ -30,13 +30,28 @@ export default defineVxeComponent({
|
|
|
30
30
|
const progressField = computeProgressField.value;
|
|
31
31
|
const taskBarOpts = computeTaskBarOpts.value;
|
|
32
32
|
const { showProgress, showContent, contentMethod, barStyle } = taskBarOpts;
|
|
33
|
-
const
|
|
33
|
+
const isBarRowStyle = XEUtils.isFunction(barStyle);
|
|
34
|
+
const barStyObj = (barStyle ? (isBarRowStyle ? barStyle({ row, $gantt: $xeGantt }) : barStyle) : {}) || {};
|
|
35
|
+
const { round } = barStyObj;
|
|
34
36
|
const rowRest = fullAllDataRowIdData[rowid] || {};
|
|
35
37
|
const resizeHeight = resizeHeightFlag ? rowRest.resizeHeight : 0;
|
|
36
38
|
const isRsHeight = resizeHeight > 0;
|
|
37
39
|
const cellHeight = getCellRestHeight(rowRest, cellOpts, rowOpts, defaultRowHeight);
|
|
38
40
|
let title = getStringValue(XEUtils.get(row, titleField));
|
|
39
41
|
const progressValue = showProgress ? Math.min(100, Math.max(0, XEUtils.toNumber(XEUtils.get(row, progressField)))) : 0;
|
|
42
|
+
const vbStyle = {};
|
|
43
|
+
const vpStyle = {
|
|
44
|
+
width: `${progressValue || 0}%`
|
|
45
|
+
};
|
|
46
|
+
if (isBarRowStyle) {
|
|
47
|
+
const { bgColor, completedBgColor } = barStyObj;
|
|
48
|
+
if (bgColor) {
|
|
49
|
+
vbStyle.backgroundColor = bgColor;
|
|
50
|
+
}
|
|
51
|
+
if (completedBgColor) {
|
|
52
|
+
vpStyle.backgroundColor = completedBgColor;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
40
55
|
if (contentMethod) {
|
|
41
56
|
title = getStringValue(contentMethod({ row, title }));
|
|
42
57
|
}
|
|
@@ -53,6 +68,7 @@ export default defineVxeComponent({
|
|
|
53
68
|
}, [
|
|
54
69
|
h('div', {
|
|
55
70
|
class: taskBarSlot ? 'vxe-gantt-view--chart-custom-bar' : 'vxe-gantt-view--chart-bar',
|
|
71
|
+
style: vbStyle,
|
|
56
72
|
rowid,
|
|
57
73
|
onClick(evnt) {
|
|
58
74
|
$xeGantt.handleTaskBarClickEvent(evnt, { row });
|
|
@@ -66,9 +82,7 @@ export default defineVxeComponent({
|
|
|
66
82
|
showProgress
|
|
67
83
|
? h('div', {
|
|
68
84
|
class: 'vxe-gantt-view--chart-progress',
|
|
69
|
-
style:
|
|
70
|
-
width: `${progressValue || 0}%`
|
|
71
|
-
}
|
|
85
|
+
style: vpStyle
|
|
72
86
|
})
|
|
73
87
|
: renderEmptyElement($xeGantt),
|
|
74
88
|
showContent
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { h, inject, ref, onMounted, onUnmounted } from 'vue';
|
|
2
2
|
import { defineVxeComponent } from '../../ui/src/comp';
|
|
3
|
+
import { VxeUI } from '@vxe-ui/core';
|
|
4
|
+
const { getI18n } = VxeUI;
|
|
3
5
|
export default defineVxeComponent({
|
|
4
6
|
name: 'VxeGanttViewHeader',
|
|
5
7
|
setup() {
|
|
8
|
+
const $xeGantt = inject('$xeGantt', {});
|
|
6
9
|
const $xeGanttView = inject('$xeGanttView', {});
|
|
7
10
|
const { reactData, internalData } = $xeGanttView;
|
|
8
11
|
const refElem = ref();
|
|
@@ -36,16 +39,36 @@ export default defineVxeComponent({
|
|
|
36
39
|
}
|
|
37
40
|
});
|
|
38
41
|
})),
|
|
39
|
-
h('thead', {}, headerGroups.map((
|
|
42
|
+
h('thead', {}, headerGroups.map(({ scaleItem, columns }, $rowIndex) => {
|
|
43
|
+
const { type, titleMethod, slots } = scaleItem;
|
|
44
|
+
const titleSlot = slots ? slots.title : null;
|
|
40
45
|
return h('tr', {
|
|
41
|
-
key:
|
|
42
|
-
},
|
|
46
|
+
key: $rowIndex
|
|
47
|
+
}, columns.map((column, cIndex) => {
|
|
48
|
+
const { childCount, dateObj } = column;
|
|
49
|
+
let label = `${column.title}`;
|
|
50
|
+
if ($rowIndex < headerGroups.length - 1) {
|
|
51
|
+
if (scaleItem.type === 'day') {
|
|
52
|
+
label = getI18n(`vxe.gantt.dayss.w${dateObj.e}`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
label = getI18n(`vxe.gantt.${!$rowIndex && headerGroups.length > 1 ? 'tFullFormat' : 'tSimpleFormat'}.${type}`, dateObj);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
let cellVNs = label;
|
|
59
|
+
const ctParams = { scaleObj: scaleItem, title: label, dateObj: dateObj, $rowIndex };
|
|
60
|
+
if (titleSlot) {
|
|
61
|
+
cellVNs = $xeGantt.callSlot(titleSlot, ctParams);
|
|
62
|
+
}
|
|
63
|
+
else if (titleMethod) {
|
|
64
|
+
cellVNs = `${titleMethod(ctParams)}`;
|
|
65
|
+
}
|
|
43
66
|
return h('th', {
|
|
44
67
|
key: cIndex,
|
|
45
68
|
class: 'vxe-gantt-view--header-column',
|
|
46
|
-
colspan:
|
|
47
|
-
title:
|
|
48
|
-
},
|
|
69
|
+
colspan: childCount || null,
|
|
70
|
+
title: titleSlot ? null : label
|
|
71
|
+
}, cellVNs);
|
|
49
72
|
}));
|
|
50
73
|
}))
|
|
51
74
|
])
|
|
@@ -44,7 +44,7 @@ export default defineVxeComponent({
|
|
|
44
44
|
setup(props, context) {
|
|
45
45
|
const xID = XEUtils.uniqueId();
|
|
46
46
|
const $xeGantt = inject('$xeGantt', {});
|
|
47
|
-
const { computeTaskOpts,
|
|
47
|
+
const { computeTaskOpts, computeStartField, computeEndField, computeScrollbarOpts, computeScrollbarXToTop, computeScrollbarYToLeft } = $xeGantt.getComputeMaps();
|
|
48
48
|
const refElem = ref();
|
|
49
49
|
const refScrollXVirtualElem = ref();
|
|
50
50
|
const refScrollYVirtualElem = ref();
|
|
@@ -85,14 +85,7 @@ export default defineVxeComponent({
|
|
|
85
85
|
tableData: [],
|
|
86
86
|
tableColumn: [],
|
|
87
87
|
headerGroups: [],
|
|
88
|
-
viewCellWidth:
|
|
89
|
-
rowHeightStore: {
|
|
90
|
-
large: 52,
|
|
91
|
-
default: 48,
|
|
92
|
-
medium: 44,
|
|
93
|
-
small: 40,
|
|
94
|
-
mini: 36
|
|
95
|
-
}
|
|
88
|
+
viewCellWidth: 20
|
|
96
89
|
});
|
|
97
90
|
const internalData = createInternalData();
|
|
98
91
|
const refMaps = {
|
|
@@ -115,92 +108,243 @@ export default defineVxeComponent({
|
|
|
115
108
|
};
|
|
116
109
|
const handleParseColumn = () => {
|
|
117
110
|
const ganttProps = $xeGantt.props;
|
|
111
|
+
const ganttReactData = $xeGantt.reactData;
|
|
118
112
|
const { treeConfig } = ganttProps;
|
|
113
|
+
const { taskScaleList } = ganttReactData;
|
|
119
114
|
const { minViewDate, maxViewDate } = reactData;
|
|
120
|
-
const
|
|
115
|
+
const minScale = XEUtils.last(taskScaleList);
|
|
121
116
|
const fullCols = [];
|
|
122
117
|
const groupCols = [];
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
118
|
+
if (minScale && minViewDate && maxViewDate) {
|
|
119
|
+
const minSType = minScale.type;
|
|
120
|
+
const weekScale = taskScaleList.find(item => item.type === 'week');
|
|
121
|
+
let gapTime = 1000 * 60 * 60 * 24;
|
|
122
|
+
switch (minScale.type) {
|
|
123
|
+
case 'hour':
|
|
124
|
+
gapTime = 1000 * 60 * 60;
|
|
125
|
+
break;
|
|
126
|
+
case 'minute':
|
|
127
|
+
gapTime = 1000 * 60;
|
|
128
|
+
break;
|
|
129
|
+
case 'second':
|
|
130
|
+
gapTime = 1000;
|
|
131
|
+
break;
|
|
132
|
+
default: {
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const currTime = minViewDate.getTime();
|
|
137
|
+
const diffDayNum = maxViewDate.getTime() - minViewDate.getTime();
|
|
138
|
+
const countSize = Math.max(5, Math.floor(diffDayNum / gapTime) + 1);
|
|
139
|
+
switch (minScale.type) {
|
|
140
|
+
case 'day':
|
|
141
|
+
case 'date':
|
|
142
|
+
if (diffDayNum > (1000 * 60 * 60 * 24 * 366 * 3)) {
|
|
143
|
+
reactData.tableColumn = [];
|
|
144
|
+
reactData.headerGroups = [];
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
case 'hour':
|
|
149
|
+
if (diffDayNum > (1000 * 60 * 60 * 24 * 31 * 3)) {
|
|
150
|
+
reactData.tableColumn = [];
|
|
151
|
+
reactData.headerGroups = [];
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
break;
|
|
155
|
+
case 'minute':
|
|
156
|
+
if (diffDayNum > (1000 * 60 * 60 * 24 * 3)) {
|
|
157
|
+
reactData.tableColumn = [];
|
|
158
|
+
reactData.headerGroups = [];
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
case 'second':
|
|
163
|
+
if (diffDayNum > (1000 * 60 * 60 * 3)) {
|
|
164
|
+
reactData.tableColumn = [];
|
|
165
|
+
reactData.headerGroups = [];
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
const renderListMaps = {
|
|
171
|
+
year: [],
|
|
172
|
+
quarter: [],
|
|
173
|
+
month: [],
|
|
174
|
+
week: [],
|
|
175
|
+
day: [],
|
|
176
|
+
date: [],
|
|
177
|
+
hour: [],
|
|
178
|
+
minute: [],
|
|
179
|
+
second: []
|
|
180
|
+
};
|
|
181
|
+
const tempTypeMaps = {
|
|
182
|
+
year: {},
|
|
183
|
+
quarter: {},
|
|
184
|
+
month: {},
|
|
185
|
+
week: {},
|
|
186
|
+
day: {},
|
|
187
|
+
date: {},
|
|
188
|
+
hour: {},
|
|
189
|
+
minute: {},
|
|
190
|
+
second: {}
|
|
191
|
+
};
|
|
192
|
+
const handleData = (type, colMaps, minCol) => {
|
|
193
|
+
if (minSType === type) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const currCol = colMaps[type];
|
|
197
|
+
const currKey = `${currCol.field}`;
|
|
198
|
+
let currGpCol = tempTypeMaps[type][currKey];
|
|
199
|
+
if (!currGpCol) {
|
|
200
|
+
currGpCol = currCol;
|
|
201
|
+
tempTypeMaps[type][currKey] = currGpCol;
|
|
202
|
+
renderListMaps[type].push(currGpCol);
|
|
203
|
+
}
|
|
204
|
+
if (currGpCol) {
|
|
205
|
+
if (!currGpCol.children) {
|
|
206
|
+
currGpCol.children = [];
|
|
207
|
+
}
|
|
208
|
+
currGpCol.children.push(minCol);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
for (let i = 0; i < countSize; i++) {
|
|
212
|
+
const itemDate = new Date(currTime + (i * gapTime));
|
|
213
|
+
const [yyyy, MM, dd, HH, mm, ss] = XEUtils.toDateString(itemDate, 'yyyy-M-d-H-m-s').split('-');
|
|
214
|
+
const e = itemDate.getDay();
|
|
215
|
+
const E = e + 1;
|
|
216
|
+
const q = Math.ceil((itemDate.getMonth() + 1) / 3);
|
|
217
|
+
const W = XEUtils.getYearWeek(itemDate, weekScale ? weekScale.startDay : undefined);
|
|
218
|
+
const dateObj = { yy: yyyy, M: MM, d: dd, H: HH, m: mm, s: ss, q, W, E, e };
|
|
219
|
+
const colMaps = {
|
|
220
|
+
year: {
|
|
221
|
+
field: yyyy,
|
|
222
|
+
title: yyyy,
|
|
223
|
+
dateObj
|
|
224
|
+
},
|
|
225
|
+
quarter: {
|
|
226
|
+
field: `${yyyy}_q${q}`,
|
|
227
|
+
title: `${q}`,
|
|
228
|
+
dateObj
|
|
229
|
+
},
|
|
230
|
+
month: {
|
|
231
|
+
field: `${yyyy}_${MM}`,
|
|
232
|
+
title: MM,
|
|
233
|
+
dateObj
|
|
234
|
+
},
|
|
235
|
+
week: {
|
|
236
|
+
field: `${yyyy}_W${W}`,
|
|
237
|
+
title: `${W}`,
|
|
238
|
+
dateObj
|
|
239
|
+
},
|
|
240
|
+
day: {
|
|
241
|
+
field: `${yyyy}_${MM}_${dd}_E${E}`,
|
|
242
|
+
title: `${E}`,
|
|
243
|
+
dateObj
|
|
244
|
+
},
|
|
245
|
+
date: {
|
|
246
|
+
field: `${yyyy}_${MM}_${dd}`,
|
|
247
|
+
title: dd,
|
|
248
|
+
dateObj
|
|
249
|
+
},
|
|
250
|
+
hour: {
|
|
251
|
+
field: `${yyyy}_${MM}_${dd}_${HH}`,
|
|
252
|
+
title: HH,
|
|
253
|
+
dateObj
|
|
254
|
+
},
|
|
255
|
+
minute: {
|
|
256
|
+
field: `${yyyy}_${MM}_${dd}_${HH}_${mm}`,
|
|
257
|
+
title: mm,
|
|
258
|
+
dateObj
|
|
259
|
+
},
|
|
260
|
+
second: {
|
|
261
|
+
field: `${yyyy}_${MM}_${dd}_${HH}_${mm}_${ss}`,
|
|
262
|
+
title: ss,
|
|
263
|
+
dateObj
|
|
164
264
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
265
|
+
};
|
|
266
|
+
const minCol = colMaps[minSType];
|
|
267
|
+
if (minScale.level < 19) {
|
|
268
|
+
handleData('year', colMaps, minCol);
|
|
269
|
+
}
|
|
270
|
+
if (minScale.level < 17) {
|
|
271
|
+
handleData('quarter', colMaps, minCol);
|
|
272
|
+
}
|
|
273
|
+
if (minScale.level < 14) {
|
|
274
|
+
handleData('month', colMaps, minCol);
|
|
275
|
+
}
|
|
276
|
+
if (minScale.level < 13) {
|
|
277
|
+
handleData('week', colMaps, minCol);
|
|
278
|
+
}
|
|
279
|
+
if (minScale.level < 11) {
|
|
280
|
+
handleData('day', colMaps, minCol);
|
|
281
|
+
}
|
|
282
|
+
if (minScale.level < 12) {
|
|
283
|
+
handleData('date', colMaps, minCol);
|
|
284
|
+
}
|
|
285
|
+
if (minScale.level < 7) {
|
|
286
|
+
handleData('hour', colMaps, minCol);
|
|
287
|
+
}
|
|
288
|
+
if (minScale.level < 5) {
|
|
289
|
+
handleData('minute', colMaps, minCol);
|
|
290
|
+
}
|
|
291
|
+
fullCols.push(minCol);
|
|
292
|
+
}
|
|
293
|
+
taskScaleList.forEach(scaleItem => {
|
|
294
|
+
if (scaleItem.type === minSType) {
|
|
295
|
+
groupCols.push({
|
|
296
|
+
scaleItem,
|
|
297
|
+
columns: fullCols
|
|
298
|
+
});
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const list = renderListMaps[scaleItem.type] || [];
|
|
302
|
+
if (list) {
|
|
303
|
+
list.forEach(item => {
|
|
304
|
+
item.childCount = item.children ? item.children.length : 0;
|
|
305
|
+
item.children = undefined;
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
groupCols.push({
|
|
309
|
+
scaleItem,
|
|
310
|
+
columns: list
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
const $xeTable = internalData.xeTable;
|
|
314
|
+
if ($xeTable) {
|
|
315
|
+
const startField = computeStartField.value;
|
|
316
|
+
const endField = computeEndField.value;
|
|
317
|
+
const { computeTreeOpts } = $xeTable.getComputeMaps();
|
|
318
|
+
const tableInternalData = $xeTable.internalData;
|
|
319
|
+
const { afterFullData, afterTreeFullData } = tableInternalData;
|
|
320
|
+
const treeOpts = computeTreeOpts.value;
|
|
321
|
+
const { transform } = treeOpts;
|
|
322
|
+
const childrenField = treeOpts.children || treeOpts.childrenField;
|
|
323
|
+
const ctMaps = {};
|
|
324
|
+
const handleParseRender = (row) => {
|
|
325
|
+
const rowid = $xeTable.getRowid(row);
|
|
326
|
+
const startValue = XEUtils.get(row, startField);
|
|
327
|
+
const endValue = XEUtils.get(row, endField);
|
|
328
|
+
if (startValue && endValue) {
|
|
329
|
+
const startDate = parseStringDate(startValue);
|
|
330
|
+
const endDate = parseStringDate(endValue);
|
|
331
|
+
const oLeftSize = Math.floor((startDate.getTime() - minViewDate.getTime()) / gapTime);
|
|
332
|
+
const oWidthSize = Math.floor((endDate.getTime() - startDate.getTime()) / gapTime) + 1;
|
|
333
|
+
ctMaps[rowid] = {
|
|
334
|
+
row,
|
|
335
|
+
rowid,
|
|
336
|
+
oLeftSize,
|
|
337
|
+
oWidthSize
|
|
193
338
|
};
|
|
194
|
-
if (treeConfig) {
|
|
195
|
-
XEUtils.eachTree(afterTreeFullData, handleParseRender, { children: transform ? treeOpts.mapChildrenField : childrenField });
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
afterFullData.forEach(handleParseRender);
|
|
199
|
-
}
|
|
200
|
-
internalData.chartMaps = ctMaps;
|
|
201
339
|
}
|
|
340
|
+
};
|
|
341
|
+
if (treeConfig) {
|
|
342
|
+
XEUtils.eachTree(afterTreeFullData, handleParseRender, { children: transform ? treeOpts.mapChildrenField : childrenField });
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
afterFullData.forEach(handleParseRender);
|
|
202
346
|
}
|
|
203
|
-
|
|
347
|
+
internalData.chartMaps = ctMaps;
|
|
204
348
|
}
|
|
205
349
|
}
|
|
206
350
|
reactData.tableColumn = fullCols;
|
|
@@ -759,11 +903,10 @@ export default defineVxeComponent({
|
|
|
759
903
|
};
|
|
760
904
|
const renderVN = () => {
|
|
761
905
|
const { overflowX, overflowY, scrollXLoad, scrollYLoad } = reactData;
|
|
762
|
-
const taskViewOpts = computeTaskViewOpts.value;
|
|
763
906
|
const scrollbarXToTop = computeScrollbarXToTop.value;
|
|
764
907
|
return h('div', {
|
|
765
908
|
ref: refElem,
|
|
766
|
-
class: ['vxe-gantt-view',
|
|
909
|
+
class: ['vxe-gantt-view', {
|
|
767
910
|
'is--scroll-y': overflowY,
|
|
768
911
|
'is--scroll-x': overflowX,
|
|
769
912
|
'is--virtual-x': scrollXLoad,
|
package/es/gantt/src/gantt.js
CHANGED
|
@@ -20,9 +20,23 @@ function createInternalData() {
|
|
|
20
20
|
resizeTableWidth: 0
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
|
+
const viewTypeLevelMaps = {
|
|
24
|
+
year: 19,
|
|
25
|
+
quarter: 17,
|
|
26
|
+
month: 15,
|
|
27
|
+
week: 13,
|
|
28
|
+
day: 11,
|
|
29
|
+
date: 9,
|
|
30
|
+
hour: 7,
|
|
31
|
+
minute: 5,
|
|
32
|
+
second: 3
|
|
33
|
+
};
|
|
34
|
+
function getViewTypeLevel(type) {
|
|
35
|
+
return viewTypeLevelMaps[type || 'date'] || viewTypeLevelMaps.date;
|
|
36
|
+
}
|
|
23
37
|
export default defineVxeComponent({
|
|
24
38
|
name: 'VxeGantt',
|
|
25
|
-
props: Object.assign(Object.assign({}, tableProps), { columns: Array, pagerConfig: Object, proxyConfig: Object, toolbarConfig: Object, formConfig: Object, zoomConfig: Object, layouts: Array, taskConfig: Object, taskViewConfig: Object, taskBarConfig: Object, taskSplitConfig: Object, size: {
|
|
39
|
+
props: Object.assign(Object.assign({}, tableProps), { columns: Array, pagerConfig: Object, proxyConfig: Object, toolbarConfig: Object, formConfig: Object, zoomConfig: Object, layouts: Array, taskConfig: Object, taskViewScaleConfs: Object, taskViewConfig: Object, taskBarConfig: Object, taskSplitConfig: Object, size: {
|
|
26
40
|
type: String,
|
|
27
41
|
default: () => getConfig().gantt.size || getConfig().size
|
|
28
42
|
} }),
|
|
@@ -52,7 +66,8 @@ export default defineVxeComponent({
|
|
|
52
66
|
currentPage: 1
|
|
53
67
|
},
|
|
54
68
|
showLeftView: true,
|
|
55
|
-
showRightView: true
|
|
69
|
+
showRightView: true,
|
|
70
|
+
taskScaleList: []
|
|
56
71
|
});
|
|
57
72
|
const internalData = createInternalData();
|
|
58
73
|
const refElem = ref();
|
|
@@ -118,6 +133,9 @@ export default defineVxeComponent({
|
|
|
118
133
|
const computeTaskOpts = computed(() => {
|
|
119
134
|
return Object.assign({}, getConfig().gantt.taskConfig, props.taskConfig);
|
|
120
135
|
});
|
|
136
|
+
const computeTaskViewScaleMapsOpts = computed(() => {
|
|
137
|
+
return XEUtils.merge({}, getConfig().gantt.taskViewScaleConfs, props.taskViewScaleConfs);
|
|
138
|
+
});
|
|
121
139
|
const computeTaskViewOpts = computed(() => {
|
|
122
140
|
return Object.assign({}, getConfig().gantt.taskViewConfig, props.taskViewConfig);
|
|
123
141
|
});
|
|
@@ -127,6 +145,11 @@ export default defineVxeComponent({
|
|
|
127
145
|
const computeTaskSplitOpts = computed(() => {
|
|
128
146
|
return Object.assign({}, getConfig().gantt.taskSplitConfig, props.taskSplitConfig);
|
|
129
147
|
});
|
|
148
|
+
const computeTaskScaleConfs = computed(() => {
|
|
149
|
+
const taskViewOpts = computeTaskViewOpts.value;
|
|
150
|
+
const { scales } = taskViewOpts;
|
|
151
|
+
return scales;
|
|
152
|
+
});
|
|
130
153
|
const computeTitleField = computed(() => {
|
|
131
154
|
const taskOpts = computeTaskOpts.value;
|
|
132
155
|
return taskOpts.titleField || 'title';
|
|
@@ -173,7 +196,7 @@ export default defineVxeComponent({
|
|
|
173
196
|
stys.maxHeight = maxHeight === 'auto' || maxHeight === '100%' ? '100%' : toCssUnit(maxHeight);
|
|
174
197
|
}
|
|
175
198
|
}
|
|
176
|
-
if (barStyle) {
|
|
199
|
+
if (barStyle && !XEUtils.isFunction(barStyle)) {
|
|
177
200
|
const { bgColor, completedBgColor } = barStyle;
|
|
178
201
|
if (bgColor) {
|
|
179
202
|
stys['--vxe-ui-gantt-view-task-bar-background-color'] = bgColor;
|
|
@@ -321,9 +344,11 @@ export default defineVxeComponent({
|
|
|
321
344
|
computeToolbarOpts,
|
|
322
345
|
computeZoomOpts,
|
|
323
346
|
computeTaskOpts,
|
|
347
|
+
computeTaskViewScaleMapsOpts,
|
|
324
348
|
computeTaskViewOpts,
|
|
325
349
|
computeTaskBarOpts,
|
|
326
350
|
computeTaskSplitOpts,
|
|
351
|
+
computeTaskScaleConfs,
|
|
327
352
|
computeTitleField,
|
|
328
353
|
computeStartField,
|
|
329
354
|
computeEndField,
|
|
@@ -341,6 +366,34 @@ export default defineVxeComponent({
|
|
|
341
366
|
getRefMaps: () => refMaps,
|
|
342
367
|
getComputeMaps: () => computeMaps
|
|
343
368
|
};
|
|
369
|
+
const handleTaskScaleConfig = () => {
|
|
370
|
+
const taskScaleConfs = computeTaskScaleConfs.value;
|
|
371
|
+
const taskViewScaleMapsOpts = computeTaskViewScaleMapsOpts.value;
|
|
372
|
+
const scaleConfs = [];
|
|
373
|
+
if (taskScaleConfs) {
|
|
374
|
+
const keyMaps = {};
|
|
375
|
+
taskScaleConfs.forEach(conf => {
|
|
376
|
+
const sConf = !conf || XEUtils.isString(conf) ? { type: conf } : conf;
|
|
377
|
+
const { type } = sConf;
|
|
378
|
+
if (!type || !viewTypeLevelMaps[type]) {
|
|
379
|
+
errLog('vxe.error.errProp', [`type=${type}`, XEUtils.keys(viewTypeLevelMaps).join(',')]);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
if (keyMaps[type]) {
|
|
383
|
+
errLog('vxe.error.repeatProp', ['type', type]);
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
keyMaps[type] = true;
|
|
387
|
+
scaleConfs.push(Object.assign({}, type ? taskViewScaleMapsOpts[type] || {} : {}, sConf, {
|
|
388
|
+
level: getViewTypeLevel(type)
|
|
389
|
+
}));
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
if (!scaleConfs.length) {
|
|
393
|
+
scaleConfs.push({ type: 'month', level: viewTypeLevelMaps.month }, { type: 'date', level: viewTypeLevelMaps.date });
|
|
394
|
+
}
|
|
395
|
+
reactData.taskScaleList = XEUtils.orderBy(scaleConfs, { field: 'level', order: 'desc' });
|
|
396
|
+
};
|
|
344
397
|
const initToolbar = () => {
|
|
345
398
|
const toolbarOpts = computeToolbarOpts.value;
|
|
346
399
|
if (props.toolbarConfig && isEnableConf(toolbarOpts)) {
|
|
@@ -1824,6 +1877,9 @@ export default defineVxeComponent({
|
|
|
1824
1877
|
watch(() => props.proxyConfig, () => {
|
|
1825
1878
|
initProxy();
|
|
1826
1879
|
});
|
|
1880
|
+
watch(computeTaskScaleConfs, () => {
|
|
1881
|
+
handleTaskScaleConfig();
|
|
1882
|
+
});
|
|
1827
1883
|
hooks.forEach((options) => {
|
|
1828
1884
|
const { setupGantt } = options;
|
|
1829
1885
|
if (setupGantt) {
|
|
@@ -1833,6 +1889,7 @@ export default defineVxeComponent({
|
|
|
1833
1889
|
}
|
|
1834
1890
|
}
|
|
1835
1891
|
});
|
|
1892
|
+
handleTaskScaleConfig();
|
|
1836
1893
|
initPages();
|
|
1837
1894
|
onMounted(() => {
|
|
1838
1895
|
nextTick(() => {
|
package/es/gantt/src/util.js
CHANGED
|
@@ -7,6 +7,12 @@ export function getRefElem(refEl) {
|
|
|
7
7
|
}
|
|
8
8
|
return null;
|
|
9
9
|
}
|
|
10
|
+
export function getCalcHeight(height) {
|
|
11
|
+
if (height === 'unset') {
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
return height || 0;
|
|
15
|
+
}
|
|
10
16
|
export function getCellRestHeight(rowRest, cellOpts, rowOpts, defaultRowHeight) {
|
|
11
17
|
return rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight;
|
|
12
18
|
}
|
package/es/gantt/style.css
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
.vxe-gantt-view--chart-row {
|
|
10
10
|
position: relative;
|
|
11
|
+
width: 100%;
|
|
12
|
+
height: 0;
|
|
11
13
|
}
|
|
12
14
|
.vxe-gantt-view--chart-row.is--round > .vxe-gantt-view--chart-bar, .vxe-gantt-view--chart-row.is--round > .vxe-gantt-view--chart-custom-bar {
|
|
13
15
|
border-radius: var(--vxe-ui-gantt-view-task-bar-border-radius);
|