tg-ganttchart 0.0.9 → 0.0.11

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.
@@ -18,6 +18,20 @@ return /******/ (function() { // webpackBootstrap
18
18
 
19
19
  /***/ }),
20
20
 
21
+ /***/ 1816:
22
+ /***/ (function(module) {
23
+
24
+ !function(t,n){ true?module.exports=n():0}(this,(function(){"use strict";var t="month",n="quarter";return function(e,i){var r=i.prototype;r.quarter=function(t){return this.$utils().u(t)?Math.ceil((this.month()+1)/3):this.month(this.month()%3+3*(t-1))};var s=r.add;r.add=function(e,i){return e=Number(e),this.$utils().p(i)===n?this.add(3*e,t):s.bind(this)(e,i)};var u=r.startOf;r.startOf=function(e,i){var r=this.$utils(),s=!!r.u(i)||i;if(r.p(e)===n){var o=this.quarter()-1;return s?this.month(3*o).startOf(t).startOf("day"):this.month(3*o+2).endOf(t).endOf("day")}return u.bind(this)(e,i)}}}));
25
+
26
+ /***/ }),
27
+
28
+ /***/ 8134:
29
+ /***/ (function(module) {
30
+
31
+ !function(e,t){ true?module.exports=t():0}(this,(function(){"use strict";var e="week",t="year";return function(i,n,r){var f=n.prototype;f.week=function(i){if(void 0===i&&(i=null),null!==i)return this.add(7*(i-this.week()),"day");var n=this.$locale().yearStart||1;if(11===this.month()&&this.date()>25){var f=r(this).startOf(t).add(1,t).date(n),s=r(this).endOf(e);if(f.isBefore(s))return 1}var a=r(this).startOf(t).date(n).startOf(e).subtract(1,"millisecond"),o=this.diff(a,e,!0);return o<0?r(this).startOf("week").week():Math.ceil(o)},f.weeks=function(e){return void 0===e&&(e=null),this.week(e)}}}));
32
+
33
+ /***/ }),
34
+
21
35
  /***/ 378:
22
36
  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
23
37
 
@@ -56,6 +70,22 @@ module.exports = function (argument) {
56
70
  };
57
71
 
58
72
 
73
+ /***/ }),
74
+
75
+ /***/ 7080:
76
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
77
+
78
+ "use strict";
79
+
80
+ var has = (__webpack_require__(4402).has);
81
+
82
+ // Perform ? RequireInternalSlot(M, [[SetData]])
83
+ module.exports = function (it) {
84
+ has(it);
85
+ return it;
86
+ };
87
+
88
+
59
89
  /***/ }),
60
90
 
61
91
  /***/ 679:
@@ -723,6 +753,24 @@ module.exports = {
723
753
  };
724
754
 
725
755
 
756
+ /***/ }),
757
+
758
+ /***/ 6706:
759
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
760
+
761
+ "use strict";
762
+
763
+ var uncurryThis = __webpack_require__(9504);
764
+ var aCallable = __webpack_require__(9306);
765
+
766
+ module.exports = function (object, key, method) {
767
+ try {
768
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
769
+ return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));
770
+ } catch (error) { /* empty */ }
771
+ };
772
+
773
+
726
774
  /***/ }),
727
775
 
728
776
  /***/ 7476:
@@ -860,6 +908,54 @@ module.exports = function (V, P) {
860
908
  };
861
909
 
862
910
 
911
+ /***/ }),
912
+
913
+ /***/ 3789:
914
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
915
+
916
+ "use strict";
917
+
918
+ var aCallable = __webpack_require__(9306);
919
+ var anObject = __webpack_require__(8551);
920
+ var call = __webpack_require__(9565);
921
+ var toIntegerOrInfinity = __webpack_require__(1291);
922
+ var getIteratorDirect = __webpack_require__(1767);
923
+
924
+ var INVALID_SIZE = 'Invalid size';
925
+ var $RangeError = RangeError;
926
+ var $TypeError = TypeError;
927
+ var max = Math.max;
928
+
929
+ var SetRecord = function (set, intSize) {
930
+ this.set = set;
931
+ this.size = max(intSize, 0);
932
+ this.has = aCallable(set.has);
933
+ this.keys = aCallable(set.keys);
934
+ };
935
+
936
+ SetRecord.prototype = {
937
+ getIterator: function () {
938
+ return getIteratorDirect(anObject(call(this.keys, this.set)));
939
+ },
940
+ includes: function (it) {
941
+ return call(this.has, this.set, it);
942
+ }
943
+ };
944
+
945
+ // `GetSetRecord` abstract operation
946
+ // https://tc39.es/proposal-set-methods/#sec-getsetrecord
947
+ module.exports = function (obj) {
948
+ anObject(obj);
949
+ var numSize = +obj.size;
950
+ // NOTE: If size is undefined, then numSize will be NaN
951
+ // eslint-disable-next-line no-self-compare -- NaN check
952
+ if (numSize !== numSize) throw new $TypeError(INVALID_SIZE);
953
+ var intSize = toIntegerOrInfinity(numSize);
954
+ if (intSize < 0) throw new $RangeError(INVALID_SIZE);
955
+ return new SetRecord(obj, intSize);
956
+ };
957
+
958
+
863
959
  /***/ }),
864
960
 
865
961
  /***/ 4576:
@@ -1219,6 +1315,26 @@ module.exports = USE_SYMBOL_AS_UID ? function (it) {
1219
1315
  };
1220
1316
 
1221
1317
 
1318
+ /***/ }),
1319
+
1320
+ /***/ 507:
1321
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1322
+
1323
+ "use strict";
1324
+
1325
+ var call = __webpack_require__(9565);
1326
+
1327
+ module.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) {
1328
+ var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator;
1329
+ var next = record.next;
1330
+ var step, result;
1331
+ while (!(step = call(next, iterator)).done) {
1332
+ result = fn(step.value);
1333
+ if (result !== undefined) return result;
1334
+ }
1335
+ };
1336
+
1337
+
1222
1338
  /***/ }),
1223
1339
 
1224
1340
  /***/ 2652:
@@ -2022,6 +2138,341 @@ module.exports = function (it) {
2022
2138
  };
2023
2139
 
2024
2140
 
2141
+ /***/ }),
2142
+
2143
+ /***/ 9286:
2144
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2145
+
2146
+ "use strict";
2147
+
2148
+ var SetHelpers = __webpack_require__(4402);
2149
+ var iterate = __webpack_require__(8469);
2150
+
2151
+ var Set = SetHelpers.Set;
2152
+ var add = SetHelpers.add;
2153
+
2154
+ module.exports = function (set) {
2155
+ var result = new Set();
2156
+ iterate(set, function (it) {
2157
+ add(result, it);
2158
+ });
2159
+ return result;
2160
+ };
2161
+
2162
+
2163
+ /***/ }),
2164
+
2165
+ /***/ 3440:
2166
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2167
+
2168
+ "use strict";
2169
+
2170
+ var aSet = __webpack_require__(7080);
2171
+ var SetHelpers = __webpack_require__(4402);
2172
+ var clone = __webpack_require__(9286);
2173
+ var size = __webpack_require__(5170);
2174
+ var getSetRecord = __webpack_require__(3789);
2175
+ var iterateSet = __webpack_require__(8469);
2176
+ var iterateSimple = __webpack_require__(507);
2177
+
2178
+ var has = SetHelpers.has;
2179
+ var remove = SetHelpers.remove;
2180
+
2181
+ // `Set.prototype.difference` method
2182
+ // https://github.com/tc39/proposal-set-methods
2183
+ module.exports = function difference(other) {
2184
+ var O = aSet(this);
2185
+ var otherRec = getSetRecord(other);
2186
+ var result = clone(O);
2187
+ if (size(O) <= otherRec.size) iterateSet(O, function (e) {
2188
+ if (otherRec.includes(e)) remove(result, e);
2189
+ });
2190
+ else iterateSimple(otherRec.getIterator(), function (e) {
2191
+ if (has(O, e)) remove(result, e);
2192
+ });
2193
+ return result;
2194
+ };
2195
+
2196
+
2197
+ /***/ }),
2198
+
2199
+ /***/ 4402:
2200
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2201
+
2202
+ "use strict";
2203
+
2204
+ var uncurryThis = __webpack_require__(9504);
2205
+
2206
+ // eslint-disable-next-line es/no-set -- safe
2207
+ var SetPrototype = Set.prototype;
2208
+
2209
+ module.exports = {
2210
+ // eslint-disable-next-line es/no-set -- safe
2211
+ Set: Set,
2212
+ add: uncurryThis(SetPrototype.add),
2213
+ has: uncurryThis(SetPrototype.has),
2214
+ remove: uncurryThis(SetPrototype['delete']),
2215
+ proto: SetPrototype
2216
+ };
2217
+
2218
+
2219
+ /***/ }),
2220
+
2221
+ /***/ 8750:
2222
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2223
+
2224
+ "use strict";
2225
+
2226
+ var aSet = __webpack_require__(7080);
2227
+ var SetHelpers = __webpack_require__(4402);
2228
+ var size = __webpack_require__(5170);
2229
+ var getSetRecord = __webpack_require__(3789);
2230
+ var iterateSet = __webpack_require__(8469);
2231
+ var iterateSimple = __webpack_require__(507);
2232
+
2233
+ var Set = SetHelpers.Set;
2234
+ var add = SetHelpers.add;
2235
+ var has = SetHelpers.has;
2236
+
2237
+ // `Set.prototype.intersection` method
2238
+ // https://github.com/tc39/proposal-set-methods
2239
+ module.exports = function intersection(other) {
2240
+ var O = aSet(this);
2241
+ var otherRec = getSetRecord(other);
2242
+ var result = new Set();
2243
+
2244
+ if (size(O) > otherRec.size) {
2245
+ iterateSimple(otherRec.getIterator(), function (e) {
2246
+ if (has(O, e)) add(result, e);
2247
+ });
2248
+ } else {
2249
+ iterateSet(O, function (e) {
2250
+ if (otherRec.includes(e)) add(result, e);
2251
+ });
2252
+ }
2253
+
2254
+ return result;
2255
+ };
2256
+
2257
+
2258
+ /***/ }),
2259
+
2260
+ /***/ 4449:
2261
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2262
+
2263
+ "use strict";
2264
+
2265
+ var aSet = __webpack_require__(7080);
2266
+ var has = (__webpack_require__(4402).has);
2267
+ var size = __webpack_require__(5170);
2268
+ var getSetRecord = __webpack_require__(3789);
2269
+ var iterateSet = __webpack_require__(8469);
2270
+ var iterateSimple = __webpack_require__(507);
2271
+ var iteratorClose = __webpack_require__(9539);
2272
+
2273
+ // `Set.prototype.isDisjointFrom` method
2274
+ // https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom
2275
+ module.exports = function isDisjointFrom(other) {
2276
+ var O = aSet(this);
2277
+ var otherRec = getSetRecord(other);
2278
+ if (size(O) <= otherRec.size) return iterateSet(O, function (e) {
2279
+ if (otherRec.includes(e)) return false;
2280
+ }, true) !== false;
2281
+ var iterator = otherRec.getIterator();
2282
+ return iterateSimple(iterator, function (e) {
2283
+ if (has(O, e)) return iteratorClose(iterator, 'normal', false);
2284
+ }) !== false;
2285
+ };
2286
+
2287
+
2288
+ /***/ }),
2289
+
2290
+ /***/ 3838:
2291
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2292
+
2293
+ "use strict";
2294
+
2295
+ var aSet = __webpack_require__(7080);
2296
+ var size = __webpack_require__(5170);
2297
+ var iterate = __webpack_require__(8469);
2298
+ var getSetRecord = __webpack_require__(3789);
2299
+
2300
+ // `Set.prototype.isSubsetOf` method
2301
+ // https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf
2302
+ module.exports = function isSubsetOf(other) {
2303
+ var O = aSet(this);
2304
+ var otherRec = getSetRecord(other);
2305
+ if (size(O) > otherRec.size) return false;
2306
+ return iterate(O, function (e) {
2307
+ if (!otherRec.includes(e)) return false;
2308
+ }, true) !== false;
2309
+ };
2310
+
2311
+
2312
+ /***/ }),
2313
+
2314
+ /***/ 8527:
2315
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2316
+
2317
+ "use strict";
2318
+
2319
+ var aSet = __webpack_require__(7080);
2320
+ var has = (__webpack_require__(4402).has);
2321
+ var size = __webpack_require__(5170);
2322
+ var getSetRecord = __webpack_require__(3789);
2323
+ var iterateSimple = __webpack_require__(507);
2324
+ var iteratorClose = __webpack_require__(9539);
2325
+
2326
+ // `Set.prototype.isSupersetOf` method
2327
+ // https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf
2328
+ module.exports = function isSupersetOf(other) {
2329
+ var O = aSet(this);
2330
+ var otherRec = getSetRecord(other);
2331
+ if (size(O) < otherRec.size) return false;
2332
+ var iterator = otherRec.getIterator();
2333
+ return iterateSimple(iterator, function (e) {
2334
+ if (!has(O, e)) return iteratorClose(iterator, 'normal', false);
2335
+ }) !== false;
2336
+ };
2337
+
2338
+
2339
+ /***/ }),
2340
+
2341
+ /***/ 8469:
2342
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2343
+
2344
+ "use strict";
2345
+
2346
+ var uncurryThis = __webpack_require__(9504);
2347
+ var iterateSimple = __webpack_require__(507);
2348
+ var SetHelpers = __webpack_require__(4402);
2349
+
2350
+ var Set = SetHelpers.Set;
2351
+ var SetPrototype = SetHelpers.proto;
2352
+ var forEach = uncurryThis(SetPrototype.forEach);
2353
+ var keys = uncurryThis(SetPrototype.keys);
2354
+ var next = keys(new Set()).next;
2355
+
2356
+ module.exports = function (set, fn, interruptible) {
2357
+ return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn);
2358
+ };
2359
+
2360
+
2361
+ /***/ }),
2362
+
2363
+ /***/ 4916:
2364
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2365
+
2366
+ "use strict";
2367
+
2368
+ var getBuiltIn = __webpack_require__(7751);
2369
+
2370
+ var createSetLike = function (size) {
2371
+ return {
2372
+ size: size,
2373
+ has: function () {
2374
+ return false;
2375
+ },
2376
+ keys: function () {
2377
+ return {
2378
+ next: function () {
2379
+ return { done: true };
2380
+ }
2381
+ };
2382
+ }
2383
+ };
2384
+ };
2385
+
2386
+ module.exports = function (name) {
2387
+ var Set = getBuiltIn('Set');
2388
+ try {
2389
+ new Set()[name](createSetLike(0));
2390
+ try {
2391
+ // late spec change, early WebKit ~ Safari 17.0 beta implementation does not pass it
2392
+ // https://github.com/tc39/proposal-set-methods/pull/88
2393
+ new Set()[name](createSetLike(-1));
2394
+ return false;
2395
+ } catch (error2) {
2396
+ return true;
2397
+ }
2398
+ } catch (error) {
2399
+ return false;
2400
+ }
2401
+ };
2402
+
2403
+
2404
+ /***/ }),
2405
+
2406
+ /***/ 5170:
2407
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2408
+
2409
+ "use strict";
2410
+
2411
+ var uncurryThisAccessor = __webpack_require__(6706);
2412
+ var SetHelpers = __webpack_require__(4402);
2413
+
2414
+ module.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) {
2415
+ return set.size;
2416
+ };
2417
+
2418
+
2419
+ /***/ }),
2420
+
2421
+ /***/ 3650:
2422
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2423
+
2424
+ "use strict";
2425
+
2426
+ var aSet = __webpack_require__(7080);
2427
+ var SetHelpers = __webpack_require__(4402);
2428
+ var clone = __webpack_require__(9286);
2429
+ var getSetRecord = __webpack_require__(3789);
2430
+ var iterateSimple = __webpack_require__(507);
2431
+
2432
+ var add = SetHelpers.add;
2433
+ var has = SetHelpers.has;
2434
+ var remove = SetHelpers.remove;
2435
+
2436
+ // `Set.prototype.symmetricDifference` method
2437
+ // https://github.com/tc39/proposal-set-methods
2438
+ module.exports = function symmetricDifference(other) {
2439
+ var O = aSet(this);
2440
+ var keysIter = getSetRecord(other).getIterator();
2441
+ var result = clone(O);
2442
+ iterateSimple(keysIter, function (e) {
2443
+ if (has(O, e)) remove(result, e);
2444
+ else add(result, e);
2445
+ });
2446
+ return result;
2447
+ };
2448
+
2449
+
2450
+ /***/ }),
2451
+
2452
+ /***/ 4204:
2453
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2454
+
2455
+ "use strict";
2456
+
2457
+ var aSet = __webpack_require__(7080);
2458
+ var add = (__webpack_require__(4402).add);
2459
+ var clone = __webpack_require__(9286);
2460
+ var getSetRecord = __webpack_require__(3789);
2461
+ var iterateSimple = __webpack_require__(507);
2462
+
2463
+ // `Set.prototype.union` method
2464
+ // https://github.com/tc39/proposal-set-methods
2465
+ module.exports = function union(other) {
2466
+ var O = aSet(this);
2467
+ var keysIter = getSetRecord(other).getIterator();
2468
+ var result = clone(O);
2469
+ iterateSimple(keysIter, function (it) {
2470
+ add(result, it);
2471
+ });
2472
+ return result;
2473
+ };
2474
+
2475
+
2025
2476
  /***/ }),
2026
2477
 
2027
2478
  /***/ 6119:
@@ -2632,46 +3083,178 @@ $({ target: 'Iterator', proto: true, real: true }, {
2632
3083
 
2633
3084
  /***/ }),
2634
3085
 
2635
- /***/ 8992:
3086
+ /***/ 7642:
2636
3087
  /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
2637
3088
 
2638
3089
  "use strict";
2639
3090
 
2640
- // TODO: Remove from `core-js@4`
2641
- __webpack_require__(8111);
3091
+ var $ = __webpack_require__(6518);
3092
+ var difference = __webpack_require__(3440);
3093
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3094
+
3095
+ // `Set.prototype.difference` method
3096
+ // https://tc39.es/ecma262/#sec-set.prototype.difference
3097
+ $({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('difference') }, {
3098
+ difference: difference
3099
+ });
2642
3100
 
2643
3101
 
2644
3102
  /***/ }),
2645
3103
 
2646
- /***/ 4520:
3104
+ /***/ 8004:
2647
3105
  /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
2648
3106
 
2649
3107
  "use strict";
2650
3108
 
2651
- // TODO: Remove from `core-js@4`
2652
- __webpack_require__(2489);
3109
+ var $ = __webpack_require__(6518);
3110
+ var fails = __webpack_require__(9039);
3111
+ var intersection = __webpack_require__(8750);
3112
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3113
+
3114
+ var INCORRECT = !setMethodAcceptSetLike('intersection') || fails(function () {
3115
+ // eslint-disable-next-line es/no-array-from, es/no-set -- testing
3116
+ return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2';
3117
+ });
3118
+
3119
+ // `Set.prototype.intersection` method
3120
+ // https://tc39.es/ecma262/#sec-set.prototype.intersection
3121
+ $({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {
3122
+ intersection: intersection
3123
+ });
2653
3124
 
2654
3125
 
2655
3126
  /***/ }),
2656
3127
 
2657
- /***/ 3949:
3128
+ /***/ 3853:
2658
3129
  /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
2659
3130
 
2660
3131
  "use strict";
2661
3132
 
2662
- // TODO: Remove from `core-js@4`
2663
- __webpack_require__(7588);
3133
+ var $ = __webpack_require__(6518);
3134
+ var isDisjointFrom = __webpack_require__(4449);
3135
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3136
+
3137
+ // `Set.prototype.isDisjointFrom` method
3138
+ // https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom
3139
+ $({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isDisjointFrom') }, {
3140
+ isDisjointFrom: isDisjointFrom
3141
+ });
2664
3142
 
2665
3143
 
2666
3144
  /***/ }),
2667
3145
 
2668
- /***/ 1454:
3146
+ /***/ 5876:
2669
3147
  /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
2670
3148
 
2671
3149
  "use strict";
2672
3150
 
2673
- // TODO: Remove from `core-js@4`
2674
- __webpack_require__(1701);
3151
+ var $ = __webpack_require__(6518);
3152
+ var isSubsetOf = __webpack_require__(3838);
3153
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3154
+
3155
+ // `Set.prototype.isSubsetOf` method
3156
+ // https://tc39.es/ecma262/#sec-set.prototype.issubsetof
3157
+ $({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSubsetOf') }, {
3158
+ isSubsetOf: isSubsetOf
3159
+ });
3160
+
3161
+
3162
+ /***/ }),
3163
+
3164
+ /***/ 2475:
3165
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3166
+
3167
+ "use strict";
3168
+
3169
+ var $ = __webpack_require__(6518);
3170
+ var isSupersetOf = __webpack_require__(8527);
3171
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3172
+
3173
+ // `Set.prototype.isSupersetOf` method
3174
+ // https://tc39.es/ecma262/#sec-set.prototype.issupersetof
3175
+ $({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSupersetOf') }, {
3176
+ isSupersetOf: isSupersetOf
3177
+ });
3178
+
3179
+
3180
+ /***/ }),
3181
+
3182
+ /***/ 5024:
3183
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3184
+
3185
+ "use strict";
3186
+
3187
+ var $ = __webpack_require__(6518);
3188
+ var symmetricDifference = __webpack_require__(3650);
3189
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3190
+
3191
+ // `Set.prototype.symmetricDifference` method
3192
+ // https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference
3193
+ $({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('symmetricDifference') }, {
3194
+ symmetricDifference: symmetricDifference
3195
+ });
3196
+
3197
+
3198
+ /***/ }),
3199
+
3200
+ /***/ 1698:
3201
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3202
+
3203
+ "use strict";
3204
+
3205
+ var $ = __webpack_require__(6518);
3206
+ var union = __webpack_require__(4204);
3207
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3208
+
3209
+ // `Set.prototype.union` method
3210
+ // https://tc39.es/ecma262/#sec-set.prototype.union
3211
+ $({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('union') }, {
3212
+ union: union
3213
+ });
3214
+
3215
+
3216
+ /***/ }),
3217
+
3218
+ /***/ 8992:
3219
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3220
+
3221
+ "use strict";
3222
+
3223
+ // TODO: Remove from `core-js@4`
3224
+ __webpack_require__(8111);
3225
+
3226
+
3227
+ /***/ }),
3228
+
3229
+ /***/ 4520:
3230
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3231
+
3232
+ "use strict";
3233
+
3234
+ // TODO: Remove from `core-js@4`
3235
+ __webpack_require__(2489);
3236
+
3237
+
3238
+ /***/ }),
3239
+
3240
+ /***/ 3949:
3241
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3242
+
3243
+ "use strict";
3244
+
3245
+ // TODO: Remove from `core-js@4`
3246
+ __webpack_require__(7588);
3247
+
3248
+
3249
+ /***/ }),
3250
+
3251
+ /***/ 1454:
3252
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3253
+
3254
+ "use strict";
3255
+
3256
+ // TODO: Remove from `core-js@4`
3257
+ __webpack_require__(1701);
2675
3258
 
2676
3259
 
2677
3260
  /***/ }),
@@ -2782,7 +3365,7 @@ __webpack_require__.r(__webpack_exports__);
2782
3365
  // EXPORTS
2783
3366
  __webpack_require__.d(__webpack_exports__, {
2784
3367
  "default": function() { return /* binding */ entry_lib; },
2785
- ganttChart: function() { return /* reexport */ components_GanttElastic; }
3368
+ ganttChart: function() { return /* reexport */ GanttElastic_standalone; }
2786
3369
  });
2787
3370
 
2788
3371
  ;// ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js
@@ -2802,8 +3385,34 @@ if (typeof window !== 'undefined') {
2802
3385
  // Indicate to webpack that this file can be concatenated
2803
3386
  /* harmony default export */ var setPublicPath = (null);
2804
3387
 
2805
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/GanttElastic.vue?vue&type=template&id=bf79b1fe
3388
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.standalone.vue?vue&type=template&id=c24bafbc
2806
3389
  var render = function render() {
3390
+ var _vm = this,
3391
+ _c = _vm._self._c;
3392
+ return _c('gantt-elastic', {
3393
+ attrs: {
3394
+ "tasks": _vm.tasks,
3395
+ "options": _vm.options,
3396
+ "dynamicStyle": _vm.dynamicStyle
3397
+ }
3398
+ }, [_vm.components.header ? _c(_vm.components.header, {
3399
+ tag: "component",
3400
+ attrs: {
3401
+ "slot": "header"
3402
+ },
3403
+ slot: "header"
3404
+ }) : _vm._e(), _vm.components.footer ? _c(_vm.components.footer, {
3405
+ tag: "component",
3406
+ attrs: {
3407
+ "slot": "footer"
3408
+ },
3409
+ slot: "footer"
3410
+ }) : _vm._e()], 1);
3411
+ };
3412
+ var staticRenderFns = [];
3413
+
3414
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.vue?vue&type=template&id=2767341e
3415
+ var GanttElasticvue_type_template_id_2767341e_render = function render() {
2807
3416
  var _vm = this,
2808
3417
  _c = _vm._self._c,
2809
3418
  _setup = _vm._self._setupProxy;
@@ -2817,14 +3426,36 @@ var render = function render() {
2817
3426
  "slot": "header"
2818
3427
  },
2819
3428
  slot: "header"
2820
- }) : _vm._e(), _vm._t("header"), _c('main-view', {
3429
+ }) : _vm._e(), _c('gantt-view-filter', {
3430
+ attrs: {
3431
+ "slot": "header"
3432
+ },
3433
+ on: {
3434
+ "view-mode-changed": _vm.onViewModeChanged
3435
+ },
3436
+ slot: "header"
3437
+ }), _vm._t("header"), _c('main-view', {
2821
3438
  ref: "mainView"
2822
3439
  }), _vm._t("footer")], 2);
2823
3440
  };
2824
- var staticRenderFns = [];
3441
+ var GanttElasticvue_type_template_id_2767341e_staticRenderFns = [];
2825
3442
 
2826
3443
  // EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js
2827
3444
  var es_array_push = __webpack_require__(4114);
3445
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.difference.v2.js
3446
+ var es_set_difference_v2 = __webpack_require__(7642);
3447
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.intersection.v2.js
3448
+ var es_set_intersection_v2 = __webpack_require__(8004);
3449
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js
3450
+ var es_set_is_disjoint_from_v2 = __webpack_require__(3853);
3451
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-subset-of.v2.js
3452
+ var es_set_is_subset_of_v2 = __webpack_require__(5876);
3453
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-superset-of.v2.js
3454
+ var es_set_is_superset_of_v2 = __webpack_require__(2475);
3455
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js
3456
+ var es_set_symmetric_difference_v2 = __webpack_require__(5024);
3457
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.union.v2.js
3458
+ var es_set_union_v2 = __webpack_require__(1698);
2828
3459
  // EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.constructor.js
2829
3460
  var esnext_iterator_constructor = __webpack_require__(8992);
2830
3461
  // EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.filter.js
@@ -2838,8 +3469,220 @@ var esnext_iterator_reduce = __webpack_require__(8872);
2838
3469
  // EXTERNAL MODULE: ./node_modules/dayjs/dayjs.min.js
2839
3470
  var dayjs_min = __webpack_require__(4353);
2840
3471
  var dayjs_min_default = /*#__PURE__*/__webpack_require__.n(dayjs_min);
2841
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/MainView.vue?vue&type=template&id=5e6f381a
2842
- var MainViewvue_type_template_id_5e6f381a_render = function render() {
3472
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Header/GanttViewFilter.vue?vue&type=template&id=f4bb58fc&scoped=true
3473
+ var GanttViewFiltervue_type_template_id_f4bb58fc_scoped_true_render = function render() {
3474
+ var _vm = this,
3475
+ _c = _vm._self._c;
3476
+ return _c('div', {
3477
+ staticClass: "gantt-view-filter"
3478
+ }, [_c('div', {
3479
+ staticClass: "view-toggle-group"
3480
+ }, [_c('button', {
3481
+ staticClass: "view-toggle-btn",
3482
+ class: {
3483
+ active: _vm.viewMode === 'day'
3484
+ },
3485
+ on: {
3486
+ "click": function ($event) {
3487
+ return _vm.changeViewMode('day');
3488
+ }
3489
+ }
3490
+ }, [_c('span', {
3491
+ staticClass: "view-icon"
3492
+ }, [_vm._v("📅")]), _c('span', {
3493
+ staticClass: "view-label"
3494
+ }, [_vm._v("Day")])]), _c('button', {
3495
+ staticClass: "view-toggle-btn",
3496
+ class: {
3497
+ active: _vm.viewMode === 'week'
3498
+ },
3499
+ on: {
3500
+ "click": function ($event) {
3501
+ return _vm.changeViewMode('week');
3502
+ }
3503
+ }
3504
+ }, [_c('span', {
3505
+ staticClass: "view-icon"
3506
+ }, [_vm._v("📊")]), _c('span', {
3507
+ staticClass: "view-label"
3508
+ }, [_vm._v("Week")])]), _c('button', {
3509
+ staticClass: "view-toggle-btn",
3510
+ class: {
3511
+ active: _vm.viewMode === 'month'
3512
+ },
3513
+ on: {
3514
+ "click": function ($event) {
3515
+ return _vm.changeViewMode('month');
3516
+ }
3517
+ }
3518
+ }, [_c('span', {
3519
+ staticClass: "view-icon"
3520
+ }, [_vm._v("🗓️")]), _c('span', {
3521
+ staticClass: "view-label"
3522
+ }, [_vm._v("Month")])]), _c('button', {
3523
+ staticClass: "view-toggle-btn",
3524
+ class: {
3525
+ active: _vm.viewMode === 'quarter'
3526
+ },
3527
+ on: {
3528
+ "click": function ($event) {
3529
+ return _vm.changeViewMode('quarter');
3530
+ }
3531
+ }
3532
+ }, [_c('span', {
3533
+ staticClass: "view-icon"
3534
+ }, [_vm._v("📈")]), _c('span', {
3535
+ staticClass: "view-label"
3536
+ }, [_vm._v("Quarter")])])])]);
3537
+ };
3538
+ var GanttViewFiltervue_type_template_id_f4bb58fc_scoped_true_staticRenderFns = [];
3539
+
3540
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Header/GanttViewFilter.vue?vue&type=script&lang=js
3541
+ /* harmony default export */ var GanttViewFiltervue_type_script_lang_js = ({
3542
+ name: 'GanttViewFilter',
3543
+ data() {
3544
+ return {
3545
+ viewMode: 'day' // default view mode
3546
+ };
3547
+ },
3548
+ methods: {
3549
+ changeViewMode(mode) {
3550
+ // eslint-disable-next-line no-debugger
3551
+ debugger;
3552
+ this.viewMode = mode;
3553
+ // Emit an event to the parent component (App.vue) so it can update the Gantt chart
3554
+ this.$emit('view-mode-changed', mode);
3555
+ }
3556
+ }
3557
+ });
3558
+ ;// ./src/components/Header/GanttViewFilter.vue?vue&type=script&lang=js
3559
+ /* harmony default export */ var Header_GanttViewFiltervue_type_script_lang_js = (GanttViewFiltervue_type_script_lang_js);
3560
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-55.use[0]!./node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-55.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-55.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Header/GanttViewFilter.vue?vue&type=style&index=0&id=f4bb58fc&prod&scoped=true&lang=css
3561
+ // extracted by mini-css-extract-plugin
3562
+
3563
+ ;// ./src/components/Header/GanttViewFilter.vue?vue&type=style&index=0&id=f4bb58fc&prod&scoped=true&lang=css
3564
+
3565
+ ;// ./node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js
3566
+ /* globals __VUE_SSR_CONTEXT__ */
3567
+
3568
+ // IMPORTANT: Do NOT use ES2015 features in this file (except for modules).
3569
+ // This module is a runtime utility for cleaner component module output and will
3570
+ // be included in the final webpack user bundle.
3571
+
3572
+ function normalizeComponent(
3573
+ scriptExports,
3574
+ render,
3575
+ staticRenderFns,
3576
+ functionalTemplate,
3577
+ injectStyles,
3578
+ scopeId,
3579
+ moduleIdentifier /* server only */,
3580
+ shadowMode /* vue-cli only */
3581
+ ) {
3582
+ // Vue.extend constructor export interop
3583
+ var options =
3584
+ typeof scriptExports === 'function' ? scriptExports.options : scriptExports
3585
+
3586
+ // render functions
3587
+ if (render) {
3588
+ options.render = render
3589
+ options.staticRenderFns = staticRenderFns
3590
+ options._compiled = true
3591
+ }
3592
+
3593
+ // functional template
3594
+ if (functionalTemplate) {
3595
+ options.functional = true
3596
+ }
3597
+
3598
+ // scopedId
3599
+ if (scopeId) {
3600
+ options._scopeId = 'data-v-' + scopeId
3601
+ }
3602
+
3603
+ var hook
3604
+ if (moduleIdentifier) {
3605
+ // server build
3606
+ hook = function (context) {
3607
+ // 2.3 injection
3608
+ context =
3609
+ context || // cached call
3610
+ (this.$vnode && this.$vnode.ssrContext) || // stateful
3611
+ (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional
3612
+ // 2.2 with runInNewContext: true
3613
+ if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
3614
+ context = __VUE_SSR_CONTEXT__
3615
+ }
3616
+ // inject component styles
3617
+ if (injectStyles) {
3618
+ injectStyles.call(this, context)
3619
+ }
3620
+ // register component module identifier for async chunk inferrence
3621
+ if (context && context._registeredComponents) {
3622
+ context._registeredComponents.add(moduleIdentifier)
3623
+ }
3624
+ }
3625
+ // used by ssr in case component is cached and beforeCreate
3626
+ // never gets called
3627
+ options._ssrRegister = hook
3628
+ } else if (injectStyles) {
3629
+ hook = shadowMode
3630
+ ? function () {
3631
+ injectStyles.call(
3632
+ this,
3633
+ (options.functional ? this.parent : this).$root.$options.shadowRoot
3634
+ )
3635
+ }
3636
+ : injectStyles
3637
+ }
3638
+
3639
+ if (hook) {
3640
+ if (options.functional) {
3641
+ // for template-only hot-reload because in that case the render fn doesn't
3642
+ // go through the normalizer
3643
+ options._injectStyles = hook
3644
+ // register for functional component in vue file
3645
+ var originalRender = options.render
3646
+ options.render = function renderWithStyleInjection(h, context) {
3647
+ hook.call(context)
3648
+ return originalRender(h, context)
3649
+ }
3650
+ } else {
3651
+ // inject component registration as beforeCreate hook
3652
+ var existing = options.beforeCreate
3653
+ options.beforeCreate = existing ? [].concat(existing, hook) : [hook]
3654
+ }
3655
+ }
3656
+
3657
+ return {
3658
+ exports: scriptExports,
3659
+ options: options
3660
+ }
3661
+ }
3662
+
3663
+ ;// ./src/components/Header/GanttViewFilter.vue
3664
+
3665
+
3666
+
3667
+ ;
3668
+
3669
+
3670
+ /* normalize component */
3671
+
3672
+ var component = normalizeComponent(
3673
+ Header_GanttViewFiltervue_type_script_lang_js,
3674
+ GanttViewFiltervue_type_template_id_f4bb58fc_scoped_true_render,
3675
+ GanttViewFiltervue_type_template_id_f4bb58fc_scoped_true_staticRenderFns,
3676
+ false,
3677
+ null,
3678
+ "f4bb58fc",
3679
+ null
3680
+
3681
+ )
3682
+
3683
+ /* harmony default export */ var GanttViewFilter = (component.exports);
3684
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/MainView.vue?vue&type=template&id=1a4b756c
3685
+ var MainViewvue_type_template_id_1a4b756c_render = function render() {
2843
3686
  var _vm = this,
2844
3687
  _c = _vm._self._c;
2845
3688
  return _c('div', {
@@ -2944,10 +3787,10 @@ var MainViewvue_type_template_id_5e6f381a_render = function render() {
2944
3787
  }
2945
3788
  })])]);
2946
3789
  };
2947
- var MainViewvue_type_template_id_5e6f381a_staticRenderFns = [];
3790
+ var MainViewvue_type_template_id_1a4b756c_staticRenderFns = [];
2948
3791
 
2949
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/TaskList/TaskList.vue?vue&type=template&id=088baa0d
2950
- var TaskListvue_type_template_id_088baa0d_render = function render() {
3792
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/TaskList.vue?vue&type=template&id=74ce1216
3793
+ var TaskListvue_type_template_id_74ce1216_render = function render() {
2951
3794
  var _vm = this,
2952
3795
  _c = _vm._self._c;
2953
3796
  return _c('div', {
@@ -2986,10 +3829,10 @@ var TaskListvue_type_template_id_088baa0d_render = function render() {
2986
3829
  });
2987
3830
  }), 1)], 1)]);
2988
3831
  };
2989
- var TaskListvue_type_template_id_088baa0d_staticRenderFns = [];
3832
+ var TaskListvue_type_template_id_74ce1216_staticRenderFns = [];
2990
3833
 
2991
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/TaskList/TaskListHeader.vue?vue&type=template&id=8ade0cf0
2992
- var TaskListHeadervue_type_template_id_8ade0cf0_render = function render() {
3834
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/TaskListHeader.vue?vue&type=template&id=2ecc0032
3835
+ var TaskListHeadervue_type_template_id_2ecc0032_render = function render() {
2993
3836
  var _vm = this,
2994
3837
  _c = _vm._self._c;
2995
3838
  return _c('div', {
@@ -3037,10 +3880,10 @@ var TaskListHeadervue_type_template_id_8ade0cf0_render = function render() {
3037
3880
  }), 0)])], 1);
3038
3881
  }), 0);
3039
3882
  };
3040
- var TaskListHeadervue_type_template_id_8ade0cf0_staticRenderFns = [];
3883
+ var TaskListHeadervue_type_template_id_2ecc0032_staticRenderFns = [];
3041
3884
 
3042
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Expander.vue?vue&type=template&id=41972c7c
3043
- var Expandervue_type_template_id_41972c7c_render = function render() {
3885
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Expander.vue?vue&type=template&id=ac398cf4
3886
+ var Expandervue_type_template_id_ac398cf4_render = function render() {
3044
3887
  var _vm = this,
3045
3888
  _c = _vm._self._c;
3046
3889
  return _c('div', {
@@ -3056,52 +3899,30 @@ var Expandervue_type_template_id_41972c7c_render = function render() {
3056
3899
  },
3057
3900
  attrs: {
3058
3901
  "width": _vm.options.size,
3059
- "height": _vm.options.size
3902
+ "height": _vm.options.size,
3903
+ "viewBox": "0 0 16 16"
3060
3904
  },
3061
3905
  on: {
3062
3906
  "click": _vm.toggle
3063
3907
  }
3064
- }, [_c('rect', {
3065
- class: _vm.getClassPrefix() + '-border',
3066
- style: {
3067
- ..._vm.root.style[_vm.getClassPrefix(false) + '-border'],
3068
- ..._vm.borderStyle
3069
- },
3070
- attrs: {
3071
- "x": _vm.border,
3072
- "y": _vm.border,
3073
- "width": _vm.options.size - _vm.border * 2,
3074
- "height": _vm.options.size - _vm.border * 2,
3075
- "rx": "2",
3076
- "ry": "2"
3077
- }
3078
- }), _vm.allChildren.length ? _c('line', {
3079
- class: _vm.getClassPrefix() + '-line',
3908
+ }, [_c('path', {
3909
+ class: _vm.getClassPrefix() + '-arrow',
3080
3910
  style: {
3081
- ..._vm.root.style[_vm.getClassPrefix(false) + '-line']
3911
+ ..._vm.root.style[_vm.getClassPrefix(false) + '-arrow']
3082
3912
  },
3083
3913
  attrs: {
3084
- "x1": _vm.lineOffset,
3085
- "y1": _vm.options.size / 2,
3086
- "x2": _vm.options.size - _vm.lineOffset,
3087
- "y2": _vm.options.size / 2
3914
+ "d": _vm.collapsed ? 'M6 4 L10 8 L6 12' : 'M4 6 L8 10 L12 6',
3915
+ "fill": "none",
3916
+ "stroke": "currentColor",
3917
+ "stroke-width": "2",
3918
+ "stroke-linecap": "round",
3919
+ "stroke-linejoin": "round"
3088
3920
  }
3089
- }) : _vm._e(), _vm.collapsed ? _c('line', {
3090
- class: _vm.getClassPrefix() + '-line',
3091
- style: {
3092
- ..._vm.root.style[_vm.getClassPrefix(false) + '-line']
3093
- },
3094
- attrs: {
3095
- "x1": _vm.options.size / 2,
3096
- "y1": _vm.lineOffset,
3097
- "x2": _vm.options.size / 2,
3098
- "y2": _vm.options.size - _vm.lineOffset
3099
- }
3100
- }) : _vm._e()]) : _vm._e()]);
3921
+ })]) : _vm._e()]);
3101
3922
  };
3102
- var Expandervue_type_template_id_41972c7c_staticRenderFns = [];
3923
+ var Expandervue_type_template_id_ac398cf4_staticRenderFns = [];
3103
3924
 
3104
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Expander.vue?vue&type=script&lang=js
3925
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Expander.vue?vue&type=script&lang=js
3105
3926
 
3106
3927
 
3107
3928
 
@@ -3183,110 +4004,16 @@ var Expandervue_type_template_id_41972c7c_staticRenderFns = [];
3183
4004
  this.tasks.forEach(task => {
3184
4005
  task.collapsed = collapsed;
3185
4006
  });
4007
+
4008
+ // Force reactivity update
4009
+ this.$forceUpdate();
4010
+ this.root.$forceUpdate();
3186
4011
  }
3187
4012
  }
3188
4013
  });
3189
- ;// ./src/components/components/Expander.vue?vue&type=script&lang=js
4014
+ ;// ./src/components/Expander.vue?vue&type=script&lang=js
3190
4015
  /* harmony default export */ var components_Expandervue_type_script_lang_js = (Expandervue_type_script_lang_js);
3191
- ;// ./node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js
3192
- /* globals __VUE_SSR_CONTEXT__ */
3193
-
3194
- // IMPORTANT: Do NOT use ES2015 features in this file (except for modules).
3195
- // This module is a runtime utility for cleaner component module output and will
3196
- // be included in the final webpack user bundle.
3197
-
3198
- function normalizeComponent(
3199
- scriptExports,
3200
- render,
3201
- staticRenderFns,
3202
- functionalTemplate,
3203
- injectStyles,
3204
- scopeId,
3205
- moduleIdentifier /* server only */,
3206
- shadowMode /* vue-cli only */
3207
- ) {
3208
- // Vue.extend constructor export interop
3209
- var options =
3210
- typeof scriptExports === 'function' ? scriptExports.options : scriptExports
3211
-
3212
- // render functions
3213
- if (render) {
3214
- options.render = render
3215
- options.staticRenderFns = staticRenderFns
3216
- options._compiled = true
3217
- }
3218
-
3219
- // functional template
3220
- if (functionalTemplate) {
3221
- options.functional = true
3222
- }
3223
-
3224
- // scopedId
3225
- if (scopeId) {
3226
- options._scopeId = 'data-v-' + scopeId
3227
- }
3228
-
3229
- var hook
3230
- if (moduleIdentifier) {
3231
- // server build
3232
- hook = function (context) {
3233
- // 2.3 injection
3234
- context =
3235
- context || // cached call
3236
- (this.$vnode && this.$vnode.ssrContext) || // stateful
3237
- (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional
3238
- // 2.2 with runInNewContext: true
3239
- if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
3240
- context = __VUE_SSR_CONTEXT__
3241
- }
3242
- // inject component styles
3243
- if (injectStyles) {
3244
- injectStyles.call(this, context)
3245
- }
3246
- // register component module identifier for async chunk inferrence
3247
- if (context && context._registeredComponents) {
3248
- context._registeredComponents.add(moduleIdentifier)
3249
- }
3250
- }
3251
- // used by ssr in case component is cached and beforeCreate
3252
- // never gets called
3253
- options._ssrRegister = hook
3254
- } else if (injectStyles) {
3255
- hook = shadowMode
3256
- ? function () {
3257
- injectStyles.call(
3258
- this,
3259
- (options.functional ? this.parent : this).$root.$options.shadowRoot
3260
- )
3261
- }
3262
- : injectStyles
3263
- }
3264
-
3265
- if (hook) {
3266
- if (options.functional) {
3267
- // for template-only hot-reload because in that case the render fn doesn't
3268
- // go through the normalizer
3269
- options._injectStyles = hook
3270
- // register for functional component in vue file
3271
- var originalRender = options.render
3272
- options.render = function renderWithStyleInjection(h, context) {
3273
- hook.call(context)
3274
- return originalRender(h, context)
3275
- }
3276
- } else {
3277
- // inject component registration as beforeCreate hook
3278
- var existing = options.beforeCreate
3279
- options.beforeCreate = existing ? [].concat(existing, hook) : [hook]
3280
- }
3281
- }
3282
-
3283
- return {
3284
- exports: scriptExports,
3285
- options: options
3286
- }
3287
- }
3288
-
3289
- ;// ./src/components/components/Expander.vue
4016
+ ;// ./src/components/Expander.vue
3290
4017
 
3291
4018
 
3292
4019
 
@@ -3294,10 +4021,10 @@ function normalizeComponent(
3294
4021
 
3295
4022
  /* normalize component */
3296
4023
  ;
3297
- var component = normalizeComponent(
4024
+ var Expander_component = normalizeComponent(
3298
4025
  components_Expandervue_type_script_lang_js,
3299
- Expandervue_type_template_id_41972c7c_render,
3300
- Expandervue_type_template_id_41972c7c_staticRenderFns,
4026
+ Expandervue_type_template_id_ac398cf4_render,
4027
+ Expandervue_type_template_id_ac398cf4_staticRenderFns,
3301
4028
  false,
3302
4029
  null,
3303
4030
  null,
@@ -3305,8 +4032,8 @@ var component = normalizeComponent(
3305
4032
 
3306
4033
  )
3307
4034
 
3308
- /* harmony default export */ var Expander = (component.exports);
3309
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/TaskList/TaskListHeader.vue?vue&type=script&lang=js
4035
+ /* harmony default export */ var Expander = (Expander_component.exports);
4036
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/TaskListHeader.vue?vue&type=script&lang=js
3310
4037
 
3311
4038
 
3312
4039
 
@@ -3406,9 +4133,9 @@ var component = normalizeComponent(
3406
4133
  // document.removeEventListener('mousemove', this.resizerMouseMove);
3407
4134
  // }
3408
4135
  });
3409
- ;// ./src/components/components/TaskList/TaskListHeader.vue?vue&type=script&lang=js
4136
+ ;// ./src/components/TaskList/TaskListHeader.vue?vue&type=script&lang=js
3410
4137
  /* harmony default export */ var TaskList_TaskListHeadervue_type_script_lang_js = (TaskListHeadervue_type_script_lang_js);
3411
- ;// ./src/components/components/TaskList/TaskListHeader.vue
4138
+ ;// ./src/components/TaskList/TaskListHeader.vue
3412
4139
 
3413
4140
 
3414
4141
 
@@ -3418,8 +4145,8 @@ var component = normalizeComponent(
3418
4145
  ;
3419
4146
  var TaskListHeader_component = normalizeComponent(
3420
4147
  TaskList_TaskListHeadervue_type_script_lang_js,
3421
- TaskListHeadervue_type_template_id_8ade0cf0_render,
3422
- TaskListHeadervue_type_template_id_8ade0cf0_staticRenderFns,
4148
+ TaskListHeadervue_type_template_id_2ecc0032_render,
4149
+ TaskListHeadervue_type_template_id_2ecc0032_staticRenderFns,
3423
4150
  false,
3424
4151
  null,
3425
4152
  null,
@@ -3428,8 +4155,8 @@ var TaskListHeader_component = normalizeComponent(
3428
4155
  )
3429
4156
 
3430
4157
  /* harmony default export */ var TaskListHeader = (TaskListHeader_component.exports);
3431
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/TaskList/TaskListItem.vue?vue&type=template&id=602cdfed
3432
- var TaskListItemvue_type_template_id_602cdfed_render = function render() {
4158
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/TaskListItem.vue?vue&type=template&id=b99d1d94
4159
+ var TaskListItemvue_type_template_id_b99d1d94_render = function render() {
3433
4160
  var _vm = this,
3434
4161
  _c = _vm._self._c;
3435
4162
  return _c('div', {
@@ -3453,10 +4180,10 @@ var TaskListItemvue_type_template_id_602cdfed_render = function render() {
3453
4180
  }) : _vm._e()], 1);
3454
4181
  }), 1);
3455
4182
  };
3456
- var TaskListItemvue_type_template_id_602cdfed_staticRenderFns = [];
4183
+ var TaskListItemvue_type_template_id_b99d1d94_staticRenderFns = [];
3457
4184
 
3458
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/TaskList/ItemColumn.vue?vue&type=template&id=0b2903fd
3459
- var ItemColumnvue_type_template_id_0b2903fd_render = function render() {
4185
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/ItemColumn.vue?vue&type=template&id=f410efbc
4186
+ var ItemColumnvue_type_template_id_f410efbc_render = function render() {
3460
4187
  var _vm = this,
3461
4188
  _c = _vm._self._c;
3462
4189
  return _c('div', {
@@ -3506,12 +4233,28 @@ var ItemColumnvue_type_template_id_0b2903fd_render = function render() {
3506
4233
  return _vm.emitEvent('touchend', $event);
3507
4234
  }
3508
4235
  }
3509
- }, [_vm._v(" " + _vm._s(_vm.value) + " ")]) : _c('div', {
4236
+ }, [_vm.column.expander && _vm.taskIcon ? _c('div', {
4237
+ staticClass: "gantt-elastic__task-list-item-icon",
4238
+ style: _vm.iconStyle
4239
+ }, [_c('svg', {
4240
+ attrs: {
4241
+ "width": "14",
4242
+ "height": "14",
4243
+ "viewBox": "0 0 14 14",
4244
+ "fill": "none"
4245
+ }
4246
+ }, [_c('path', {
4247
+ attrs: {
4248
+ "d": _vm.taskIcon,
4249
+ "fill": _vm.iconColor,
4250
+ "stroke": _vm.iconStroke,
4251
+ "stroke-width": "0.8"
4252
+ }
4253
+ })])]) : _vm._e(), _c('span', {
4254
+ staticClass: "gantt-elastic__task-list-item-text"
4255
+ }, [_vm._v(_vm._s(_vm.value))])]) : _c('div', {
3510
4256
  staticClass: "gantt-elastic__task-list-item-value",
3511
4257
  style: _vm.valueStyle,
3512
- domProps: {
3513
- "innerHTML": _vm._s(_vm.value)
3514
- },
3515
4258
  on: {
3516
4259
  "click": function ($event) {
3517
4260
  return _vm.emitEvent('click', $event);
@@ -3547,11 +4290,33 @@ var ItemColumnvue_type_template_id_0b2903fd_render = function render() {
3547
4290
  return _vm.emitEvent('touchend', $event);
3548
4291
  }
3549
4292
  }
3550
- })])], 2)]);
4293
+ }, [_vm.column.expander && _vm.taskIcon ? _c('div', {
4294
+ staticClass: "gantt-elastic__task-list-item-icon",
4295
+ style: _vm.iconStyle
4296
+ }, [_c('svg', {
4297
+ attrs: {
4298
+ "width": "14",
4299
+ "height": "14",
4300
+ "viewBox": "0 0 14 14",
4301
+ "fill": "none"
4302
+ }
4303
+ }, [_c('path', {
4304
+ attrs: {
4305
+ "d": _vm.taskIcon,
4306
+ "fill": _vm.iconColor,
4307
+ "stroke": _vm.iconStroke,
4308
+ "stroke-width": "0.8"
4309
+ }
4310
+ })])]) : _vm._e(), _c('span', {
4311
+ staticClass: "gantt-elastic__task-list-item-text",
4312
+ domProps: {
4313
+ "innerHTML": _vm._s(_vm.value)
4314
+ }
4315
+ })])])], 2)]);
3551
4316
  };
3552
- var ItemColumnvue_type_template_id_0b2903fd_staticRenderFns = [];
4317
+ var ItemColumnvue_type_template_id_f410efbc_staticRenderFns = [];
3553
4318
 
3554
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/TaskList/ItemColumn.vue?vue&type=script&lang=js
4319
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/ItemColumn.vue?vue&type=script&lang=js
3555
4320
  /* harmony default export */ var ItemColumnvue_type_script_lang_js = ({
3556
4321
  name: 'ItemColumn',
3557
4322
  inject: ['root'],
@@ -3629,12 +4394,101 @@ var ItemColumnvue_type_template_id_0b2903fd_staticRenderFns = [];
3629
4394
  ...this.root.style['task-list-item-value'],
3630
4395
  ...this.column.style['task-list-item-value']
3631
4396
  };
4397
+ },
4398
+ /**
4399
+ * Get task icon based on task type or custom icon property
4400
+ *
4401
+ * @returns {string|null}
4402
+ */
4403
+ taskIcon() {
4404
+ // Check if task has a custom icon property
4405
+ if (this.task.icon) {
4406
+ return this.task.icon;
4407
+ }
4408
+
4409
+ // Default icons based on task type - matching the interface
4410
+ const iconMap = {
4411
+ 'milestone': 'M7 2 L12 7 L7 12 L2 7 Z',
4412
+ // Purple diamond for milestones
4413
+ 'task': 'M3 3 L11 3 L11 11 L3 11 Z',
4414
+ // Blue square for tasks
4415
+ 'project': 'M7 2 L12 7 L7 12 L2 7 Z',
4416
+ // Purple diamond for projects
4417
+ 'sprint': 'M3 4 L11 4 L11 10 L3 10 Z',
4418
+ // Rectangle for sprints
4419
+ 'flag': 'M3 3 L9 3 L9 7 L7 9 L5 7 L5 3 Z M3 3 L3 11 M5 3 L5 11',
4420
+ // Green flag
4421
+ 'check': 'M3 3 L11 3 L11 11 L3 11 Z M5 7 L7 9 L9 5',
4422
+ // Blue checkmark in square
4423
+ 'epic': 'M7 2 L12 7 L7 12 L2 7 Z' // Purple diamond for epics
4424
+ };
4425
+
4426
+ // Always return an icon for tasks, default to task icon if type not found
4427
+ return iconMap[this.task.type] || iconMap['task'];
4428
+ },
4429
+ /**
4430
+ * Get icon color based on task properties
4431
+ *
4432
+ * @returns {string}
4433
+ */
4434
+ iconColor() {
4435
+ if (this.task.iconColor) {
4436
+ return this.task.iconColor;
4437
+ }
4438
+
4439
+ // Default colors based on task type - matching chart grid bar colors
4440
+ const colorMap = {
4441
+ 'milestone': '#CD5C5C',
4442
+ // Light maroon - matches chart
4443
+ 'task': '#3B82F6',
4444
+ // Blue - matches chart
4445
+ 'project': '#8B5CF6',
4446
+ // Purple - matches chart
4447
+ 'sprint': '#F59E0B',
4448
+ // Orange rectangle
4449
+ 'flag': '#10B981',
4450
+ // Green flag
4451
+ 'check': '#3B82F6',
4452
+ // Blue checkmark
4453
+ 'epic': '#8B5CF6',
4454
+ // Purple - matches chart
4455
+ 'story': '#86EFAC',
4456
+ // Light green - matches chart
4457
+ 'subtask': '#3B82F6' // Blue - matches chart
4458
+ };
4459
+ return colorMap[this.task.type] || '#6B7280'; // Gray default
4460
+ },
4461
+ /**
4462
+ * Get icon stroke color
4463
+ *
4464
+ * @returns {string}
4465
+ */
4466
+ iconStroke() {
4467
+ if (this.task.iconStroke) {
4468
+ return this.task.iconStroke;
4469
+ }
4470
+ return this.iconColor; // Same as fill color
4471
+ },
4472
+ /**
4473
+ * Get icon style
4474
+ *
4475
+ * @returns {object}
4476
+ */
4477
+ iconStyle() {
4478
+ return {
4479
+ display: 'flex',
4480
+ alignItems: 'center',
4481
+ marginRight: '6px',
4482
+ flexShrink: 0,
4483
+ width: '14px',
4484
+ height: '14px'
4485
+ };
3632
4486
  }
3633
4487
  }
3634
4488
  });
3635
- ;// ./src/components/components/TaskList/ItemColumn.vue?vue&type=script&lang=js
4489
+ ;// ./src/components/TaskList/ItemColumn.vue?vue&type=script&lang=js
3636
4490
  /* harmony default export */ var TaskList_ItemColumnvue_type_script_lang_js = (ItemColumnvue_type_script_lang_js);
3637
- ;// ./src/components/components/TaskList/ItemColumn.vue
4491
+ ;// ./src/components/TaskList/ItemColumn.vue
3638
4492
 
3639
4493
 
3640
4494
 
@@ -3644,8 +4498,8 @@ var ItemColumnvue_type_template_id_0b2903fd_staticRenderFns = [];
3644
4498
  ;
3645
4499
  var ItemColumn_component = normalizeComponent(
3646
4500
  TaskList_ItemColumnvue_type_script_lang_js,
3647
- ItemColumnvue_type_template_id_0b2903fd_render,
3648
- ItemColumnvue_type_template_id_0b2903fd_staticRenderFns,
4501
+ ItemColumnvue_type_template_id_f410efbc_render,
4502
+ ItemColumnvue_type_template_id_f410efbc_staticRenderFns,
3649
4503
  false,
3650
4504
  null,
3651
4505
  null,
@@ -3654,7 +4508,7 @@ var ItemColumn_component = normalizeComponent(
3654
4508
  )
3655
4509
 
3656
4510
  /* harmony default export */ var ItemColumn = (ItemColumn_component.exports);
3657
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/TaskList/TaskListItem.vue?vue&type=script&lang=js
4511
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/TaskListItem.vue?vue&type=script&lang=js
3658
4512
 
3659
4513
 
3660
4514
  /* harmony default export */ var TaskListItemvue_type_script_lang_js = ({
@@ -3674,9 +4528,9 @@ var ItemColumn_component = normalizeComponent(
3674
4528
  }
3675
4529
  }
3676
4530
  });
3677
- ;// ./src/components/components/TaskList/TaskListItem.vue?vue&type=script&lang=js
4531
+ ;// ./src/components/TaskList/TaskListItem.vue?vue&type=script&lang=js
3678
4532
  /* harmony default export */ var TaskList_TaskListItemvue_type_script_lang_js = (TaskListItemvue_type_script_lang_js);
3679
- ;// ./src/components/components/TaskList/TaskListItem.vue
4533
+ ;// ./src/components/TaskList/TaskListItem.vue
3680
4534
 
3681
4535
 
3682
4536
 
@@ -3686,8 +4540,8 @@ var ItemColumn_component = normalizeComponent(
3686
4540
  ;
3687
4541
  var TaskListItem_component = normalizeComponent(
3688
4542
  TaskList_TaskListItemvue_type_script_lang_js,
3689
- TaskListItemvue_type_template_id_602cdfed_render,
3690
- TaskListItemvue_type_template_id_602cdfed_staticRenderFns,
4543
+ TaskListItemvue_type_template_id_b99d1d94_render,
4544
+ TaskListItemvue_type_template_id_b99d1d94_staticRenderFns,
3691
4545
  false,
3692
4546
  null,
3693
4547
  null,
@@ -3696,7 +4550,7 @@ var TaskListItem_component = normalizeComponent(
3696
4550
  )
3697
4551
 
3698
4552
  /* harmony default export */ var TaskListItem = (TaskListItem_component.exports);
3699
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/TaskList/TaskList.vue?vue&type=script&lang=js
4553
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/TaskList.vue?vue&type=script&lang=js
3700
4554
 
3701
4555
 
3702
4556
  /* harmony default export */ var TaskListvue_type_script_lang_js = ({
@@ -3718,9 +4572,9 @@ var TaskListItem_component = normalizeComponent(
3718
4572
  this.root.state.refs.taskListItems = this.$refs.taskListItems;
3719
4573
  }
3720
4574
  });
3721
- ;// ./src/components/components/TaskList/TaskList.vue?vue&type=script&lang=js
4575
+ ;// ./src/components/TaskList/TaskList.vue?vue&type=script&lang=js
3722
4576
  /* harmony default export */ var TaskList_TaskListvue_type_script_lang_js = (TaskListvue_type_script_lang_js);
3723
- ;// ./src/components/components/TaskList/TaskList.vue
4577
+ ;// ./src/components/TaskList/TaskList.vue
3724
4578
 
3725
4579
 
3726
4580
 
@@ -3730,8 +4584,8 @@ var TaskListItem_component = normalizeComponent(
3730
4584
  ;
3731
4585
  var TaskList_component = normalizeComponent(
3732
4586
  TaskList_TaskListvue_type_script_lang_js,
3733
- TaskListvue_type_template_id_088baa0d_render,
3734
- TaskListvue_type_template_id_088baa0d_staticRenderFns,
4587
+ TaskListvue_type_template_id_74ce1216_render,
4588
+ TaskListvue_type_template_id_74ce1216_staticRenderFns,
3735
4589
  false,
3736
4590
  null,
3737
4591
  null,
@@ -3740,8 +4594,8 @@ var TaskList_component = normalizeComponent(
3740
4594
  )
3741
4595
 
3742
4596
  /* harmony default export */ var TaskList = (TaskList_component.exports);
3743
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/Chart.vue?vue&type=template&id=4ae99150
3744
- var Chartvue_type_template_id_4ae99150_render = function render() {
4597
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Chart.vue?vue&type=template&id=1d5eb6d6
4598
+ var Chartvue_type_template_id_1d5eb6d6_render = function render() {
3745
4599
  var _vm = this,
3746
4600
  _c = _vm._self._c;
3747
4601
  return _c('div', {
@@ -3813,10 +4667,10 @@ var Chartvue_type_template_id_4ae99150_render = function render() {
3813
4667
  })], 1);
3814
4668
  })], 2)])])])]);
3815
4669
  };
3816
- var Chartvue_type_template_id_4ae99150_staticRenderFns = [];
4670
+ var Chartvue_type_template_id_1d5eb6d6_staticRenderFns = [];
3817
4671
 
3818
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/Grid.vue?vue&type=template&id=1f8d69e4
3819
- var Gridvue_type_template_id_1f8d69e4_render = function render() {
4672
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Grid.vue?vue&type=template&id=b2e4dec2
4673
+ var Gridvue_type_template_id_b2e4dec2_render = function render() {
3820
4674
  var _vm = this,
3821
4675
  _c = _vm._self._c;
3822
4676
  return _c('svg', {
@@ -3878,9 +4732,9 @@ var Gridvue_type_template_id_1f8d69e4_render = function render() {
3878
4732
  }
3879
4733
  })], 2)]);
3880
4734
  };
3881
- var Gridvue_type_template_id_1f8d69e4_staticRenderFns = [];
4735
+ var Gridvue_type_template_id_b2e4dec2_staticRenderFns = [];
3882
4736
 
3883
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/Grid.vue?vue&type=script&lang=js
4737
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Grid.vue?vue&type=script&lang=js
3884
4738
 
3885
4739
 
3886
4740
 
@@ -3924,17 +4778,57 @@ var Gridvue_type_template_id_1f8d69e4_staticRenderFns = [];
3924
4778
  verticalLines() {
3925
4779
  let lines = [];
3926
4780
  const state = this.root.state;
3927
- state.options.times.steps.forEach(step => {
3928
- if (this.root.isInsideViewPort(step.offset.px, 1)) {
3929
- lines.push({
4781
+
4782
+ // Add grid lines for all steps (remove viewport check to ensure all borders are drawn)
4783
+ state.options.times.steps.forEach((step, index) => {
4784
+ // Only generate grid lines for steps with valid coordinates
4785
+ if (step.offset && typeof step.offset.px === 'number' && !isNaN(step.offset.px)) {
4786
+ const line = {
3930
4787
  key: step.time,
3931
- x1: step.offset.px,
4788
+ x1: Math.round(step.offset.px),
4789
+ // Round to ensure exact pixel alignment
3932
4790
  y1: 0,
3933
- x2: step.offset.px,
4791
+ x2: Math.round(step.offset.px),
4792
+ // Round to ensure exact pixel alignment
3934
4793
  y2: state.tasks.length * (state.options.row.height + state.options.chart.grid.horizontal.gap * 2) + this.root.style['grid-line-vertical']['stroke-width']
3935
- });
4794
+ };
4795
+ lines.push(line);
4796
+
4797
+ // Debug: Log grid lines for quarter view
4798
+ if (state.options.times.stepDuration === 'quarter') {
4799
+ console.log(`Grid Line ${index}:`, {
4800
+ x: line.x1,
4801
+ time: new Date(step.time).toISOString().split('T')[0],
4802
+ quarter: new Date(step.time).getMonth() < 3 ? 1 : new Date(step.time).getMonth() < 6 ? 2 : new Date(step.time).getMonth() < 9 ? 3 : 4,
4803
+ stepWidth: step.width && step.width.px || 0,
4804
+ stepOffset: step.offset && step.offset.px || 0,
4805
+ hasValidX: line.x1 >= 0 && !isNaN(line.x1)
4806
+ });
4807
+ }
4808
+ } else {
4809
+ // Debug: Log steps that are being skipped
4810
+ if (state.options.times.stepDuration === 'quarter') {
4811
+ console.log(`Skipped Grid Line ${index}:`, {
4812
+ time: new Date(step.time).toISOString().split('T')[0],
4813
+ offset: step.offset,
4814
+ hasValidOffset: !!(step.offset && typeof step.offset.px === 'number' && !isNaN(step.offset.px))
4815
+ });
4816
+ }
3936
4817
  }
3937
4818
  });
4819
+
4820
+ // Add final grid line at the end of the chart area to eliminate empty space
4821
+ const lastStep = state.options.times.steps[state.options.times.steps.length - 1];
4822
+ if (lastStep) {
4823
+ const finalX = Math.round(lastStep.offset.px + lastStep.width.px);
4824
+ lines.push({
4825
+ key: 'final-line',
4826
+ x1: finalX,
4827
+ y1: 0,
4828
+ x2: finalX,
4829
+ y2: state.tasks.length * (state.options.row.height + state.options.chart.grid.horizontal.gap * 2) + this.root.style['grid-line-vertical']['stroke-width']
4830
+ });
4831
+ }
3938
4832
  return lines;
3939
4833
  },
3940
4834
  /**
@@ -3991,9 +4885,9 @@ var Gridvue_type_template_id_1f8d69e4_staticRenderFns = [];
3991
4885
  }
3992
4886
  }
3993
4887
  });
3994
- ;// ./src/components/components/Chart/Grid.vue?vue&type=script&lang=js
4888
+ ;// ./src/components/Chart/Grid.vue?vue&type=script&lang=js
3995
4889
  /* harmony default export */ var Chart_Gridvue_type_script_lang_js = (Gridvue_type_script_lang_js);
3996
- ;// ./src/components/components/Chart/Grid.vue
4890
+ ;// ./src/components/Chart/Grid.vue
3997
4891
 
3998
4892
 
3999
4893
 
@@ -4003,8 +4897,8 @@ var Gridvue_type_template_id_1f8d69e4_staticRenderFns = [];
4003
4897
  ;
4004
4898
  var Grid_component = normalizeComponent(
4005
4899
  Chart_Gridvue_type_script_lang_js,
4006
- Gridvue_type_template_id_1f8d69e4_render,
4007
- Gridvue_type_template_id_1f8d69e4_staticRenderFns,
4900
+ Gridvue_type_template_id_b2e4dec2_render,
4901
+ Gridvue_type_template_id_b2e4dec2_staticRenderFns,
4008
4902
  false,
4009
4903
  null,
4010
4904
  null,
@@ -4013,8 +4907,8 @@ var Grid_component = normalizeComponent(
4013
4907
  )
4014
4908
 
4015
4909
  /* harmony default export */ var Grid = (Grid_component.exports);
4016
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/DaysHighlight.vue?vue&type=template&id=06b8681f
4017
- var DaysHighlightvue_type_template_id_06b8681f_render = function render() {
4910
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/DaysHighlight.vue?vue&type=template&id=94382932
4911
+ var DaysHighlightvue_type_template_id_94382932_render = function render() {
4018
4912
  var _vm = this,
4019
4913
  _c = _vm._self._c;
4020
4914
  return _vm.showWorkingDays ? _c('g', {
@@ -4038,9 +4932,9 @@ var DaysHighlightvue_type_template_id_06b8681f_render = function render() {
4038
4932
  });
4039
4933
  }), 0) : _vm._e();
4040
4934
  };
4041
- var DaysHighlightvue_type_template_id_06b8681f_staticRenderFns = [];
4935
+ var DaysHighlightvue_type_template_id_94382932_staticRenderFns = [];
4042
4936
 
4043
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/DaysHighlight.vue?vue&type=script&lang=js
4937
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/DaysHighlight.vue?vue&type=script&lang=js
4044
4938
 
4045
4939
 
4046
4940
 
@@ -4058,7 +4952,8 @@ var DaysHighlightvue_type_template_id_06b8681f_staticRenderFns = [];
4058
4952
  * @returns {string} key ideintifier for loop
4059
4953
  */
4060
4954
  getKey(day) {
4061
- return dayjs_min_default()(day.time).format('YYYY-MM-DD');
4955
+ // Return the full date-time format
4956
+ return dayjs_min_default()(day.time).format('YYYY-MM-DD HH:mm');
4062
4957
  }
4063
4958
  },
4064
4959
  computed: {
@@ -4086,9 +4981,9 @@ var DaysHighlightvue_type_template_id_06b8681f_staticRenderFns = [];
4086
4981
  }
4087
4982
  }
4088
4983
  });
4089
- ;// ./src/components/components/Chart/DaysHighlight.vue?vue&type=script&lang=js
4984
+ ;// ./src/components/Chart/DaysHighlight.vue?vue&type=script&lang=js
4090
4985
  /* harmony default export */ var Chart_DaysHighlightvue_type_script_lang_js = (DaysHighlightvue_type_script_lang_js);
4091
- ;// ./src/components/components/Chart/DaysHighlight.vue
4986
+ ;// ./src/components/Chart/DaysHighlight.vue
4092
4987
 
4093
4988
 
4094
4989
 
@@ -4098,8 +4993,8 @@ var DaysHighlightvue_type_template_id_06b8681f_staticRenderFns = [];
4098
4993
  ;
4099
4994
  var DaysHighlight_component = normalizeComponent(
4100
4995
  Chart_DaysHighlightvue_type_script_lang_js,
4101
- DaysHighlightvue_type_template_id_06b8681f_render,
4102
- DaysHighlightvue_type_template_id_06b8681f_staticRenderFns,
4996
+ DaysHighlightvue_type_template_id_94382932_render,
4997
+ DaysHighlightvue_type_template_id_94382932_staticRenderFns,
4103
4998
  false,
4104
4999
  null,
4105
5000
  null,
@@ -4108,8 +5003,8 @@ var DaysHighlight_component = normalizeComponent(
4108
5003
  )
4109
5004
 
4110
5005
  /* harmony default export */ var DaysHighlight = (DaysHighlight_component.exports);
4111
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Calendar/Calendar.vue?vue&type=template&id=19446f31
4112
- var Calendarvue_type_template_id_19446f31_render = function render() {
5006
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Calendar/Calendar.vue?vue&type=template&id=c22056b8
5007
+ var Calendarvue_type_template_id_c22056b8_render = function render() {
4113
5008
  var _vm = this,
4114
5009
  _c = _vm._self._c;
4115
5010
  return _c('div', {
@@ -4124,30 +5019,41 @@ var Calendarvue_type_template_id_19446f31_render = function render() {
4124
5019
  ..._vm.root.style['calendar'],
4125
5020
  width: _vm.root.state.options.width + 'px'
4126
5021
  }
4127
- }, [_vm.root.state.options.calendar.month.display ? _c('calendar-row', {
5022
+ }, [_vm.viewMode === 'quarter' ? _c('calendar-row', {
5023
+ attrs: {
5024
+ "items": _vm.dates.quarters,
5025
+ "which": "quarter"
5026
+ }
5027
+ }) : _vm._e(), _vm.viewMode === 'month' ? _c('calendar-row', {
4128
5028
  attrs: {
4129
5029
  "items": _vm.dates.months,
4130
5030
  "which": "month"
4131
5031
  }
4132
- }) : _vm._e(), _vm.root.state.options.calendar.day.display ? _c('calendar-row', {
5032
+ }) : _vm._e(), _vm.viewMode === 'week' ? _c('calendar-row', {
4133
5033
  attrs: {
4134
- "items": _vm.dates.days,
4135
- "which": "day"
5034
+ "items": _vm.dates.weeks,
5035
+ "which": "week"
4136
5036
  }
4137
- }) : _vm._e(), _vm.root.state.options.calendar.hour.display ? _c('calendar-row', {
5037
+ }) : _vm._e(), _vm.viewMode === 'day' ? _c('calendar-row', {
4138
5038
  attrs: {
4139
- "items": _vm.dates.hours,
4140
- "which": "hour"
5039
+ "items": _vm.dates.days,
5040
+ "which": "day"
4141
5041
  }
4142
5042
  }) : _vm._e()], 1)]);
4143
5043
  };
4144
- var Calendarvue_type_template_id_19446f31_staticRenderFns = [];
4145
-
4146
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Calendar/CalendarRow.vue?vue&type=template&id=50cc12d2
4147
- var CalendarRowvue_type_template_id_50cc12d2_render = function render() {
5044
+ var Calendarvue_type_template_id_c22056b8_staticRenderFns = [];
5045
+
5046
+ // EXTERNAL MODULE: ./node_modules/dayjs/plugin/weekOfYear.js
5047
+ var weekOfYear = __webpack_require__(8134);
5048
+ var weekOfYear_default = /*#__PURE__*/__webpack_require__.n(weekOfYear);
5049
+ // EXTERNAL MODULE: ./node_modules/dayjs/plugin/quarterOfYear.js
5050
+ var quarterOfYear = __webpack_require__(1816);
5051
+ var quarterOfYear_default = /*#__PURE__*/__webpack_require__.n(quarterOfYear);
5052
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Calendar/CalendarRow.vue?vue&type=template&id=db48ac98
5053
+ var CalendarRowvue_type_template_id_db48ac98_render = function render() {
4148
5054
  var _vm = this,
4149
5055
  _c = _vm._self._c;
4150
- return _c('div', {
5056
+ return _c('section', [_c('div', {
4151
5057
  class: 'gantt-elastic__calendar-row gantt-elastic__calendar-row--' + _vm.which,
4152
5058
  style: _vm.rowStyle
4153
5059
  }, _vm._l(_vm.items, function (item, itemIndex) {
@@ -4165,11 +5071,11 @@ var CalendarRowvue_type_template_id_50cc12d2_render = function render() {
4165
5071
  style: _vm.textStyle(child)
4166
5072
  }, [_vm._v(" " + _vm._s(child.label) + " ")])]);
4167
5073
  }), 0);
4168
- }), 0);
5074
+ }), 0)]);
4169
5075
  };
4170
- var CalendarRowvue_type_template_id_50cc12d2_staticRenderFns = [];
5076
+ var CalendarRowvue_type_template_id_db48ac98_staticRenderFns = [];
4171
5077
 
4172
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Calendar/CalendarRow.vue?vue&type=script&lang=js
5078
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Calendar/CalendarRow.vue?vue&type=script&lang=js
4173
5079
 
4174
5080
  /* harmony default export */ var CalendarRowvue_type_script_lang_js = ({
4175
5081
  name: 'CalendarRow',
@@ -4185,24 +5091,41 @@ var CalendarRowvue_type_template_id_50cc12d2_staticRenderFns = [];
4185
5091
  * @returns {number}
4186
5092
  */
4187
5093
  getTextX(item) {
4188
- let x = item.x + item.width / 2 - item.textWidth / 2;
4189
- if (this.which === 'month' && this.root.isInsideViewPort(item.x, item.width, 0)) {
4190
- let scrollWidth = this.root.state.options.scroll.chart.right - this.root.state.options.scroll.chart.left;
4191
- x = this.root.state.options.scroll.chart.left + scrollWidth / 2 - item.textWidth / 2 + 2;
4192
- if (x + item.textWidth + 2 > item.x + item.width) {
4193
- x = item.x + item.width - item.textWidth - 2;
4194
- } else if (x < item.x) {
4195
- x = item.x + 2;
5094
+ // Calculate center position within the item
5095
+ let x = item.width / 2 - item.textWidth / 2;
5096
+
5097
+ // Add padding to avoid overlap with grid lines
5098
+ const gridLineWidth = this.root.style['grid-line-vertical']['stroke-width'] || 1;
5099
+ const padding = Math.max(gridLineWidth / 2 + 2, 4); // At least 4px padding
5100
+
5101
+ // For month view, use perfect centering with bounds checking
5102
+ if (this.which === 'month') {
5103
+ // Perfect center calculation
5104
+ x = (item.width - item.textWidth) / 2;
5105
+
5106
+ // Ensure text stays within bounds with padding
5107
+ if (x < padding) {
5108
+ x = padding;
5109
+ } else if (x + item.textWidth + padding > item.width) {
5110
+ x = item.width - item.textWidth - padding;
5111
+ }
5112
+ } else {
5113
+ // For other view types, ensure text stays within bounds
5114
+ if (x + item.textWidth + padding > item.width) {
5115
+ x = item.width - item.textWidth - padding;
5116
+ } else if (x < padding) {
5117
+ x = padding;
4196
5118
  }
4197
5119
  }
4198
- return x - item.x;
5120
+ return x;
4199
5121
  }
4200
5122
  },
4201
5123
  computed: {
4202
5124
  rowStyle() {
4203
5125
  return {
4204
5126
  ...this.root.style['calendar-row'],
4205
- ...this.root.style['calendar-row--' + this.which]
5127
+ ...this.root.style['calendar-row--' + this.which],
5128
+ position: 'relative' // Ensure relative positioning for absolute children
4206
5129
  };
4207
5130
  },
4208
5131
  rectStyle() {
@@ -4223,7 +5146,10 @@ var CalendarRowvue_type_template_id_50cc12d2_staticRenderFns = [];
4223
5146
  childrenStyle.push({
4224
5147
  ...basicStyle,
4225
5148
  width: child.width + 'px',
4226
- height: child.height + 'px'
5149
+ height: child.height + 'px',
5150
+ left: child.x + 'px',
5151
+ // Use exact x position for perfect alignment
5152
+ position: 'absolute' // Ensure absolute positioning
4227
5153
  });
4228
5154
  }
4229
5155
  style.push(childrenStyle);
@@ -4239,17 +5165,15 @@ var CalendarRowvue_type_template_id_50cc12d2_staticRenderFns = [];
4239
5165
  const style = {
4240
5166
  ...basicStyle
4241
5167
  };
4242
- if (this.which === 'month') {
4243
- style.left = this.getTextX(child) + 'px';
4244
- }
5168
+ // Remove left positioning for month view - let CSS handle centering
4245
5169
  return style;
4246
5170
  };
4247
5171
  }
4248
5172
  }
4249
5173
  });
4250
- ;// ./src/components/components/Calendar/CalendarRow.vue?vue&type=script&lang=js
5174
+ ;// ./src/components/Calendar/CalendarRow.vue?vue&type=script&lang=js
4251
5175
  /* harmony default export */ var Calendar_CalendarRowvue_type_script_lang_js = (CalendarRowvue_type_script_lang_js);
4252
- ;// ./src/components/components/Calendar/CalendarRow.vue
5176
+ ;// ./src/components/Calendar/CalendarRow.vue
4253
5177
 
4254
5178
 
4255
5179
 
@@ -4259,8 +5183,8 @@ var CalendarRowvue_type_template_id_50cc12d2_staticRenderFns = [];
4259
5183
  ;
4260
5184
  var CalendarRow_component = normalizeComponent(
4261
5185
  Calendar_CalendarRowvue_type_script_lang_js,
4262
- CalendarRowvue_type_template_id_50cc12d2_render,
4263
- CalendarRowvue_type_template_id_50cc12d2_staticRenderFns,
5186
+ CalendarRowvue_type_template_id_db48ac98_render,
5187
+ CalendarRowvue_type_template_id_db48ac98_staticRenderFns,
4264
5188
  false,
4265
5189
  null,
4266
5190
  null,
@@ -4269,10 +5193,16 @@ var CalendarRow_component = normalizeComponent(
4269
5193
  )
4270
5194
 
4271
5195
  /* harmony default export */ var CalendarRow = (CalendarRow_component.exports);
4272
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Calendar/Calendar.vue?vue&type=script&lang=js
5196
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Calendar/Calendar.vue?vue&type=script&lang=js
5197
+
5198
+
4273
5199
 
4274
5200
 
4275
5201
 
5202
+
5203
+ // Extend dayjs with required plugins
5204
+ dayjs_min_default().extend((weekOfYear_default()));
5205
+ dayjs_min_default().extend((quarterOfYear_default()));
4276
5206
  /* harmony default export */ var Calendarvue_type_script_lang_js = ({
4277
5207
  name: 'Calendar',
4278
5208
  components: {
@@ -4280,155 +5210,60 @@ var CalendarRow_component = normalizeComponent(
4280
5210
  },
4281
5211
  inject: ['root'],
4282
5212
  data() {
4283
- return {};
5213
+ return {
5214
+ dayjsInstance: (dayjs_min_default()) // Store dayjs instance for consistent usage
5215
+ };
5216
+ },
5217
+ computed: {
5218
+ viewMode() {
5219
+ return this.root.state.options.calendar.viewMode || 'day';
5220
+ },
5221
+ dates() {
5222
+ const days = this.generateDays();
5223
+ const weeks = this.generateWeeks();
5224
+ const months = this.generateMonths();
5225
+ const quarters = this.generateQuarters();
5226
+ const allDates = {
5227
+ days,
5228
+ weeks,
5229
+ months,
5230
+ quarters
5231
+ };
5232
+ this.calculateCalendarDimensions(allDates);
5233
+ return allDates;
5234
+ }
4284
5235
  },
4285
5236
  methods: {
4286
- /**
4287
- * How many hours will fit?
4288
- *
4289
- * @returns {object}
4290
- */
4291
- howManyHoursFit(dayIndex) {
4292
- const stroke = 1;
4293
- const additionalSpace = stroke + 2;
4294
- let fullCellWidth = this.root.state.options.times.steps[dayIndex].width.px;
4295
- let formatNames = Object.keys(this.root.state.options.calendar.hour.format);
4296
- for (let hours = 24; hours > 1; hours = Math.ceil(hours / 2)) {
4297
- for (let formatName of formatNames) {
4298
- if ((this.root.state.options.calendar.hour.maxWidths[formatName] + additionalSpace) * hours <= fullCellWidth && hours > 1) {
4299
- return {
4300
- count: hours,
4301
- type: formatName
4302
- };
4303
- }
4304
- }
5237
+ calculateCalendarDimensions({
5238
+ days,
5239
+ weeks,
5240
+ months,
5241
+ quarters
5242
+ }) {
5243
+ let height = 0;
5244
+ if (this.viewMode === 'quarter' && quarters.length > 0) {
5245
+ height += this.root.state.options.calendar.quarter && this.root.state.options.calendar.quarter.height || 30;
4305
5246
  }
4306
- return {
4307
- count: 0,
4308
- type: ''
4309
- };
4310
- },
4311
- /**
4312
- * How many days will fit?
4313
- *
4314
- * @returns {object}
4315
- */
4316
- howManyDaysFit() {
4317
- const stroke = 1;
4318
- const additionalSpace = stroke + 2;
4319
- let fullWidth = this.root.state.options.width;
4320
- let formatNames = Object.keys(this.root.state.options.calendar.day.format);
4321
- for (let days = this.root.state.options.times.steps.length; days > 1; days = Math.ceil(days / 2)) {
4322
- for (let formatName of formatNames) {
4323
- if ((this.root.state.options.calendar.day.maxWidths[formatName] + additionalSpace) * days <= fullWidth && days > 1) {
4324
- return {
4325
- count: days,
4326
- type: formatName
4327
- };
4328
- }
4329
- }
5247
+
5248
+ // Add month height if visible
5249
+ if (this.viewMode === 'month' && months.length > 0) {
5250
+ height += this.root.state.options.calendar.month.height || 25;
4330
5251
  }
4331
- return {
4332
- count: 0,
4333
- type: ''
4334
- };
5252
+
5253
+ // Add week height if visible
5254
+ if (this.viewMode === 'week' && weeks.length > 0) {
5255
+ height += this.root.state.options.calendar.week && this.root.state.options.calendar.week.height || 25;
5256
+ }
5257
+
5258
+ // Add day height if visible
5259
+ if (this.viewMode === 'day' && days.length > 0) {
5260
+ height += this.root.state.options.calendar.day.height;
5261
+ }
5262
+ this.root.state.options.calendar.height = height;
4335
5263
  },
4336
- /**
4337
- * How many months will fit?
4338
- *
4339
- * @returns {object}
4340
- */
4341
- howManyMonthsFit() {
4342
- const stroke = 1;
4343
- const additionalSpace = stroke + 2;
4344
- let fullWidth = this.root.state.options.width;
4345
- let formatNames = Object.keys(this.root.state.options.calendar.month.format);
4346
- let currentMonth = dayjs_min_default()(this.root.state.options.times.firstTime);
4347
- let previousMonth = currentMonth.clone();
4348
- const lastTime = this.root.state.options.times.lastTime;
4349
- let monthsCount = this.root.monthsCount(this.root.state.options.times.firstTime, this.root.state.options.times.lastTime);
4350
- if (monthsCount === 1) {
4351
- for (let formatName of formatNames) {
4352
- if (this.root.state.options.calendar.month.maxWidths[formatName] + additionalSpace <= fullWidth) {
4353
- return {
4354
- count: 1,
4355
- type: formatName
4356
- };
4357
- }
4358
- }
4359
- }
4360
- for (let months = monthsCount; months > 1; months = Math.ceil(months / 2)) {
4361
- for (let formatName of formatNames) {
4362
- if ((this.root.state.options.calendar.month.maxWidths[formatName] + additionalSpace) * months <= fullWidth && months > 1) {
4363
- return {
4364
- count: months,
4365
- type: formatName
4366
- };
4367
- }
4368
- }
4369
- }
4370
- return {
4371
- count: 0,
4372
- type: formatNames[0]
4373
- };
4374
- },
4375
- /**
4376
- * Generate hours
4377
- *
4378
- * @returns {array}
4379
- */
4380
- generateHours() {
4381
- let allHours = [];
4382
- if (!this.root.state.options.calendar.hour.display) {
4383
- return allHours;
4384
- }
4385
- const steps = this.root.state.options.times.steps;
4386
- const localeName = this.root.state.options.locale.name;
4387
- for (let hourIndex = 0, len = steps.length; hourIndex < len; hourIndex++) {
4388
- const hoursCount = this.howManyHoursFit(hourIndex);
4389
- if (hoursCount.count === 0) {
4390
- continue;
4391
- }
4392
- const hours = {
4393
- key: hourIndex + 'step',
4394
- children: []
4395
- };
4396
- const hourStep = 24 / hoursCount.count;
4397
- const hourWidthPx = steps[hourIndex].width.px / hoursCount.count;
4398
- for (let i = 0, len = hoursCount.count; i < len; i++) {
4399
- const hour = i * hourStep;
4400
- let index = hourIndex;
4401
- if (hourIndex > 0) {
4402
- index = hourIndex - Math.floor(hourIndex / 24) * 24;
4403
- }
4404
- let textWidth = 0;
4405
- if (typeof this.root.state.options.calendar.hour.widths[index] !== 'undefined') {
4406
- textWidth = this.root.state.options.calendar.hour.widths[index][hoursCount.type];
4407
- }
4408
- let x = steps[hourIndex].offset.px + hourWidthPx * i;
4409
- hours.children.push({
4410
- index: hourIndex,
4411
- key: 'h' + i,
4412
- x,
4413
- y: this.root.state.options.calendar.day.height + this.root.state.options.calendar.month.height,
4414
- width: hourWidthPx,
4415
- textWidth,
4416
- height: this.root.state.options.calendar.hour.height,
4417
- label: this.root.state.options.calendar.hour.formatted[hoursCount.type][hour]
4418
- });
4419
- }
4420
- allHours.push(hours);
4421
- }
4422
- return allHours;
4423
- },
4424
- /**
4425
- * Generate days
4426
- *
4427
- * @returns {array}
4428
- */
4429
5264
  generateDays() {
4430
5265
  let days = [];
4431
- if (!this.root.state.options.calendar.day.display) {
5266
+ if (!(this.viewMode === 'day' || this.viewMode === 'week')) {
4432
5267
  return days;
4433
5268
  }
4434
5269
  const daysCount = this.howManyDaysFit();
@@ -4440,23 +5275,26 @@ var CalendarRow_component = normalizeComponent(
4440
5275
  const dayStep = Math.ceil(steps.length / daysCount.count);
4441
5276
  for (let dayIndex = 0, len = steps.length; dayIndex < len; dayIndex += dayStep) {
4442
5277
  let dayWidthPx = 0;
4443
- // day could be shorter (daylight saving time) so join widths and divide
5278
+
5279
+ // Calculate total width for this day group
4444
5280
  for (let currentStep = 0; currentStep < dayStep; currentStep++) {
4445
5281
  if (typeof steps[dayIndex + currentStep] !== 'undefined') {
4446
5282
  dayWidthPx += steps[dayIndex + currentStep].width.px;
4447
5283
  }
4448
5284
  }
4449
- const date = dayjs_min_default()(steps[dayIndex].time);
5285
+ const date = this.dayjsInstance(steps[dayIndex].time);
4450
5286
  let textWidth = 0;
4451
5287
  if (typeof this.root.state.options.calendar.day.widths[dayIndex] !== 'undefined') {
4452
5288
  textWidth = this.root.state.options.calendar.day.widths[dayIndex][daysCount.type];
4453
5289
  }
4454
- let x = steps[dayIndex].offset.px;
5290
+
5291
+ // Use exact step offset for perfect alignment with grid lines
5292
+ let x = Math.round(steps[dayIndex].offset.px); // Round to ensure exact pixel alignment
4455
5293
  days.push({
4456
5294
  index: dayIndex,
4457
5295
  key: steps[dayIndex].time + 'd',
4458
5296
  x,
4459
- y: this.root.state.options.calendar.month.height,
5297
+ y: this.getYPosition('day'),
4460
5298
  width: dayWidthPx,
4461
5299
  textWidth,
4462
5300
  height: this.root.state.options.calendar.day.height,
@@ -4468,11 +5306,99 @@ var CalendarRow_component = normalizeComponent(
4468
5306
  children: [item]
4469
5307
  }));
4470
5308
  },
4471
- /**
4472
- * Generate months
4473
- *
4474
- * @returns {array}
4475
- */
5309
+ generateWeeks() {
5310
+ let weeks = [];
5311
+ if (this.viewMode !== 'week') {
5312
+ return weeks;
5313
+ }
5314
+ const steps = this.root.state.options.times.steps;
5315
+ let currentWeek = null;
5316
+ let weekStartX = 0;
5317
+ let weekWidth = 0;
5318
+ let weekStartDate = null;
5319
+ let weekEndDate = null;
5320
+ for (let i = 0; i < steps.length; i++) {
5321
+ try {
5322
+ const stepDate = this.dayjsInstance(steps[i].time);
5323
+ const weekNumber = stepDate.week();
5324
+ const year = stepDate.year();
5325
+ const weekKey = `${year}-W${weekNumber}`;
5326
+ if (weekKey !== currentWeek) {
5327
+ // Save previous week
5328
+ if (currentWeek !== null) {
5329
+ // Format the label as "Month Day-Day"
5330
+ const startMonth = weekStartDate.format('MMMM');
5331
+ const startDay = weekStartDate.date();
5332
+ const endDay = weekEndDate.date();
5333
+ let label = `${startMonth} ${startDay}`;
5334
+
5335
+ // If the week spans multiple months, show both months
5336
+ if (weekStartDate.month() !== weekEndDate.month()) {
5337
+ const endMonth = weekEndDate.format('MMMM');
5338
+ label = `${startMonth} ${startDay} - ${endMonth} ${endDay}`;
5339
+ } else if (startDay !== endDay) {
5340
+ label = `${startMonth} ${startDay}-${endDay}`;
5341
+ }
5342
+ weeks.push({
5343
+ key: currentWeek,
5344
+ x: weekStartX,
5345
+ // Use exact step offset for perfect alignment
5346
+ y: this.getYPosition('week'),
5347
+ width: weekWidth,
5348
+ textWidth: 50,
5349
+ height: this.root.state.options.calendar.week && this.root.state.options.calendar.week.height || 25,
5350
+ label: label
5351
+ });
5352
+ }
5353
+
5354
+ // Start new week - use exact step offset
5355
+ currentWeek = weekKey;
5356
+ weekStartX = Math.round(steps[i].offset.px); // Round to ensure exact pixel alignment
5357
+ weekWidth = steps[i].width.px;
5358
+ weekStartDate = stepDate.clone().startOf('week');
5359
+ weekEndDate = stepDate.clone().endOf('week');
5360
+ } else {
5361
+ // Same week, accumulate width and update end date
5362
+ weekWidth += steps[i].width.px;
5363
+ weekEndDate = stepDate.clone().endOf('week');
5364
+ }
5365
+ } catch (error) {
5366
+ console.error('Error processing week:', error);
5367
+ continue;
5368
+ }
5369
+ }
5370
+
5371
+ // Add the last week
5372
+ if (currentWeek !== null) {
5373
+ // Format the label as "Month Day-Day"
5374
+ const startMonth = weekStartDate.format('MMMM');
5375
+ const startDay = weekStartDate.date();
5376
+ const endDay = weekEndDate.date();
5377
+ let label = `${startMonth} ${startDay}`;
5378
+
5379
+ // If the week spans multiple months, show both months
5380
+ if (weekStartDate.month() !== weekEndDate.month()) {
5381
+ const endMonth = weekEndDate.format('MMMM');
5382
+ label = `${startMonth} ${startDay} - ${endMonth} ${endDay}`;
5383
+ } else if (startDay !== endDay) {
5384
+ label = `${startMonth} ${startDay}-${endDay}`;
5385
+ }
5386
+ weeks.push({
5387
+ key: currentWeek,
5388
+ x: weekStartX,
5389
+ // Use exact step offset for perfect alignment
5390
+ y: this.getYPosition('week'),
5391
+ width: weekWidth,
5392
+ textWidth: 60,
5393
+ height: this.root.state.options.calendar.week && this.root.state.options.calendar.week.height || 25,
5394
+ label: label
5395
+ });
5396
+ }
5397
+ return weeks.map(week => ({
5398
+ key: week.key,
5399
+ children: [week]
5400
+ }));
5401
+ },
4476
5402
  generateMonths() {
4477
5403
  let months = [];
4478
5404
  if (!this.root.state.options.calendar.month.display) {
@@ -4515,7 +5441,8 @@ var CalendarRow_component = normalizeComponent(
4515
5441
  if (typeof this.root.state.options.calendar.month.widths[monthIndex] !== 'undefined') {
4516
5442
  textWidth = this.root.state.options.calendar.month.widths[monthIndex][choosenFormatName];
4517
5443
  }
4518
- let x = monthOffset;
5444
+ // Use exact step offset for perfect alignment with grid lines
5445
+ let x = Math.round(monthOffset); // Round to ensure exact pixel alignment
4519
5446
  months.push({
4520
5447
  index: monthIndex,
4521
5448
  key: monthIndex + 'm',
@@ -4537,47 +5464,230 @@ var CalendarRow_component = normalizeComponent(
4537
5464
  children: [item]
4538
5465
  }));
4539
5466
  },
4540
- /**
4541
- * Sum all calendar rows height and return result
4542
- *
4543
- * @returns {int}
4544
- */
4545
- calculateCalendarDimensions({
4546
- hours,
4547
- days,
4548
- months
4549
- }) {
4550
- let height = 0;
4551
- if (this.root.state.options.calendar.hour.display && hours.length > 0) {
4552
- height += this.root.state.options.calendar.hour.height;
5467
+ generateQuarters() {
5468
+ let quarters = [];
5469
+ if (this.viewMode !== 'quarter') {
5470
+ return quarters;
4553
5471
  }
4554
- if (this.root.state.options.calendar.day.display && days.length > 0) {
4555
- height += this.root.state.options.calendar.day.height;
5472
+ const steps = this.root.state.options.times.steps;
5473
+
5474
+ // Debug: Log quarter generation info
5475
+ console.log('Quarter Generation Debug:', {
5476
+ stepsCount: steps.length,
5477
+ firstStepTime: this.dayjsInstance(steps[0] && steps[0].time).format('YYYY-MM-DD'),
5478
+ lastStepTime: this.dayjsInstance(steps[steps.length - 1] && steps[steps.length - 1].time).format('YYYY-MM-DD'),
5479
+ firstStepQuarter: this.dayjsInstance(steps[0] && steps[0].time).quarter(),
5480
+ lastStepQuarter: this.dayjsInstance(steps[steps.length - 1] && steps[steps.length - 1].time).quarter()
5481
+ });
5482
+ let currentQuarter = null;
5483
+ let quarterStartX = 0;
5484
+ let quarterWidth = 0;
5485
+ let quarterStartDate = null;
5486
+ let quarterEndDate = null;
5487
+ for (let i = 0; i < steps.length; i++) {
5488
+ try {
5489
+ // Use UTC to avoid locale/timezone issues
5490
+ const stepDate = this.dayjsInstance(steps[i].time);
5491
+ const quarter = stepDate.quarter();
5492
+ const year = stepDate.year();
5493
+ const quarterKey = `Q${quarter}-${year}`;
5494
+ console.log(`Step ${i}:`, {
5495
+ time: stepDate.format('YYYY-MM-DD'),
5496
+ quarter: quarter,
5497
+ year: year,
5498
+ quarterKey: quarterKey,
5499
+ currentQuarter: currentQuarter
5500
+ });
5501
+ if (quarterKey !== currentQuarter) {
5502
+ // Save previous quarter
5503
+ if (currentQuarter !== null) {
5504
+ // Format the label as "Month – Month 'Year"
5505
+ const startMonth = quarterStartDate.format('MMMM');
5506
+ const endMonth = quarterEndDate.format('MMMM');
5507
+ const shortYear = quarterEndDate.format("YY");
5508
+ const label = `${startMonth} – ${endMonth} '${shortYear}`;
5509
+ quarters.push({
5510
+ key: currentQuarter,
5511
+ x: quarterStartX,
5512
+ // Use exact step offset for perfect alignment
5513
+ y: this.getYPosition('quarter'),
5514
+ width: quarterWidth,
5515
+ textWidth: 50,
5516
+ height: this.root.state.options.calendar.quarter && this.root.state.options.calendar.quarter.height || 30,
5517
+ label: label
5518
+ });
5519
+ }
5520
+
5521
+ // Start new quarter
5522
+ currentQuarter = quarterKey;
5523
+ quarterStartX = Math.round(steps[i].offset.px); // Round to ensure exact pixel alignment
5524
+ quarterWidth = steps[i].width.px;
5525
+ quarterStartDate = stepDate.clone().startOf('quarter');
5526
+ quarterEndDate = stepDate.clone().endOf('quarter');
5527
+ } else {
5528
+ // Same quarter, accumulate width and update end date
5529
+ quarterWidth += steps[i].width.px;
5530
+ quarterEndDate = stepDate.clone().endOf('quarter');
5531
+ }
5532
+ } catch (error) {
5533
+ console.error('Error processing quarter:', error);
5534
+ continue;
5535
+ }
4556
5536
  }
4557
- if (this.root.state.options.calendar.month.display && months.length > 0) {
4558
- height += this.root.state.options.calendar.month.height;
5537
+
5538
+ // Add the last quarter
5539
+ if (currentQuarter !== null) {
5540
+ // Format the label as "Month – Month 'Year"
5541
+ const startMonth = quarterStartDate.format('MMMM');
5542
+ const endMonth = quarterEndDate.format('MMMM');
5543
+ const shortYear = quarterEndDate.format("YY");
5544
+ const label = `${startMonth} – ${endMonth} '${shortYear}`;
5545
+ quarters.push({
5546
+ key: currentQuarter,
5547
+ x: quarterStartX,
5548
+ // Use exact step offset for perfect alignment
5549
+ y: this.getYPosition('quarter'),
5550
+ width: quarterWidth,
5551
+ textWidth: 60,
5552
+ height: this.root.state.options.calendar.quarter && this.root.state.options.calendar.quarter.height || 30,
5553
+ label: label
5554
+ });
4559
5555
  }
4560
- this.root.state.options.calendar.height = height;
4561
- }
4562
- },
4563
- computed: {
4564
- dates() {
4565
- const hours = this.generateHours();
4566
- const days = this.generateDays();
4567
- const months = this.generateMonths();
4568
- const allDates = {
4569
- hours,
4570
- days,
4571
- months
5556
+ return quarters.map(quarter => ({
5557
+ key: quarter.key,
5558
+ children: [quarter]
5559
+ }));
5560
+ },
5561
+ getYPosition(type) {
5562
+ let y = 0;
5563
+ switch (type) {
5564
+ case 'quarter':
5565
+ return 0;
5566
+ case 'month':
5567
+ // Put month row below quarter if in quarterly view
5568
+ return this.viewMode === 'quarter' ? this.root.state.options.calendar.quarter && this.root.state.options.calendar.quarter.height || 30 : 0;
5569
+ case 'week':
5570
+ // Put week row below month and quarter if applicable
5571
+
5572
+ if (this.viewMode === 'quarter') {
5573
+ y += this.root.state.options.calendar.quarter && this.root.state.options.calendar.quarter.height || 30;
5574
+ }
5575
+ if (this.viewMode === 'month' || this.viewMode === 'quarter') {
5576
+ y += this.root.state.options.calendar.month.height;
5577
+ }
5578
+ return y;
5579
+ case 'day':
5580
+ // Put day below week if applicable
5581
+ y = 0;
5582
+ if (this.viewMode === 'quarter') {
5583
+ y += this.root.state.options.calendar.quarter && this.root.state.options.calendar.quarter.height || 30;
5584
+ }
5585
+ if (this.viewMode === 'month' || this.viewMode === 'quarter') {
5586
+ y += this.root.state.options.calendar.month.height;
5587
+ }
5588
+ if (this.viewMode === 'week') {
5589
+ y += this.root.state.options.calendar.week && this.root.state.options.calendar.week.height || 25;
5590
+ }
5591
+ return y;
5592
+ case 'hour':
5593
+ // Put hour row below day if applicable
5594
+ y = 0;
5595
+ if (this.viewMode === 'quarter') {
5596
+ y += this.root.state.options.calendar.quarter && this.root.state.options.calendar.quarter.height || 30;
5597
+ }
5598
+ if (this.viewMode === 'month' || this.viewMode === 'quarter') {
5599
+ y += this.root.state.options.calendar.month.height;
5600
+ }
5601
+ if (this.viewMode === 'week') {
5602
+ y += this.root.state.options.calendar.week && this.root.state.options.calendar.week.height || 25;
5603
+ }
5604
+ if (this.viewMode === 'day') {
5605
+ y += this.root.state.options.calendar.day.height;
5606
+ }
5607
+ return y;
5608
+ default:
5609
+ return 0;
5610
+ }
5611
+ },
5612
+ howManyHoursFit(dayIndex) {
5613
+ const stroke = 1;
5614
+ const additionalSpace = stroke + 2;
5615
+ let fullCellWidth = this.root.state.options.times.steps[dayIndex].width.px;
5616
+ let formatNames = Object.keys(this.root.state.options.calendar.hour.format);
5617
+ for (let hours = 24; hours > 1; hours = Math.ceil(hours / 2)) {
5618
+ for (let formatName of formatNames) {
5619
+ if ((this.root.state.options.calendar.hour.maxWidths[formatName] + additionalSpace) * hours <= fullCellWidth && hours > 1) {
5620
+ return {
5621
+ count: hours,
5622
+ type: formatName
5623
+ };
5624
+ }
5625
+ }
5626
+ }
5627
+ return {
5628
+ count: 0,
5629
+ type: ''
5630
+ };
5631
+ },
5632
+ howManyDaysFit() {
5633
+ const stroke = 1;
5634
+ const additionalSpace = stroke + 2;
5635
+ let fullWidth = this.root.state.options.width;
5636
+ let formatNames = Object.keys(this.root.state.options.calendar.day.format);
5637
+ for (let days = this.root.state.options.times.steps.length; days > 1; days = Math.ceil(days / 2)) {
5638
+ for (let formatName of formatNames) {
5639
+ if ((this.root.state.options.calendar.day.maxWidths[formatName] + additionalSpace) * days <= fullWidth && days > 1) {
5640
+ return {
5641
+ count: days,
5642
+ type: formatName
5643
+ };
5644
+ }
5645
+ }
5646
+ }
5647
+ return {
5648
+ count: 0,
5649
+ type: ''
5650
+ };
5651
+ },
5652
+ howManyMonthsFit() {
5653
+ const stroke = 1;
5654
+ const additionalSpace = stroke + 2;
5655
+ let fullWidth = this.root.state.options.width;
5656
+ let formatNames = Object.keys(this.root.state.options.calendar.month.format);
5657
+ let currentMonth = dayjs_min_default()(this.root.state.options.times.firstTime);
5658
+ let previousMonth = currentMonth.clone();
5659
+ const lastTime = this.root.state.options.times.lastTime;
5660
+ let monthsCount = this.root.monthsCount(this.root.state.options.times.firstTime, this.root.state.options.times.lastTime);
5661
+ if (monthsCount === 1) {
5662
+ for (let formatName of formatNames) {
5663
+ if (this.root.state.options.calendar.month.maxWidths[formatName] + additionalSpace <= fullWidth) {
5664
+ return {
5665
+ count: 1,
5666
+ type: formatName
5667
+ };
5668
+ }
5669
+ }
5670
+ }
5671
+ for (let months = monthsCount; months > 1; months = Math.ceil(months / 2)) {
5672
+ for (let formatName of formatNames) {
5673
+ if ((this.root.state.options.calendar.month.maxWidths[formatName] + additionalSpace) * months <= fullWidth && months > 1) {
5674
+ return {
5675
+ count: months,
5676
+ type: formatName
5677
+ };
5678
+ }
5679
+ }
5680
+ }
5681
+ return {
5682
+ count: 0,
5683
+ type: formatNames[0]
4572
5684
  };
4573
- this.calculateCalendarDimensions(allDates);
4574
- return allDates;
4575
5685
  }
4576
5686
  }
4577
5687
  });
4578
- ;// ./src/components/components/Calendar/Calendar.vue?vue&type=script&lang=js
5688
+ ;// ./src/components/Calendar/Calendar.vue?vue&type=script&lang=js
4579
5689
  /* harmony default export */ var Calendar_Calendarvue_type_script_lang_js = (Calendarvue_type_script_lang_js);
4580
- ;// ./src/components/components/Calendar/Calendar.vue
5690
+ ;// ./src/components/Calendar/Calendar.vue
4581
5691
 
4582
5692
 
4583
5693
 
@@ -4587,8 +5697,8 @@ var CalendarRow_component = normalizeComponent(
4587
5697
  ;
4588
5698
  var Calendar_component = normalizeComponent(
4589
5699
  Calendar_Calendarvue_type_script_lang_js,
4590
- Calendarvue_type_template_id_19446f31_render,
4591
- Calendarvue_type_template_id_19446f31_staticRenderFns,
5700
+ Calendarvue_type_template_id_c22056b8_render,
5701
+ Calendarvue_type_template_id_c22056b8_staticRenderFns,
4592
5702
  false,
4593
5703
  null,
4594
5704
  null,
@@ -4597,8 +5707,8 @@ var Calendar_component = normalizeComponent(
4597
5707
  )
4598
5708
 
4599
5709
  /* harmony default export */ var Calendar = (Calendar_component.exports);
4600
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/DependencyLines.vue?vue&type=template&id=eddd62e6
4601
- var DependencyLinesvue_type_template_id_eddd62e6_render = function render() {
5710
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/DependencyLines.vue?vue&type=template&id=bc574838
5711
+ var DependencyLinesvue_type_template_id_bc574838_render = function render() {
4602
5712
  var _vm = this,
4603
5713
  _c = _vm._self._c;
4604
5714
  return _c('svg', {
@@ -4635,9 +5745,9 @@ var DependencyLinesvue_type_template_id_eddd62e6_render = function render() {
4635
5745
  }), 0);
4636
5746
  }), 0);
4637
5747
  };
4638
- var DependencyLinesvue_type_template_id_eddd62e6_staticRenderFns = [];
5748
+ var DependencyLinesvue_type_template_id_bc574838_staticRenderFns = [];
4639
5749
 
4640
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/DependencyLines.vue?vue&type=script&lang=js
5750
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/DependencyLines.vue?vue&type=script&lang=js
4641
5751
 
4642
5752
 
4643
5753
 
@@ -4718,9 +5828,9 @@ var DependencyLinesvue_type_template_id_eddd62e6_staticRenderFns = [];
4718
5828
  }
4719
5829
  }
4720
5830
  });
4721
- ;// ./src/components/components/Chart/DependencyLines.vue?vue&type=script&lang=js
5831
+ ;// ./src/components/Chart/DependencyLines.vue?vue&type=script&lang=js
4722
5832
  /* harmony default export */ var Chart_DependencyLinesvue_type_script_lang_js = (DependencyLinesvue_type_script_lang_js);
4723
- ;// ./src/components/components/Chart/DependencyLines.vue
5833
+ ;// ./src/components/Chart/DependencyLines.vue
4724
5834
 
4725
5835
 
4726
5836
 
@@ -4730,8 +5840,8 @@ var DependencyLinesvue_type_template_id_eddd62e6_staticRenderFns = [];
4730
5840
  ;
4731
5841
  var DependencyLines_component = normalizeComponent(
4732
5842
  Chart_DependencyLinesvue_type_script_lang_js,
4733
- DependencyLinesvue_type_template_id_eddd62e6_render,
4734
- DependencyLinesvue_type_template_id_eddd62e6_staticRenderFns,
5843
+ DependencyLinesvue_type_template_id_bc574838_render,
5844
+ DependencyLinesvue_type_template_id_bc574838_staticRenderFns,
4735
5845
  false,
4736
5846
  null,
4737
5847
  null,
@@ -4740,8 +5850,8 @@ var DependencyLines_component = normalizeComponent(
4740
5850
  )
4741
5851
 
4742
5852
  /* harmony default export */ var DependencyLines = (DependencyLines_component.exports);
4743
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/Row/Task.vue?vue&type=template&id=2afb5353
4744
- var Taskvue_type_template_id_2afb5353_render = function render() {
5853
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Task.vue?vue&type=template&id=208a9baa
5854
+ var Taskvue_type_template_id_208a9baa_render = function render() {
4745
5855
  var _vm = this,
4746
5856
  _c = _vm._self._c;
4747
5857
  return _c('g', {
@@ -4850,10 +5960,10 @@ var Taskvue_type_template_id_2afb5353_render = function render() {
4850
5960
  }
4851
5961
  }) : _vm._e()], 1);
4852
5962
  };
4853
- var Taskvue_type_template_id_2afb5353_staticRenderFns = [];
5963
+ var Taskvue_type_template_id_208a9baa_staticRenderFns = [];
4854
5964
 
4855
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/Text.vue?vue&type=template&id=d1c1415a
4856
- var Textvue_type_template_id_d1c1415a_render = function render() {
5965
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Text.vue?vue&type=template&id=634f40aa
5966
+ var Textvue_type_template_id_634f40aa_render = function render() {
4857
5967
  var _vm = this,
4858
5968
  _c = _vm._self._c;
4859
5969
  return _c('svg', {
@@ -4901,9 +6011,9 @@ var Textvue_type_template_id_d1c1415a_render = function render() {
4901
6011
  }
4902
6012
  }) : _vm._e()])])]);
4903
6013
  };
4904
- var Textvue_type_template_id_d1c1415a_staticRenderFns = [];
6014
+ var Textvue_type_template_id_634f40aa_staticRenderFns = [];
4905
6015
 
4906
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/Text.vue?vue&type=script&lang=js
6016
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Text.vue?vue&type=script&lang=js
4907
6017
  /* harmony default export */ var Textvue_type_script_lang_js = ({
4908
6018
  name: 'ChartText',
4909
6019
  inject: ['root'],
@@ -4965,9 +6075,9 @@ var Textvue_type_template_id_d1c1415a_staticRenderFns = [];
4965
6075
  }
4966
6076
  }
4967
6077
  });
4968
- ;// ./src/components/components/Chart/Text.vue?vue&type=script&lang=js
6078
+ ;// ./src/components/Chart/Text.vue?vue&type=script&lang=js
4969
6079
  /* harmony default export */ var Chart_Textvue_type_script_lang_js = (Textvue_type_script_lang_js);
4970
- ;// ./src/components/components/Chart/Text.vue
6080
+ ;// ./src/components/Chart/Text.vue
4971
6081
 
4972
6082
 
4973
6083
 
@@ -4977,8 +6087,8 @@ var Textvue_type_template_id_d1c1415a_staticRenderFns = [];
4977
6087
  ;
4978
6088
  var Text_component = normalizeComponent(
4979
6089
  Chart_Textvue_type_script_lang_js,
4980
- Textvue_type_template_id_d1c1415a_render,
4981
- Textvue_type_template_id_d1c1415a_staticRenderFns,
6090
+ Textvue_type_template_id_634f40aa_render,
6091
+ Textvue_type_template_id_634f40aa_staticRenderFns,
4982
6092
  false,
4983
6093
  null,
4984
6094
  null,
@@ -4987,8 +6097,8 @@ var Text_component = normalizeComponent(
4987
6097
  )
4988
6098
 
4989
6099
  /* harmony default export */ var Text = (Text_component.exports);
4990
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/ProgressBar.vue?vue&type=template&id=00ca07fa
4991
- var ProgressBarvue_type_template_id_00ca07fa_render = function render() {
6100
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/ProgressBar.vue?vue&type=template&id=bc869ae8
6101
+ var ProgressBarvue_type_template_id_bc869ae8_render = function render() {
4992
6102
  var _vm = this,
4993
6103
  _c = _vm._self._c;
4994
6104
  return _c('g', {
@@ -5052,9 +6162,9 @@ var ProgressBarvue_type_template_id_00ca07fa_render = function render() {
5052
6162
  }
5053
6163
  })]) : _vm._e()]);
5054
6164
  };
5055
- var ProgressBarvue_type_template_id_00ca07fa_staticRenderFns = [];
6165
+ var ProgressBarvue_type_template_id_bc869ae8_staticRenderFns = [];
5056
6166
 
5057
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/ProgressBar.vue?vue&type=script&lang=js
6167
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/ProgressBar.vue?vue&type=script&lang=js
5058
6168
  /* harmony default export */ var ProgressBarvue_type_script_lang_js = ({
5059
6169
  name: 'ProgressBar',
5060
6170
  inject: ['root'],
@@ -5101,9 +6211,9 @@ var ProgressBarvue_type_template_id_00ca07fa_staticRenderFns = [];
5101
6211
  }
5102
6212
  }
5103
6213
  });
5104
- ;// ./src/components/components/Chart/ProgressBar.vue?vue&type=script&lang=js
6214
+ ;// ./src/components/Chart/ProgressBar.vue?vue&type=script&lang=js
5105
6215
  /* harmony default export */ var Chart_ProgressBarvue_type_script_lang_js = (ProgressBarvue_type_script_lang_js);
5106
- ;// ./src/components/components/Chart/ProgressBar.vue
6216
+ ;// ./src/components/Chart/ProgressBar.vue
5107
6217
 
5108
6218
 
5109
6219
 
@@ -5113,8 +6223,8 @@ var ProgressBarvue_type_template_id_00ca07fa_staticRenderFns = [];
5113
6223
  ;
5114
6224
  var ProgressBar_component = normalizeComponent(
5115
6225
  Chart_ProgressBarvue_type_script_lang_js,
5116
- ProgressBarvue_type_template_id_00ca07fa_render,
5117
- ProgressBarvue_type_template_id_00ca07fa_staticRenderFns,
6226
+ ProgressBarvue_type_template_id_bc869ae8_render,
6227
+ ProgressBarvue_type_template_id_bc869ae8_staticRenderFns,
5118
6228
  false,
5119
6229
  null,
5120
6230
  null,
@@ -5123,7 +6233,7 @@ var ProgressBar_component = normalizeComponent(
5123
6233
  )
5124
6234
 
5125
6235
  /* harmony default export */ var ProgressBar = (ProgressBar_component.exports);
5126
- ;// ./src/components/components/Chart/Row/Task.mixin.js
6236
+ ;// ./src/components/Chart/Row/Task.mixin.js
5127
6237
  /* harmony default export */ var Task_mixin = ({
5128
6238
  computed: {
5129
6239
  /**
@@ -5150,7 +6260,8 @@ var ProgressBar_component = normalizeComponent(
5150
6260
  */
5151
6261
  displayExpander() {
5152
6262
  const expander = this.root.state.options.chart.expander;
5153
- return expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display;
6263
+ const hasChildren = this.task.allChildren && this.task.allChildren.length > 0;
6264
+ return (expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display) && hasChildren;
5154
6265
  }
5155
6266
  },
5156
6267
  methods: {
@@ -5170,7 +6281,7 @@ var ProgressBar_component = normalizeComponent(
5170
6281
  }
5171
6282
  }
5172
6283
  });
5173
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/Row/Task.vue?vue&type=script&lang=js
6284
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Task.vue?vue&type=script&lang=js
5174
6285
 
5175
6286
 
5176
6287
 
@@ -5198,19 +6309,593 @@ var ProgressBar_component = normalizeComponent(
5198
6309
  return 'gantt-elastic__task-clip-path-' + this.task.id;
5199
6310
  },
5200
6311
  /**
5201
- * Get points
6312
+ * Get points
6313
+ *
6314
+ * @returns {string}
6315
+ */
6316
+ getPoints() {
6317
+ const task = this.task;
6318
+ return `0,0 ${task.width},0 ${task.width},${task.height} 0,${task.height}`;
6319
+ }
6320
+ }
6321
+ });
6322
+ ;// ./src/components/Chart/Row/Task.vue?vue&type=script&lang=js
6323
+ /* harmony default export */ var Row_Taskvue_type_script_lang_js = (Taskvue_type_script_lang_js);
6324
+ ;// ./src/components/Chart/Row/Task.vue
6325
+
6326
+
6327
+
6328
+
6329
+
6330
+ /* normalize component */
6331
+ ;
6332
+ var Task_component = normalizeComponent(
6333
+ Row_Taskvue_type_script_lang_js,
6334
+ Taskvue_type_template_id_208a9baa_render,
6335
+ Taskvue_type_template_id_208a9baa_staticRenderFns,
6336
+ false,
6337
+ null,
6338
+ null,
6339
+ null
6340
+
6341
+ )
6342
+
6343
+ /* harmony default export */ var Task = (Task_component.exports);
6344
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Milestone.vue?vue&type=template&id=edd49e02
6345
+ var Milestonevue_type_template_id_edd49e02_render = function render() {
6346
+ var _vm = this,
6347
+ _c = _vm._self._c;
6348
+ return _c('g', {
6349
+ staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-milestone-wrapper",
6350
+ style: {
6351
+ ..._vm.root.style['chart-row-bar-wrapper'],
6352
+ ..._vm.root.style['chart-row-milestone-wrapper'],
6353
+ ..._vm.task.style['chart-row-bar-wrapper']
6354
+ }
6355
+ }, [_vm.displayExpander ? _c('foreignObject', {
6356
+ staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--milestone",
6357
+ style: {
6358
+ ..._vm.root.style['chart-expander'],
6359
+ ..._vm.root.style['chart-expander--milestone'],
6360
+ ..._vm.task.style['chart-expander']
6361
+ },
6362
+ attrs: {
6363
+ "x": _vm.task.x - _vm.root.state.options.chart.expander.offset - _vm.root.state.options.chart.expander.size,
6364
+ "y": _vm.task.y + (_vm.root.state.options.row.height - _vm.root.state.options.chart.expander.size) / 2,
6365
+ "width": _vm.root.state.options.chart.expander.size,
6366
+ "height": _vm.root.state.options.chart.expander.size
6367
+ }
6368
+ }, [_c('expander', {
6369
+ attrs: {
6370
+ "tasks": [_vm.task],
6371
+ "options": _vm.root.state.options.chart.expander,
6372
+ "type": "chart"
6373
+ }
6374
+ })], 1) : _vm._e(), _c('svg', {
6375
+ staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-milestone",
6376
+ style: {
6377
+ ..._vm.root.style['chart-row-bar'],
6378
+ ..._vm.root.style['chart-row-milestone'],
6379
+ ..._vm.task.style['chart-row-bar']
6380
+ },
6381
+ attrs: {
6382
+ "x": _vm.task.x,
6383
+ "y": _vm.task.y,
6384
+ "width": _vm.task.width,
6385
+ "height": _vm.task.height,
6386
+ "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
6387
+ "xmlns": "http://www.w3.org/2000/svg"
6388
+ },
6389
+ on: {
6390
+ "click": function ($event) {
6391
+ return _vm.emitEvent('click', $event);
6392
+ },
6393
+ "mouseenter": function ($event) {
6394
+ return _vm.emitEvent('mouseenter', $event);
6395
+ },
6396
+ "mouseover": function ($event) {
6397
+ return _vm.emitEvent('mouseover', $event);
6398
+ },
6399
+ "mouseout": function ($event) {
6400
+ return _vm.emitEvent('mouseout', $event);
6401
+ },
6402
+ "mousemove": function ($event) {
6403
+ return _vm.emitEvent('mousemove', $event);
6404
+ },
6405
+ "mousedown": function ($event) {
6406
+ return _vm.emitEvent('mousedown', $event);
6407
+ },
6408
+ "mouseup": function ($event) {
6409
+ return _vm.emitEvent('mouseup', $event);
6410
+ },
6411
+ "mousewheel": function ($event) {
6412
+ return _vm.emitEvent('mousewheel', $event);
6413
+ },
6414
+ "touchstart": function ($event) {
6415
+ return _vm.emitEvent('touchstart', $event);
6416
+ },
6417
+ "touchmove": function ($event) {
6418
+ return _vm.emitEvent('touchmove', $event);
6419
+ },
6420
+ "touchend": function ($event) {
6421
+ return _vm.emitEvent('touchend', $event);
6422
+ }
6423
+ }
6424
+ }, [_c('defs', [_c('clipPath', {
6425
+ attrs: {
6426
+ "id": _vm.clipPathId
6427
+ }
6428
+ }, [_c('polygon', {
6429
+ attrs: {
6430
+ "points": _vm.getPoints
6431
+ }
6432
+ })])]), _c('polygon', {
6433
+ staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-milestone-polygon",
6434
+ style: {
6435
+ ..._vm.root.style['chart-row-bar-polygon'],
6436
+ ..._vm.root.style['chart-row-milestone-polygon'],
6437
+ ..._vm.task.style['base'],
6438
+ ..._vm.task.style['chart-row-bar-polygon']
6439
+ },
6440
+ attrs: {
6441
+ "points": _vm.getPoints
6442
+ }
6443
+ }), _c('progress-bar', {
6444
+ attrs: {
6445
+ "task": _vm.task,
6446
+ "clip-path": 'url(#' + _vm.clipPathId + ')'
6447
+ }
6448
+ })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
6449
+ attrs: {
6450
+ "task": _vm.task
6451
+ }
6452
+ }) : _vm._e()], 1);
6453
+ };
6454
+ var Milestonevue_type_template_id_edd49e02_staticRenderFns = [];
6455
+
6456
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Milestone.vue?vue&type=script&lang=js
6457
+
6458
+
6459
+
6460
+
6461
+ /* harmony default export */ var Milestonevue_type_script_lang_js = ({
6462
+ name: 'Milestone',
6463
+ components: {
6464
+ ChartText: Text,
6465
+ ProgressBar: ProgressBar,
6466
+ Expander: Expander
6467
+ },
6468
+ inject: ['root'],
6469
+ props: ['task'],
6470
+ mixins: [Task_mixin],
6471
+ data() {
6472
+ return {};
6473
+ },
6474
+ computed: {
6475
+ /**
6476
+ * Get clip path id
6477
+ *
6478
+ * @returns {string}
6479
+ */
6480
+ clipPathId() {
6481
+ return 'gantt-elastic__milestone-clip-path-' + this.task.id;
6482
+ },
6483
+ /**
6484
+ * Get points
6485
+ *
6486
+ * @returns {string}
6487
+ */
6488
+ getPoints() {
6489
+ const task = this.task;
6490
+ const fifty = task.height / 2;
6491
+ let offset = fifty;
6492
+ if (task.width / 2 - offset < 0) {
6493
+ offset = task.width / 2;
6494
+ }
6495
+ return `0,${fifty}
6496
+ ${offset},0
6497
+ ${task.width - offset},0
6498
+ ${task.width},${fifty}
6499
+ ${task.width - offset},${task.height}
6500
+ ${offset},${task.height}`;
6501
+ }
6502
+ }
6503
+ });
6504
+ ;// ./src/components/Chart/Row/Milestone.vue?vue&type=script&lang=js
6505
+ /* harmony default export */ var Row_Milestonevue_type_script_lang_js = (Milestonevue_type_script_lang_js);
6506
+ ;// ./src/components/Chart/Row/Milestone.vue
6507
+
6508
+
6509
+
6510
+
6511
+
6512
+ /* normalize component */
6513
+ ;
6514
+ var Milestone_component = normalizeComponent(
6515
+ Row_Milestonevue_type_script_lang_js,
6516
+ Milestonevue_type_template_id_edd49e02_render,
6517
+ Milestonevue_type_template_id_edd49e02_staticRenderFns,
6518
+ false,
6519
+ null,
6520
+ null,
6521
+ null
6522
+
6523
+ )
6524
+
6525
+ /* harmony default export */ var Milestone = (Milestone_component.exports);
6526
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Project.vue?vue&type=template&id=760bf767
6527
+ var Projectvue_type_template_id_760bf767_render = function render() {
6528
+ var _vm = this,
6529
+ _c = _vm._self._c;
6530
+ return _c('g', {
6531
+ staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-project-wrapper",
6532
+ style: {
6533
+ ..._vm.root.style['chart-row-bar-wrapper'],
6534
+ ..._vm.root.style['chart-row-project-wrapper'],
6535
+ ..._vm.task.style['chart-row-bar-wrapper']
6536
+ }
6537
+ }, [_vm.displayExpander ? _c('foreignObject', {
6538
+ staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--project",
6539
+ style: {
6540
+ ..._vm.root.style['chart-expander'],
6541
+ ..._vm.root.style['chart-expander--project'],
6542
+ ..._vm.task.style['chart-expander']
6543
+ },
6544
+ attrs: {
6545
+ "x": _vm.task.x - _vm.root.state.options.chart.expander.offset - _vm.root.state.options.chart.expander.size,
6546
+ "y": _vm.task.y + (_vm.root.state.options.row.height - _vm.root.state.options.chart.expander.size) / 2,
6547
+ "width": _vm.root.state.options.chart.expander.size,
6548
+ "height": _vm.root.state.options.chart.expander.size
6549
+ }
6550
+ }, [_c('expander', {
6551
+ attrs: {
6552
+ "tasks": [_vm.task],
6553
+ "options": _vm.root.state.options.chart.expander,
6554
+ "type": "chart"
6555
+ }
6556
+ })], 1) : _vm._e(), _c('svg', {
6557
+ staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-project",
6558
+ style: {
6559
+ ..._vm.root.style['chart-row-bar'],
6560
+ ..._vm.root.style['chart-row-project'],
6561
+ ..._vm.task.style['chart-row-bar']
6562
+ },
6563
+ attrs: {
6564
+ "x": _vm.task.x,
6565
+ "y": _vm.task.y,
6566
+ "width": _vm.task.width,
6567
+ "height": _vm.task.height,
6568
+ "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
6569
+ "xmlns": "http://www.w3.org/2000/svg"
6570
+ },
6571
+ on: {
6572
+ "click": function ($event) {
6573
+ return _vm.emitEvent('click', $event);
6574
+ },
6575
+ "mouseenter": function ($event) {
6576
+ return _vm.emitEvent('mouseenter', $event);
6577
+ },
6578
+ "mouseover": function ($event) {
6579
+ return _vm.emitEvent('mouseover', $event);
6580
+ },
6581
+ "mouseout": function ($event) {
6582
+ return _vm.emitEvent('mouseout', $event);
6583
+ },
6584
+ "mousemove": function ($event) {
6585
+ return _vm.emitEvent('mousemove', $event);
6586
+ },
6587
+ "mousedown": function ($event) {
6588
+ return _vm.emitEvent('mousedown', $event);
6589
+ },
6590
+ "mouseup": function ($event) {
6591
+ return _vm.emitEvent('mouseup', $event);
6592
+ },
6593
+ "mousewheel": function ($event) {
6594
+ return _vm.emitEvent('mousewheel', $event);
6595
+ },
6596
+ "touchstart": function ($event) {
6597
+ return _vm.emitEvent('touchstart', $event);
6598
+ },
6599
+ "touchmove": function ($event) {
6600
+ return _vm.emitEvent('touchmove', $event);
6601
+ },
6602
+ "touchend": function ($event) {
6603
+ return _vm.emitEvent('touchend', $event);
6604
+ }
6605
+ }
6606
+ }, [_c('defs', [_c('clipPath', {
6607
+ attrs: {
6608
+ "id": _vm.clipPathId
6609
+ }
6610
+ }, [_c('path', {
6611
+ attrs: {
6612
+ "d": _vm.getPoints
6613
+ }
6614
+ })])]), _c('path', {
6615
+ staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-project-polygon",
6616
+ style: {
6617
+ ..._vm.root.style['chart-row-bar-polygon'],
6618
+ ..._vm.root.style['chart-row-project-polygon'],
6619
+ ..._vm.task.style['base'],
6620
+ ..._vm.task.style['chart-row-bar-polygon']
6621
+ },
6622
+ attrs: {
6623
+ "d": _vm.getPoints
6624
+ }
6625
+ }), _c('progress-bar', {
6626
+ attrs: {
6627
+ "task": _vm.task,
6628
+ "clip-path": 'url(#' + _vm.clipPathId + ')'
6629
+ }
6630
+ })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
6631
+ attrs: {
6632
+ "task": _vm.task
6633
+ }
6634
+ }) : _vm._e()], 1);
6635
+ };
6636
+ var Projectvue_type_template_id_760bf767_staticRenderFns = [];
6637
+
6638
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Project.vue?vue&type=script&lang=js
6639
+
6640
+
6641
+
6642
+
6643
+ /* harmony default export */ var Projectvue_type_script_lang_js = ({
6644
+ name: 'Project',
6645
+ components: {
6646
+ ChartText: Text,
6647
+ ProgressBar: ProgressBar,
6648
+ Expander: Expander
6649
+ },
6650
+ inject: ['root'],
6651
+ props: ['task'],
6652
+ mixins: [Task_mixin],
6653
+ data() {
6654
+ return {};
6655
+ },
6656
+ computed: {
6657
+ /**
6658
+ * Get clip path id
6659
+ *
6660
+ * @returns {string}
6661
+ */
6662
+ clipPathId() {
6663
+ return 'gantt-elastic__project-clip-path-' + this.task.id;
6664
+ },
6665
+ /**
6666
+ * Get points
6667
+ *
6668
+ * @returns {string}
6669
+ */
6670
+ getPoints() {
6671
+ const task = this.task;
6672
+ const bottom = task.height - task.height / 4;
6673
+ const corner = task.height / 6;
6674
+ const smallCorner = task.height / 8;
6675
+ return `M ${smallCorner},0
6676
+ L ${task.width - smallCorner} 0
6677
+ L ${task.width} ${smallCorner}
6678
+ L ${task.width} ${bottom}
6679
+ L ${task.width - corner} ${task.height}
6680
+ L ${task.width - corner * 2} ${bottom}
6681
+ L ${corner * 2} ${bottom}
6682
+ L ${corner} ${task.height}
6683
+ L 0 ${bottom}
6684
+ L 0 ${smallCorner}
6685
+ Z
6686
+ `;
6687
+ },
6688
+ /**
6689
+ * Should we display expander?
6690
+ *
6691
+ * @returns {boolean}
6692
+ */
6693
+ displayExpander() {
6694
+ const expander = this.root.state.options.chart.expander;
6695
+ const hasChildren = this.task.allChildren && this.task.allChildren.length > 0;
6696
+ return (expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display) && hasChildren;
6697
+ }
6698
+ }
6699
+ });
6700
+ ;// ./src/components/Chart/Row/Project.vue?vue&type=script&lang=js
6701
+ /* harmony default export */ var Row_Projectvue_type_script_lang_js = (Projectvue_type_script_lang_js);
6702
+ ;// ./src/components/Chart/Row/Project.vue
6703
+
6704
+
6705
+
6706
+
6707
+
6708
+ /* normalize component */
6709
+ ;
6710
+ var Project_component = normalizeComponent(
6711
+ Row_Projectvue_type_script_lang_js,
6712
+ Projectvue_type_template_id_760bf767_render,
6713
+ Projectvue_type_template_id_760bf767_staticRenderFns,
6714
+ false,
6715
+ null,
6716
+ null,
6717
+ null
6718
+
6719
+ )
6720
+
6721
+ /* harmony default export */ var Project = (Project_component.exports);
6722
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Epic.vue?vue&type=template&id=a2e89cd8
6723
+ var Epicvue_type_template_id_a2e89cd8_render = function render() {
6724
+ var _vm = this,
6725
+ _c = _vm._self._c;
6726
+ return _c('g', {
6727
+ staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-epic-wrapper",
6728
+ style: {
6729
+ ..._vm.root.style['chart-row-bar-wrapper'],
6730
+ ..._vm.root.style['chart-row-epic-wrapper'],
6731
+ ..._vm.task.style['chart-row-bar-wrapper']
6732
+ }
6733
+ }, [_vm.displayExpander ? _c('foreignObject', {
6734
+ staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--epic",
6735
+ style: {
6736
+ ..._vm.root.style['chart-expander'],
6737
+ ..._vm.root.style['chart-expander--epic'],
6738
+ ..._vm.task.style['chart-expander']
6739
+ },
6740
+ attrs: {
6741
+ "x": _vm.task.x - _vm.root.state.options.chart.expander.offset - _vm.root.state.options.chart.expander.size,
6742
+ "y": _vm.task.y + (_vm.root.state.options.row.height - _vm.root.state.options.chart.expander.size) / 2,
6743
+ "width": _vm.root.state.options.chart.expander.size,
6744
+ "height": _vm.root.state.options.chart.expander.size
6745
+ }
6746
+ }, [_c('expander', {
6747
+ attrs: {
6748
+ "tasks": [_vm.task],
6749
+ "options": _vm.root.state.options.chart.expander,
6750
+ "type": "chart"
6751
+ }
6752
+ })], 1) : _vm._e(), _c('svg', {
6753
+ staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-epic",
6754
+ style: {
6755
+ ..._vm.root.style['chart-row-bar'],
6756
+ ..._vm.root.style['chart-row-epic'],
6757
+ ..._vm.task.style['chart-row-bar']
6758
+ },
6759
+ attrs: {
6760
+ "x": _vm.task.x,
6761
+ "y": _vm.task.y,
6762
+ "width": _vm.task.width,
6763
+ "height": _vm.task.height,
6764
+ "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
6765
+ "xmlns": "http://www.w3.org/2000/svg"
6766
+ },
6767
+ on: {
6768
+ "click": function ($event) {
6769
+ return _vm.emitEvent('click', $event);
6770
+ },
6771
+ "mouseenter": function ($event) {
6772
+ return _vm.emitEvent('mouseenter', $event);
6773
+ },
6774
+ "mouseover": function ($event) {
6775
+ return _vm.emitEvent('mouseover', $event);
6776
+ },
6777
+ "mouseout": function ($event) {
6778
+ return _vm.emitEvent('mouseout', $event);
6779
+ },
6780
+ "mousemove": function ($event) {
6781
+ return _vm.emitEvent('mousemove', $event);
6782
+ },
6783
+ "mousedown": function ($event) {
6784
+ return _vm.emitEvent('mousedown', $event);
6785
+ },
6786
+ "mouseup": function ($event) {
6787
+ return _vm.emitEvent('mouseup', $event);
6788
+ },
6789
+ "mousewheel": function ($event) {
6790
+ return _vm.emitEvent('mousewheel', $event);
6791
+ },
6792
+ "touchstart": function ($event) {
6793
+ return _vm.emitEvent('touchstart', $event);
6794
+ },
6795
+ "touchmove": function ($event) {
6796
+ return _vm.emitEvent('touchmove', $event);
6797
+ },
6798
+ "touchend": function ($event) {
6799
+ return _vm.emitEvent('touchend', $event);
6800
+ }
6801
+ }
6802
+ }, [_c('defs', [_c('clipPath', {
6803
+ attrs: {
6804
+ "id": _vm.clipPathId
6805
+ }
6806
+ }, [_c('path', {
6807
+ attrs: {
6808
+ "d": _vm.getPoints
6809
+ }
6810
+ })])]), _c('path', {
6811
+ staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-epic-polygon",
6812
+ style: {
6813
+ ..._vm.root.style['chart-row-bar-polygon'],
6814
+ ..._vm.root.style['chart-row-epic-polygon'],
6815
+ ..._vm.task.style['base'],
6816
+ ..._vm.task.style['chart-row-bar-polygon']
6817
+ },
6818
+ attrs: {
6819
+ "d": _vm.getPoints
6820
+ }
6821
+ }), _c('progress-bar', {
6822
+ attrs: {
6823
+ "task": _vm.task,
6824
+ "clip-path": 'url(#' + _vm.clipPathId + ')'
6825
+ }
6826
+ })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
6827
+ attrs: {
6828
+ "task": _vm.task
6829
+ }
6830
+ }) : _vm._e()], 1);
6831
+ };
6832
+ var Epicvue_type_template_id_a2e89cd8_staticRenderFns = [];
6833
+
6834
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Epic.vue?vue&type=script&lang=js
6835
+
6836
+
6837
+
6838
+
6839
+ /* harmony default export */ var Epicvue_type_script_lang_js = ({
6840
+ name: 'Epic',
6841
+ components: {
6842
+ ChartText: Text,
6843
+ ProgressBar: ProgressBar,
6844
+ Expander: Expander
6845
+ },
6846
+ inject: ['root'],
6847
+ props: ['task'],
6848
+ mixins: [Task_mixin],
6849
+ data() {
6850
+ return {};
6851
+ },
6852
+ computed: {
6853
+ /**
6854
+ * Get clip path id
6855
+ *
6856
+ * @returns {string}
6857
+ */
6858
+ clipPathId() {
6859
+ return 'gantt-elastic__epic-clip-path-' + this.task.id;
6860
+ },
6861
+ /**
6862
+ * Get points (same shape as project)
6863
+ *
6864
+ * @returns {string}
6865
+ */
6866
+ getPoints() {
6867
+ const task = this.task;
6868
+ const bottom = task.height - task.height / 4;
6869
+ const corner = task.height / 6;
6870
+ const smallCorner = task.height / 8;
6871
+ return `M ${smallCorner},0
6872
+ L ${task.width - smallCorner} 0
6873
+ L ${task.width} ${smallCorner}
6874
+ L ${task.width} ${bottom}
6875
+ L ${task.width - corner} ${task.height}
6876
+ L ${task.width - corner * 2} ${bottom}
6877
+ L ${corner * 2} ${bottom}
6878
+ L ${corner} ${task.height}
6879
+ L 0 ${bottom}
6880
+ L 0 ${smallCorner}
6881
+ Z
6882
+ `;
6883
+ },
6884
+ /**
6885
+ * Should we display expander?
5202
6886
  *
5203
- * @returns {string}
6887
+ * @returns {boolean}
5204
6888
  */
5205
- getPoints() {
5206
- const task = this.task;
5207
- return `0,0 ${task.width},0 ${task.width},${task.height} 0,${task.height}`;
6889
+ displayExpander() {
6890
+ const expander = this.root.state.options.chart.expander;
6891
+ const hasChildren = this.task.allChildren && this.task.allChildren.length > 0;
6892
+ return (expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display) && hasChildren;
5208
6893
  }
5209
6894
  }
5210
6895
  });
5211
- ;// ./src/components/components/Chart/Row/Task.vue?vue&type=script&lang=js
5212
- /* harmony default export */ var Row_Taskvue_type_script_lang_js = (Taskvue_type_script_lang_js);
5213
- ;// ./src/components/components/Chart/Row/Task.vue
6896
+ ;// ./src/components/Chart/Row/Epic.vue?vue&type=script&lang=js
6897
+ /* harmony default export */ var Row_Epicvue_type_script_lang_js = (Epicvue_type_script_lang_js);
6898
+ ;// ./src/components/Chart/Row/Epic.vue
5214
6899
 
5215
6900
 
5216
6901
 
@@ -5218,10 +6903,10 @@ var ProgressBar_component = normalizeComponent(
5218
6903
 
5219
6904
  /* normalize component */
5220
6905
  ;
5221
- var Task_component = normalizeComponent(
5222
- Row_Taskvue_type_script_lang_js,
5223
- Taskvue_type_template_id_2afb5353_render,
5224
- Taskvue_type_template_id_2afb5353_staticRenderFns,
6906
+ var Epic_component = normalizeComponent(
6907
+ Row_Epicvue_type_script_lang_js,
6908
+ Epicvue_type_template_id_a2e89cd8_render,
6909
+ Epicvue_type_template_id_a2e89cd8_staticRenderFns,
5225
6910
  false,
5226
6911
  null,
5227
6912
  null,
@@ -5229,23 +6914,23 @@ var Task_component = normalizeComponent(
5229
6914
 
5230
6915
  )
5231
6916
 
5232
- /* harmony default export */ var Task = (Task_component.exports);
5233
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/Row/Milestone.vue?vue&type=template&id=4f4f8994
5234
- var Milestonevue_type_template_id_4f4f8994_render = function render() {
6917
+ /* harmony default export */ var Epic = (Epic_component.exports);
6918
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Subtask.vue?vue&type=template&id=86599310
6919
+ var Subtaskvue_type_template_id_86599310_render = function render() {
5235
6920
  var _vm = this,
5236
6921
  _c = _vm._self._c;
5237
6922
  return _c('g', {
5238
- staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-milestone-wrapper",
6923
+ staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-subtask-wrapper",
5239
6924
  style: {
5240
6925
  ..._vm.root.style['chart-row-bar-wrapper'],
5241
- ..._vm.root.style['chart-row-milestone-wrapper'],
6926
+ ..._vm.root.style['chart-row-subtask-wrapper'],
5242
6927
  ..._vm.task.style['chart-row-bar-wrapper']
5243
6928
  }
5244
6929
  }, [_vm.displayExpander ? _c('foreignObject', {
5245
- staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--milestone",
6930
+ staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--subtask",
5246
6931
  style: {
5247
6932
  ..._vm.root.style['chart-expander'],
5248
- ..._vm.root.style['chart-expander--milestone'],
6933
+ ..._vm.root.style['chart-expander--subtask'],
5249
6934
  ..._vm.task.style['chart-expander']
5250
6935
  },
5251
6936
  attrs: {
@@ -5261,10 +6946,10 @@ var Milestonevue_type_template_id_4f4f8994_render = function render() {
5261
6946
  "type": "chart"
5262
6947
  }
5263
6948
  })], 1) : _vm._e(), _c('svg', {
5264
- staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-milestone",
6949
+ staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-subtask",
5265
6950
  style: {
5266
6951
  ..._vm.root.style['chart-row-bar'],
5267
- ..._vm.root.style['chart-row-milestone'],
6952
+ ..._vm.root.style['chart-row-subtask'],
5268
6953
  ..._vm.task.style['chart-row-bar']
5269
6954
  },
5270
6955
  attrs: {
@@ -5319,10 +7004,10 @@ var Milestonevue_type_template_id_4f4f8994_render = function render() {
5319
7004
  "points": _vm.getPoints
5320
7005
  }
5321
7006
  })])]), _c('polygon', {
5322
- staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-milestone-polygon",
7007
+ staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-subtask-polygon",
5323
7008
  style: {
5324
7009
  ..._vm.root.style['chart-row-bar-polygon'],
5325
- ..._vm.root.style['chart-row-milestone-polygon'],
7010
+ ..._vm.root.style['chart-row-subtask-polygon'],
5326
7011
  ..._vm.task.style['base'],
5327
7012
  ..._vm.task.style['chart-row-bar-polygon']
5328
7013
  },
@@ -5340,15 +7025,15 @@ var Milestonevue_type_template_id_4f4f8994_render = function render() {
5340
7025
  }
5341
7026
  }) : _vm._e()], 1);
5342
7027
  };
5343
- var Milestonevue_type_template_id_4f4f8994_staticRenderFns = [];
7028
+ var Subtaskvue_type_template_id_86599310_staticRenderFns = [];
5344
7029
 
5345
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/Row/Milestone.vue?vue&type=script&lang=js
7030
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Subtask.vue?vue&type=script&lang=js
5346
7031
 
5347
7032
 
5348
7033
 
5349
7034
 
5350
- /* harmony default export */ var Milestonevue_type_script_lang_js = ({
5351
- name: 'Milestone',
7035
+ /* harmony default export */ var Subtaskvue_type_script_lang_js = ({
7036
+ name: 'Subtask',
5352
7037
  components: {
5353
7038
  ChartText: Text,
5354
7039
  ProgressBar: ProgressBar,
@@ -5367,32 +7052,32 @@ var Milestonevue_type_template_id_4f4f8994_staticRenderFns = [];
5367
7052
  * @returns {string}
5368
7053
  */
5369
7054
  clipPathId() {
5370
- return 'gantt-elastic__milestone-clip-path-' + this.task.id;
7055
+ return 'gantt-elastic__subtask-clip-path-' + this.task.id;
5371
7056
  },
5372
7057
  /**
5373
- * Get points
7058
+ * Get points (simple rectangle for subtasks)
5374
7059
  *
5375
7060
  * @returns {string}
5376
7061
  */
5377
7062
  getPoints() {
5378
7063
  const task = this.task;
5379
- const fifty = task.height / 2;
5380
- let offset = fifty;
5381
- if (task.width / 2 - offset < 0) {
5382
- offset = task.width / 2;
5383
- }
5384
- return `0,${fifty}
5385
- ${offset},0
5386
- ${task.width - offset},0
5387
- ${task.width},${fifty}
5388
- ${task.width - offset},${task.height}
5389
- ${offset},${task.height}`;
7064
+ return `0,0 ${task.width},0 ${task.width},${task.height} 0,${task.height}`;
7065
+ },
7066
+ /**
7067
+ * Should we display expander?
7068
+ *
7069
+ * @returns {boolean}
7070
+ */
7071
+ displayExpander() {
7072
+ const expander = this.root.state.options.chart.expander;
7073
+ const hasChildren = this.task.allChildren && this.task.allChildren.length > 0;
7074
+ return (expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display) && hasChildren;
5390
7075
  }
5391
7076
  }
5392
7077
  });
5393
- ;// ./src/components/components/Chart/Row/Milestone.vue?vue&type=script&lang=js
5394
- /* harmony default export */ var Row_Milestonevue_type_script_lang_js = (Milestonevue_type_script_lang_js);
5395
- ;// ./src/components/components/Chart/Row/Milestone.vue
7078
+ ;// ./src/components/Chart/Row/Subtask.vue?vue&type=script&lang=js
7079
+ /* harmony default export */ var Row_Subtaskvue_type_script_lang_js = (Subtaskvue_type_script_lang_js);
7080
+ ;// ./src/components/Chart/Row/Subtask.vue
5396
7081
 
5397
7082
 
5398
7083
 
@@ -5400,10 +7085,10 @@ var Milestonevue_type_template_id_4f4f8994_staticRenderFns = [];
5400
7085
 
5401
7086
  /* normalize component */
5402
7087
  ;
5403
- var Milestone_component = normalizeComponent(
5404
- Row_Milestonevue_type_script_lang_js,
5405
- Milestonevue_type_template_id_4f4f8994_render,
5406
- Milestonevue_type_template_id_4f4f8994_staticRenderFns,
7088
+ var Subtask_component = normalizeComponent(
7089
+ Row_Subtaskvue_type_script_lang_js,
7090
+ Subtaskvue_type_template_id_86599310_render,
7091
+ Subtaskvue_type_template_id_86599310_staticRenderFns,
5407
7092
  false,
5408
7093
  null,
5409
7094
  null,
@@ -5411,23 +7096,23 @@ var Milestone_component = normalizeComponent(
5411
7096
 
5412
7097
  )
5413
7098
 
5414
- /* harmony default export */ var Milestone = (Milestone_component.exports);
5415
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/Row/Project.vue?vue&type=template&id=38b2a86e
5416
- var Projectvue_type_template_id_38b2a86e_render = function render() {
7099
+ /* harmony default export */ var Subtask = (Subtask_component.exports);
7100
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Story.vue?vue&type=template&id=1f59b61a
7101
+ var Storyvue_type_template_id_1f59b61a_render = function render() {
5417
7102
  var _vm = this,
5418
7103
  _c = _vm._self._c;
5419
7104
  return _c('g', {
5420
- staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-project-wrapper",
7105
+ staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-story-wrapper",
5421
7106
  style: {
5422
7107
  ..._vm.root.style['chart-row-bar-wrapper'],
5423
- ..._vm.root.style['chart-row-project-wrapper'],
7108
+ ..._vm.root.style['chart-row-story-wrapper'],
5424
7109
  ..._vm.task.style['chart-row-bar-wrapper']
5425
7110
  }
5426
7111
  }, [_vm.displayExpander ? _c('foreignObject', {
5427
- staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--project",
7112
+ staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--story",
5428
7113
  style: {
5429
7114
  ..._vm.root.style['chart-expander'],
5430
- ..._vm.root.style['chart-expander--project'],
7115
+ ..._vm.root.style['chart-expander--story'],
5431
7116
  ..._vm.task.style['chart-expander']
5432
7117
  },
5433
7118
  attrs: {
@@ -5443,10 +7128,10 @@ var Projectvue_type_template_id_38b2a86e_render = function render() {
5443
7128
  "type": "chart"
5444
7129
  }
5445
7130
  })], 1) : _vm._e(), _c('svg', {
5446
- staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-project",
7131
+ staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-story",
5447
7132
  style: {
5448
7133
  ..._vm.root.style['chart-row-bar'],
5449
- ..._vm.root.style['chart-row-project'],
7134
+ ..._vm.root.style['chart-row-story'],
5450
7135
  ..._vm.task.style['chart-row-bar']
5451
7136
  },
5452
7137
  attrs: {
@@ -5501,10 +7186,10 @@ var Projectvue_type_template_id_38b2a86e_render = function render() {
5501
7186
  "d": _vm.getPoints
5502
7187
  }
5503
7188
  })])]), _c('path', {
5504
- staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-project-polygon",
7189
+ staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-story-polygon",
5505
7190
  style: {
5506
7191
  ..._vm.root.style['chart-row-bar-polygon'],
5507
- ..._vm.root.style['chart-row-project-polygon'],
7192
+ ..._vm.root.style['chart-row-story-polygon'],
5508
7193
  ..._vm.task.style['base'],
5509
7194
  ..._vm.task.style['chart-row-bar-polygon']
5510
7195
  },
@@ -5522,15 +7207,15 @@ var Projectvue_type_template_id_38b2a86e_render = function render() {
5522
7207
  }
5523
7208
  }) : _vm._e()], 1);
5524
7209
  };
5525
- var Projectvue_type_template_id_38b2a86e_staticRenderFns = [];
7210
+ var Storyvue_type_template_id_1f59b61a_staticRenderFns = [];
5526
7211
 
5527
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/Row/Project.vue?vue&type=script&lang=js
7212
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Story.vue?vue&type=script&lang=js
5528
7213
 
5529
7214
 
5530
7215
 
5531
7216
 
5532
- /* harmony default export */ var Projectvue_type_script_lang_js = ({
5533
- name: 'Project',
7217
+ /* harmony default export */ var Storyvue_type_script_lang_js = ({
7218
+ name: 'Story',
5534
7219
  components: {
5535
7220
  ChartText: Text,
5536
7221
  ProgressBar: ProgressBar,
@@ -5549,30 +7234,26 @@ var Projectvue_type_template_id_38b2a86e_staticRenderFns = [];
5549
7234
  * @returns {string}
5550
7235
  */
5551
7236
  clipPathId() {
5552
- return 'gantt-elastic__project-clip-path-' + this.task.id;
7237
+ return 'gantt-elastic__story-clip-path-' + this.task.id;
5553
7238
  },
5554
7239
  /**
5555
- * Get points
7240
+ * Get points (rounded rectangle for stories)
5556
7241
  *
5557
7242
  * @returns {string}
5558
7243
  */
5559
7244
  getPoints() {
5560
7245
  const task = this.task;
5561
- const bottom = task.height - task.height / 4;
5562
- const corner = task.height / 6;
5563
- const smallCorner = task.height / 8;
5564
- return `M ${smallCorner},0
5565
- L ${task.width - smallCorner} 0
5566
- L ${task.width} ${smallCorner}
5567
- L ${task.width} ${bottom}
5568
- L ${task.width - corner} ${task.height}
5569
- L ${task.width - corner * 2} ${bottom}
5570
- L ${corner * 2} ${bottom}
7246
+ const corner = Math.min(task.height / 4, 8); // Rounded corners
7247
+ return `M ${corner},0
7248
+ L ${task.width - corner} 0
7249
+ Q ${task.width} 0 ${task.width} ${corner}
7250
+ L ${task.width} ${task.height - corner}
7251
+ Q ${task.width} ${task.height} ${task.width - corner} ${task.height}
5571
7252
  L ${corner} ${task.height}
5572
- L 0 ${bottom}
5573
- L 0 ${smallCorner}
5574
- Z
5575
- `;
7253
+ Q 0 ${task.height} 0 ${task.height - corner}
7254
+ L 0 ${corner}
7255
+ Q 0 0 ${corner} 0
7256
+ Z`;
5576
7257
  },
5577
7258
  /**
5578
7259
  * Should we display expander?
@@ -5581,13 +7262,14 @@ var Projectvue_type_template_id_38b2a86e_staticRenderFns = [];
5581
7262
  */
5582
7263
  displayExpander() {
5583
7264
  const expander = this.root.state.options.chart.expander;
5584
- return expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display;
7265
+ const hasChildren = this.task.allChildren && this.task.allChildren.length > 0;
7266
+ return (expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display) && hasChildren;
5585
7267
  }
5586
7268
  }
5587
7269
  });
5588
- ;// ./src/components/components/Chart/Row/Project.vue?vue&type=script&lang=js
5589
- /* harmony default export */ var Row_Projectvue_type_script_lang_js = (Projectvue_type_script_lang_js);
5590
- ;// ./src/components/components/Chart/Row/Project.vue
7270
+ ;// ./src/components/Chart/Row/Story.vue?vue&type=script&lang=js
7271
+ /* harmony default export */ var Row_Storyvue_type_script_lang_js = (Storyvue_type_script_lang_js);
7272
+ ;// ./src/components/Chart/Row/Story.vue
5591
7273
 
5592
7274
 
5593
7275
 
@@ -5595,10 +7277,10 @@ var Projectvue_type_template_id_38b2a86e_staticRenderFns = [];
5595
7277
 
5596
7278
  /* normalize component */
5597
7279
  ;
5598
- var Project_component = normalizeComponent(
5599
- Row_Projectvue_type_script_lang_js,
5600
- Projectvue_type_template_id_38b2a86e_render,
5601
- Projectvue_type_template_id_38b2a86e_staticRenderFns,
7280
+ var Story_component = normalizeComponent(
7281
+ Row_Storyvue_type_script_lang_js,
7282
+ Storyvue_type_template_id_1f59b61a_render,
7283
+ Storyvue_type_template_id_1f59b61a_staticRenderFns,
5602
7284
  false,
5603
7285
  null,
5604
7286
  null,
@@ -5606,8 +7288,11 @@ var Project_component = normalizeComponent(
5606
7288
 
5607
7289
  )
5608
7290
 
5609
- /* harmony default export */ var Project = (Project_component.exports);
5610
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Chart/Chart.vue?vue&type=script&lang=js
7291
+ /* harmony default export */ var Story = (Story_component.exports);
7292
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Chart.vue?vue&type=script&lang=js
7293
+
7294
+
7295
+
5611
7296
 
5612
7297
 
5613
7298
 
@@ -5621,9 +7306,12 @@ var Project_component = normalizeComponent(
5621
7306
  Grid: Grid,
5622
7307
  DependencyLines: DependencyLines,
5623
7308
  Calendar: Calendar,
5624
- Task: Task,
5625
- Milestone: Milestone,
5626
- Project: Project,
7309
+ task: Task,
7310
+ milestone: Milestone,
7311
+ project: Project,
7312
+ epic: Epic,
7313
+ subtask: Subtask,
7314
+ story: Story,
5627
7315
  DaysHighlight: DaysHighlight
5628
7316
  },
5629
7317
  inject: ['root'],
@@ -5653,9 +7341,9 @@ var Project_component = normalizeComponent(
5653
7341
  }
5654
7342
  }
5655
7343
  });
5656
- ;// ./src/components/components/Chart/Chart.vue?vue&type=script&lang=js
7344
+ ;// ./src/components/Chart/Chart.vue?vue&type=script&lang=js
5657
7345
  /* harmony default export */ var Chart_Chartvue_type_script_lang_js = (Chartvue_type_script_lang_js);
5658
- ;// ./src/components/components/Chart/Chart.vue
7346
+ ;// ./src/components/Chart/Chart.vue
5659
7347
 
5660
7348
 
5661
7349
 
@@ -5665,8 +7353,8 @@ var Project_component = normalizeComponent(
5665
7353
  ;
5666
7354
  var Chart_component = normalizeComponent(
5667
7355
  Chart_Chartvue_type_script_lang_js,
5668
- Chartvue_type_template_id_4ae99150_render,
5669
- Chartvue_type_template_id_4ae99150_staticRenderFns,
7356
+ Chartvue_type_template_id_1d5eb6d6_render,
7357
+ Chartvue_type_template_id_1d5eb6d6_staticRenderFns,
5670
7358
  false,
5671
7359
  null,
5672
7360
  null,
@@ -5675,7 +7363,7 @@ var Chart_component = normalizeComponent(
5675
7363
  )
5676
7364
 
5677
7365
  /* harmony default export */ var Chart = (Chart_component.exports);
5678
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/MainView.vue?vue&type=script&lang=js
7366
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/MainView.vue?vue&type=script&lang=js
5679
7367
 
5680
7368
 
5681
7369
  let ignoreScrollEvents = false;
@@ -5859,9 +7547,9 @@ let ignoreScrollEvents = false;
5859
7547
  // document.removeEventListener('touchend', this.chartMouseUp);
5860
7548
  // }
5861
7549
  });
5862
- ;// ./src/components/components/MainView.vue?vue&type=script&lang=js
7550
+ ;// ./src/components/MainView.vue?vue&type=script&lang=js
5863
7551
  /* harmony default export */ var components_MainViewvue_type_script_lang_js = (MainViewvue_type_script_lang_js);
5864
- ;// ./src/components/components/MainView.vue
7552
+ ;// ./src/components/MainView.vue
5865
7553
 
5866
7554
 
5867
7555
 
@@ -5871,8 +7559,8 @@ let ignoreScrollEvents = false;
5871
7559
  ;
5872
7560
  var MainView_component = normalizeComponent(
5873
7561
  components_MainViewvue_type_script_lang_js,
5874
- MainViewvue_type_template_id_5e6f381a_render,
5875
- MainViewvue_type_template_id_5e6f381a_staticRenderFns,
7562
+ MainViewvue_type_template_id_1a4b756c_render,
7563
+ MainViewvue_type_template_id_1a4b756c_staticRenderFns,
5876
7564
  false,
5877
7565
  null,
5878
7566
  null,
@@ -5881,7 +7569,7 @@ var MainView_component = normalizeComponent(
5881
7569
  )
5882
7570
 
5883
7571
  /* harmony default export */ var MainView = (MainView_component.exports);
5884
- ;// ./src/components/style.js
7572
+ ;// ./src/style.js
5885
7573
  function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
5886
7574
  return {
5887
7575
  fontSize,
@@ -5931,10 +7619,10 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
5931
7619
  'calendar-row-rect-child': {
5932
7620
  display: 'block',
5933
7621
  'border-right-width': '1px',
5934
- // Calendar
5935
- 'border-right-color': '#dadada',
7622
+ 'border-right-color': '#E5E7EB',
5936
7623
  'border-right-style': 'solid',
5937
- position: 'relative'
7624
+ position: 'relative',
7625
+ 'box-sizing': 'border-box'
5938
7626
  },
5939
7627
  'calendar-row-rect-child--month': {},
5940
7628
  'calendar-row-rect-child--day': {
@@ -5950,11 +7638,20 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
5950
7638
  //GanttElastic
5951
7639
  color: '#606060',
5952
7640
  display: 'inline-block',
5953
- position: 'relative'
7641
+ position: 'relative',
7642
+ 'text-align': 'center',
7643
+ 'white-space': 'nowrap',
7644
+ 'overflow': 'hidden',
7645
+ 'text-overflow': 'ellipsis',
7646
+ 'max-width': '100%',
7647
+ 'width': '100%',
7648
+ 'box-sizing': 'border-box'
5954
7649
  },
5955
7650
  'calendar-row-text--month': {},
5956
7651
  'calendar-row-text--day': {},
5957
7652
  'calendar-row-text--hour': {},
7653
+ 'calendar-row-text--quarter': {},
7654
+ 'calendar-row-text--week': {},
5958
7655
  'task-list-wrapper': {},
5959
7656
  'task-list': {
5960
7657
  background: 'transparent',
@@ -5997,6 +7694,13 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
5997
7694
  fill: '#ffffffa0',
5998
7695
  stroke: '#000000A0'
5999
7696
  },
7697
+ 'task-list-expander-arrow': {
7698
+ fill: 'none',
7699
+ stroke: '#999999',
7700
+ 'stroke-width': '2',
7701
+ 'stroke-linecap': 'round',
7702
+ 'stroke-linejoin': 'round'
7703
+ },
6000
7704
  'chart-expander-wrapper': {
6001
7705
  display: 'block',
6002
7706
  'line-height': '1',
@@ -6020,6 +7724,13 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
6020
7724
  fill: '#ffffffa0',
6021
7725
  stroke: '#000000A0'
6022
7726
  },
7727
+ 'chart-expander-arrow': {
7728
+ fill: 'none',
7729
+ stroke: '#999999',
7730
+ 'stroke-width': '2',
7731
+ 'stroke-linecap': 'round',
7732
+ 'stroke-linejoin': 'round'
7733
+ },
6023
7734
  'task-list-container': {},
6024
7735
  'task-list-header-label': {
6025
7736
  overflow: 'hidden',
@@ -6076,7 +7787,8 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
6076
7787
  overflow: 'hidden'
6077
7788
  },
6078
7789
  'task-list-item-value': {
6079
- display: 'block',
7790
+ display: 'flex',
7791
+ 'align-items': 'center',
6080
7792
  'flex-shrink': '100',
6081
7793
  'font-family': fontFamily,
6082
7794
  'font-size': fontSize,
@@ -6093,13 +7805,34 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
6093
7805
  color: '#606060',
6094
7806
  background: '#FFFFFF'
6095
7807
  },
7808
+ 'task-list-item-content': {
7809
+ 'display': 'flex',
7810
+ 'align-items': 'center',
7811
+ 'width': '100%',
7812
+ 'min-width': '0'
7813
+ },
7814
+ 'task-list-item-icon': {
7815
+ 'display': 'flex',
7816
+ 'align-items': 'center',
7817
+ 'margin-right': '6px',
7818
+ 'flex-shrink': '0',
7819
+ 'width': '14px',
7820
+ 'height': '14px'
7821
+ },
7822
+ 'task-list-item-text': {
7823
+ 'flex': '1',
7824
+ 'min-width': '0',
7825
+ 'overflow': 'hidden',
7826
+ 'text-overflow': 'ellipsis',
7827
+ 'white-space': 'nowrap'
7828
+ },
6096
7829
  'grid-lines': {},
6097
7830
  'grid-line-horizontal': {
6098
- stroke: '#00000010',
7831
+ stroke: '#F3F4F6',
6099
7832
  'stroke-width': 1
6100
7833
  },
6101
7834
  'grid-line-vertical': {
6102
- stroke: '#00000010',
7835
+ stroke: '#E5E7EB',
6103
7836
  'stroke-width': 1
6104
7837
  },
6105
7838
  'grid-line-time': {
@@ -6114,13 +7847,17 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
6114
7847
  'user-select': 'none',
6115
7848
  overflow: 'hidden',
6116
7849
  'max-width': '100%',
6117
- 'border-right': '1px solid #eee'
7850
+ 'border-right': '1px solid #E5E7EB',
7851
+ 'position': 'relative',
7852
+ 'z-index': 1
6118
7853
  },
6119
7854
  'chart-graph-container': {
6120
7855
  'user-select': 'none',
6121
7856
  overflow: 'hidden',
6122
7857
  'max-width': '100%',
6123
- 'border-right': '1px solid #eee'
7858
+ 'border-right': '1px solid #E5E7EB',
7859
+ 'position': 'relative',
7860
+ 'z-index': 0
6124
7861
  },
6125
7862
  'chart-area': {},
6126
7863
  'chart-graph': {
@@ -6128,17 +7865,23 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
6128
7865
  },
6129
7866
  'chart-row-text-wrapper': {},
6130
7867
  'chart-row-text': {
6131
- background: '#ffffffa0',
6132
- 'border-radius': '10px',
7868
+ background: '#ffffff',
7869
+ 'border-radius': '4px',
6133
7870
  'font-family': fontFamily,
6134
- 'font-size': fontSize,
6135
- 'font-weight': 'normal',
6136
- color: '#000000a0',
7871
+ 'font-size': '11px',
7872
+ 'font-weight': '500',
7873
+ color: '#374151',
6137
7874
  height: '100%',
6138
- display: 'inline-block'
7875
+ display: 'inline-block',
7876
+ 'box-shadow': '0 1px 3px rgba(0, 0, 0, 0.1)',
7877
+ 'border': '1px solid #E5E7EB'
6139
7878
  },
6140
7879
  'chart-row-text-content': {
6141
- padding: '0px 6px'
7880
+ padding: '2px 8px',
7881
+ 'white-space': 'nowrap',
7882
+ 'overflow': 'hidden',
7883
+ 'text-overflow': 'ellipsis',
7884
+ 'max-width': '120px'
6142
7885
  },
6143
7886
  'chart-row-text-content--text': {},
6144
7887
  'chart-row-text-content--html': {},
@@ -6153,12 +7896,46 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
6153
7896
  'chart-row-project-wrapper': {},
6154
7897
  'chart-row-project': {},
6155
7898
  'chart-row-project-polygon': {},
7899
+ 'chart-row-epic-wrapper': {},
7900
+ 'chart-row-epic': {},
7901
+ 'chart-row-epic-polygon': {
7902
+ stroke: '#8B5CF6',
7903
+ 'stroke-width': 2,
7904
+ fill: '#8B5CF6',
7905
+ 'fill-opacity': 0.9
7906
+ },
7907
+ 'chart-row-subtask-wrapper': {},
7908
+ 'chart-row-subtask': {},
7909
+ 'chart-row-subtask-polygon': {
7910
+ stroke: '#3B82F6',
7911
+ 'stroke-width': 1,
7912
+ fill: '#3B82F6',
7913
+ 'fill-opacity': 0.9
7914
+ },
7915
+ 'chart-row-story-wrapper': {},
7916
+ 'chart-row-story': {},
7917
+ 'chart-row-story-polygon': {
7918
+ stroke: '#86EFAC',
7919
+ 'stroke-width': 1,
7920
+ fill: '#86EFAC',
7921
+ 'fill-opacity': 0.9
7922
+ },
6156
7923
  'chart-row-milestone-wrapper': {},
6157
7924
  'chart-row-milestone': {},
6158
- 'chart-row-milestone-polygon': {},
7925
+ 'chart-row-milestone-polygon': {
7926
+ stroke: '#CD5C5C',
7927
+ 'stroke-width': 2,
7928
+ fill: '#CD5C5C',
7929
+ 'fill-opacity': 0.9
7930
+ },
6159
7931
  'chart-row-task-wrapper': {},
6160
7932
  'chart-row-task': {},
6161
- 'chart-row-task-polygon': {},
7933
+ 'chart-row-task-polygon': {
7934
+ stroke: '#3B82F6',
7935
+ 'stroke-width': 1,
7936
+ fill: '#3B82F6',
7937
+ 'fill-opacity': 0.9
7938
+ },
6162
7939
  'chart-row-progress-bar-wrapper': {},
6163
7940
  'chart-row-progress-bar': {},
6164
7941
  'chart-row-progress-bar-line': {
@@ -7132,8 +8909,8 @@ var index = (function () {
7132
8909
 
7133
8910
  /* harmony default export */ var ResizeObserver_es = (index);
7134
8911
 
7135
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Header/Header.vue?vue&type=template&id=63647db0
7136
- var Headervue_type_template_id_63647db0_render = function render() {
8912
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Header/Header.vue?vue&type=template&id=7624c9ea
8913
+ var Headervue_type_template_id_7624c9ea_render = function render() {
7137
8914
  var _vm = this,
7138
8915
  _c = _vm._self._c;
7139
8916
  return _c('div', {
@@ -7330,7 +9107,7 @@ var Headervue_type_template_id_63647db0_render = function render() {
7330
9107
  }
7331
9108
  }), _vm._v(" " + _vm._s(_vm.opts.locale["Display task list"]) + " ")], 1)])]);
7332
9109
  };
7333
- var Headervue_type_template_id_63647db0_staticRenderFns = [];
9110
+ var Headervue_type_template_id_7624c9ea_staticRenderFns = [];
7334
9111
 
7335
9112
  // EXTERNAL MODULE: ./node_modules/vue-slider-component/dist/vue-slider-component.umd.min.js
7336
9113
  var vue_slider_component_umd_min = __webpack_require__(378);
@@ -7444,7 +9221,7 @@ var switches_component = normalizeComponent(
7444
9221
  )
7445
9222
 
7446
9223
  /* harmony default export */ var switches = (switches_component.exports);
7447
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Header/Header.vue?vue&type=script&lang=js
9224
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Header/Header.vue?vue&type=script&lang=js
7448
9225
 
7449
9226
 
7450
9227
 
@@ -7515,7 +9292,7 @@ const defaultStyle = {
7515
9292
  };
7516
9293
  const defaultOptions = {
7517
9294
  title: {
7518
- label: "",
9295
+ label: "ajay",
7519
9296
  html: true
7520
9297
  },
7521
9298
  locale: {
@@ -7553,6 +9330,7 @@ const defaultOptions = {
7553
9330
  };
7554
9331
  },
7555
9332
  created() {
9333
+ debugger; // eslint-disable-line no-debugger
7556
9334
  defaultOptions.title.label = this.root.projectName;
7557
9335
  this.localScale = this.root.state.options.times.timeZoom;
7558
9336
  this.localHeight = this.root.state.options.row.height;
@@ -7653,9 +9431,9 @@ const defaultOptions = {
7653
9431
  }
7654
9432
  }
7655
9433
  });
7656
- ;// ./src/components/components/Header/Header.vue?vue&type=script&lang=js
9434
+ ;// ./src/components/Header/Header.vue?vue&type=script&lang=js
7657
9435
  /* harmony default export */ var Header_Headervue_type_script_lang_js = (Headervue_type_script_lang_js);
7658
- ;// ./src/components/components/Header/Header.vue
9436
+ ;// ./src/components/Header/Header.vue
7659
9437
 
7660
9438
 
7661
9439
 
@@ -7665,8 +9443,8 @@ const defaultOptions = {
7665
9443
  ;
7666
9444
  var Header_component = normalizeComponent(
7667
9445
  Header_Headervue_type_script_lang_js,
7668
- Headervue_type_template_id_63647db0_render,
7669
- Headervue_type_template_id_63647db0_staticRenderFns,
9446
+ Headervue_type_template_id_7624c9ea_render,
9447
+ Headervue_type_template_id_7624c9ea_staticRenderFns,
7670
9448
  false,
7671
9449
  null,
7672
9450
  null,
@@ -7675,7 +9453,14 @@ var Header_component = normalizeComponent(
7675
9453
  )
7676
9454
 
7677
9455
  /* harmony default export */ var Header = (Header_component.exports);
7678
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/GanttElastic.vue?vue&type=script&lang=js
9456
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.vue?vue&type=script&lang=js
9457
+
9458
+
9459
+
9460
+
9461
+
9462
+
9463
+
7679
9464
 
7680
9465
 
7681
9466
 
@@ -7688,6 +9473,7 @@ var Header_component = normalizeComponent(
7688
9473
 
7689
9474
 
7690
9475
 
9476
+
7691
9477
  const ctx = document.createElement('canvas').getContext('2d');
7692
9478
  // let VueInst = VueInstance;
7693
9479
  // function initVue() {
@@ -7697,7 +9483,7 @@ const ctx = document.createElement('canvas').getContext('2d');
7697
9483
  // }
7698
9484
  // initVue();
7699
9485
 
7700
- // let hourWidthCache = null;
9486
+ let hourWidthCache = null;
7701
9487
 
7702
9488
  /**
7703
9489
  * Helper function to fill out empty options in user settings
@@ -7800,15 +9586,15 @@ function getOptions(userOptions) {
7800
9586
  bar: false
7801
9587
  },
7802
9588
  text: {
7803
- offset: 4,
9589
+ offset: 8,
7804
9590
  //*
7805
- xPadding: 10,
9591
+ xPadding: 12,
7806
9592
  //*
7807
9593
  display: true //*
7808
9594
  },
7809
9595
  expander: {
7810
9596
  type: 'chart',
7811
- display: false,
9597
+ display: true,
7812
9598
  //*
7813
9599
  displayIfTaskListHidden: true,
7814
9600
  //*
@@ -7840,7 +9626,7 @@ function getOptions(userOptions) {
7840
9626
  minWidth: 18,
7841
9627
  expander: {
7842
9628
  type: 'task-list',
7843
- size: 16,
9629
+ size: 18,
7844
9630
  columnWidth: 24,
7845
9631
  padding: 16,
7846
9632
  margin: 10,
@@ -7929,6 +9715,30 @@ function getOptions(userOptions) {
7929
9715
  return date.format('MMMM YYYY');
7930
9716
  }
7931
9717
  }
9718
+ },
9719
+ quarter: {
9720
+ height: 30,
9721
+ //*
9722
+ display: true,
9723
+ //*
9724
+ widths: [],
9725
+ maxWidths: {
9726
+ short: 0,
9727
+ medium: 0,
9728
+ long: 0
9729
+ },
9730
+ format: {
9731
+ //*
9732
+ short(date) {
9733
+ return date.format('Qo quarter');
9734
+ },
9735
+ medium(date) {
9736
+ return date.format("Qo 'YY");
9737
+ },
9738
+ long(date) {
9739
+ return date.format('Qo quarter YYYY');
9740
+ }
9741
+ }
7932
9742
  }
7933
9743
  },
7934
9744
  locale: {
@@ -8171,7 +9981,8 @@ const GanttElastic = {
8171
9981
  name: 'GanttElastic',
8172
9982
  components: {
8173
9983
  MainView: MainView,
8174
- 'gantt-header': Header
9984
+ 'gantt-header': Header,
9985
+ 'gantt-view-filter': GanttViewFilter
8175
9986
  },
8176
9987
  props: ['tasks', 'options', 'dynamicStyle', 'isHeaderVisible', 'projectName'],
8177
9988
  provide() {
@@ -8200,7 +10011,7 @@ const GanttElastic = {
8200
10011
  refs: {},
8201
10012
  tasksById: {},
8202
10013
  taskTree: {},
8203
- ctx: ctx,
10014
+ ctx,
8204
10015
  emitTasksChanges: true,
8205
10016
  // some operations may pause emitting changes to parent component
8206
10017
  emitOptionsChanges: true,
@@ -8218,6 +10029,51 @@ const GanttElastic = {
8218
10029
  methods: {
8219
10030
  mergeDeep,
8220
10031
  mergeDeepReactive,
10032
+ onViewModeChanged(mode) {
10033
+ // Update the calendar view mode
10034
+ this.options.calendar.viewMode = mode;
10035
+
10036
+ // Update the step duration based on the view mode
10037
+ if (this.options.times) {
10038
+ switch (mode) {
10039
+ case 'quarter':
10040
+ this.options.times.stepDuration = 'quarter';
10041
+ this.options.times.timeZoom = 15; // Reset zoom for better quarter view
10042
+ break;
10043
+ case 'month':
10044
+ this.options.times.stepDuration = 'month';
10045
+ this.options.times.timeZoom = 17; // Reset zoom for better month view
10046
+ break;
10047
+ case 'week':
10048
+ this.options.times.stepDuration = 'week';
10049
+ this.options.times.timeZoom = 19; // Reset zoom for better week view
10050
+ break;
10051
+ default:
10052
+ // 'day' or any other mode
10053
+ this.options.times.stepDuration = 'day';
10054
+ this.options.times.timeZoom = 21; // Reset zoom for better day view
10055
+ break;
10056
+ }
10057
+ }
10058
+
10059
+ // Force recalculation by triggering a reactive update
10060
+ this.$nextTick(() => {
10061
+ this.$forceUpdate();
10062
+ // Recalculate start date based on new view mode and trigger full recalculation
10063
+ if (this.$refs.ganttChart) {
10064
+ // Trigger recalculation of dates and times with new view mode
10065
+ this.$refs.ganttChart.prepareDates();
10066
+ this.$refs.ganttChart.initTimes();
10067
+ this.$refs.ganttChart.calculateSteps();
10068
+ this.$refs.ganttChart.computeCalendarWidths();
10069
+
10070
+ // Ensure perfect alignment between calendar and chart
10071
+ if (this.$refs.ganttChart.ensureCalendarChartAlignment) {
10072
+ this.$refs.ganttChart.ensureCalendarChartAlignment();
10073
+ }
10074
+ }
10075
+ });
10076
+ },
8221
10077
  /**
8222
10078
  * Calculate height of scrollbar in current browser
8223
10079
  *
@@ -8353,7 +10209,22 @@ const GanttElastic = {
8353
10209
  tasks = this.fillTasks(tasks);
8354
10210
  this.state.tasksById = this.resetTaskTree(tasks);
8355
10211
  this.state.taskTree = this.makeTaskTree(this.state.rootTask, tasks);
8356
- this.state.tasks = this.state.taskTree.allChildren.map(childId => this.getTask(childId));
10212
+
10213
+ // Get all visible tasks including parent tasks
10214
+ const visibleTaskIds = new Set();
10215
+
10216
+ // Add all root-level tasks (these include parent tasks that don't have parentId)
10217
+ this.state.taskTree.allChildren.forEach(childId => {
10218
+ visibleTaskIds.add(childId);
10219
+ });
10220
+
10221
+ // Also add any parent tasks that have children but might not be in root children
10222
+ tasks.forEach(task => {
10223
+ if (task.allChildren && task.allChildren.length > 0) {
10224
+ visibleTaskIds.add(task.id);
10225
+ }
10226
+ });
10227
+ this.state.tasks = Array.from(visibleTaskIds).map(childId => this.getTask(childId));
8357
10228
  this.calculateTaskListColumnsDimensions();
8358
10229
  this.state.options.scrollBarHeight = this.getScrollBarHeight();
8359
10230
  this.state.options.outerHeight = this.state.options.height + this.state.options.scrollBarHeight;
@@ -8505,11 +10376,21 @@ const GanttElastic = {
8505
10376
  if (typeof task === 'number' || typeof task === 'string') {
8506
10377
  task = this.getTask(task);
8507
10378
  }
10379
+
10380
+ // Always show parent tasks (tasks with children) - they need to be visible for expander functionality
10381
+ if (task.allChildren && task.allChildren.length > 0) {
10382
+ return true;
10383
+ }
10384
+
10385
+ // For child tasks, check if any parent is collapsed
8508
10386
  for (let i = 0, len = task.parents.length; i < len; i++) {
8509
- if (this.getTask(task.parents[i]).collapsed) {
10387
+ const parentTask = this.getTask(task.parents[i]);
10388
+ if (parentTask && parentTask.collapsed) {
8510
10389
  return false;
8511
10390
  }
8512
10391
  }
10392
+
10393
+ // Show all other tasks (root-level tasks and non-collapsed child tasks)
8513
10394
  return true;
8514
10395
  },
8515
10396
  /**
@@ -8767,46 +10648,311 @@ const GanttElastic = {
8767
10648
  this.$on('taskList-width-change', this.onTaskListWidthChange);
8768
10649
  this.$on('taskList-column-width-change', this.onTaskListColumnWidthChange);
8769
10650
  },
10651
+ /**
10652
+ * Get responsive step widths based on screen size
10653
+ */
10654
+ getResponsiveStepWidths(stepDuration) {
10655
+ const clientWidth = this.state.options.clientWidth;
10656
+
10657
+ // Enhanced base step widths for different screen sizes
10658
+ const baseWidths = {
10659
+ 'day': {
10660
+ mobile: 40,
10661
+ tablet: 50,
10662
+ desktopSmall: 60,
10663
+ desktopBig: 80
10664
+ },
10665
+ 'week': {
10666
+ mobile: 80,
10667
+ tablet: 100,
10668
+ desktopSmall: 120,
10669
+ desktopBig: 150
10670
+ },
10671
+ 'month': {
10672
+ mobile: 120,
10673
+ tablet: 140,
10674
+ desktopSmall: 160,
10675
+ desktopBig: 200
10676
+ },
10677
+ 'quarter': {
10678
+ mobile: 200,
10679
+ tablet: 250,
10680
+ desktopSmall: 300,
10681
+ desktopBig: 400
10682
+ }
10683
+ };
10684
+
10685
+ // Determine screen size with desktop variants
10686
+ let screenSize;
10687
+ if (clientWidth < 768) {
10688
+ screenSize = 'mobile';
10689
+ } else if (clientWidth < 1024) {
10690
+ screenSize = 'tablet';
10691
+ } else if (clientWidth < 1440) {
10692
+ screenSize = 'desktopSmall';
10693
+ } else {
10694
+ screenSize = 'desktopBig';
10695
+ }
10696
+
10697
+ // Get responsive width for the step duration
10698
+ let responsiveWidth = baseWidths[stepDuration][screenSize];
10699
+
10700
+ // Calculate dynamic width based on data content
10701
+ const dataBasedWidth = this.getDataBasedStepWidth(stepDuration, clientWidth);
10702
+
10703
+ // Use the larger of responsive width or data-based width
10704
+ return Math.max(responsiveWidth, dataBasedWidth);
10705
+ },
10706
+ /**
10707
+ * Get step width based on data content and minimum visibility requirements
10708
+ */
10709
+ getDataBasedStepWidth(stepDuration, clientWidth) {
10710
+ const estimatedSteps = this.getEstimatedStepCount(stepDuration);
10711
+ const taskListWidth = 300; // Account for task list width
10712
+ const availableWidth = clientWidth - taskListWidth;
10713
+
10714
+ // Define minimum visibility requirements
10715
+ const minVisibilitySteps = {
10716
+ 'day': 30,
10717
+ // Show at least 30 days
10718
+ 'week': 12,
10719
+ // Show at least 12 weeks (3 months)
10720
+ 'month': 8,
10721
+ // Show at least 8 months
10722
+ 'quarter': 3 // Show at least 3 quarters
10723
+ };
10724
+
10725
+ // Calculate minimum steps needed for good visibility
10726
+ const minSteps = Math.max(estimatedSteps, minVisibilitySteps[stepDuration]);
10727
+
10728
+ // Define minimum readable width per step
10729
+ const minReadableWidth = {
10730
+ 'day': 30,
10731
+ 'week': 60,
10732
+ 'month': 80,
10733
+ 'quarter': 120
10734
+ };
10735
+
10736
+ // Calculate width per step to ensure minimum visibility
10737
+ const minWidthPerStep = availableWidth / minSteps;
10738
+
10739
+ // Use the larger of minimum readable width or calculated width
10740
+ const calculatedWidth = Math.max(minWidthPerStep, minReadableWidth[stepDuration]);
10741
+
10742
+ // Define maximum reasonable width per step
10743
+ const maxWidthPerStep = {
10744
+ 'day': 100,
10745
+ 'week': 200,
10746
+ 'month': 300,
10747
+ 'quarter': 500
10748
+ };
10749
+
10750
+ // Ensure we don't exceed maximum reasonable width
10751
+ return Math.min(calculatedWidth, maxWidthPerStep[stepDuration]);
10752
+ },
10753
+ /**
10754
+ * Get maximum width multiplier based on screen size and data content
10755
+ */
10756
+ getMaxWidthMultiplier(stepDuration, stepCount) {
10757
+ const clientWidth = this.state.options.clientWidth;
10758
+
10759
+ // Base multipliers for different screen sizes
10760
+ const baseMultipliers = {
10761
+ mobile: 2,
10762
+ // 2x viewport width on mobile
10763
+ tablet: 2.5,
10764
+ // 2.5x viewport width on tablet
10765
+ desktopSmall: 3,
10766
+ // 3x viewport width on small desktop
10767
+ desktopBig: 4 // 4x viewport width on big desktop
10768
+ };
10769
+
10770
+ // Determine screen size
10771
+ let screenSize;
10772
+ if (clientWidth < 768) {
10773
+ screenSize = 'mobile';
10774
+ } else if (clientWidth < 1024) {
10775
+ screenSize = 'tablet';
10776
+ } else if (clientWidth < 1440) {
10777
+ screenSize = 'desktopSmall';
10778
+ } else {
10779
+ screenSize = 'desktopBig';
10780
+ }
10781
+ let multiplier = baseMultipliers[screenSize];
10782
+
10783
+ // Adjust multiplier based on data content
10784
+ const minVisibilitySteps = {
10785
+ 'day': 30,
10786
+ 'week': 12,
10787
+ 'month': 8,
10788
+ 'quarter': 3
10789
+ };
10790
+
10791
+ // If we have more data than minimum visibility, allow more width
10792
+ if (stepCount > minVisibilitySteps[stepDuration]) {
10793
+ const dataRatio = stepCount / minVisibilitySteps[stepDuration];
10794
+ multiplier = Math.min(multiplier * (1 + dataRatio * 0.5), 6); // Max 6x viewport width
10795
+ }
10796
+ return multiplier;
10797
+ },
10798
+ /**
10799
+ * Get estimated step count for responsive calculations
10800
+ */
10801
+ getEstimatedStepCount(stepDuration) {
10802
+ const totalDurationMs = dayjs_min_default()(this.state.options.times.lastTime).diff(this.state.options.times.firstTime, 'milliseconds');
10803
+ switch (stepDuration) {
10804
+ case 'quarter':
10805
+ return Math.ceil(dayjs_min_default()(this.state.options.times.lastTime).diff(dayjs_min_default()(this.state.options.times.firstTime), 'quarter', true));
10806
+ case 'month':
10807
+ return Math.ceil(dayjs_min_default()(this.state.options.times.lastTime).diff(dayjs_min_default()(this.state.options.times.firstTime), 'month', true));
10808
+ case 'week':
10809
+ return Math.ceil(dayjs_min_default()(this.state.options.times.lastTime).diff(dayjs_min_default()(this.state.options.times.firstTime), 'week', true));
10810
+ case 'day':
10811
+ default:
10812
+ return Math.ceil(dayjs_min_default()(this.state.options.times.lastTime).diff(dayjs_min_default()(this.state.options.times.firstTime), 'day', true));
10813
+ }
10814
+ },
8770
10815
  /**
8771
10816
  * When some action was performed (scale change for example) - recalculate time variables
8772
10817
  */
8773
10818
  recalculateTimes() {
8774
- let max = this.state.options.times.timeScale * 60;
8775
- let min = this.state.options.times.timeScale;
8776
- let steps = max / min;
8777
- let percent = this.state.options.times.timeZoom / 100;
8778
- this.state.options.times.timePerPixel = this.state.options.times.timeScale * steps * percent + Math.pow(2, this.state.options.times.timeZoom);
8779
- this.state.options.times.totalViewDurationMs = dayjs_min_default()(this.state.options.times.lastTime).diff(this.state.options.times.firstTime, 'milliseconds');
10819
+ const stepDuration = this.state.options.times.stepDuration;
10820
+ const timeZoom = this.state.options.times.timeZoom;
10821
+
10822
+ // Calculate base time per pixel based on step duration
10823
+ let baseTimePerPixel;
10824
+ const totalDurationMs = dayjs_min_default()(this.state.options.times.lastTime).diff(this.state.options.times.firstTime, 'milliseconds');
10825
+
10826
+ // Get responsive step width based on screen size and data content
10827
+ const responsiveStepWidth = this.getResponsiveStepWidths(stepDuration);
10828
+
10829
+ // Calculate how many steps we'll have
10830
+ const stepCount = this.getEstimatedStepCount(stepDuration);
10831
+
10832
+ // Define minimum visibility requirements
10833
+ const minVisibilitySteps = {
10834
+ 'day': 30,
10835
+ // Show at least 30 days
10836
+ 'week': 12,
10837
+ // Show at least 12 weeks (3 months)
10838
+ 'month': 8,
10839
+ // Show at least 8 months
10840
+ 'quarter': 3 // Show at least 3 quarters
10841
+ };
10842
+
10843
+ // Ensure we show at least the minimum number of steps
10844
+ const actualSteps = Math.max(stepCount, minVisibilitySteps[stepDuration]);
10845
+
10846
+ // Ensure minimum visibility for all view types
10847
+ if (stepCount < minVisibilitySteps[stepDuration]) {
10848
+ const firstTime = dayjs_min_default()(this.state.options.times.firstTime);
10849
+ let lastTime;
10850
+ switch (stepDuration) {
10851
+ case 'month':
10852
+ lastTime = firstTime.add(8, 'month');
10853
+ break;
10854
+ case 'week':
10855
+ lastTime = firstTime.add(12, 'week');
10856
+ break;
10857
+ case 'quarter':
10858
+ lastTime = firstTime.add(3, 'quarter');
10859
+ break;
10860
+ case 'day':
10861
+ default:
10862
+ lastTime = firstTime.add(30, 'day');
10863
+ break;
10864
+ }
10865
+ this.state.options.times.lastTime = lastTime.valueOf();
10866
+ // Recalculate total duration with extended range
10867
+ const extendedDurationMs = lastTime.diff(firstTime, 'milliseconds');
10868
+ const minSteps = minVisibilitySteps[stepDuration];
10869
+ this.state.options.times.timePerPixel = extendedDurationMs / (minSteps * responsiveStepWidth);
10870
+ this.state.options.times.totalViewDurationMs = extendedDurationMs;
10871
+ this.state.options.times.totalViewDurationPx = minSteps * responsiveStepWidth;
10872
+ return; // Exit early for views with extended range
10873
+ }
10874
+
10875
+ // Calculate total width needed for all steps
10876
+ const totalWidthNeeded = actualSteps * responsiveStepWidth;
10877
+
10878
+ // Calculate time per pixel to fit the content with responsive step width
10879
+ this.state.options.times.timePerPixel = totalDurationMs / totalWidthNeeded;
10880
+
10881
+ // Apply zoom factor (higher zoom = more compressed view)
10882
+ const zoomFactor = Math.pow(0.8, (timeZoom - 17) / 10); // Adjust zoom sensitivity
10883
+ this.state.options.times.timePerPixel *= zoomFactor;
10884
+ this.state.options.times.totalViewDurationMs = totalDurationMs;
8780
10885
  this.state.options.times.totalViewDurationPx = this.state.options.times.totalViewDurationMs / this.state.options.times.timePerPixel;
8781
- this.state.options.width = this.state.options.times.totalViewDurationPx + this.style['grid-line-vertical']['stroke-width'];
10886
+
10887
+ // Calculate final width
10888
+ const calculatedWidth = this.state.options.times.totalViewDurationPx + this.style['grid-line-vertical']['stroke-width'];
10889
+
10890
+ // Define maximum width based on screen size and data content
10891
+ const maxWidthMultiplier = this.getMaxWidthMultiplier(stepDuration, actualSteps);
10892
+ const maxWidth = this.state.options.clientWidth * maxWidthMultiplier;
10893
+
10894
+ // Ensure minimum width for scrolling when we have minimum visibility requirements
10895
+ const minWidthForScrolling = this.state.options.clientWidth * 1.2; // 20% more than viewport
10896
+ const finalWidth = Math.max(calculatedWidth, minWidthForScrolling);
10897
+ if (finalWidth > maxWidth) {
10898
+ // Only limit width if it's truly excessive
10899
+ this.state.options.times.timePerPixel = totalDurationMs / (maxWidth - this.style['grid-line-vertical']['stroke-width']);
10900
+ this.state.options.times.totalViewDurationPx = totalDurationMs / this.state.options.times.timePerPixel;
10901
+ this.state.options.width = maxWidth;
10902
+ } else {
10903
+ this.state.options.width = finalWidth;
10904
+ }
8782
10905
  },
8783
10906
  /**
8784
10907
  * Initialize time variables
8785
10908
  */
8786
10909
  initTimes() {
8787
- this.state.options.times.firstTime = dayjs_min_default()(this.state.options.times.firstTaskTime).locale(this.state.options.locale.name).startOf('day').subtract(this.state.options.scope.before, 'days').startOf('day').valueOf();
10910
+ // Calculate dynamic start date based on the formula
10911
+ const minDataDate = dayjs_min_default()(this.state.options.times.firstTaskTime).startOf('day');
10912
+ const viewBasedStartDate = this.calculateDynamicStartDate();
10913
+
10914
+ // Use the minimum of data start date and view-based start date
10915
+ const dynamicStartDate = minDataDate.isBefore(viewBasedStartDate) ? minDataDate : viewBasedStartDate;
10916
+ this.state.options.times.firstTime = dynamicStartDate.locale(this.state.options.locale.name).subtract(this.state.options.scope.before, 'days').startOf('day').valueOf();
8788
10917
  this.state.options.times.lastTime = dayjs_min_default()(this.state.options.times.lastTaskTime).locale(this.state.options.locale.name).endOf('day').add(this.state.options.scope.after, 'days').endOf('day').valueOf();
8789
10918
  this.recalculateTimes();
8790
10919
  },
8791
10920
  /**
8792
10921
  * Calculate steps
8793
- * Steps are days by default
10922
+ * Steps are calculated based on stepDuration (day, week, month, quarter)
8794
10923
  * Each step contain information about time offset and pixel offset of this time inside gantt chart
8795
10924
  */
8796
10925
  calculateSteps() {
8797
10926
  const steps = [];
8798
10927
  const lastMs = dayjs_min_default()(this.state.options.times.lastTime).valueOf();
8799
- const currentDate = dayjs_min_default()(this.state.options.times.firstTime);
10928
+ const stepDuration = this.state.options.times.stepDuration;
10929
+
10930
+ // Get the appropriate startOf method based on step duration
10931
+ const getStartOf = (date, duration) => {
10932
+ switch (duration) {
10933
+ case 'quarter':
10934
+ return date.startOf('quarter');
10935
+ case 'month':
10936
+ return date.startOf('month');
10937
+ case 'week':
10938
+ return date.startOf('week');
10939
+ case 'day':
10940
+ default:
10941
+ return date.startOf('day');
10942
+ }
10943
+ };
10944
+ const firstDate = dayjs_min_default()(this.state.options.times.firstTime);
8800
10945
  steps.push({
8801
- time: currentDate.valueOf(),
10946
+ time: firstDate.valueOf(),
8802
10947
  offset: {
8803
10948
  ms: 0,
8804
10949
  px: 0
8805
10950
  }
8806
10951
  });
8807
- for (let currentDate = dayjs_min_default()(this.state.options.times.firstTime).add(1, this.state.options.times.stepDuration).startOf('day'); currentDate.valueOf() <= lastMs; currentDate = currentDate.add(1, this.state.options.times.stepDuration).startOf('day')) {
10952
+ let currentDate = getStartOf(firstDate.clone().add(1, stepDuration), stepDuration);
10953
+ while (currentDate.valueOf() <= lastMs) {
8808
10954
  const offsetMs = currentDate.diff(this.state.options.times.firstTime, 'milliseconds');
8809
- const offsetPx = offsetMs / this.state.options.times.timePerPixel;
10955
+ const offsetPx = Math.round(offsetMs / this.state.options.times.timePerPixel); // Round to avoid sub-pixel issues
8810
10956
  const step = {
8811
10957
  time: currentDate.valueOf(),
8812
10958
  offset: {
@@ -8817,14 +10963,17 @@ const GanttElastic = {
8817
10963
  const previousStep = steps[steps.length - 1];
8818
10964
  previousStep.width = {
8819
10965
  ms: offsetMs - previousStep.offset.ms,
8820
- px: offsetPx - previousStep.offset.px
10966
+ px: Math.round(offsetPx - previousStep.offset.px) // Round to avoid sub-pixel issues
8821
10967
  };
8822
10968
  steps.push(step);
10969
+
10970
+ // Move to next step
10971
+ currentDate = getStartOf(currentDate.add(1, stepDuration), stepDuration);
8823
10972
  }
8824
10973
  const lastStep = steps[steps.length - 1];
8825
10974
  lastStep.width = {
8826
10975
  ms: this.state.options.times.totalViewDurationMs - lastStep.offset.ms,
8827
- px: this.state.options.times.totalViewDurationPx - lastStep.offset.px
10976
+ px: Math.round(this.state.options.times.totalViewDurationPx - lastStep.offset.px) // Round to avoid sub-pixel issues
8828
10977
  };
8829
10978
  this.state.options.times.steps = steps;
8830
10979
  },
@@ -8963,6 +11112,32 @@ const GanttElastic = {
8963
11112
  currentDate = currentDate.add(1, 'month');
8964
11113
  }
8965
11114
  },
11115
+ /**
11116
+ * Calculate dynamic start date based on view mode and current date
11117
+ * Formula: Min((Min Date from data), case when day then Current Date when week then current date - 1 week, when month then Current Month -1 when quarter then current quarter - 1)
11118
+ */
11119
+ calculateDynamicStartDate() {
11120
+ const currentDate = dayjs_min_default()();
11121
+ const stepDuration = this.state.options.times.stepDuration;
11122
+ let viewBasedStartDate;
11123
+ switch (stepDuration) {
11124
+ case 'day':
11125
+ viewBasedStartDate = currentDate.startOf('day');
11126
+ break;
11127
+ case 'week':
11128
+ viewBasedStartDate = currentDate.subtract(1, 'week').startOf('week');
11129
+ break;
11130
+ case 'month':
11131
+ viewBasedStartDate = currentDate.subtract(1, 'month').startOf('month');
11132
+ break;
11133
+ case 'quarter':
11134
+ viewBasedStartDate = currentDate.subtract(1, 'quarter').startOf('quarter');
11135
+ break;
11136
+ default:
11137
+ viewBasedStartDate = currentDate.startOf('day');
11138
+ }
11139
+ return viewBasedStartDate;
11140
+ },
8966
11141
  /**
8967
11142
  * Prepare time and date variables for gantt
8968
11143
  */
@@ -8980,7 +11155,14 @@ const GanttElastic = {
8980
11155
  }
8981
11156
  this.state.options.times.firstTaskTime = firstTaskTime;
8982
11157
  this.state.options.times.lastTaskTime = lastTaskTime;
8983
- this.state.options.times.firstTime = dayjs_min_default()(firstTaskTime).locale(this.state.options.locale.name).startOf('day').subtract(this.state.options.scope.before, 'days').startOf('day').valueOf();
11158
+
11159
+ // Calculate dynamic start date based on the formula
11160
+ const minDataDate = dayjs_min_default()(firstTaskTime).startOf('day');
11161
+ const viewBasedStartDate = this.calculateDynamicStartDate();
11162
+
11163
+ // Use the minimum of data start date and view-based start date
11164
+ const dynamicStartDate = minDataDate.isBefore(viewBasedStartDate) ? minDataDate : viewBasedStartDate;
11165
+ this.state.options.times.firstTime = dynamicStartDate.locale(this.state.options.locale.name).subtract(this.state.options.scope.before, 'days').startOf('day').valueOf();
8984
11166
  this.state.options.times.lastTime = dayjs_min_default()(lastTaskTime).locale(this.state.options.locale.name).endOf('day').add(this.state.options.scope.after, 'days').endOf('day').valueOf();
8985
11167
  },
8986
11168
  /**
@@ -9023,6 +11205,11 @@ const GanttElastic = {
9023
11205
  });
9024
11206
  }
9025
11207
  this.calculateTaskListColumnsDimensions();
11208
+
11209
+ // Recalculate times when window is resized to adjust step widths
11210
+ this.recalculateTimes();
11211
+ this.calculateSteps();
11212
+ this.computeCalendarWidths();
9026
11213
  this.$emit('calendar-recalculate');
9027
11214
  this.syncScrollTop();
9028
11215
  }
@@ -9189,14 +11376,14 @@ const GanttElastic = {
9189
11376
  }
9190
11377
  };
9191
11378
  /* harmony default export */ var GanttElasticvue_type_script_lang_js = (GanttElastic);
9192
- ;// ./src/components/GanttElastic.vue?vue&type=script&lang=js
9193
- /* harmony default export */ var components_GanttElasticvue_type_script_lang_js = (GanttElasticvue_type_script_lang_js);
9194
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-55.use[0]!./node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-55.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-55.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/GanttElastic.vue?vue&type=style&index=0&id=bf79b1fe&prod&lang=css
11379
+ ;// ./src/GanttElastic.vue?vue&type=script&lang=js
11380
+ /* harmony default export */ var src_GanttElasticvue_type_script_lang_js = (GanttElasticvue_type_script_lang_js);
11381
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-55.use[0]!./node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-55.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-55.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.vue?vue&type=style&index=0&id=2767341e&prod&lang=css
9195
11382
  // extracted by mini-css-extract-plugin
9196
11383
 
9197
- ;// ./src/components/GanttElastic.vue?vue&type=style&index=0&id=bf79b1fe&prod&lang=css
11384
+ ;// ./src/GanttElastic.vue?vue&type=style&index=0&id=2767341e&prod&lang=css
9198
11385
 
9199
- ;// ./src/components/GanttElastic.vue
11386
+ ;// ./src/GanttElastic.vue
9200
11387
 
9201
11388
 
9202
11389
 
@@ -9206,7 +11393,68 @@ const GanttElastic = {
9206
11393
  /* normalize component */
9207
11394
 
9208
11395
  var GanttElastic_component = normalizeComponent(
9209
- components_GanttElasticvue_type_script_lang_js,
11396
+ src_GanttElasticvue_type_script_lang_js,
11397
+ GanttElasticvue_type_template_id_2767341e_render,
11398
+ GanttElasticvue_type_template_id_2767341e_staticRenderFns,
11399
+ false,
11400
+ null,
11401
+ null,
11402
+ null
11403
+
11404
+ )
11405
+
11406
+ /* harmony default export */ var src_GanttElastic = (GanttElastic_component.exports);
11407
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.standalone.vue?vue&type=script&lang=js
11408
+
11409
+ /* harmony default export */ var GanttElastic_standalonevue_type_script_lang_js = ({
11410
+ name: 'GanttElasticStandalone',
11411
+ components: {
11412
+ 'gantt-elastic': src_GanttElastic
11413
+ },
11414
+ props: {
11415
+ // Props to receive from parent
11416
+ tasks: {
11417
+ type: Array,
11418
+ default: () => []
11419
+ },
11420
+ options: {
11421
+ type: Object,
11422
+ default: () => ({})
11423
+ },
11424
+ dynamicStyle: {
11425
+ type: Object,
11426
+ default: () => ({})
11427
+ },
11428
+ header: {
11429
+ type: Object,
11430
+ default: () => ({})
11431
+ },
11432
+ footer: {
11433
+ type: Object,
11434
+ default: () => ({})
11435
+ }
11436
+ },
11437
+ data() {
11438
+ return {
11439
+ components: {
11440
+ header: this.header,
11441
+ footer: this.footer
11442
+ }
11443
+ };
11444
+ }
11445
+ });
11446
+ ;// ./src/GanttElastic.standalone.vue?vue&type=script&lang=js
11447
+ /* harmony default export */ var src_GanttElastic_standalonevue_type_script_lang_js = (GanttElastic_standalonevue_type_script_lang_js);
11448
+ ;// ./src/GanttElastic.standalone.vue
11449
+
11450
+
11451
+
11452
+
11453
+
11454
+ /* normalize component */
11455
+ ;
11456
+ var GanttElastic_standalone_component = normalizeComponent(
11457
+ src_GanttElastic_standalonevue_type_script_lang_js,
9210
11458
  render,
9211
11459
  staticRenderFns,
9212
11460
  false,
@@ -9216,12 +11464,12 @@ var GanttElastic_component = normalizeComponent(
9216
11464
 
9217
11465
  )
9218
11466
 
9219
- /* harmony default export */ var components_GanttElastic = (GanttElastic_component.exports);
11467
+ /* harmony default export */ var GanttElastic_standalone = (GanttElastic_standalone_component.exports);
9220
11468
  ;// ./src/index.js
9221
11469
 
9222
11470
  /* harmony default export */ var src_0 = ({
9223
11471
  install(app, options = {}) {
9224
- app.component('tg-ganttchart', components_GanttElastic);
11472
+ app.component('tg-ganttchart', GanttElastic_standalone);
9225
11473
  }
9226
11474
  });
9227
11475
  // if (typeof window !== 'undefined' && window.Vue) {