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.
Files changed (100) hide show
  1. package/.mocharc.cjs +5 -0
  2. package/.travis.yml +0 -2
  3. package/Documentation.md +1 -1
  4. package/dist/draw_columns.js +171 -0
  5. package/dist/draw_dependencies.js +97 -0
  6. package/dist/e2e/app.e2e-spec.js +3 -3
  7. package/dist/e2e/app.e2e-spec.js.map +1 -1
  8. package/dist/e2e/app.po.js +5 -5
  9. package/dist/e2e/app.po.js.map +1 -1
  10. package/dist/jsgantt.js +580 -473
  11. package/dist/json.js +200 -0
  12. package/dist/lang.js +1635 -0
  13. package/dist/options.js +219 -0
  14. package/dist/playwright.config.js +33 -0
  15. package/dist/playwright.config.js.map +1 -0
  16. package/dist/src/draw.js +149 -148
  17. package/dist/src/draw.js.map +1 -1
  18. package/dist/src/draw_columns.js +66 -63
  19. package/dist/src/draw_columns.js.map +1 -1
  20. package/dist/src/draw_dependencies.js +4 -2
  21. package/dist/src/draw_dependencies.js.map +1 -1
  22. package/dist/src/events.js +72 -54
  23. package/dist/src/events.js.map +1 -1
  24. package/dist/src/json.js +10 -7
  25. package/dist/src/json.js.map +1 -1
  26. package/dist/src/lang.js +1 -1
  27. package/dist/src/lang.js.map +1 -1
  28. package/dist/src/options.js +14 -13
  29. package/dist/src/options.js.map +1 -1
  30. package/dist/src/task.js +61 -49
  31. package/dist/src/task.js.map +1 -1
  32. package/dist/src/utils/date_utils.js +46 -15
  33. package/dist/src/utils/date_utils.js.map +1 -1
  34. package/dist/src/utils/draw_utils.js +24 -18
  35. package/dist/src/utils/draw_utils.js.map +1 -1
  36. package/dist/src/utils/general_utils.js +59 -36
  37. package/dist/src/utils/general_utils.js.map +1 -1
  38. package/dist/src/utils.js +498 -0
  39. package/dist/src/utils.js.map +1 -0
  40. package/dist/src/xml.js +74 -67
  41. package/dist/src/xml.js.map +1 -1
  42. package/dist/test/e2e/gantt.page.js +150 -0
  43. package/dist/test/e2e/gantt.page.js.map +1 -0
  44. package/dist/test/e2e/issue172-row-alignment.spec.js +198 -0
  45. package/dist/test/e2e/issue172-row-alignment.spec.js.map +1 -0
  46. package/dist/test/e2e/issue207-bar-axis-alignment.spec.js +329 -0
  47. package/dist/test/e2e/issue207-bar-axis-alignment.spec.js.map +1 -0
  48. package/dist/test/e2e/issue255-show-weekends.spec.js +102 -0
  49. package/dist/test/e2e/issue255-show-weekends.spec.js.map +1 -0
  50. package/dist/test/e2e/issue349-taskname-click-event.spec.js +270 -0
  51. package/dist/test/e2e/issue349-taskname-click-event.spec.js.map +1 -0
  52. package/dist/test/e2e/issue48-dependency-lines.spec.js +204 -0
  53. package/dist/test/e2e/issue48-dependency-lines.spec.js.map +1 -0
  54. package/dist/test/e2e/issue54-month-today.spec.js +181 -0
  55. package/dist/test/e2e/issue54-month-today.spec.js.map +1 -0
  56. package/dist/test/e2e/issue68-working-days.spec.js +243 -0
  57. package/dist/test/e2e/issue68-working-days.spec.js.map +1 -0
  58. package/dist/test/e2e/zoom-alignment.spec.js +133 -0
  59. package/dist/test/e2e/zoom-alignment.spec.js.map +1 -0
  60. package/dist/test/index.js +3 -8
  61. package/dist/test/index.js.map +1 -1
  62. package/dist/test/unit/date-utils.spec.js +180 -0
  63. package/dist/test/unit/date-utils.spec.js.map +1 -0
  64. package/dist/test/unit/draw-cols-chart.spec.js +105 -0
  65. package/dist/test/unit/draw-cols-chart.spec.js.map +1 -0
  66. package/dist/test/unit/gantt-chart-constructor.spec.js +85 -0
  67. package/dist/test/unit/gantt-chart-constructor.spec.js.map +1 -0
  68. package/dist/test/unit/helpers.js +67 -0
  69. package/dist/test/unit/helpers.js.map +1 -0
  70. package/dist/test/unit/task-item.spec.js +46 -0
  71. package/dist/test/unit/task-item.spec.js.map +1 -0
  72. package/dist/test/unit/task-management.spec.js +141 -0
  73. package/dist/test/unit/task-management.spec.js.map +1 -0
  74. package/dist/test/unit/working-days.spec.js +109 -0
  75. package/dist/test/unit/working-days.spec.js.map +1 -0
  76. package/dist/utils/draw_utils.js +169 -0
  77. package/dist/utils/general_utils.js +498 -0
  78. package/dist/xml.js +345 -0
  79. package/dist-e2e/gantt.page.js +79 -0
  80. package/dist-e2e/gantt.page.js.map +1 -0
  81. package/dist-e2e/issue-setMinDate-setMaxDate.spec.js +96 -0
  82. package/dist-e2e/issue172-row-alignment.spec.js +90 -0
  83. package/dist-e2e/issue172-row-alignment.spec.js.map +1 -0
  84. package/dist-e2e/issue207-bar-axis-alignment.spec.js +161 -0
  85. package/dist-e2e/issue207-bar-axis-alignment.spec.js.map +1 -0
  86. package/dist-e2e/issue349-taskname-click-event.spec.js +170 -0
  87. package/dist-e2e/issue349-taskname-click-event.spec.js.map +1 -0
  88. package/dist-e2e/issue375-column-visibility.spec.js +129 -0
  89. package/dist-e2e/issue375-column-visibility.spec.js.map +1 -0
  90. package/dist-e2e/issue54-month-today.spec.js +84 -0
  91. package/dist-e2e/issue54-month-today.spec.js.map +1 -0
  92. package/dist-e2e/issue68-working-days.spec.js +105 -0
  93. package/dist-e2e/issue68-working-days.spec.js.map +1 -0
  94. package/docs/index.js +5 -2
  95. package/docs/jsgantt.js +5749 -0
  96. package/jsgantt.js +5749 -0
  97. package/package.json +10 -18
  98. package/pw-e2e.config.js +13 -0
  99. package/test-results/.last-run.json +4 -0
  100. package/protractor.conf.js +0 -29
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ /**
3
+ * Unit tests for getMinDate / getMaxDate (src/utils.ts).
4
+ *
5
+ * Covers the regression from issue #355:
6
+ * "Calculated min date uses current date as a minimum instead of the actual task minimum date"
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ require("./helpers"); // DOM shim — must be first
10
+ var chai_1 = require("chai");
11
+ var helpers_1 = require("./helpers");
12
+ var date_utils_1 = require("../../src/utils/date_utils");
13
+ var lang_1 = require("../../src/lang");
14
+ describe('getMinDate', function () {
15
+ it('issue #355: does not anchor the chart to today when a dateless group task is present', function () {
16
+ // One group with pStart/pEnd = "", all leaf tasks in 2027.
17
+ // Before the fix, the group's getStart() returned today, which is earlier
18
+ // than all 2027 dates, so the chart started at today instead of 2027.
19
+ var today = new Date();
20
+ var group = (0, helpers_1.makeTask)({ id: 10, parent: 0, group: 1 });
21
+ var child1 = (0, helpers_1.makeTask)({ id: 11, parent: 10, start: new Date('2027-01-01'), end: new Date('2027-01-29') });
22
+ var child2 = (0, helpers_1.makeTask)({ id: 12, parent: 10, start: new Date('2027-01-15'), end: new Date('2027-02-12') });
23
+ var child3 = (0, helpers_1.makeTask)({ id: 13, parent: 10, start: new Date('2027-02-12'), end: new Date('2027-03-01') });
24
+ var minDate = (0, date_utils_1.getMinDate)([group, child1, child2, child3], 'month');
25
+ // 'month' format pads back ~1 month, so minDate lands in late 2026.
26
+ // Key invariant: it must be well after today, not anchored to today.
27
+ var sixMonthsFromNow = new Date(today.getFullYear(), today.getMonth() + 6, 1);
28
+ (0, chai_1.expect)(minDate.getTime()).to.be.above(sixMonthsFromNow.getTime(), "minDate (".concat(minDate.toDateString(), ") should be near 2027, not today (").concat(today.toDateString(), ")"));
29
+ });
30
+ it('dateless group at pList[0] does not pull the minimum to today', function () {
31
+ // The old code seeded vDate from pList[0].getStart() — dangerous when pList[0]
32
+ // is a dateless group.
33
+ var today = new Date();
34
+ var group = (0, helpers_1.makeTask)({ id: 20, parent: 0, group: 1 });
35
+ var leaf = (0, helpers_1.makeTask)({ id: 21, parent: 20, start: new Date('2030-06-01'), end: new Date('2030-06-30') });
36
+ var minDate = (0, date_utils_1.getMinDate)([group, leaf], 'week');
37
+ (0, chai_1.expect)(minDate.getFullYear()).to.be.above(today.getFullYear(), "minDate year should be > ".concat(today.getFullYear(), ", got ").concat(minDate.toDateString()));
38
+ });
39
+ it('picks the earliest start date across multiple leaf tasks', function () {
40
+ // t2 (2025-03-01) is the earliest; 'month' format pads back ~15 days → Feb 2025.
41
+ var t1 = (0, helpers_1.makeTask)({ id: 30, parent: 0, start: new Date('2025-06-15'), end: new Date('2025-07-01') });
42
+ var t2 = (0, helpers_1.makeTask)({ id: 31, parent: 0, start: new Date('2025-03-01'), end: new Date('2025-03-31') });
43
+ var t3 = (0, helpers_1.makeTask)({ id: 32, parent: 0, start: new Date('2025-09-01'), end: new Date('2025-09-30') });
44
+ var minDate = (0, date_utils_1.getMinDate)([t1, t2, t3], 'month');
45
+ (0, chai_1.expect)(minDate.getFullYear()).to.equal(2025);
46
+ (0, chai_1.expect)(minDate.getMonth()).to.be.at.most(2, // Jan(0)–Feb(1) due to padding, never after March
47
+ "Expected minDate before March 2025, got month ".concat(minDate.getMonth()));
48
+ });
49
+ it('falls back to approximately today when no task has an explicit date', function () {
50
+ var group = (0, helpers_1.makeTask)({ id: 40, parent: 0, group: 1 });
51
+ var before = new Date();
52
+ var minDate = (0, date_utils_1.getMinDate)([group], 'week');
53
+ // 'week' format adjusts back to the previous Monday — within one week of today.
54
+ var oneWeekMs = 7 * 24 * 60 * 60 * 1000;
55
+ (0, chai_1.expect)(Math.abs(minDate.getTime() - before.getTime())).to.be.below(oneWeekMs * 2, "Fallback should be within 2 weeks of today; got ".concat(minDate.toDateString()));
56
+ });
57
+ it('produces correct results for a fully-specified task list (no regression)', function () {
58
+ var t1 = (0, helpers_1.makeTask)({ id: 50, parent: 0, start: new Date('2024-01-10'), end: new Date('2024-01-20') });
59
+ var t2 = (0, helpers_1.makeTask)({ id: 51, parent: 0, start: new Date('2024-01-05'), end: new Date('2024-02-28') });
60
+ var minDate = (0, date_utils_1.getMinDate)([t1, t2], 'month');
61
+ // 2024-01-05 padded back ~15 days → Dec 2023 → 2023-12-01.
62
+ // Assert the result is before February 2024 (covers both Dec 2023 and Jan 2024).
63
+ var feb2024 = new Date(2024, 1, 1);
64
+ (0, chai_1.expect)(minDate.getTime()).to.be.below(feb2024.getTime(), "Expected minDate before Feb 2024 but got ".concat(minDate.toDateString()));
65
+ });
66
+ });
67
+ // ── Issue #382: {{token}} delimiter syntax for date display formats ────────────
68
+ //
69
+ // Test date: 2024-01-05 14:30:45 (Friday, ISO week 1, Q1)
70
+ // dd=05 d=5 mm=01 m=1 yyyy=2024 yy=24
71
+ // mon=Jan month=January day=Fri DAY=Friday
72
+ // w=1 ww=01 week=2024-W1-5
73
+ // q=1 qq=Qtr1
74
+ // H=14 HH=14 h=2 hh=02 MI=30 SS=45 pm=pm PM=PM
75
+ describe('parseDateFormatStr — {{token}} syntax', function () {
76
+ it('single token only: {{dd}}', function () {
77
+ (0, chai_1.expect)((0, date_utils_1.parseDateFormatStr)('{{dd}}')).to.deep.equal(['dd']);
78
+ });
79
+ it('trailing literal text is sentinel-prefixed', function () {
80
+ (0, chai_1.expect)((0, date_utils_1.parseDateFormatStr)('{{ww}} week')).to.deep.equal(['ww', '\x00 week']);
81
+ });
82
+ it('leading literal text is sentinel-prefixed', function () {
83
+ (0, chai_1.expect)((0, date_utils_1.parseDateFormatStr)('W{{ww}}')).to.deep.equal(['\x00W', 'ww']);
84
+ });
85
+ it('multiple tokens with literal separators', function () {
86
+ (0, chai_1.expect)((0, date_utils_1.parseDateFormatStr)('{{ww}} week - {{mon}} {{yyyy}}')).to.deep.equal(['ww', '\x00 week - ', 'mon', '\x00 ', 'yyyy']);
87
+ });
88
+ it('adjacent tokens with no separator', function () {
89
+ (0, chai_1.expect)((0, date_utils_1.parseDateFormatStr)('{{dd}}{{mm}}{{yyyy}}')).to.deep.equal(['dd', 'mm', 'yyyy']);
90
+ });
91
+ it('literal-only string (no tokens)', function () {
92
+ (0, chai_1.expect)((0, date_utils_1.parseDateFormatStr)('{{Week}}')).to.deep.equal(['Week']);
93
+ });
94
+ it('separator character as literal', function () {
95
+ (0, chai_1.expect)((0, date_utils_1.parseDateFormatStr)('{{dd}}/{{mm}}/{{yyyy}}')).to.deep.equal(['dd', '\x00/', 'mm', '\x00/', 'yyyy']);
96
+ });
97
+ it('legacy path: no {{ → original split behaviour', function () {
98
+ (0, chai_1.expect)((0, date_utils_1.parseDateFormatStr)('dd/mm/yyyy')).to.deep.equal(['dd', '/', 'mm', '/', 'yyyy']);
99
+ });
100
+ it('legacy path: space and hyphen separators unchanged', function () {
101
+ (0, chai_1.expect)((0, date_utils_1.parseDateFormatStr)('mon yyyy')).to.deep.equal(['mon', ' ', 'yyyy']);
102
+ });
103
+ });
104
+ describe('formatDateStr — all tokens in {{token}} mode', function () {
105
+ // 2024-01-05 14:30:45, Friday, ISO week 1, Q1
106
+ var date = new Date(2024, 0, 5, 14, 30, 45);
107
+ var fmt = function (s) { return (0, date_utils_1.parseDateFormatStr)(s); };
108
+ var f = function (s) { return (0, date_utils_1.formatDateStr)(date, fmt(s), lang_1.en); };
109
+ // ── Day tokens ────────────────────────────────────────────────────────────
110
+ it('{{dd}} → zero-padded day', function () { return (0, chai_1.expect)(f('{{dd}}')).to.equal('05'); });
111
+ it('{{d}} → unpadded day', function () { return (0, chai_1.expect)(f('{{d}}')).to.equal('5'); });
112
+ it('{{day}} → short weekday name', function () { return (0, chai_1.expect)(f('{{day}}')).to.equal('Fri'); });
113
+ it('{{DAY}} → full weekday name', function () { return (0, chai_1.expect)(f('{{DAY}}')).to.equal('Friday'); });
114
+ // ── Month tokens ──────────────────────────────────────────────────────────
115
+ it('{{mm}} → zero-padded month', function () { return (0, chai_1.expect)(f('{{mm}}')).to.equal('01'); });
116
+ it('{{m}} → unpadded month', function () { return (0, chai_1.expect)(f('{{m}}')).to.equal('1'); });
117
+ it('{{mon}} → 3-letter month abbrev', function () { return (0, chai_1.expect)(f('{{mon}}')).to.equal('Jan'); });
118
+ it('{{month}} → full month name', function () { return (0, chai_1.expect)(f('{{month}}')).to.equal('January'); });
119
+ // ── Year tokens ───────────────────────────────────────────────────────────
120
+ it('{{yyyy}} → 4-digit year', function () { return (0, chai_1.expect)(f('{{yyyy}}')).to.equal('2024'); });
121
+ it('{{yy}} → 2-digit year', function () { return (0, chai_1.expect)(f('{{yy}}')).to.equal('24'); });
122
+ // ── Week tokens ───────────────────────────────────────────────────────────
123
+ it('{{w}} → unpadded ISO week number', function () { return (0, chai_1.expect)(f('{{w}}')).to.equal('1'); });
124
+ it('{{ww}} → zero-padded ISO week number', function () { return (0, chai_1.expect)(f('{{ww}}')).to.equal('01'); });
125
+ it('{{week}} → full ISO 8601 week date', function () { return (0, chai_1.expect)(f('{{week}}')).to.equal('2024-W1-5'); });
126
+ // ── Quarter tokens ────────────────────────────────────────────────────────
127
+ it('{{q}} → quarter number', function () { return (0, chai_1.expect)(f('{{q}}')).to.equal('1'); });
128
+ it('{{qq}} → quarter label + number', function () { return (0, chai_1.expect)(f('{{qq}}')).to.equal('Qtr1'); });
129
+ // ── Time tokens ───────────────────────────────────────────────────────────
130
+ it('{{H}} → unpadded 24-h hour', function () { return (0, chai_1.expect)(f('{{H}}')).to.equal('14'); });
131
+ it('{{HH}} → zero-padded 24-h hour', function () { return (0, chai_1.expect)(f('{{HH}}')).to.equal('14'); });
132
+ it('{{h}} → unpadded 12-h hour', function () { return (0, chai_1.expect)(f('{{h}}')).to.equal('2'); });
133
+ it('{{hh}} → zero-padded 12-h hour', function () { return (0, chai_1.expect)(f('{{hh}}')).to.equal('02'); });
134
+ it('{{MI}} → zero-padded minutes', function () { return (0, chai_1.expect)(f('{{MI}}')).to.equal('30'); });
135
+ it('{{SS}} → zero-padded seconds', function () { return (0, chai_1.expect)(f('{{SS}}')).to.equal('45'); });
136
+ it('{{pm}} → lowercase am/pm', function () { return (0, chai_1.expect)(f('{{pm}}')).to.equal('pm'); });
137
+ it('{{PM}} → uppercase AM/PM', function () { return (0, chai_1.expect)(f('{{PM}}')).to.equal('PM'); });
138
+ // ── Core use-case from issue #382: "week" / "mon" as literal text ─────────
139
+ it('"week" in label stays literal when outside {{}}', function () {
140
+ (0, chai_1.expect)(f('{{ww}} week - {{mon}} {{yyyy}}')).to.equal('01 week - Jan 2024');
141
+ });
142
+ it('"mon" in label stays literal when outside {{}}', function () {
143
+ // "every mon" — "mon" is literal; only {{dd}} and {{yyyy}} are substituted
144
+ (0, chai_1.expect)(f('{{dd}} {{yyyy}} every mon')).to.equal('05 2024 every mon');
145
+ });
146
+ it('leading literal "W" prefix stays literal', function () {
147
+ (0, chai_1.expect)(f('W{{ww}}/{{yyyy}}')).to.equal('W01/2024');
148
+ });
149
+ it('adjacent tokens with no separator', function () {
150
+ (0, chai_1.expect)(f('{{dd}}{{mm}}{{yyyy}}')).to.equal('05012024');
151
+ });
152
+ // ── Legacy formats unaffected ─────────────────────────────────────────────
153
+ it('legacy dd/mm/yyyy unchanged', function () {
154
+ (0, chai_1.expect)(f('dd/mm/yyyy')).to.equal('05/01/2024');
155
+ });
156
+ it('legacy "mon yyyy" unchanged (mon substituted, not literal)', function () {
157
+ // Without {{ delimiters, "mon" is still a token → "Jan 2024"
158
+ (0, chai_1.expect)(f('mon yyyy')).to.equal('Jan 2024');
159
+ });
160
+ });
161
+ describe('getMaxDate', function () {
162
+ it('issue #355: does not anchor the chart end to today when a dateless group task is present', function () {
163
+ var today = new Date();
164
+ var group = (0, helpers_1.makeTask)({ id: 60, parent: 0, group: 1 });
165
+ var child1 = (0, helpers_1.makeTask)({ id: 61, parent: 60, start: new Date('2027-01-01'), end: new Date('2027-01-29') });
166
+ var child2 = (0, helpers_1.makeTask)({ id: 62, parent: 60, start: new Date('2027-02-12'), end: new Date('2027-03-01') });
167
+ var maxDate = (0, date_utils_1.getMaxDate)([group, child1, child2], 'month');
168
+ (0, chai_1.expect)(maxDate.getFullYear()).to.equal(2027, "maxDate (".concat(maxDate.toDateString(), ") should be in 2027, not near today (").concat(today.toDateString(), ")"));
169
+ });
170
+ it('picks the latest end date across multiple leaf tasks', function () {
171
+ var t1 = (0, helpers_1.makeTask)({ id: 70, parent: 0, start: new Date('2025-01-01'), end: new Date('2025-03-31') });
172
+ var t2 = (0, helpers_1.makeTask)({ id: 71, parent: 0, start: new Date('2025-06-01'), end: new Date('2025-09-30') });
173
+ var t3 = (0, helpers_1.makeTask)({ id: 72, parent: 0, start: new Date('2025-01-01'), end: new Date('2025-02-28') });
174
+ var maxDate = (0, date_utils_1.getMaxDate)([t1, t2, t3], 'month');
175
+ (0, chai_1.expect)(maxDate.getFullYear()).to.equal(2025);
176
+ (0, chai_1.expect)(maxDate.getMonth()).to.be.at.least(8, // Sept(8) or Oct(9) due to padding
177
+ "Expected maxDate in September or later 2025, got month ".concat(maxDate.getMonth()));
178
+ });
179
+ });
180
+ //# sourceMappingURL=date-utils.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-utils.spec.js","sourceRoot":"","sources":["../../../test/unit/date-utils.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * Unit tests for drawColsChart — issue #255.
4
+ *
5
+ * Root cause: drawColsChart used strict `this.vShowWeekends !== false` so
6
+ * passing the numeric 0 still colored weekend cells. Fix changed both checks
7
+ * to a truthy test (`this.vShowWeekends`).
8
+ *
9
+ * These tests directly invoke drawColsChart with a fake DOM row and assert
10
+ * which CSS classes end up on the created <td> cells.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ require("./helpers"); // DOM shim — must be first
14
+ var chai_1 = require("chai");
15
+ var draw_1 = require("../../src/draw");
16
+ // ─── Extended DOM shim for drawColsChart ─────────────────────────────────────
17
+ // newNode calls pParent.appendChild(document.createElement(...)) and then sets
18
+ // className. We need a row object that collects appended children so we can
19
+ // inspect their classes afterward.
20
+ function makeRow() {
21
+ var children = [];
22
+ return {
23
+ appendChild: function (child) { children.push(child); return child; },
24
+ get children() { return children; },
25
+ };
26
+ }
27
+ // Extend the existing document shim so that createElement returns an object
28
+ // that also supports appendChild (needed for the text-node path in newNode).
29
+ var origCreateElement = global.document.createElement;
30
+ global.document.createElement = function (tag) {
31
+ var el = origCreateElement(tag);
32
+ el.style = { width: '', left: '', display: '' };
33
+ el.className = '';
34
+ var kids = [];
35
+ el.appendChild = function (c) { kids.push(c); return c; };
36
+ el.getAttribute = function (_) { return null; };
37
+ el.setAttribute = function (_k, _v) { };
38
+ el.insertAdjacentHTML = function (_pos, _html) { };
39
+ return el;
40
+ };
41
+ // ─── Helper: create a minimal GanttChart and call drawColsChart ───────────────
42
+ function runDrawColsChart(opts) {
43
+ var _a, _b, _c;
44
+ var chart = new draw_1.GanttChart(null, (_a = opts.vFormat) !== null && _a !== void 0 ? _a : 'day');
45
+ chart.vShowWeekends = opts.vShowWeekends;
46
+ chart.vFormat = (_b = opts.vFormat) !== null && _b !== void 0 ? _b : 'day';
47
+ var row = makeRow();
48
+ // numCols=8 gives us 7 actual cells (loop runs < numCols-1 ... wait, j < vNumCols - 1)
49
+ // Use 15 columns so we always cover one full 7-day cycle (indices 0-13).
50
+ var numCols = (_c = opts.numCols) !== null && _c !== void 0 ? _c : 15;
51
+ chart.drawColsChart(numCols, row, 30, null, null);
52
+ return row.children.map(function (td) { return td.className; });
53
+ }
54
+ // ─── Tests ────────────────────────────────────────────────────────────────────
55
+ describe('drawColsChart — vShowWeekends (issue #255)', function () {
56
+ it('colors weekend columns (j%7==4 or j%7==5) with gtaskcellwkend when vShowWeekends=1', function () {
57
+ var classes = runDrawColsChart({ vShowWeekends: 1 });
58
+ var wkendCells = classes.filter(function (c) { return c === 'gtaskcellwkend'; });
59
+ (0, chai_1.expect)(wkendCells.length).to.be.greaterThan(0, 'Expected at least one gtaskcellwkend cell when vShowWeekends=1');
60
+ // Verify the correct column indices (4 and 5 within each 7-day block)
61
+ classes.forEach(function (cls, j) {
62
+ if (j % 7 === 4 || j % 7 === 5) {
63
+ (0, chai_1.expect)(cls).to.equal('gtaskcellwkend', "Column ".concat(j, " should be gtaskcellwkend"));
64
+ }
65
+ else {
66
+ (0, chai_1.expect)(cls).to.include('gtaskcell', "Column ".concat(j, " should be a normal cell"));
67
+ }
68
+ });
69
+ });
70
+ it('produces NO gtaskcellwkend cells when vShowWeekends=0 (numeric zero)', function () {
71
+ var classes = runDrawColsChart({ vShowWeekends: 0 });
72
+ var wkendCells = classes.filter(function (c) { return c === 'gtaskcellwkend'; });
73
+ (0, chai_1.expect)(wkendCells.length).to.equal(0, 'Expected zero gtaskcellwkend cells when vShowWeekends=0 (numeric)');
74
+ });
75
+ it('produces NO gtaskcellwkend cells when vShowWeekends=false (boolean)', function () {
76
+ var classes = runDrawColsChart({ vShowWeekends: false });
77
+ var wkendCells = classes.filter(function (c) { return c === 'gtaskcellwkend'; });
78
+ (0, chai_1.expect)(wkendCells.length).to.equal(0, 'Expected zero gtaskcellwkend cells when vShowWeekends=false (boolean)');
79
+ });
80
+ it('does not apply gtaskcellwkend in week format even when vShowWeekends=1', function () {
81
+ var classes = runDrawColsChart({ vShowWeekends: 1, vFormat: 'week' });
82
+ var wkendCells = classes.filter(function (c) { return c === 'gtaskcellwkend'; });
83
+ (0, chai_1.expect)(wkendCells.length).to.equal(0, 'gtaskcellwkend coloring is day-format only');
84
+ });
85
+ it('does not apply gtaskcellwkend in month format even when vShowWeekends=1', function () {
86
+ var classes = runDrawColsChart({ vShowWeekends: 1, vFormat: 'month' });
87
+ var wkendCells = classes.filter(function (c) { return c === 'gtaskcellwkend'; });
88
+ (0, chai_1.expect)(wkendCells.length).to.equal(0, 'gtaskcellwkend coloring is day-format only');
89
+ });
90
+ it('all non-weekend cells get gtaskcell class when vShowWeekends=1', function () {
91
+ var classes = runDrawColsChart({ vShowWeekends: 1 });
92
+ classes.forEach(function (cls, j) {
93
+ if (j % 7 !== 4 && j % 7 !== 5) {
94
+ (0, chai_1.expect)(cls).to.include('gtaskcell', "Column ".concat(j, " should include gtaskcell"));
95
+ }
96
+ });
97
+ });
98
+ it('all cells get gtaskcell class when vShowWeekends=0', function () {
99
+ var classes = runDrawColsChart({ vShowWeekends: 0 });
100
+ classes.forEach(function (cls, j) {
101
+ (0, chai_1.expect)(cls).to.include('gtaskcell', "Column ".concat(j, " should include gtaskcell, got: ").concat(cls));
102
+ });
103
+ });
104
+ });
105
+ //# sourceMappingURL=draw-cols-chart.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draw-cols-chart.spec.js","sourceRoot":"","sources":["../../../test/unit/draw-cols-chart.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * Unit tests for GanttChart constructor — jQuery-element normalisation.
4
+ *
5
+ * Issue #344: passing a jQuery-wrapped element threw "hasChildNodes is not a
6
+ * function" because pDiv[0] (the real Element) was never unwrapped.
7
+ *
8
+ * PR #393 fixes this with the guard:
9
+ * this.vDiv = (pDiv && pDiv[0] instanceof Element) ? pDiv[0] : pDiv;
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ require("./helpers"); // DOM shim — must be first
13
+ var chai_1 = require("chai");
14
+ // GanttChart is exported as a plain constructor function.
15
+ var draw_1 = require("../../src/draw");
16
+ // ─── Minimal fake DOM element ─────────────────────────────────────────────────
17
+ // The shim in helpers.ts installs document.createElement / createTextNode so
18
+ // that TaskItem works. GanttChart only stores pDiv in this.vDiv, so a plain
19
+ // object that satisfies `instanceof Element` suffices.
20
+ function makeFakeElement() {
21
+ // jsdom is not available; create a minimal stand-in that IS an Element by
22
+ // delegating through the global.Element constructor set up in the shim.
23
+ // However, `instanceof Element` requires the *global* Element constructor.
24
+ // We set one up below so tests are self-contained.
25
+ return new global.Element();
26
+ }
27
+ // Install a minimal Element constructor in the global scope so that
28
+ // `pDiv[0] instanceof Element` works inside GanttChart.
29
+ before(function () {
30
+ if (!global.Element) {
31
+ global.Element = /** @class */ (function () {
32
+ function Element() {
33
+ this.nodeName = 'DIV';
34
+ this.className = '';
35
+ this.childNodes = [];
36
+ }
37
+ Element.prototype.hasChildNodes = function () { return this.childNodes.length > 0; };
38
+ return Element;
39
+ }());
40
+ }
41
+ });
42
+ // ─── Tests ────────────────────────────────────────────────────────────────────
43
+ describe('GanttChart constructor — pDiv normalisation (issue #344)', function () {
44
+ it('stores a plain DOM element unchanged', function () {
45
+ var el = makeFakeElement();
46
+ var chart = new draw_1.GanttChart(el, 'week');
47
+ (0, chai_1.expect)(chart.vDiv).to.equal(el);
48
+ });
49
+ it('unwraps a jQuery-like object (pDiv[0] instanceof Element)', function () {
50
+ var el = makeFakeElement();
51
+ // Simulate a jQuery wrapper: array-like with [0] pointing to the element.
52
+ var jqueryLike = { 0: el, length: 1 };
53
+ var chart = new draw_1.GanttChart(jqueryLike, 'week');
54
+ (0, chai_1.expect)(chart.vDiv).to.equal(el, 'vDiv should be the unwrapped DOM element, not the jQuery wrapper');
55
+ });
56
+ it('does NOT unwrap when pDiv[0] is not an Element', function () {
57
+ // e.g. someone passes an arbitrary array-like whose [0] is a string
58
+ var notAnElement = { 0: 'string-value', length: 1 };
59
+ var chart = new draw_1.GanttChart(notAnElement, 'week');
60
+ (0, chai_1.expect)(chart.vDiv).to.equal(notAnElement, 'vDiv should remain unchanged when [0] is not an Element');
61
+ });
62
+ it('handles null pDiv without throwing', function () {
63
+ (0, chai_1.expect)(function () { return new draw_1.GanttChart(null, 'week'); }).to.not.throw();
64
+ var chart = new draw_1.GanttChart(null, 'week');
65
+ (0, chai_1.expect)(chart.vDiv).to.equal(null);
66
+ });
67
+ it('handles undefined pDiv without throwing', function () {
68
+ (0, chai_1.expect)(function () { return new draw_1.GanttChart(undefined, 'week'); }).to.not.throw();
69
+ var chart = new draw_1.GanttChart(undefined, 'week');
70
+ // undefined is falsy → guard short-circuits → vDiv stays undefined
71
+ (0, chai_1.expect)(chart.vDiv).to.equal(undefined);
72
+ });
73
+ it('stores the format string in vFormat', function () {
74
+ var el = makeFakeElement();
75
+ var chart = new draw_1.GanttChart(el, 'month');
76
+ (0, chai_1.expect)(chart.vFormat).to.equal('month');
77
+ });
78
+ it('stores the correct format when a jQuery wrapper is passed', function () {
79
+ var el = makeFakeElement();
80
+ var jqueryLike = { 0: el, length: 1 };
81
+ var chart = new draw_1.GanttChart(jqueryLike, 'day');
82
+ (0, chai_1.expect)(chart.vFormat).to.equal('day');
83
+ });
84
+ });
85
+ //# sourceMappingURL=gantt-chart-constructor.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-chart-constructor.spec.js","sourceRoot":"","sources":["../../../test/unit/gantt-chart-constructor.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ /**
3
+ * Shared test helpers for unit tests.
4
+ *
5
+ * Import this module BEFORE any src imports so the DOM shim is installed
6
+ * before TypeScript module initialisation runs.
7
+ *
8
+ * import '../helpers'; // must be first
9
+ * import { TaskItem } from '../../src/task';
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.makeTask = void 0;
13
+ // ─── Minimal DOM shim ────────────────────────────────────────────────────────
14
+ // TaskItem uses document.createTextNode / createElement to sanitise values.
15
+ // In a real browser this strips HTML; here we provide the minimum surface area
16
+ // needed to construct a TaskItem without a real browser.
17
+ function makeTextNode(val) {
18
+ return {
19
+ data: String(val == null ? '' : val),
20
+ nodeName: '#text',
21
+ childNodes: [],
22
+ hasChildNodes: function () { return false; },
23
+ };
24
+ }
25
+ function makeElement(tag) {
26
+ var el = {
27
+ nodeName: tag.toUpperCase(),
28
+ className: '',
29
+ innerHTML: '',
30
+ childNodes: [],
31
+ hasChildNodes: function () { return this.childNodes.length > 0; },
32
+ replaceChild: function (newNode, oldNode) {
33
+ var idx = this.childNodes.indexOf(oldNode);
34
+ if (idx !== -1)
35
+ this.childNodes[idx] = newNode;
36
+ },
37
+ };
38
+ return el;
39
+ }
40
+ global.document = {
41
+ createTextNode: makeTextNode,
42
+ createElement: makeElement,
43
+ };
44
+ // ─── TaskItem factory ─────────────────────────────────────────────────────────
45
+ // Pass Date objects so the constructor takes the `instanceof Date` fast-path,
46
+ // bypassing parseDateStr / document.createTextNode on the date strings.
47
+ var task_1 = require("../../src/task");
48
+ var general_utils_1 = require("../../src/utils/general_utils");
49
+ var mockGantt = {
50
+ getDateInputFormat: function () { return 'yyyy-mm-dd'; },
51
+ hashString: general_utils_1.hashString,
52
+ };
53
+ function makeTask(opts) {
54
+ return new task_1.TaskItem(opts.id, opts.name || ('task-' + opts.id), opts.start || '', // '' → vStart stays null → hasStart() === false
55
+ opts.end || '', 'gtaskblue', '', // pLink
56
+ 0, // pMile
57
+ '', // pRes
58
+ 0, // pComp
59
+ opts.group || 0, opts.parent, 1, // pOpen
60
+ '', // pDepend
61
+ '', // pCaption
62
+ '', // pNotes
63
+ mockGantt, 0, // pCost
64
+ opts.planStart || null, opts.planEnd || null);
65
+ }
66
+ exports.makeTask = makeTask;
67
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../test/unit/helpers.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,gFAAgF;AAChF,4EAA4E;AAC5E,+EAA+E;AAC/E,yDAAyD;AAEzD,SAAS,YAAY,CAAC,GAAQ;IAC5B,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACpC,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,EAAW;QACvB,aAAa,gBAAK,OAAO,KAAK,CAAC,CAAC,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAM,EAAE,GAAQ;QACd,QAAQ,EAAE,GAAG,CAAC,WAAW,EAAE;QAC3B,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,EAAW;QACvB,aAAa,gBAAK,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACtD,YAAY,YAAC,OAAY,EAAE,OAAY;YACrC,IAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;QACjD,CAAC;KACF,CAAC;IACF,OAAO,EAAE,CAAC;AACZ,CAAC;AAEA,MAAc,CAAC,QAAQ,GAAG;IACzB,cAAc,EAAE,YAAY;IAC5B,aAAa,EAAG,WAAW;CAC5B,CAAC;AAEF,iFAAiF;AACjF,8EAA8E;AAC9E,wEAAwE;AAExE,uCAA0C;AAC1C,+DAA2D;AAE3D,IAAM,SAAS,GAAG;IAChB,kBAAkB,EAAE,cAAM,OAAA,YAAY,EAAZ,CAAY;IACtC,UAAU,4BAAA;CACX,CAAC;AAaF,SAAgB,QAAQ,CAAC,IAAc;IACrC,OAAO,IAAK,eAAgB,CAC1B,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,EAChC,IAAI,CAAC,KAAK,IAAQ,EAAE,EAAI,gDAAgD;IACxE,IAAI,CAAC,GAAG,IAAU,EAAE,EACpB,WAAW,EACX,EAAE,EAAsB,QAAQ;IAChC,CAAC,EAAuB,QAAQ;IAChC,EAAE,EAAsB,OAAO;IAC/B,CAAC,EAAuB,QAAQ;IAChC,IAAI,CAAC,KAAK,IAAQ,CAAC,EACnB,IAAI,CAAC,MAAM,EACX,CAAC,EAAuB,QAAQ;IAChC,EAAE,EAAsB,UAAU;IAClC,EAAE,EAAsB,WAAW;IACnC,EAAE,EAAsB,SAAS;IACjC,SAAS,EACT,CAAC,EAAuB,QAAQ;IAChC,IAAI,CAAC,SAAS,IAAI,IAAI,EACtB,IAAI,CAAC,OAAO,IAAM,IAAI,CACvB,CAAC;AACJ,CAAC;AAtBD,4BAsBC"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ /**
3
+ * Unit tests for TaskItem accessor methods.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ require("./helpers"); // DOM shim — must be first
7
+ var chai_1 = require("chai");
8
+ var helpers_1 = require("./helpers");
9
+ describe('TaskItem.hasStart / hasEnd', function () {
10
+ it('returns false when no date is set', function () {
11
+ var task = (0, helpers_1.makeTask)({ id: 1, parent: 0 });
12
+ (0, chai_1.expect)(task.hasStart()).to.equal(false);
13
+ (0, chai_1.expect)(task.hasEnd()).to.equal(false);
14
+ });
15
+ it('returns true when an explicit start/end date is provided', function () {
16
+ var task = (0, helpers_1.makeTask)({
17
+ id: 2,
18
+ parent: 0,
19
+ start: new Date('2027-01-01'),
20
+ end: new Date('2027-01-31'),
21
+ });
22
+ (0, chai_1.expect)(task.hasStart()).to.equal(true);
23
+ (0, chai_1.expect)(task.hasEnd()).to.equal(true);
24
+ });
25
+ it('returns true when only plan dates are provided', function () {
26
+ var task = (0, helpers_1.makeTask)({
27
+ id: 3,
28
+ parent: 0,
29
+ planStart: new Date('2027-01-01'),
30
+ planEnd: new Date('2027-01-31'),
31
+ });
32
+ (0, chai_1.expect)(task.hasStart()).to.equal(true);
33
+ (0, chai_1.expect)(task.hasEnd()).to.equal(true);
34
+ });
35
+ it('getStart() on a dateless task still returns a Date (backwards compat)', function () {
36
+ var task = (0, helpers_1.makeTask)({ id: 4, parent: 0 });
37
+ (0, chai_1.expect)(task.getStart()).to.be.instanceOf(Date);
38
+ (0, chai_1.expect)(task.getEnd()).to.be.instanceOf(Date);
39
+ });
40
+ it('getStart() returns the explicit start date when set', function () {
41
+ var start = new Date('2027-06-15');
42
+ var task = (0, helpers_1.makeTask)({ id: 5, parent: 0, start: start, end: new Date('2027-06-30') });
43
+ (0, chai_1.expect)(task.getStart().getTime()).to.equal(start.getTime());
44
+ });
45
+ });
46
+ //# sourceMappingURL=task-item.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-item.spec.js","sourceRoot":"","sources":["../../../test/unit/task-item.spec.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAEH,qBAAmB,CAAG,2BAA2B;AACjD,6BAA8B;AAC9B,qCAAqC;AAErC,QAAQ,CAAC,4BAA4B,EAAE;IACrC,EAAE,CAAC,mCAAmC,EAAE;QACtC,IAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAA,aAAM,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,IAAA,aAAM,EAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE;QAC7D,IAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC;YACpB,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;YAC7B,GAAG,EAAI,IAAI,IAAI,CAAC,YAAY,CAAC;SAC9B,CAAC,CAAC;QACH,IAAA,aAAM,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IAAA,aAAM,EAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE;QACnD,IAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC;YACpB,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;YACjC,OAAO,EAAI,IAAI,IAAI,CAAC,YAAY,CAAC;SAClC,CAAC,CAAC;QACH,IAAA,aAAM,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IAAA,aAAM,EAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE;QAC1E,IAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAA,aAAM,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAA,aAAM,EAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE;QACxD,IAAM,KAAK,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,IAAM,IAAI,GAAI,IAAA,kBAAQ,EAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,OAAA,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACjF,IAAA,aAAM,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}