tg-ganttchart 0.0.9 → 0.0.10

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.
@@ -8,6 +8,20 @@
8
8
 
9
9
  /***/ }),
10
10
 
11
+ /***/ 1816:
12
+ /***/ (function(module) {
13
+
14
+ !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)}}}));
15
+
16
+ /***/ }),
17
+
18
+ /***/ 8134:
19
+ /***/ (function(module) {
20
+
21
+ !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)}}}));
22
+
23
+ /***/ }),
24
+
11
25
  /***/ 378:
12
26
  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
13
27
 
@@ -46,6 +60,22 @@ module.exports = function (argument) {
46
60
  };
47
61
 
48
62
 
63
+ /***/ }),
64
+
65
+ /***/ 7080:
66
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
67
+
68
+ "use strict";
69
+
70
+ var has = (__webpack_require__(4402).has);
71
+
72
+ // Perform ? RequireInternalSlot(M, [[SetData]])
73
+ module.exports = function (it) {
74
+ has(it);
75
+ return it;
76
+ };
77
+
78
+
49
79
  /***/ }),
50
80
 
51
81
  /***/ 679:
@@ -713,6 +743,24 @@ module.exports = {
713
743
  };
714
744
 
715
745
 
746
+ /***/ }),
747
+
748
+ /***/ 6706:
749
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
750
+
751
+ "use strict";
752
+
753
+ var uncurryThis = __webpack_require__(9504);
754
+ var aCallable = __webpack_require__(9306);
755
+
756
+ module.exports = function (object, key, method) {
757
+ try {
758
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
759
+ return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));
760
+ } catch (error) { /* empty */ }
761
+ };
762
+
763
+
716
764
  /***/ }),
717
765
 
718
766
  /***/ 7476:
@@ -850,6 +898,54 @@ module.exports = function (V, P) {
850
898
  };
851
899
 
852
900
 
901
+ /***/ }),
902
+
903
+ /***/ 3789:
904
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
905
+
906
+ "use strict";
907
+
908
+ var aCallable = __webpack_require__(9306);
909
+ var anObject = __webpack_require__(8551);
910
+ var call = __webpack_require__(9565);
911
+ var toIntegerOrInfinity = __webpack_require__(1291);
912
+ var getIteratorDirect = __webpack_require__(1767);
913
+
914
+ var INVALID_SIZE = 'Invalid size';
915
+ var $RangeError = RangeError;
916
+ var $TypeError = TypeError;
917
+ var max = Math.max;
918
+
919
+ var SetRecord = function (set, intSize) {
920
+ this.set = set;
921
+ this.size = max(intSize, 0);
922
+ this.has = aCallable(set.has);
923
+ this.keys = aCallable(set.keys);
924
+ };
925
+
926
+ SetRecord.prototype = {
927
+ getIterator: function () {
928
+ return getIteratorDirect(anObject(call(this.keys, this.set)));
929
+ },
930
+ includes: function (it) {
931
+ return call(this.has, this.set, it);
932
+ }
933
+ };
934
+
935
+ // `GetSetRecord` abstract operation
936
+ // https://tc39.es/proposal-set-methods/#sec-getsetrecord
937
+ module.exports = function (obj) {
938
+ anObject(obj);
939
+ var numSize = +obj.size;
940
+ // NOTE: If size is undefined, then numSize will be NaN
941
+ // eslint-disable-next-line no-self-compare -- NaN check
942
+ if (numSize !== numSize) throw new $TypeError(INVALID_SIZE);
943
+ var intSize = toIntegerOrInfinity(numSize);
944
+ if (intSize < 0) throw new $RangeError(INVALID_SIZE);
945
+ return new SetRecord(obj, intSize);
946
+ };
947
+
948
+
853
949
  /***/ }),
854
950
 
855
951
  /***/ 4576:
@@ -1209,6 +1305,26 @@ module.exports = USE_SYMBOL_AS_UID ? function (it) {
1209
1305
  };
1210
1306
 
1211
1307
 
1308
+ /***/ }),
1309
+
1310
+ /***/ 507:
1311
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1312
+
1313
+ "use strict";
1314
+
1315
+ var call = __webpack_require__(9565);
1316
+
1317
+ module.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) {
1318
+ var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator;
1319
+ var next = record.next;
1320
+ var step, result;
1321
+ while (!(step = call(next, iterator)).done) {
1322
+ result = fn(step.value);
1323
+ if (result !== undefined) return result;
1324
+ }
1325
+ };
1326
+
1327
+
1212
1328
  /***/ }),
1213
1329
 
1214
1330
  /***/ 2652:
@@ -2012,6 +2128,341 @@ module.exports = function (it) {
2012
2128
  };
2013
2129
 
2014
2130
 
2131
+ /***/ }),
2132
+
2133
+ /***/ 9286:
2134
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2135
+
2136
+ "use strict";
2137
+
2138
+ var SetHelpers = __webpack_require__(4402);
2139
+ var iterate = __webpack_require__(8469);
2140
+
2141
+ var Set = SetHelpers.Set;
2142
+ var add = SetHelpers.add;
2143
+
2144
+ module.exports = function (set) {
2145
+ var result = new Set();
2146
+ iterate(set, function (it) {
2147
+ add(result, it);
2148
+ });
2149
+ return result;
2150
+ };
2151
+
2152
+
2153
+ /***/ }),
2154
+
2155
+ /***/ 3440:
2156
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2157
+
2158
+ "use strict";
2159
+
2160
+ var aSet = __webpack_require__(7080);
2161
+ var SetHelpers = __webpack_require__(4402);
2162
+ var clone = __webpack_require__(9286);
2163
+ var size = __webpack_require__(5170);
2164
+ var getSetRecord = __webpack_require__(3789);
2165
+ var iterateSet = __webpack_require__(8469);
2166
+ var iterateSimple = __webpack_require__(507);
2167
+
2168
+ var has = SetHelpers.has;
2169
+ var remove = SetHelpers.remove;
2170
+
2171
+ // `Set.prototype.difference` method
2172
+ // https://github.com/tc39/proposal-set-methods
2173
+ module.exports = function difference(other) {
2174
+ var O = aSet(this);
2175
+ var otherRec = getSetRecord(other);
2176
+ var result = clone(O);
2177
+ if (size(O) <= otherRec.size) iterateSet(O, function (e) {
2178
+ if (otherRec.includes(e)) remove(result, e);
2179
+ });
2180
+ else iterateSimple(otherRec.getIterator(), function (e) {
2181
+ if (has(O, e)) remove(result, e);
2182
+ });
2183
+ return result;
2184
+ };
2185
+
2186
+
2187
+ /***/ }),
2188
+
2189
+ /***/ 4402:
2190
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2191
+
2192
+ "use strict";
2193
+
2194
+ var uncurryThis = __webpack_require__(9504);
2195
+
2196
+ // eslint-disable-next-line es/no-set -- safe
2197
+ var SetPrototype = Set.prototype;
2198
+
2199
+ module.exports = {
2200
+ // eslint-disable-next-line es/no-set -- safe
2201
+ Set: Set,
2202
+ add: uncurryThis(SetPrototype.add),
2203
+ has: uncurryThis(SetPrototype.has),
2204
+ remove: uncurryThis(SetPrototype['delete']),
2205
+ proto: SetPrototype
2206
+ };
2207
+
2208
+
2209
+ /***/ }),
2210
+
2211
+ /***/ 8750:
2212
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2213
+
2214
+ "use strict";
2215
+
2216
+ var aSet = __webpack_require__(7080);
2217
+ var SetHelpers = __webpack_require__(4402);
2218
+ var size = __webpack_require__(5170);
2219
+ var getSetRecord = __webpack_require__(3789);
2220
+ var iterateSet = __webpack_require__(8469);
2221
+ var iterateSimple = __webpack_require__(507);
2222
+
2223
+ var Set = SetHelpers.Set;
2224
+ var add = SetHelpers.add;
2225
+ var has = SetHelpers.has;
2226
+
2227
+ // `Set.prototype.intersection` method
2228
+ // https://github.com/tc39/proposal-set-methods
2229
+ module.exports = function intersection(other) {
2230
+ var O = aSet(this);
2231
+ var otherRec = getSetRecord(other);
2232
+ var result = new Set();
2233
+
2234
+ if (size(O) > otherRec.size) {
2235
+ iterateSimple(otherRec.getIterator(), function (e) {
2236
+ if (has(O, e)) add(result, e);
2237
+ });
2238
+ } else {
2239
+ iterateSet(O, function (e) {
2240
+ if (otherRec.includes(e)) add(result, e);
2241
+ });
2242
+ }
2243
+
2244
+ return result;
2245
+ };
2246
+
2247
+
2248
+ /***/ }),
2249
+
2250
+ /***/ 4449:
2251
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2252
+
2253
+ "use strict";
2254
+
2255
+ var aSet = __webpack_require__(7080);
2256
+ var has = (__webpack_require__(4402).has);
2257
+ var size = __webpack_require__(5170);
2258
+ var getSetRecord = __webpack_require__(3789);
2259
+ var iterateSet = __webpack_require__(8469);
2260
+ var iterateSimple = __webpack_require__(507);
2261
+ var iteratorClose = __webpack_require__(9539);
2262
+
2263
+ // `Set.prototype.isDisjointFrom` method
2264
+ // https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom
2265
+ module.exports = function isDisjointFrom(other) {
2266
+ var O = aSet(this);
2267
+ var otherRec = getSetRecord(other);
2268
+ if (size(O) <= otherRec.size) return iterateSet(O, function (e) {
2269
+ if (otherRec.includes(e)) return false;
2270
+ }, true) !== false;
2271
+ var iterator = otherRec.getIterator();
2272
+ return iterateSimple(iterator, function (e) {
2273
+ if (has(O, e)) return iteratorClose(iterator, 'normal', false);
2274
+ }) !== false;
2275
+ };
2276
+
2277
+
2278
+ /***/ }),
2279
+
2280
+ /***/ 3838:
2281
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2282
+
2283
+ "use strict";
2284
+
2285
+ var aSet = __webpack_require__(7080);
2286
+ var size = __webpack_require__(5170);
2287
+ var iterate = __webpack_require__(8469);
2288
+ var getSetRecord = __webpack_require__(3789);
2289
+
2290
+ // `Set.prototype.isSubsetOf` method
2291
+ // https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf
2292
+ module.exports = function isSubsetOf(other) {
2293
+ var O = aSet(this);
2294
+ var otherRec = getSetRecord(other);
2295
+ if (size(O) > otherRec.size) return false;
2296
+ return iterate(O, function (e) {
2297
+ if (!otherRec.includes(e)) return false;
2298
+ }, true) !== false;
2299
+ };
2300
+
2301
+
2302
+ /***/ }),
2303
+
2304
+ /***/ 8527:
2305
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2306
+
2307
+ "use strict";
2308
+
2309
+ var aSet = __webpack_require__(7080);
2310
+ var has = (__webpack_require__(4402).has);
2311
+ var size = __webpack_require__(5170);
2312
+ var getSetRecord = __webpack_require__(3789);
2313
+ var iterateSimple = __webpack_require__(507);
2314
+ var iteratorClose = __webpack_require__(9539);
2315
+
2316
+ // `Set.prototype.isSupersetOf` method
2317
+ // https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf
2318
+ module.exports = function isSupersetOf(other) {
2319
+ var O = aSet(this);
2320
+ var otherRec = getSetRecord(other);
2321
+ if (size(O) < otherRec.size) return false;
2322
+ var iterator = otherRec.getIterator();
2323
+ return iterateSimple(iterator, function (e) {
2324
+ if (!has(O, e)) return iteratorClose(iterator, 'normal', false);
2325
+ }) !== false;
2326
+ };
2327
+
2328
+
2329
+ /***/ }),
2330
+
2331
+ /***/ 8469:
2332
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2333
+
2334
+ "use strict";
2335
+
2336
+ var uncurryThis = __webpack_require__(9504);
2337
+ var iterateSimple = __webpack_require__(507);
2338
+ var SetHelpers = __webpack_require__(4402);
2339
+
2340
+ var Set = SetHelpers.Set;
2341
+ var SetPrototype = SetHelpers.proto;
2342
+ var forEach = uncurryThis(SetPrototype.forEach);
2343
+ var keys = uncurryThis(SetPrototype.keys);
2344
+ var next = keys(new Set()).next;
2345
+
2346
+ module.exports = function (set, fn, interruptible) {
2347
+ return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn);
2348
+ };
2349
+
2350
+
2351
+ /***/ }),
2352
+
2353
+ /***/ 4916:
2354
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2355
+
2356
+ "use strict";
2357
+
2358
+ var getBuiltIn = __webpack_require__(7751);
2359
+
2360
+ var createSetLike = function (size) {
2361
+ return {
2362
+ size: size,
2363
+ has: function () {
2364
+ return false;
2365
+ },
2366
+ keys: function () {
2367
+ return {
2368
+ next: function () {
2369
+ return { done: true };
2370
+ }
2371
+ };
2372
+ }
2373
+ };
2374
+ };
2375
+
2376
+ module.exports = function (name) {
2377
+ var Set = getBuiltIn('Set');
2378
+ try {
2379
+ new Set()[name](createSetLike(0));
2380
+ try {
2381
+ // late spec change, early WebKit ~ Safari 17.0 beta implementation does not pass it
2382
+ // https://github.com/tc39/proposal-set-methods/pull/88
2383
+ new Set()[name](createSetLike(-1));
2384
+ return false;
2385
+ } catch (error2) {
2386
+ return true;
2387
+ }
2388
+ } catch (error) {
2389
+ return false;
2390
+ }
2391
+ };
2392
+
2393
+
2394
+ /***/ }),
2395
+
2396
+ /***/ 5170:
2397
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2398
+
2399
+ "use strict";
2400
+
2401
+ var uncurryThisAccessor = __webpack_require__(6706);
2402
+ var SetHelpers = __webpack_require__(4402);
2403
+
2404
+ module.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) {
2405
+ return set.size;
2406
+ };
2407
+
2408
+
2409
+ /***/ }),
2410
+
2411
+ /***/ 3650:
2412
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2413
+
2414
+ "use strict";
2415
+
2416
+ var aSet = __webpack_require__(7080);
2417
+ var SetHelpers = __webpack_require__(4402);
2418
+ var clone = __webpack_require__(9286);
2419
+ var getSetRecord = __webpack_require__(3789);
2420
+ var iterateSimple = __webpack_require__(507);
2421
+
2422
+ var add = SetHelpers.add;
2423
+ var has = SetHelpers.has;
2424
+ var remove = SetHelpers.remove;
2425
+
2426
+ // `Set.prototype.symmetricDifference` method
2427
+ // https://github.com/tc39/proposal-set-methods
2428
+ module.exports = function symmetricDifference(other) {
2429
+ var O = aSet(this);
2430
+ var keysIter = getSetRecord(other).getIterator();
2431
+ var result = clone(O);
2432
+ iterateSimple(keysIter, function (e) {
2433
+ if (has(O, e)) remove(result, e);
2434
+ else add(result, e);
2435
+ });
2436
+ return result;
2437
+ };
2438
+
2439
+
2440
+ /***/ }),
2441
+
2442
+ /***/ 4204:
2443
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
2444
+
2445
+ "use strict";
2446
+
2447
+ var aSet = __webpack_require__(7080);
2448
+ var add = (__webpack_require__(4402).add);
2449
+ var clone = __webpack_require__(9286);
2450
+ var getSetRecord = __webpack_require__(3789);
2451
+ var iterateSimple = __webpack_require__(507);
2452
+
2453
+ // `Set.prototype.union` method
2454
+ // https://github.com/tc39/proposal-set-methods
2455
+ module.exports = function union(other) {
2456
+ var O = aSet(this);
2457
+ var keysIter = getSetRecord(other).getIterator();
2458
+ var result = clone(O);
2459
+ iterateSimple(keysIter, function (it) {
2460
+ add(result, it);
2461
+ });
2462
+ return result;
2463
+ };
2464
+
2465
+
2015
2466
  /***/ }),
2016
2467
 
2017
2468
  /***/ 6119:
@@ -2622,46 +3073,178 @@ $({ target: 'Iterator', proto: true, real: true }, {
2622
3073
 
2623
3074
  /***/ }),
2624
3075
 
2625
- /***/ 8992:
3076
+ /***/ 7642:
2626
3077
  /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
2627
3078
 
2628
3079
  "use strict";
2629
3080
 
2630
- // TODO: Remove from `core-js@4`
2631
- __webpack_require__(8111);
3081
+ var $ = __webpack_require__(6518);
3082
+ var difference = __webpack_require__(3440);
3083
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3084
+
3085
+ // `Set.prototype.difference` method
3086
+ // https://tc39.es/ecma262/#sec-set.prototype.difference
3087
+ $({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('difference') }, {
3088
+ difference: difference
3089
+ });
2632
3090
 
2633
3091
 
2634
3092
  /***/ }),
2635
3093
 
2636
- /***/ 4520:
3094
+ /***/ 8004:
2637
3095
  /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
2638
3096
 
2639
3097
  "use strict";
2640
3098
 
2641
- // TODO: Remove from `core-js@4`
2642
- __webpack_require__(2489);
3099
+ var $ = __webpack_require__(6518);
3100
+ var fails = __webpack_require__(9039);
3101
+ var intersection = __webpack_require__(8750);
3102
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3103
+
3104
+ var INCORRECT = !setMethodAcceptSetLike('intersection') || fails(function () {
3105
+ // eslint-disable-next-line es/no-array-from, es/no-set -- testing
3106
+ return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2';
3107
+ });
3108
+
3109
+ // `Set.prototype.intersection` method
3110
+ // https://tc39.es/ecma262/#sec-set.prototype.intersection
3111
+ $({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {
3112
+ intersection: intersection
3113
+ });
2643
3114
 
2644
3115
 
2645
3116
  /***/ }),
2646
3117
 
2647
- /***/ 3949:
3118
+ /***/ 3853:
2648
3119
  /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
2649
3120
 
2650
3121
  "use strict";
2651
3122
 
2652
- // TODO: Remove from `core-js@4`
2653
- __webpack_require__(7588);
3123
+ var $ = __webpack_require__(6518);
3124
+ var isDisjointFrom = __webpack_require__(4449);
3125
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3126
+
3127
+ // `Set.prototype.isDisjointFrom` method
3128
+ // https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom
3129
+ $({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isDisjointFrom') }, {
3130
+ isDisjointFrom: isDisjointFrom
3131
+ });
2654
3132
 
2655
3133
 
2656
3134
  /***/ }),
2657
3135
 
2658
- /***/ 1454:
3136
+ /***/ 5876:
2659
3137
  /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
2660
3138
 
2661
3139
  "use strict";
2662
3140
 
2663
- // TODO: Remove from `core-js@4`
2664
- __webpack_require__(1701);
3141
+ var $ = __webpack_require__(6518);
3142
+ var isSubsetOf = __webpack_require__(3838);
3143
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3144
+
3145
+ // `Set.prototype.isSubsetOf` method
3146
+ // https://tc39.es/ecma262/#sec-set.prototype.issubsetof
3147
+ $({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSubsetOf') }, {
3148
+ isSubsetOf: isSubsetOf
3149
+ });
3150
+
3151
+
3152
+ /***/ }),
3153
+
3154
+ /***/ 2475:
3155
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3156
+
3157
+ "use strict";
3158
+
3159
+ var $ = __webpack_require__(6518);
3160
+ var isSupersetOf = __webpack_require__(8527);
3161
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3162
+
3163
+ // `Set.prototype.isSupersetOf` method
3164
+ // https://tc39.es/ecma262/#sec-set.prototype.issupersetof
3165
+ $({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSupersetOf') }, {
3166
+ isSupersetOf: isSupersetOf
3167
+ });
3168
+
3169
+
3170
+ /***/ }),
3171
+
3172
+ /***/ 5024:
3173
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3174
+
3175
+ "use strict";
3176
+
3177
+ var $ = __webpack_require__(6518);
3178
+ var symmetricDifference = __webpack_require__(3650);
3179
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3180
+
3181
+ // `Set.prototype.symmetricDifference` method
3182
+ // https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference
3183
+ $({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('symmetricDifference') }, {
3184
+ symmetricDifference: symmetricDifference
3185
+ });
3186
+
3187
+
3188
+ /***/ }),
3189
+
3190
+ /***/ 1698:
3191
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3192
+
3193
+ "use strict";
3194
+
3195
+ var $ = __webpack_require__(6518);
3196
+ var union = __webpack_require__(4204);
3197
+ var setMethodAcceptSetLike = __webpack_require__(4916);
3198
+
3199
+ // `Set.prototype.union` method
3200
+ // https://tc39.es/ecma262/#sec-set.prototype.union
3201
+ $({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('union') }, {
3202
+ union: union
3203
+ });
3204
+
3205
+
3206
+ /***/ }),
3207
+
3208
+ /***/ 8992:
3209
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3210
+
3211
+ "use strict";
3212
+
3213
+ // TODO: Remove from `core-js@4`
3214
+ __webpack_require__(8111);
3215
+
3216
+
3217
+ /***/ }),
3218
+
3219
+ /***/ 4520:
3220
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3221
+
3222
+ "use strict";
3223
+
3224
+ // TODO: Remove from `core-js@4`
3225
+ __webpack_require__(2489);
3226
+
3227
+
3228
+ /***/ }),
3229
+
3230
+ /***/ 3949:
3231
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3232
+
3233
+ "use strict";
3234
+
3235
+ // TODO: Remove from `core-js@4`
3236
+ __webpack_require__(7588);
3237
+
3238
+
3239
+ /***/ }),
3240
+
3241
+ /***/ 1454:
3242
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3243
+
3244
+ "use strict";
3245
+
3246
+ // TODO: Remove from `core-js@4`
3247
+ __webpack_require__(1701);
2665
3248
 
2666
3249
 
2667
3250
  /***/ }),
@@ -2772,7 +3355,7 @@ __webpack_require__.r(__webpack_exports__);
2772
3355
  // EXPORTS
2773
3356
  __webpack_require__.d(__webpack_exports__, {
2774
3357
  "default": function() { return /* binding */ entry_lib; },
2775
- ganttChart: function() { return /* reexport */ components_GanttElastic; }
3358
+ ganttChart: function() { return /* reexport */ GanttElastic_standalone; }
2776
3359
  });
2777
3360
 
2778
3361
  ;// ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js
@@ -2792,8 +3375,34 @@ if (typeof window !== 'undefined') {
2792
3375
  // Indicate to webpack that this file can be concatenated
2793
3376
  /* harmony default export */ var setPublicPath = (null);
2794
3377
 
2795
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
3378
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
2796
3379
  var render = function render() {
3380
+ var _vm = this,
3381
+ _c = _vm._self._c;
3382
+ return _c('gantt-elastic', {
3383
+ attrs: {
3384
+ "tasks": _vm.tasks,
3385
+ "options": _vm.options,
3386
+ "dynamicStyle": _vm.dynamicStyle
3387
+ }
3388
+ }, [_vm.components.header ? _c(_vm.components.header, {
3389
+ tag: "component",
3390
+ attrs: {
3391
+ "slot": "header"
3392
+ },
3393
+ slot: "header"
3394
+ }) : _vm._e(), _vm.components.footer ? _c(_vm.components.footer, {
3395
+ tag: "component",
3396
+ attrs: {
3397
+ "slot": "footer"
3398
+ },
3399
+ slot: "footer"
3400
+ }) : _vm._e()], 1);
3401
+ };
3402
+ var staticRenderFns = [];
3403
+
3404
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
3405
+ var GanttElasticvue_type_template_id_2767341e_render = function render() {
2797
3406
  var _vm = this,
2798
3407
  _c = _vm._self._c,
2799
3408
  _setup = _vm._self._setupProxy;
@@ -2807,14 +3416,36 @@ var render = function render() {
2807
3416
  "slot": "header"
2808
3417
  },
2809
3418
  slot: "header"
2810
- }) : _vm._e(), _vm._t("header"), _c('main-view', {
3419
+ }) : _vm._e(), _c('gantt-view-filter', {
3420
+ attrs: {
3421
+ "slot": "header"
3422
+ },
3423
+ on: {
3424
+ "view-mode-changed": _vm.onViewModeChanged
3425
+ },
3426
+ slot: "header"
3427
+ }), _vm._t("header"), _c('main-view', {
2811
3428
  ref: "mainView"
2812
3429
  }), _vm._t("footer")], 2);
2813
3430
  };
2814
- var staticRenderFns = [];
3431
+ var GanttElasticvue_type_template_id_2767341e_staticRenderFns = [];
2815
3432
 
2816
3433
  // EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js
2817
3434
  var es_array_push = __webpack_require__(4114);
3435
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.difference.v2.js
3436
+ var es_set_difference_v2 = __webpack_require__(7642);
3437
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.intersection.v2.js
3438
+ var es_set_intersection_v2 = __webpack_require__(8004);
3439
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js
3440
+ var es_set_is_disjoint_from_v2 = __webpack_require__(3853);
3441
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-subset-of.v2.js
3442
+ var es_set_is_subset_of_v2 = __webpack_require__(5876);
3443
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-superset-of.v2.js
3444
+ var es_set_is_superset_of_v2 = __webpack_require__(2475);
3445
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js
3446
+ var es_set_symmetric_difference_v2 = __webpack_require__(5024);
3447
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.union.v2.js
3448
+ var es_set_union_v2 = __webpack_require__(1698);
2818
3449
  // EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.constructor.js
2819
3450
  var esnext_iterator_constructor = __webpack_require__(8992);
2820
3451
  // EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.filter.js
@@ -2828,8 +3459,220 @@ var esnext_iterator_reduce = __webpack_require__(8872);
2828
3459
  // EXTERNAL MODULE: ./node_modules/dayjs/dayjs.min.js
2829
3460
  var dayjs_min = __webpack_require__(4353);
2830
3461
  var dayjs_min_default = /*#__PURE__*/__webpack_require__.n(dayjs_min);
2831
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
2832
- var MainViewvue_type_template_id_5e6f381a_render = function render() {
3462
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
3463
+ var GanttViewFiltervue_type_template_id_f4bb58fc_scoped_true_render = function render() {
3464
+ var _vm = this,
3465
+ _c = _vm._self._c;
3466
+ return _c('div', {
3467
+ staticClass: "gantt-view-filter"
3468
+ }, [_c('div', {
3469
+ staticClass: "view-toggle-group"
3470
+ }, [_c('button', {
3471
+ staticClass: "view-toggle-btn",
3472
+ class: {
3473
+ active: _vm.viewMode === 'day'
3474
+ },
3475
+ on: {
3476
+ "click": function ($event) {
3477
+ return _vm.changeViewMode('day');
3478
+ }
3479
+ }
3480
+ }, [_c('span', {
3481
+ staticClass: "view-icon"
3482
+ }, [_vm._v("📅")]), _c('span', {
3483
+ staticClass: "view-label"
3484
+ }, [_vm._v("Day")])]), _c('button', {
3485
+ staticClass: "view-toggle-btn",
3486
+ class: {
3487
+ active: _vm.viewMode === 'week'
3488
+ },
3489
+ on: {
3490
+ "click": function ($event) {
3491
+ return _vm.changeViewMode('week');
3492
+ }
3493
+ }
3494
+ }, [_c('span', {
3495
+ staticClass: "view-icon"
3496
+ }, [_vm._v("📊")]), _c('span', {
3497
+ staticClass: "view-label"
3498
+ }, [_vm._v("Week")])]), _c('button', {
3499
+ staticClass: "view-toggle-btn",
3500
+ class: {
3501
+ active: _vm.viewMode === 'month'
3502
+ },
3503
+ on: {
3504
+ "click": function ($event) {
3505
+ return _vm.changeViewMode('month');
3506
+ }
3507
+ }
3508
+ }, [_c('span', {
3509
+ staticClass: "view-icon"
3510
+ }, [_vm._v("🗓️")]), _c('span', {
3511
+ staticClass: "view-label"
3512
+ }, [_vm._v("Month")])]), _c('button', {
3513
+ staticClass: "view-toggle-btn",
3514
+ class: {
3515
+ active: _vm.viewMode === 'quarter'
3516
+ },
3517
+ on: {
3518
+ "click": function ($event) {
3519
+ return _vm.changeViewMode('quarter');
3520
+ }
3521
+ }
3522
+ }, [_c('span', {
3523
+ staticClass: "view-icon"
3524
+ }, [_vm._v("📈")]), _c('span', {
3525
+ staticClass: "view-label"
3526
+ }, [_vm._v("Quarter")])])])]);
3527
+ };
3528
+ var GanttViewFiltervue_type_template_id_f4bb58fc_scoped_true_staticRenderFns = [];
3529
+
3530
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Header/GanttViewFilter.vue?vue&type=script&lang=js
3531
+ /* harmony default export */ var GanttViewFiltervue_type_script_lang_js = ({
3532
+ name: 'GanttViewFilter',
3533
+ data() {
3534
+ return {
3535
+ viewMode: 'day' // default view mode
3536
+ };
3537
+ },
3538
+ methods: {
3539
+ changeViewMode(mode) {
3540
+ // eslint-disable-next-line no-debugger
3541
+ debugger;
3542
+ this.viewMode = mode;
3543
+ // Emit an event to the parent component (App.vue) so it can update the Gantt chart
3544
+ this.$emit('view-mode-changed', mode);
3545
+ }
3546
+ }
3547
+ });
3548
+ ;// ./src/components/Header/GanttViewFilter.vue?vue&type=script&lang=js
3549
+ /* harmony default export */ var Header_GanttViewFiltervue_type_script_lang_js = (GanttViewFiltervue_type_script_lang_js);
3550
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.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
3551
+ // extracted by mini-css-extract-plugin
3552
+
3553
+ ;// ./src/components/Header/GanttViewFilter.vue?vue&type=style&index=0&id=f4bb58fc&prod&scoped=true&lang=css
3554
+
3555
+ ;// ./node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js
3556
+ /* globals __VUE_SSR_CONTEXT__ */
3557
+
3558
+ // IMPORTANT: Do NOT use ES2015 features in this file (except for modules).
3559
+ // This module is a runtime utility for cleaner component module output and will
3560
+ // be included in the final webpack user bundle.
3561
+
3562
+ function normalizeComponent(
3563
+ scriptExports,
3564
+ render,
3565
+ staticRenderFns,
3566
+ functionalTemplate,
3567
+ injectStyles,
3568
+ scopeId,
3569
+ moduleIdentifier /* server only */,
3570
+ shadowMode /* vue-cli only */
3571
+ ) {
3572
+ // Vue.extend constructor export interop
3573
+ var options =
3574
+ typeof scriptExports === 'function' ? scriptExports.options : scriptExports
3575
+
3576
+ // render functions
3577
+ if (render) {
3578
+ options.render = render
3579
+ options.staticRenderFns = staticRenderFns
3580
+ options._compiled = true
3581
+ }
3582
+
3583
+ // functional template
3584
+ if (functionalTemplate) {
3585
+ options.functional = true
3586
+ }
3587
+
3588
+ // scopedId
3589
+ if (scopeId) {
3590
+ options._scopeId = 'data-v-' + scopeId
3591
+ }
3592
+
3593
+ var hook
3594
+ if (moduleIdentifier) {
3595
+ // server build
3596
+ hook = function (context) {
3597
+ // 2.3 injection
3598
+ context =
3599
+ context || // cached call
3600
+ (this.$vnode && this.$vnode.ssrContext) || // stateful
3601
+ (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional
3602
+ // 2.2 with runInNewContext: true
3603
+ if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
3604
+ context = __VUE_SSR_CONTEXT__
3605
+ }
3606
+ // inject component styles
3607
+ if (injectStyles) {
3608
+ injectStyles.call(this, context)
3609
+ }
3610
+ // register component module identifier for async chunk inferrence
3611
+ if (context && context._registeredComponents) {
3612
+ context._registeredComponents.add(moduleIdentifier)
3613
+ }
3614
+ }
3615
+ // used by ssr in case component is cached and beforeCreate
3616
+ // never gets called
3617
+ options._ssrRegister = hook
3618
+ } else if (injectStyles) {
3619
+ hook = shadowMode
3620
+ ? function () {
3621
+ injectStyles.call(
3622
+ this,
3623
+ (options.functional ? this.parent : this).$root.$options.shadowRoot
3624
+ )
3625
+ }
3626
+ : injectStyles
3627
+ }
3628
+
3629
+ if (hook) {
3630
+ if (options.functional) {
3631
+ // for template-only hot-reload because in that case the render fn doesn't
3632
+ // go through the normalizer
3633
+ options._injectStyles = hook
3634
+ // register for functional component in vue file
3635
+ var originalRender = options.render
3636
+ options.render = function renderWithStyleInjection(h, context) {
3637
+ hook.call(context)
3638
+ return originalRender(h, context)
3639
+ }
3640
+ } else {
3641
+ // inject component registration as beforeCreate hook
3642
+ var existing = options.beforeCreate
3643
+ options.beforeCreate = existing ? [].concat(existing, hook) : [hook]
3644
+ }
3645
+ }
3646
+
3647
+ return {
3648
+ exports: scriptExports,
3649
+ options: options
3650
+ }
3651
+ }
3652
+
3653
+ ;// ./src/components/Header/GanttViewFilter.vue
3654
+
3655
+
3656
+
3657
+ ;
3658
+
3659
+
3660
+ /* normalize component */
3661
+
3662
+ var component = normalizeComponent(
3663
+ Header_GanttViewFiltervue_type_script_lang_js,
3664
+ GanttViewFiltervue_type_template_id_f4bb58fc_scoped_true_render,
3665
+ GanttViewFiltervue_type_template_id_f4bb58fc_scoped_true_staticRenderFns,
3666
+ false,
3667
+ null,
3668
+ "f4bb58fc",
3669
+ null
3670
+
3671
+ )
3672
+
3673
+ /* harmony default export */ var GanttViewFilter = (component.exports);
3674
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
3675
+ var MainViewvue_type_template_id_1a4b756c_render = function render() {
2833
3676
  var _vm = this,
2834
3677
  _c = _vm._self._c;
2835
3678
  return _c('div', {
@@ -2934,10 +3777,10 @@ var MainViewvue_type_template_id_5e6f381a_render = function render() {
2934
3777
  }
2935
3778
  })])]);
2936
3779
  };
2937
- var MainViewvue_type_template_id_5e6f381a_staticRenderFns = [];
3780
+ var MainViewvue_type_template_id_1a4b756c_staticRenderFns = [];
2938
3781
 
2939
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
2940
- var TaskListvue_type_template_id_088baa0d_render = function render() {
3782
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
3783
+ var TaskListvue_type_template_id_74ce1216_render = function render() {
2941
3784
  var _vm = this,
2942
3785
  _c = _vm._self._c;
2943
3786
  return _c('div', {
@@ -2976,10 +3819,10 @@ var TaskListvue_type_template_id_088baa0d_render = function render() {
2976
3819
  });
2977
3820
  }), 1)], 1)]);
2978
3821
  };
2979
- var TaskListvue_type_template_id_088baa0d_staticRenderFns = [];
3822
+ var TaskListvue_type_template_id_74ce1216_staticRenderFns = [];
2980
3823
 
2981
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
2982
- var TaskListHeadervue_type_template_id_8ade0cf0_render = function render() {
3824
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
3825
+ var TaskListHeadervue_type_template_id_2ecc0032_render = function render() {
2983
3826
  var _vm = this,
2984
3827
  _c = _vm._self._c;
2985
3828
  return _c('div', {
@@ -3027,10 +3870,10 @@ var TaskListHeadervue_type_template_id_8ade0cf0_render = function render() {
3027
3870
  }), 0)])], 1);
3028
3871
  }), 0);
3029
3872
  };
3030
- var TaskListHeadervue_type_template_id_8ade0cf0_staticRenderFns = [];
3873
+ var TaskListHeadervue_type_template_id_2ecc0032_staticRenderFns = [];
3031
3874
 
3032
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
3033
- var Expandervue_type_template_id_41972c7c_render = function render() {
3875
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
3876
+ var Expandervue_type_template_id_ac398cf4_render = function render() {
3034
3877
  var _vm = this,
3035
3878
  _c = _vm._self._c;
3036
3879
  return _c('div', {
@@ -3046,52 +3889,30 @@ var Expandervue_type_template_id_41972c7c_render = function render() {
3046
3889
  },
3047
3890
  attrs: {
3048
3891
  "width": _vm.options.size,
3049
- "height": _vm.options.size
3892
+ "height": _vm.options.size,
3893
+ "viewBox": "0 0 16 16"
3050
3894
  },
3051
3895
  on: {
3052
3896
  "click": _vm.toggle
3053
3897
  }
3054
- }, [_c('rect', {
3055
- class: _vm.getClassPrefix() + '-border',
3056
- style: {
3057
- ..._vm.root.style[_vm.getClassPrefix(false) + '-border'],
3058
- ..._vm.borderStyle
3059
- },
3060
- attrs: {
3061
- "x": _vm.border,
3062
- "y": _vm.border,
3063
- "width": _vm.options.size - _vm.border * 2,
3064
- "height": _vm.options.size - _vm.border * 2,
3065
- "rx": "2",
3066
- "ry": "2"
3067
- }
3068
- }), _vm.allChildren.length ? _c('line', {
3069
- class: _vm.getClassPrefix() + '-line',
3898
+ }, [_c('path', {
3899
+ class: _vm.getClassPrefix() + '-arrow',
3070
3900
  style: {
3071
- ..._vm.root.style[_vm.getClassPrefix(false) + '-line']
3901
+ ..._vm.root.style[_vm.getClassPrefix(false) + '-arrow']
3072
3902
  },
3073
3903
  attrs: {
3074
- "x1": _vm.lineOffset,
3075
- "y1": _vm.options.size / 2,
3076
- "x2": _vm.options.size - _vm.lineOffset,
3077
- "y2": _vm.options.size / 2
3904
+ "d": _vm.collapsed ? 'M6 4 L10 8 L6 12' : 'M4 6 L8 10 L12 6',
3905
+ "fill": "none",
3906
+ "stroke": "currentColor",
3907
+ "stroke-width": "2",
3908
+ "stroke-linecap": "round",
3909
+ "stroke-linejoin": "round"
3078
3910
  }
3079
- }) : _vm._e(), _vm.collapsed ? _c('line', {
3080
- class: _vm.getClassPrefix() + '-line',
3081
- style: {
3082
- ..._vm.root.style[_vm.getClassPrefix(false) + '-line']
3083
- },
3084
- attrs: {
3085
- "x1": _vm.options.size / 2,
3086
- "y1": _vm.lineOffset,
3087
- "x2": _vm.options.size / 2,
3088
- "y2": _vm.options.size - _vm.lineOffset
3089
- }
3090
- }) : _vm._e()]) : _vm._e()]);
3911
+ })]) : _vm._e()]);
3091
3912
  };
3092
- var Expandervue_type_template_id_41972c7c_staticRenderFns = [];
3913
+ var Expandervue_type_template_id_ac398cf4_staticRenderFns = [];
3093
3914
 
3094
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/Expander.vue?vue&type=script&lang=js
3915
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Expander.vue?vue&type=script&lang=js
3095
3916
 
3096
3917
 
3097
3918
 
@@ -3173,110 +3994,16 @@ var Expandervue_type_template_id_41972c7c_staticRenderFns = [];
3173
3994
  this.tasks.forEach(task => {
3174
3995
  task.collapsed = collapsed;
3175
3996
  });
3997
+
3998
+ // Force reactivity update
3999
+ this.$forceUpdate();
4000
+ this.root.$forceUpdate();
3176
4001
  }
3177
4002
  }
3178
4003
  });
3179
- ;// ./src/components/components/Expander.vue?vue&type=script&lang=js
4004
+ ;// ./src/components/Expander.vue?vue&type=script&lang=js
3180
4005
  /* harmony default export */ var components_Expandervue_type_script_lang_js = (Expandervue_type_script_lang_js);
3181
- ;// ./node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js
3182
- /* globals __VUE_SSR_CONTEXT__ */
3183
-
3184
- // IMPORTANT: Do NOT use ES2015 features in this file (except for modules).
3185
- // This module is a runtime utility for cleaner component module output and will
3186
- // be included in the final webpack user bundle.
3187
-
3188
- function normalizeComponent(
3189
- scriptExports,
3190
- render,
3191
- staticRenderFns,
3192
- functionalTemplate,
3193
- injectStyles,
3194
- scopeId,
3195
- moduleIdentifier /* server only */,
3196
- shadowMode /* vue-cli only */
3197
- ) {
3198
- // Vue.extend constructor export interop
3199
- var options =
3200
- typeof scriptExports === 'function' ? scriptExports.options : scriptExports
3201
-
3202
- // render functions
3203
- if (render) {
3204
- options.render = render
3205
- options.staticRenderFns = staticRenderFns
3206
- options._compiled = true
3207
- }
3208
-
3209
- // functional template
3210
- if (functionalTemplate) {
3211
- options.functional = true
3212
- }
3213
-
3214
- // scopedId
3215
- if (scopeId) {
3216
- options._scopeId = 'data-v-' + scopeId
3217
- }
3218
-
3219
- var hook
3220
- if (moduleIdentifier) {
3221
- // server build
3222
- hook = function (context) {
3223
- // 2.3 injection
3224
- context =
3225
- context || // cached call
3226
- (this.$vnode && this.$vnode.ssrContext) || // stateful
3227
- (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional
3228
- // 2.2 with runInNewContext: true
3229
- if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
3230
- context = __VUE_SSR_CONTEXT__
3231
- }
3232
- // inject component styles
3233
- if (injectStyles) {
3234
- injectStyles.call(this, context)
3235
- }
3236
- // register component module identifier for async chunk inferrence
3237
- if (context && context._registeredComponents) {
3238
- context._registeredComponents.add(moduleIdentifier)
3239
- }
3240
- }
3241
- // used by ssr in case component is cached and beforeCreate
3242
- // never gets called
3243
- options._ssrRegister = hook
3244
- } else if (injectStyles) {
3245
- hook = shadowMode
3246
- ? function () {
3247
- injectStyles.call(
3248
- this,
3249
- (options.functional ? this.parent : this).$root.$options.shadowRoot
3250
- )
3251
- }
3252
- : injectStyles
3253
- }
3254
-
3255
- if (hook) {
3256
- if (options.functional) {
3257
- // for template-only hot-reload because in that case the render fn doesn't
3258
- // go through the normalizer
3259
- options._injectStyles = hook
3260
- // register for functional component in vue file
3261
- var originalRender = options.render
3262
- options.render = function renderWithStyleInjection(h, context) {
3263
- hook.call(context)
3264
- return originalRender(h, context)
3265
- }
3266
- } else {
3267
- // inject component registration as beforeCreate hook
3268
- var existing = options.beforeCreate
3269
- options.beforeCreate = existing ? [].concat(existing, hook) : [hook]
3270
- }
3271
- }
3272
-
3273
- return {
3274
- exports: scriptExports,
3275
- options: options
3276
- }
3277
- }
3278
-
3279
- ;// ./src/components/components/Expander.vue
4006
+ ;// ./src/components/Expander.vue
3280
4007
 
3281
4008
 
3282
4009
 
@@ -3284,10 +4011,10 @@ function normalizeComponent(
3284
4011
 
3285
4012
  /* normalize component */
3286
4013
  ;
3287
- var component = normalizeComponent(
4014
+ var Expander_component = normalizeComponent(
3288
4015
  components_Expandervue_type_script_lang_js,
3289
- Expandervue_type_template_id_41972c7c_render,
3290
- Expandervue_type_template_id_41972c7c_staticRenderFns,
4016
+ Expandervue_type_template_id_ac398cf4_render,
4017
+ Expandervue_type_template_id_ac398cf4_staticRenderFns,
3291
4018
  false,
3292
4019
  null,
3293
4020
  null,
@@ -3295,8 +4022,8 @@ var component = normalizeComponent(
3295
4022
 
3296
4023
  )
3297
4024
 
3298
- /* harmony default export */ var Expander = (component.exports);
3299
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4025
+ /* harmony default export */ var Expander = (Expander_component.exports);
4026
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/TaskListHeader.vue?vue&type=script&lang=js
3300
4027
 
3301
4028
 
3302
4029
 
@@ -3396,9 +4123,9 @@ var component = normalizeComponent(
3396
4123
  // document.removeEventListener('mousemove', this.resizerMouseMove);
3397
4124
  // }
3398
4125
  });
3399
- ;// ./src/components/components/TaskList/TaskListHeader.vue?vue&type=script&lang=js
4126
+ ;// ./src/components/TaskList/TaskListHeader.vue?vue&type=script&lang=js
3400
4127
  /* harmony default export */ var TaskList_TaskListHeadervue_type_script_lang_js = (TaskListHeadervue_type_script_lang_js);
3401
- ;// ./src/components/components/TaskList/TaskListHeader.vue
4128
+ ;// ./src/components/TaskList/TaskListHeader.vue
3402
4129
 
3403
4130
 
3404
4131
 
@@ -3408,8 +4135,8 @@ var component = normalizeComponent(
3408
4135
  ;
3409
4136
  var TaskListHeader_component = normalizeComponent(
3410
4137
  TaskList_TaskListHeadervue_type_script_lang_js,
3411
- TaskListHeadervue_type_template_id_8ade0cf0_render,
3412
- TaskListHeadervue_type_template_id_8ade0cf0_staticRenderFns,
4138
+ TaskListHeadervue_type_template_id_2ecc0032_render,
4139
+ TaskListHeadervue_type_template_id_2ecc0032_staticRenderFns,
3413
4140
  false,
3414
4141
  null,
3415
4142
  null,
@@ -3418,8 +4145,8 @@ var TaskListHeader_component = normalizeComponent(
3418
4145
  )
3419
4146
 
3420
4147
  /* harmony default export */ var TaskListHeader = (TaskListHeader_component.exports);
3421
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
3422
- var TaskListItemvue_type_template_id_602cdfed_render = function render() {
4148
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4149
+ var TaskListItemvue_type_template_id_b99d1d94_render = function render() {
3423
4150
  var _vm = this,
3424
4151
  _c = _vm._self._c;
3425
4152
  return _c('div', {
@@ -3443,10 +4170,10 @@ var TaskListItemvue_type_template_id_602cdfed_render = function render() {
3443
4170
  }) : _vm._e()], 1);
3444
4171
  }), 1);
3445
4172
  };
3446
- var TaskListItemvue_type_template_id_602cdfed_staticRenderFns = [];
4173
+ var TaskListItemvue_type_template_id_b99d1d94_staticRenderFns = [];
3447
4174
 
3448
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
3449
- var ItemColumnvue_type_template_id_0b2903fd_render = function render() {
4175
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4176
+ var ItemColumnvue_type_template_id_f410efbc_render = function render() {
3450
4177
  var _vm = this,
3451
4178
  _c = _vm._self._c;
3452
4179
  return _c('div', {
@@ -3496,12 +4223,28 @@ var ItemColumnvue_type_template_id_0b2903fd_render = function render() {
3496
4223
  return _vm.emitEvent('touchend', $event);
3497
4224
  }
3498
4225
  }
3499
- }, [_vm._v(" " + _vm._s(_vm.value) + " ")]) : _c('div', {
4226
+ }, [_vm.column.expander && _vm.taskIcon ? _c('div', {
4227
+ staticClass: "gantt-elastic__task-list-item-icon",
4228
+ style: _vm.iconStyle
4229
+ }, [_c('svg', {
4230
+ attrs: {
4231
+ "width": "14",
4232
+ "height": "14",
4233
+ "viewBox": "0 0 14 14",
4234
+ "fill": "none"
4235
+ }
4236
+ }, [_c('path', {
4237
+ attrs: {
4238
+ "d": _vm.taskIcon,
4239
+ "fill": _vm.iconColor,
4240
+ "stroke": _vm.iconStroke,
4241
+ "stroke-width": "0.8"
4242
+ }
4243
+ })])]) : _vm._e(), _c('span', {
4244
+ staticClass: "gantt-elastic__task-list-item-text"
4245
+ }, [_vm._v(_vm._s(_vm.value))])]) : _c('div', {
3500
4246
  staticClass: "gantt-elastic__task-list-item-value",
3501
4247
  style: _vm.valueStyle,
3502
- domProps: {
3503
- "innerHTML": _vm._s(_vm.value)
3504
- },
3505
4248
  on: {
3506
4249
  "click": function ($event) {
3507
4250
  return _vm.emitEvent('click', $event);
@@ -3537,11 +4280,33 @@ var ItemColumnvue_type_template_id_0b2903fd_render = function render() {
3537
4280
  return _vm.emitEvent('touchend', $event);
3538
4281
  }
3539
4282
  }
3540
- })])], 2)]);
4283
+ }, [_vm.column.expander && _vm.taskIcon ? _c('div', {
4284
+ staticClass: "gantt-elastic__task-list-item-icon",
4285
+ style: _vm.iconStyle
4286
+ }, [_c('svg', {
4287
+ attrs: {
4288
+ "width": "14",
4289
+ "height": "14",
4290
+ "viewBox": "0 0 14 14",
4291
+ "fill": "none"
4292
+ }
4293
+ }, [_c('path', {
4294
+ attrs: {
4295
+ "d": _vm.taskIcon,
4296
+ "fill": _vm.iconColor,
4297
+ "stroke": _vm.iconStroke,
4298
+ "stroke-width": "0.8"
4299
+ }
4300
+ })])]) : _vm._e(), _c('span', {
4301
+ staticClass: "gantt-elastic__task-list-item-text",
4302
+ domProps: {
4303
+ "innerHTML": _vm._s(_vm.value)
4304
+ }
4305
+ })])])], 2)]);
3541
4306
  };
3542
- var ItemColumnvue_type_template_id_0b2903fd_staticRenderFns = [];
4307
+ var ItemColumnvue_type_template_id_f410efbc_staticRenderFns = [];
3543
4308
 
3544
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4309
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/ItemColumn.vue?vue&type=script&lang=js
3545
4310
  /* harmony default export */ var ItemColumnvue_type_script_lang_js = ({
3546
4311
  name: 'ItemColumn',
3547
4312
  inject: ['root'],
@@ -3619,12 +4384,101 @@ var ItemColumnvue_type_template_id_0b2903fd_staticRenderFns = [];
3619
4384
  ...this.root.style['task-list-item-value'],
3620
4385
  ...this.column.style['task-list-item-value']
3621
4386
  };
4387
+ },
4388
+ /**
4389
+ * Get task icon based on task type or custom icon property
4390
+ *
4391
+ * @returns {string|null}
4392
+ */
4393
+ taskIcon() {
4394
+ // Check if task has a custom icon property
4395
+ if (this.task.icon) {
4396
+ return this.task.icon;
4397
+ }
4398
+
4399
+ // Default icons based on task type - matching the interface
4400
+ const iconMap = {
4401
+ 'milestone': 'M7 2 L12 7 L7 12 L2 7 Z',
4402
+ // Purple diamond for milestones
4403
+ 'task': 'M3 3 L11 3 L11 11 L3 11 Z',
4404
+ // Blue square for tasks
4405
+ 'project': 'M7 2 L12 7 L7 12 L2 7 Z',
4406
+ // Purple diamond for projects
4407
+ 'sprint': 'M3 4 L11 4 L11 10 L3 10 Z',
4408
+ // Rectangle for sprints
4409
+ 'flag': 'M3 3 L9 3 L9 7 L7 9 L5 7 L5 3 Z M3 3 L3 11 M5 3 L5 11',
4410
+ // Green flag
4411
+ 'check': 'M3 3 L11 3 L11 11 L3 11 Z M5 7 L7 9 L9 5',
4412
+ // Blue checkmark in square
4413
+ 'epic': 'M7 2 L12 7 L7 12 L2 7 Z' // Purple diamond for epics
4414
+ };
4415
+
4416
+ // Always return an icon for tasks, default to task icon if type not found
4417
+ return iconMap[this.task.type] || iconMap['task'];
4418
+ },
4419
+ /**
4420
+ * Get icon color based on task properties
4421
+ *
4422
+ * @returns {string}
4423
+ */
4424
+ iconColor() {
4425
+ if (this.task.iconColor) {
4426
+ return this.task.iconColor;
4427
+ }
4428
+
4429
+ // Default colors based on task type - matching chart grid bar colors
4430
+ const colorMap = {
4431
+ 'milestone': '#CD5C5C',
4432
+ // Light maroon - matches chart
4433
+ 'task': '#3B82F6',
4434
+ // Blue - matches chart
4435
+ 'project': '#8B5CF6',
4436
+ // Purple - matches chart
4437
+ 'sprint': '#F59E0B',
4438
+ // Orange rectangle
4439
+ 'flag': '#10B981',
4440
+ // Green flag
4441
+ 'check': '#3B82F6',
4442
+ // Blue checkmark
4443
+ 'epic': '#8B5CF6',
4444
+ // Purple - matches chart
4445
+ 'story': '#86EFAC',
4446
+ // Light green - matches chart
4447
+ 'subtask': '#3B82F6' // Blue - matches chart
4448
+ };
4449
+ return colorMap[this.task.type] || '#6B7280'; // Gray default
4450
+ },
4451
+ /**
4452
+ * Get icon stroke color
4453
+ *
4454
+ * @returns {string}
4455
+ */
4456
+ iconStroke() {
4457
+ if (this.task.iconStroke) {
4458
+ return this.task.iconStroke;
4459
+ }
4460
+ return this.iconColor; // Same as fill color
4461
+ },
4462
+ /**
4463
+ * Get icon style
4464
+ *
4465
+ * @returns {object}
4466
+ */
4467
+ iconStyle() {
4468
+ return {
4469
+ display: 'flex',
4470
+ alignItems: 'center',
4471
+ marginRight: '6px',
4472
+ flexShrink: 0,
4473
+ width: '14px',
4474
+ height: '14px'
4475
+ };
3622
4476
  }
3623
4477
  }
3624
4478
  });
3625
- ;// ./src/components/components/TaskList/ItemColumn.vue?vue&type=script&lang=js
4479
+ ;// ./src/components/TaskList/ItemColumn.vue?vue&type=script&lang=js
3626
4480
  /* harmony default export */ var TaskList_ItemColumnvue_type_script_lang_js = (ItemColumnvue_type_script_lang_js);
3627
- ;// ./src/components/components/TaskList/ItemColumn.vue
4481
+ ;// ./src/components/TaskList/ItemColumn.vue
3628
4482
 
3629
4483
 
3630
4484
 
@@ -3634,8 +4488,8 @@ var ItemColumnvue_type_template_id_0b2903fd_staticRenderFns = [];
3634
4488
  ;
3635
4489
  var ItemColumn_component = normalizeComponent(
3636
4490
  TaskList_ItemColumnvue_type_script_lang_js,
3637
- ItemColumnvue_type_template_id_0b2903fd_render,
3638
- ItemColumnvue_type_template_id_0b2903fd_staticRenderFns,
4491
+ ItemColumnvue_type_template_id_f410efbc_render,
4492
+ ItemColumnvue_type_template_id_f410efbc_staticRenderFns,
3639
4493
  false,
3640
4494
  null,
3641
4495
  null,
@@ -3644,7 +4498,7 @@ var ItemColumn_component = normalizeComponent(
3644
4498
  )
3645
4499
 
3646
4500
  /* harmony default export */ var ItemColumn = (ItemColumn_component.exports);
3647
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4501
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/TaskListItem.vue?vue&type=script&lang=js
3648
4502
 
3649
4503
 
3650
4504
  /* harmony default export */ var TaskListItemvue_type_script_lang_js = ({
@@ -3664,9 +4518,9 @@ var ItemColumn_component = normalizeComponent(
3664
4518
  }
3665
4519
  }
3666
4520
  });
3667
- ;// ./src/components/components/TaskList/TaskListItem.vue?vue&type=script&lang=js
4521
+ ;// ./src/components/TaskList/TaskListItem.vue?vue&type=script&lang=js
3668
4522
  /* harmony default export */ var TaskList_TaskListItemvue_type_script_lang_js = (TaskListItemvue_type_script_lang_js);
3669
- ;// ./src/components/components/TaskList/TaskListItem.vue
4523
+ ;// ./src/components/TaskList/TaskListItem.vue
3670
4524
 
3671
4525
 
3672
4526
 
@@ -3676,8 +4530,8 @@ var ItemColumn_component = normalizeComponent(
3676
4530
  ;
3677
4531
  var TaskListItem_component = normalizeComponent(
3678
4532
  TaskList_TaskListItemvue_type_script_lang_js,
3679
- TaskListItemvue_type_template_id_602cdfed_render,
3680
- TaskListItemvue_type_template_id_602cdfed_staticRenderFns,
4533
+ TaskListItemvue_type_template_id_b99d1d94_render,
4534
+ TaskListItemvue_type_template_id_b99d1d94_staticRenderFns,
3681
4535
  false,
3682
4536
  null,
3683
4537
  null,
@@ -3686,7 +4540,7 @@ var TaskListItem_component = normalizeComponent(
3686
4540
  )
3687
4541
 
3688
4542
  /* harmony default export */ var TaskListItem = (TaskListItem_component.exports);
3689
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4543
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/TaskList.vue?vue&type=script&lang=js
3690
4544
 
3691
4545
 
3692
4546
  /* harmony default export */ var TaskListvue_type_script_lang_js = ({
@@ -3708,9 +4562,9 @@ var TaskListItem_component = normalizeComponent(
3708
4562
  this.root.state.refs.taskListItems = this.$refs.taskListItems;
3709
4563
  }
3710
4564
  });
3711
- ;// ./src/components/components/TaskList/TaskList.vue?vue&type=script&lang=js
4565
+ ;// ./src/components/TaskList/TaskList.vue?vue&type=script&lang=js
3712
4566
  /* harmony default export */ var TaskList_TaskListvue_type_script_lang_js = (TaskListvue_type_script_lang_js);
3713
- ;// ./src/components/components/TaskList/TaskList.vue
4567
+ ;// ./src/components/TaskList/TaskList.vue
3714
4568
 
3715
4569
 
3716
4570
 
@@ -3720,8 +4574,8 @@ var TaskListItem_component = normalizeComponent(
3720
4574
  ;
3721
4575
  var TaskList_component = normalizeComponent(
3722
4576
  TaskList_TaskListvue_type_script_lang_js,
3723
- TaskListvue_type_template_id_088baa0d_render,
3724
- TaskListvue_type_template_id_088baa0d_staticRenderFns,
4577
+ TaskListvue_type_template_id_74ce1216_render,
4578
+ TaskListvue_type_template_id_74ce1216_staticRenderFns,
3725
4579
  false,
3726
4580
  null,
3727
4581
  null,
@@ -3730,8 +4584,8 @@ var TaskList_component = normalizeComponent(
3730
4584
  )
3731
4585
 
3732
4586
  /* harmony default export */ var TaskList = (TaskList_component.exports);
3733
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
3734
- var Chartvue_type_template_id_4ae99150_render = function render() {
4587
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4588
+ var Chartvue_type_template_id_1d5eb6d6_render = function render() {
3735
4589
  var _vm = this,
3736
4590
  _c = _vm._self._c;
3737
4591
  return _c('div', {
@@ -3803,10 +4657,10 @@ var Chartvue_type_template_id_4ae99150_render = function render() {
3803
4657
  })], 1);
3804
4658
  })], 2)])])])]);
3805
4659
  };
3806
- var Chartvue_type_template_id_4ae99150_staticRenderFns = [];
4660
+ var Chartvue_type_template_id_1d5eb6d6_staticRenderFns = [];
3807
4661
 
3808
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
3809
- var Gridvue_type_template_id_1f8d69e4_render = function render() {
4662
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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=b26116b4
4663
+ var Gridvue_type_template_id_b26116b4_render = function render() {
3810
4664
  var _vm = this,
3811
4665
  _c = _vm._self._c;
3812
4666
  return _c('svg', {
@@ -3868,9 +4722,9 @@ var Gridvue_type_template_id_1f8d69e4_render = function render() {
3868
4722
  }
3869
4723
  })], 2)]);
3870
4724
  };
3871
- var Gridvue_type_template_id_1f8d69e4_staticRenderFns = [];
4725
+ var Gridvue_type_template_id_b26116b4_staticRenderFns = [];
3872
4726
 
3873
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4727
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Grid.vue?vue&type=script&lang=js
3874
4728
 
3875
4729
 
3876
4730
 
@@ -3914,17 +4768,57 @@ var Gridvue_type_template_id_1f8d69e4_staticRenderFns = [];
3914
4768
  verticalLines() {
3915
4769
  let lines = [];
3916
4770
  const state = this.root.state;
3917
- state.options.times.steps.forEach(step => {
3918
- if (this.root.isInsideViewPort(step.offset.px, 1)) {
3919
- lines.push({
4771
+
4772
+ // Add grid lines for all steps (remove viewport check to ensure all borders are drawn)
4773
+ state.options.times.steps.forEach((step, index) => {
4774
+ // Only generate grid lines for steps with valid coordinates
4775
+ if (step.offset && typeof step.offset.px === 'number' && !isNaN(step.offset.px)) {
4776
+ const line = {
3920
4777
  key: step.time,
3921
- x1: step.offset.px,
4778
+ x1: Math.round(step.offset.px),
4779
+ // Round to ensure exact pixel alignment
3922
4780
  y1: 0,
3923
- x2: step.offset.px,
4781
+ x2: Math.round(step.offset.px),
4782
+ // Round to ensure exact pixel alignment
3924
4783
  y2: state.tasks.length * (state.options.row.height + state.options.chart.grid.horizontal.gap * 2) + this.root.style['grid-line-vertical']['stroke-width']
3925
- });
4784
+ };
4785
+ lines.push(line);
4786
+
4787
+ // Debug: Log grid lines for quarter view
4788
+ if (state.options.times.stepDuration === 'quarter') {
4789
+ console.log(`Grid Line ${index}:`, {
4790
+ x: line.x1,
4791
+ time: new Date(step.time).toISOString().split('T')[0],
4792
+ quarter: new Date(step.time).getMonth() < 3 ? 1 : new Date(step.time).getMonth() < 6 ? 2 : new Date(step.time).getMonth() < 9 ? 3 : 4,
4793
+ stepWidth: step.width?.px || 0,
4794
+ stepOffset: step.offset?.px || 0,
4795
+ hasValidX: line.x1 >= 0 && !isNaN(line.x1)
4796
+ });
4797
+ }
4798
+ } else {
4799
+ // Debug: Log steps that are being skipped
4800
+ if (state.options.times.stepDuration === 'quarter') {
4801
+ console.log(`Skipped Grid Line ${index}:`, {
4802
+ time: new Date(step.time).toISOString().split('T')[0],
4803
+ offset: step.offset,
4804
+ hasValidOffset: !!(step.offset && typeof step.offset.px === 'number' && !isNaN(step.offset.px))
4805
+ });
4806
+ }
3926
4807
  }
3927
4808
  });
4809
+
4810
+ // Add final grid line at the end of the chart area to eliminate empty space
4811
+ const lastStep = state.options.times.steps[state.options.times.steps.length - 1];
4812
+ if (lastStep) {
4813
+ const finalX = Math.round(lastStep.offset.px + lastStep.width.px);
4814
+ lines.push({
4815
+ key: 'final-line',
4816
+ x1: finalX,
4817
+ y1: 0,
4818
+ x2: finalX,
4819
+ y2: state.tasks.length * (state.options.row.height + state.options.chart.grid.horizontal.gap * 2) + this.root.style['grid-line-vertical']['stroke-width']
4820
+ });
4821
+ }
3928
4822
  return lines;
3929
4823
  },
3930
4824
  /**
@@ -3981,9 +4875,9 @@ var Gridvue_type_template_id_1f8d69e4_staticRenderFns = [];
3981
4875
  }
3982
4876
  }
3983
4877
  });
3984
- ;// ./src/components/components/Chart/Grid.vue?vue&type=script&lang=js
4878
+ ;// ./src/components/Chart/Grid.vue?vue&type=script&lang=js
3985
4879
  /* harmony default export */ var Chart_Gridvue_type_script_lang_js = (Gridvue_type_script_lang_js);
3986
- ;// ./src/components/components/Chart/Grid.vue
4880
+ ;// ./src/components/Chart/Grid.vue
3987
4881
 
3988
4882
 
3989
4883
 
@@ -3993,8 +4887,8 @@ var Gridvue_type_template_id_1f8d69e4_staticRenderFns = [];
3993
4887
  ;
3994
4888
  var Grid_component = normalizeComponent(
3995
4889
  Chart_Gridvue_type_script_lang_js,
3996
- Gridvue_type_template_id_1f8d69e4_render,
3997
- Gridvue_type_template_id_1f8d69e4_staticRenderFns,
4890
+ Gridvue_type_template_id_b26116b4_render,
4891
+ Gridvue_type_template_id_b26116b4_staticRenderFns,
3998
4892
  false,
3999
4893
  null,
4000
4894
  null,
@@ -4003,8 +4897,8 @@ var Grid_component = normalizeComponent(
4003
4897
  )
4004
4898
 
4005
4899
  /* harmony default export */ var Grid = (Grid_component.exports);
4006
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4007
- var DaysHighlightvue_type_template_id_06b8681f_render = function render() {
4900
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4901
+ var DaysHighlightvue_type_template_id_94382932_render = function render() {
4008
4902
  var _vm = this,
4009
4903
  _c = _vm._self._c;
4010
4904
  return _vm.showWorkingDays ? _c('g', {
@@ -4028,9 +4922,9 @@ var DaysHighlightvue_type_template_id_06b8681f_render = function render() {
4028
4922
  });
4029
4923
  }), 0) : _vm._e();
4030
4924
  };
4031
- var DaysHighlightvue_type_template_id_06b8681f_staticRenderFns = [];
4925
+ var DaysHighlightvue_type_template_id_94382932_staticRenderFns = [];
4032
4926
 
4033
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4927
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/DaysHighlight.vue?vue&type=script&lang=js
4034
4928
 
4035
4929
 
4036
4930
 
@@ -4048,7 +4942,8 @@ var DaysHighlightvue_type_template_id_06b8681f_staticRenderFns = [];
4048
4942
  * @returns {string} key ideintifier for loop
4049
4943
  */
4050
4944
  getKey(day) {
4051
- return dayjs_min_default()(day.time).format('YYYY-MM-DD');
4945
+ // Return the full date-time format
4946
+ return dayjs_min_default()(day.time).format('YYYY-MM-DD HH:mm');
4052
4947
  }
4053
4948
  },
4054
4949
  computed: {
@@ -4076,9 +4971,9 @@ var DaysHighlightvue_type_template_id_06b8681f_staticRenderFns = [];
4076
4971
  }
4077
4972
  }
4078
4973
  });
4079
- ;// ./src/components/components/Chart/DaysHighlight.vue?vue&type=script&lang=js
4974
+ ;// ./src/components/Chart/DaysHighlight.vue?vue&type=script&lang=js
4080
4975
  /* harmony default export */ var Chart_DaysHighlightvue_type_script_lang_js = (DaysHighlightvue_type_script_lang_js);
4081
- ;// ./src/components/components/Chart/DaysHighlight.vue
4976
+ ;// ./src/components/Chart/DaysHighlight.vue
4082
4977
 
4083
4978
 
4084
4979
 
@@ -4088,8 +4983,8 @@ var DaysHighlightvue_type_template_id_06b8681f_staticRenderFns = [];
4088
4983
  ;
4089
4984
  var DaysHighlight_component = normalizeComponent(
4090
4985
  Chart_DaysHighlightvue_type_script_lang_js,
4091
- DaysHighlightvue_type_template_id_06b8681f_render,
4092
- DaysHighlightvue_type_template_id_06b8681f_staticRenderFns,
4986
+ DaysHighlightvue_type_template_id_94382932_render,
4987
+ DaysHighlightvue_type_template_id_94382932_staticRenderFns,
4093
4988
  false,
4094
4989
  null,
4095
4990
  null,
@@ -4098,8 +4993,8 @@ var DaysHighlight_component = normalizeComponent(
4098
4993
  )
4099
4994
 
4100
4995
  /* harmony default export */ var DaysHighlight = (DaysHighlight_component.exports);
4101
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4102
- var Calendarvue_type_template_id_19446f31_render = function render() {
4996
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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=564a1c16
4997
+ var Calendarvue_type_template_id_564a1c16_render = function render() {
4103
4998
  var _vm = this,
4104
4999
  _c = _vm._self._c;
4105
5000
  return _c('div', {
@@ -4114,30 +5009,41 @@ var Calendarvue_type_template_id_19446f31_render = function render() {
4114
5009
  ..._vm.root.style['calendar'],
4115
5010
  width: _vm.root.state.options.width + 'px'
4116
5011
  }
4117
- }, [_vm.root.state.options.calendar.month.display ? _c('calendar-row', {
5012
+ }, [_vm.viewMode === 'quarter' ? _c('calendar-row', {
5013
+ attrs: {
5014
+ "items": _vm.dates.quarters,
5015
+ "which": "quarter"
5016
+ }
5017
+ }) : _vm._e(), _vm.viewMode === 'month' ? _c('calendar-row', {
4118
5018
  attrs: {
4119
5019
  "items": _vm.dates.months,
4120
5020
  "which": "month"
4121
5021
  }
4122
- }) : _vm._e(), _vm.root.state.options.calendar.day.display ? _c('calendar-row', {
5022
+ }) : _vm._e(), _vm.viewMode === 'week' ? _c('calendar-row', {
4123
5023
  attrs: {
4124
- "items": _vm.dates.days,
4125
- "which": "day"
5024
+ "items": _vm.dates.weeks,
5025
+ "which": "week"
4126
5026
  }
4127
- }) : _vm._e(), _vm.root.state.options.calendar.hour.display ? _c('calendar-row', {
5027
+ }) : _vm._e(), _vm.viewMode === 'day' ? _c('calendar-row', {
4128
5028
  attrs: {
4129
- "items": _vm.dates.hours,
4130
- "which": "hour"
5029
+ "items": _vm.dates.days,
5030
+ "which": "day"
4131
5031
  }
4132
5032
  }) : _vm._e()], 1)]);
4133
5033
  };
4134
- var Calendarvue_type_template_id_19446f31_staticRenderFns = [];
4135
-
4136
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4137
- var CalendarRowvue_type_template_id_50cc12d2_render = function render() {
5034
+ var Calendarvue_type_template_id_564a1c16_staticRenderFns = [];
5035
+
5036
+ // EXTERNAL MODULE: ./node_modules/dayjs/plugin/weekOfYear.js
5037
+ var weekOfYear = __webpack_require__(8134);
5038
+ var weekOfYear_default = /*#__PURE__*/__webpack_require__.n(weekOfYear);
5039
+ // EXTERNAL MODULE: ./node_modules/dayjs/plugin/quarterOfYear.js
5040
+ var quarterOfYear = __webpack_require__(1816);
5041
+ var quarterOfYear_default = /*#__PURE__*/__webpack_require__.n(quarterOfYear);
5042
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
5043
+ var CalendarRowvue_type_template_id_db48ac98_render = function render() {
4138
5044
  var _vm = this,
4139
5045
  _c = _vm._self._c;
4140
- return _c('div', {
5046
+ return _c('section', [_c('div', {
4141
5047
  class: 'gantt-elastic__calendar-row gantt-elastic__calendar-row--' + _vm.which,
4142
5048
  style: _vm.rowStyle
4143
5049
  }, _vm._l(_vm.items, function (item, itemIndex) {
@@ -4155,11 +5061,11 @@ var CalendarRowvue_type_template_id_50cc12d2_render = function render() {
4155
5061
  style: _vm.textStyle(child)
4156
5062
  }, [_vm._v(" " + _vm._s(child.label) + " ")])]);
4157
5063
  }), 0);
4158
- }), 0);
5064
+ }), 0)]);
4159
5065
  };
4160
- var CalendarRowvue_type_template_id_50cc12d2_staticRenderFns = [];
5066
+ var CalendarRowvue_type_template_id_db48ac98_staticRenderFns = [];
4161
5067
 
4162
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
5068
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Calendar/CalendarRow.vue?vue&type=script&lang=js
4163
5069
 
4164
5070
  /* harmony default export */ var CalendarRowvue_type_script_lang_js = ({
4165
5071
  name: 'CalendarRow',
@@ -4175,24 +5081,41 @@ var CalendarRowvue_type_template_id_50cc12d2_staticRenderFns = [];
4175
5081
  * @returns {number}
4176
5082
  */
4177
5083
  getTextX(item) {
4178
- let x = item.x + item.width / 2 - item.textWidth / 2;
4179
- if (this.which === 'month' && this.root.isInsideViewPort(item.x, item.width, 0)) {
4180
- let scrollWidth = this.root.state.options.scroll.chart.right - this.root.state.options.scroll.chart.left;
4181
- x = this.root.state.options.scroll.chart.left + scrollWidth / 2 - item.textWidth / 2 + 2;
4182
- if (x + item.textWidth + 2 > item.x + item.width) {
4183
- x = item.x + item.width - item.textWidth - 2;
4184
- } else if (x < item.x) {
4185
- x = item.x + 2;
5084
+ // Calculate center position within the item
5085
+ let x = item.width / 2 - item.textWidth / 2;
5086
+
5087
+ // Add padding to avoid overlap with grid lines
5088
+ const gridLineWidth = this.root.style['grid-line-vertical']['stroke-width'] || 1;
5089
+ const padding = Math.max(gridLineWidth / 2 + 2, 4); // At least 4px padding
5090
+
5091
+ // For month view, use perfect centering with bounds checking
5092
+ if (this.which === 'month') {
5093
+ // Perfect center calculation
5094
+ x = (item.width - item.textWidth) / 2;
5095
+
5096
+ // Ensure text stays within bounds with padding
5097
+ if (x < padding) {
5098
+ x = padding;
5099
+ } else if (x + item.textWidth + padding > item.width) {
5100
+ x = item.width - item.textWidth - padding;
5101
+ }
5102
+ } else {
5103
+ // For other view types, ensure text stays within bounds
5104
+ if (x + item.textWidth + padding > item.width) {
5105
+ x = item.width - item.textWidth - padding;
5106
+ } else if (x < padding) {
5107
+ x = padding;
4186
5108
  }
4187
5109
  }
4188
- return x - item.x;
5110
+ return x;
4189
5111
  }
4190
5112
  },
4191
5113
  computed: {
4192
5114
  rowStyle() {
4193
5115
  return {
4194
5116
  ...this.root.style['calendar-row'],
4195
- ...this.root.style['calendar-row--' + this.which]
5117
+ ...this.root.style['calendar-row--' + this.which],
5118
+ position: 'relative' // Ensure relative positioning for absolute children
4196
5119
  };
4197
5120
  },
4198
5121
  rectStyle() {
@@ -4213,7 +5136,10 @@ var CalendarRowvue_type_template_id_50cc12d2_staticRenderFns = [];
4213
5136
  childrenStyle.push({
4214
5137
  ...basicStyle,
4215
5138
  width: child.width + 'px',
4216
- height: child.height + 'px'
5139
+ height: child.height + 'px',
5140
+ left: child.x + 'px',
5141
+ // Use exact x position for perfect alignment
5142
+ position: 'absolute' // Ensure absolute positioning
4217
5143
  });
4218
5144
  }
4219
5145
  style.push(childrenStyle);
@@ -4229,17 +5155,15 @@ var CalendarRowvue_type_template_id_50cc12d2_staticRenderFns = [];
4229
5155
  const style = {
4230
5156
  ...basicStyle
4231
5157
  };
4232
- if (this.which === 'month') {
4233
- style.left = this.getTextX(child) + 'px';
4234
- }
5158
+ // Remove left positioning for month view - let CSS handle centering
4235
5159
  return style;
4236
5160
  };
4237
5161
  }
4238
5162
  }
4239
5163
  });
4240
- ;// ./src/components/components/Calendar/CalendarRow.vue?vue&type=script&lang=js
5164
+ ;// ./src/components/Calendar/CalendarRow.vue?vue&type=script&lang=js
4241
5165
  /* harmony default export */ var Calendar_CalendarRowvue_type_script_lang_js = (CalendarRowvue_type_script_lang_js);
4242
- ;// ./src/components/components/Calendar/CalendarRow.vue
5166
+ ;// ./src/components/Calendar/CalendarRow.vue
4243
5167
 
4244
5168
 
4245
5169
 
@@ -4249,8 +5173,8 @@ var CalendarRowvue_type_template_id_50cc12d2_staticRenderFns = [];
4249
5173
  ;
4250
5174
  var CalendarRow_component = normalizeComponent(
4251
5175
  Calendar_CalendarRowvue_type_script_lang_js,
4252
- CalendarRowvue_type_template_id_50cc12d2_render,
4253
- CalendarRowvue_type_template_id_50cc12d2_staticRenderFns,
5176
+ CalendarRowvue_type_template_id_db48ac98_render,
5177
+ CalendarRowvue_type_template_id_db48ac98_staticRenderFns,
4254
5178
  false,
4255
5179
  null,
4256
5180
  null,
@@ -4259,10 +5183,16 @@ var CalendarRow_component = normalizeComponent(
4259
5183
  )
4260
5184
 
4261
5185
  /* harmony default export */ var CalendarRow = (CalendarRow_component.exports);
4262
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
5186
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Calendar/Calendar.vue?vue&type=script&lang=js
5187
+
5188
+
4263
5189
 
4264
5190
 
4265
5191
 
5192
+
5193
+ // Extend dayjs with required plugins
5194
+ dayjs_min_default().extend((weekOfYear_default()));
5195
+ dayjs_min_default().extend((quarterOfYear_default()));
4266
5196
  /* harmony default export */ var Calendarvue_type_script_lang_js = ({
4267
5197
  name: 'Calendar',
4268
5198
  components: {
@@ -4270,155 +5200,60 @@ var CalendarRow_component = normalizeComponent(
4270
5200
  },
4271
5201
  inject: ['root'],
4272
5202
  data() {
4273
- return {};
5203
+ return {
5204
+ dayjsInstance: (dayjs_min_default()) // Store dayjs instance for consistent usage
5205
+ };
5206
+ },
5207
+ computed: {
5208
+ viewMode() {
5209
+ return this.root.state.options.calendar.viewMode || 'day';
5210
+ },
5211
+ dates() {
5212
+ const days = this.generateDays();
5213
+ const weeks = this.generateWeeks();
5214
+ const months = this.generateMonths();
5215
+ const quarters = this.generateQuarters();
5216
+ const allDates = {
5217
+ days,
5218
+ weeks,
5219
+ months,
5220
+ quarters
5221
+ };
5222
+ this.calculateCalendarDimensions(allDates);
5223
+ return allDates;
5224
+ }
4274
5225
  },
4275
5226
  methods: {
4276
- /**
4277
- * How many hours will fit?
4278
- *
4279
- * @returns {object}
4280
- */
4281
- howManyHoursFit(dayIndex) {
4282
- const stroke = 1;
4283
- const additionalSpace = stroke + 2;
4284
- let fullCellWidth = this.root.state.options.times.steps[dayIndex].width.px;
4285
- let formatNames = Object.keys(this.root.state.options.calendar.hour.format);
4286
- for (let hours = 24; hours > 1; hours = Math.ceil(hours / 2)) {
4287
- for (let formatName of formatNames) {
4288
- if ((this.root.state.options.calendar.hour.maxWidths[formatName] + additionalSpace) * hours <= fullCellWidth && hours > 1) {
4289
- return {
4290
- count: hours,
4291
- type: formatName
4292
- };
4293
- }
4294
- }
5227
+ calculateCalendarDimensions({
5228
+ days,
5229
+ weeks,
5230
+ months,
5231
+ quarters
5232
+ }) {
5233
+ let height = 0;
5234
+ if (this.viewMode === 'quarter' && quarters.length > 0) {
5235
+ height += this.root.state.options.calendar.quarter?.height || 30;
4295
5236
  }
4296
- return {
4297
- count: 0,
4298
- type: ''
4299
- };
4300
- },
4301
- /**
4302
- * How many days will fit?
4303
- *
4304
- * @returns {object}
4305
- */
4306
- howManyDaysFit() {
4307
- const stroke = 1;
4308
- const additionalSpace = stroke + 2;
4309
- let fullWidth = this.root.state.options.width;
4310
- let formatNames = Object.keys(this.root.state.options.calendar.day.format);
4311
- for (let days = this.root.state.options.times.steps.length; days > 1; days = Math.ceil(days / 2)) {
4312
- for (let formatName of formatNames) {
4313
- if ((this.root.state.options.calendar.day.maxWidths[formatName] + additionalSpace) * days <= fullWidth && days > 1) {
4314
- return {
4315
- count: days,
4316
- type: formatName
4317
- };
4318
- }
4319
- }
5237
+
5238
+ // Add month height if visible
5239
+ if (this.viewMode === 'month' && months.length > 0) {
5240
+ height += this.root.state.options.calendar.month.height || 25;
4320
5241
  }
4321
- return {
4322
- count: 0,
4323
- type: ''
4324
- };
5242
+
5243
+ // Add week height if visible
5244
+ if (this.viewMode === 'week' && weeks.length > 0) {
5245
+ height += this.root.state.options.calendar.week?.height || 25;
5246
+ }
5247
+
5248
+ // Add day height if visible
5249
+ if (this.viewMode === 'day' && days.length > 0) {
5250
+ height += this.root.state.options.calendar.day.height;
5251
+ }
5252
+ this.root.state.options.calendar.height = height;
4325
5253
  },
4326
- /**
4327
- * How many months will fit?
4328
- *
4329
- * @returns {object}
4330
- */
4331
- howManyMonthsFit() {
4332
- const stroke = 1;
4333
- const additionalSpace = stroke + 2;
4334
- let fullWidth = this.root.state.options.width;
4335
- let formatNames = Object.keys(this.root.state.options.calendar.month.format);
4336
- let currentMonth = dayjs_min_default()(this.root.state.options.times.firstTime);
4337
- let previousMonth = currentMonth.clone();
4338
- const lastTime = this.root.state.options.times.lastTime;
4339
- let monthsCount = this.root.monthsCount(this.root.state.options.times.firstTime, this.root.state.options.times.lastTime);
4340
- if (monthsCount === 1) {
4341
- for (let formatName of formatNames) {
4342
- if (this.root.state.options.calendar.month.maxWidths[formatName] + additionalSpace <= fullWidth) {
4343
- return {
4344
- count: 1,
4345
- type: formatName
4346
- };
4347
- }
4348
- }
4349
- }
4350
- for (let months = monthsCount; months > 1; months = Math.ceil(months / 2)) {
4351
- for (let formatName of formatNames) {
4352
- if ((this.root.state.options.calendar.month.maxWidths[formatName] + additionalSpace) * months <= fullWidth && months > 1) {
4353
- return {
4354
- count: months,
4355
- type: formatName
4356
- };
4357
- }
4358
- }
4359
- }
4360
- return {
4361
- count: 0,
4362
- type: formatNames[0]
4363
- };
4364
- },
4365
- /**
4366
- * Generate hours
4367
- *
4368
- * @returns {array}
4369
- */
4370
- generateHours() {
4371
- let allHours = [];
4372
- if (!this.root.state.options.calendar.hour.display) {
4373
- return allHours;
4374
- }
4375
- const steps = this.root.state.options.times.steps;
4376
- const localeName = this.root.state.options.locale.name;
4377
- for (let hourIndex = 0, len = steps.length; hourIndex < len; hourIndex++) {
4378
- const hoursCount = this.howManyHoursFit(hourIndex);
4379
- if (hoursCount.count === 0) {
4380
- continue;
4381
- }
4382
- const hours = {
4383
- key: hourIndex + 'step',
4384
- children: []
4385
- };
4386
- const hourStep = 24 / hoursCount.count;
4387
- const hourWidthPx = steps[hourIndex].width.px / hoursCount.count;
4388
- for (let i = 0, len = hoursCount.count; i < len; i++) {
4389
- const hour = i * hourStep;
4390
- let index = hourIndex;
4391
- if (hourIndex > 0) {
4392
- index = hourIndex - Math.floor(hourIndex / 24) * 24;
4393
- }
4394
- let textWidth = 0;
4395
- if (typeof this.root.state.options.calendar.hour.widths[index] !== 'undefined') {
4396
- textWidth = this.root.state.options.calendar.hour.widths[index][hoursCount.type];
4397
- }
4398
- let x = steps[hourIndex].offset.px + hourWidthPx * i;
4399
- hours.children.push({
4400
- index: hourIndex,
4401
- key: 'h' + i,
4402
- x,
4403
- y: this.root.state.options.calendar.day.height + this.root.state.options.calendar.month.height,
4404
- width: hourWidthPx,
4405
- textWidth,
4406
- height: this.root.state.options.calendar.hour.height,
4407
- label: this.root.state.options.calendar.hour.formatted[hoursCount.type][hour]
4408
- });
4409
- }
4410
- allHours.push(hours);
4411
- }
4412
- return allHours;
4413
- },
4414
- /**
4415
- * Generate days
4416
- *
4417
- * @returns {array}
4418
- */
4419
5254
  generateDays() {
4420
5255
  let days = [];
4421
- if (!this.root.state.options.calendar.day.display) {
5256
+ if (!(this.viewMode === 'day' || this.viewMode === 'week')) {
4422
5257
  return days;
4423
5258
  }
4424
5259
  const daysCount = this.howManyDaysFit();
@@ -4430,23 +5265,26 @@ var CalendarRow_component = normalizeComponent(
4430
5265
  const dayStep = Math.ceil(steps.length / daysCount.count);
4431
5266
  for (let dayIndex = 0, len = steps.length; dayIndex < len; dayIndex += dayStep) {
4432
5267
  let dayWidthPx = 0;
4433
- // day could be shorter (daylight saving time) so join widths and divide
5268
+
5269
+ // Calculate total width for this day group
4434
5270
  for (let currentStep = 0; currentStep < dayStep; currentStep++) {
4435
5271
  if (typeof steps[dayIndex + currentStep] !== 'undefined') {
4436
5272
  dayWidthPx += steps[dayIndex + currentStep].width.px;
4437
5273
  }
4438
5274
  }
4439
- const date = dayjs_min_default()(steps[dayIndex].time);
5275
+ const date = this.dayjsInstance(steps[dayIndex].time);
4440
5276
  let textWidth = 0;
4441
5277
  if (typeof this.root.state.options.calendar.day.widths[dayIndex] !== 'undefined') {
4442
5278
  textWidth = this.root.state.options.calendar.day.widths[dayIndex][daysCount.type];
4443
5279
  }
4444
- let x = steps[dayIndex].offset.px;
5280
+
5281
+ // Use exact step offset for perfect alignment with grid lines
5282
+ let x = Math.round(steps[dayIndex].offset.px); // Round to ensure exact pixel alignment
4445
5283
  days.push({
4446
5284
  index: dayIndex,
4447
5285
  key: steps[dayIndex].time + 'd',
4448
5286
  x,
4449
- y: this.root.state.options.calendar.month.height,
5287
+ y: this.getYPosition('day'),
4450
5288
  width: dayWidthPx,
4451
5289
  textWidth,
4452
5290
  height: this.root.state.options.calendar.day.height,
@@ -4458,11 +5296,99 @@ var CalendarRow_component = normalizeComponent(
4458
5296
  children: [item]
4459
5297
  }));
4460
5298
  },
4461
- /**
4462
- * Generate months
4463
- *
4464
- * @returns {array}
4465
- */
5299
+ generateWeeks() {
5300
+ let weeks = [];
5301
+ if (this.viewMode !== 'week') {
5302
+ return weeks;
5303
+ }
5304
+ const steps = this.root.state.options.times.steps;
5305
+ let currentWeek = null;
5306
+ let weekStartX = 0;
5307
+ let weekWidth = 0;
5308
+ let weekStartDate = null;
5309
+ let weekEndDate = null;
5310
+ for (let i = 0; i < steps.length; i++) {
5311
+ try {
5312
+ const stepDate = this.dayjsInstance(steps[i].time);
5313
+ const weekNumber = stepDate.week();
5314
+ const year = stepDate.year();
5315
+ const weekKey = `${year}-W${weekNumber}`;
5316
+ if (weekKey !== currentWeek) {
5317
+ // Save previous week
5318
+ if (currentWeek !== null) {
5319
+ // Format the label as "Month Day-Day"
5320
+ const startMonth = weekStartDate.format('MMMM');
5321
+ const startDay = weekStartDate.date();
5322
+ const endDay = weekEndDate.date();
5323
+ let label = `${startMonth} ${startDay}`;
5324
+
5325
+ // If the week spans multiple months, show both months
5326
+ if (weekStartDate.month() !== weekEndDate.month()) {
5327
+ const endMonth = weekEndDate.format('MMMM');
5328
+ label = `${startMonth} ${startDay} - ${endMonth} ${endDay}`;
5329
+ } else if (startDay !== endDay) {
5330
+ label = `${startMonth} ${startDay}-${endDay}`;
5331
+ }
5332
+ weeks.push({
5333
+ key: currentWeek,
5334
+ x: weekStartX,
5335
+ // Use exact step offset for perfect alignment
5336
+ y: this.getYPosition('week'),
5337
+ width: weekWidth,
5338
+ textWidth: 50,
5339
+ height: this.root.state.options.calendar.week?.height || 25,
5340
+ label: label
5341
+ });
5342
+ }
5343
+
5344
+ // Start new week - use exact step offset
5345
+ currentWeek = weekKey;
5346
+ weekStartX = Math.round(steps[i].offset.px); // Round to ensure exact pixel alignment
5347
+ weekWidth = steps[i].width.px;
5348
+ weekStartDate = stepDate.clone().startOf('week');
5349
+ weekEndDate = stepDate.clone().endOf('week');
5350
+ } else {
5351
+ // Same week, accumulate width and update end date
5352
+ weekWidth += steps[i].width.px;
5353
+ weekEndDate = stepDate.clone().endOf('week');
5354
+ }
5355
+ } catch (error) {
5356
+ console.error('Error processing week:', error);
5357
+ continue;
5358
+ }
5359
+ }
5360
+
5361
+ // Add the last week
5362
+ if (currentWeek !== null) {
5363
+ // Format the label as "Month Day-Day"
5364
+ const startMonth = weekStartDate.format('MMMM');
5365
+ const startDay = weekStartDate.date();
5366
+ const endDay = weekEndDate.date();
5367
+ let label = `${startMonth} ${startDay}`;
5368
+
5369
+ // If the week spans multiple months, show both months
5370
+ if (weekStartDate.month() !== weekEndDate.month()) {
5371
+ const endMonth = weekEndDate.format('MMMM');
5372
+ label = `${startMonth} ${startDay} - ${endMonth} ${endDay}`;
5373
+ } else if (startDay !== endDay) {
5374
+ label = `${startMonth} ${startDay}-${endDay}`;
5375
+ }
5376
+ weeks.push({
5377
+ key: currentWeek,
5378
+ x: weekStartX,
5379
+ // Use exact step offset for perfect alignment
5380
+ y: this.getYPosition('week'),
5381
+ width: weekWidth,
5382
+ textWidth: 60,
5383
+ height: this.root.state.options.calendar.week?.height || 25,
5384
+ label: label
5385
+ });
5386
+ }
5387
+ return weeks.map(week => ({
5388
+ key: week.key,
5389
+ children: [week]
5390
+ }));
5391
+ },
4466
5392
  generateMonths() {
4467
5393
  let months = [];
4468
5394
  if (!this.root.state.options.calendar.month.display) {
@@ -4505,7 +5431,8 @@ var CalendarRow_component = normalizeComponent(
4505
5431
  if (typeof this.root.state.options.calendar.month.widths[monthIndex] !== 'undefined') {
4506
5432
  textWidth = this.root.state.options.calendar.month.widths[monthIndex][choosenFormatName];
4507
5433
  }
4508
- let x = monthOffset;
5434
+ // Use exact step offset for perfect alignment with grid lines
5435
+ let x = Math.round(monthOffset); // Round to ensure exact pixel alignment
4509
5436
  months.push({
4510
5437
  index: monthIndex,
4511
5438
  key: monthIndex + 'm',
@@ -4527,47 +5454,230 @@ var CalendarRow_component = normalizeComponent(
4527
5454
  children: [item]
4528
5455
  }));
4529
5456
  },
4530
- /**
4531
- * Sum all calendar rows height and return result
4532
- *
4533
- * @returns {int}
4534
- */
4535
- calculateCalendarDimensions({
4536
- hours,
4537
- days,
4538
- months
4539
- }) {
4540
- let height = 0;
4541
- if (this.root.state.options.calendar.hour.display && hours.length > 0) {
4542
- height += this.root.state.options.calendar.hour.height;
5457
+ generateQuarters() {
5458
+ let quarters = [];
5459
+ if (this.viewMode !== 'quarter') {
5460
+ return quarters;
4543
5461
  }
4544
- if (this.root.state.options.calendar.day.display && days.length > 0) {
4545
- height += this.root.state.options.calendar.day.height;
5462
+ const steps = this.root.state.options.times.steps;
5463
+
5464
+ // Debug: Log quarter generation info
5465
+ console.log('Quarter Generation Debug:', {
5466
+ stepsCount: steps.length,
5467
+ firstStepTime: this.dayjsInstance(steps[0]?.time).format('YYYY-MM-DD'),
5468
+ lastStepTime: this.dayjsInstance(steps[steps.length - 1]?.time).format('YYYY-MM-DD'),
5469
+ firstStepQuarter: this.dayjsInstance(steps[0]?.time).quarter(),
5470
+ lastStepQuarter: this.dayjsInstance(steps[steps.length - 1]?.time).quarter()
5471
+ });
5472
+ let currentQuarter = null;
5473
+ let quarterStartX = 0;
5474
+ let quarterWidth = 0;
5475
+ let quarterStartDate = null;
5476
+ let quarterEndDate = null;
5477
+ for (let i = 0; i < steps.length; i++) {
5478
+ try {
5479
+ // Use UTC to avoid locale/timezone issues
5480
+ const stepDate = this.dayjsInstance(steps[i].time);
5481
+ const quarter = stepDate.quarter();
5482
+ const year = stepDate.year();
5483
+ const quarterKey = `Q${quarter}-${year}`;
5484
+ console.log(`Step ${i}:`, {
5485
+ time: stepDate.format('YYYY-MM-DD'),
5486
+ quarter: quarter,
5487
+ year: year,
5488
+ quarterKey: quarterKey,
5489
+ currentQuarter: currentQuarter
5490
+ });
5491
+ if (quarterKey !== currentQuarter) {
5492
+ // Save previous quarter
5493
+ if (currentQuarter !== null) {
5494
+ // Format the label as "Month – Month 'Year"
5495
+ const startMonth = quarterStartDate.format('MMMM');
5496
+ const endMonth = quarterEndDate.format('MMMM');
5497
+ const shortYear = quarterEndDate.format("YY");
5498
+ const label = `${startMonth} – ${endMonth} '${shortYear}`;
5499
+ quarters.push({
5500
+ key: currentQuarter,
5501
+ x: quarterStartX,
5502
+ // Use exact step offset for perfect alignment
5503
+ y: this.getYPosition('quarter'),
5504
+ width: quarterWidth,
5505
+ textWidth: 50,
5506
+ height: this.root.state.options.calendar.quarter?.height || 30,
5507
+ label: label
5508
+ });
5509
+ }
5510
+
5511
+ // Start new quarter
5512
+ currentQuarter = quarterKey;
5513
+ quarterStartX = Math.round(steps[i].offset.px); // Round to ensure exact pixel alignment
5514
+ quarterWidth = steps[i].width.px;
5515
+ quarterStartDate = stepDate.clone().startOf('quarter');
5516
+ quarterEndDate = stepDate.clone().endOf('quarter');
5517
+ } else {
5518
+ // Same quarter, accumulate width and update end date
5519
+ quarterWidth += steps[i].width.px;
5520
+ quarterEndDate = stepDate.clone().endOf('quarter');
5521
+ }
5522
+ } catch (error) {
5523
+ console.error('Error processing quarter:', error);
5524
+ continue;
5525
+ }
4546
5526
  }
4547
- if (this.root.state.options.calendar.month.display && months.length > 0) {
4548
- height += this.root.state.options.calendar.month.height;
5527
+
5528
+ // Add the last quarter
5529
+ if (currentQuarter !== null) {
5530
+ // Format the label as "Month – Month 'Year"
5531
+ const startMonth = quarterStartDate.format('MMMM');
5532
+ const endMonth = quarterEndDate.format('MMMM');
5533
+ const shortYear = quarterEndDate.format("YY");
5534
+ const label = `${startMonth} – ${endMonth} '${shortYear}`;
5535
+ quarters.push({
5536
+ key: currentQuarter,
5537
+ x: quarterStartX,
5538
+ // Use exact step offset for perfect alignment
5539
+ y: this.getYPosition('quarter'),
5540
+ width: quarterWidth,
5541
+ textWidth: 60,
5542
+ height: this.root.state.options.calendar.quarter?.height || 30,
5543
+ label: label
5544
+ });
4549
5545
  }
4550
- this.root.state.options.calendar.height = height;
4551
- }
4552
- },
4553
- computed: {
4554
- dates() {
4555
- const hours = this.generateHours();
4556
- const days = this.generateDays();
4557
- const months = this.generateMonths();
4558
- const allDates = {
4559
- hours,
4560
- days,
4561
- months
5546
+ return quarters.map(quarter => ({
5547
+ key: quarter.key,
5548
+ children: [quarter]
5549
+ }));
5550
+ },
5551
+ getYPosition(type) {
5552
+ let y = 0;
5553
+ switch (type) {
5554
+ case 'quarter':
5555
+ return 0;
5556
+ case 'month':
5557
+ // Put month row below quarter if in quarterly view
5558
+ return this.viewMode === 'quarter' ? this.root.state.options.calendar.quarter?.height || 30 : 0;
5559
+ case 'week':
5560
+ // Put week row below month and quarter if applicable
5561
+
5562
+ if (this.viewMode === 'quarter') {
5563
+ y += this.root.state.options.calendar.quarter?.height || 30;
5564
+ }
5565
+ if (this.viewMode === 'month' || this.viewMode === 'quarter') {
5566
+ y += this.root.state.options.calendar.month.height;
5567
+ }
5568
+ return y;
5569
+ case 'day':
5570
+ // Put day below week if applicable
5571
+ y = 0;
5572
+ if (this.viewMode === 'quarter') {
5573
+ y += 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
+ if (this.viewMode === 'week') {
5579
+ y += this.root.state.options.calendar.week?.height || 25;
5580
+ }
5581
+ return y;
5582
+ case 'hour':
5583
+ // Put hour row below day if applicable
5584
+ y = 0;
5585
+ if (this.viewMode === 'quarter') {
5586
+ y += this.root.state.options.calendar.quarter?.height || 30;
5587
+ }
5588
+ if (this.viewMode === 'month' || this.viewMode === 'quarter') {
5589
+ y += this.root.state.options.calendar.month.height;
5590
+ }
5591
+ if (this.viewMode === 'week') {
5592
+ y += this.root.state.options.calendar.week?.height || 25;
5593
+ }
5594
+ if (this.viewMode === 'day') {
5595
+ y += this.root.state.options.calendar.day.height;
5596
+ }
5597
+ return y;
5598
+ default:
5599
+ return 0;
5600
+ }
5601
+ },
5602
+ howManyHoursFit(dayIndex) {
5603
+ const stroke = 1;
5604
+ const additionalSpace = stroke + 2;
5605
+ let fullCellWidth = this.root.state.options.times.steps[dayIndex].width.px;
5606
+ let formatNames = Object.keys(this.root.state.options.calendar.hour.format);
5607
+ for (let hours = 24; hours > 1; hours = Math.ceil(hours / 2)) {
5608
+ for (let formatName of formatNames) {
5609
+ if ((this.root.state.options.calendar.hour.maxWidths[formatName] + additionalSpace) * hours <= fullCellWidth && hours > 1) {
5610
+ return {
5611
+ count: hours,
5612
+ type: formatName
5613
+ };
5614
+ }
5615
+ }
5616
+ }
5617
+ return {
5618
+ count: 0,
5619
+ type: ''
5620
+ };
5621
+ },
5622
+ howManyDaysFit() {
5623
+ const stroke = 1;
5624
+ const additionalSpace = stroke + 2;
5625
+ let fullWidth = this.root.state.options.width;
5626
+ let formatNames = Object.keys(this.root.state.options.calendar.day.format);
5627
+ for (let days = this.root.state.options.times.steps.length; days > 1; days = Math.ceil(days / 2)) {
5628
+ for (let formatName of formatNames) {
5629
+ if ((this.root.state.options.calendar.day.maxWidths[formatName] + additionalSpace) * days <= fullWidth && days > 1) {
5630
+ return {
5631
+ count: days,
5632
+ type: formatName
5633
+ };
5634
+ }
5635
+ }
5636
+ }
5637
+ return {
5638
+ count: 0,
5639
+ type: ''
5640
+ };
5641
+ },
5642
+ howManyMonthsFit() {
5643
+ const stroke = 1;
5644
+ const additionalSpace = stroke + 2;
5645
+ let fullWidth = this.root.state.options.width;
5646
+ let formatNames = Object.keys(this.root.state.options.calendar.month.format);
5647
+ let currentMonth = dayjs_min_default()(this.root.state.options.times.firstTime);
5648
+ let previousMonth = currentMonth.clone();
5649
+ const lastTime = this.root.state.options.times.lastTime;
5650
+ let monthsCount = this.root.monthsCount(this.root.state.options.times.firstTime, this.root.state.options.times.lastTime);
5651
+ if (monthsCount === 1) {
5652
+ for (let formatName of formatNames) {
5653
+ if (this.root.state.options.calendar.month.maxWidths[formatName] + additionalSpace <= fullWidth) {
5654
+ return {
5655
+ count: 1,
5656
+ type: formatName
5657
+ };
5658
+ }
5659
+ }
5660
+ }
5661
+ for (let months = monthsCount; months > 1; months = Math.ceil(months / 2)) {
5662
+ for (let formatName of formatNames) {
5663
+ if ((this.root.state.options.calendar.month.maxWidths[formatName] + additionalSpace) * months <= fullWidth && months > 1) {
5664
+ return {
5665
+ count: months,
5666
+ type: formatName
5667
+ };
5668
+ }
5669
+ }
5670
+ }
5671
+ return {
5672
+ count: 0,
5673
+ type: formatNames[0]
4562
5674
  };
4563
- this.calculateCalendarDimensions(allDates);
4564
- return allDates;
4565
5675
  }
4566
5676
  }
4567
5677
  });
4568
- ;// ./src/components/components/Calendar/Calendar.vue?vue&type=script&lang=js
5678
+ ;// ./src/components/Calendar/Calendar.vue?vue&type=script&lang=js
4569
5679
  /* harmony default export */ var Calendar_Calendarvue_type_script_lang_js = (Calendarvue_type_script_lang_js);
4570
- ;// ./src/components/components/Calendar/Calendar.vue
5680
+ ;// ./src/components/Calendar/Calendar.vue
4571
5681
 
4572
5682
 
4573
5683
 
@@ -4577,8 +5687,8 @@ var CalendarRow_component = normalizeComponent(
4577
5687
  ;
4578
5688
  var Calendar_component = normalizeComponent(
4579
5689
  Calendar_Calendarvue_type_script_lang_js,
4580
- Calendarvue_type_template_id_19446f31_render,
4581
- Calendarvue_type_template_id_19446f31_staticRenderFns,
5690
+ Calendarvue_type_template_id_564a1c16_render,
5691
+ Calendarvue_type_template_id_564a1c16_staticRenderFns,
4582
5692
  false,
4583
5693
  null,
4584
5694
  null,
@@ -4587,8 +5697,8 @@ var Calendar_component = normalizeComponent(
4587
5697
  )
4588
5698
 
4589
5699
  /* harmony default export */ var Calendar = (Calendar_component.exports);
4590
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4591
- var DependencyLinesvue_type_template_id_eddd62e6_render = function render() {
5700
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
5701
+ var DependencyLinesvue_type_template_id_bc574838_render = function render() {
4592
5702
  var _vm = this,
4593
5703
  _c = _vm._self._c;
4594
5704
  return _c('svg', {
@@ -4625,9 +5735,9 @@ var DependencyLinesvue_type_template_id_eddd62e6_render = function render() {
4625
5735
  }), 0);
4626
5736
  }), 0);
4627
5737
  };
4628
- var DependencyLinesvue_type_template_id_eddd62e6_staticRenderFns = [];
5738
+ var DependencyLinesvue_type_template_id_bc574838_staticRenderFns = [];
4629
5739
 
4630
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
5740
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/DependencyLines.vue?vue&type=script&lang=js
4631
5741
 
4632
5742
 
4633
5743
 
@@ -4708,9 +5818,9 @@ var DependencyLinesvue_type_template_id_eddd62e6_staticRenderFns = [];
4708
5818
  }
4709
5819
  }
4710
5820
  });
4711
- ;// ./src/components/components/Chart/DependencyLines.vue?vue&type=script&lang=js
5821
+ ;// ./src/components/Chart/DependencyLines.vue?vue&type=script&lang=js
4712
5822
  /* harmony default export */ var Chart_DependencyLinesvue_type_script_lang_js = (DependencyLinesvue_type_script_lang_js);
4713
- ;// ./src/components/components/Chart/DependencyLines.vue
5823
+ ;// ./src/components/Chart/DependencyLines.vue
4714
5824
 
4715
5825
 
4716
5826
 
@@ -4720,8 +5830,8 @@ var DependencyLinesvue_type_template_id_eddd62e6_staticRenderFns = [];
4720
5830
  ;
4721
5831
  var DependencyLines_component = normalizeComponent(
4722
5832
  Chart_DependencyLinesvue_type_script_lang_js,
4723
- DependencyLinesvue_type_template_id_eddd62e6_render,
4724
- DependencyLinesvue_type_template_id_eddd62e6_staticRenderFns,
5833
+ DependencyLinesvue_type_template_id_bc574838_render,
5834
+ DependencyLinesvue_type_template_id_bc574838_staticRenderFns,
4725
5835
  false,
4726
5836
  null,
4727
5837
  null,
@@ -4730,8 +5840,8 @@ var DependencyLines_component = normalizeComponent(
4730
5840
  )
4731
5841
 
4732
5842
  /* harmony default export */ var DependencyLines = (DependencyLines_component.exports);
4733
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4734
- var Taskvue_type_template_id_2afb5353_render = function render() {
5843
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
5844
+ var Taskvue_type_template_id_208a9baa_render = function render() {
4735
5845
  var _vm = this,
4736
5846
  _c = _vm._self._c;
4737
5847
  return _c('g', {
@@ -4840,10 +5950,10 @@ var Taskvue_type_template_id_2afb5353_render = function render() {
4840
5950
  }
4841
5951
  }) : _vm._e()], 1);
4842
5952
  };
4843
- var Taskvue_type_template_id_2afb5353_staticRenderFns = [];
5953
+ var Taskvue_type_template_id_208a9baa_staticRenderFns = [];
4844
5954
 
4845
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4846
- var Textvue_type_template_id_d1c1415a_render = function render() {
5955
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
5956
+ var Textvue_type_template_id_634f40aa_render = function render() {
4847
5957
  var _vm = this,
4848
5958
  _c = _vm._self._c;
4849
5959
  return _c('svg', {
@@ -4891,9 +6001,9 @@ var Textvue_type_template_id_d1c1415a_render = function render() {
4891
6001
  }
4892
6002
  }) : _vm._e()])])]);
4893
6003
  };
4894
- var Textvue_type_template_id_d1c1415a_staticRenderFns = [];
6004
+ var Textvue_type_template_id_634f40aa_staticRenderFns = [];
4895
6005
 
4896
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
6006
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Text.vue?vue&type=script&lang=js
4897
6007
  /* harmony default export */ var Textvue_type_script_lang_js = ({
4898
6008
  name: 'ChartText',
4899
6009
  inject: ['root'],
@@ -4955,9 +6065,9 @@ var Textvue_type_template_id_d1c1415a_staticRenderFns = [];
4955
6065
  }
4956
6066
  }
4957
6067
  });
4958
- ;// ./src/components/components/Chart/Text.vue?vue&type=script&lang=js
6068
+ ;// ./src/components/Chart/Text.vue?vue&type=script&lang=js
4959
6069
  /* harmony default export */ var Chart_Textvue_type_script_lang_js = (Textvue_type_script_lang_js);
4960
- ;// ./src/components/components/Chart/Text.vue
6070
+ ;// ./src/components/Chart/Text.vue
4961
6071
 
4962
6072
 
4963
6073
 
@@ -4967,8 +6077,8 @@ var Textvue_type_template_id_d1c1415a_staticRenderFns = [];
4967
6077
  ;
4968
6078
  var Text_component = normalizeComponent(
4969
6079
  Chart_Textvue_type_script_lang_js,
4970
- Textvue_type_template_id_d1c1415a_render,
4971
- Textvue_type_template_id_d1c1415a_staticRenderFns,
6080
+ Textvue_type_template_id_634f40aa_render,
6081
+ Textvue_type_template_id_634f40aa_staticRenderFns,
4972
6082
  false,
4973
6083
  null,
4974
6084
  null,
@@ -4977,8 +6087,8 @@ var Text_component = normalizeComponent(
4977
6087
  )
4978
6088
 
4979
6089
  /* harmony default export */ var Text = (Text_component.exports);
4980
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
4981
- var ProgressBarvue_type_template_id_00ca07fa_render = function render() {
6090
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
6091
+ var ProgressBarvue_type_template_id_bc869ae8_render = function render() {
4982
6092
  var _vm = this,
4983
6093
  _c = _vm._self._c;
4984
6094
  return _c('g', {
@@ -5042,9 +6152,9 @@ var ProgressBarvue_type_template_id_00ca07fa_render = function render() {
5042
6152
  }
5043
6153
  })]) : _vm._e()]);
5044
6154
  };
5045
- var ProgressBarvue_type_template_id_00ca07fa_staticRenderFns = [];
6155
+ var ProgressBarvue_type_template_id_bc869ae8_staticRenderFns = [];
5046
6156
 
5047
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
6157
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/ProgressBar.vue?vue&type=script&lang=js
5048
6158
  /* harmony default export */ var ProgressBarvue_type_script_lang_js = ({
5049
6159
  name: 'ProgressBar',
5050
6160
  inject: ['root'],
@@ -5091,9 +6201,9 @@ var ProgressBarvue_type_template_id_00ca07fa_staticRenderFns = [];
5091
6201
  }
5092
6202
  }
5093
6203
  });
5094
- ;// ./src/components/components/Chart/ProgressBar.vue?vue&type=script&lang=js
6204
+ ;// ./src/components/Chart/ProgressBar.vue?vue&type=script&lang=js
5095
6205
  /* harmony default export */ var Chart_ProgressBarvue_type_script_lang_js = (ProgressBarvue_type_script_lang_js);
5096
- ;// ./src/components/components/Chart/ProgressBar.vue
6206
+ ;// ./src/components/Chart/ProgressBar.vue
5097
6207
 
5098
6208
 
5099
6209
 
@@ -5103,8 +6213,8 @@ var ProgressBarvue_type_template_id_00ca07fa_staticRenderFns = [];
5103
6213
  ;
5104
6214
  var ProgressBar_component = normalizeComponent(
5105
6215
  Chart_ProgressBarvue_type_script_lang_js,
5106
- ProgressBarvue_type_template_id_00ca07fa_render,
5107
- ProgressBarvue_type_template_id_00ca07fa_staticRenderFns,
6216
+ ProgressBarvue_type_template_id_bc869ae8_render,
6217
+ ProgressBarvue_type_template_id_bc869ae8_staticRenderFns,
5108
6218
  false,
5109
6219
  null,
5110
6220
  null,
@@ -5113,7 +6223,7 @@ var ProgressBar_component = normalizeComponent(
5113
6223
  )
5114
6224
 
5115
6225
  /* harmony default export */ var ProgressBar = (ProgressBar_component.exports);
5116
- ;// ./src/components/components/Chart/Row/Task.mixin.js
6226
+ ;// ./src/components/Chart/Row/Task.mixin.js
5117
6227
  /* harmony default export */ var Task_mixin = ({
5118
6228
  computed: {
5119
6229
  /**
@@ -5140,7 +6250,8 @@ var ProgressBar_component = normalizeComponent(
5140
6250
  */
5141
6251
  displayExpander() {
5142
6252
  const expander = this.root.state.options.chart.expander;
5143
- return expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display;
6253
+ const hasChildren = this.task.allChildren && this.task.allChildren.length > 0;
6254
+ return (expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display) && hasChildren;
5144
6255
  }
5145
6256
  },
5146
6257
  methods: {
@@ -5160,7 +6271,7 @@ var ProgressBar_component = normalizeComponent(
5160
6271
  }
5161
6272
  }
5162
6273
  });
5163
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
6274
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
5164
6275
 
5165
6276
 
5166
6277
 
@@ -5188,19 +6299,593 @@ var ProgressBar_component = normalizeComponent(
5188
6299
  return 'gantt-elastic__task-clip-path-' + this.task.id;
5189
6300
  },
5190
6301
  /**
5191
- * Get points
6302
+ * Get points
6303
+ *
6304
+ * @returns {string}
6305
+ */
6306
+ getPoints() {
6307
+ const task = this.task;
6308
+ return `0,0 ${task.width},0 ${task.width},${task.height} 0,${task.height}`;
6309
+ }
6310
+ }
6311
+ });
6312
+ ;// ./src/components/Chart/Row/Task.vue?vue&type=script&lang=js
6313
+ /* harmony default export */ var Row_Taskvue_type_script_lang_js = (Taskvue_type_script_lang_js);
6314
+ ;// ./src/components/Chart/Row/Task.vue
6315
+
6316
+
6317
+
6318
+
6319
+
6320
+ /* normalize component */
6321
+ ;
6322
+ var Task_component = normalizeComponent(
6323
+ Row_Taskvue_type_script_lang_js,
6324
+ Taskvue_type_template_id_208a9baa_render,
6325
+ Taskvue_type_template_id_208a9baa_staticRenderFns,
6326
+ false,
6327
+ null,
6328
+ null,
6329
+ null
6330
+
6331
+ )
6332
+
6333
+ /* harmony default export */ var Task = (Task_component.exports);
6334
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
6335
+ var Milestonevue_type_template_id_edd49e02_render = function render() {
6336
+ var _vm = this,
6337
+ _c = _vm._self._c;
6338
+ return _c('g', {
6339
+ staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-milestone-wrapper",
6340
+ style: {
6341
+ ..._vm.root.style['chart-row-bar-wrapper'],
6342
+ ..._vm.root.style['chart-row-milestone-wrapper'],
6343
+ ..._vm.task.style['chart-row-bar-wrapper']
6344
+ }
6345
+ }, [_vm.displayExpander ? _c('foreignObject', {
6346
+ staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--milestone",
6347
+ style: {
6348
+ ..._vm.root.style['chart-expander'],
6349
+ ..._vm.root.style['chart-expander--milestone'],
6350
+ ..._vm.task.style['chart-expander']
6351
+ },
6352
+ attrs: {
6353
+ "x": _vm.task.x - _vm.root.state.options.chart.expander.offset - _vm.root.state.options.chart.expander.size,
6354
+ "y": _vm.task.y + (_vm.root.state.options.row.height - _vm.root.state.options.chart.expander.size) / 2,
6355
+ "width": _vm.root.state.options.chart.expander.size,
6356
+ "height": _vm.root.state.options.chart.expander.size
6357
+ }
6358
+ }, [_c('expander', {
6359
+ attrs: {
6360
+ "tasks": [_vm.task],
6361
+ "options": _vm.root.state.options.chart.expander,
6362
+ "type": "chart"
6363
+ }
6364
+ })], 1) : _vm._e(), _c('svg', {
6365
+ staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-milestone",
6366
+ style: {
6367
+ ..._vm.root.style['chart-row-bar'],
6368
+ ..._vm.root.style['chart-row-milestone'],
6369
+ ..._vm.task.style['chart-row-bar']
6370
+ },
6371
+ attrs: {
6372
+ "x": _vm.task.x,
6373
+ "y": _vm.task.y,
6374
+ "width": _vm.task.width,
6375
+ "height": _vm.task.height,
6376
+ "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
6377
+ "xmlns": "http://www.w3.org/2000/svg"
6378
+ },
6379
+ on: {
6380
+ "click": function ($event) {
6381
+ return _vm.emitEvent('click', $event);
6382
+ },
6383
+ "mouseenter": function ($event) {
6384
+ return _vm.emitEvent('mouseenter', $event);
6385
+ },
6386
+ "mouseover": function ($event) {
6387
+ return _vm.emitEvent('mouseover', $event);
6388
+ },
6389
+ "mouseout": function ($event) {
6390
+ return _vm.emitEvent('mouseout', $event);
6391
+ },
6392
+ "mousemove": function ($event) {
6393
+ return _vm.emitEvent('mousemove', $event);
6394
+ },
6395
+ "mousedown": function ($event) {
6396
+ return _vm.emitEvent('mousedown', $event);
6397
+ },
6398
+ "mouseup": function ($event) {
6399
+ return _vm.emitEvent('mouseup', $event);
6400
+ },
6401
+ "mousewheel": function ($event) {
6402
+ return _vm.emitEvent('mousewheel', $event);
6403
+ },
6404
+ "touchstart": function ($event) {
6405
+ return _vm.emitEvent('touchstart', $event);
6406
+ },
6407
+ "touchmove": function ($event) {
6408
+ return _vm.emitEvent('touchmove', $event);
6409
+ },
6410
+ "touchend": function ($event) {
6411
+ return _vm.emitEvent('touchend', $event);
6412
+ }
6413
+ }
6414
+ }, [_c('defs', [_c('clipPath', {
6415
+ attrs: {
6416
+ "id": _vm.clipPathId
6417
+ }
6418
+ }, [_c('polygon', {
6419
+ attrs: {
6420
+ "points": _vm.getPoints
6421
+ }
6422
+ })])]), _c('polygon', {
6423
+ staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-milestone-polygon",
6424
+ style: {
6425
+ ..._vm.root.style['chart-row-bar-polygon'],
6426
+ ..._vm.root.style['chart-row-milestone-polygon'],
6427
+ ..._vm.task.style['base'],
6428
+ ..._vm.task.style['chart-row-bar-polygon']
6429
+ },
6430
+ attrs: {
6431
+ "points": _vm.getPoints
6432
+ }
6433
+ }), _c('progress-bar', {
6434
+ attrs: {
6435
+ "task": _vm.task,
6436
+ "clip-path": 'url(#' + _vm.clipPathId + ')'
6437
+ }
6438
+ })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
6439
+ attrs: {
6440
+ "task": _vm.task
6441
+ }
6442
+ }) : _vm._e()], 1);
6443
+ };
6444
+ var Milestonevue_type_template_id_edd49e02_staticRenderFns = [];
6445
+
6446
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
6447
+
6448
+
6449
+
6450
+
6451
+ /* harmony default export */ var Milestonevue_type_script_lang_js = ({
6452
+ name: 'Milestone',
6453
+ components: {
6454
+ ChartText: Text,
6455
+ ProgressBar: ProgressBar,
6456
+ Expander: Expander
6457
+ },
6458
+ inject: ['root'],
6459
+ props: ['task'],
6460
+ mixins: [Task_mixin],
6461
+ data() {
6462
+ return {};
6463
+ },
6464
+ computed: {
6465
+ /**
6466
+ * Get clip path id
6467
+ *
6468
+ * @returns {string}
6469
+ */
6470
+ clipPathId() {
6471
+ return 'gantt-elastic__milestone-clip-path-' + this.task.id;
6472
+ },
6473
+ /**
6474
+ * Get points
6475
+ *
6476
+ * @returns {string}
6477
+ */
6478
+ getPoints() {
6479
+ const task = this.task;
6480
+ const fifty = task.height / 2;
6481
+ let offset = fifty;
6482
+ if (task.width / 2 - offset < 0) {
6483
+ offset = task.width / 2;
6484
+ }
6485
+ return `0,${fifty}
6486
+ ${offset},0
6487
+ ${task.width - offset},0
6488
+ ${task.width},${fifty}
6489
+ ${task.width - offset},${task.height}
6490
+ ${offset},${task.height}`;
6491
+ }
6492
+ }
6493
+ });
6494
+ ;// ./src/components/Chart/Row/Milestone.vue?vue&type=script&lang=js
6495
+ /* harmony default export */ var Row_Milestonevue_type_script_lang_js = (Milestonevue_type_script_lang_js);
6496
+ ;// ./src/components/Chart/Row/Milestone.vue
6497
+
6498
+
6499
+
6500
+
6501
+
6502
+ /* normalize component */
6503
+ ;
6504
+ var Milestone_component = normalizeComponent(
6505
+ Row_Milestonevue_type_script_lang_js,
6506
+ Milestonevue_type_template_id_edd49e02_render,
6507
+ Milestonevue_type_template_id_edd49e02_staticRenderFns,
6508
+ false,
6509
+ null,
6510
+ null,
6511
+ null
6512
+
6513
+ )
6514
+
6515
+ /* harmony default export */ var Milestone = (Milestone_component.exports);
6516
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
6517
+ var Projectvue_type_template_id_760bf767_render = function render() {
6518
+ var _vm = this,
6519
+ _c = _vm._self._c;
6520
+ return _c('g', {
6521
+ staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-project-wrapper",
6522
+ style: {
6523
+ ..._vm.root.style['chart-row-bar-wrapper'],
6524
+ ..._vm.root.style['chart-row-project-wrapper'],
6525
+ ..._vm.task.style['chart-row-bar-wrapper']
6526
+ }
6527
+ }, [_vm.displayExpander ? _c('foreignObject', {
6528
+ staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--project",
6529
+ style: {
6530
+ ..._vm.root.style['chart-expander'],
6531
+ ..._vm.root.style['chart-expander--project'],
6532
+ ..._vm.task.style['chart-expander']
6533
+ },
6534
+ attrs: {
6535
+ "x": _vm.task.x - _vm.root.state.options.chart.expander.offset - _vm.root.state.options.chart.expander.size,
6536
+ "y": _vm.task.y + (_vm.root.state.options.row.height - _vm.root.state.options.chart.expander.size) / 2,
6537
+ "width": _vm.root.state.options.chart.expander.size,
6538
+ "height": _vm.root.state.options.chart.expander.size
6539
+ }
6540
+ }, [_c('expander', {
6541
+ attrs: {
6542
+ "tasks": [_vm.task],
6543
+ "options": _vm.root.state.options.chart.expander,
6544
+ "type": "chart"
6545
+ }
6546
+ })], 1) : _vm._e(), _c('svg', {
6547
+ staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-project",
6548
+ style: {
6549
+ ..._vm.root.style['chart-row-bar'],
6550
+ ..._vm.root.style['chart-row-project'],
6551
+ ..._vm.task.style['chart-row-bar']
6552
+ },
6553
+ attrs: {
6554
+ "x": _vm.task.x,
6555
+ "y": _vm.task.y,
6556
+ "width": _vm.task.width,
6557
+ "height": _vm.task.height,
6558
+ "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
6559
+ "xmlns": "http://www.w3.org/2000/svg"
6560
+ },
6561
+ on: {
6562
+ "click": function ($event) {
6563
+ return _vm.emitEvent('click', $event);
6564
+ },
6565
+ "mouseenter": function ($event) {
6566
+ return _vm.emitEvent('mouseenter', $event);
6567
+ },
6568
+ "mouseover": function ($event) {
6569
+ return _vm.emitEvent('mouseover', $event);
6570
+ },
6571
+ "mouseout": function ($event) {
6572
+ return _vm.emitEvent('mouseout', $event);
6573
+ },
6574
+ "mousemove": function ($event) {
6575
+ return _vm.emitEvent('mousemove', $event);
6576
+ },
6577
+ "mousedown": function ($event) {
6578
+ return _vm.emitEvent('mousedown', $event);
6579
+ },
6580
+ "mouseup": function ($event) {
6581
+ return _vm.emitEvent('mouseup', $event);
6582
+ },
6583
+ "mousewheel": function ($event) {
6584
+ return _vm.emitEvent('mousewheel', $event);
6585
+ },
6586
+ "touchstart": function ($event) {
6587
+ return _vm.emitEvent('touchstart', $event);
6588
+ },
6589
+ "touchmove": function ($event) {
6590
+ return _vm.emitEvent('touchmove', $event);
6591
+ },
6592
+ "touchend": function ($event) {
6593
+ return _vm.emitEvent('touchend', $event);
6594
+ }
6595
+ }
6596
+ }, [_c('defs', [_c('clipPath', {
6597
+ attrs: {
6598
+ "id": _vm.clipPathId
6599
+ }
6600
+ }, [_c('path', {
6601
+ attrs: {
6602
+ "d": _vm.getPoints
6603
+ }
6604
+ })])]), _c('path', {
6605
+ staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-project-polygon",
6606
+ style: {
6607
+ ..._vm.root.style['chart-row-bar-polygon'],
6608
+ ..._vm.root.style['chart-row-project-polygon'],
6609
+ ..._vm.task.style['base'],
6610
+ ..._vm.task.style['chart-row-bar-polygon']
6611
+ },
6612
+ attrs: {
6613
+ "d": _vm.getPoints
6614
+ }
6615
+ }), _c('progress-bar', {
6616
+ attrs: {
6617
+ "task": _vm.task,
6618
+ "clip-path": 'url(#' + _vm.clipPathId + ')'
6619
+ }
6620
+ })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
6621
+ attrs: {
6622
+ "task": _vm.task
6623
+ }
6624
+ }) : _vm._e()], 1);
6625
+ };
6626
+ var Projectvue_type_template_id_760bf767_staticRenderFns = [];
6627
+
6628
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
6629
+
6630
+
6631
+
6632
+
6633
+ /* harmony default export */ var Projectvue_type_script_lang_js = ({
6634
+ name: 'Project',
6635
+ components: {
6636
+ ChartText: Text,
6637
+ ProgressBar: ProgressBar,
6638
+ Expander: Expander
6639
+ },
6640
+ inject: ['root'],
6641
+ props: ['task'],
6642
+ mixins: [Task_mixin],
6643
+ data() {
6644
+ return {};
6645
+ },
6646
+ computed: {
6647
+ /**
6648
+ * Get clip path id
6649
+ *
6650
+ * @returns {string}
6651
+ */
6652
+ clipPathId() {
6653
+ return 'gantt-elastic__project-clip-path-' + this.task.id;
6654
+ },
6655
+ /**
6656
+ * Get points
6657
+ *
6658
+ * @returns {string}
6659
+ */
6660
+ getPoints() {
6661
+ const task = this.task;
6662
+ const bottom = task.height - task.height / 4;
6663
+ const corner = task.height / 6;
6664
+ const smallCorner = task.height / 8;
6665
+ return `M ${smallCorner},0
6666
+ L ${task.width - smallCorner} 0
6667
+ L ${task.width} ${smallCorner}
6668
+ L ${task.width} ${bottom}
6669
+ L ${task.width - corner} ${task.height}
6670
+ L ${task.width - corner * 2} ${bottom}
6671
+ L ${corner * 2} ${bottom}
6672
+ L ${corner} ${task.height}
6673
+ L 0 ${bottom}
6674
+ L 0 ${smallCorner}
6675
+ Z
6676
+ `;
6677
+ },
6678
+ /**
6679
+ * Should we display expander?
6680
+ *
6681
+ * @returns {boolean}
6682
+ */
6683
+ displayExpander() {
6684
+ const expander = this.root.state.options.chart.expander;
6685
+ const hasChildren = this.task.allChildren && this.task.allChildren.length > 0;
6686
+ return (expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display) && hasChildren;
6687
+ }
6688
+ }
6689
+ });
6690
+ ;// ./src/components/Chart/Row/Project.vue?vue&type=script&lang=js
6691
+ /* harmony default export */ var Row_Projectvue_type_script_lang_js = (Projectvue_type_script_lang_js);
6692
+ ;// ./src/components/Chart/Row/Project.vue
6693
+
6694
+
6695
+
6696
+
6697
+
6698
+ /* normalize component */
6699
+ ;
6700
+ var Project_component = normalizeComponent(
6701
+ Row_Projectvue_type_script_lang_js,
6702
+ Projectvue_type_template_id_760bf767_render,
6703
+ Projectvue_type_template_id_760bf767_staticRenderFns,
6704
+ false,
6705
+ null,
6706
+ null,
6707
+ null
6708
+
6709
+ )
6710
+
6711
+ /* harmony default export */ var Project = (Project_component.exports);
6712
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
6713
+ var Epicvue_type_template_id_a2e89cd8_render = function render() {
6714
+ var _vm = this,
6715
+ _c = _vm._self._c;
6716
+ return _c('g', {
6717
+ staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-epic-wrapper",
6718
+ style: {
6719
+ ..._vm.root.style['chart-row-bar-wrapper'],
6720
+ ..._vm.root.style['chart-row-epic-wrapper'],
6721
+ ..._vm.task.style['chart-row-bar-wrapper']
6722
+ }
6723
+ }, [_vm.displayExpander ? _c('foreignObject', {
6724
+ staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--epic",
6725
+ style: {
6726
+ ..._vm.root.style['chart-expander'],
6727
+ ..._vm.root.style['chart-expander--epic'],
6728
+ ..._vm.task.style['chart-expander']
6729
+ },
6730
+ attrs: {
6731
+ "x": _vm.task.x - _vm.root.state.options.chart.expander.offset - _vm.root.state.options.chart.expander.size,
6732
+ "y": _vm.task.y + (_vm.root.state.options.row.height - _vm.root.state.options.chart.expander.size) / 2,
6733
+ "width": _vm.root.state.options.chart.expander.size,
6734
+ "height": _vm.root.state.options.chart.expander.size
6735
+ }
6736
+ }, [_c('expander', {
6737
+ attrs: {
6738
+ "tasks": [_vm.task],
6739
+ "options": _vm.root.state.options.chart.expander,
6740
+ "type": "chart"
6741
+ }
6742
+ })], 1) : _vm._e(), _c('svg', {
6743
+ staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-epic",
6744
+ style: {
6745
+ ..._vm.root.style['chart-row-bar'],
6746
+ ..._vm.root.style['chart-row-epic'],
6747
+ ..._vm.task.style['chart-row-bar']
6748
+ },
6749
+ attrs: {
6750
+ "x": _vm.task.x,
6751
+ "y": _vm.task.y,
6752
+ "width": _vm.task.width,
6753
+ "height": _vm.task.height,
6754
+ "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
6755
+ "xmlns": "http://www.w3.org/2000/svg"
6756
+ },
6757
+ on: {
6758
+ "click": function ($event) {
6759
+ return _vm.emitEvent('click', $event);
6760
+ },
6761
+ "mouseenter": function ($event) {
6762
+ return _vm.emitEvent('mouseenter', $event);
6763
+ },
6764
+ "mouseover": function ($event) {
6765
+ return _vm.emitEvent('mouseover', $event);
6766
+ },
6767
+ "mouseout": function ($event) {
6768
+ return _vm.emitEvent('mouseout', $event);
6769
+ },
6770
+ "mousemove": function ($event) {
6771
+ return _vm.emitEvent('mousemove', $event);
6772
+ },
6773
+ "mousedown": function ($event) {
6774
+ return _vm.emitEvent('mousedown', $event);
6775
+ },
6776
+ "mouseup": function ($event) {
6777
+ return _vm.emitEvent('mouseup', $event);
6778
+ },
6779
+ "mousewheel": function ($event) {
6780
+ return _vm.emitEvent('mousewheel', $event);
6781
+ },
6782
+ "touchstart": function ($event) {
6783
+ return _vm.emitEvent('touchstart', $event);
6784
+ },
6785
+ "touchmove": function ($event) {
6786
+ return _vm.emitEvent('touchmove', $event);
6787
+ },
6788
+ "touchend": function ($event) {
6789
+ return _vm.emitEvent('touchend', $event);
6790
+ }
6791
+ }
6792
+ }, [_c('defs', [_c('clipPath', {
6793
+ attrs: {
6794
+ "id": _vm.clipPathId
6795
+ }
6796
+ }, [_c('path', {
6797
+ attrs: {
6798
+ "d": _vm.getPoints
6799
+ }
6800
+ })])]), _c('path', {
6801
+ staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-epic-polygon",
6802
+ style: {
6803
+ ..._vm.root.style['chart-row-bar-polygon'],
6804
+ ..._vm.root.style['chart-row-epic-polygon'],
6805
+ ..._vm.task.style['base'],
6806
+ ..._vm.task.style['chart-row-bar-polygon']
6807
+ },
6808
+ attrs: {
6809
+ "d": _vm.getPoints
6810
+ }
6811
+ }), _c('progress-bar', {
6812
+ attrs: {
6813
+ "task": _vm.task,
6814
+ "clip-path": 'url(#' + _vm.clipPathId + ')'
6815
+ }
6816
+ })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
6817
+ attrs: {
6818
+ "task": _vm.task
6819
+ }
6820
+ }) : _vm._e()], 1);
6821
+ };
6822
+ var Epicvue_type_template_id_a2e89cd8_staticRenderFns = [];
6823
+
6824
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
6825
+
6826
+
6827
+
6828
+
6829
+ /* harmony default export */ var Epicvue_type_script_lang_js = ({
6830
+ name: 'Epic',
6831
+ components: {
6832
+ ChartText: Text,
6833
+ ProgressBar: ProgressBar,
6834
+ Expander: Expander
6835
+ },
6836
+ inject: ['root'],
6837
+ props: ['task'],
6838
+ mixins: [Task_mixin],
6839
+ data() {
6840
+ return {};
6841
+ },
6842
+ computed: {
6843
+ /**
6844
+ * Get clip path id
6845
+ *
6846
+ * @returns {string}
6847
+ */
6848
+ clipPathId() {
6849
+ return 'gantt-elastic__epic-clip-path-' + this.task.id;
6850
+ },
6851
+ /**
6852
+ * Get points (same shape as project)
6853
+ *
6854
+ * @returns {string}
6855
+ */
6856
+ getPoints() {
6857
+ const task = this.task;
6858
+ const bottom = task.height - task.height / 4;
6859
+ const corner = task.height / 6;
6860
+ const smallCorner = task.height / 8;
6861
+ return `M ${smallCorner},0
6862
+ L ${task.width - smallCorner} 0
6863
+ L ${task.width} ${smallCorner}
6864
+ L ${task.width} ${bottom}
6865
+ L ${task.width - corner} ${task.height}
6866
+ L ${task.width - corner * 2} ${bottom}
6867
+ L ${corner * 2} ${bottom}
6868
+ L ${corner} ${task.height}
6869
+ L 0 ${bottom}
6870
+ L 0 ${smallCorner}
6871
+ Z
6872
+ `;
6873
+ },
6874
+ /**
6875
+ * Should we display expander?
5192
6876
  *
5193
- * @returns {string}
6877
+ * @returns {boolean}
5194
6878
  */
5195
- getPoints() {
5196
- const task = this.task;
5197
- return `0,0 ${task.width},0 ${task.width},${task.height} 0,${task.height}`;
6879
+ displayExpander() {
6880
+ const expander = this.root.state.options.chart.expander;
6881
+ const hasChildren = this.task.allChildren && this.task.allChildren.length > 0;
6882
+ return (expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display) && hasChildren;
5198
6883
  }
5199
6884
  }
5200
6885
  });
5201
- ;// ./src/components/components/Chart/Row/Task.vue?vue&type=script&lang=js
5202
- /* harmony default export */ var Row_Taskvue_type_script_lang_js = (Taskvue_type_script_lang_js);
5203
- ;// ./src/components/components/Chart/Row/Task.vue
6886
+ ;// ./src/components/Chart/Row/Epic.vue?vue&type=script&lang=js
6887
+ /* harmony default export */ var Row_Epicvue_type_script_lang_js = (Epicvue_type_script_lang_js);
6888
+ ;// ./src/components/Chart/Row/Epic.vue
5204
6889
 
5205
6890
 
5206
6891
 
@@ -5208,10 +6893,10 @@ var ProgressBar_component = normalizeComponent(
5208
6893
 
5209
6894
  /* normalize component */
5210
6895
  ;
5211
- var Task_component = normalizeComponent(
5212
- Row_Taskvue_type_script_lang_js,
5213
- Taskvue_type_template_id_2afb5353_render,
5214
- Taskvue_type_template_id_2afb5353_staticRenderFns,
6896
+ var Epic_component = normalizeComponent(
6897
+ Row_Epicvue_type_script_lang_js,
6898
+ Epicvue_type_template_id_a2e89cd8_render,
6899
+ Epicvue_type_template_id_a2e89cd8_staticRenderFns,
5215
6900
  false,
5216
6901
  null,
5217
6902
  null,
@@ -5219,23 +6904,23 @@ var Task_component = normalizeComponent(
5219
6904
 
5220
6905
  )
5221
6906
 
5222
- /* harmony default export */ var Task = (Task_component.exports);
5223
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
5224
- var Milestonevue_type_template_id_4f4f8994_render = function render() {
6907
+ /* harmony default export */ var Epic = (Epic_component.exports);
6908
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
6909
+ var Subtaskvue_type_template_id_86599310_render = function render() {
5225
6910
  var _vm = this,
5226
6911
  _c = _vm._self._c;
5227
6912
  return _c('g', {
5228
- staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-milestone-wrapper",
6913
+ staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-subtask-wrapper",
5229
6914
  style: {
5230
6915
  ..._vm.root.style['chart-row-bar-wrapper'],
5231
- ..._vm.root.style['chart-row-milestone-wrapper'],
6916
+ ..._vm.root.style['chart-row-subtask-wrapper'],
5232
6917
  ..._vm.task.style['chart-row-bar-wrapper']
5233
6918
  }
5234
6919
  }, [_vm.displayExpander ? _c('foreignObject', {
5235
- staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--milestone",
6920
+ staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--subtask",
5236
6921
  style: {
5237
6922
  ..._vm.root.style['chart-expander'],
5238
- ..._vm.root.style['chart-expander--milestone'],
6923
+ ..._vm.root.style['chart-expander--subtask'],
5239
6924
  ..._vm.task.style['chart-expander']
5240
6925
  },
5241
6926
  attrs: {
@@ -5251,10 +6936,10 @@ var Milestonevue_type_template_id_4f4f8994_render = function render() {
5251
6936
  "type": "chart"
5252
6937
  }
5253
6938
  })], 1) : _vm._e(), _c('svg', {
5254
- staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-milestone",
6939
+ staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-subtask",
5255
6940
  style: {
5256
6941
  ..._vm.root.style['chart-row-bar'],
5257
- ..._vm.root.style['chart-row-milestone'],
6942
+ ..._vm.root.style['chart-row-subtask'],
5258
6943
  ..._vm.task.style['chart-row-bar']
5259
6944
  },
5260
6945
  attrs: {
@@ -5309,10 +6994,10 @@ var Milestonevue_type_template_id_4f4f8994_render = function render() {
5309
6994
  "points": _vm.getPoints
5310
6995
  }
5311
6996
  })])]), _c('polygon', {
5312
- staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-milestone-polygon",
6997
+ staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-subtask-polygon",
5313
6998
  style: {
5314
6999
  ..._vm.root.style['chart-row-bar-polygon'],
5315
- ..._vm.root.style['chart-row-milestone-polygon'],
7000
+ ..._vm.root.style['chart-row-subtask-polygon'],
5316
7001
  ..._vm.task.style['base'],
5317
7002
  ..._vm.task.style['chart-row-bar-polygon']
5318
7003
  },
@@ -5330,15 +7015,15 @@ var Milestonevue_type_template_id_4f4f8994_render = function render() {
5330
7015
  }
5331
7016
  }) : _vm._e()], 1);
5332
7017
  };
5333
- var Milestonevue_type_template_id_4f4f8994_staticRenderFns = [];
7018
+ var Subtaskvue_type_template_id_86599310_staticRenderFns = [];
5334
7019
 
5335
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
7020
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
5336
7021
 
5337
7022
 
5338
7023
 
5339
7024
 
5340
- /* harmony default export */ var Milestonevue_type_script_lang_js = ({
5341
- name: 'Milestone',
7025
+ /* harmony default export */ var Subtaskvue_type_script_lang_js = ({
7026
+ name: 'Subtask',
5342
7027
  components: {
5343
7028
  ChartText: Text,
5344
7029
  ProgressBar: ProgressBar,
@@ -5357,32 +7042,32 @@ var Milestonevue_type_template_id_4f4f8994_staticRenderFns = [];
5357
7042
  * @returns {string}
5358
7043
  */
5359
7044
  clipPathId() {
5360
- return 'gantt-elastic__milestone-clip-path-' + this.task.id;
7045
+ return 'gantt-elastic__subtask-clip-path-' + this.task.id;
5361
7046
  },
5362
7047
  /**
5363
- * Get points
7048
+ * Get points (simple rectangle for subtasks)
5364
7049
  *
5365
7050
  * @returns {string}
5366
7051
  */
5367
7052
  getPoints() {
5368
7053
  const task = this.task;
5369
- const fifty = task.height / 2;
5370
- let offset = fifty;
5371
- if (task.width / 2 - offset < 0) {
5372
- offset = task.width / 2;
5373
- }
5374
- return `0,${fifty}
5375
- ${offset},0
5376
- ${task.width - offset},0
5377
- ${task.width},${fifty}
5378
- ${task.width - offset},${task.height}
5379
- ${offset},${task.height}`;
7054
+ return `0,0 ${task.width},0 ${task.width},${task.height} 0,${task.height}`;
7055
+ },
7056
+ /**
7057
+ * Should we display expander?
7058
+ *
7059
+ * @returns {boolean}
7060
+ */
7061
+ displayExpander() {
7062
+ const expander = this.root.state.options.chart.expander;
7063
+ const hasChildren = this.task.allChildren && this.task.allChildren.length > 0;
7064
+ return (expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display) && hasChildren;
5380
7065
  }
5381
7066
  }
5382
7067
  });
5383
- ;// ./src/components/components/Chart/Row/Milestone.vue?vue&type=script&lang=js
5384
- /* harmony default export */ var Row_Milestonevue_type_script_lang_js = (Milestonevue_type_script_lang_js);
5385
- ;// ./src/components/components/Chart/Row/Milestone.vue
7068
+ ;// ./src/components/Chart/Row/Subtask.vue?vue&type=script&lang=js
7069
+ /* harmony default export */ var Row_Subtaskvue_type_script_lang_js = (Subtaskvue_type_script_lang_js);
7070
+ ;// ./src/components/Chart/Row/Subtask.vue
5386
7071
 
5387
7072
 
5388
7073
 
@@ -5390,10 +7075,10 @@ var Milestonevue_type_template_id_4f4f8994_staticRenderFns = [];
5390
7075
 
5391
7076
  /* normalize component */
5392
7077
  ;
5393
- var Milestone_component = normalizeComponent(
5394
- Row_Milestonevue_type_script_lang_js,
5395
- Milestonevue_type_template_id_4f4f8994_render,
5396
- Milestonevue_type_template_id_4f4f8994_staticRenderFns,
7078
+ var Subtask_component = normalizeComponent(
7079
+ Row_Subtaskvue_type_script_lang_js,
7080
+ Subtaskvue_type_template_id_86599310_render,
7081
+ Subtaskvue_type_template_id_86599310_staticRenderFns,
5397
7082
  false,
5398
7083
  null,
5399
7084
  null,
@@ -5401,23 +7086,23 @@ var Milestone_component = normalizeComponent(
5401
7086
 
5402
7087
  )
5403
7088
 
5404
- /* harmony default export */ var Milestone = (Milestone_component.exports);
5405
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
5406
- var Projectvue_type_template_id_38b2a86e_render = function render() {
7089
+ /* harmony default export */ var Subtask = (Subtask_component.exports);
7090
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
7091
+ var Storyvue_type_template_id_1f59b61a_render = function render() {
5407
7092
  var _vm = this,
5408
7093
  _c = _vm._self._c;
5409
7094
  return _c('g', {
5410
- staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-project-wrapper",
7095
+ staticClass: "gantt-elastic__chart-row-bar-wrapper gantt-elastic__chart-row-story-wrapper",
5411
7096
  style: {
5412
7097
  ..._vm.root.style['chart-row-bar-wrapper'],
5413
- ..._vm.root.style['chart-row-project-wrapper'],
7098
+ ..._vm.root.style['chart-row-story-wrapper'],
5414
7099
  ..._vm.task.style['chart-row-bar-wrapper']
5415
7100
  }
5416
7101
  }, [_vm.displayExpander ? _c('foreignObject', {
5417
- staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--project",
7102
+ staticClass: "gantt-elastic__chart-expander gantt-elastic__chart-expander--story",
5418
7103
  style: {
5419
7104
  ..._vm.root.style['chart-expander'],
5420
- ..._vm.root.style['chart-expander--project'],
7105
+ ..._vm.root.style['chart-expander--story'],
5421
7106
  ..._vm.task.style['chart-expander']
5422
7107
  },
5423
7108
  attrs: {
@@ -5433,10 +7118,10 @@ var Projectvue_type_template_id_38b2a86e_render = function render() {
5433
7118
  "type": "chart"
5434
7119
  }
5435
7120
  })], 1) : _vm._e(), _c('svg', {
5436
- staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-project",
7121
+ staticClass: "gantt-elastic__chart-row-bar gantt-elastic__chart-row-story",
5437
7122
  style: {
5438
7123
  ..._vm.root.style['chart-row-bar'],
5439
- ..._vm.root.style['chart-row-project'],
7124
+ ..._vm.root.style['chart-row-story'],
5440
7125
  ..._vm.task.style['chart-row-bar']
5441
7126
  },
5442
7127
  attrs: {
@@ -5491,10 +7176,10 @@ var Projectvue_type_template_id_38b2a86e_render = function render() {
5491
7176
  "d": _vm.getPoints
5492
7177
  }
5493
7178
  })])]), _c('path', {
5494
- staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-project-polygon",
7179
+ staticClass: "gantt-elastic__chart-row-bar-polygon gantt-elastic__chart-row-story-polygon",
5495
7180
  style: {
5496
7181
  ..._vm.root.style['chart-row-bar-polygon'],
5497
- ..._vm.root.style['chart-row-project-polygon'],
7182
+ ..._vm.root.style['chart-row-story-polygon'],
5498
7183
  ..._vm.task.style['base'],
5499
7184
  ..._vm.task.style['chart-row-bar-polygon']
5500
7185
  },
@@ -5512,15 +7197,15 @@ var Projectvue_type_template_id_38b2a86e_render = function render() {
5512
7197
  }
5513
7198
  }) : _vm._e()], 1);
5514
7199
  };
5515
- var Projectvue_type_template_id_38b2a86e_staticRenderFns = [];
7200
+ var Storyvue_type_template_id_1f59b61a_staticRenderFns = [];
5516
7201
 
5517
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
7202
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
5518
7203
 
5519
7204
 
5520
7205
 
5521
7206
 
5522
- /* harmony default export */ var Projectvue_type_script_lang_js = ({
5523
- name: 'Project',
7207
+ /* harmony default export */ var Storyvue_type_script_lang_js = ({
7208
+ name: 'Story',
5524
7209
  components: {
5525
7210
  ChartText: Text,
5526
7211
  ProgressBar: ProgressBar,
@@ -5539,30 +7224,26 @@ var Projectvue_type_template_id_38b2a86e_staticRenderFns = [];
5539
7224
  * @returns {string}
5540
7225
  */
5541
7226
  clipPathId() {
5542
- return 'gantt-elastic__project-clip-path-' + this.task.id;
7227
+ return 'gantt-elastic__story-clip-path-' + this.task.id;
5543
7228
  },
5544
7229
  /**
5545
- * Get points
7230
+ * Get points (rounded rectangle for stories)
5546
7231
  *
5547
7232
  * @returns {string}
5548
7233
  */
5549
7234
  getPoints() {
5550
7235
  const task = this.task;
5551
- const bottom = task.height - task.height / 4;
5552
- const corner = task.height / 6;
5553
- const smallCorner = task.height / 8;
5554
- return `M ${smallCorner},0
5555
- L ${task.width - smallCorner} 0
5556
- L ${task.width} ${smallCorner}
5557
- L ${task.width} ${bottom}
5558
- L ${task.width - corner} ${task.height}
5559
- L ${task.width - corner * 2} ${bottom}
5560
- L ${corner * 2} ${bottom}
7236
+ const corner = Math.min(task.height / 4, 8); // Rounded corners
7237
+ return `M ${corner},0
7238
+ L ${task.width - corner} 0
7239
+ Q ${task.width} 0 ${task.width} ${corner}
7240
+ L ${task.width} ${task.height - corner}
7241
+ Q ${task.width} ${task.height} ${task.width - corner} ${task.height}
5561
7242
  L ${corner} ${task.height}
5562
- L 0 ${bottom}
5563
- L 0 ${smallCorner}
5564
- Z
5565
- `;
7243
+ Q 0 ${task.height} 0 ${task.height - corner}
7244
+ L 0 ${corner}
7245
+ Q 0 0 ${corner} 0
7246
+ Z`;
5566
7247
  },
5567
7248
  /**
5568
7249
  * Should we display expander?
@@ -5571,13 +7252,14 @@ var Projectvue_type_template_id_38b2a86e_staticRenderFns = [];
5571
7252
  */
5572
7253
  displayExpander() {
5573
7254
  const expander = this.root.state.options.chart.expander;
5574
- return expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display;
7255
+ const hasChildren = this.task.allChildren && this.task.allChildren.length > 0;
7256
+ return (expander.display || expander.displayIfTaskListHidden && !this.root.state.options.taskList.display) && hasChildren;
5575
7257
  }
5576
7258
  }
5577
7259
  });
5578
- ;// ./src/components/components/Chart/Row/Project.vue?vue&type=script&lang=js
5579
- /* harmony default export */ var Row_Projectvue_type_script_lang_js = (Projectvue_type_script_lang_js);
5580
- ;// ./src/components/components/Chart/Row/Project.vue
7260
+ ;// ./src/components/Chart/Row/Story.vue?vue&type=script&lang=js
7261
+ /* harmony default export */ var Row_Storyvue_type_script_lang_js = (Storyvue_type_script_lang_js);
7262
+ ;// ./src/components/Chart/Row/Story.vue
5581
7263
 
5582
7264
 
5583
7265
 
@@ -5585,10 +7267,10 @@ var Projectvue_type_template_id_38b2a86e_staticRenderFns = [];
5585
7267
 
5586
7268
  /* normalize component */
5587
7269
  ;
5588
- var Project_component = normalizeComponent(
5589
- Row_Projectvue_type_script_lang_js,
5590
- Projectvue_type_template_id_38b2a86e_render,
5591
- Projectvue_type_template_id_38b2a86e_staticRenderFns,
7270
+ var Story_component = normalizeComponent(
7271
+ Row_Storyvue_type_script_lang_js,
7272
+ Storyvue_type_template_id_1f59b61a_render,
7273
+ Storyvue_type_template_id_1f59b61a_staticRenderFns,
5592
7274
  false,
5593
7275
  null,
5594
7276
  null,
@@ -5596,8 +7278,11 @@ var Project_component = normalizeComponent(
5596
7278
 
5597
7279
  )
5598
7280
 
5599
- /* harmony default export */ var Project = (Project_component.exports);
5600
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
7281
+ /* harmony default export */ var Story = (Story_component.exports);
7282
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Chart.vue?vue&type=script&lang=js
7283
+
7284
+
7285
+
5601
7286
 
5602
7287
 
5603
7288
 
@@ -5611,9 +7296,12 @@ var Project_component = normalizeComponent(
5611
7296
  Grid: Grid,
5612
7297
  DependencyLines: DependencyLines,
5613
7298
  Calendar: Calendar,
5614
- Task: Task,
5615
- Milestone: Milestone,
5616
- Project: Project,
7299
+ task: Task,
7300
+ milestone: Milestone,
7301
+ project: Project,
7302
+ epic: Epic,
7303
+ subtask: Subtask,
7304
+ story: Story,
5617
7305
  DaysHighlight: DaysHighlight
5618
7306
  },
5619
7307
  inject: ['root'],
@@ -5643,9 +7331,9 @@ var Project_component = normalizeComponent(
5643
7331
  }
5644
7332
  }
5645
7333
  });
5646
- ;// ./src/components/components/Chart/Chart.vue?vue&type=script&lang=js
7334
+ ;// ./src/components/Chart/Chart.vue?vue&type=script&lang=js
5647
7335
  /* harmony default export */ var Chart_Chartvue_type_script_lang_js = (Chartvue_type_script_lang_js);
5648
- ;// ./src/components/components/Chart/Chart.vue
7336
+ ;// ./src/components/Chart/Chart.vue
5649
7337
 
5650
7338
 
5651
7339
 
@@ -5655,8 +7343,8 @@ var Project_component = normalizeComponent(
5655
7343
  ;
5656
7344
  var Chart_component = normalizeComponent(
5657
7345
  Chart_Chartvue_type_script_lang_js,
5658
- Chartvue_type_template_id_4ae99150_render,
5659
- Chartvue_type_template_id_4ae99150_staticRenderFns,
7346
+ Chartvue_type_template_id_1d5eb6d6_render,
7347
+ Chartvue_type_template_id_1d5eb6d6_staticRenderFns,
5660
7348
  false,
5661
7349
  null,
5662
7350
  null,
@@ -5665,7 +7353,7 @@ var Chart_component = normalizeComponent(
5665
7353
  )
5666
7354
 
5667
7355
  /* harmony default export */ var Chart = (Chart_component.exports);
5668
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/components/MainView.vue?vue&type=script&lang=js
7356
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/MainView.vue?vue&type=script&lang=js
5669
7357
 
5670
7358
 
5671
7359
  let ignoreScrollEvents = false;
@@ -5849,9 +7537,9 @@ let ignoreScrollEvents = false;
5849
7537
  // document.removeEventListener('touchend', this.chartMouseUp);
5850
7538
  // }
5851
7539
  });
5852
- ;// ./src/components/components/MainView.vue?vue&type=script&lang=js
7540
+ ;// ./src/components/MainView.vue?vue&type=script&lang=js
5853
7541
  /* harmony default export */ var components_MainViewvue_type_script_lang_js = (MainViewvue_type_script_lang_js);
5854
- ;// ./src/components/components/MainView.vue
7542
+ ;// ./src/components/MainView.vue
5855
7543
 
5856
7544
 
5857
7545
 
@@ -5861,8 +7549,8 @@ let ignoreScrollEvents = false;
5861
7549
  ;
5862
7550
  var MainView_component = normalizeComponent(
5863
7551
  components_MainViewvue_type_script_lang_js,
5864
- MainViewvue_type_template_id_5e6f381a_render,
5865
- MainViewvue_type_template_id_5e6f381a_staticRenderFns,
7552
+ MainViewvue_type_template_id_1a4b756c_render,
7553
+ MainViewvue_type_template_id_1a4b756c_staticRenderFns,
5866
7554
  false,
5867
7555
  null,
5868
7556
  null,
@@ -5871,7 +7559,7 @@ var MainView_component = normalizeComponent(
5871
7559
  )
5872
7560
 
5873
7561
  /* harmony default export */ var MainView = (MainView_component.exports);
5874
- ;// ./src/components/style.js
7562
+ ;// ./src/style.js
5875
7563
  function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
5876
7564
  return {
5877
7565
  fontSize,
@@ -5921,10 +7609,10 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
5921
7609
  'calendar-row-rect-child': {
5922
7610
  display: 'block',
5923
7611
  'border-right-width': '1px',
5924
- // Calendar
5925
- 'border-right-color': '#dadada',
7612
+ 'border-right-color': '#E5E7EB',
5926
7613
  'border-right-style': 'solid',
5927
- position: 'relative'
7614
+ position: 'relative',
7615
+ 'box-sizing': 'border-box'
5928
7616
  },
5929
7617
  'calendar-row-rect-child--month': {},
5930
7618
  'calendar-row-rect-child--day': {
@@ -5940,11 +7628,20 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
5940
7628
  //GanttElastic
5941
7629
  color: '#606060',
5942
7630
  display: 'inline-block',
5943
- position: 'relative'
7631
+ position: 'relative',
7632
+ 'text-align': 'center',
7633
+ 'white-space': 'nowrap',
7634
+ 'overflow': 'hidden',
7635
+ 'text-overflow': 'ellipsis',
7636
+ 'max-width': '100%',
7637
+ 'width': '100%',
7638
+ 'box-sizing': 'border-box'
5944
7639
  },
5945
7640
  'calendar-row-text--month': {},
5946
7641
  'calendar-row-text--day': {},
5947
7642
  'calendar-row-text--hour': {},
7643
+ 'calendar-row-text--quarter': {},
7644
+ 'calendar-row-text--week': {},
5948
7645
  'task-list-wrapper': {},
5949
7646
  'task-list': {
5950
7647
  background: 'transparent',
@@ -5987,6 +7684,13 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
5987
7684
  fill: '#ffffffa0',
5988
7685
  stroke: '#000000A0'
5989
7686
  },
7687
+ 'task-list-expander-arrow': {
7688
+ fill: 'none',
7689
+ stroke: '#999999',
7690
+ 'stroke-width': '2',
7691
+ 'stroke-linecap': 'round',
7692
+ 'stroke-linejoin': 'round'
7693
+ },
5990
7694
  'chart-expander-wrapper': {
5991
7695
  display: 'block',
5992
7696
  'line-height': '1',
@@ -6010,6 +7714,13 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
6010
7714
  fill: '#ffffffa0',
6011
7715
  stroke: '#000000A0'
6012
7716
  },
7717
+ 'chart-expander-arrow': {
7718
+ fill: 'none',
7719
+ stroke: '#999999',
7720
+ 'stroke-width': '2',
7721
+ 'stroke-linecap': 'round',
7722
+ 'stroke-linejoin': 'round'
7723
+ },
6013
7724
  'task-list-container': {},
6014
7725
  'task-list-header-label': {
6015
7726
  overflow: 'hidden',
@@ -6066,7 +7777,8 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
6066
7777
  overflow: 'hidden'
6067
7778
  },
6068
7779
  'task-list-item-value': {
6069
- display: 'block',
7780
+ display: 'flex',
7781
+ 'align-items': 'center',
6070
7782
  'flex-shrink': '100',
6071
7783
  'font-family': fontFamily,
6072
7784
  'font-size': fontSize,
@@ -6083,13 +7795,34 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
6083
7795
  color: '#606060',
6084
7796
  background: '#FFFFFF'
6085
7797
  },
7798
+ 'task-list-item-content': {
7799
+ 'display': 'flex',
7800
+ 'align-items': 'center',
7801
+ 'width': '100%',
7802
+ 'min-width': '0'
7803
+ },
7804
+ 'task-list-item-icon': {
7805
+ 'display': 'flex',
7806
+ 'align-items': 'center',
7807
+ 'margin-right': '6px',
7808
+ 'flex-shrink': '0',
7809
+ 'width': '14px',
7810
+ 'height': '14px'
7811
+ },
7812
+ 'task-list-item-text': {
7813
+ 'flex': '1',
7814
+ 'min-width': '0',
7815
+ 'overflow': 'hidden',
7816
+ 'text-overflow': 'ellipsis',
7817
+ 'white-space': 'nowrap'
7818
+ },
6086
7819
  'grid-lines': {},
6087
7820
  'grid-line-horizontal': {
6088
- stroke: '#00000010',
7821
+ stroke: '#F3F4F6',
6089
7822
  'stroke-width': 1
6090
7823
  },
6091
7824
  'grid-line-vertical': {
6092
- stroke: '#00000010',
7825
+ stroke: '#E5E7EB',
6093
7826
  'stroke-width': 1
6094
7827
  },
6095
7828
  'grid-line-time': {
@@ -6104,13 +7837,17 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
6104
7837
  'user-select': 'none',
6105
7838
  overflow: 'hidden',
6106
7839
  'max-width': '100%',
6107
- 'border-right': '1px solid #eee'
7840
+ 'border-right': '1px solid #E5E7EB',
7841
+ 'position': 'relative',
7842
+ 'z-index': 1
6108
7843
  },
6109
7844
  'chart-graph-container': {
6110
7845
  'user-select': 'none',
6111
7846
  overflow: 'hidden',
6112
7847
  'max-width': '100%',
6113
- 'border-right': '1px solid #eee'
7848
+ 'border-right': '1px solid #E5E7EB',
7849
+ 'position': 'relative',
7850
+ 'z-index': 0
6114
7851
  },
6115
7852
  'chart-area': {},
6116
7853
  'chart-graph': {
@@ -6118,17 +7855,23 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
6118
7855
  },
6119
7856
  'chart-row-text-wrapper': {},
6120
7857
  'chart-row-text': {
6121
- background: '#ffffffa0',
6122
- 'border-radius': '10px',
7858
+ background: '#ffffff',
7859
+ 'border-radius': '4px',
6123
7860
  'font-family': fontFamily,
6124
- 'font-size': fontSize,
6125
- 'font-weight': 'normal',
6126
- color: '#000000a0',
7861
+ 'font-size': '11px',
7862
+ 'font-weight': '500',
7863
+ color: '#374151',
6127
7864
  height: '100%',
6128
- display: 'inline-block'
7865
+ display: 'inline-block',
7866
+ 'box-shadow': '0 1px 3px rgba(0, 0, 0, 0.1)',
7867
+ 'border': '1px solid #E5E7EB'
6129
7868
  },
6130
7869
  'chart-row-text-content': {
6131
- padding: '0px 6px'
7870
+ padding: '2px 8px',
7871
+ 'white-space': 'nowrap',
7872
+ 'overflow': 'hidden',
7873
+ 'text-overflow': 'ellipsis',
7874
+ 'max-width': '120px'
6132
7875
  },
6133
7876
  'chart-row-text-content--text': {},
6134
7877
  'chart-row-text-content--html': {},
@@ -6143,12 +7886,46 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
6143
7886
  'chart-row-project-wrapper': {},
6144
7887
  'chart-row-project': {},
6145
7888
  'chart-row-project-polygon': {},
7889
+ 'chart-row-epic-wrapper': {},
7890
+ 'chart-row-epic': {},
7891
+ 'chart-row-epic-polygon': {
7892
+ stroke: '#8B5CF6',
7893
+ 'stroke-width': 2,
7894
+ fill: '#8B5CF6',
7895
+ 'fill-opacity': 0.9
7896
+ },
7897
+ 'chart-row-subtask-wrapper': {},
7898
+ 'chart-row-subtask': {},
7899
+ 'chart-row-subtask-polygon': {
7900
+ stroke: '#3B82F6',
7901
+ 'stroke-width': 1,
7902
+ fill: '#3B82F6',
7903
+ 'fill-opacity': 0.9
7904
+ },
7905
+ 'chart-row-story-wrapper': {},
7906
+ 'chart-row-story': {},
7907
+ 'chart-row-story-polygon': {
7908
+ stroke: '#86EFAC',
7909
+ 'stroke-width': 1,
7910
+ fill: '#86EFAC',
7911
+ 'fill-opacity': 0.9
7912
+ },
6146
7913
  'chart-row-milestone-wrapper': {},
6147
7914
  'chart-row-milestone': {},
6148
- 'chart-row-milestone-polygon': {},
7915
+ 'chart-row-milestone-polygon': {
7916
+ stroke: '#CD5C5C',
7917
+ 'stroke-width': 2,
7918
+ fill: '#CD5C5C',
7919
+ 'fill-opacity': 0.9
7920
+ },
6149
7921
  'chart-row-task-wrapper': {},
6150
7922
  'chart-row-task': {},
6151
- 'chart-row-task-polygon': {},
7923
+ 'chart-row-task-polygon': {
7924
+ stroke: '#3B82F6',
7925
+ 'stroke-width': 1,
7926
+ fill: '#3B82F6',
7927
+ 'fill-opacity': 0.9
7928
+ },
6152
7929
  'chart-row-progress-bar-wrapper': {},
6153
7930
  'chart-row-progress-bar': {},
6154
7931
  'chart-row-progress-bar-line': {
@@ -7122,8 +8899,8 @@ var index = (function () {
7122
8899
 
7123
8900
  /* harmony default export */ var ResizeObserver_es = (index);
7124
8901
 
7125
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
7126
- var Headervue_type_template_id_63647db0_render = function render() {
8902
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
8903
+ var Headervue_type_template_id_7624c9ea_render = function render() {
7127
8904
  var _vm = this,
7128
8905
  _c = _vm._self._c;
7129
8906
  return _c('div', {
@@ -7320,7 +9097,7 @@ var Headervue_type_template_id_63647db0_render = function render() {
7320
9097
  }
7321
9098
  }), _vm._v(" " + _vm._s(_vm.opts.locale["Display task list"]) + " ")], 1)])]);
7322
9099
  };
7323
- var Headervue_type_template_id_63647db0_staticRenderFns = [];
9100
+ var Headervue_type_template_id_7624c9ea_staticRenderFns = [];
7324
9101
 
7325
9102
  // EXTERNAL MODULE: ./node_modules/vue-slider-component/dist/vue-slider-component.umd.min.js
7326
9103
  var vue_slider_component_umd_min = __webpack_require__(378);
@@ -7434,7 +9211,7 @@ var switches_component = normalizeComponent(
7434
9211
  )
7435
9212
 
7436
9213
  /* harmony default export */ var switches = (switches_component.exports);
7437
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.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
9214
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Header/Header.vue?vue&type=script&lang=js
7438
9215
 
7439
9216
 
7440
9217
 
@@ -7505,7 +9282,7 @@ const defaultStyle = {
7505
9282
  };
7506
9283
  const defaultOptions = {
7507
9284
  title: {
7508
- label: "",
9285
+ label: "ajay",
7509
9286
  html: true
7510
9287
  },
7511
9288
  locale: {
@@ -7543,6 +9320,7 @@ const defaultOptions = {
7543
9320
  };
7544
9321
  },
7545
9322
  created() {
9323
+ debugger; // eslint-disable-line no-debugger
7546
9324
  defaultOptions.title.label = this.root.projectName;
7547
9325
  this.localScale = this.root.state.options.times.timeZoom;
7548
9326
  this.localHeight = this.root.state.options.row.height;
@@ -7643,9 +9421,9 @@ const defaultOptions = {
7643
9421
  }
7644
9422
  }
7645
9423
  });
7646
- ;// ./src/components/components/Header/Header.vue?vue&type=script&lang=js
9424
+ ;// ./src/components/Header/Header.vue?vue&type=script&lang=js
7647
9425
  /* harmony default export */ var Header_Headervue_type_script_lang_js = (Headervue_type_script_lang_js);
7648
- ;// ./src/components/components/Header/Header.vue
9426
+ ;// ./src/components/Header/Header.vue
7649
9427
 
7650
9428
 
7651
9429
 
@@ -7655,8 +9433,8 @@ const defaultOptions = {
7655
9433
  ;
7656
9434
  var Header_component = normalizeComponent(
7657
9435
  Header_Headervue_type_script_lang_js,
7658
- Headervue_type_template_id_63647db0_render,
7659
- Headervue_type_template_id_63647db0_staticRenderFns,
9436
+ Headervue_type_template_id_7624c9ea_render,
9437
+ Headervue_type_template_id_7624c9ea_staticRenderFns,
7660
9438
  false,
7661
9439
  null,
7662
9440
  null,
@@ -7665,7 +9443,14 @@ var Header_component = normalizeComponent(
7665
9443
  )
7666
9444
 
7667
9445
  /* harmony default export */ var Header = (Header_component.exports);
7668
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/GanttElastic.vue?vue&type=script&lang=js
9446
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.vue?vue&type=script&lang=js
9447
+
9448
+
9449
+
9450
+
9451
+
9452
+
9453
+
7669
9454
 
7670
9455
 
7671
9456
 
@@ -7678,6 +9463,7 @@ var Header_component = normalizeComponent(
7678
9463
 
7679
9464
 
7680
9465
 
9466
+
7681
9467
  const ctx = document.createElement('canvas').getContext('2d');
7682
9468
  // let VueInst = VueInstance;
7683
9469
  // function initVue() {
@@ -7687,7 +9473,7 @@ const ctx = document.createElement('canvas').getContext('2d');
7687
9473
  // }
7688
9474
  // initVue();
7689
9475
 
7690
- // let hourWidthCache = null;
9476
+ let hourWidthCache = null;
7691
9477
 
7692
9478
  /**
7693
9479
  * Helper function to fill out empty options in user settings
@@ -7790,15 +9576,15 @@ function getOptions(userOptions) {
7790
9576
  bar: false
7791
9577
  },
7792
9578
  text: {
7793
- offset: 4,
9579
+ offset: 8,
7794
9580
  //*
7795
- xPadding: 10,
9581
+ xPadding: 12,
7796
9582
  //*
7797
9583
  display: true //*
7798
9584
  },
7799
9585
  expander: {
7800
9586
  type: 'chart',
7801
- display: false,
9587
+ display: true,
7802
9588
  //*
7803
9589
  displayIfTaskListHidden: true,
7804
9590
  //*
@@ -7830,7 +9616,7 @@ function getOptions(userOptions) {
7830
9616
  minWidth: 18,
7831
9617
  expander: {
7832
9618
  type: 'task-list',
7833
- size: 16,
9619
+ size: 18,
7834
9620
  columnWidth: 24,
7835
9621
  padding: 16,
7836
9622
  margin: 10,
@@ -7919,6 +9705,30 @@ function getOptions(userOptions) {
7919
9705
  return date.format('MMMM YYYY');
7920
9706
  }
7921
9707
  }
9708
+ },
9709
+ quarter: {
9710
+ height: 30,
9711
+ //*
9712
+ display: true,
9713
+ //*
9714
+ widths: [],
9715
+ maxWidths: {
9716
+ short: 0,
9717
+ medium: 0,
9718
+ long: 0
9719
+ },
9720
+ format: {
9721
+ //*
9722
+ short(date) {
9723
+ return date.format('Qo quarter');
9724
+ },
9725
+ medium(date) {
9726
+ return date.format("Qo 'YY");
9727
+ },
9728
+ long(date) {
9729
+ return date.format('Qo quarter YYYY');
9730
+ }
9731
+ }
7922
9732
  }
7923
9733
  },
7924
9734
  locale: {
@@ -8161,7 +9971,8 @@ const GanttElastic = {
8161
9971
  name: 'GanttElastic',
8162
9972
  components: {
8163
9973
  MainView: MainView,
8164
- 'gantt-header': Header
9974
+ 'gantt-header': Header,
9975
+ 'gantt-view-filter': GanttViewFilter
8165
9976
  },
8166
9977
  props: ['tasks', 'options', 'dynamicStyle', 'isHeaderVisible', 'projectName'],
8167
9978
  provide() {
@@ -8190,7 +10001,7 @@ const GanttElastic = {
8190
10001
  refs: {},
8191
10002
  tasksById: {},
8192
10003
  taskTree: {},
8193
- ctx: ctx,
10004
+ ctx,
8194
10005
  emitTasksChanges: true,
8195
10006
  // some operations may pause emitting changes to parent component
8196
10007
  emitOptionsChanges: true,
@@ -8208,6 +10019,51 @@ const GanttElastic = {
8208
10019
  methods: {
8209
10020
  mergeDeep,
8210
10021
  mergeDeepReactive,
10022
+ onViewModeChanged(mode) {
10023
+ // Update the calendar view mode
10024
+ this.options.calendar.viewMode = mode;
10025
+
10026
+ // Update the step duration based on the view mode
10027
+ if (this.options.times) {
10028
+ switch (mode) {
10029
+ case 'quarter':
10030
+ this.options.times.stepDuration = 'quarter';
10031
+ this.options.times.timeZoom = 15; // Reset zoom for better quarter view
10032
+ break;
10033
+ case 'month':
10034
+ this.options.times.stepDuration = 'month';
10035
+ this.options.times.timeZoom = 17; // Reset zoom for better month view
10036
+ break;
10037
+ case 'week':
10038
+ this.options.times.stepDuration = 'week';
10039
+ this.options.times.timeZoom = 19; // Reset zoom for better week view
10040
+ break;
10041
+ default:
10042
+ // 'day' or any other mode
10043
+ this.options.times.stepDuration = 'day';
10044
+ this.options.times.timeZoom = 21; // Reset zoom for better day view
10045
+ break;
10046
+ }
10047
+ }
10048
+
10049
+ // Force recalculation by triggering a reactive update
10050
+ this.$nextTick(() => {
10051
+ this.$forceUpdate();
10052
+ // Recalculate start date based on new view mode and trigger full recalculation
10053
+ if (this.$refs.ganttChart) {
10054
+ // Trigger recalculation of dates and times with new view mode
10055
+ this.$refs.ganttChart.prepareDates();
10056
+ this.$refs.ganttChart.initTimes();
10057
+ this.$refs.ganttChart.calculateSteps();
10058
+ this.$refs.ganttChart.computeCalendarWidths();
10059
+
10060
+ // Ensure perfect alignment between calendar and chart
10061
+ if (this.$refs.ganttChart.ensureCalendarChartAlignment) {
10062
+ this.$refs.ganttChart.ensureCalendarChartAlignment();
10063
+ }
10064
+ }
10065
+ });
10066
+ },
8211
10067
  /**
8212
10068
  * Calculate height of scrollbar in current browser
8213
10069
  *
@@ -8343,7 +10199,22 @@ const GanttElastic = {
8343
10199
  tasks = this.fillTasks(tasks);
8344
10200
  this.state.tasksById = this.resetTaskTree(tasks);
8345
10201
  this.state.taskTree = this.makeTaskTree(this.state.rootTask, tasks);
8346
- this.state.tasks = this.state.taskTree.allChildren.map(childId => this.getTask(childId));
10202
+
10203
+ // Get all visible tasks including parent tasks
10204
+ const visibleTaskIds = new Set();
10205
+
10206
+ // Add all root-level tasks (these include parent tasks that don't have parentId)
10207
+ this.state.taskTree.allChildren.forEach(childId => {
10208
+ visibleTaskIds.add(childId);
10209
+ });
10210
+
10211
+ // Also add any parent tasks that have children but might not be in root children
10212
+ tasks.forEach(task => {
10213
+ if (task.allChildren && task.allChildren.length > 0) {
10214
+ visibleTaskIds.add(task.id);
10215
+ }
10216
+ });
10217
+ this.state.tasks = Array.from(visibleTaskIds).map(childId => this.getTask(childId));
8347
10218
  this.calculateTaskListColumnsDimensions();
8348
10219
  this.state.options.scrollBarHeight = this.getScrollBarHeight();
8349
10220
  this.state.options.outerHeight = this.state.options.height + this.state.options.scrollBarHeight;
@@ -8495,11 +10366,21 @@ const GanttElastic = {
8495
10366
  if (typeof task === 'number' || typeof task === 'string') {
8496
10367
  task = this.getTask(task);
8497
10368
  }
10369
+
10370
+ // Always show parent tasks (tasks with children) - they need to be visible for expander functionality
10371
+ if (task.allChildren && task.allChildren.length > 0) {
10372
+ return true;
10373
+ }
10374
+
10375
+ // For child tasks, check if any parent is collapsed
8498
10376
  for (let i = 0, len = task.parents.length; i < len; i++) {
8499
- if (this.getTask(task.parents[i]).collapsed) {
10377
+ const parentTask = this.getTask(task.parents[i]);
10378
+ if (parentTask && parentTask.collapsed) {
8500
10379
  return false;
8501
10380
  }
8502
10381
  }
10382
+
10383
+ // Show all other tasks (root-level tasks and non-collapsed child tasks)
8503
10384
  return true;
8504
10385
  },
8505
10386
  /**
@@ -8757,46 +10638,311 @@ const GanttElastic = {
8757
10638
  this.$on('taskList-width-change', this.onTaskListWidthChange);
8758
10639
  this.$on('taskList-column-width-change', this.onTaskListColumnWidthChange);
8759
10640
  },
10641
+ /**
10642
+ * Get responsive step widths based on screen size
10643
+ */
10644
+ getResponsiveStepWidths(stepDuration) {
10645
+ const clientWidth = this.state.options.clientWidth;
10646
+
10647
+ // Enhanced base step widths for different screen sizes
10648
+ const baseWidths = {
10649
+ 'day': {
10650
+ mobile: 40,
10651
+ tablet: 50,
10652
+ desktopSmall: 60,
10653
+ desktopBig: 80
10654
+ },
10655
+ 'week': {
10656
+ mobile: 80,
10657
+ tablet: 100,
10658
+ desktopSmall: 120,
10659
+ desktopBig: 150
10660
+ },
10661
+ 'month': {
10662
+ mobile: 120,
10663
+ tablet: 140,
10664
+ desktopSmall: 160,
10665
+ desktopBig: 200
10666
+ },
10667
+ 'quarter': {
10668
+ mobile: 200,
10669
+ tablet: 250,
10670
+ desktopSmall: 300,
10671
+ desktopBig: 400
10672
+ }
10673
+ };
10674
+
10675
+ // Determine screen size with desktop variants
10676
+ let screenSize;
10677
+ if (clientWidth < 768) {
10678
+ screenSize = 'mobile';
10679
+ } else if (clientWidth < 1024) {
10680
+ screenSize = 'tablet';
10681
+ } else if (clientWidth < 1440) {
10682
+ screenSize = 'desktopSmall';
10683
+ } else {
10684
+ screenSize = 'desktopBig';
10685
+ }
10686
+
10687
+ // Get responsive width for the step duration
10688
+ let responsiveWidth = baseWidths[stepDuration][screenSize];
10689
+
10690
+ // Calculate dynamic width based on data content
10691
+ const dataBasedWidth = this.getDataBasedStepWidth(stepDuration, clientWidth);
10692
+
10693
+ // Use the larger of responsive width or data-based width
10694
+ return Math.max(responsiveWidth, dataBasedWidth);
10695
+ },
10696
+ /**
10697
+ * Get step width based on data content and minimum visibility requirements
10698
+ */
10699
+ getDataBasedStepWidth(stepDuration, clientWidth) {
10700
+ const estimatedSteps = this.getEstimatedStepCount(stepDuration);
10701
+ const taskListWidth = 300; // Account for task list width
10702
+ const availableWidth = clientWidth - taskListWidth;
10703
+
10704
+ // Define minimum visibility requirements
10705
+ const minVisibilitySteps = {
10706
+ 'day': 30,
10707
+ // Show at least 30 days
10708
+ 'week': 12,
10709
+ // Show at least 12 weeks (3 months)
10710
+ 'month': 8,
10711
+ // Show at least 8 months
10712
+ 'quarter': 3 // Show at least 3 quarters
10713
+ };
10714
+
10715
+ // Calculate minimum steps needed for good visibility
10716
+ const minSteps = Math.max(estimatedSteps, minVisibilitySteps[stepDuration]);
10717
+
10718
+ // Define minimum readable width per step
10719
+ const minReadableWidth = {
10720
+ 'day': 30,
10721
+ 'week': 60,
10722
+ 'month': 80,
10723
+ 'quarter': 120
10724
+ };
10725
+
10726
+ // Calculate width per step to ensure minimum visibility
10727
+ const minWidthPerStep = availableWidth / minSteps;
10728
+
10729
+ // Use the larger of minimum readable width or calculated width
10730
+ const calculatedWidth = Math.max(minWidthPerStep, minReadableWidth[stepDuration]);
10731
+
10732
+ // Define maximum reasonable width per step
10733
+ const maxWidthPerStep = {
10734
+ 'day': 100,
10735
+ 'week': 200,
10736
+ 'month': 300,
10737
+ 'quarter': 500
10738
+ };
10739
+
10740
+ // Ensure we don't exceed maximum reasonable width
10741
+ return Math.min(calculatedWidth, maxWidthPerStep[stepDuration]);
10742
+ },
10743
+ /**
10744
+ * Get maximum width multiplier based on screen size and data content
10745
+ */
10746
+ getMaxWidthMultiplier(stepDuration, stepCount) {
10747
+ const clientWidth = this.state.options.clientWidth;
10748
+
10749
+ // Base multipliers for different screen sizes
10750
+ const baseMultipliers = {
10751
+ mobile: 2,
10752
+ // 2x viewport width on mobile
10753
+ tablet: 2.5,
10754
+ // 2.5x viewport width on tablet
10755
+ desktopSmall: 3,
10756
+ // 3x viewport width on small desktop
10757
+ desktopBig: 4 // 4x viewport width on big desktop
10758
+ };
10759
+
10760
+ // Determine screen size
10761
+ let screenSize;
10762
+ if (clientWidth < 768) {
10763
+ screenSize = 'mobile';
10764
+ } else if (clientWidth < 1024) {
10765
+ screenSize = 'tablet';
10766
+ } else if (clientWidth < 1440) {
10767
+ screenSize = 'desktopSmall';
10768
+ } else {
10769
+ screenSize = 'desktopBig';
10770
+ }
10771
+ let multiplier = baseMultipliers[screenSize];
10772
+
10773
+ // Adjust multiplier based on data content
10774
+ const minVisibilitySteps = {
10775
+ 'day': 30,
10776
+ 'week': 12,
10777
+ 'month': 8,
10778
+ 'quarter': 3
10779
+ };
10780
+
10781
+ // If we have more data than minimum visibility, allow more width
10782
+ if (stepCount > minVisibilitySteps[stepDuration]) {
10783
+ const dataRatio = stepCount / minVisibilitySteps[stepDuration];
10784
+ multiplier = Math.min(multiplier * (1 + dataRatio * 0.5), 6); // Max 6x viewport width
10785
+ }
10786
+ return multiplier;
10787
+ },
10788
+ /**
10789
+ * Get estimated step count for responsive calculations
10790
+ */
10791
+ getEstimatedStepCount(stepDuration) {
10792
+ const totalDurationMs = dayjs_min_default()(this.state.options.times.lastTime).diff(this.state.options.times.firstTime, 'milliseconds');
10793
+ switch (stepDuration) {
10794
+ case 'quarter':
10795
+ return Math.ceil(dayjs_min_default()(this.state.options.times.lastTime).diff(dayjs_min_default()(this.state.options.times.firstTime), 'quarter', true));
10796
+ case 'month':
10797
+ return Math.ceil(dayjs_min_default()(this.state.options.times.lastTime).diff(dayjs_min_default()(this.state.options.times.firstTime), 'month', true));
10798
+ case 'week':
10799
+ return Math.ceil(dayjs_min_default()(this.state.options.times.lastTime).diff(dayjs_min_default()(this.state.options.times.firstTime), 'week', true));
10800
+ case 'day':
10801
+ default:
10802
+ return Math.ceil(dayjs_min_default()(this.state.options.times.lastTime).diff(dayjs_min_default()(this.state.options.times.firstTime), 'day', true));
10803
+ }
10804
+ },
8760
10805
  /**
8761
10806
  * When some action was performed (scale change for example) - recalculate time variables
8762
10807
  */
8763
10808
  recalculateTimes() {
8764
- let max = this.state.options.times.timeScale * 60;
8765
- let min = this.state.options.times.timeScale;
8766
- let steps = max / min;
8767
- let percent = this.state.options.times.timeZoom / 100;
8768
- this.state.options.times.timePerPixel = this.state.options.times.timeScale * steps * percent + Math.pow(2, this.state.options.times.timeZoom);
8769
- this.state.options.times.totalViewDurationMs = dayjs_min_default()(this.state.options.times.lastTime).diff(this.state.options.times.firstTime, 'milliseconds');
10809
+ const stepDuration = this.state.options.times.stepDuration;
10810
+ const timeZoom = this.state.options.times.timeZoom;
10811
+
10812
+ // Calculate base time per pixel based on step duration
10813
+ let baseTimePerPixel;
10814
+ const totalDurationMs = dayjs_min_default()(this.state.options.times.lastTime).diff(this.state.options.times.firstTime, 'milliseconds');
10815
+
10816
+ // Get responsive step width based on screen size and data content
10817
+ const responsiveStepWidth = this.getResponsiveStepWidths(stepDuration);
10818
+
10819
+ // Calculate how many steps we'll have
10820
+ const stepCount = this.getEstimatedStepCount(stepDuration);
10821
+
10822
+ // Define minimum visibility requirements
10823
+ const minVisibilitySteps = {
10824
+ 'day': 30,
10825
+ // Show at least 30 days
10826
+ 'week': 12,
10827
+ // Show at least 12 weeks (3 months)
10828
+ 'month': 8,
10829
+ // Show at least 8 months
10830
+ 'quarter': 3 // Show at least 3 quarters
10831
+ };
10832
+
10833
+ // Ensure we show at least the minimum number of steps
10834
+ const actualSteps = Math.max(stepCount, minVisibilitySteps[stepDuration]);
10835
+
10836
+ // Ensure minimum visibility for all view types
10837
+ if (stepCount < minVisibilitySteps[stepDuration]) {
10838
+ const firstTime = dayjs_min_default()(this.state.options.times.firstTime);
10839
+ let lastTime;
10840
+ switch (stepDuration) {
10841
+ case 'month':
10842
+ lastTime = firstTime.add(8, 'month');
10843
+ break;
10844
+ case 'week':
10845
+ lastTime = firstTime.add(12, 'week');
10846
+ break;
10847
+ case 'quarter':
10848
+ lastTime = firstTime.add(3, 'quarter');
10849
+ break;
10850
+ case 'day':
10851
+ default:
10852
+ lastTime = firstTime.add(30, 'day');
10853
+ break;
10854
+ }
10855
+ this.state.options.times.lastTime = lastTime.valueOf();
10856
+ // Recalculate total duration with extended range
10857
+ const extendedDurationMs = lastTime.diff(firstTime, 'milliseconds');
10858
+ const minSteps = minVisibilitySteps[stepDuration];
10859
+ this.state.options.times.timePerPixel = extendedDurationMs / (minSteps * responsiveStepWidth);
10860
+ this.state.options.times.totalViewDurationMs = extendedDurationMs;
10861
+ this.state.options.times.totalViewDurationPx = minSteps * responsiveStepWidth;
10862
+ return; // Exit early for views with extended range
10863
+ }
10864
+
10865
+ // Calculate total width needed for all steps
10866
+ const totalWidthNeeded = actualSteps * responsiveStepWidth;
10867
+
10868
+ // Calculate time per pixel to fit the content with responsive step width
10869
+ this.state.options.times.timePerPixel = totalDurationMs / totalWidthNeeded;
10870
+
10871
+ // Apply zoom factor (higher zoom = more compressed view)
10872
+ const zoomFactor = Math.pow(0.8, (timeZoom - 17) / 10); // Adjust zoom sensitivity
10873
+ this.state.options.times.timePerPixel *= zoomFactor;
10874
+ this.state.options.times.totalViewDurationMs = totalDurationMs;
8770
10875
  this.state.options.times.totalViewDurationPx = this.state.options.times.totalViewDurationMs / this.state.options.times.timePerPixel;
8771
- this.state.options.width = this.state.options.times.totalViewDurationPx + this.style['grid-line-vertical']['stroke-width'];
10876
+
10877
+ // Calculate final width
10878
+ const calculatedWidth = this.state.options.times.totalViewDurationPx + this.style['grid-line-vertical']['stroke-width'];
10879
+
10880
+ // Define maximum width based on screen size and data content
10881
+ const maxWidthMultiplier = this.getMaxWidthMultiplier(stepDuration, actualSteps);
10882
+ const maxWidth = this.state.options.clientWidth * maxWidthMultiplier;
10883
+
10884
+ // Ensure minimum width for scrolling when we have minimum visibility requirements
10885
+ const minWidthForScrolling = this.state.options.clientWidth * 1.2; // 20% more than viewport
10886
+ const finalWidth = Math.max(calculatedWidth, minWidthForScrolling);
10887
+ if (finalWidth > maxWidth) {
10888
+ // Only limit width if it's truly excessive
10889
+ this.state.options.times.timePerPixel = totalDurationMs / (maxWidth - this.style['grid-line-vertical']['stroke-width']);
10890
+ this.state.options.times.totalViewDurationPx = totalDurationMs / this.state.options.times.timePerPixel;
10891
+ this.state.options.width = maxWidth;
10892
+ } else {
10893
+ this.state.options.width = finalWidth;
10894
+ }
8772
10895
  },
8773
10896
  /**
8774
10897
  * Initialize time variables
8775
10898
  */
8776
10899
  initTimes() {
8777
- 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();
10900
+ // Calculate dynamic start date based on the formula
10901
+ const minDataDate = dayjs_min_default()(this.state.options.times.firstTaskTime).startOf('day');
10902
+ const viewBasedStartDate = this.calculateDynamicStartDate();
10903
+
10904
+ // Use the minimum of data start date and view-based start date
10905
+ const dynamicStartDate = minDataDate.isBefore(viewBasedStartDate) ? minDataDate : viewBasedStartDate;
10906
+ this.state.options.times.firstTime = dynamicStartDate.locale(this.state.options.locale.name).subtract(this.state.options.scope.before, 'days').startOf('day').valueOf();
8778
10907
  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();
8779
10908
  this.recalculateTimes();
8780
10909
  },
8781
10910
  /**
8782
10911
  * Calculate steps
8783
- * Steps are days by default
10912
+ * Steps are calculated based on stepDuration (day, week, month, quarter)
8784
10913
  * Each step contain information about time offset and pixel offset of this time inside gantt chart
8785
10914
  */
8786
10915
  calculateSteps() {
8787
10916
  const steps = [];
8788
10917
  const lastMs = dayjs_min_default()(this.state.options.times.lastTime).valueOf();
8789
- const currentDate = dayjs_min_default()(this.state.options.times.firstTime);
10918
+ const stepDuration = this.state.options.times.stepDuration;
10919
+
10920
+ // Get the appropriate startOf method based on step duration
10921
+ const getStartOf = (date, duration) => {
10922
+ switch (duration) {
10923
+ case 'quarter':
10924
+ return date.startOf('quarter');
10925
+ case 'month':
10926
+ return date.startOf('month');
10927
+ case 'week':
10928
+ return date.startOf('week');
10929
+ case 'day':
10930
+ default:
10931
+ return date.startOf('day');
10932
+ }
10933
+ };
10934
+ const firstDate = dayjs_min_default()(this.state.options.times.firstTime);
8790
10935
  steps.push({
8791
- time: currentDate.valueOf(),
10936
+ time: firstDate.valueOf(),
8792
10937
  offset: {
8793
10938
  ms: 0,
8794
10939
  px: 0
8795
10940
  }
8796
10941
  });
8797
- 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')) {
10942
+ let currentDate = getStartOf(firstDate.clone().add(1, stepDuration), stepDuration);
10943
+ while (currentDate.valueOf() <= lastMs) {
8798
10944
  const offsetMs = currentDate.diff(this.state.options.times.firstTime, 'milliseconds');
8799
- const offsetPx = offsetMs / this.state.options.times.timePerPixel;
10945
+ const offsetPx = Math.round(offsetMs / this.state.options.times.timePerPixel); // Round to avoid sub-pixel issues
8800
10946
  const step = {
8801
10947
  time: currentDate.valueOf(),
8802
10948
  offset: {
@@ -8807,14 +10953,17 @@ const GanttElastic = {
8807
10953
  const previousStep = steps[steps.length - 1];
8808
10954
  previousStep.width = {
8809
10955
  ms: offsetMs - previousStep.offset.ms,
8810
- px: offsetPx - previousStep.offset.px
10956
+ px: Math.round(offsetPx - previousStep.offset.px) // Round to avoid sub-pixel issues
8811
10957
  };
8812
10958
  steps.push(step);
10959
+
10960
+ // Move to next step
10961
+ currentDate = getStartOf(currentDate.add(1, stepDuration), stepDuration);
8813
10962
  }
8814
10963
  const lastStep = steps[steps.length - 1];
8815
10964
  lastStep.width = {
8816
10965
  ms: this.state.options.times.totalViewDurationMs - lastStep.offset.ms,
8817
- px: this.state.options.times.totalViewDurationPx - lastStep.offset.px
10966
+ px: Math.round(this.state.options.times.totalViewDurationPx - lastStep.offset.px) // Round to avoid sub-pixel issues
8818
10967
  };
8819
10968
  this.state.options.times.steps = steps;
8820
10969
  },
@@ -8953,6 +11102,32 @@ const GanttElastic = {
8953
11102
  currentDate = currentDate.add(1, 'month');
8954
11103
  }
8955
11104
  },
11105
+ /**
11106
+ * Calculate dynamic start date based on view mode and current date
11107
+ * 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)
11108
+ */
11109
+ calculateDynamicStartDate() {
11110
+ const currentDate = dayjs_min_default()();
11111
+ const stepDuration = this.state.options.times.stepDuration;
11112
+ let viewBasedStartDate;
11113
+ switch (stepDuration) {
11114
+ case 'day':
11115
+ viewBasedStartDate = currentDate.startOf('day');
11116
+ break;
11117
+ case 'week':
11118
+ viewBasedStartDate = currentDate.subtract(1, 'week').startOf('week');
11119
+ break;
11120
+ case 'month':
11121
+ viewBasedStartDate = currentDate.subtract(1, 'month').startOf('month');
11122
+ break;
11123
+ case 'quarter':
11124
+ viewBasedStartDate = currentDate.subtract(1, 'quarter').startOf('quarter');
11125
+ break;
11126
+ default:
11127
+ viewBasedStartDate = currentDate.startOf('day');
11128
+ }
11129
+ return viewBasedStartDate;
11130
+ },
8956
11131
  /**
8957
11132
  * Prepare time and date variables for gantt
8958
11133
  */
@@ -8970,7 +11145,14 @@ const GanttElastic = {
8970
11145
  }
8971
11146
  this.state.options.times.firstTaskTime = firstTaskTime;
8972
11147
  this.state.options.times.lastTaskTime = lastTaskTime;
8973
- 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();
11148
+
11149
+ // Calculate dynamic start date based on the formula
11150
+ const minDataDate = dayjs_min_default()(firstTaskTime).startOf('day');
11151
+ const viewBasedStartDate = this.calculateDynamicStartDate();
11152
+
11153
+ // Use the minimum of data start date and view-based start date
11154
+ const dynamicStartDate = minDataDate.isBefore(viewBasedStartDate) ? minDataDate : viewBasedStartDate;
11155
+ this.state.options.times.firstTime = dynamicStartDate.locale(this.state.options.locale.name).subtract(this.state.options.scope.before, 'days').startOf('day').valueOf();
8974
11156
  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();
8975
11157
  },
8976
11158
  /**
@@ -9013,6 +11195,11 @@ const GanttElastic = {
9013
11195
  });
9014
11196
  }
9015
11197
  this.calculateTaskListColumnsDimensions();
11198
+
11199
+ // Recalculate times when window is resized to adjust step widths
11200
+ this.recalculateTimes();
11201
+ this.calculateSteps();
11202
+ this.computeCalendarWidths();
9016
11203
  this.$emit('calendar-recalculate');
9017
11204
  this.syncScrollTop();
9018
11205
  }
@@ -9179,14 +11366,14 @@ const GanttElastic = {
9179
11366
  }
9180
11367
  };
9181
11368
  /* harmony default export */ var GanttElasticvue_type_script_lang_js = (GanttElastic);
9182
- ;// ./src/components/GanttElastic.vue?vue&type=script&lang=js
9183
- /* harmony default export */ var components_GanttElasticvue_type_script_lang_js = (GanttElasticvue_type_script_lang_js);
9184
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.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
11369
+ ;// ./src/GanttElastic.vue?vue&type=script&lang=js
11370
+ /* harmony default export */ var src_GanttElasticvue_type_script_lang_js = (GanttElasticvue_type_script_lang_js);
11371
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.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
9185
11372
  // extracted by mini-css-extract-plugin
9186
11373
 
9187
- ;// ./src/components/GanttElastic.vue?vue&type=style&index=0&id=bf79b1fe&prod&lang=css
11374
+ ;// ./src/GanttElastic.vue?vue&type=style&index=0&id=2767341e&prod&lang=css
9188
11375
 
9189
- ;// ./src/components/GanttElastic.vue
11376
+ ;// ./src/GanttElastic.vue
9190
11377
 
9191
11378
 
9192
11379
 
@@ -9196,7 +11383,68 @@ const GanttElastic = {
9196
11383
  /* normalize component */
9197
11384
 
9198
11385
  var GanttElastic_component = normalizeComponent(
9199
- components_GanttElasticvue_type_script_lang_js,
11386
+ src_GanttElasticvue_type_script_lang_js,
11387
+ GanttElasticvue_type_template_id_2767341e_render,
11388
+ GanttElasticvue_type_template_id_2767341e_staticRenderFns,
11389
+ false,
11390
+ null,
11391
+ null,
11392
+ null
11393
+
11394
+ )
11395
+
11396
+ /* harmony default export */ var src_GanttElastic = (GanttElastic_component.exports);
11397
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.standalone.vue?vue&type=script&lang=js
11398
+
11399
+ /* harmony default export */ var GanttElastic_standalonevue_type_script_lang_js = ({
11400
+ name: 'GanttElasticStandalone',
11401
+ components: {
11402
+ 'gantt-elastic': src_GanttElastic
11403
+ },
11404
+ props: {
11405
+ // Props to receive from parent
11406
+ tasks: {
11407
+ type: Array,
11408
+ default: () => []
11409
+ },
11410
+ options: {
11411
+ type: Object,
11412
+ default: () => ({})
11413
+ },
11414
+ dynamicStyle: {
11415
+ type: Object,
11416
+ default: () => ({})
11417
+ },
11418
+ header: {
11419
+ type: Object,
11420
+ default: () => ({})
11421
+ },
11422
+ footer: {
11423
+ type: Object,
11424
+ default: () => ({})
11425
+ }
11426
+ },
11427
+ data() {
11428
+ return {
11429
+ components: {
11430
+ header: this.header,
11431
+ footer: this.footer
11432
+ }
11433
+ };
11434
+ }
11435
+ });
11436
+ ;// ./src/GanttElastic.standalone.vue?vue&type=script&lang=js
11437
+ /* harmony default export */ var src_GanttElastic_standalonevue_type_script_lang_js = (GanttElastic_standalonevue_type_script_lang_js);
11438
+ ;// ./src/GanttElastic.standalone.vue
11439
+
11440
+
11441
+
11442
+
11443
+
11444
+ /* normalize component */
11445
+ ;
11446
+ var GanttElastic_standalone_component = normalizeComponent(
11447
+ src_GanttElastic_standalonevue_type_script_lang_js,
9200
11448
  render,
9201
11449
  staticRenderFns,
9202
11450
  false,
@@ -9206,12 +11454,12 @@ var GanttElastic_component = normalizeComponent(
9206
11454
 
9207
11455
  )
9208
11456
 
9209
- /* harmony default export */ var components_GanttElastic = (GanttElastic_component.exports);
11457
+ /* harmony default export */ var GanttElastic_standalone = (GanttElastic_standalone_component.exports);
9210
11458
  ;// ./src/index.js
9211
11459
 
9212
11460
  /* harmony default export */ var src_0 = ({
9213
11461
  install(app, options = {}) {
9214
- app.component('tg-ganttchart', components_GanttElastic);
11462
+ app.component('tg-ganttchart', GanttElastic_standalone);
9215
11463
  }
9216
11464
  });
9217
11465
  // if (typeof window !== 'undefined' && window.Vue) {