jsgantt-improved 2.8.9 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.mocharc.cjs +5 -0
- package/.travis.yml +0 -2
- package/Documentation.md +1 -1
- package/dist/draw_columns.js +171 -0
- package/dist/draw_dependencies.js +97 -0
- package/dist/e2e/app.e2e-spec.js +3 -3
- package/dist/e2e/app.e2e-spec.js.map +1 -1
- package/dist/e2e/app.po.js +5 -5
- package/dist/e2e/app.po.js.map +1 -1
- package/dist/jsgantt.js +580 -473
- package/dist/json.js +200 -0
- package/dist/lang.js +1635 -0
- package/dist/options.js +219 -0
- package/dist/playwright.config.js +33 -0
- package/dist/playwright.config.js.map +1 -0
- package/dist/src/draw.js +149 -148
- package/dist/src/draw.js.map +1 -1
- package/dist/src/draw_columns.js +66 -63
- package/dist/src/draw_columns.js.map +1 -1
- package/dist/src/draw_dependencies.js +4 -2
- package/dist/src/draw_dependencies.js.map +1 -1
- package/dist/src/events.js +72 -54
- package/dist/src/events.js.map +1 -1
- package/dist/src/json.js +10 -7
- package/dist/src/json.js.map +1 -1
- package/dist/src/lang.js +1 -1
- package/dist/src/lang.js.map +1 -1
- package/dist/src/options.js +14 -13
- package/dist/src/options.js.map +1 -1
- package/dist/src/task.js +61 -49
- package/dist/src/task.js.map +1 -1
- package/dist/src/utils/date_utils.js +46 -15
- package/dist/src/utils/date_utils.js.map +1 -1
- package/dist/src/utils/draw_utils.js +24 -18
- package/dist/src/utils/draw_utils.js.map +1 -1
- package/dist/src/utils/general_utils.js +59 -36
- package/dist/src/utils/general_utils.js.map +1 -1
- package/dist/src/utils.js +498 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/src/xml.js +74 -67
- package/dist/src/xml.js.map +1 -1
- package/dist/test/e2e/gantt.page.js +150 -0
- package/dist/test/e2e/gantt.page.js.map +1 -0
- package/dist/test/e2e/issue172-row-alignment.spec.js +198 -0
- package/dist/test/e2e/issue172-row-alignment.spec.js.map +1 -0
- package/dist/test/e2e/issue207-bar-axis-alignment.spec.js +329 -0
- package/dist/test/e2e/issue207-bar-axis-alignment.spec.js.map +1 -0
- package/dist/test/e2e/issue255-show-weekends.spec.js +102 -0
- package/dist/test/e2e/issue255-show-weekends.spec.js.map +1 -0
- package/dist/test/e2e/issue349-taskname-click-event.spec.js +270 -0
- package/dist/test/e2e/issue349-taskname-click-event.spec.js.map +1 -0
- package/dist/test/e2e/issue48-dependency-lines.spec.js +204 -0
- package/dist/test/e2e/issue48-dependency-lines.spec.js.map +1 -0
- package/dist/test/e2e/issue54-month-today.spec.js +181 -0
- package/dist/test/e2e/issue54-month-today.spec.js.map +1 -0
- package/dist/test/e2e/issue68-working-days.spec.js +243 -0
- package/dist/test/e2e/issue68-working-days.spec.js.map +1 -0
- package/dist/test/e2e/zoom-alignment.spec.js +133 -0
- package/dist/test/e2e/zoom-alignment.spec.js.map +1 -0
- package/dist/test/index.js +3 -8
- package/dist/test/index.js.map +1 -1
- package/dist/test/unit/date-utils.spec.js +180 -0
- package/dist/test/unit/date-utils.spec.js.map +1 -0
- package/dist/test/unit/draw-cols-chart.spec.js +105 -0
- package/dist/test/unit/draw-cols-chart.spec.js.map +1 -0
- package/dist/test/unit/gantt-chart-constructor.spec.js +85 -0
- package/dist/test/unit/gantt-chart-constructor.spec.js.map +1 -0
- package/dist/test/unit/helpers.js +67 -0
- package/dist/test/unit/helpers.js.map +1 -0
- package/dist/test/unit/task-item.spec.js +46 -0
- package/dist/test/unit/task-item.spec.js.map +1 -0
- package/dist/test/unit/task-management.spec.js +141 -0
- package/dist/test/unit/task-management.spec.js.map +1 -0
- package/dist/test/unit/working-days.spec.js +109 -0
- package/dist/test/unit/working-days.spec.js.map +1 -0
- package/dist/utils/draw_utils.js +169 -0
- package/dist/utils/general_utils.js +498 -0
- package/dist/xml.js +345 -0
- package/dist-e2e/gantt.page.js +79 -0
- package/dist-e2e/gantt.page.js.map +1 -0
- package/dist-e2e/issue-setMinDate-setMaxDate.spec.js +96 -0
- package/dist-e2e/issue172-row-alignment.spec.js +90 -0
- package/dist-e2e/issue172-row-alignment.spec.js.map +1 -0
- package/dist-e2e/issue207-bar-axis-alignment.spec.js +161 -0
- package/dist-e2e/issue207-bar-axis-alignment.spec.js.map +1 -0
- package/dist-e2e/issue349-taskname-click-event.spec.js +170 -0
- package/dist-e2e/issue349-taskname-click-event.spec.js.map +1 -0
- package/dist-e2e/issue375-column-visibility.spec.js +129 -0
- package/dist-e2e/issue375-column-visibility.spec.js.map +1 -0
- package/dist-e2e/issue54-month-today.spec.js +84 -0
- package/dist-e2e/issue54-month-today.spec.js.map +1 -0
- package/dist-e2e/issue68-working-days.spec.js +105 -0
- package/dist-e2e/issue68-working-days.spec.js.map +1 -0
- package/docs/index.js +5 -2
- package/docs/jsgantt.js +5749 -0
- package/jsgantt.js +5749 -0
- package/package.json +10 -18
- package/pw-e2e.config.js +13 -0
- package/test-results/.last-run.json +4 -0
- package/protractor.conf.js +0 -29
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* E2E tests for issue #172: Week view creates a "step" (vertical row
|
|
4
|
+
* misalignment) between the left task-list panel and the right chart panel.
|
|
5
|
+
*
|
|
6
|
+
* Root behaviour tested:
|
|
7
|
+
* For every format (week, month, day, quarter), and for the specific
|
|
8
|
+
* combination reported in the issue (week format with hidden columns),
|
|
9
|
+
* the top edge of each body row in .gtasktable must align with the
|
|
10
|
+
* corresponding row in .gcharttable within ALIGN_TOLERANCE_PX.
|
|
11
|
+
*
|
|
12
|
+
* Additionally the left and right header panels must be the same total
|
|
13
|
+
* height so the body rows stay in sync even after scrolling.
|
|
14
|
+
*/
|
|
15
|
+
var __assign = (this && this.__assign) || function () {
|
|
16
|
+
__assign = Object.assign || function(t) {
|
|
17
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
18
|
+
s = arguments[i];
|
|
19
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
20
|
+
t[p] = s[p];
|
|
21
|
+
}
|
|
22
|
+
return t;
|
|
23
|
+
};
|
|
24
|
+
return __assign.apply(this, arguments);
|
|
25
|
+
};
|
|
26
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
27
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
28
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
29
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
30
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
31
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
32
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
36
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
37
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
38
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
39
|
+
function step(op) {
|
|
40
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
41
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
42
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
43
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
44
|
+
switch (op[0]) {
|
|
45
|
+
case 0: case 1: t = op; break;
|
|
46
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
47
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
48
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
49
|
+
default:
|
|
50
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
51
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
52
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
53
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
54
|
+
if (t[2]) _.ops.pop();
|
|
55
|
+
_.trys.pop(); continue;
|
|
56
|
+
}
|
|
57
|
+
op = body.call(thisArg, _);
|
|
58
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
59
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
63
|
+
var test_1 = require("@playwright/test");
|
|
64
|
+
var ALIGN_TOLERANCE_PX = 2;
|
|
65
|
+
function gotoDemo(page) {
|
|
66
|
+
var _a;
|
|
67
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
68
|
+
var baseURL, url;
|
|
69
|
+
return __generator(this, function (_b) {
|
|
70
|
+
switch (_b.label) {
|
|
71
|
+
case 0:
|
|
72
|
+
baseURL = (_a = process.env.JSGANTT_E2E_BASE_URL) !== null && _a !== void 0 ? _a : 'http://localhost:8080';
|
|
73
|
+
url = baseURL.replace(/\/$/, '') + '/demo.html';
|
|
74
|
+
return [4 /*yield*/, page.goto(url, { waitUntil: 'load' })];
|
|
75
|
+
case 1:
|
|
76
|
+
_b.sent();
|
|
77
|
+
return [4 /*yield*/, page.waitForFunction(function () { return typeof window.JSGantt !== 'undefined'; }, { timeout: 15000 })];
|
|
78
|
+
case 2:
|
|
79
|
+
_b.sent();
|
|
80
|
+
return [2 /*return*/];
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function measureRowAlignment(page, format, options) {
|
|
86
|
+
if (options === void 0) { options = {}; }
|
|
87
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
88
|
+
return __generator(this, function (_a) {
|
|
89
|
+
return [2 /*return*/, page.evaluate(function (_a) {
|
|
90
|
+
var fmt = _a.fmt, opts = _a.opts;
|
|
91
|
+
var container = document.getElementById('embedded-Gantt');
|
|
92
|
+
container.innerHTML = '';
|
|
93
|
+
var g = new window.JSGantt.GanttChart(container, fmt);
|
|
94
|
+
g.setOptions(__assign({ vFormat: fmt, vShowDeps: 0, vLang: 'en' }, opts));
|
|
95
|
+
var T = window.JSGantt.TaskItem;
|
|
96
|
+
g.AddTaskItem(new T(1, 'Group A', '2024-01-01', '2024-03-31', 'ggroupblack', '', 0, '', 0, 1, 0, 1, '', '', '', g));
|
|
97
|
+
g.AddTaskItem(new T(2, 'Task 1', '2024-01-01', '2024-01-14', 'gtaskblue', '', 0, 'R1', 0, 0, 1, 1, '', '', '', g));
|
|
98
|
+
g.AddTaskItem(new T(3, 'Task 2', '2024-01-15', '2024-02-28', 'gtaskgreen', '', 0, 'R2', 0, 0, 1, 1, '', '', '', g));
|
|
99
|
+
g.AddTaskItem(new T(4, 'Task 3', '2024-03-01', '2024-03-31', 'gtaskorange', '', 0, 'R3', 0, 0, 1, 1, '', '', '', g));
|
|
100
|
+
g.Draw();
|
|
101
|
+
var leftTable = document.querySelector('.gtasktable');
|
|
102
|
+
var rightTable = document.querySelector('.gcharttable');
|
|
103
|
+
var leftHeaderEl = document.querySelector('.gtasktableh');
|
|
104
|
+
var rightHeaderEl = document.querySelector('.gcharttableh');
|
|
105
|
+
if (!leftTable || !rightTable || !leftHeaderEl || !rightHeaderEl) {
|
|
106
|
+
return { leftHeaderHeight: 0, rightHeaderHeight: 0, maxBodyDrift: -1, rowCount: 0, misalignedRows: [] };
|
|
107
|
+
}
|
|
108
|
+
var leftHeaderHeight = Math.round(leftHeaderEl.getBoundingClientRect().height * 10) / 10;
|
|
109
|
+
var rightHeaderHeight = Math.round(rightHeaderEl.getBoundingClientRect().height * 10) / 10;
|
|
110
|
+
var leftRows = Array.from(leftTable.querySelectorAll('tr')).map(function (tr) { return Math.round(tr.getBoundingClientRect().top * 10) / 10; });
|
|
111
|
+
var rightRows = Array.from(rightTable.querySelectorAll('tr')).map(function (tr) { return Math.round(tr.getBoundingClientRect().top * 10) / 10; });
|
|
112
|
+
var count = Math.min(leftRows.length, rightRows.length);
|
|
113
|
+
var maxBodyDrift = 0;
|
|
114
|
+
var misalignedRows = [];
|
|
115
|
+
for (var i = 0; i < count; i++) {
|
|
116
|
+
var drift = Math.abs(leftRows[i] - rightRows[i]);
|
|
117
|
+
if (drift > maxBodyDrift)
|
|
118
|
+
maxBodyDrift = drift;
|
|
119
|
+
if (drift > 2)
|
|
120
|
+
misalignedRows.push({ index: i, leftTop: leftRows[i], rightTop: rightRows[i], drift: drift });
|
|
121
|
+
}
|
|
122
|
+
return { leftHeaderHeight: leftHeaderHeight, rightHeaderHeight: rightHeaderHeight, maxBodyDrift: Math.round(maxBodyDrift * 10) / 10, rowCount: count, misalignedRows: misalignedRows };
|
|
123
|
+
}, { fmt: format, opts: options })];
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
var FORMATS = ['week', 'month', 'day', 'quarter'];
|
|
128
|
+
test_1.test.describe('Issue #172 — left/right panel row alignment', function () {
|
|
129
|
+
var _loop_1 = function (fmt) {
|
|
130
|
+
(0, test_1.test)("".concat(fmt, " format: body rows are aligned between task list and chart"), function (_a) {
|
|
131
|
+
var page = _a.page;
|
|
132
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
133
|
+
var result;
|
|
134
|
+
return __generator(this, function (_b) {
|
|
135
|
+
switch (_b.label) {
|
|
136
|
+
case 0: return [4 /*yield*/, gotoDemo(page)];
|
|
137
|
+
case 1:
|
|
138
|
+
_b.sent();
|
|
139
|
+
return [4 /*yield*/, measureRowAlignment(page, fmt)];
|
|
140
|
+
case 2:
|
|
141
|
+
result = _b.sent();
|
|
142
|
+
(0, test_1.expect)(result.rowCount, "should find task rows in ".concat(fmt, " format")).toBeGreaterThan(0);
|
|
143
|
+
(0, test_1.expect)(result.maxBodyDrift, "".concat(fmt, ": max row drift=").concat(result.maxBodyDrift, "px; misaligned: ").concat(JSON.stringify(result.misalignedRows))).toBeLessThanOrEqual(ALIGN_TOLERANCE_PX);
|
|
144
|
+
return [2 /*return*/];
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
(0, test_1.test)("".concat(fmt, " format: left and right header panels are the same height"), function (_a) {
|
|
150
|
+
var page = _a.page;
|
|
151
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
152
|
+
var result, heightDiff;
|
|
153
|
+
return __generator(this, function (_b) {
|
|
154
|
+
switch (_b.label) {
|
|
155
|
+
case 0: return [4 /*yield*/, gotoDemo(page)];
|
|
156
|
+
case 1:
|
|
157
|
+
_b.sent();
|
|
158
|
+
return [4 /*yield*/, measureRowAlignment(page, fmt)];
|
|
159
|
+
case 2:
|
|
160
|
+
result = _b.sent();
|
|
161
|
+
heightDiff = Math.abs(result.leftHeaderHeight - result.rightHeaderHeight);
|
|
162
|
+
(0, test_1.expect)(heightDiff, "".concat(fmt, ": left header=").concat(result.leftHeaderHeight, "px, right header=").concat(result.rightHeaderHeight, "px, diff=").concat(heightDiff, "px")).toBeLessThanOrEqual(ALIGN_TOLERANCE_PX);
|
|
163
|
+
return [2 /*return*/];
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
for (var _i = 0, FORMATS_1 = FORMATS; _i < FORMATS_1.length; _i++) {
|
|
170
|
+
var fmt = FORMATS_1[_i];
|
|
171
|
+
_loop_1(fmt);
|
|
172
|
+
}
|
|
173
|
+
(0, test_1.test)('week format with hidden columns (exact scenario from issue #172)', function (_a) {
|
|
174
|
+
var page = _a.page;
|
|
175
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
176
|
+
var result, heightDiff;
|
|
177
|
+
return __generator(this, function (_b) {
|
|
178
|
+
switch (_b.label) {
|
|
179
|
+
case 0: return [4 /*yield*/, gotoDemo(page)];
|
|
180
|
+
case 1:
|
|
181
|
+
_b.sent();
|
|
182
|
+
return [4 /*yield*/, measureRowAlignment(page, 'week', {
|
|
183
|
+
vShowRes: 0, vShowCost: 0, vShowComp: 0, vShowDur: 0,
|
|
184
|
+
vShowStartDate: 0, vShowEndDate: 0,
|
|
185
|
+
})];
|
|
186
|
+
case 2:
|
|
187
|
+
result = _b.sent();
|
|
188
|
+
(0, test_1.expect)(result.rowCount, 'should find task rows').toBeGreaterThan(0);
|
|
189
|
+
(0, test_1.expect)(result.maxBodyDrift, "week+hidden cols: max drift=".concat(result.maxBodyDrift, "px; misaligned rows: ").concat(JSON.stringify(result.misalignedRows))).toBeLessThanOrEqual(ALIGN_TOLERANCE_PX);
|
|
190
|
+
heightDiff = Math.abs(result.leftHeaderHeight - result.rightHeaderHeight);
|
|
191
|
+
(0, test_1.expect)(heightDiff, "header height mismatch: left=".concat(result.leftHeaderHeight, "px right=").concat(result.rightHeaderHeight, "px")).toBeLessThanOrEqual(ALIGN_TOLERANCE_PX);
|
|
192
|
+
return [2 /*return*/];
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
//# sourceMappingURL=issue172-row-alignment.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue172-row-alignment.spec.js","sourceRoot":"","sources":["../../../test/e2e/issue172-row-alignment.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* E2E tests for issue #207: Gantt bars out of sync with timeline axis.
|
|
4
|
+
*
|
|
5
|
+
* The bug: bar left/width positions don't match the header columns
|
|
6
|
+
* for the corresponding start/end dates, causing bars to appear shifted.
|
|
7
|
+
*
|
|
8
|
+
* Strategy:
|
|
9
|
+
* Inject a deterministic chart (week format) with tasks at known Monday dates.
|
|
10
|
+
* Read the actual column header labels to locate the correct column for each
|
|
11
|
+
* task's start date (the chart may add a buffer week, so we do NOT hardcode
|
|
12
|
+
* column indices — we find them by date text). Then assert each bar's left
|
|
13
|
+
* edge lands within ALIGN_TOLERANCE_PX of the matching column's left edge.
|
|
14
|
+
*
|
|
15
|
+
* A systematic drift ≥ colWidth/2 would reproduce issue #207.
|
|
16
|
+
*/
|
|
17
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
20
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
21
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
22
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
23
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
27
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
28
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
29
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
30
|
+
function step(op) {
|
|
31
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
32
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
33
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
34
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
35
|
+
switch (op[0]) {
|
|
36
|
+
case 0: case 1: t = op; break;
|
|
37
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
38
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
39
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
40
|
+
default:
|
|
41
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
42
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
43
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
44
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
45
|
+
if (t[2]) _.ops.pop();
|
|
46
|
+
_.trys.pop(); continue;
|
|
47
|
+
}
|
|
48
|
+
op = body.call(thisArg, _);
|
|
49
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
50
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
var test_1 = require("@playwright/test");
|
|
55
|
+
/** Maximum allowed drift between bar left and the corresponding column left (px). */
|
|
56
|
+
var ALIGN_TOLERANCE_PX = 4;
|
|
57
|
+
/**
|
|
58
|
+
* Navigate to the demo page and wait for the JSGantt global to be available.
|
|
59
|
+
* The demo uses synchronous XHR which fails in headless Chrome, so we skip
|
|
60
|
+
* waiting for the initial chart and inject our own.
|
|
61
|
+
*/
|
|
62
|
+
function gotoDemo(page) {
|
|
63
|
+
var _a;
|
|
64
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
65
|
+
var baseURL, url;
|
|
66
|
+
return __generator(this, function (_b) {
|
|
67
|
+
switch (_b.label) {
|
|
68
|
+
case 0:
|
|
69
|
+
baseURL = (_a = process.env.JSGANTT_E2E_BASE_URL) !== null && _a !== void 0 ? _a : 'http://localhost:8080';
|
|
70
|
+
url = baseURL.replace(/\/$/, '') + '/demo.html';
|
|
71
|
+
return [4 /*yield*/, page.goto(url, { waitUntil: 'load' })];
|
|
72
|
+
case 1:
|
|
73
|
+
_b.sent();
|
|
74
|
+
// Wait for the JSGantt global to be defined (scripts loaded)
|
|
75
|
+
return [4 /*yield*/, page.waitForFunction(function () { return typeof window.JSGantt !== 'undefined'; }, { timeout: 15000 })];
|
|
76
|
+
case 2:
|
|
77
|
+
// Wait for the JSGantt global to be defined (scripts loaded)
|
|
78
|
+
_b.sent();
|
|
79
|
+
return [2 /*return*/];
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/** Inject a week-format chart with three 1-week tasks on known Mondays. */
|
|
85
|
+
function injectWeekChart(page) {
|
|
86
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
87
|
+
return __generator(this, function (_a) {
|
|
88
|
+
switch (_a.label) {
|
|
89
|
+
case 0: return [4 /*yield*/, page.evaluate(function () {
|
|
90
|
+
var container = document.getElementById('embedded-Gantt');
|
|
91
|
+
container.innerHTML = '';
|
|
92
|
+
var g = new window.JSGantt.GanttChart(container, 'week');
|
|
93
|
+
g.setOptions({ vFormat: 'week', vShowDeps: 0, vLang: 'en', vShowWeekends: 1 });
|
|
94
|
+
var T = window.JSGantt.TaskItem;
|
|
95
|
+
// Three 1-week tasks, each starting on a Monday (column boundary)
|
|
96
|
+
g.AddTaskItem(new T(1, 'Task A', '2024-01-01', '2024-01-07', 'gtaskblue', '', 0, '', 0, 0, 0, 1, '', '', '', g));
|
|
97
|
+
g.AddTaskItem(new T(2, 'Task B', '2024-01-15', '2024-01-21', 'gtaskgreen', '', 0, '', 0, 0, 0, 1, '', '', '', g));
|
|
98
|
+
g.AddTaskItem(new T(3, 'Task C', '2024-01-29', '2024-02-04', 'gtaskorange', '', 0, '', 0, 0, 0, 1, '', '', '', g));
|
|
99
|
+
g.Draw();
|
|
100
|
+
})];
|
|
101
|
+
case 1:
|
|
102
|
+
_a.sent();
|
|
103
|
+
return [4 /*yield*/, page.waitForSelector('#embedded-Gantt .gcharttable', { timeout: 10000 })];
|
|
104
|
+
case 2:
|
|
105
|
+
_a.sent();
|
|
106
|
+
return [4 /*yield*/, page.waitForTimeout(400)];
|
|
107
|
+
case 3:
|
|
108
|
+
_a.sent();
|
|
109
|
+
return [2 /*return*/];
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/** Read bar positions relative to the chart table left edge. */
|
|
115
|
+
function getBars(page) {
|
|
116
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
117
|
+
return __generator(this, function (_a) {
|
|
118
|
+
return [2 /*return*/, page.evaluate(function () {
|
|
119
|
+
var chartRect = document.querySelector('.gcharttable').getBoundingClientRect();
|
|
120
|
+
return Array.from(document.querySelectorAll('[id*="bardiv_"]'))
|
|
121
|
+
.filter(function (el) { return !el.classList.contains('gplan'); })
|
|
122
|
+
.map(function (el) { return ({
|
|
123
|
+
id: el.id,
|
|
124
|
+
left: Math.round((el.getBoundingClientRect().left - chartRect.left) * 10) / 10,
|
|
125
|
+
}); });
|
|
126
|
+
})];
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/** Read header column positions and date labels. */
|
|
131
|
+
function getCols(page) {
|
|
132
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
133
|
+
return __generator(this, function (_a) {
|
|
134
|
+
return [2 /*return*/, page.evaluate(function () {
|
|
135
|
+
var headerTable = document.querySelector('.gcharttableh');
|
|
136
|
+
var headerRect = headerTable.getBoundingClientRect();
|
|
137
|
+
var rows = headerTable.querySelectorAll('tr');
|
|
138
|
+
var lastRow = rows[rows.length - 1]; // finest granularity row
|
|
139
|
+
return Array.from(lastRow.querySelectorAll('td')).map(function (td, i) {
|
|
140
|
+
var r = td.getBoundingClientRect();
|
|
141
|
+
return {
|
|
142
|
+
index: i,
|
|
143
|
+
text: td.innerText.trim().slice(0, 10),
|
|
144
|
+
left: Math.round((r.left - headerRect.left) * 10) / 10,
|
|
145
|
+
width: Math.round(r.width * 10) / 10,
|
|
146
|
+
};
|
|
147
|
+
});
|
|
148
|
+
})];
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Find the column whose label starts with the given dd/mm string.
|
|
154
|
+
* Week headers are rendered as "DD/MM" in the default date display format.
|
|
155
|
+
*/
|
|
156
|
+
function findColByDate(cols, dd, mm) {
|
|
157
|
+
var target = "".concat(String(dd).padStart(2, '0'), "/").concat(String(mm).padStart(2, '0'));
|
|
158
|
+
return cols.find(function (c) { return c.text.startsWith(target); });
|
|
159
|
+
}
|
|
160
|
+
test_1.test.describe('Issue #207 — bar alignment with timeline axis (week format)', function () {
|
|
161
|
+
(0, test_1.test)('Task A (01/01): bar left aligns with the 01/01 column', function (_a) {
|
|
162
|
+
var page = _a.page;
|
|
163
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
164
|
+
var bars, cols, col, bar, drift;
|
|
165
|
+
return __generator(this, function (_b) {
|
|
166
|
+
switch (_b.label) {
|
|
167
|
+
case 0: return [4 /*yield*/, gotoDemo(page)];
|
|
168
|
+
case 1:
|
|
169
|
+
_b.sent();
|
|
170
|
+
return [4 /*yield*/, injectWeekChart(page)];
|
|
171
|
+
case 2:
|
|
172
|
+
_b.sent();
|
|
173
|
+
return [4 /*yield*/, getBars(page)];
|
|
174
|
+
case 3:
|
|
175
|
+
bars = _b.sent();
|
|
176
|
+
return [4 /*yield*/, getCols(page)];
|
|
177
|
+
case 4:
|
|
178
|
+
cols = _b.sent();
|
|
179
|
+
(0, test_1.expect)(bars.length, 'should find rendered bars').toBeGreaterThanOrEqual(3);
|
|
180
|
+
col = findColByDate(cols, 1, 1);
|
|
181
|
+
(0, test_1.expect)(col, 'should find a column labelled 01/01').toBeDefined();
|
|
182
|
+
bar = bars[0];
|
|
183
|
+
drift = Math.abs(bar.left - col.left);
|
|
184
|
+
(0, test_1.expect)(drift, "Task A bar left (".concat(bar.left, "px) should align with col \"01/01\" left (").concat(col.left, "px), drift=").concat(drift.toFixed(1), "px")).toBeLessThanOrEqual(ALIGN_TOLERANCE_PX);
|
|
185
|
+
return [2 /*return*/];
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
(0, test_1.test)('Task B (15/01): bar left aligns with the 15/01 column', function (_a) {
|
|
191
|
+
var page = _a.page;
|
|
192
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
193
|
+
var bars, cols, col, bar, drift;
|
|
194
|
+
return __generator(this, function (_b) {
|
|
195
|
+
switch (_b.label) {
|
|
196
|
+
case 0: return [4 /*yield*/, gotoDemo(page)];
|
|
197
|
+
case 1:
|
|
198
|
+
_b.sent();
|
|
199
|
+
return [4 /*yield*/, injectWeekChart(page)];
|
|
200
|
+
case 2:
|
|
201
|
+
_b.sent();
|
|
202
|
+
return [4 /*yield*/, getBars(page)];
|
|
203
|
+
case 3:
|
|
204
|
+
bars = _b.sent();
|
|
205
|
+
return [4 /*yield*/, getCols(page)];
|
|
206
|
+
case 4:
|
|
207
|
+
cols = _b.sent();
|
|
208
|
+
col = findColByDate(cols, 15, 1);
|
|
209
|
+
(0, test_1.expect)(col, 'should find a column labelled 15/01').toBeDefined();
|
|
210
|
+
bar = bars[1];
|
|
211
|
+
drift = Math.abs(bar.left - col.left);
|
|
212
|
+
(0, test_1.expect)(drift, "Task B bar left (".concat(bar.left, "px) should align with col \"15/01\" left (").concat(col.left, "px), drift=").concat(drift.toFixed(1), "px")).toBeLessThanOrEqual(ALIGN_TOLERANCE_PX);
|
|
213
|
+
return [2 /*return*/];
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
(0, test_1.test)('Task C (29/01): bar left aligns with the 29/01 column', function (_a) {
|
|
219
|
+
var page = _a.page;
|
|
220
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
221
|
+
var bars, cols, col, bar, drift;
|
|
222
|
+
return __generator(this, function (_b) {
|
|
223
|
+
switch (_b.label) {
|
|
224
|
+
case 0: return [4 /*yield*/, gotoDemo(page)];
|
|
225
|
+
case 1:
|
|
226
|
+
_b.sent();
|
|
227
|
+
return [4 /*yield*/, injectWeekChart(page)];
|
|
228
|
+
case 2:
|
|
229
|
+
_b.sent();
|
|
230
|
+
return [4 /*yield*/, getBars(page)];
|
|
231
|
+
case 3:
|
|
232
|
+
bars = _b.sent();
|
|
233
|
+
return [4 /*yield*/, getCols(page)];
|
|
234
|
+
case 4:
|
|
235
|
+
cols = _b.sent();
|
|
236
|
+
col = findColByDate(cols, 29, 1);
|
|
237
|
+
(0, test_1.expect)(col, 'should find a column labelled 29/01').toBeDefined();
|
|
238
|
+
bar = bars[2];
|
|
239
|
+
drift = Math.abs(bar.left - col.left);
|
|
240
|
+
(0, test_1.expect)(drift, "Task C bar left (".concat(bar.left, "px) should align with col \"29/01\" left (").concat(col.left, "px), drift=").concat(drift.toFixed(1), "px")).toBeLessThanOrEqual(ALIGN_TOLERANCE_PX);
|
|
241
|
+
return [2 /*return*/];
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
(0, test_1.test)('each bar left is exactly on a column boundary (not between columns)', function (_a) {
|
|
247
|
+
var page = _a.page;
|
|
248
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
249
|
+
var bars, cols, _loop_1, _i, bars_1, bar;
|
|
250
|
+
return __generator(this, function (_b) {
|
|
251
|
+
switch (_b.label) {
|
|
252
|
+
case 0: return [4 /*yield*/, gotoDemo(page)];
|
|
253
|
+
case 1:
|
|
254
|
+
_b.sent();
|
|
255
|
+
return [4 /*yield*/, injectWeekChart(page)];
|
|
256
|
+
case 2:
|
|
257
|
+
_b.sent();
|
|
258
|
+
return [4 /*yield*/, getBars(page)];
|
|
259
|
+
case 3:
|
|
260
|
+
bars = _b.sent();
|
|
261
|
+
return [4 /*yield*/, getCols(page)];
|
|
262
|
+
case 4:
|
|
263
|
+
cols = _b.sent();
|
|
264
|
+
(0, test_1.expect)(cols.length).toBeGreaterThan(0);
|
|
265
|
+
_loop_1 = function (bar) {
|
|
266
|
+
var minDrift = Math.min.apply(Math, cols.map(function (c) { return Math.abs(bar.left - c.left); }));
|
|
267
|
+
(0, test_1.expect)(minDrift, "bar ".concat(bar.id, " at ").concat(bar.left, "px should sit on a column boundary; nearest column drift=").concat(minDrift.toFixed(1), "px")).toBeLessThanOrEqual(ALIGN_TOLERANCE_PX);
|
|
268
|
+
};
|
|
269
|
+
for (_i = 0, bars_1 = bars; _i < bars_1.length; _i++) {
|
|
270
|
+
bar = bars_1[_i];
|
|
271
|
+
_loop_1(bar);
|
|
272
|
+
}
|
|
273
|
+
return [2 /*return*/];
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
(0, test_1.test)('month format (react-jsgantt scenario): bar aligns with 01/01 column', function (_a) {
|
|
279
|
+
var page = _a.page;
|
|
280
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
281
|
+
var bars, cols, _loop_2, _i, bars_2, bar;
|
|
282
|
+
return __generator(this, function (_b) {
|
|
283
|
+
switch (_b.label) {
|
|
284
|
+
case 0: return [4 /*yield*/, gotoDemo(page)];
|
|
285
|
+
case 1:
|
|
286
|
+
_b.sent();
|
|
287
|
+
// Reproduce the react-jsgantt scenario: month-format tasks at exact month boundaries
|
|
288
|
+
return [4 /*yield*/, page.evaluate(function () {
|
|
289
|
+
var container = document.getElementById('embedded-Gantt');
|
|
290
|
+
container.innerHTML = '';
|
|
291
|
+
var g = new window.JSGantt.GanttChart(container, 'month');
|
|
292
|
+
g.setOptions({ vFormat: 'month', vShowDeps: 0, vLang: 'en' });
|
|
293
|
+
var T = window.JSGantt.TaskItem;
|
|
294
|
+
g.AddTaskItem(new T(1, 'Phase 1', '2024-01-01', '2024-01-31', 'gtaskblue', '', 0, '', 0, 0, 0, 1, '', '', '', g));
|
|
295
|
+
g.AddTaskItem(new T(2, 'Phase 2', '2024-03-01', '2024-03-31', 'gtaskgreen', '', 0, '', 0, 0, 0, 1, '', '', '', g));
|
|
296
|
+
g.Draw();
|
|
297
|
+
})];
|
|
298
|
+
case 2:
|
|
299
|
+
// Reproduce the react-jsgantt scenario: month-format tasks at exact month boundaries
|
|
300
|
+
_b.sent();
|
|
301
|
+
return [4 /*yield*/, page.waitForSelector('#embedded-Gantt .gcharttable', { timeout: 10000 })];
|
|
302
|
+
case 3:
|
|
303
|
+
_b.sent();
|
|
304
|
+
return [4 /*yield*/, page.waitForTimeout(400)];
|
|
305
|
+
case 4:
|
|
306
|
+
_b.sent();
|
|
307
|
+
return [4 /*yield*/, getBars(page)];
|
|
308
|
+
case 5:
|
|
309
|
+
bars = _b.sent();
|
|
310
|
+
return [4 /*yield*/, getCols(page)];
|
|
311
|
+
case 6:
|
|
312
|
+
cols = _b.sent();
|
|
313
|
+
(0, test_1.expect)(bars.length).toBeGreaterThanOrEqual(2);
|
|
314
|
+
_loop_2 = function (bar) {
|
|
315
|
+
var minDrift = Math.min.apply(Math, cols.map(function (c) { return Math.abs(bar.left - c.left); }));
|
|
316
|
+
(0, test_1.expect)(minDrift, "bar ".concat(bar.id, " at ").concat(bar.left, "px should sit on a column boundary; nearest drift=").concat(minDrift.toFixed(1), "px")).toBeLessThanOrEqual(ALIGN_TOLERANCE_PX);
|
|
317
|
+
};
|
|
318
|
+
// Each bar should sit on a column boundary
|
|
319
|
+
for (_i = 0, bars_2 = bars; _i < bars_2.length; _i++) {
|
|
320
|
+
bar = bars_2[_i];
|
|
321
|
+
_loop_2(bar);
|
|
322
|
+
}
|
|
323
|
+
return [2 /*return*/];
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
//# sourceMappingURL=issue207-bar-axis-alignment.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue207-bar-axis-alignment.spec.js","sourceRoot":"","sources":["../../../test/e2e/issue207-bar-axis-alignment.spec.ts"],"names":[],"mappings":"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"}
|