vxe-gantt 4.0.3 → 4.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/es/gantt/src/gantt-body.js +46 -6
  2. package/es/gantt/src/gantt-header.js +22 -6
  3. package/es/gantt/src/gantt-view.js +232 -89
  4. package/es/gantt/src/gantt.js +59 -2
  5. package/es/gantt/src/util.js +6 -0
  6. package/es/gantt/style.css +35 -3
  7. package/es/gantt/style.min.css +1 -1
  8. package/es/style.css +1 -1
  9. package/es/style.min.css +1 -1
  10. package/es/ui/index.js +6 -1
  11. package/es/ui/src/log.js +1 -1
  12. package/es/vxe-gantt/style.css +35 -3
  13. package/es/vxe-gantt/style.min.css +1 -1
  14. package/lib/gantt/src/gantt-body.js +51 -6
  15. package/lib/gantt/src/gantt-body.min.js +1 -1
  16. package/lib/gantt/src/gantt-header.js +34 -6
  17. package/lib/gantt/src/gantt-header.min.js +1 -1
  18. package/lib/gantt/src/gantt-view.js +255 -99
  19. package/lib/gantt/src/gantt-view.min.js +1 -1
  20. package/lib/gantt/src/gantt.js +74 -1
  21. package/lib/gantt/src/gantt.min.js +1 -1
  22. package/lib/gantt/src/util.js +7 -0
  23. package/lib/gantt/src/util.min.js +1 -1
  24. package/lib/gantt/style/style.css +35 -3
  25. package/lib/gantt/style/style.min.css +1 -1
  26. package/lib/index.umd.js +476 -121
  27. package/lib/index.umd.min.js +1 -1
  28. package/lib/style.css +1 -1
  29. package/lib/style.min.css +1 -1
  30. package/lib/ui/index.js +6 -1
  31. package/lib/ui/index.min.js +1 -1
  32. package/lib/ui/src/log.js +1 -1
  33. package/lib/ui/src/log.min.js +1 -1
  34. package/lib/vxe-gantt/style/style.css +35 -3
  35. package/lib/vxe-gantt/style/style.min.css +1 -1
  36. package/package.json +3 -3
  37. package/packages/gantt/src/gantt-body.ts +50 -7
  38. package/packages/gantt/src/gantt-header.ts +23 -7
  39. package/packages/gantt/src/gantt-view.ts +243 -93
  40. package/packages/gantt/src/gantt.ts +68 -1
  41. package/packages/gantt/src/util.ts +7 -0
  42. package/packages/ui/index.ts +5 -0
  43. package/styles/components/gantt-module/gantt-chart.scss +10 -0
  44. package/styles/components/gantt.scss +37 -3
  45. package/styles/theme/base.scss +1 -1
@@ -13,19 +13,53 @@ export default defineVxeComponent({
13
13
  const refBodyTable = ref();
14
14
  const refBodyXSpace = ref();
15
15
  const refBodyYSpace = ref();
16
- const renderColumn = ($xeTable, row, rowid, $rowIndex, column, $columnIndex) => {
16
+ const renderColumn = ($xeTable, row, rowid, rowIndex, $rowIndex, _rowIndex, column, $columnIndex) => {
17
17
  const tableReactData = $xeTable.reactData;
18
18
  const { resizeHeightFlag } = tableReactData;
19
19
  const tableInternalData = $xeTable.internalData;
20
- const { fullAllDataRowIdData } = tableInternalData;
21
- const { computeCellOpts, computeRowOpts, computeDefaultRowHeight } = $xeTable.getComputeMaps();
20
+ const { fullAllDataRowIdData, visibleColumn } = tableInternalData;
21
+ const { computeCellOpts, computeRowOpts, computeDefaultRowHeight, computeResizableOpts } = $xeTable.getComputeMaps();
22
22
  const cellOpts = computeCellOpts.value;
23
23
  const rowOpts = computeRowOpts.value;
24
24
  const defaultRowHeight = computeDefaultRowHeight.value;
25
+ const resizableOpts = computeResizableOpts.value;
26
+ const { isAllRowDrag } = resizableOpts;
25
27
  const rowRest = fullAllDataRowIdData[rowid] || {};
26
28
  const resizeHeight = resizeHeightFlag ? rowRest.resizeHeight : 0;
27
29
  const isRsHeight = resizeHeight > 0;
28
30
  const cellHeight = getCellRestHeight(rowRest, cellOpts, rowOpts, defaultRowHeight);
31
+ const tdVNs = [];
32
+ if (isAllRowDrag && rowOpts.resizable) {
33
+ const cellParams = {
34
+ $table: $xeTable,
35
+ $grid: null,
36
+ $gantt: $xeGantt,
37
+ seq: -1,
38
+ rowid,
39
+ row,
40
+ rowIndex,
41
+ $rowIndex,
42
+ _rowIndex,
43
+ column: visibleColumn[0],
44
+ columnIndex: 0,
45
+ $columnIndex: 0,
46
+ _columnIndex: 0,
47
+ fixed: '',
48
+ type: '',
49
+ isHidden: false,
50
+ isEdit: false,
51
+ level: -1,
52
+ // 已废弃属性
53
+ visibleData: [],
54
+ data: [],
55
+ items: []
56
+ };
57
+ tdVNs.push(h('div', {
58
+ class: 'vxe-gantt-view-cell--row-resizable',
59
+ onMousedown: (evnt) => $xeTable.handleRowResizeMousedownEvent(evnt, cellParams),
60
+ onDblclick: (evnt) => $xeTable.handleRowResizeDblclickEvent(evnt, cellParams)
61
+ }));
62
+ }
29
63
  return h('td', {
30
64
  key: $columnIndex,
31
65
  class: ['vxe-gantt-view--body-column', {
@@ -40,13 +74,13 @@ export default defineVxeComponent({
40
74
  onDblclick(evnt) {
41
75
  $xeGantt.handleTaskCellDblclickEvent(evnt, { row, column });
42
76
  }
43
- });
77
+ }, tdVNs);
44
78
  };
45
79
  const renderRows = ($xeTable, tableData) => {
46
80
  const tableProps = $xeTable.props;
47
81
  const { treeConfig, stripe, highlightHoverRow, editConfig } = tableProps;
48
82
  const tableReactData = $xeTable.reactData;
49
- const { treeExpandedFlag, selectRadioRow, pendingRowFlag } = tableReactData;
83
+ const { treeExpandedFlag, selectRadioRow, pendingRowFlag, isRowGroupStatus } = tableReactData;
50
84
  const tableInternalData = $xeTable.internalData;
51
85
  const { fullAllDataRowIdData, treeExpandedMaps, pendingRowMaps } = tableInternalData;
52
86
  const { computeRadioOpts, computeCheckboxOpts, computeTreeOpts, computeRowOpts } = $xeTable.getComputeMaps();
@@ -82,13 +116,19 @@ export default defineVxeComponent({
82
116
  $xeTable.clearHoverRow();
83
117
  };
84
118
  }
119
+ // 拖拽行事件
120
+ if (rowOpts.drag && !isRowGroupStatus && (!treeConfig || transform)) {
121
+ trOns.onDragstart = $xeTable.handleRowDragDragstartEvent;
122
+ trOns.onDragend = $xeTable.handleRowDragDragendEvent;
123
+ trOns.onDragover = $xeTable.handleRowDragDragoverEvent;
124
+ }
85
125
  trVNs.push(h('tr', Object.assign({ key: treeConfig ? rowid : $rowIndex, class: ['vxe-gantt-view--body-row', {
86
126
  'row--stripe': stripe && (_rowIndex + 1) % 2 === 0,
87
127
  'is--new': isNewRow,
88
128
  'row--radio': radioOpts.highlight && $xeTable.eqRow(selectRadioRow, row),
89
129
  'row--checked': checkboxOpts.highlight && $xeTable.isCheckedByCheckboxRow(row),
90
130
  'row--pending': !!pendingRowFlag && !!pendingRowMaps[rowid]
91
- }], rowid }, trOns), tableColumn.map((column, $columnIndex) => renderColumn($xeTable, row, rowid, $rowIndex, column, $columnIndex))));
131
+ }], rowid }, trOns), tableColumn.map((column, $columnIndex) => renderColumn($xeTable, row, rowid, rowIndex, $rowIndex, _rowIndex, column, $columnIndex))));
92
132
  let isExpandTree = false;
93
133
  let rowChildren = [];
94
134
  if (treeConfig && !scrollYLoad && !transform) {
@@ -1,5 +1,7 @@
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() {
@@ -36,16 +38,30 @@ export default defineVxeComponent({
36
38
  }
37
39
  });
38
40
  })),
39
- h('thead', {}, headerGroups.map((cols, rIndex) => {
41
+ h('thead', {}, headerGroups.map(({ scaleItem, columns }, $rowIndex) => {
42
+ const { type, titleMethod } = scaleItem;
40
43
  return h('tr', {
41
- key: rIndex
42
- }, cols.map((column, cIndex) => {
44
+ key: $rowIndex
45
+ }, columns.map((column, cIndex) => {
46
+ const dateObj = column.params;
47
+ let label = `${column.title}`;
48
+ if ($rowIndex < headerGroups.length - 1) {
49
+ if (scaleItem.type === 'day') {
50
+ label = getI18n(`vxe.gantt.dayss.w${dateObj.e}`);
51
+ }
52
+ else {
53
+ label = getI18n(`vxe.gantt.${!$rowIndex && headerGroups.length > 1 ? 'tFullFormat' : 'tSimpleFormat'}.${type}`, dateObj);
54
+ }
55
+ }
56
+ if (titleMethod) {
57
+ label = `${titleMethod({ scaleObj: scaleItem, title: label, dateObj: dateObj, $rowIndex })}`;
58
+ }
43
59
  return h('th', {
44
60
  key: cIndex,
45
61
  class: 'vxe-gantt-view--header-column',
46
- colspan: column.children ? column.children.length : null,
47
- title: `${column.field}`
48
- }, column.title);
62
+ colspan: column.childCount || null,
63
+ title: label
64
+ }, label);
49
65
  }));
50
66
  }))
51
67
  ])
@@ -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, computeTaskViewOpts, computeStartField, computeEndField, computeScrollbarOpts, computeScrollbarXToTop, computeScrollbarYToLeft } = $xeGantt.getComputeMaps();
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: 40,
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 taskViewOpts = computeTaskViewOpts.value;
115
+ const minScale = XEUtils.last(taskScaleList);
121
116
  const fullCols = [];
122
117
  const groupCols = [];
123
- switch (taskViewOpts.mode) {
124
- case 'year':
125
- break;
126
- case 'quarter':
127
- break;
128
- case 'month':
129
- break;
130
- case 'week':
131
- break;
132
- default: {
133
- if (minViewDate && maxViewDate) {
134
- const currTime = minViewDate.getTime();
135
- const diffDayNum = maxViewDate.getTime() - minViewDate.getTime();
136
- const countDayNum = Math.max(6, Math.floor(diffDayNum / 86400000) + 1);
137
- const groupList = [];
138
- const colList = [];
139
- const groupMaps = {};
140
- for (let i = 0; i < countDayNum; i++) {
141
- const itemDate = new Date(currTime + (i * 86400000));
142
- const yyyyy = `${itemDate.getFullYear()}-${itemDate.getMonth() + 1}`;
143
- const mmDd = `${itemDate.getDate()}`;
144
- let groupCol = groupMaps[yyyyy];
145
- const column = {
146
- field: `${yyyyy}-${mmDd}`,
147
- title: mmDd
148
- };
149
- if (groupCol) {
150
- groupCol.children.push(column);
151
- fullCols.push(groupCol);
152
- }
153
- else {
154
- groupCol = {
155
- field: yyyyy,
156
- title: yyyyy,
157
- children: [column]
158
- };
159
- groupList.push(groupCol);
160
- fullCols.push(groupCol);
161
- groupMaps[yyyyy] = groupCol;
162
- }
163
- colList.push(column);
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
+ params: dateObj
224
+ },
225
+ quarter: {
226
+ field: `${yyyy}_q${q}`,
227
+ title: q,
228
+ params: dateObj
229
+ },
230
+ month: {
231
+ field: `${yyyy}_${MM}`,
232
+ title: MM,
233
+ params: dateObj
234
+ },
235
+ week: {
236
+ field: `${yyyy}_W${W}`,
237
+ title: W,
238
+ params: dateObj
239
+ },
240
+ day: {
241
+ field: `${yyyy}_${MM}_${dd}_E${E}`,
242
+ title: E,
243
+ params: dateObj
244
+ },
245
+ date: {
246
+ field: `${yyyy}_${MM}_${dd}`,
247
+ title: dd,
248
+ params: dateObj
249
+ },
250
+ hour: {
251
+ field: `${yyyy}_${MM}_${dd}_${HH}`,
252
+ title: HH,
253
+ params: dateObj
254
+ },
255
+ minute: {
256
+ field: `${yyyy}_${MM}_${dd}_${HH}_${mm}`,
257
+ title: mm,
258
+ params: dateObj
259
+ },
260
+ second: {
261
+ field: `${yyyy}_${MM}_${dd}_${HH}_${mm}_${ss}`,
262
+ title: ss,
263
+ params: dateObj
164
264
  }
165
- groupCols.push(groupList, colList);
166
- const $xeTable = internalData.xeTable;
167
- if ($xeTable) {
168
- const startField = computeStartField.value;
169
- const endField = computeEndField.value;
170
- const { computeTreeOpts } = $xeTable.getComputeMaps();
171
- const tableInternalData = $xeTable.internalData;
172
- const { afterFullData, afterTreeFullData } = tableInternalData;
173
- const treeOpts = computeTreeOpts.value;
174
- const { transform } = treeOpts;
175
- const childrenField = treeOpts.children || treeOpts.childrenField;
176
- const ctMaps = {};
177
- const handleParseRender = (row) => {
178
- const rowid = $xeTable.getRowid(row);
179
- const startValue = XEUtils.get(row, startField);
180
- const endValue = XEUtils.get(row, endField);
181
- if (startValue && endValue) {
182
- const startDate = parseStringDate(startValue);
183
- const endDate = parseStringDate(endValue);
184
- const oLeftSize = Math.floor((startDate.getTime() - minViewDate.getTime()) / 86400000);
185
- const oWidthSize = Math.floor((endDate.getTime() - startDate.getTime()) / 86400000) + 1;
186
- ctMaps[rowid] = {
187
- row,
188
- rowid,
189
- oLeftSize,
190
- oWidthSize
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
- break;
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', `mode--${taskViewOpts.mode || 'day'}`, {
909
+ class: ['vxe-gantt-view', {
767
910
  'is--scroll-y': overflowY,
768
911
  'is--scroll-x': overflowX,
769
912
  'is--virtual-x': scrollXLoad,
@@ -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';
@@ -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(() => {
@@ -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
  }