tg-ganttchart 0.0.11 → 0.0.13

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.
@@ -3385,7 +3385,7 @@ if (typeof window !== 'undefined') {
3385
3385
  // Indicate to webpack that this file can be concatenated
3386
3386
  /* harmony default export */ var setPublicPath = (null);
3387
3387
 
3388
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.standalone.vue?vue&type=template&id=c24bafbc
3388
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.standalone.vue?vue&type=template&id=ba4781dc
3389
3389
  var render = function render() {
3390
3390
  var _vm = this,
3391
3391
  _c = _vm._self._c;
@@ -3394,6 +3394,32 @@ var render = function render() {
3394
3394
  "tasks": _vm.tasks,
3395
3395
  "options": _vm.options,
3396
3396
  "dynamicStyle": _vm.dynamicStyle
3397
+ },
3398
+ on: {
3399
+ "task-updated": function ($event) {
3400
+ return _vm.$emit('task-updated', $event);
3401
+ },
3402
+ "gantt-task-updated": function ($event) {
3403
+ return _vm.$emit('gantt-task-updated', $event);
3404
+ },
3405
+ "view-mode-changed": function ($event) {
3406
+ return _vm.$emit('view-mode-changed', $event);
3407
+ },
3408
+ "gantt-view-mode-changed": function ($event) {
3409
+ return _vm.$emit('gantt-view-mode-changed', $event);
3410
+ },
3411
+ "tasks-changed": function ($event) {
3412
+ return _vm.$emit('tasks-changed', $event);
3413
+ },
3414
+ "options-changed": function ($event) {
3415
+ return _vm.$emit('options-changed', $event);
3416
+ },
3417
+ "dynamic-style-changed": function ($event) {
3418
+ return _vm.$emit('dynamic-style-changed', $event);
3419
+ },
3420
+ "mounted": function ($event) {
3421
+ return _vm.$emit('mounted', $event);
3422
+ }
3397
3423
  }
3398
3424
  }, [_vm.components.header ? _c(_vm.components.header, {
3399
3425
  tag: "component",
@@ -3411,8 +3437,8 @@ var render = function render() {
3411
3437
  };
3412
3438
  var staticRenderFns = [];
3413
3439
 
3414
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.vue?vue&type=template&id=2767341e
3415
- var GanttElasticvue_type_template_id_2767341e_render = function render() {
3440
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.vue?vue&type=template&id=0a0b0d9f
3441
+ var GanttElasticvue_type_template_id_0a0b0d9f_render = function render() {
3416
3442
  var _vm = this,
3417
3443
  _c = _vm._self._c,
3418
3444
  _setup = _vm._self._setupProxy;
@@ -3435,10 +3461,13 @@ var GanttElasticvue_type_template_id_2767341e_render = function render() {
3435
3461
  },
3436
3462
  slot: "header"
3437
3463
  }), _vm._t("header"), _c('main-view', {
3438
- ref: "mainView"
3464
+ ref: "mainView",
3465
+ on: {
3466
+ "task-updated": _vm.handleTaskUpdated
3467
+ }
3439
3468
  }), _vm._t("footer")], 2);
3440
3469
  };
3441
- var GanttElasticvue_type_template_id_2767341e_staticRenderFns = [];
3470
+ var GanttElasticvue_type_template_id_0a0b0d9f_staticRenderFns = [];
3442
3471
 
3443
3472
  // EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js
3444
3473
  var es_array_push = __webpack_require__(4114);
@@ -3681,8 +3710,8 @@ var component = normalizeComponent(
3681
3710
  )
3682
3711
 
3683
3712
  /* harmony default export */ var GanttViewFilter = (component.exports);
3684
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/MainView.vue?vue&type=template&id=1a4b756c
3685
- var MainViewvue_type_template_id_1a4b756c_render = function render() {
3713
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/MainView.vue?vue&type=template&id=79e1eba9
3714
+ var MainViewvue_type_template_id_79e1eba9_render = function render() {
3686
3715
  var _vm = this,
3687
3716
  _c = _vm._self._c;
3688
3717
  return _c('div', {
@@ -3751,7 +3780,11 @@ var MainViewvue_type_template_id_1a4b756c_render = function render() {
3751
3780
  return _vm.chartWheel.apply(null, arguments);
3752
3781
  }
3753
3782
  }
3754
- }, [_c('chart')], 1)])]), _c('div', {
3783
+ }, [_c('chart', {
3784
+ on: {
3785
+ "task-updated": _vm.handleTaskUpdated
3786
+ }
3787
+ })], 1)])]), _c('div', {
3755
3788
  ref: "chartScrollContainerVertical",
3756
3789
  staticClass: "gantt-elastic__chart-scroll-container gantt-elastic__chart-scroll-container--vertical",
3757
3790
  style: {
@@ -3787,7 +3820,7 @@ var MainViewvue_type_template_id_1a4b756c_render = function render() {
3787
3820
  }
3788
3821
  })])]);
3789
3822
  };
3790
- var MainViewvue_type_template_id_1a4b756c_staticRenderFns = [];
3823
+ var MainViewvue_type_template_id_79e1eba9_staticRenderFns = [];
3791
3824
 
3792
3825
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/TaskList.vue?vue&type=template&id=74ce1216
3793
3826
  var TaskListvue_type_template_id_74ce1216_render = function render() {
@@ -4594,8 +4627,8 @@ var TaskList_component = normalizeComponent(
4594
4627
  )
4595
4628
 
4596
4629
  /* harmony default export */ var TaskList = (TaskList_component.exports);
4597
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Chart.vue?vue&type=template&id=1d5eb6d6
4598
- var Chartvue_type_template_id_1d5eb6d6_render = function render() {
4630
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Chart.vue?vue&type=template&id=0856b85c
4631
+ var Chartvue_type_template_id_0856b85c_render = function render() {
4599
4632
  var _vm = this,
4600
4633
  _c = _vm._self._c;
4601
4634
  return _c('div', {
@@ -4663,14 +4696,17 @@ var Chartvue_type_template_id_1d5eb6d6_render = function render() {
4663
4696
  tag: "component",
4664
4697
  attrs: {
4665
4698
  "task": task
4699
+ },
4700
+ on: {
4701
+ "task-updated": _vm.handleTaskUpdated
4666
4702
  }
4667
4703
  })], 1);
4668
4704
  })], 2)])])])]);
4669
4705
  };
4670
- var Chartvue_type_template_id_1d5eb6d6_staticRenderFns = [];
4706
+ var Chartvue_type_template_id_0856b85c_staticRenderFns = [];
4671
4707
 
4672
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Grid.vue?vue&type=template&id=b2e4dec2
4673
- var Gridvue_type_template_id_b2e4dec2_render = function render() {
4708
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Grid.vue?vue&type=template&id=244ea0ee
4709
+ var Gridvue_type_template_id_244ea0ee_render = function render() {
4674
4710
  var _vm = this,
4675
4711
  _c = _vm._self._c;
4676
4712
  return _c('svg', {
@@ -4732,7 +4768,7 @@ var Gridvue_type_template_id_b2e4dec2_render = function render() {
4732
4768
  }
4733
4769
  })], 2)]);
4734
4770
  };
4735
- var Gridvue_type_template_id_b2e4dec2_staticRenderFns = [];
4771
+ var Gridvue_type_template_id_244ea0ee_staticRenderFns = [];
4736
4772
 
4737
4773
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Grid.vue?vue&type=script&lang=js
4738
4774
 
@@ -4840,15 +4876,41 @@ var Gridvue_type_template_id_b2e4dec2_staticRenderFns = [];
4840
4876
  let lines = [];
4841
4877
  const state = this.root.state.options;
4842
4878
  let tasks = this.root.visibleTasks;
4843
- for (let index = 0, len = tasks.length; index <= len; index++) {
4844
- const y = index * (state.row.height + state.chart.grid.horizontal.gap * 2) + this.root.style['grid-line-vertical']['stroke-width'] / 2;
4845
- lines.push({
4846
- key: 'hl' + index,
4847
- x1: 0,
4848
- y1: y,
4849
- x2: '100%',
4850
- y2: y
4851
- });
4879
+
4880
+ // If we have tasks, show full grid for all tasks
4881
+ if (tasks.length > 0) {
4882
+ const rowHeight = state.row.height + state.chart.grid.horizontal.gap * 2;
4883
+ const rowCount = tasks.length; // Use actual task count
4884
+
4885
+ for (let index = 0; index <= rowCount; index++) {
4886
+ const y = index * rowHeight + this.root.style['grid-line-vertical']['stroke-width'] / 2;
4887
+ lines.push({
4888
+ key: 'hl' + index,
4889
+ x1: 0,
4890
+ y1: y,
4891
+ x2: '100%',
4892
+ y2: y
4893
+ });
4894
+ }
4895
+ } else {
4896
+ // If no tasks, use reduced viewport height for empty state
4897
+ const viewportHeight = window.innerHeight;
4898
+ const headerHeight = state.calendar.height + state.calendar.gap;
4899
+ const availableHeight = viewportHeight * 0.7 - headerHeight - 40; // 70% of viewport, 40px for padding/margins
4900
+ const reducedHeight = Math.max(availableHeight, 300); // Minimum 300px height
4901
+
4902
+ const rowHeight = state.row.height + state.chart.grid.horizontal.gap * 2;
4903
+ const maxRows = Math.floor(reducedHeight / rowHeight);
4904
+ for (let index = 0; index <= maxRows; index++) {
4905
+ const y = index * rowHeight + this.root.style['grid-line-vertical']['stroke-width'] / 2;
4906
+ lines.push({
4907
+ key: 'hl' + index,
4908
+ x1: 0,
4909
+ y1: y,
4910
+ x2: '100%',
4911
+ y2: y
4912
+ });
4913
+ }
4852
4914
  }
4853
4915
  return lines;
4854
4916
  },
@@ -4897,8 +4959,8 @@ var Gridvue_type_template_id_b2e4dec2_staticRenderFns = [];
4897
4959
  ;
4898
4960
  var Grid_component = normalizeComponent(
4899
4961
  Chart_Gridvue_type_script_lang_js,
4900
- Gridvue_type_template_id_b2e4dec2_render,
4901
- Gridvue_type_template_id_b2e4dec2_staticRenderFns,
4962
+ Gridvue_type_template_id_244ea0ee_render,
4963
+ Gridvue_type_template_id_244ea0ee_staticRenderFns,
4902
4964
  false,
4903
4965
  null,
4904
4966
  null,
@@ -5850,8 +5912,8 @@ var DependencyLines_component = normalizeComponent(
5850
5912
  )
5851
5913
 
5852
5914
  /* harmony default export */ var DependencyLines = (DependencyLines_component.exports);
5853
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Task.vue?vue&type=template&id=208a9baa
5854
- var Taskvue_type_template_id_208a9baa_render = function render() {
5915
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Task.vue?vue&type=template&id=23849415
5916
+ var Taskvue_type_template_id_23849415_render = function render() {
5855
5917
  var _vm = this,
5856
5918
  _c = _vm._self._c;
5857
5919
  return _c('g', {
@@ -5888,11 +5950,11 @@ var Taskvue_type_template_id_208a9baa_render = function render() {
5888
5950
  ..._vm.task.style['chart-row-bar']
5889
5951
  },
5890
5952
  attrs: {
5891
- "x": _vm.task.x,
5953
+ "x": _vm.task.x - 8,
5892
5954
  "y": _vm.task.y,
5893
- "width": _vm.task.width,
5955
+ "width": _vm.task.width + 16,
5894
5956
  "height": _vm.task.height,
5895
- "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
5957
+ "viewBox": `-8 0 ${_vm.task.width + 16} ${_vm.task.height}`,
5896
5958
  "xmlns": "http://www.w3.org/2000/svg"
5897
5959
  },
5898
5960
  on: {
@@ -5947,20 +6009,76 @@ var Taskvue_type_template_id_208a9baa_render = function render() {
5947
6009
  ..._vm.task.style['chart-row-bar-polygon']
5948
6010
  },
5949
6011
  attrs: {
5950
- "points": _vm.getPoints
6012
+ "points": _vm.getPointsAdjusted
6013
+ },
6014
+ on: {
6015
+ "mousedown": function ($event) {
6016
+ return _vm.startDrag($event, 'move');
6017
+ },
6018
+ "touchstart": function ($event) {
6019
+ return _vm.startDrag($event, 'move');
6020
+ }
5951
6021
  }
5952
6022
  }), _c('progress-bar', {
5953
6023
  attrs: {
5954
6024
  "task": _vm.task,
5955
6025
  "clip-path": 'url(#' + _vm.clipPathId + ')'
5956
6026
  }
6027
+ }), _c('rect', {
6028
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
6029
+ staticStyle: {
6030
+ "pointer-events": "all",
6031
+ "z-index": "50",
6032
+ "cursor": "ew-resize !important"
6033
+ },
6034
+ style: _vm.root.style['chart-row-extend-handle'],
6035
+ attrs: {
6036
+ "x": "0",
6037
+ "y": "0",
6038
+ "width": 12,
6039
+ "height": _vm.task.height
6040
+ },
6041
+ on: {
6042
+ "mousedown": function ($event) {
6043
+ $event.stopPropagation();
6044
+ return _vm.startDrag($event, 'start');
6045
+ },
6046
+ "touchstart": function ($event) {
6047
+ $event.stopPropagation();
6048
+ return _vm.startDrag($event, 'start');
6049
+ }
6050
+ }
6051
+ }), _c('rect', {
6052
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
6053
+ staticStyle: {
6054
+ "pointer-events": "all",
6055
+ "z-index": "50",
6056
+ "cursor": "ew-resize !important"
6057
+ },
6058
+ style: _vm.root.style['chart-row-extend-handle'],
6059
+ attrs: {
6060
+ "x": _vm.task.width - 12,
6061
+ "y": "0",
6062
+ "width": 12,
6063
+ "height": _vm.task.height
6064
+ },
6065
+ on: {
6066
+ "mousedown": function ($event) {
6067
+ $event.stopPropagation();
6068
+ return _vm.startDrag($event, 'end');
6069
+ },
6070
+ "touchstart": function ($event) {
6071
+ $event.stopPropagation();
6072
+ return _vm.startDrag($event, 'end');
6073
+ }
6074
+ }
5957
6075
  })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
5958
6076
  attrs: {
5959
6077
  "task": _vm.task
5960
6078
  }
5961
6079
  }) : _vm._e()], 1);
5962
6080
  };
5963
- var Taskvue_type_template_id_208a9baa_staticRenderFns = [];
6081
+ var Taskvue_type_template_id_23849415_staticRenderFns = [];
5964
6082
 
5965
6083
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Text.vue?vue&type=template&id=634f40aa
5966
6084
  var Textvue_type_template_id_634f40aa_render = function render() {
@@ -6097,15 +6215,16 @@ var Text_component = normalizeComponent(
6097
6215
  )
6098
6216
 
6099
6217
  /* harmony default export */ var Text = (Text_component.exports);
6100
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/ProgressBar.vue?vue&type=template&id=bc869ae8
6101
- var ProgressBarvue_type_template_id_bc869ae8_render = function render() {
6218
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/ProgressBar.vue?vue&type=template&id=2323ee21
6219
+ var ProgressBarvue_type_template_id_2323ee21_render = function render() {
6102
6220
  var _vm = this,
6103
6221
  _c = _vm._self._c;
6104
6222
  return _c('g', {
6105
6223
  staticClass: "gantt-elastic__chart-row-progress-bar-wrapper",
6106
6224
  style: {
6107
6225
  ..._vm.root.style['chart-row-progress-bar-wrapper'],
6108
- ..._vm.task.style['chart-row-progress-bar-wrapper']
6226
+ ..._vm.task.style['chart-row-progress-bar-wrapper'],
6227
+ 'pointer-events': 'none'
6109
6228
  }
6110
6229
  }, [_c('defs', [_c('pattern', {
6111
6230
  attrs: {
@@ -6127,8 +6246,11 @@ var ProgressBarvue_type_template_id_bc869ae8_render = function render() {
6127
6246
  "x2": "0",
6128
6247
  "y2": _vm.root.state.options.chart.progress.width
6129
6248
  }
6130
- })])]), _vm.root.state.options.chart.progress.bar ? _c('rect', {
6249
+ })])]), _vm.root.state.options.chart.progress.bar && _vm.task.progress > 0 ? _c('rect', {
6131
6250
  staticClass: "gantt-elastic__chart-row-progress-bar-solid",
6251
+ staticStyle: {
6252
+ "pointer-events": "none"
6253
+ },
6132
6254
  style: {
6133
6255
  ..._vm.root.style['chart-row-progress-bar-solid'],
6134
6256
  ..._vm.task.style['chart-row-progress-bar-solid']
@@ -6138,7 +6260,11 @@ var ProgressBarvue_type_template_id_bc869ae8_render = function render() {
6138
6260
  "y": "0",
6139
6261
  "width": _vm.getProgressWidth
6140
6262
  }
6141
- }) : _vm._e(), _vm.root.state.options.chart.progress.pattern ? _c('g', [_c('rect', {
6263
+ }) : _vm._e(), _vm.root.state.options.chart.progress.pattern && _vm.task.progress > 0 ? _c('g', {
6264
+ staticStyle: {
6265
+ "pointer-events": "none"
6266
+ }
6267
+ }, [_c('rect', {
6142
6268
  staticClass: "gantt-elastic__chart-row-progress-bar-pattern",
6143
6269
  style: {
6144
6270
  ..._vm.root.style['chart-row-progress-bar-pattern'],
@@ -6162,7 +6288,7 @@ var ProgressBarvue_type_template_id_bc869ae8_render = function render() {
6162
6288
  }
6163
6289
  })]) : _vm._e()]);
6164
6290
  };
6165
- var ProgressBarvue_type_template_id_bc869ae8_staticRenderFns = [];
6291
+ var ProgressBarvue_type_template_id_2323ee21_staticRenderFns = [];
6166
6292
 
6167
6293
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/ProgressBar.vue?vue&type=script&lang=js
6168
6294
  /* harmony default export */ var ProgressBarvue_type_script_lang_js = ({
@@ -6223,8 +6349,8 @@ var ProgressBarvue_type_template_id_bc869ae8_staticRenderFns = [];
6223
6349
  ;
6224
6350
  var ProgressBar_component = normalizeComponent(
6225
6351
  Chart_ProgressBarvue_type_script_lang_js,
6226
- ProgressBarvue_type_template_id_bc869ae8_render,
6227
- ProgressBarvue_type_template_id_bc869ae8_staticRenderFns,
6352
+ ProgressBarvue_type_template_id_2323ee21_render,
6353
+ ProgressBarvue_type_template_id_2323ee21_staticRenderFns,
6228
6354
  false,
6229
6355
  null,
6230
6356
  null,
@@ -6281,11 +6407,631 @@ var ProgressBar_component = normalizeComponent(
6281
6407
  }
6282
6408
  }
6283
6409
  });
6410
+ ;// ./src/components/Chart/Row/Draggable.mixin.js
6411
+
6412
+
6413
+ /* harmony default export */ var Draggable_mixin = ({
6414
+ data() {
6415
+ return {
6416
+ isDragging: false,
6417
+ dragStartX: 0,
6418
+ dragStartTime: 0,
6419
+ dragType: null,
6420
+ // 'start', 'end', or 'move'
6421
+ originalStartTime: 0,
6422
+ originalEndTime: 0,
6423
+ originalDuration: 0
6424
+ };
6425
+ },
6426
+ methods: {
6427
+ startDrag(event, type) {
6428
+ event.preventDefault();
6429
+ event.stopPropagation();
6430
+
6431
+ // Debug logging
6432
+ // console.log('Starting drag:', {
6433
+ // type: type,
6434
+ // taskId: this.task.id,
6435
+ // taskType: this.task.type,
6436
+ // originalStart: this.task.startTime,
6437
+ // originalEnd: this.task.endTime
6438
+ // });
6439
+
6440
+ // Safety checks
6441
+ if (!this.root || !this.root.state || !this.root.state.options || !this.root.state.options.times) {
6442
+ console.error('Root or times options not available for dragging');
6443
+ return;
6444
+ }
6445
+ this.isDragging = true;
6446
+ this.dragType = type;
6447
+ this.dragStartX = event.clientX || event.touches[0].clientX;
6448
+ this.dragStartTime = this.task.startTime;
6449
+ this.originalStartTime = this.task.startTime;
6450
+ this.originalEndTime = this.task.endTime;
6451
+ this.originalDuration = this.task.duration;
6452
+
6453
+ // Add event listeners
6454
+ document.addEventListener('mousemove', this.handleDrag);
6455
+ document.addEventListener('mouseup', this.endDrag);
6456
+ document.addEventListener('touchmove', this.handleDrag);
6457
+ document.addEventListener('touchend', this.endDrag);
6458
+
6459
+ // Hide hover tooltip when dragging starts
6460
+ this.hideHoverTooltip();
6461
+
6462
+ // Add context menu for extending tasks
6463
+ // this.$el.addEventListener('contextmenu', this.showContextMenu);
6464
+
6465
+ // Add keyboard shortcuts
6466
+ this.$el.addEventListener('keydown', this.handleKeyboardShortcuts);
6467
+
6468
+ // Add dragging class for visual feedback
6469
+ this.$el.classList.add('gantt-elastic__task-dragging');
6470
+ this.$el.classList.add(`gantt-elastic__task-dragging--${type}`);
6471
+
6472
+ // Create date tooltip for all dragging types
6473
+ this.createDateTooltip();
6474
+ },
6475
+ handleDrag(event) {
6476
+ if (!this.isDragging) return;
6477
+ event.preventDefault();
6478
+ const currentX = event.clientX || event.touches[0].clientX;
6479
+ const deltaX = currentX - this.dragStartX;
6480
+
6481
+ // Convert pixel delta to time delta
6482
+ const timeDelta = deltaX * this.root.state.options.times.timePerPixel;
6483
+ if (this.dragType === 'move') {
6484
+ // Move entire task
6485
+ const newStartTime = this.originalStartTime + timeDelta;
6486
+ const newEndTime = this.originalEndTime + timeDelta;
6487
+
6488
+ // Ensure task doesn't go before chart start
6489
+ const chartStartTime = this.root.state.options.times.firstTime;
6490
+ const chartEndTime = this.root.state.options.times.lastTime;
6491
+ if (newStartTime >= chartStartTime && newEndTime <= chartEndTime) {
6492
+ this.updateTaskTime(newStartTime, newEndTime);
6493
+
6494
+ // Update date tooltip for move dragging
6495
+ if (this.dateTooltip) {
6496
+ this.updateDateTooltip(newStartTime);
6497
+ }
6498
+ }
6499
+ } else if (this.dragType === 'start') {
6500
+ // Resize from start - change start date
6501
+ const newStartTime = this.originalStartTime + timeDelta;
6502
+ const newEndTime = this.originalEndTime;
6503
+
6504
+ // Ensure start doesn't go after end and respects minimum duration
6505
+ const minDuration = 24 * 60 * 60 * 1000; // 1 day minimum
6506
+ const chartStartTime = this.root.state.options.times.firstTime;
6507
+ if (newStartTime < newEndTime && newEndTime - newStartTime >= minDuration && newStartTime >= chartStartTime) {
6508
+ this.updateTaskTime(newStartTime, newEndTime);
6509
+
6510
+ // Update date tooltip for start dragging
6511
+ if (this.dateTooltip) {
6512
+ this.updateDateTooltip(newStartTime);
6513
+ }
6514
+ }
6515
+ } else if (this.dragType === 'end') {
6516
+ // Resize from end - change end date while keeping start fixed
6517
+ const newStartTime = this.originalStartTime;
6518
+ const newEndTime = this.originalEndTime + timeDelta;
6519
+
6520
+ // Ensure end doesn't go before start and respects minimum duration
6521
+ const minDuration = 24 * 60 * 60 * 1000; // 1 day minimum
6522
+
6523
+ if (newEndTime > newStartTime && newEndTime - newStartTime >= minDuration) {
6524
+ // Allow extending beyond chart end time if needed
6525
+ this.updateTaskTime(newStartTime, newEndTime);
6526
+
6527
+ // Update date tooltip for end dragging
6528
+ if (this.dateTooltip) {
6529
+ this.updateDateTooltip(newEndTime);
6530
+ }
6531
+ }
6532
+ }
6533
+ },
6534
+ endDrag(event) {
6535
+ if (!this.isDragging) return;
6536
+ this.isDragging = false;
6537
+
6538
+ // Remove event listeners
6539
+ document.removeEventListener('mousemove', this.handleDrag);
6540
+ document.removeEventListener('mouseup', this.endDrag);
6541
+ document.removeEventListener('touchmove', this.handleDrag);
6542
+ document.removeEventListener('touchend', this.endDrag);
6543
+
6544
+ // Remove dragging classes
6545
+ this.$el.classList.remove('gantt-elastic__task-dragging');
6546
+ this.$el.classList.remove(`gantt-elastic__task-dragging--${this.dragType}`);
6547
+
6548
+ // Remove date tooltip
6549
+ this.removeDateTooltip();
6550
+
6551
+ // Emit save event with updated data
6552
+ this.emitSaveEvent();
6553
+ },
6554
+ updateTaskTime(newStartTime, newEndTime) {
6555
+ // Ensure valid times
6556
+ if (newStartTime >= newEndTime) {
6557
+ return; // Don't update if invalid
6558
+ }
6559
+
6560
+ // Debug logging for epic tasks
6561
+ if (this.task.type === 'epic') {
6562
+ // console.log('Epic task drag:', {
6563
+ // dragType: this.dragType,
6564
+ // originalStart: this.originalStartTime,
6565
+ // originalEnd: this.originalEndTime,
6566
+ // newStart: newStartTime,
6567
+ // newEnd: newEndTime,
6568
+ // startChanged: newStartTime !== this.originalStartTime,
6569
+ // endChanged: newEndTime !== this.originalEndTime
6570
+ // });
6571
+ }
6572
+
6573
+ // Update task data
6574
+ this.task.startTime = newStartTime;
6575
+ this.task.endTime = newEndTime;
6576
+ this.task.duration = newEndTime - newStartTime;
6577
+
6578
+ // Debug logging
6579
+ // console.log('Updating task time:', {
6580
+ // taskId: this.task.id,
6581
+ // newStartTime,
6582
+ // newEndTime,
6583
+ // duration: this.task.duration,
6584
+ // root: !!this.root,
6585
+ // timeToPixelOffsetX: !!(this.root && this.root.timeToPixelOffsetX),
6586
+ // timePerPixel: this.root && this.root.state && this.root.state.options && this.root.state.options.times && this.root.state.options.times.timePerPixel
6587
+ // });
6588
+
6589
+ // Update task position and width using the correct method
6590
+ if (this.root && this.root.timeToPixelOffsetX) {
6591
+ this.task.x = this.root.timeToPixelOffsetX(newStartTime);
6592
+ this.task.width = this.root.timeToPixelOffsetX(newEndTime) - this.task.x;
6593
+ } else {
6594
+ // Fallback calculation if method is not available
6595
+ const timePerPixel = this.root && this.root.state && this.root.state.options && this.root.state.options.times && this.root.state.options.times.timePerPixel;
6596
+ if (timePerPixel > 0) {
6597
+ this.task.x = (newStartTime - this.root.state.options.times.firstTime) / timePerPixel;
6598
+ this.task.width = (newEndTime - newStartTime) / timePerPixel;
6599
+ } else {
6600
+ console.error('timePerPixel is not available or invalid:', timePerPixel);
6601
+ }
6602
+ }
6603
+
6604
+ // Force update
6605
+ this.$forceUpdate();
6606
+ },
6607
+ emitSaveEvent() {
6608
+ // Calculate date information
6609
+ const startDate = new Date(this.task.startTime);
6610
+ const endDate = new Date(this.task.endTime);
6611
+ const durationDays = Math.ceil(this.task.duration / (24 * 60 * 60 * 1000));
6612
+
6613
+ // Emit event to parent component with updated task data
6614
+ this.$emit('task-updated', {
6615
+ id: this.task.id,
6616
+ startTime: this.task.startTime,
6617
+ endTime: this.task.endTime,
6618
+ duration: this.task.duration,
6619
+ durationDays: durationDays,
6620
+ startDate: startDate.toISOString(),
6621
+ endDate: endDate.toISOString(),
6622
+ startDateFormatted: startDate.toLocaleDateString(),
6623
+ endDateFormatted: endDate.toLocaleDateString(),
6624
+ dragType: this.dragType,
6625
+ originalStartTime: this.originalStartTime,
6626
+ originalEndTime: this.originalEndTime,
6627
+ originalDuration: this.originalDuration
6628
+ });
6629
+
6630
+ // Log the update for debugging
6631
+ // console.log('Task drag completed:', {
6632
+ // id: this.task.id,
6633
+ // dragType: this.dragType,
6634
+ // startDate: startDate.toLocaleDateString(),
6635
+ // endDate: endDate.toLocaleDateString(),
6636
+ // duration: `${durationDays} days`,
6637
+ // startTime: this.task.startTime,
6638
+ // endTime: this.task.endTime
6639
+ // });
6640
+ },
6641
+ /**
6642
+ * Show context menu for task actions
6643
+ *
6644
+ * @param {Event} event - Right-click event
6645
+ */
6646
+ // showContextMenu(event) {
6647
+ // event.preventDefault();
6648
+ //
6649
+ // // Remove existing context menu
6650
+ // this.hideContextMenu();
6651
+ //
6652
+ // // Create context menu
6653
+ // const contextMenu = document.createElement('div');
6654
+ // contextMenu.className = 'gantt-elastic__context-menu';
6655
+ // contextMenu.style.cssText = `
6656
+ // position: fixed;
6657
+ // top: ${event.clientY}px;
6658
+ // left: ${event.clientX}px;
6659
+ // background: white;
6660
+ // border: 1px solid #e5e7eb;
6661
+ // border-radius: 6px;
6662
+ // box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
6663
+ // z-index: 1000;
6664
+ // min-width: 150px;
6665
+ // padding: 4px 0;
6666
+ // `;
6667
+ //
6668
+ // // Add menu items
6669
+ // const menuItems = [
6670
+ // { text: 'Extend to Next Date', action: () => this.extendTaskToNextDate() },
6671
+ // { text: 'Extend by 1 Day', action: () => this.extendTaskByDays(1) },
6672
+ // { text: 'Extend by 3 Days', action: () => this.extendTaskByDays(3) },
6673
+ // { text: 'Extend by 1 Week', action: () => this.extendTaskByDays(7) }
6674
+ // ];
6675
+ //
6676
+ // menuItems.forEach(item => {
6677
+ // const menuItem = document.createElement('div');
6678
+ // menuItem.className = 'gantt-elastic__context-menu-item';
6679
+ // menuItem.textContent = item.text;
6680
+ // menuItem.style.cssText = `
6681
+ // padding: 8px 16px;
6682
+ // cursor: pointer;
6683
+ // font-size: 14px;
6684
+ // color: #374151;
6685
+ // transition: background-color 0.2s;
6686
+ // `;
6687
+ //
6688
+ // menuItem.addEventListener('mouseenter', () => {
6689
+ // menuItem.style.backgroundColor = '#f3f4f6';
6690
+ // });
6691
+ //
6692
+ // menuItem.addEventListener('mouseleave', () => {
6693
+ // menuItem.style.backgroundColor = 'transparent';
6694
+ // });
6695
+ //
6696
+ // menuItem.addEventListener('click', () => {
6697
+ // item.action();
6698
+ // this.hideContextMenu();
6699
+ // });
6700
+ //
6701
+ // contextMenu.appendChild(menuItem);
6702
+ // });
6703
+ //
6704
+ // // Add to document
6705
+ // document.body.appendChild(contextMenu);
6706
+ // this.contextMenu = contextMenu;
6707
+ //
6708
+ // // Close menu when clicking outside
6709
+ // setTimeout(() => {
6710
+ // document.addEventListener('click', this.hideContextMenu);
6711
+ // }, 0);
6712
+ // },
6713
+
6714
+ /**
6715
+ * Hide context menu
6716
+ */
6717
+ // hideContextMenu() {
6718
+ // if (this.contextMenu) {
6719
+ // document.body.removeChild(this.contextMenu);
6720
+ // this.contextMenu = null;
6721
+ // document.removeEventListener('click', this.hideContextMenu);
6722
+ // }
6723
+ // },
6724
+
6725
+ /**
6726
+ * Extend task to next date (1 day)
6727
+ */
6728
+ // extendTaskToNextDate() {
6729
+ // const additionalDuration = 24 * 60 * 60 * 1000; // 1 day
6730
+ // this.task.duration += additionalDuration;
6731
+ // this.task.endTime += additionalDuration;
6732
+ //
6733
+ // // Update task position and width
6734
+ // if (this.root && this.root.timeToPixelOffsetX) {
6735
+ // this.task.width = this.root.timeToPixelOffsetX(this.task.endTime) - this.task.x;
6736
+ // } else {
6737
+ // const timePerPixel = this.root && this.root.state && this.root.state.options && this.root.state.options.times && this.root.state.options.times.timePerPixel;
6738
+ // if (timePerPixel > 0) {
6739
+ // this.task.width = (this.task.endTime - this.task.startTime) / timePerPixel;
6740
+ // }
6741
+ // }
6742
+ //
6743
+ // // Emit update event
6744
+ // this.emitSaveEvent();
6745
+ //
6746
+ // console.log(`✅ Task extended to next date:`, {
6747
+ // taskId: this.task.id,
6748
+ // newDuration: this.task.duration,
6749
+ // newEndDate: new Date(this.task.endTime).toLocaleDateString()
6750
+ // });
6751
+ // },
6752
+
6753
+ /**
6754
+ * Extend task by specific number of days
6755
+ *
6756
+ * @param {number} days - Number of days to add
6757
+ */
6758
+ // extendTaskByDays(days) {
6759
+ // const additionalDuration = days * 24 * 60 * 60 * 1000;
6760
+ // this.task.duration += additionalDuration;
6761
+ // this.task.endTime += additionalDuration;
6762
+ //
6763
+ // // Update task position and width
6764
+ // if (this.root && this.root.timeToPixelOffsetX) {
6765
+ // this.task.width = this.root.timeToPixelOffsetX(this.task.endTime) - this.task.x;
6766
+ // } else {
6767
+ // const timePerPixel = this.root && this.root.state && this.root.state.options && this.root.state.options.times && this.root.state.options.times.timePerPixel;
6768
+ // if (timePerPixel > 0) {
6769
+ // this.task.width = (this.task.endTime - this.task.startTime) / timePerPixel;
6770
+ // }
6771
+ // }
6772
+ //
6773
+ // // Emit update event
6774
+ // this.emitSaveEvent();
6775
+ //
6776
+ // console.log(`✅ Task extended by ${days} day(s):`, {
6777
+ // taskId: this.task.id,
6778
+ // daysAdded: days,
6779
+ // newDuration: this.task.duration,
6780
+ // newEndDate: new Date(this.task.endTime).toLocaleDateString()
6781
+ // });
6782
+ // },
6783
+
6784
+ /**
6785
+ * Handle keyboard shortcuts for task extension
6786
+ *
6787
+ * @param {KeyboardEvent} event - Keyboard event
6788
+ */
6789
+ handleKeyboardShortcuts(event) {
6790
+ // Only handle if task is focused and not dragging
6791
+ if (this.isDragging) return;
6792
+
6793
+ // Check for Ctrl/Cmd + E for extend to next date
6794
+ if ((event.ctrlKey || event.metaKey) && event.key === 'e') {
6795
+ event.preventDefault();
6796
+ this.extendTaskToNextDate();
6797
+ }
6798
+ // Check for Ctrl/Cmd + Shift + E for extend by 1 day
6799
+ else if ((event.ctrlKey || event.metaKey) && event.shiftKey && event.key === 'E') {
6800
+ event.preventDefault();
6801
+ this.extendTaskByDays(1);
6802
+ }
6803
+ // Check for Ctrl/Cmd + 3 for extend by 3 days
6804
+ else if ((event.ctrlKey || event.metaKey) && event.key === '3') {
6805
+ event.preventDefault();
6806
+ this.extendTaskByDays(3);
6807
+ }
6808
+ // Check for Ctrl/Cmd + 7 for extend by 1 week
6809
+ else if ((event.ctrlKey || event.metaKey) && event.key === '7') {
6810
+ event.preventDefault();
6811
+ this.extendTaskByDays(7);
6812
+ }
6813
+ },
6814
+ /**
6815
+ * Create date tooltip for end dragging
6816
+ */
6817
+ createDateTooltip() {
6818
+ this.dateTooltip = document.createElement('div');
6819
+ this.dateTooltip.className = 'gantt-elastic__date-tooltip';
6820
+ this.dateTooltip.style.cssText = `
6821
+ position: fixed;
6822
+ background: #000000;
6823
+ color: white;
6824
+ padding: 6px 12px;
6825
+ border-radius: 6px;
6826
+ font-size: 13px;
6827
+ font-family: system-ui, -apple-system, sans-serif;
6828
+ font-weight: 500;
6829
+ pointer-events: none;
6830
+ z-index: 10000;
6831
+ white-space: nowrap;
6832
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
6833
+ border: 1px solid rgba(255, 255, 255, 0.1);
6834
+ `;
6835
+ document.body.appendChild(this.dateTooltip);
6836
+
6837
+ // Initialize tooltip with current values
6838
+ if (this.dragType === 'start') {
6839
+ this.updateDateTooltip(this.originalStartTime);
6840
+ } else if (this.dragType === 'end') {
6841
+ this.updateDateTooltip(this.originalEndTime);
6842
+ } else if (this.dragType === 'move') {
6843
+ this.updateDateTooltip(this.originalStartTime);
6844
+ }
6845
+ },
6846
+ /**
6847
+ * Update date tooltip with new time and day changes
6848
+ *
6849
+ * @param {number} newTime - New time in milliseconds
6850
+ */
6851
+ updateDateTooltip(newTime) {
6852
+ if (!this.dateTooltip) return;
6853
+ const newDate = new Date(newTime);
6854
+ const formattedDate = newDate.toLocaleDateString('en-US', {
6855
+ year: 'numeric',
6856
+ month: 'short',
6857
+ day: 'numeric'
6858
+ });
6859
+
6860
+ // Calculate day changes based on drag type
6861
+ let dayChanges = '';
6862
+ if (this.dragType === 'start') {
6863
+ // For start drag, show how many days we're moving the start date
6864
+ const daysDiff = Math.round((newTime - this.originalStartTime) / (24 * 60 * 60 * 1000));
6865
+ if (daysDiff !== 0) {
6866
+ dayChanges = daysDiff > 0 ? ` (+${daysDiff} days)` : ` (${daysDiff} days)`;
6867
+ }
6868
+ } else if (this.dragType === 'end') {
6869
+ // For end drag, show how many days we're moving the end date
6870
+ const daysDiff = Math.round((newTime - this.originalEndTime) / (24 * 60 * 60 * 1000));
6871
+ if (daysDiff !== 0) {
6872
+ dayChanges = daysDiff > 0 ? ` (+${daysDiff} days)` : ` (${daysDiff} days)`;
6873
+ }
6874
+ } else if (this.dragType === 'move') {
6875
+ // For move drag, show how many days we're moving the entire task
6876
+ const daysDiff = Math.round((newTime - this.originalStartTime) / (24 * 60 * 60 * 1000));
6877
+ if (daysDiff !== 0) {
6878
+ dayChanges = daysDiff > 0 ? ` (+${daysDiff} days)` : ` (${daysDiff} days)`;
6879
+ }
6880
+ }
6881
+ this.dateTooltip.textContent = `${formattedDate}${dayChanges}`;
6882
+
6883
+ // Position tooltip based on drag type
6884
+ const rect = this.$el.getBoundingClientRect();
6885
+ if (this.dragType === 'start') {
6886
+ // Position tooltip on the left side for start drag
6887
+ this.dateTooltip.style.left = `${rect.left - this.dateTooltip.offsetWidth - 10}px`;
6888
+ this.dateTooltip.style.top = `${rect.top + rect.height / 2 - 10}px`;
6889
+ } else if (this.dragType === 'end') {
6890
+ // Position tooltip on the right side for end drag
6891
+ this.dateTooltip.style.left = `${rect.right + 10}px`;
6892
+ this.dateTooltip.style.top = `${rect.top + rect.height / 2 - 10}px`;
6893
+ } else if (this.dragType === 'move') {
6894
+ // Position tooltip on the right side for move drag
6895
+ this.dateTooltip.style.left = `${rect.right + 10}px`;
6896
+ this.dateTooltip.style.top = `${rect.top + rect.height / 2 - 10}px`;
6897
+ }
6898
+ },
6899
+ /**
6900
+ * Remove date tooltip
6901
+ */
6902
+ removeDateTooltip() {
6903
+ if (this.dateTooltip) {
6904
+ document.body.removeChild(this.dateTooltip);
6905
+ this.dateTooltip = null;
6906
+ }
6907
+ },
6908
+ /**
6909
+ * Add hover tooltips for drag handles
6910
+ */
6911
+ addHoverTooltips() {
6912
+ // Find drag handles in the current element
6913
+ const dragHandles = this.$el.querySelectorAll('.gantt-elastic__chart-row-extend-handle');
6914
+ dragHandles.forEach((handle, index) => {
6915
+ const isStartHandle = index === 0; // First handle is start, second is end
6916
+
6917
+ // Remove existing listeners to avoid duplicates
6918
+ handle.removeEventListener('mouseenter', this.handleMouseEnter);
6919
+ handle.removeEventListener('mouseleave', this.handleMouseLeave);
6920
+
6921
+ // Add new listeners
6922
+ handle.addEventListener('mouseenter', this.handleMouseEnter.bind(this));
6923
+ handle.addEventListener('mouseleave', this.handleMouseLeave.bind(this));
6924
+ });
6925
+ },
6926
+ /**
6927
+ * Handle mouse enter on drag handle
6928
+ */
6929
+ handleMouseEnter(event) {
6930
+ if (!this.isDragging) {
6931
+ this.showHoverTooltip(event, false);
6932
+ }
6933
+ },
6934
+ /**
6935
+ * Handle mouse leave on drag handle
6936
+ */
6937
+ handleMouseLeave() {
6938
+ if (!this.isDragging) {
6939
+ this.hideHoverTooltip();
6940
+ }
6941
+ },
6942
+ /**
6943
+ * Show hover tooltip with date range and duration
6944
+ */
6945
+ showHoverTooltip(event, isStartHandle) {
6946
+ this.hideHoverTooltip(); // Remove any existing tooltip
6947
+
6948
+ const startDate = new Date(this.task.startTime);
6949
+ const endDate = new Date(this.task.endTime);
6950
+ const startFormatted = startDate.toLocaleDateString('en-US', {
6951
+ year: 'numeric',
6952
+ month: 'short',
6953
+ day: 'numeric'
6954
+ });
6955
+ const endFormatted = endDate.toLocaleDateString('en-US', {
6956
+ year: 'numeric',
6957
+ month: 'short',
6958
+ day: 'numeric'
6959
+ });
6960
+
6961
+ // Calculate duration in days
6962
+ const durationMs = this.task.endTime - this.task.startTime;
6963
+ const durationDays = Math.ceil(durationMs / (24 * 60 * 60 * 1000));
6964
+ this.hoverTooltip = document.createElement('div');
6965
+ this.hoverTooltip.className = 'gantt-elastic__hover-tooltip';
6966
+ this.hoverTooltip.textContent = `${startFormatted} - ${endFormatted} (${durationDays} days)`;
6967
+ this.hoverTooltip.style.cssText = `
6968
+ position: fixed;
6969
+ background: #333333;
6970
+ color: white;
6971
+ padding: 8px 12px;
6972
+ border-radius: 6px;
6973
+ font-size: 13px;
6974
+ font-family: system-ui, -apple-system, sans-serif;
6975
+ font-weight: 500;
6976
+ pointer-events: none;
6977
+ z-index: 10001;
6978
+ white-space: nowrap;
6979
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
6980
+ border: 1px solid rgba(255, 255, 255, 0.1);
6981
+ `;
6982
+ document.body.appendChild(this.hoverTooltip);
6983
+
6984
+ // Position tooltip above the handle
6985
+ const rect = event.target.getBoundingClientRect();
6986
+ this.hoverTooltip.style.left = `${rect.left + rect.width / 2 - this.hoverTooltip.offsetWidth / 2}px`;
6987
+ this.hoverTooltip.style.top = `${rect.top - this.hoverTooltip.offsetHeight - 8}px`;
6988
+ },
6989
+ /**
6990
+ * Hide hover tooltip
6991
+ */
6992
+ hideHoverTooltip() {
6993
+ if (this.hoverTooltip) {
6994
+ document.body.removeChild(this.hoverTooltip);
6995
+ this.hoverTooltip = null;
6996
+ }
6997
+ }
6998
+ },
6999
+ mounted() {
7000
+ // Add hover tooltips when component is mounted
7001
+ this.$nextTick(() => {
7002
+ this.addHoverTooltips();
7003
+ });
7004
+ },
7005
+ beforeDestroy() {
7006
+ // Clean up event listeners
7007
+ document.removeEventListener('mousemove', this.handleDrag);
7008
+ document.removeEventListener('mouseup', this.endDrag);
7009
+ document.removeEventListener('touchmove', this.handleDrag);
7010
+ document.removeEventListener('touchend', this.endDrag);
7011
+ document.removeEventListener('click', this.hideContextMenu);
7012
+
7013
+ // Clean up context menu
7014
+ this.hideContextMenu();
7015
+
7016
+ // Clean up date tooltip
7017
+ this.removeDateTooltip();
7018
+
7019
+ // Clean up hover tooltip
7020
+ this.hideHoverTooltip();
7021
+
7022
+ // Clean up keyboard listeners
7023
+ if (this.$el) {
7024
+ // this.$el.removeEventListener('contextmenu', this.showContextMenu);
7025
+ this.$el.removeEventListener('keydown', this.handleKeyboardShortcuts);
7026
+ }
7027
+ }
7028
+ });
6284
7029
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Task.vue?vue&type=script&lang=js
6285
7030
 
6286
7031
 
6287
7032
 
6288
7033
 
7034
+
6289
7035
  /* harmony default export */ var Taskvue_type_script_lang_js = ({
6290
7036
  name: 'Task',
6291
7037
  components: {
@@ -6295,7 +7041,7 @@ var ProgressBar_component = normalizeComponent(
6295
7041
  },
6296
7042
  inject: ['root'],
6297
7043
  props: ['task'],
6298
- mixins: [Task_mixin],
7044
+ mixins: [Task_mixin, Draggable_mixin],
6299
7045
  data() {
6300
7046
  return {};
6301
7047
  },
@@ -6316,6 +7062,15 @@ var ProgressBar_component = normalizeComponent(
6316
7062
  getPoints() {
6317
7063
  const task = this.task;
6318
7064
  return `0,0 ${task.width},0 ${task.width},${task.height} 0,${task.height}`;
7065
+ },
7066
+ /**
7067
+ * Get points adjusted for viewBox
7068
+ *
7069
+ * @returns {string}
7070
+ */
7071
+ getPointsAdjusted() {
7072
+ const task = this.task;
7073
+ return `8,0 ${task.width + 8},0 ${task.width + 8},${task.height} 8,${task.height}`;
6319
7074
  }
6320
7075
  }
6321
7076
  });
@@ -6331,8 +7086,8 @@ var ProgressBar_component = normalizeComponent(
6331
7086
  ;
6332
7087
  var Task_component = normalizeComponent(
6333
7088
  Row_Taskvue_type_script_lang_js,
6334
- Taskvue_type_template_id_208a9baa_render,
6335
- Taskvue_type_template_id_208a9baa_staticRenderFns,
7089
+ Taskvue_type_template_id_23849415_render,
7090
+ Taskvue_type_template_id_23849415_staticRenderFns,
6336
7091
  false,
6337
7092
  null,
6338
7093
  null,
@@ -6341,8 +7096,8 @@ var Task_component = normalizeComponent(
6341
7096
  )
6342
7097
 
6343
7098
  /* harmony default export */ var Task = (Task_component.exports);
6344
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Milestone.vue?vue&type=template&id=edd49e02
6345
- var Milestonevue_type_template_id_edd49e02_render = function render() {
7099
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Milestone.vue?vue&type=template&id=c9bfeb4a
7100
+ var Milestonevue_type_template_id_c9bfeb4a_render = function render() {
6346
7101
  var _vm = this,
6347
7102
  _c = _vm._self._c;
6348
7103
  return _c('g', {
@@ -6379,11 +7134,11 @@ var Milestonevue_type_template_id_edd49e02_render = function render() {
6379
7134
  ..._vm.task.style['chart-row-bar']
6380
7135
  },
6381
7136
  attrs: {
6382
- "x": _vm.task.x,
7137
+ "x": _vm.task.x - 8,
6383
7138
  "y": _vm.task.y,
6384
- "width": _vm.task.width,
7139
+ "width": _vm.task.width + 16,
6385
7140
  "height": _vm.task.height,
6386
- "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
7141
+ "viewBox": `-8 0 ${_vm.task.width + 16} ${_vm.task.height}`,
6387
7142
  "xmlns": "http://www.w3.org/2000/svg"
6388
7143
  },
6389
7144
  on: {
@@ -6438,26 +7193,83 @@ var Milestonevue_type_template_id_edd49e02_render = function render() {
6438
7193
  ..._vm.task.style['chart-row-bar-polygon']
6439
7194
  },
6440
7195
  attrs: {
6441
- "points": _vm.getPoints
7196
+ "points": _vm.getPointsAdjusted
7197
+ },
7198
+ on: {
7199
+ "mousedown": function ($event) {
7200
+ return _vm.startDrag($event, 'move');
7201
+ },
7202
+ "touchstart": function ($event) {
7203
+ return _vm.startDrag($event, 'move');
7204
+ }
6442
7205
  }
6443
7206
  }), _c('progress-bar', {
6444
7207
  attrs: {
6445
7208
  "task": _vm.task,
6446
7209
  "clip-path": 'url(#' + _vm.clipPathId + ')'
6447
7210
  }
7211
+ }), _c('rect', {
7212
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
7213
+ staticStyle: {
7214
+ "pointer-events": "all",
7215
+ "z-index": "50",
7216
+ "cursor": "ew-resize !important"
7217
+ },
7218
+ style: _vm.root.style['chart-row-extend-handle'],
7219
+ attrs: {
7220
+ "x": "0",
7221
+ "y": "0",
7222
+ "width": 12,
7223
+ "height": _vm.task.height
7224
+ },
7225
+ on: {
7226
+ "mousedown": function ($event) {
7227
+ $event.stopPropagation();
7228
+ return _vm.startDrag($event, 'start');
7229
+ },
7230
+ "touchstart": function ($event) {
7231
+ $event.stopPropagation();
7232
+ return _vm.startDrag($event, 'start');
7233
+ }
7234
+ }
7235
+ }), _c('rect', {
7236
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
7237
+ staticStyle: {
7238
+ "pointer-events": "all",
7239
+ "z-index": "50",
7240
+ "cursor": "ew-resize !important"
7241
+ },
7242
+ style: _vm.root.style['chart-row-extend-handle'],
7243
+ attrs: {
7244
+ "x": _vm.task.width - 12,
7245
+ "y": "0",
7246
+ "width": 12,
7247
+ "height": _vm.task.height
7248
+ },
7249
+ on: {
7250
+ "mousedown": function ($event) {
7251
+ $event.stopPropagation();
7252
+ return _vm.startDrag($event, 'end');
7253
+ },
7254
+ "touchstart": function ($event) {
7255
+ $event.stopPropagation();
7256
+ return _vm.startDrag($event, 'end');
7257
+ }
7258
+ }
6448
7259
  })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
6449
7260
  attrs: {
6450
7261
  "task": _vm.task
6451
7262
  }
6452
7263
  }) : _vm._e()], 1);
6453
7264
  };
6454
- var Milestonevue_type_template_id_edd49e02_staticRenderFns = [];
7265
+ var Milestonevue_type_template_id_c9bfeb4a_staticRenderFns = [];
6455
7266
 
6456
7267
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Milestone.vue?vue&type=script&lang=js
6457
7268
 
6458
7269
 
6459
7270
 
6460
7271
 
7272
+
6461
7273
  /* harmony default export */ var Milestonevue_type_script_lang_js = ({
6462
7274
  name: 'Milestone',
6463
7275
  components: {
@@ -6467,7 +7279,7 @@ var Milestonevue_type_template_id_edd49e02_staticRenderFns = [];
6467
7279
  },
6468
7280
  inject: ['root'],
6469
7281
  props: ['task'],
6470
- mixins: [Task_mixin],
7282
+ mixins: [Task_mixin, Draggable_mixin],
6471
7283
  data() {
6472
7284
  return {};
6473
7285
  },
@@ -6498,6 +7310,25 @@ var Milestonevue_type_template_id_edd49e02_staticRenderFns = [];
6498
7310
  ${task.width},${fifty}
6499
7311
  ${task.width - offset},${task.height}
6500
7312
  ${offset},${task.height}`;
7313
+ },
7314
+ /**
7315
+ * Get points adjusted for viewBox
7316
+ *
7317
+ * @returns {string}
7318
+ */
7319
+ getPointsAdjusted() {
7320
+ const task = this.task;
7321
+ const fifty = task.height / 2;
7322
+ let offset = fifty;
7323
+ if (task.width / 2 - offset < 0) {
7324
+ offset = task.width / 2;
7325
+ }
7326
+ return `${8},${fifty}
7327
+ ${8 + offset},0
7328
+ ${8 + task.width - offset},0
7329
+ ${8 + task.width},${fifty}
7330
+ ${8 + task.width - offset},${task.height}
7331
+ ${8 + offset},${task.height}`;
6501
7332
  }
6502
7333
  }
6503
7334
  });
@@ -6513,8 +7344,8 @@ var Milestonevue_type_template_id_edd49e02_staticRenderFns = [];
6513
7344
  ;
6514
7345
  var Milestone_component = normalizeComponent(
6515
7346
  Row_Milestonevue_type_script_lang_js,
6516
- Milestonevue_type_template_id_edd49e02_render,
6517
- Milestonevue_type_template_id_edd49e02_staticRenderFns,
7347
+ Milestonevue_type_template_id_c9bfeb4a_render,
7348
+ Milestonevue_type_template_id_c9bfeb4a_staticRenderFns,
6518
7349
  false,
6519
7350
  null,
6520
7351
  null,
@@ -6523,8 +7354,8 @@ var Milestone_component = normalizeComponent(
6523
7354
  )
6524
7355
 
6525
7356
  /* harmony default export */ var Milestone = (Milestone_component.exports);
6526
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Project.vue?vue&type=template&id=760bf767
6527
- var Projectvue_type_template_id_760bf767_render = function render() {
7357
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Project.vue?vue&type=template&id=72239142
7358
+ var Projectvue_type_template_id_72239142_render = function render() {
6528
7359
  var _vm = this,
6529
7360
  _c = _vm._self._c;
6530
7361
  return _c('g', {
@@ -6561,11 +7392,11 @@ var Projectvue_type_template_id_760bf767_render = function render() {
6561
7392
  ..._vm.task.style['chart-row-bar']
6562
7393
  },
6563
7394
  attrs: {
6564
- "x": _vm.task.x,
7395
+ "x": _vm.task.x - 8,
6565
7396
  "y": _vm.task.y,
6566
- "width": _vm.task.width,
7397
+ "width": _vm.task.width + 16,
6567
7398
  "height": _vm.task.height,
6568
- "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
7399
+ "viewBox": `-8 0 ${_vm.task.width + 16} ${_vm.task.height}`,
6569
7400
  "xmlns": "http://www.w3.org/2000/svg"
6570
7401
  },
6571
7402
  on: {
@@ -6620,26 +7451,83 @@ var Projectvue_type_template_id_760bf767_render = function render() {
6620
7451
  ..._vm.task.style['chart-row-bar-polygon']
6621
7452
  },
6622
7453
  attrs: {
6623
- "d": _vm.getPoints
7454
+ "d": _vm.getPointsAdjusted
7455
+ },
7456
+ on: {
7457
+ "mousedown": function ($event) {
7458
+ return _vm.startDrag($event, 'move');
7459
+ },
7460
+ "touchstart": function ($event) {
7461
+ return _vm.startDrag($event, 'move');
7462
+ }
6624
7463
  }
6625
7464
  }), _c('progress-bar', {
6626
7465
  attrs: {
6627
7466
  "task": _vm.task,
6628
7467
  "clip-path": 'url(#' + _vm.clipPathId + ')'
6629
7468
  }
7469
+ }), _c('rect', {
7470
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
7471
+ staticStyle: {
7472
+ "pointer-events": "all",
7473
+ "z-index": "50",
7474
+ "cursor": "ew-resize !important"
7475
+ },
7476
+ style: _vm.root.style['chart-row-extend-handle'],
7477
+ attrs: {
7478
+ "x": "0",
7479
+ "y": "0",
7480
+ "width": 12,
7481
+ "height": _vm.task.height
7482
+ },
7483
+ on: {
7484
+ "mousedown": function ($event) {
7485
+ $event.stopPropagation();
7486
+ return _vm.startDrag($event, 'start');
7487
+ },
7488
+ "touchstart": function ($event) {
7489
+ $event.stopPropagation();
7490
+ return _vm.startDrag($event, 'start');
7491
+ }
7492
+ }
7493
+ }), _c('rect', {
7494
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
7495
+ staticStyle: {
7496
+ "pointer-events": "all",
7497
+ "z-index": "50",
7498
+ "cursor": "ew-resize !important"
7499
+ },
7500
+ style: _vm.root.style['chart-row-extend-handle'],
7501
+ attrs: {
7502
+ "x": _vm.task.width - 12,
7503
+ "y": "0",
7504
+ "width": 12,
7505
+ "height": _vm.task.height
7506
+ },
7507
+ on: {
7508
+ "mousedown": function ($event) {
7509
+ $event.stopPropagation();
7510
+ return _vm.startDrag($event, 'end');
7511
+ },
7512
+ "touchstart": function ($event) {
7513
+ $event.stopPropagation();
7514
+ return _vm.startDrag($event, 'end');
7515
+ }
7516
+ }
6630
7517
  })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
6631
7518
  attrs: {
6632
7519
  "task": _vm.task
6633
7520
  }
6634
7521
  }) : _vm._e()], 1);
6635
7522
  };
6636
- var Projectvue_type_template_id_760bf767_staticRenderFns = [];
7523
+ var Projectvue_type_template_id_72239142_staticRenderFns = [];
6637
7524
 
6638
7525
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Project.vue?vue&type=script&lang=js
6639
7526
 
6640
7527
 
6641
7528
 
6642
7529
 
7530
+
6643
7531
  /* harmony default export */ var Projectvue_type_script_lang_js = ({
6644
7532
  name: 'Project',
6645
7533
  components: {
@@ -6649,7 +7537,7 @@ var Projectvue_type_template_id_760bf767_staticRenderFns = [];
6649
7537
  },
6650
7538
  inject: ['root'],
6651
7539
  props: ['task'],
6652
- mixins: [Task_mixin],
7540
+ mixins: [Task_mixin, Draggable_mixin],
6653
7541
  data() {
6654
7542
  return {};
6655
7543
  },
@@ -6685,6 +7573,29 @@ var Projectvue_type_template_id_760bf767_staticRenderFns = [];
6685
7573
  Z
6686
7574
  `;
6687
7575
  },
7576
+ /**
7577
+ * Get points adjusted for viewBox
7578
+ *
7579
+ * @returns {string}
7580
+ */
7581
+ getPointsAdjusted() {
7582
+ const task = this.task;
7583
+ const bottom = task.height - task.height / 4;
7584
+ const corner = task.height / 6;
7585
+ const smallCorner = task.height / 8;
7586
+ return `M ${8 + smallCorner},0
7587
+ L ${8 + task.width - smallCorner} 0
7588
+ L ${8 + task.width} ${smallCorner}
7589
+ L ${8 + task.width} ${bottom}
7590
+ L ${8 + task.width - corner} ${task.height}
7591
+ L ${8 + task.width - corner * 2} ${bottom}
7592
+ L ${8 + corner * 2} ${bottom}
7593
+ L ${8 + corner} ${task.height}
7594
+ L ${8} ${bottom}
7595
+ L ${8} ${smallCorner}
7596
+ Z
7597
+ `;
7598
+ },
6688
7599
  /**
6689
7600
  * Should we display expander?
6690
7601
  *
@@ -6709,8 +7620,8 @@ var Projectvue_type_template_id_760bf767_staticRenderFns = [];
6709
7620
  ;
6710
7621
  var Project_component = normalizeComponent(
6711
7622
  Row_Projectvue_type_script_lang_js,
6712
- Projectvue_type_template_id_760bf767_render,
6713
- Projectvue_type_template_id_760bf767_staticRenderFns,
7623
+ Projectvue_type_template_id_72239142_render,
7624
+ Projectvue_type_template_id_72239142_staticRenderFns,
6714
7625
  false,
6715
7626
  null,
6716
7627
  null,
@@ -6719,8 +7630,8 @@ var Project_component = normalizeComponent(
6719
7630
  )
6720
7631
 
6721
7632
  /* harmony default export */ var Project = (Project_component.exports);
6722
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Epic.vue?vue&type=template&id=a2e89cd8
6723
- var Epicvue_type_template_id_a2e89cd8_render = function render() {
7633
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Epic.vue?vue&type=template&id=80ad2e9c
7634
+ var Epicvue_type_template_id_80ad2e9c_render = function render() {
6724
7635
  var _vm = this,
6725
7636
  _c = _vm._self._c;
6726
7637
  return _c('g', {
@@ -6757,11 +7668,11 @@ var Epicvue_type_template_id_a2e89cd8_render = function render() {
6757
7668
  ..._vm.task.style['chart-row-bar']
6758
7669
  },
6759
7670
  attrs: {
6760
- "x": _vm.task.x,
7671
+ "x": _vm.task.x - 8,
6761
7672
  "y": _vm.task.y,
6762
- "width": _vm.task.width,
7673
+ "width": _vm.task.width + 16,
6763
7674
  "height": _vm.task.height,
6764
- "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
7675
+ "viewBox": `-8 0 ${_vm.task.width + 16} ${_vm.task.height}`,
6765
7676
  "xmlns": "http://www.w3.org/2000/svg"
6766
7677
  },
6767
7678
  on: {
@@ -6813,29 +7724,88 @@ var Epicvue_type_template_id_a2e89cd8_render = function render() {
6813
7724
  ..._vm.root.style['chart-row-bar-polygon'],
6814
7725
  ..._vm.root.style['chart-row-epic-polygon'],
6815
7726
  ..._vm.task.style['base'],
6816
- ..._vm.task.style['chart-row-bar-polygon']
7727
+ ..._vm.task.style['chart-row-bar-polygon'],
7728
+ 'pointer-events': 'all',
7729
+ 'z-index': '10'
6817
7730
  },
6818
7731
  attrs: {
6819
- "d": _vm.getPoints
7732
+ "d": _vm.getPointsAdjusted
7733
+ },
7734
+ on: {
7735
+ "mousedown": function ($event) {
7736
+ return _vm.startDrag($event, 'move');
7737
+ },
7738
+ "touchstart": function ($event) {
7739
+ return _vm.startDrag($event, 'move');
7740
+ }
6820
7741
  }
6821
- }), _c('progress-bar', {
7742
+ }), _vm.task.progress > 0 ? _c('progress-bar', {
6822
7743
  attrs: {
6823
7744
  "task": _vm.task,
6824
7745
  "clip-path": 'url(#' + _vm.clipPathId + ')'
6825
7746
  }
7747
+ }) : _vm._e(), _c('rect', {
7748
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
7749
+ staticStyle: {
7750
+ "pointer-events": "all",
7751
+ "z-index": "50",
7752
+ "cursor": "ew-resize !important"
7753
+ },
7754
+ style: _vm.root.style['chart-row-extend-handle'],
7755
+ attrs: {
7756
+ "x": "0",
7757
+ "y": "0",
7758
+ "width": 12,
7759
+ "height": _vm.task.height
7760
+ },
7761
+ on: {
7762
+ "mousedown": function ($event) {
7763
+ $event.stopPropagation();
7764
+ return _vm.startDrag($event, 'start');
7765
+ },
7766
+ "touchstart": function ($event) {
7767
+ $event.stopPropagation();
7768
+ return _vm.startDrag($event, 'start');
7769
+ }
7770
+ }
7771
+ }), _c('rect', {
7772
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
7773
+ staticStyle: {
7774
+ "pointer-events": "all",
7775
+ "z-index": "50",
7776
+ "cursor": "ew-resize !important"
7777
+ },
7778
+ style: _vm.root.style['chart-row-extend-handle'],
7779
+ attrs: {
7780
+ "x": _vm.task.width - 12,
7781
+ "y": "0",
7782
+ "width": 12,
7783
+ "height": _vm.task.height
7784
+ },
7785
+ on: {
7786
+ "mousedown": function ($event) {
7787
+ $event.stopPropagation();
7788
+ return _vm.startDrag($event, 'end');
7789
+ },
7790
+ "touchstart": function ($event) {
7791
+ $event.stopPropagation();
7792
+ return _vm.startDrag($event, 'end');
7793
+ }
7794
+ }
6826
7795
  })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
6827
7796
  attrs: {
6828
7797
  "task": _vm.task
6829
7798
  }
6830
7799
  }) : _vm._e()], 1);
6831
7800
  };
6832
- var Epicvue_type_template_id_a2e89cd8_staticRenderFns = [];
7801
+ var Epicvue_type_template_id_80ad2e9c_staticRenderFns = [];
6833
7802
 
6834
7803
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Epic.vue?vue&type=script&lang=js
6835
7804
 
6836
7805
 
6837
7806
 
6838
7807
 
7808
+
6839
7809
  /* harmony default export */ var Epicvue_type_script_lang_js = ({
6840
7810
  name: 'Epic',
6841
7811
  components: {
@@ -6845,7 +7815,7 @@ var Epicvue_type_template_id_a2e89cd8_staticRenderFns = [];
6845
7815
  },
6846
7816
  inject: ['root'],
6847
7817
  props: ['task'],
6848
- mixins: [Task_mixin],
7818
+ mixins: [Task_mixin, Draggable_mixin],
6849
7819
  data() {
6850
7820
  return {};
6851
7821
  },
@@ -6881,6 +7851,29 @@ var Epicvue_type_template_id_a2e89cd8_staticRenderFns = [];
6881
7851
  Z
6882
7852
  `;
6883
7853
  },
7854
+ /**
7855
+ * Get points adjusted for viewBox
7856
+ *
7857
+ * @returns {string}
7858
+ */
7859
+ getPointsAdjusted() {
7860
+ const task = this.task;
7861
+ const bottom = task.height - task.height / 4;
7862
+ const corner = task.height / 6;
7863
+ const smallCorner = task.height / 8;
7864
+ return `M ${8 + smallCorner},0
7865
+ L ${8 + task.width - smallCorner} 0
7866
+ L ${8 + task.width} ${smallCorner}
7867
+ L ${8 + task.width} ${bottom}
7868
+ L ${8 + task.width - corner} ${task.height}
7869
+ L ${8 + task.width - corner * 2} ${bottom}
7870
+ L ${8 + corner * 2} ${bottom}
7871
+ L ${8 + corner} ${task.height}
7872
+ L ${8} ${bottom}
7873
+ L ${8} ${smallCorner}
7874
+ Z
7875
+ `;
7876
+ },
6884
7877
  /**
6885
7878
  * Should we display expander?
6886
7879
  *
@@ -6905,8 +7898,8 @@ var Epicvue_type_template_id_a2e89cd8_staticRenderFns = [];
6905
7898
  ;
6906
7899
  var Epic_component = normalizeComponent(
6907
7900
  Row_Epicvue_type_script_lang_js,
6908
- Epicvue_type_template_id_a2e89cd8_render,
6909
- Epicvue_type_template_id_a2e89cd8_staticRenderFns,
7901
+ Epicvue_type_template_id_80ad2e9c_render,
7902
+ Epicvue_type_template_id_80ad2e9c_staticRenderFns,
6910
7903
  false,
6911
7904
  null,
6912
7905
  null,
@@ -6915,8 +7908,8 @@ var Epic_component = normalizeComponent(
6915
7908
  )
6916
7909
 
6917
7910
  /* harmony default export */ var Epic = (Epic_component.exports);
6918
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Subtask.vue?vue&type=template&id=86599310
6919
- var Subtaskvue_type_template_id_86599310_render = function render() {
7911
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Subtask.vue?vue&type=template&id=52219a35
7912
+ var Subtaskvue_type_template_id_52219a35_render = function render() {
6920
7913
  var _vm = this,
6921
7914
  _c = _vm._self._c;
6922
7915
  return _c('g', {
@@ -6953,11 +7946,11 @@ var Subtaskvue_type_template_id_86599310_render = function render() {
6953
7946
  ..._vm.task.style['chart-row-bar']
6954
7947
  },
6955
7948
  attrs: {
6956
- "x": _vm.task.x,
7949
+ "x": _vm.task.x - 8,
6957
7950
  "y": _vm.task.y,
6958
- "width": _vm.task.width,
7951
+ "width": _vm.task.width + 16,
6959
7952
  "height": _vm.task.height,
6960
- "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
7953
+ "viewBox": `-8 0 ${_vm.task.width + 16} ${_vm.task.height}`,
6961
7954
  "xmlns": "http://www.w3.org/2000/svg"
6962
7955
  },
6963
7956
  on: {
@@ -7012,26 +8005,83 @@ var Subtaskvue_type_template_id_86599310_render = function render() {
7012
8005
  ..._vm.task.style['chart-row-bar-polygon']
7013
8006
  },
7014
8007
  attrs: {
7015
- "points": _vm.getPoints
8008
+ "points": _vm.getPointsAdjusted
8009
+ },
8010
+ on: {
8011
+ "mousedown": function ($event) {
8012
+ return _vm.startDrag($event, 'move');
8013
+ },
8014
+ "touchstart": function ($event) {
8015
+ return _vm.startDrag($event, 'move');
8016
+ }
7016
8017
  }
7017
8018
  }), _c('progress-bar', {
7018
8019
  attrs: {
7019
8020
  "task": _vm.task,
7020
8021
  "clip-path": 'url(#' + _vm.clipPathId + ')'
7021
8022
  }
8023
+ }), _c('rect', {
8024
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
8025
+ staticStyle: {
8026
+ "pointer-events": "all",
8027
+ "z-index": "50",
8028
+ "cursor": "ew-resize !important"
8029
+ },
8030
+ style: _vm.root.style['chart-row-extend-handle'],
8031
+ attrs: {
8032
+ "x": "0",
8033
+ "y": "0",
8034
+ "width": 12,
8035
+ "height": _vm.task.height
8036
+ },
8037
+ on: {
8038
+ "mousedown": function ($event) {
8039
+ $event.stopPropagation();
8040
+ return _vm.startDrag($event, 'start');
8041
+ },
8042
+ "touchstart": function ($event) {
8043
+ $event.stopPropagation();
8044
+ return _vm.startDrag($event, 'start');
8045
+ }
8046
+ }
8047
+ }), _c('rect', {
8048
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
8049
+ staticStyle: {
8050
+ "pointer-events": "all",
8051
+ "z-index": "50",
8052
+ "cursor": "ew-resize !important"
8053
+ },
8054
+ style: _vm.root.style['chart-row-extend-handle'],
8055
+ attrs: {
8056
+ "x": _vm.task.width - 12,
8057
+ "y": "0",
8058
+ "width": 12,
8059
+ "height": _vm.task.height
8060
+ },
8061
+ on: {
8062
+ "mousedown": function ($event) {
8063
+ $event.stopPropagation();
8064
+ return _vm.startDrag($event, 'end');
8065
+ },
8066
+ "touchstart": function ($event) {
8067
+ $event.stopPropagation();
8068
+ return _vm.startDrag($event, 'end');
8069
+ }
8070
+ }
7022
8071
  })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
7023
8072
  attrs: {
7024
8073
  "task": _vm.task
7025
8074
  }
7026
8075
  }) : _vm._e()], 1);
7027
8076
  };
7028
- var Subtaskvue_type_template_id_86599310_staticRenderFns = [];
8077
+ var Subtaskvue_type_template_id_52219a35_staticRenderFns = [];
7029
8078
 
7030
8079
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Subtask.vue?vue&type=script&lang=js
7031
8080
 
7032
8081
 
7033
8082
 
7034
8083
 
8084
+
7035
8085
  /* harmony default export */ var Subtaskvue_type_script_lang_js = ({
7036
8086
  name: 'Subtask',
7037
8087
  components: {
@@ -7041,7 +8091,7 @@ var Subtaskvue_type_template_id_86599310_staticRenderFns = [];
7041
8091
  },
7042
8092
  inject: ['root'],
7043
8093
  props: ['task'],
7044
- mixins: [Task_mixin],
8094
+ mixins: [Task_mixin, Draggable_mixin],
7045
8095
  data() {
7046
8096
  return {};
7047
8097
  },
@@ -7063,6 +8113,15 @@ var Subtaskvue_type_template_id_86599310_staticRenderFns = [];
7063
8113
  const task = this.task;
7064
8114
  return `0,0 ${task.width},0 ${task.width},${task.height} 0,${task.height}`;
7065
8115
  },
8116
+ /**
8117
+ * Get points adjusted for viewBox
8118
+ *
8119
+ * @returns {string}
8120
+ */
8121
+ getPointsAdjusted() {
8122
+ const task = this.task;
8123
+ return `8,0 ${task.width + 8},0 ${task.width + 8},${task.height} 8,${task.height}`;
8124
+ },
7066
8125
  /**
7067
8126
  * Should we display expander?
7068
8127
  *
@@ -7087,8 +8146,8 @@ var Subtaskvue_type_template_id_86599310_staticRenderFns = [];
7087
8146
  ;
7088
8147
  var Subtask_component = normalizeComponent(
7089
8148
  Row_Subtaskvue_type_script_lang_js,
7090
- Subtaskvue_type_template_id_86599310_render,
7091
- Subtaskvue_type_template_id_86599310_staticRenderFns,
8149
+ Subtaskvue_type_template_id_52219a35_render,
8150
+ Subtaskvue_type_template_id_52219a35_staticRenderFns,
7092
8151
  false,
7093
8152
  null,
7094
8153
  null,
@@ -7097,8 +8156,8 @@ var Subtask_component = normalizeComponent(
7097
8156
  )
7098
8157
 
7099
8158
  /* harmony default export */ var Subtask = (Subtask_component.exports);
7100
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Story.vue?vue&type=template&id=1f59b61a
7101
- var Storyvue_type_template_id_1f59b61a_render = function render() {
8159
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Story.vue?vue&type=template&id=5d688d0c
8160
+ var Storyvue_type_template_id_5d688d0c_render = function render() {
7102
8161
  var _vm = this,
7103
8162
  _c = _vm._self._c;
7104
8163
  return _c('g', {
@@ -7135,11 +8194,11 @@ var Storyvue_type_template_id_1f59b61a_render = function render() {
7135
8194
  ..._vm.task.style['chart-row-bar']
7136
8195
  },
7137
8196
  attrs: {
7138
- "x": _vm.task.x,
8197
+ "x": _vm.task.x - 8,
7139
8198
  "y": _vm.task.y,
7140
- "width": _vm.task.width,
8199
+ "width": _vm.task.width + 16,
7141
8200
  "height": _vm.task.height,
7142
- "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
8201
+ "viewBox": `-8 0 ${_vm.task.width + 16} ${_vm.task.height}`,
7143
8202
  "xmlns": "http://www.w3.org/2000/svg"
7144
8203
  },
7145
8204
  on: {
@@ -7194,26 +8253,83 @@ var Storyvue_type_template_id_1f59b61a_render = function render() {
7194
8253
  ..._vm.task.style['chart-row-bar-polygon']
7195
8254
  },
7196
8255
  attrs: {
7197
- "d": _vm.getPoints
8256
+ "d": _vm.getPointsAdjusted
8257
+ },
8258
+ on: {
8259
+ "mousedown": function ($event) {
8260
+ return _vm.startDrag($event, 'move');
8261
+ },
8262
+ "touchstart": function ($event) {
8263
+ return _vm.startDrag($event, 'move');
8264
+ }
7198
8265
  }
7199
8266
  }), _c('progress-bar', {
7200
8267
  attrs: {
7201
8268
  "task": _vm.task,
7202
8269
  "clip-path": 'url(#' + _vm.clipPathId + ')'
7203
8270
  }
8271
+ }), _c('rect', {
8272
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
8273
+ staticStyle: {
8274
+ "pointer-events": "all",
8275
+ "z-index": "50",
8276
+ "cursor": "ew-resize !important"
8277
+ },
8278
+ style: _vm.root.style['chart-row-extend-handle'],
8279
+ attrs: {
8280
+ "x": "0",
8281
+ "y": "0",
8282
+ "width": 12,
8283
+ "height": _vm.task.height
8284
+ },
8285
+ on: {
8286
+ "mousedown": function ($event) {
8287
+ $event.stopPropagation();
8288
+ return _vm.startDrag($event, 'start');
8289
+ },
8290
+ "touchstart": function ($event) {
8291
+ $event.stopPropagation();
8292
+ return _vm.startDrag($event, 'start');
8293
+ }
8294
+ }
8295
+ }), _c('rect', {
8296
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
8297
+ staticStyle: {
8298
+ "pointer-events": "all",
8299
+ "z-index": "50",
8300
+ "cursor": "ew-resize !important"
8301
+ },
8302
+ style: _vm.root.style['chart-row-extend-handle'],
8303
+ attrs: {
8304
+ "x": _vm.task.width - 12,
8305
+ "y": "0",
8306
+ "width": 12,
8307
+ "height": _vm.task.height
8308
+ },
8309
+ on: {
8310
+ "mousedown": function ($event) {
8311
+ $event.stopPropagation();
8312
+ return _vm.startDrag($event, 'end');
8313
+ },
8314
+ "touchstart": function ($event) {
8315
+ $event.stopPropagation();
8316
+ return _vm.startDrag($event, 'end');
8317
+ }
8318
+ }
7204
8319
  })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
7205
8320
  attrs: {
7206
8321
  "task": _vm.task
7207
8322
  }
7208
8323
  }) : _vm._e()], 1);
7209
8324
  };
7210
- var Storyvue_type_template_id_1f59b61a_staticRenderFns = [];
8325
+ var Storyvue_type_template_id_5d688d0c_staticRenderFns = [];
7211
8326
 
7212
8327
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-83.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Story.vue?vue&type=script&lang=js
7213
8328
 
7214
8329
 
7215
8330
 
7216
8331
 
8332
+
7217
8333
  /* harmony default export */ var Storyvue_type_script_lang_js = ({
7218
8334
  name: 'Story',
7219
8335
  components: {
@@ -7223,7 +8339,7 @@ var Storyvue_type_template_id_1f59b61a_staticRenderFns = [];
7223
8339
  },
7224
8340
  inject: ['root'],
7225
8341
  props: ['task'],
7226
- mixins: [Task_mixin],
8342
+ mixins: [Task_mixin, Draggable_mixin],
7227
8343
  data() {
7228
8344
  return {};
7229
8345
  },
@@ -7255,6 +8371,25 @@ var Storyvue_type_template_id_1f59b61a_staticRenderFns = [];
7255
8371
  Q 0 0 ${corner} 0
7256
8372
  Z`;
7257
8373
  },
8374
+ /**
8375
+ * Get points adjusted for viewBox
8376
+ *
8377
+ * @returns {string}
8378
+ */
8379
+ getPointsAdjusted() {
8380
+ const task = this.task;
8381
+ const corner = Math.min(task.height / 4, 8); // Rounded corners
8382
+ return `M ${8 + corner},0
8383
+ L ${8 + task.width - corner} 0
8384
+ Q ${8 + task.width} 0 ${8 + task.width} ${corner}
8385
+ L ${8 + task.width} ${task.height - corner}
8386
+ Q ${8 + task.width} ${task.height} ${8 + task.width - corner} ${task.height}
8387
+ L ${8 + corner} ${task.height}
8388
+ Q ${8} ${task.height} ${8} ${task.height - corner}
8389
+ L ${8} ${corner}
8390
+ Q ${8} 0 ${8 + corner} 0
8391
+ Z`;
8392
+ },
7258
8393
  /**
7259
8394
  * Should we display expander?
7260
8395
  *
@@ -7279,8 +8414,8 @@ var Storyvue_type_template_id_1f59b61a_staticRenderFns = [];
7279
8414
  ;
7280
8415
  var Story_component = normalizeComponent(
7281
8416
  Row_Storyvue_type_script_lang_js,
7282
- Storyvue_type_template_id_1f59b61a_render,
7283
- Storyvue_type_template_id_1f59b61a_staticRenderFns,
8417
+ Storyvue_type_template_id_5d688d0c_render,
8418
+ Storyvue_type_template_id_5d688d0c_staticRenderFns,
7284
8419
  false,
7285
8420
  null,
7286
8421
  null,
@@ -7330,6 +8465,43 @@ var Story_component = normalizeComponent(
7330
8465
  this.root.state.refs.chartGraph = this.$refs.chartGraph;
7331
8466
  this.root.state.refs.chartGraphSvg = this.$refs.chartGraphSvg;
7332
8467
  },
8468
+ methods: {
8469
+ /**
8470
+ * Handle task updated event
8471
+ *
8472
+ * @param {Object} updatedTask - Updated task data
8473
+ */
8474
+ handleTaskUpdated(updatedTask) {
8475
+ // Emit event to parent component
8476
+ console.log("task-updated --Chart");
8477
+ this.$emit('task-updated', updatedTask);
8478
+
8479
+ // Update the task in the root state
8480
+ const taskIndex = this.root.state.tasks.findIndex(task => task.id === updatedTask.id);
8481
+ if (taskIndex !== -1) {
8482
+ // Update task data
8483
+ this.root.state.tasks[taskIndex].startTime = updatedTask.startTime;
8484
+ this.root.state.tasks[taskIndex].endTime = updatedTask.endTime;
8485
+ this.root.state.tasks[taskIndex].duration = updatedTask.duration;
8486
+
8487
+ // Update task position and width
8488
+ if (this.root && this.root.timeToPixelOffsetX) {
8489
+ this.root.state.tasks[taskIndex].x = this.root.timeToPixelOffsetX(updatedTask.startTime);
8490
+ this.root.state.tasks[taskIndex].width = this.root.timeToPixelOffsetX(updatedTask.endTime) - this.root.state.tasks[taskIndex].x;
8491
+ } else {
8492
+ // Fallback calculation if method is not available
8493
+ const timePerPixel = this.root.state.options.times.timePerPixel;
8494
+ if (timePerPixel > 0) {
8495
+ this.root.state.tasks[taskIndex].x = (updatedTask.startTime - this.root.state.options.times.firstTime) / timePerPixel;
8496
+ this.root.state.tasks[taskIndex].width = (updatedTask.endTime - updatedTask.startTime) / timePerPixel;
8497
+ }
8498
+ }
8499
+
8500
+ // Force update
8501
+ this.$forceUpdate();
8502
+ }
8503
+ }
8504
+ },
7333
8505
  computed: {
7334
8506
  /**
7335
8507
  * Get view box
@@ -7353,8 +8525,8 @@ var Story_component = normalizeComponent(
7353
8525
  ;
7354
8526
  var Chart_component = normalizeComponent(
7355
8527
  Chart_Chartvue_type_script_lang_js,
7356
- Chartvue_type_template_id_1d5eb6d6_render,
7357
- Chartvue_type_template_id_1d5eb6d6_staticRenderFns,
8528
+ Chartvue_type_template_id_0856b85c_render,
8529
+ Chartvue_type_template_id_0856b85c_staticRenderFns,
7358
8530
  false,
7359
8531
  null,
7360
8532
  null,
@@ -7443,6 +8615,16 @@ let ignoreScrollEvents = false;
7443
8615
  }
7444
8616
  },
7445
8617
  methods: {
8618
+ /**
8619
+ * Handle task updated event from chart
8620
+ *
8621
+ * @param {Object} updatedTask - Updated task data
8622
+ */
8623
+ handleTaskUpdated(updatedTask) {
8624
+ // Emit event to parent component
8625
+ console.log("task-updated --MainView");
8626
+ this.$emit('task-updated', updatedTask);
8627
+ },
7446
8628
  /**
7447
8629
  * Emit event when mouse is moving inside main view
7448
8630
  */
@@ -7559,8 +8741,8 @@ let ignoreScrollEvents = false;
7559
8741
  ;
7560
8742
  var MainView_component = normalizeComponent(
7561
8743
  components_MainViewvue_type_script_lang_js,
7562
- MainViewvue_type_template_id_1a4b756c_render,
7563
- MainViewvue_type_template_id_1a4b756c_staticRenderFns,
8744
+ MainViewvue_type_template_id_79e1eba9_render,
8745
+ MainViewvue_type_template_id_79e1eba9_staticRenderFns,
7564
8746
  false,
7565
8747
  null,
7566
8748
  null,
@@ -7883,6 +9065,192 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
7883
9065
  'text-overflow': 'ellipsis',
7884
9066
  'max-width': '120px'
7885
9067
  },
9068
+ 'chart-row-resize-handle': {
9069
+ fill: 'rgba(59, 130, 246, 0.2)',
9070
+ stroke: 'rgba(59, 130, 246, 0.8)',
9071
+ 'stroke-width': '2',
9072
+ cursor: 'ew-resize',
9073
+ opacity: '0.3',
9074
+ transition: 'opacity 0.2s ease',
9075
+ 'pointer-events': 'all'
9076
+ },
9077
+ 'chart-row-resize-handle--start': {
9078
+ cursor: 'w-resize',
9079
+ fill: 'rgba(34, 197, 94, 0.3)',
9080
+ stroke: 'rgba(34, 197, 94, 0.9)',
9081
+ 'stroke-width': '2'
9082
+ },
9083
+ 'chart-row-resize-handle--end': {
9084
+ cursor: 'e-resize',
9085
+ fill: 'rgba(239, 68, 68, 0.4)',
9086
+ stroke: 'rgba(239, 68, 68, 1)',
9087
+ 'stroke-width': '2'
9088
+ },
9089
+ 'chart-row-bar-wrapper:hover .chart-row-resize-handle': {
9090
+ opacity: '0.8'
9091
+ },
9092
+ 'chart-row-resize-handle:hover': {
9093
+ opacity: '1',
9094
+ fill: 'rgba(59, 130, 246, 0.4)',
9095
+ stroke: 'rgba(59, 130, 246, 1)'
9096
+ },
9097
+ 'chart-row-resize-handle--start:hover': {
9098
+ fill: 'rgba(34, 197, 94, 0.4)',
9099
+ stroke: 'rgba(34, 197, 94, 1)'
9100
+ },
9101
+ 'chart-row-resize-handle--end:hover': {
9102
+ fill: 'rgba(239, 68, 68, 0.5)',
9103
+ stroke: 'rgba(239, 68, 68, 1)',
9104
+ 'stroke-width': '3'
9105
+ },
9106
+ 'chart-row-resize-handle--corner': {
9107
+ fill: 'rgba(147, 51, 234, 0.6)',
9108
+ stroke: 'rgba(147, 51, 234, 1)',
9109
+ 'stroke-width': '2',
9110
+ cursor: 'nw-resize',
9111
+ opacity: '0.9',
9112
+ transition: 'opacity 0.2s ease',
9113
+ 'pointer-events': 'all'
9114
+ },
9115
+ 'chart-row-resize-handle--corner:hover': {
9116
+ fill: 'rgba(147, 51, 234, 0.8)',
9117
+ stroke: 'rgba(147, 51, 234, 1)',
9118
+ 'stroke-width': '3',
9119
+ opacity: '1'
9120
+ },
9121
+ 'chart-row-resize-handle--corner--start': {
9122
+ fill: 'rgba(34, 197, 94, 0.7)',
9123
+ stroke: 'rgba(34, 197, 94, 1)',
9124
+ 'stroke-width': '2',
9125
+ cursor: 'w-resize'
9126
+ },
9127
+ 'chart-row-resize-handle--corner--end': {
9128
+ fill: 'rgba(239, 68, 68, 0.7)',
9129
+ stroke: 'rgba(239, 68, 68, 1)',
9130
+ 'stroke-width': '2',
9131
+ cursor: 'e-resize'
9132
+ },
9133
+ 'chart-row-corner-handle--start': {
9134
+ fill: 'rgba(34, 197, 94, 0.8)',
9135
+ stroke: 'rgba(34, 197, 94, 1)',
9136
+ 'stroke-width': '2',
9137
+ cursor: 'w-resize',
9138
+ opacity: '0.9',
9139
+ transition: 'opacity 0.2s ease',
9140
+ 'pointer-events': 'all'
9141
+ },
9142
+ 'chart-row-corner-handle--end': {
9143
+ fill: 'rgba(239, 68, 68, 0.8)',
9144
+ stroke: 'rgba(239, 68, 68, 1)',
9145
+ 'stroke-width': '2',
9146
+ cursor: 'e-resize',
9147
+ opacity: '0.9',
9148
+ transition: 'opacity 0.2s ease',
9149
+ 'pointer-events': 'all'
9150
+ },
9151
+ 'chart-row-corner-handle--start:hover': {
9152
+ fill: 'rgba(34, 197, 94, 0.5)',
9153
+ stroke: 'rgba(34, 197, 94, 1)',
9154
+ 'stroke-width': '2',
9155
+ opacity: '0.9'
9156
+ },
9157
+ 'chart-row-corner-handle--end:hover': {
9158
+ fill: 'rgba(239, 68, 68, 0.5)',
9159
+ stroke: 'rgba(239, 68, 68, 1)',
9160
+ 'stroke-width': '2',
9161
+ opacity: '0.9'
9162
+ },
9163
+ 'chart-row-extend-handle': {
9164
+ fill: 'rgba(255, 255, 255, 0.1)',
9165
+ stroke: 'rgba(255, 255, 255, 0.3)',
9166
+ 'stroke-width': '1',
9167
+ cursor: 'ew-resize',
9168
+ opacity: '0.3',
9169
+ transition: 'opacity 0.2s ease',
9170
+ 'pointer-events': 'all',
9171
+ 'z-index': '10'
9172
+ },
9173
+ 'chart-row-extend-handle:hover': {
9174
+ fill: 'rgba(255, 255, 255, 0.2)',
9175
+ stroke: 'rgba(255, 255, 255, 0.6)',
9176
+ 'stroke-width': '2',
9177
+ opacity: '0.8'
9178
+ },
9179
+ 'chart-row-expand-icon-bg': {
9180
+ fill: 'rgba(255, 255, 255, 0.95)',
9181
+ stroke: 'rgba(0, 0, 0, 0.5)',
9182
+ 'stroke-width': '1.5',
9183
+ cursor: 'ew-resize',
9184
+ opacity: '1',
9185
+ transition: 'opacity 0.2s ease',
9186
+ 'pointer-events': 'all'
9187
+ },
9188
+ 'chart-row-expand-icon-arrow': {
9189
+ fill: 'rgba(0, 0, 0, 0.9)',
9190
+ cursor: 'ew-resize',
9191
+ 'pointer-events': 'all'
9192
+ },
9193
+ 'chart-row-expand-icon:hover .gantt-elastic__chart-row-expand-icon-bg': {
9194
+ fill: 'rgba(255, 255, 255, 1)',
9195
+ stroke: 'rgba(0, 0, 0, 0.5)',
9196
+ 'stroke-width': '1.5',
9197
+ opacity: '1'
9198
+ },
9199
+ 'chart-row-expand-icon:hover .gantt-elastic__chart-row-expand-icon-arrow': {
9200
+ fill: 'rgba(0, 0, 0, 1)'
9201
+ },
9202
+ 'gantt-elastic__task-dragging': {
9203
+ opacity: '0.8',
9204
+ 'pointer-events': 'none',
9205
+ 'filter': 'drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2))'
9206
+ },
9207
+ 'gantt-elastic__task-dragging--start': {
9208
+ 'border-left': '3px solid #22c55e',
9209
+ 'box-shadow': 'inset 3px 0 0 #22c55e'
9210
+ },
9211
+ 'gantt-elastic__task-dragging--end': {
9212
+ 'border-right': '3px solid #ef4444',
9213
+ 'box-shadow': 'inset -3px 0 0 #ef4444'
9214
+ },
9215
+ 'gantt-elastic__task-dragging--move': {
9216
+ 'border': '2px solid #3b82f6',
9217
+ 'box-shadow': '0 0 0 2px rgba(59, 130, 246, 0.3)'
9218
+ },
9219
+ 'gantt-elastic__context-menu': {
9220
+ 'position': 'fixed',
9221
+ 'background': 'white',
9222
+ 'border': '1px solid #e5e7eb',
9223
+ 'border-radius': '6px',
9224
+ 'box-shadow': '0 4px 6px -1px rgba(0, 0, 0, 0.1)',
9225
+ 'z-index': '1000',
9226
+ 'min-width': '150px',
9227
+ 'padding': '4px 0',
9228
+ 'font-family': 'system-ui, -apple-system, sans-serif'
9229
+ },
9230
+ 'gantt-elastic__context-menu-item': {
9231
+ 'padding': '8px 16px',
9232
+ 'cursor': 'pointer',
9233
+ 'font-size': '14px',
9234
+ 'color': '#374151',
9235
+ 'transition': 'background-color 0.2s',
9236
+ 'user-select': 'none'
9237
+ },
9238
+ 'gantt-elastic__context-menu-item:hover': {
9239
+ 'background-color': '#f3f4f6'
9240
+ },
9241
+ 'gantt-elastic__date-tooltip': {
9242
+ 'position': 'fixed',
9243
+ 'background': 'rgba(0, 0, 0, 0.8)',
9244
+ 'color': 'white',
9245
+ 'padding': '4px 8px',
9246
+ 'border-radius': '4px',
9247
+ 'font-size': '12px',
9248
+ 'font-family': 'system-ui, -apple-system, sans-serif',
9249
+ 'pointer-events': 'none',
9250
+ 'z-index': '10000',
9251
+ 'white-space': 'nowrap',
9252
+ 'box-shadow': '0 2px 4px rgba(0, 0, 0, 0.2)'
9253
+ },
7886
9254
  'chart-row-text-content--text': {},
7887
9255
  'chart-row-text-content--html': {},
7888
9256
  'chart-row-wrapper': {},
@@ -10056,6 +11424,15 @@ const GanttElastic = {
10056
11424
  }
10057
11425
  }
10058
11426
 
11427
+ // Emit event to parent component
11428
+ this.$emit('view-mode-changed', mode);
11429
+
11430
+ // Also emit to root for plugin usage
11431
+ this.$root.$emit('gantt-view-mode-changed', mode);
11432
+
11433
+ // Log the view mode change for debugging
11434
+ console.log('View mode changed - from GanttElastic:', mode);
11435
+
10059
11436
  // Force recalculation by triggering a reactive update
10060
11437
  this.$nextTick(() => {
10061
11438
  this.$forceUpdate();
@@ -10074,6 +11451,20 @@ const GanttElastic = {
10074
11451
  }
10075
11452
  });
10076
11453
  },
11454
+ /**
11455
+ * Handle task updated event from dragging
11456
+ *
11457
+ * @param {Object} updatedTask - Updated task data
11458
+ */
11459
+ handleTaskUpdated(updatedTask) {
11460
+ // Emit event to parent component
11461
+ console.log('Task updated -- GanttElastic:');
11462
+ this.$emit('task-updated', updatedTask);
11463
+ this.$emit('gantt-task-updated', updatedTask);
11464
+
11465
+ // Also emit to root for plugin usage
11466
+ this.$root.$emit('gantt-task-updated', updatedTask);
11467
+ },
10077
11468
  /**
10078
11469
  * Calculate height of scrollbar in current browser
10079
11470
  *
@@ -10426,7 +11817,18 @@ const GanttElastic = {
10426
11817
  * @returns {number}
10427
11818
  */
10428
11819
  getHeight(visibleTasks, outer = false) {
10429
- let height = visibleTasks.length * (this.state.options.row.height + this.state.options.chart.grid.horizontal.gap * 2) + this.state.options.calendar.height + this.state.options.calendar.strokeWidth + this.state.options.calendar.gap;
11820
+ let height;
11821
+
11822
+ // If we have tasks, use their actual height for full grid
11823
+ if (visibleTasks.length > 0) {
11824
+ height = visibleTasks.length * (this.state.options.row.height + this.state.options.chart.grid.horizontal.gap * 2) + this.state.options.calendar.height + this.state.options.calendar.strokeWidth + this.state.options.calendar.gap;
11825
+ } else {
11826
+ // If no tasks, use 70% of viewport height for empty state
11827
+ const viewportHeight = window.innerHeight;
11828
+ const headerHeight = this.state.options.calendar.height + this.state.options.calendar.gap;
11829
+ const availableHeight = viewportHeight * 0.7 - headerHeight - 40; // 70% of viewport, 40px for padding/margins
11830
+ height = Math.max(availableHeight, 300); // Minimum 300px height
11831
+ }
10430
11832
  if (outer) {
10431
11833
  height += this.state.options.scrollBarHeight;
10432
11834
  }
@@ -10449,7 +11851,20 @@ const GanttElastic = {
10449
11851
  * @returns {number}
10450
11852
  */
10451
11853
  getTasksHeight(visibleTasks) {
10452
- return visibleTasks.length * this.getTaskHeight();
11854
+ const taskHeight = visibleTasks.length * this.getTaskHeight();
11855
+
11856
+ // If we have tasks, use their actual height for full grid
11857
+ if (visibleTasks.length > 0) {
11858
+ return taskHeight;
11859
+ }
11860
+
11861
+ // If no tasks, use 70% of viewport height for empty state
11862
+ const viewportHeight = window.innerHeight;
11863
+ const headerHeight = this.state.options.calendar.height + this.state.options.calendar.gap;
11864
+ const availableHeight = viewportHeight * 0.7 - headerHeight - 40; // 70% of viewport, 40px for padding/margins
11865
+ const reducedHeight = Math.max(availableHeight, 300); // Minimum 300px height
11866
+
11867
+ return reducedHeight;
10453
11868
  },
10454
11869
  /**
10455
11870
  * Convert time (in milliseconds) to pixel offset inside chart
@@ -10756,15 +12171,15 @@ const GanttElastic = {
10756
12171
  getMaxWidthMultiplier(stepDuration, stepCount) {
10757
12172
  const clientWidth = this.state.options.clientWidth;
10758
12173
 
10759
- // Base multipliers for different screen sizes
12174
+ // Base multipliers for different screen sizes (reduced for better balance)
10760
12175
  const baseMultipliers = {
10761
- mobile: 2,
10762
- // 2x viewport width on mobile
10763
- tablet: 2.5,
10764
- // 2.5x viewport width on tablet
10765
- desktopSmall: 3,
10766
- // 3x viewport width on small desktop
10767
- desktopBig: 4 // 4x viewport width on big desktop
12176
+ mobile: 1.5,
12177
+ // 1.5x viewport width on mobile
12178
+ tablet: 1.8,
12179
+ // 1.8x viewport width on tablet
12180
+ desktopSmall: 2.2,
12181
+ // 2.2x viewport width on small desktop
12182
+ desktopBig: 2.5 // 2.5x viewport width on big desktop
10768
12183
  };
10769
12184
 
10770
12185
  // Determine screen size
@@ -10791,7 +12206,7 @@ const GanttElastic = {
10791
12206
  // If we have more data than minimum visibility, allow more width
10792
12207
  if (stepCount > minVisibilitySteps[stepDuration]) {
10793
12208
  const dataRatio = stepCount / minVisibilitySteps[stepDuration];
10794
- multiplier = Math.min(multiplier * (1 + dataRatio * 0.5), 6); // Max 6x viewport width
12209
+ multiplier = Math.min(multiplier * (1 + dataRatio * 0.3), 3); // Max 3x viewport width
10795
12210
  }
10796
12211
  return multiplier;
10797
12212
  },
@@ -10892,7 +12307,7 @@ const GanttElastic = {
10892
12307
  const maxWidth = this.state.options.clientWidth * maxWidthMultiplier;
10893
12308
 
10894
12309
  // Ensure minimum width for scrolling when we have minimum visibility requirements
10895
- const minWidthForScrolling = this.state.options.clientWidth * 1.2; // 20% more than viewport
12310
+ const minWidthForScrolling = this.state.options.clientWidth * 1.1; // 10% more than viewport
10896
12311
  const finalWidth = Math.max(calculatedWidth, minWidthForScrolling);
10897
12312
  if (finalWidth > maxWidth) {
10898
12313
  // Only limit width if it's truly excessive
@@ -11182,6 +12597,29 @@ const GanttElastic = {
11182
12597
  width: 0
11183
12598
  }).width;
11184
12599
  },
12600
+ /**
12601
+ * Recalculate height based on current tasks and viewport
12602
+ */
12603
+ recalculateHeight() {
12604
+ const visibleTasks = this.state.tasks.filter(task => this.isTaskVisible(task));
12605
+ if (visibleTasks.length > 0) {
12606
+ // Use full task height for complete grid
12607
+ this.state.options.rowsHeight = this.getTasksHeight(visibleTasks);
12608
+ this.state.options.height = this.getHeight(visibleTasks);
12609
+ this.state.options.allVisibleTasksHeight = this.getTasksHeight(visibleTasks);
12610
+ this.state.options.outerHeight = this.getHeight(visibleTasks, true);
12611
+ } else {
12612
+ // Use reduced viewport height for empty state
12613
+ const viewportHeight = window.innerHeight;
12614
+ const headerHeight = this.state.options.calendar.height + this.state.options.calendar.gap;
12615
+ const availableHeight = viewportHeight * 0.7 - headerHeight - 40;
12616
+ const reducedHeight = Math.max(availableHeight, 300);
12617
+ this.state.options.rowsHeight = reducedHeight;
12618
+ this.state.options.height = reducedHeight + this.state.options.calendar.height + this.state.options.calendar.gap;
12619
+ this.state.options.allVisibleTasksHeight = reducedHeight;
12620
+ this.state.options.outerHeight = this.state.options.height + this.state.options.scrollBarHeight;
12621
+ }
12622
+ },
11185
12623
  /**
11186
12624
  * Global resize event (from window.addEventListener)
11187
12625
  */
@@ -11190,6 +12628,15 @@ const GanttElastic = {
11190
12628
  return;
11191
12629
  }
11192
12630
  this.state.options.clientWidth = this.$el.clientWidth;
12631
+
12632
+ // Only set height if no tasks are present (let visibleTasks computed property handle height when tasks exist)
12633
+ if (this.state.tasks.length === 0) {
12634
+ // Set height to 70% of viewport height for better balance when no tasks
12635
+ const viewportHeight = window.innerHeight;
12636
+ const headerHeight = this.state.options.calendar.height + this.state.options.calendar.gap;
12637
+ const availableHeight = viewportHeight * 0.7 - headerHeight - 40; // 70% of viewport, 40px for padding/margins
12638
+ this.state.options.height = Math.max(availableHeight, 300); // Minimum 300px height
12639
+ }
11193
12640
  if (this.state.options.taskList.widthFromPercentage > this.state.options.clientWidth / 100 * this.state.options.taskList.widthThreshold) {
11194
12641
  const diff = this.state.options.taskList.widthFromPercentage - this.state.options.clientWidth / 100 * this.state.options.taskList.widthThreshold;
11195
12642
  let diffPercent = 100 - diff / this.state.options.taskList.widthFromPercentage * 100;
@@ -11212,6 +12659,9 @@ const GanttElastic = {
11212
12659
  this.computeCalendarWidths();
11213
12660
  this.$emit('calendar-recalculate');
11214
12661
  this.syncScrollTop();
12662
+
12663
+ // Recalculate height after resize
12664
+ this.recalculateHeight();
11215
12665
  }
11216
12666
  },
11217
12667
  computed: {
@@ -11222,16 +12672,17 @@ const GanttElastic = {
11222
12672
  */
11223
12673
  visibleTasks() {
11224
12674
  const visibleTasks = this.state.tasks.filter(task => this.isTaskVisible(task));
11225
- const maxRows = visibleTasks.slice(0, this.state.options.maxRows);
11226
- this.state.options.rowsHeight = this.getTasksHeight(maxRows);
12675
+
12676
+ // Use full visible tasks for height calculations to show complete grid
12677
+ this.state.options.rowsHeight = this.getTasksHeight(visibleTasks);
11227
12678
  let heightCompensation = 0;
11228
12679
  if (this.state.options.maxHeight && this.state.options.rowsHeight > this.state.options.maxHeight) {
11229
12680
  heightCompensation = this.state.options.rowsHeight - this.state.options.maxHeight;
11230
12681
  this.state.options.rowsHeight = this.state.options.maxHeight;
11231
12682
  }
11232
- this.state.options.height = this.getHeight(maxRows) - heightCompensation;
12683
+ this.state.options.height = this.getHeight(visibleTasks) - heightCompensation;
11233
12684
  this.state.options.allVisibleTasksHeight = this.getTasksHeight(visibleTasks);
11234
- this.state.options.outerHeight = this.getHeight(maxRows, true) - heightCompensation;
12685
+ this.state.options.outerHeight = this.getHeight(visibleTasks, true) - heightCompensation;
11235
12686
  let len = visibleTasks.length;
11236
12687
  for (let index = 0; index < len; index++) {
11237
12688
  let task = visibleTasks[index];
@@ -11282,6 +12733,10 @@ const GanttElastic = {
11282
12733
  if (notEqual) {
11283
12734
  this.setup('tasks');
11284
12735
  }
12736
+ // Recalculate height when tasks change
12737
+ this.$nextTick(() => {
12738
+ this.recalculateHeight();
12739
+ });
11285
12740
  }, {
11286
12741
  deep: true
11287
12742
  });
@@ -11331,15 +12786,59 @@ const GanttElastic = {
11331
12786
  */
11332
12787
  mounted() {
11333
12788
  this.state.options.clientWidth = this.$el.clientWidth;
12789
+
12790
+ // Set initial height based on whether tasks exist
12791
+ if (this.state.tasks.length === 0) {
12792
+ const viewportHeight = window.innerHeight;
12793
+ const headerHeight = this.state.options.calendar.height + this.state.options.calendar.gap;
12794
+ const availableHeight = viewportHeight * 0.7 - headerHeight - 40;
12795
+ this.state.options.height = Math.max(availableHeight, 300);
12796
+ }
11334
12797
  this.state.resizeObserver = new ResizeObserver_es((entries, observer) => {
11335
12798
  this.globalOnResize();
11336
12799
  });
11337
12800
  this.state.resizeObserver.observe(this.$el.parentNode);
12801
+
12802
+ // Add window resize listener for full viewport responsiveness
12803
+ window.addEventListener('resize', this.globalOnResize);
11338
12804
  this.globalOnResize();
12805
+ this.recalculateHeight();
11339
12806
  this.$emit('ready', this);
11340
12807
  this.$root.$emit('gantt-elastic-mounted', this);
11341
12808
  this.$emit('mounted', this);
11342
12809
  this.$root.$emit('gantt-elastic-ready', this);
12810
+
12811
+ // Expose methods for plugin usage
12812
+ this.$gantt = {
12813
+ onTaskUpdated: this.handleTaskUpdated,
12814
+ onViewModeChanged: this.onViewModeChanged,
12815
+ getTasks: () => this.state.tasks,
12816
+ updateTask: (taskId, updates) => {
12817
+ const taskIndex = this.state.tasks.findIndex(task => task.id === taskId);
12818
+ if (taskIndex !== -1) {
12819
+ Object.assign(this.state.tasks[taskIndex], updates);
12820
+ this.$forceUpdate();
12821
+ }
12822
+ }
12823
+ };
12824
+
12825
+ /*
12826
+ * PLUGIN USAGE EXAMPLE:
12827
+ *
12828
+ * // Listen to events when using as plugin:
12829
+ * this.$root.$on('gantt-task-updated', (updatedTask) => {
12830
+ * console.log('Task updated:', updatedTask);
12831
+ * });
12832
+ *
12833
+ * this.$root.$on('gantt-view-mode-changed', (mode) => {
12834
+ * console.log('View mode changed:', mode);
12835
+ * });
12836
+ *
12837
+ * // Access gantt methods:
12838
+ * const ganttInstance = this.$refs.ganttChart.$gantt;
12839
+ * ganttInstance.updateTask(1, { label: 'New Task Name' });
12840
+ * const tasks = ganttInstance.getTasks();
12841
+ */
11343
12842
  },
11344
12843
  /**
11345
12844
  * Emit event when data was changed and before update (you can cleanup dom events here for example)
@@ -11360,6 +12859,7 @@ const GanttElastic = {
11360
12859
  */
11361
12860
  beforeDestroy() {
11362
12861
  this.state.resizeObserver.unobserve(this.$el.parentNode);
12862
+ window.removeEventListener('resize', this.globalOnResize);
11363
12863
  this.state.unwatchTasks();
11364
12864
  this.state.unwatchOptions();
11365
12865
  this.state.unwatchStyle();
@@ -11378,10 +12878,10 @@ const GanttElastic = {
11378
12878
  /* harmony default export */ var GanttElasticvue_type_script_lang_js = (GanttElastic);
11379
12879
  ;// ./src/GanttElastic.vue?vue&type=script&lang=js
11380
12880
  /* harmony default export */ var src_GanttElasticvue_type_script_lang_js = (GanttElasticvue_type_script_lang_js);
11381
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-55.use[0]!./node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-55.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-55.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.vue?vue&type=style&index=0&id=2767341e&prod&lang=css
12881
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-55.use[0]!./node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-55.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-55.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.vue?vue&type=style&index=0&id=0a0b0d9f&prod&lang=css
11382
12882
  // extracted by mini-css-extract-plugin
11383
12883
 
11384
- ;// ./src/GanttElastic.vue?vue&type=style&index=0&id=2767341e&prod&lang=css
12884
+ ;// ./src/GanttElastic.vue?vue&type=style&index=0&id=0a0b0d9f&prod&lang=css
11385
12885
 
11386
12886
  ;// ./src/GanttElastic.vue
11387
12887
 
@@ -11394,8 +12894,8 @@ const GanttElastic = {
11394
12894
 
11395
12895
  var GanttElastic_component = normalizeComponent(
11396
12896
  src_GanttElasticvue_type_script_lang_js,
11397
- GanttElasticvue_type_template_id_2767341e_render,
11398
- GanttElasticvue_type_template_id_2767341e_staticRenderFns,
12897
+ GanttElasticvue_type_template_id_0a0b0d9f_render,
12898
+ GanttElasticvue_type_template_id_0a0b0d9f_staticRenderFns,
11399
12899
  false,
11400
12900
  null,
11401
12901
  null,