@visactor/vtable-gantt 1.20.3 → 1.21.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.
Files changed (73) hide show
  1. package/cjs/Gantt.d.ts +15 -0
  2. package/cjs/Gantt.js +47 -7
  3. package/cjs/Gantt.js.map +1 -1
  4. package/cjs/event/scroll.js +7 -2
  5. package/cjs/event/scroll.js.map +1 -1
  6. package/cjs/index.d.ts +1 -1
  7. package/cjs/index.js +1 -1
  8. package/cjs/index.js.map +1 -1
  9. package/cjs/state/gantt-table-sync.js +3 -3
  10. package/cjs/state/gantt-table-sync.js.map +1 -1
  11. package/cjs/state/state-manager.d.ts +2 -0
  12. package/cjs/state/state-manager.js +5 -2
  13. package/cjs/state/state-manager.js.map +1 -1
  14. package/cjs/ts-types/EVENT_TYPE.d.ts +1 -0
  15. package/cjs/ts-types/EVENT_TYPE.js +2 -1
  16. package/cjs/ts-types/EVENT_TYPE.js.map +1 -1
  17. package/cjs/ts-types/events.d.ts +3 -0
  18. package/cjs/ts-types/events.js.map +1 -1
  19. package/cjs/ts-types/gantt-engine.d.ts +2 -0
  20. package/cjs/ts-types/gantt-engine.js.map +1 -1
  21. package/cjs/ts-types/index.d.ts +1 -0
  22. package/cjs/ts-types/index.js +2 -1
  23. package/cjs/ts-types/index.js.map +1 -1
  24. package/cjs/ts-types/zoom-scale.d.ts +32 -0
  25. package/cjs/ts-types/zoom-scale.js +6 -0
  26. package/cjs/ts-types/zoom-scale.js.map +1 -0
  27. package/cjs/zoom-scale/DataZoomIntegration.d.ts +50 -0
  28. package/cjs/zoom-scale/DataZoomIntegration.js +261 -0
  29. package/cjs/zoom-scale/DataZoomIntegration.js.map +1 -0
  30. package/cjs/zoom-scale/ZoomScaleManager.d.ts +55 -0
  31. package/cjs/zoom-scale/ZoomScaleManager.js +327 -0
  32. package/cjs/zoom-scale/ZoomScaleManager.js.map +1 -0
  33. package/cjs/zoom-scale/index.d.ts +4 -0
  34. package/cjs/zoom-scale/index.js +24 -0
  35. package/cjs/zoom-scale/index.js.map +1 -0
  36. package/dist/vtable-gantt.js +2066 -207
  37. package/dist/vtable-gantt.min.js +2 -2
  38. package/es/Gantt.d.ts +15 -0
  39. package/es/Gantt.js +48 -7
  40. package/es/Gantt.js.map +1 -1
  41. package/es/event/scroll.js +7 -2
  42. package/es/event/scroll.js.map +1 -1
  43. package/es/index.d.ts +1 -1
  44. package/es/index.js +1 -1
  45. package/es/index.js.map +1 -1
  46. package/es/state/gantt-table-sync.js +2 -4
  47. package/es/state/gantt-table-sync.js.map +1 -1
  48. package/es/state/state-manager.d.ts +2 -0
  49. package/es/state/state-manager.js +5 -2
  50. package/es/state/state-manager.js.map +1 -1
  51. package/es/ts-types/EVENT_TYPE.d.ts +1 -0
  52. package/es/ts-types/EVENT_TYPE.js +2 -1
  53. package/es/ts-types/EVENT_TYPE.js.map +1 -1
  54. package/es/ts-types/events.d.ts +3 -0
  55. package/es/ts-types/events.js.map +1 -1
  56. package/es/ts-types/gantt-engine.d.ts +2 -0
  57. package/es/ts-types/gantt-engine.js.map +1 -1
  58. package/es/ts-types/index.d.ts +1 -0
  59. package/es/ts-types/index.js +2 -0
  60. package/es/ts-types/index.js.map +1 -1
  61. package/es/ts-types/zoom-scale.d.ts +32 -0
  62. package/es/ts-types/zoom-scale.js +2 -0
  63. package/es/ts-types/zoom-scale.js.map +1 -0
  64. package/es/zoom-scale/DataZoomIntegration.d.ts +50 -0
  65. package/es/zoom-scale/DataZoomIntegration.js +253 -0
  66. package/es/zoom-scale/DataZoomIntegration.js.map +1 -0
  67. package/es/zoom-scale/ZoomScaleManager.d.ts +55 -0
  68. package/es/zoom-scale/ZoomScaleManager.js +321 -0
  69. package/es/zoom-scale/ZoomScaleManager.js.map +1 -0
  70. package/es/zoom-scale/index.d.ts +4 -0
  71. package/es/zoom-scale/index.js +4 -0
  72. package/es/zoom-scale/index.js.map +1 -0
  73. package/package.json +5 -5
@@ -0,0 +1,321 @@
1
+ import { DataZoomIntegration } from "./DataZoomIntegration";
2
+
3
+ import { GANTT_EVENT_TYPE } from "../ts-types/EVENT_TYPE";
4
+
5
+ export class ZoomScaleManager {
6
+ constructor(gantt, config) {
7
+ this.currentLevelIndex = 0, this.levelBoundaries = [], this.globalMinMillisecondsPerPixel = 0,
8
+ this.globalMaxMillisecondsPerPixel = 0, this.dataZoomIntegration = null, this.gantt = gantt;
9
+ const finalConfig = Object.assign({
10
+ enabled: !0,
11
+ levels: []
12
+ }, config);
13
+ if (this.config = finalConfig, this.initializeZoomLimits(), this.sortLevelsByCoarseness(),
14
+ this.calculateGlobalMillisecondsPerPixelRange(), this.calculateLevelBoundaries(),
15
+ this.updateZoomLimits(), this.config.levels.length > 0) {
16
+ const initialMillisecondsPerPixel = this.calculateInitialMillisecondsPerPixel();
17
+ this.initializeWithMillisecondsPerPixel(initialMillisecondsPerPixel);
18
+ }
19
+ this.initializeDataZoomIfNeeded();
20
+ }
21
+ initializeZoomLimits() {
22
+ var _a, _b, _c, _d, _e;
23
+ const existingZoom = this.gantt.parsedOptions.zoom, zoomScaleConfig = this.config;
24
+ this.gantt.parsedOptions.zoom = {
25
+ minMillisecondsPerPixel: null !== (_b = null !== (_a = null == existingZoom ? void 0 : existingZoom.minMillisecondsPerPixel) && void 0 !== _a ? _a : zoomScaleConfig.minMillisecondsPerPixel) && void 0 !== _b ? _b : 1e3,
26
+ maxMillisecondsPerPixel: null !== (_d = null !== (_c = null == existingZoom ? void 0 : existingZoom.maxMillisecondsPerPixel) && void 0 !== _c ? _c : zoomScaleConfig.maxMillisecondsPerPixel) && void 0 !== _d ? _d : 6e6,
27
+ step: null !== (_e = zoomScaleConfig.step) && void 0 !== _e ? _e : .015
28
+ };
29
+ }
30
+ initializeDataZoomIfNeeded() {
31
+ var _a, _b, _c;
32
+ const dataZoomConfig = this.config.dataZoomAxis;
33
+ if (!(null == dataZoomConfig ? void 0 : dataZoomConfig.enabled)) return;
34
+ const finalConfig = {
35
+ containerId: dataZoomConfig.containerId,
36
+ width: dataZoomConfig.width,
37
+ height: null !== (_a = dataZoomConfig.height) && void 0 !== _a ? _a : 30,
38
+ x: dataZoomConfig.x,
39
+ y: null !== (_b = dataZoomConfig.y) && void 0 !== _b ? _b : 0,
40
+ delayTime: null !== (_c = dataZoomConfig.delayTime) && void 0 !== _c ? _c : 10
41
+ };
42
+ try {
43
+ this.dataZoomIntegration = new DataZoomIntegration(this.gantt, finalConfig);
44
+ } catch (error) {}
45
+ }
46
+ handleTableWidthChange() {
47
+ this.dataZoomIntegration && this.dataZoomIntegration.updateResponsive();
48
+ }
49
+ sortLevelsByCoarseness() {
50
+ this.config.levels.length <= 1 || this.config.levels.sort(((levelA, levelB) => {
51
+ const minUnitA = this.findMinTimeUnit(levelA), minUnitB = this.findMinTimeUnit(levelB), unitMsA = this.getUnitMilliseconds(minUnitA.unit, minUnitA.step);
52
+ return this.getUnitMilliseconds(minUnitB.unit, minUnitB.step) - unitMsA;
53
+ }));
54
+ }
55
+ calculateGlobalMillisecondsPerPixelRange() {
56
+ const levels = this.config.levels;
57
+ if (0 === levels.length) return;
58
+ let maxMinUnit = null, maxMinUnitMs = 0, minMinUnit = null, minMinUnitMs = 1 / 0;
59
+ for (const level of levels) {
60
+ const minUnit = this.findMinTimeUnit(level), unitMs = this.getUnitMilliseconds(minUnit.unit, minUnit.step);
61
+ unitMs > maxMinUnitMs && (maxMinUnitMs = unitMs, maxMinUnit = minUnit), unitMs < minMinUnitMs && (minMinUnitMs = unitMs,
62
+ minMinUnit = minUnit);
63
+ }
64
+ if (maxMinUnit && minMinUnit && (this.globalMinMillisecondsPerPixel = minMinUnitMs / 120,
65
+ this.globalMaxMillisecondsPerPixel = maxMinUnitMs / 150, this.globalMinMillisecondsPerPixel > this.globalMaxMillisecondsPerPixel)) {
66
+ const temp = this.globalMinMillisecondsPerPixel;
67
+ this.globalMinMillisecondsPerPixel = this.globalMaxMillisecondsPerPixel, this.globalMaxMillisecondsPerPixel = temp;
68
+ }
69
+ }
70
+ calculateLevelBoundaries() {
71
+ const levelCount = this.config.levels.length;
72
+ if (0 === levelCount) return;
73
+ this.levelBoundaries = [];
74
+ const idealBoundaries = [];
75
+ idealBoundaries[levelCount] = this.globalMinMillisecondsPerPixel;
76
+ for (let i = levelCount - 1; i >= 1; i--) {
77
+ const currentLevel = this.config.levels[i], currentMinUnit = this.findMinTimeUnit(currentLevel), idealBoundary = this.getUnitMilliseconds(currentMinUnit.unit, currentMinUnit.step) / this.getMinColWidthForUnit(currentMinUnit.unit, currentMinUnit.step);
78
+ idealBoundaries[i] = idealBoundary;
79
+ }
80
+ idealBoundaries[0] = this.globalMaxMillisecondsPerPixel, this.levelBoundaries = [ ...idealBoundaries ];
81
+ for (let i = 1; i < levelCount; i++) {
82
+ if (this.levelBoundaries[i] >= this.levelBoundaries[i - 1]) {
83
+ const prevBoundary = this.levelBoundaries[i - 1], nextBoundary = this.levelBoundaries[i + 1] || this.globalMinMillisecondsPerPixel;
84
+ this.levelBoundaries[i] = (prevBoundary + nextBoundary) / 2;
85
+ }
86
+ this.levelBoundaries[i] = Math.max(this.globalMinMillisecondsPerPixel, Math.min(this.globalMaxMillisecondsPerPixel, this.levelBoundaries[i]));
87
+ }
88
+ }
89
+ updateZoomLimits() {
90
+ this.gantt.parsedOptions.zoom || (this.gantt.parsedOptions.zoom = {}), this.gantt.parsedOptions.zoom.minMillisecondsPerPixel = this.globalMinMillisecondsPerPixel,
91
+ this.gantt.parsedOptions.zoom.maxMillisecondsPerPixel = this.globalMaxMillisecondsPerPixel;
92
+ }
93
+ getGlobalMinMillisecondsPerPixel() {
94
+ return this.globalMinMillisecondsPerPixel;
95
+ }
96
+ getGlobalMaxMillisecondsPerPixel() {
97
+ return this.globalMaxMillisecondsPerPixel;
98
+ }
99
+ calculateInitialMillisecondsPerPixel() {
100
+ return this.globalMinMillisecondsPerPixel + .4 * (this.globalMaxMillisecondsPerPixel - this.globalMinMillisecondsPerPixel);
101
+ }
102
+ initializeWithMillisecondsPerPixel(millisecondsPerPixel) {
103
+ if (0 === this.config.levels.length) return;
104
+ const optimalLevel = this.findOptimalLevel(millisecondsPerPixel);
105
+ this.setInitialLevel(optimalLevel);
106
+ }
107
+ setInitialLevel(levelIndex) {
108
+ if (levelIndex < 0 || levelIndex >= this.config.levels.length) return;
109
+ const levelScales = this.config.levels[levelIndex];
110
+ levelScales && 0 !== levelScales.length && (this.gantt.options.timelineHeader.scales = [ ...levelScales ],
111
+ this.currentLevelIndex = levelIndex);
112
+ }
113
+ findOptimalLevel(millisecondsPerPixel) {
114
+ const clampedMillisecondsPerPixel = Math.max(this.globalMinMillisecondsPerPixel, Math.min(this.globalMaxMillisecondsPerPixel, millisecondsPerPixel));
115
+ for (let i = 0; i < this.levelBoundaries.length - 1; i++) if (clampedMillisecondsPerPixel <= this.levelBoundaries[i] && clampedMillisecondsPerPixel > this.levelBoundaries[i + 1]) return i;
116
+ return this.config.levels.length - 1;
117
+ }
118
+ switchToLevel(levelIndex) {
119
+ if (levelIndex < 0 || levelIndex >= this.config.levels.length) return !1;
120
+ if (this.currentLevelIndex === levelIndex) return !0;
121
+ const levelScales = this.config.levels[levelIndex];
122
+ if (!levelScales || 0 === levelScales.length) return !1;
123
+ try {
124
+ return this.gantt.updateScales([ ...levelScales ]), this.currentLevelIndex = levelIndex,
125
+ this.gantt.recalculateTimeScale(), !0;
126
+ } catch (error) {
127
+ return !1;
128
+ }
129
+ }
130
+ findMinTimeUnit(scales) {
131
+ let minUnit = scales[0], minUnitMs = this.getUnitMilliseconds(minUnit.unit, minUnit.step);
132
+ for (const scale of scales) {
133
+ const unitMs = this.getUnitMilliseconds(scale.unit, scale.step);
134
+ unitMs < minUnitMs && (minUnitMs = unitMs, minUnit = scale);
135
+ }
136
+ return minUnit;
137
+ }
138
+ getUnitMilliseconds(unit, step) {
139
+ const unitMs = {
140
+ second: 1e3,
141
+ minute: 6e4,
142
+ hour: 36e5,
143
+ day: 864e5,
144
+ week: 6048e5,
145
+ month: 2592e6,
146
+ quarter: 7776e6,
147
+ year: 31536e6
148
+ };
149
+ return (unitMs[unit] || unitMs.day) * step;
150
+ }
151
+ getMinColWidthForUnit(unit, step) {
152
+ switch (unit) {
153
+ case "hour":
154
+ return step > 1 ? 120 : 60;
155
+
156
+ case "minute":
157
+ return 80;
158
+
159
+ case "second":
160
+ return 100;
161
+
162
+ default:
163
+ return 60;
164
+ }
165
+ }
166
+ getCurrentLevel() {
167
+ return this.currentLevelIndex;
168
+ }
169
+ getInitialMillisecondsPerPixel() {
170
+ return this.calculateInitialMillisecondsPerPixel();
171
+ }
172
+ getCurrentZoomState() {
173
+ if (0 === this.config.levels.length) return null;
174
+ const currentLevel = this.config.levels[this.currentLevelIndex], minUnit = this.findMinTimeUnit(currentLevel), currentMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel(), currentColWidth = this.getUnitMilliseconds(minUnit.unit, minUnit.step) / currentMillisecondsPerPixel;
175
+ return {
176
+ minUnit: minUnit.unit,
177
+ step: minUnit.step,
178
+ levelNum: this.currentLevelIndex,
179
+ currentColWidth: Math.round(10 * currentColWidth) / 10
180
+ };
181
+ }
182
+ setZoomPosition(params) {
183
+ if (0 === this.config.levels.length) return !1;
184
+ const {minUnit: minUnit, step: step, levelNum: levelNum, colWidth: colWidth} = params;
185
+ let targetMillisecondsPerPixel, targetLevelIndex = null;
186
+ if (void 0 !== minUnit && void 0 !== step) {
187
+ if (targetLevelIndex = this.findLevelByMinUnit(minUnit, step), null === targetLevelIndex) return !1;
188
+ } else {
189
+ if (void 0 === levelNum) return !1;
190
+ if (levelNum < 0 || levelNum >= this.config.levels.length) return !1;
191
+ targetLevelIndex = levelNum;
192
+ }
193
+ if (void 0 !== colWidth) {
194
+ const targetLevel = this.config.levels[targetLevelIndex], targetMinUnit = this.findMinTimeUnit(targetLevel);
195
+ targetMillisecondsPerPixel = this.getUnitMilliseconds(targetMinUnit.unit, targetMinUnit.step) / colWidth;
196
+ const upperBoundary = this.levelBoundaries[targetLevelIndex], lowerBoundary = this.levelBoundaries[targetLevelIndex + 1];
197
+ (targetMillisecondsPerPixel < lowerBoundary || targetMillisecondsPerPixel > upperBoundary) && (targetMillisecondsPerPixel = (upperBoundary + lowerBoundary) / 2);
198
+ } else {
199
+ targetMillisecondsPerPixel = (this.levelBoundaries[targetLevelIndex] + this.levelBoundaries[targetLevelIndex + 1]) / 2;
200
+ }
201
+ return targetLevelIndex !== this.currentLevelIndex && this.switchToLevel(targetLevelIndex),
202
+ this.gantt.setMillisecondsPerPixel(targetMillisecondsPerPixel), !0;
203
+ }
204
+ findLevelByMinUnit(unit, step) {
205
+ for (let i = 0; i < this.config.levels.length; i++) {
206
+ const level = this.config.levels[i], minUnit = this.findMinTimeUnit(level);
207
+ if (minUnit.unit === unit && minUnit.step === step) return i;
208
+ }
209
+ return null;
210
+ }
211
+ zoomIn(factor = 1.1, center = !0, centerX) {
212
+ this.gantt.zoomByFactor(factor, center, centerX);
213
+ }
214
+ zoomOut(factor = .9, center = !0, centerX) {
215
+ this.gantt.zoomByFactor(factor, center, centerX);
216
+ }
217
+ zoomByPercentage(percentage, center = !0, centerX) {
218
+ const currentMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel(), targetMillisecondsPerPixel = currentMillisecondsPerPixel - (this.globalMaxMillisecondsPerPixel - this.globalMinMillisecondsPerPixel) * percentage / 100;
219
+ let centerTimePosition;
220
+ center && this.gantt.scenegraph && (void 0 === centerX && (centerX = this.gantt.scenegraph.width / 2),
221
+ centerTimePosition = (this.gantt.stateManager.scroll.horizontalBarPos + centerX) * currentMillisecondsPerPixel);
222
+ const targetLevel = this.findOptimalLevel(targetMillisecondsPerPixel);
223
+ if (targetLevel !== this.getCurrentLevel() && this.switchToLevel(targetLevel), this.gantt.setMillisecondsPerPixel(targetMillisecondsPerPixel),
224
+ void 0 !== centerTimePosition && void 0 !== centerX) {
225
+ const newScrollLeft = centerTimePosition / this.gantt.getCurrentMillisecondsPerPixel() - centerX;
226
+ this.gantt.stateManager.setScrollLeft(newScrollLeft);
227
+ }
228
+ }
229
+ getDataZoomIntegration() {
230
+ return this.dataZoomIntegration;
231
+ }
232
+ createDataZoomIntegration(config) {
233
+ return this.dataZoomIntegration && this.dataZoomIntegration.destroy(), this.dataZoomIntegration = new DataZoomIntegration(this.gantt, config),
234
+ this.dataZoomIntegration;
235
+ }
236
+ destroyDataZoomIntegration() {
237
+ this.dataZoomIntegration && (this.dataZoomIntegration.destroy(), this.dataZoomIntegration = null);
238
+ }
239
+ updateDataZoomResponsive() {
240
+ this.dataZoomIntegration && this.dataZoomIntegration.updateResponsive();
241
+ }
242
+ recalculateTimeScale() {
243
+ const primaryScale = this.gantt.parsedOptions.reverseSortedTimelineScales[0];
244
+ if (!primaryScale) return;
245
+ let msPerStep;
246
+ switch (primaryScale.unit) {
247
+ case "second":
248
+ msPerStep = 1e3 * primaryScale.step;
249
+ break;
250
+
251
+ case "minute":
252
+ msPerStep = 6e4 * primaryScale.step;
253
+ break;
254
+
255
+ case "hour":
256
+ msPerStep = 36e5 * primaryScale.step;
257
+ break;
258
+
259
+ case "day":
260
+ default:
261
+ msPerStep = 864e5 * primaryScale.step;
262
+ break;
263
+
264
+ case "week":
265
+ msPerStep = 6048e5 * primaryScale.step;
266
+ break;
267
+
268
+ case "month":
269
+ msPerStep = 2592e6 * primaryScale.step;
270
+ break;
271
+
272
+ case "quarter":
273
+ msPerStep = 7776e6 * primaryScale.step;
274
+ break;
275
+
276
+ case "year":
277
+ msPerStep = 31536e6 * primaryScale.step;
278
+ }
279
+ const newTimelineColWidth = msPerStep / this.gantt.getCurrentMillisecondsPerPixel();
280
+ this.gantt.parsedOptions.timelineColWidth = newTimelineColWidth, this.gantt._generateTimeLineDateMap(),
281
+ this.gantt.scenegraph && (this.gantt._updateSize(), this.gantt.scenegraph.refreshAll());
282
+ }
283
+ zoomByFactor(factor, keepCenter = !0, centerX) {
284
+ var _a, _b, _c, _d;
285
+ const minMillisecondsPerPixel = null !== (_b = null === (_a = this.gantt.parsedOptions.zoom) || void 0 === _a ? void 0 : _a.minMillisecondsPerPixel) && void 0 !== _b ? _b : 2e5, maxMillisecondsPerPixel = null !== (_d = null === (_c = this.gantt.parsedOptions.zoom) || void 0 === _c ? void 0 : _c.maxMillisecondsPerPixel) && void 0 !== _d ? _d : 3e6, oldMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel(), oldWidth = this.gantt.parsedOptions.timelineColWidth;
286
+ let centerTimePosition;
287
+ if (keepCenter) {
288
+ void 0 === centerX && (centerX = this.gantt.scenegraph.width / 2);
289
+ const scrollOffsetMs = (this.gantt.stateManager.scroll.horizontalBarPos + centerX) * oldMillisecondsPerPixel;
290
+ centerTimePosition = this.gantt.parsedOptions._minDateTime + scrollOffsetMs;
291
+ }
292
+ const currentMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel();
293
+ let adjustedFactor = factor;
294
+ const zoomRatio = Math.log(currentMillisecondsPerPixel / 144e4) / Math.log(2);
295
+ if (currentMillisecondsPerPixel < 144e4) {
296
+ const enhancement = Math.pow(1.2, -zoomRatio);
297
+ adjustedFactor = Math.pow(factor, enhancement);
298
+ } else {
299
+ const dampening = Math.pow(.9, zoomRatio);
300
+ adjustedFactor = Math.pow(factor, dampening);
301
+ }
302
+ const newMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel() / adjustedFactor, clampedMillisecondsPerPixel = Math.max(minMillisecondsPerPixel, Math.min(maxMillisecondsPerPixel, newMillisecondsPerPixel));
303
+ this.gantt.setMillisecondsPerPixel(clampedMillisecondsPerPixel);
304
+ const targetLevel = this.findOptimalLevel(clampedMillisecondsPerPixel);
305
+ if (targetLevel !== this.getCurrentLevel() ? this.switchToLevel(targetLevel) : this.recalculateTimeScale(),
306
+ keepCenter && void 0 !== centerTimePosition && void 0 !== centerX) {
307
+ const actualMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel(), newScrollLeft = (centerTimePosition - this.gantt.parsedOptions._minDateTime) / actualMillisecondsPerPixel - centerX;
308
+ this.gantt.stateManager.setScrollLeft(newScrollLeft);
309
+ }
310
+ if (this.gantt.hasListeners(GANTT_EVENT_TYPE.ZOOM)) {
311
+ const actualMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel();
312
+ this.gantt.fireListeners(GANTT_EVENT_TYPE.ZOOM, {
313
+ oldWidth: oldWidth,
314
+ newWidth: this.gantt.parsedOptions.timelineColWidth,
315
+ scale: oldMillisecondsPerPixel / actualMillisecondsPerPixel,
316
+ oldMillisecondsPerPixel: oldMillisecondsPerPixel,
317
+ newMillisecondsPerPixel: actualMillisecondsPerPixel
318
+ });
319
+ }
320
+ }
321
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/zoom-scale/ZoomScaleManager.ts"],"names":[],"mappings":"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","file":"ZoomScaleManager.js","sourcesContent":["import type { Gantt } from '../Gantt';\nimport type { IZoomScale } from '../ts-types/zoom-scale';\nimport type { ITimelineScale } from '../ts-types/gantt-engine';\nimport { DataZoomIntegration, type DataZoomConfig } from './DataZoomIntegration';\nimport { GANTT_EVENT_TYPE } from '../ts-types/EVENT_TYPE';\n\n/**\n * ZoomScale 管理器\n * 负责根据 millisecondsPerPixel 智能选择和切换时间轴级别\n */\nexport class ZoomScaleManager {\n private readonly gantt: Gantt;\n readonly config: IZoomScale;\n private currentLevelIndex: number = 0;\n private levelBoundaries: number[] = [];\n private globalMinMillisecondsPerPixel: number = 0;\n private globalMaxMillisecondsPerPixel: number = 0;\n private dataZoomIntegration: DataZoomIntegration | null = null;\n\n constructor(gantt: Gantt, config: IZoomScale) {\n this.gantt = gantt;\n\n const finalConfig: IZoomScale = {\n enabled: true,\n levels: [],\n ...config\n };\n\n this.config = finalConfig;\n\n // 初始化缩放限制的默认值\n this.initializeZoomLimits();\n\n this.sortLevelsByCoarseness();\n this.calculateGlobalMillisecondsPerPixelRange();\n this.calculateLevelBoundaries();\n this.updateZoomLimits();\n\n if (this.config.levels.length > 0) {\n const initialMillisecondsPerPixel = this.calculateInitialMillisecondsPerPixel();\n this.initializeWithMillisecondsPerPixel(initialMillisecondsPerPixel);\n }\n\n // 如果配置了 DataZoom,自动创建集成\n this.initializeDataZoomIfNeeded();\n }\n\n /**\n * 初始化缩放限制的默认值\n */\n private initializeZoomLimits(): void {\n const existingZoom = this.gantt.parsedOptions.zoom;\n const zoomScaleConfig = this.config;\n this.gantt.parsedOptions.zoom = {\n minMillisecondsPerPixel: existingZoom?.minMillisecondsPerPixel ?? zoomScaleConfig.minMillisecondsPerPixel ?? 1000,\n maxMillisecondsPerPixel:\n existingZoom?.maxMillisecondsPerPixel ?? zoomScaleConfig.maxMillisecondsPerPixel ?? 6000000,\n step: zoomScaleConfig.step ?? 0.015\n };\n }\n\n /**\n * 初始化 DataZoom 集成(如果需要)\n */\n private initializeDataZoomIfNeeded(): void {\n const dataZoomConfig = this.config.dataZoomAxis;\n if (!dataZoomConfig?.enabled) {\n return;\n }\n\n // 设置默认值(width 和 x 会在 DataZoomIntegration 中自动处理)\n const finalConfig: DataZoomConfig = {\n containerId: dataZoomConfig.containerId, // 可选,让 DataZoomIntegration 自动处理\n width: dataZoomConfig.width, // 如果未设置,会自动使用容器宽度\n height: dataZoomConfig.height ?? 30,\n x: dataZoomConfig.x, // 如果未设置,会自动与容器左侧对齐\n y: dataZoomConfig.y ?? 0, // 默认贴着容器底部\n delayTime: dataZoomConfig.delayTime ?? 10\n };\n\n try {\n this.dataZoomIntegration = new DataZoomIntegration(this.gantt, finalConfig);\n } catch (error) {\n console.error('ZoomScaleManager: 创建 DataZoom 集成失败', error);\n }\n }\n\n /**\n * 处理表头宽度变化\n * 当左侧表头宽度被拖拽改变时调用此方法\n */\n handleTableWidthChange(): void {\n if (this.dataZoomIntegration) {\n this.dataZoomIntegration.updateResponsive();\n }\n }\n\n /**\n * 对级别进行排序:从粗糙到精细\n */\n private sortLevelsByCoarseness(): void {\n if (this.config.levels.length <= 1) {\n return;\n }\n\n this.config.levels.sort((levelA, levelB) => {\n const minUnitA = this.findMinTimeUnit(levelA);\n const minUnitB = this.findMinTimeUnit(levelB);\n\n const unitMsA = this.getUnitMilliseconds(minUnitA.unit, minUnitA.step);\n const unitMsB = this.getUnitMilliseconds(minUnitB.unit, minUnitB.step);\n\n return unitMsB - unitMsA;\n });\n }\n\n /**\n * 计算全局 millisecondsPerPixel 范围\n */\n private calculateGlobalMillisecondsPerPixelRange(): void {\n const levels = this.config.levels;\n if (levels.length === 0) {\n return;\n }\n\n const maxZoomInColumnWidth = 120;\n const maxZoomOutColumnWidth = 150;\n\n let maxMinUnit: ITimelineScale | null = null;\n let maxMinUnitMs = 0;\n let minMinUnit: ITimelineScale | null = null;\n let minMinUnitMs = Infinity;\n\n for (const level of levels) {\n const minUnit = this.findMinTimeUnit(level);\n const unitMs = this.getUnitMilliseconds(minUnit.unit, minUnit.step);\n\n if (unitMs > maxMinUnitMs) {\n maxMinUnitMs = unitMs;\n maxMinUnit = minUnit;\n }\n\n if (unitMs < minMinUnitMs) {\n minMinUnitMs = unitMs;\n minMinUnit = minUnit;\n }\n }\n\n if (!maxMinUnit || !minMinUnit) {\n console.error('ZoomScale: 无法找到有效的时间单位');\n return;\n }\n\n this.globalMinMillisecondsPerPixel = minMinUnitMs / maxZoomInColumnWidth;\n this.globalMaxMillisecondsPerPixel = maxMinUnitMs / maxZoomOutColumnWidth;\n\n // 确保 minMillisecondsPerPixel < maxMillisecondsPerPixel\n if (this.globalMinMillisecondsPerPixel > this.globalMaxMillisecondsPerPixel) {\n const temp = this.globalMinMillisecondsPerPixel;\n this.globalMinMillisecondsPerPixel = this.globalMaxMillisecondsPerPixel;\n this.globalMaxMillisecondsPerPixel = temp;\n }\n }\n\n /**\n * 计算级别边界\n */\n private calculateLevelBoundaries(): void {\n const levelCount = this.config.levels.length;\n if (levelCount === 0) {\n return;\n }\n\n this.levelBoundaries = [];\n const idealBoundaries: number[] = [];\n\n idealBoundaries[levelCount] = this.globalMinMillisecondsPerPixel;\n\n // 从精细级别开始计算理想边界\n for (let i = levelCount - 1; i >= 1; i--) {\n const currentLevel = this.config.levels[i];\n const currentMinUnit = this.findMinTimeUnit(currentLevel);\n const currentUnitMs = this.getUnitMilliseconds(currentMinUnit.unit, currentMinUnit.step);\n const minColWidth = this.getMinColWidthForUnit(currentMinUnit.unit, currentMinUnit.step);\n const idealBoundary = currentUnitMs / minColWidth;\n idealBoundaries[i] = idealBoundary;\n }\n\n idealBoundaries[0] = this.globalMaxMillisecondsPerPixel;\n this.levelBoundaries = [...idealBoundaries];\n\n // 调整边界确保递减顺序\n for (let i = 1; i < levelCount; i++) {\n if (this.levelBoundaries[i] >= this.levelBoundaries[i - 1]) {\n const prevBoundary = this.levelBoundaries[i - 1];\n const nextBoundary = this.levelBoundaries[i + 1] || this.globalMinMillisecondsPerPixel;\n this.levelBoundaries[i] = (prevBoundary + nextBoundary) / 2;\n }\n\n this.levelBoundaries[i] = Math.max(\n this.globalMinMillisecondsPerPixel,\n Math.min(this.globalMaxMillisecondsPerPixel, this.levelBoundaries[i])\n );\n }\n }\n\n updateZoomLimits(): void {\n if (!this.gantt.parsedOptions.zoom) {\n this.gantt.parsedOptions.zoom = {};\n }\n this.gantt.parsedOptions.zoom.minMillisecondsPerPixel = this.globalMinMillisecondsPerPixel;\n this.gantt.parsedOptions.zoom.maxMillisecondsPerPixel = this.globalMaxMillisecondsPerPixel;\n }\n\n /**\n * 获取全局最小 millisecondsPerPixel\n */\n getGlobalMinMillisecondsPerPixel(): number {\n return this.globalMinMillisecondsPerPixel;\n }\n\n /**\n * 获取全局最大 millisecondsPerPixel\n */\n getGlobalMaxMillisecondsPerPixel(): number {\n return this.globalMaxMillisecondsPerPixel;\n }\n\n /**\n * 计算初始的 millisecondsPerPixel 值\n * 选择全局范围内 40% 的位置作为初始缩放级别\n */\n private calculateInitialMillisecondsPerPixel(): number {\n return (\n this.globalMinMillisecondsPerPixel +\n (this.globalMaxMillisecondsPerPixel - this.globalMinMillisecondsPerPixel) * 0.4\n );\n }\n\n private initializeWithMillisecondsPerPixel(millisecondsPerPixel: number): void {\n if (this.config.levels.length === 0) {\n return;\n }\n const optimalLevel = this.findOptimalLevel(millisecondsPerPixel);\n this.setInitialLevel(optimalLevel);\n }\n\n private setInitialLevel(levelIndex: number): void {\n if (levelIndex < 0 || levelIndex >= this.config.levels.length) {\n console.error(`ZoomScale: 无效的初始级别索引 ${levelIndex}`);\n return;\n }\n\n const levelScales = this.config.levels[levelIndex];\n if (!levelScales || levelScales.length === 0) {\n console.error(`ZoomScale: 初始级别 ${levelIndex} 没有配置 scales`);\n return;\n }\n\n this.gantt.options.timelineHeader.scales = [...levelScales];\n this.currentLevelIndex = levelIndex;\n }\n\n /**\n * 根据 millisecondsPerPixel 找到最合适的级别\n */\n findOptimalLevel(millisecondsPerPixel: number): number {\n const clampedMillisecondsPerPixel = Math.max(\n this.globalMinMillisecondsPerPixel,\n Math.min(this.globalMaxMillisecondsPerPixel, millisecondsPerPixel)\n );\n\n for (let i = 0; i < this.levelBoundaries.length - 1; i++) {\n if (\n clampedMillisecondsPerPixel <= this.levelBoundaries[i] &&\n clampedMillisecondsPerPixel > this.levelBoundaries[i + 1]\n ) {\n return i;\n }\n }\n\n return this.config.levels.length - 1;\n }\n\n /**\n * 切换到指定级别\n */\n switchToLevel(levelIndex: number): boolean {\n if (levelIndex < 0 || levelIndex >= this.config.levels.length) {\n console.error(`ZoomScale: 无效的级别索引 ${levelIndex}`);\n return false;\n }\n\n if (this.currentLevelIndex === levelIndex) {\n return true;\n }\n\n const levelScales = this.config.levels[levelIndex];\n if (!levelScales || levelScales.length === 0) {\n console.error(`ZoomScale: 级别 ${levelIndex} 没有配置 scales`);\n return false;\n }\n\n try {\n this.gantt.updateScales([...levelScales]);\n this.currentLevelIndex = levelIndex;\n this.gantt.recalculateTimeScale();\n return true;\n } catch (error) {\n console.error('ZoomScale: 切换级别时发生错误', error);\n return false;\n }\n }\n\n findMinTimeUnit(scales: ITimelineScale[]): ITimelineScale {\n let minUnit = scales[0];\n let minUnitMs = this.getUnitMilliseconds(minUnit.unit, minUnit.step);\n\n for (const scale of scales) {\n const unitMs = this.getUnitMilliseconds(scale.unit, scale.step);\n if (unitMs < minUnitMs) {\n minUnitMs = unitMs;\n minUnit = scale;\n }\n }\n\n return minUnit;\n }\n\n private getUnitMilliseconds(unit: string, step: number): number {\n const unitMs: Record<string, number> = {\n second: 1000,\n minute: 60 * 1000,\n hour: 60 * 60 * 1000,\n day: 24 * 60 * 60 * 1000,\n week: 7 * 24 * 60 * 60 * 1000,\n month: 30 * 24 * 60 * 60 * 1000,\n quarter: 90 * 24 * 60 * 60 * 1000,\n year: 365 * 24 * 60 * 60 * 1000\n };\n\n return (unitMs[unit] || unitMs.day) * step;\n }\n\n private getMinColWidthForUnit(unit: string, step: number): number {\n switch (unit) {\n case 'hour':\n return step > 1 ? 120 : 60;\n case 'minute':\n return 80;\n case 'second':\n return 100;\n case 'day':\n case 'week':\n case 'month':\n case 'quarter':\n case 'year':\n default:\n return 60;\n }\n }\n\n getCurrentLevel(): number {\n return this.currentLevelIndex;\n }\n\n getInitialMillisecondsPerPixel(): number {\n return this.calculateInitialMillisecondsPerPixel();\n }\n\n /**\n * 获取当前缩放位置的层级状态\n */\n getCurrentZoomState() {\n if (this.config.levels.length === 0) {\n return null;\n }\n\n const currentLevel = this.config.levels[this.currentLevelIndex];\n const minUnit = this.findMinTimeUnit(currentLevel);\n const currentMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel();\n const unitMs = this.getUnitMilliseconds(minUnit.unit, minUnit.step);\n const currentColWidth = unitMs / currentMillisecondsPerPixel;\n\n return {\n minUnit: minUnit.unit,\n step: minUnit.step,\n levelNum: this.currentLevelIndex,\n currentColWidth: Math.round(currentColWidth * 10) / 10\n };\n }\n\n /**\n * 设置当前缩放位置\n */\n setZoomPosition(params: { minUnit?: string; step?: number; levelNum?: number; colWidth?: number }): boolean {\n if (this.config.levels.length === 0) {\n return false;\n }\n\n const { minUnit, step, levelNum, colWidth } = params;\n\n // 确定目标级别\n let targetLevelIndex: number | null = null;\n\n // 模式1:通过 minUnit + step 确定级别\n if (minUnit !== undefined && step !== undefined) {\n targetLevelIndex = this.findLevelByMinUnit(minUnit, step);\n if (targetLevelIndex === null) {\n console.warn(`ZoomScale: 找不到 ${minUnit}*${step} 对应的级别`);\n return false;\n }\n }\n // 模式2:通过 levelNum 确定级别\n else if (levelNum !== undefined) {\n if (levelNum < 0 || levelNum >= this.config.levels.length) {\n console.warn(`ZoomScale: 无效的级别索引 ${levelNum}`);\n return false;\n }\n targetLevelIndex = levelNum;\n } else {\n console.warn('ZoomScale: 必须提供 (minUnit+step) 或 levelNum');\n return false;\n }\n\n let targetMillisecondsPerPixel: number;\n\n if (colWidth !== undefined) {\n const targetLevel = this.config.levels[targetLevelIndex];\n const targetMinUnit = this.findMinTimeUnit(targetLevel);\n const unitMs = this.getUnitMilliseconds(targetMinUnit.unit, targetMinUnit.step);\n targetMillisecondsPerPixel = unitMs / colWidth;\n\n const upperBoundary = this.levelBoundaries[targetLevelIndex];\n const lowerBoundary = this.levelBoundaries[targetLevelIndex + 1];\n\n if (targetMillisecondsPerPixel < lowerBoundary || targetMillisecondsPerPixel > upperBoundary) {\n targetMillisecondsPerPixel = (upperBoundary + lowerBoundary) / 2;\n }\n } else {\n const upperBoundary = this.levelBoundaries[targetLevelIndex];\n const lowerBoundary = this.levelBoundaries[targetLevelIndex + 1];\n targetMillisecondsPerPixel = (upperBoundary + lowerBoundary) / 2;\n }\n\n if (targetLevelIndex !== this.currentLevelIndex) {\n this.switchToLevel(targetLevelIndex);\n }\n\n this.gantt.setMillisecondsPerPixel(targetMillisecondsPerPixel);\n\n return true;\n }\n\n /**\n * 根据 minUnit 和 step 查找对应的级别索引\n */\n private findLevelByMinUnit(unit: string, step: number): number | null {\n for (let i = 0; i < this.config.levels.length; i++) {\n const level = this.config.levels[i];\n const minUnit = this.findMinTimeUnit(level);\n if (minUnit.unit === unit && minUnit.step === step) {\n return i;\n }\n }\n return null;\n }\n\n /**\n * 放大时间轴\n * @param factor 缩放因子,大于1表示放大\n * @param center 是否保持视图中心不变\n * @param centerX 缩放中心点X坐标\n */\n zoomIn(factor: number = 1.1, center: boolean = true, centerX?: number): void {\n this.gantt.zoomByFactor(factor, center, centerX);\n }\n\n /**\n * 缩小时间轴\n * @param factor 缩放因子,小于1表示缩小\n * @param center 是否保持视图中心不变\n * @param centerX 缩放中心点X坐标\n */\n zoomOut(factor: number = 0.9, center: boolean = true, centerX?: number): void {\n this.gantt.zoomByFactor(factor, center, centerX);\n }\n\n /**\n * 基于全局范围的百分比缩放\n * @param percentage 缩放百分比 (0-100),正数表示放大,负数表示缩小\n * @param center 是否保持视图中心不变\n * @param centerX 缩放中心点X坐标\n */\n zoomByPercentage(percentage: number, center: boolean = true, centerX?: number): void {\n const currentMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel();\n const totalRange = this.globalMaxMillisecondsPerPixel - this.globalMinMillisecondsPerPixel;\n const deltaMillisecondsPerPixel = (totalRange * percentage) / 100;\n\n const targetMillisecondsPerPixel = currentMillisecondsPerPixel - deltaMillisecondsPerPixel;\n\n let centerTimePosition: number | undefined;\n if (center && this.gantt.scenegraph) {\n if (centerX === undefined) {\n centerX = this.gantt.scenegraph.width / 2;\n }\n centerTimePosition = (this.gantt.stateManager.scroll.horizontalBarPos + centerX) * currentMillisecondsPerPixel;\n }\n\n const targetLevel = this.findOptimalLevel(targetMillisecondsPerPixel);\n const currentLevel = this.getCurrentLevel();\n\n if (targetLevel !== currentLevel) {\n this.switchToLevel(targetLevel);\n }\n\n this.gantt.setMillisecondsPerPixel(targetMillisecondsPerPixel);\n\n if (centerTimePosition !== undefined && centerX !== undefined) {\n const newScrollLeft = centerTimePosition / this.gantt.getCurrentMillisecondsPerPixel() - centerX;\n this.gantt.stateManager.setScrollLeft(newScrollLeft);\n }\n }\n\n /**\n * 获取 DataZoom 集成实例\n * @returns DataZoom 集成实例,如果未启用则返回 null\n */\n getDataZoomIntegration(): DataZoomIntegration | null {\n return this.dataZoomIntegration;\n }\n\n /**\n * 创建 DataZoom 集成\n * @param config DataZoom 配置\n * @returns DataZoom 集成实例\n */\n createDataZoomIntegration(config: DataZoomConfig): DataZoomIntegration {\n // 如果已经有通过配置创建的实例,先销毁它\n if (this.dataZoomIntegration) {\n console.warn('ZoomScaleManager: 已存在 DataZoom 集成实例,将被替换');\n this.dataZoomIntegration.destroy();\n }\n\n this.dataZoomIntegration = new DataZoomIntegration(this.gantt, config);\n return this.dataZoomIntegration;\n }\n\n /**\n * 销毁 DataZoom 集成\n */\n destroyDataZoomIntegration(): void {\n if (this.dataZoomIntegration) {\n this.dataZoomIntegration.destroy();\n this.dataZoomIntegration = null;\n }\n }\n\n /**\n * 响应式更新 DataZoom\n * 当 Gantt 容器大小发生变化时调用\n */\n updateDataZoomResponsive(): void {\n if (this.dataZoomIntegration) {\n this.dataZoomIntegration.updateResponsive();\n }\n }\n\n /**\n * 重新计算时间相关的尺寸参数\n * 用于根据当前 millisecondsPerPixel 重新计算 timelineColWidth\n * (从 Gantt.ts 移动到这里)\n */\n recalculateTimeScale(): void {\n // 获取当前的主时间刻度\n const primaryScale = this.gantt.parsedOptions.reverseSortedTimelineScales[0];\n if (!primaryScale) {\n return;\n }\n\n // 根据当前 scale 的 unit 和 step 计算每个单元格应该占用的毫秒数\n let msPerStep: number;\n switch (primaryScale.unit as string) {\n case 'second':\n msPerStep = 1000 * primaryScale.step;\n break;\n case 'minute':\n msPerStep = 60 * 1000 * primaryScale.step;\n break;\n case 'hour':\n msPerStep = 60 * 60 * 1000 * primaryScale.step;\n break;\n case 'day':\n msPerStep = 24 * 60 * 60 * 1000 * primaryScale.step;\n break;\n case 'week':\n msPerStep = 7 * 24 * 60 * 60 * 1000 * primaryScale.step;\n break;\n case 'month':\n msPerStep = 30 * 24 * 60 * 60 * 1000 * primaryScale.step;\n break;\n case 'quarter':\n msPerStep = 90 * 24 * 60 * 60 * 1000 * primaryScale.step;\n break;\n case 'year':\n msPerStep = 365 * 24 * 60 * 60 * 1000 * primaryScale.step;\n break;\n default:\n msPerStep = 24 * 60 * 60 * 1000 * primaryScale.step;\n }\n const newTimelineColWidth = msPerStep / this.gantt.getCurrentMillisecondsPerPixel();\n\n this.gantt.parsedOptions.timelineColWidth = newTimelineColWidth;\n\n // 重新生成时间线日期映射\n this.gantt._generateTimeLineDateMap();\n\n // 更新尺寸和重新渲染\n if (this.gantt.scenegraph) {\n this.gantt._updateSize();\n this.gantt.scenegraph.refreshAll();\n }\n }\n\n /**\n * 缩放方法,用于滚轮和双指缩放\n * (从 Gantt.ts 移动到这里)\n * @param factor 缩放因子,大于1表示放大\n * @param keepCenter 是否保持视图中心不变\n * @param centerX 缩放中心点X坐标\n */\n zoomByFactor(factor: number, keepCenter: boolean = true, centerX?: number): void {\n const minMillisecondsPerPixel = this.gantt.parsedOptions.zoom?.minMillisecondsPerPixel ?? 200000;\n const maxMillisecondsPerPixel = this.gantt.parsedOptions.zoom?.maxMillisecondsPerPixel ?? 3000000;\n\n const oldMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel();\n const oldWidth = this.gantt.parsedOptions.timelineColWidth;\n\n // 在级别切换前先计算中心时间位置\n let centerTimePosition: number | undefined;\n if (keepCenter) {\n if (centerX === undefined) {\n centerX = this.gantt.scenegraph.width / 2;\n }\n // 计算中心点对应的绝对时间位置\n const scrollOffsetMs = (this.gantt.stateManager.scroll.horizontalBarPos + centerX) * oldMillisecondsPerPixel;\n centerTimePosition = this.gantt.parsedOptions._minDateTime + scrollOffsetMs;\n }\n\n const currentMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel();\n let adjustedFactor = factor;\n\n const baseMillisecondsPerPixel = 1440000;\n const zoomRatio = Math.log(currentMillisecondsPerPixel / baseMillisecondsPerPixel) / Math.log(2);\n\n if (currentMillisecondsPerPixel < baseMillisecondsPerPixel) {\n const enhancement = Math.pow(1.2, -zoomRatio);\n adjustedFactor = Math.pow(factor, enhancement);\n } else {\n const dampening = Math.pow(0.9, zoomRatio);\n adjustedFactor = Math.pow(factor, dampening);\n }\n\n const newMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel() / adjustedFactor;\n const clampedMillisecondsPerPixel = Math.max(\n minMillisecondsPerPixel,\n Math.min(maxMillisecondsPerPixel, newMillisecondsPerPixel)\n );\n this.gantt.setMillisecondsPerPixel(clampedMillisecondsPerPixel);\n\n const targetLevel = this.findOptimalLevel(clampedMillisecondsPerPixel);\n const currentLevel = this.getCurrentLevel();\n\n if (targetLevel !== currentLevel) {\n this.switchToLevel(targetLevel);\n } else {\n this.recalculateTimeScale();\n }\n\n // 在级别切换和重新计算后再调整视图中心\n if (keepCenter && centerTimePosition !== undefined && centerX !== undefined) {\n const actualMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel();\n // 计算中心时间相对于新minDate的偏移量\n const newMinDateTime = this.gantt.parsedOptions._minDateTime;\n const timeOffsetFromNewMin = centerTimePosition - newMinDateTime;\n const newScrollLeft = timeOffsetFromNewMin / actualMillisecondsPerPixel - centerX;\n this.gantt.stateManager.setScrollLeft(newScrollLeft);\n }\n\n // 触发缩放事件\n if (this.gantt.hasListeners(GANTT_EVENT_TYPE.ZOOM)) {\n const actualMillisecondsPerPixel = this.gantt.getCurrentMillisecondsPerPixel();\n this.gantt.fireListeners(GANTT_EVENT_TYPE.ZOOM, {\n oldWidth,\n newWidth: this.gantt.parsedOptions.timelineColWidth,\n scale: oldMillisecondsPerPixel / actualMillisecondsPerPixel,\n oldMillisecondsPerPixel,\n newMillisecondsPerPixel: actualMillisecondsPerPixel\n });\n }\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { ZoomScaleManager } from './ZoomScaleManager';
2
+ export { DataZoomIntegration } from './DataZoomIntegration';
3
+ export type { DataZoomConfig, DataZoomLimits } from './DataZoomIntegration';
4
+ export type { IZoomScale, IDataZoomAxisConfig, ILevelThreshold } from '../ts-types/zoom-scale';
@@ -0,0 +1,4 @@
1
+ export { ZoomScaleManager } from "./ZoomScaleManager";
2
+
3
+ export { DataZoomIntegration } from "./DataZoomIntegration";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/zoom-scale/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC","file":"index.js","sourcesContent":["export { ZoomScaleManager } from './ZoomScaleManager';\nexport { DataZoomIntegration } from './DataZoomIntegration';\nexport type { DataZoomConfig, DataZoomLimits } from './DataZoomIntegration';\nexport type { IZoomScale, IDataZoomAxisConfig, ILevelThreshold } from '../ts-types/zoom-scale';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visactor/vtable-gantt",
3
- "version": "1.20.3",
3
+ "version": "1.21.0",
4
4
  "description": "canvas table width high performance",
5
5
  "keywords": [
6
6
  "vtable-gantt",
@@ -41,8 +41,8 @@
41
41
  "@visactor/vscale": "~0.18.1",
42
42
  "@visactor/vdataset": "~0.18.1",
43
43
  "cssfontparser": "^1.2.1",
44
- "@visactor/vtable": "1.20.3",
45
- "@visactor/vtable-editors": "1.20.3"
44
+ "@visactor/vtable": "1.21.0",
45
+ "@visactor/vtable-editors": "1.21.0"
46
46
  },
47
47
  "devDependencies": {
48
48
  "cross-env": "^7.0.3",
@@ -93,9 +93,9 @@
93
93
  "d3-hierarchy": "^3.1.1",
94
94
  "@resvg/resvg-js": "^2.5.0",
95
95
  "pikaday": "1.8.2",
96
- "@internal/bundler": "0.0.1",
96
+ "@internal/eslint-config": "0.0.1",
97
97
  "@internal/ts-config": "0.0.1",
98
- "@internal/eslint-config": "0.0.1"
98
+ "@internal/bundler": "0.0.1"
99
99
  },
100
100
  "unpkg": "latest",
101
101
  "unpkgFiles": [