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.
@@ -3375,7 +3375,7 @@ if (typeof window !== 'undefined') {
3375
3375
  // Indicate to webpack that this file can be concatenated
3376
3376
  /* harmony default export */ var setPublicPath = (null);
3377
3377
 
3378
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.standalone.vue?vue&type=template&id=c24bafbc
3378
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.standalone.vue?vue&type=template&id=ba4781dc
3379
3379
  var render = function render() {
3380
3380
  var _vm = this,
3381
3381
  _c = _vm._self._c;
@@ -3384,6 +3384,32 @@ var render = function render() {
3384
3384
  "tasks": _vm.tasks,
3385
3385
  "options": _vm.options,
3386
3386
  "dynamicStyle": _vm.dynamicStyle
3387
+ },
3388
+ on: {
3389
+ "task-updated": function ($event) {
3390
+ return _vm.$emit('task-updated', $event);
3391
+ },
3392
+ "gantt-task-updated": function ($event) {
3393
+ return _vm.$emit('gantt-task-updated', $event);
3394
+ },
3395
+ "view-mode-changed": function ($event) {
3396
+ return _vm.$emit('view-mode-changed', $event);
3397
+ },
3398
+ "gantt-view-mode-changed": function ($event) {
3399
+ return _vm.$emit('gantt-view-mode-changed', $event);
3400
+ },
3401
+ "tasks-changed": function ($event) {
3402
+ return _vm.$emit('tasks-changed', $event);
3403
+ },
3404
+ "options-changed": function ($event) {
3405
+ return _vm.$emit('options-changed', $event);
3406
+ },
3407
+ "dynamic-style-changed": function ($event) {
3408
+ return _vm.$emit('dynamic-style-changed', $event);
3409
+ },
3410
+ "mounted": function ($event) {
3411
+ return _vm.$emit('mounted', $event);
3412
+ }
3387
3413
  }
3388
3414
  }, [_vm.components.header ? _c(_vm.components.header, {
3389
3415
  tag: "component",
@@ -3401,8 +3427,8 @@ var render = function render() {
3401
3427
  };
3402
3428
  var staticRenderFns = [];
3403
3429
 
3404
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.vue?vue&type=template&id=2767341e
3405
- var GanttElasticvue_type_template_id_2767341e_render = function render() {
3430
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.vue?vue&type=template&id=0a0b0d9f
3431
+ var GanttElasticvue_type_template_id_0a0b0d9f_render = function render() {
3406
3432
  var _vm = this,
3407
3433
  _c = _vm._self._c,
3408
3434
  _setup = _vm._self._setupProxy;
@@ -3425,10 +3451,13 @@ var GanttElasticvue_type_template_id_2767341e_render = function render() {
3425
3451
  },
3426
3452
  slot: "header"
3427
3453
  }), _vm._t("header"), _c('main-view', {
3428
- ref: "mainView"
3454
+ ref: "mainView",
3455
+ on: {
3456
+ "task-updated": _vm.handleTaskUpdated
3457
+ }
3429
3458
  }), _vm._t("footer")], 2);
3430
3459
  };
3431
- var GanttElasticvue_type_template_id_2767341e_staticRenderFns = [];
3460
+ var GanttElasticvue_type_template_id_0a0b0d9f_staticRenderFns = [];
3432
3461
 
3433
3462
  // EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js
3434
3463
  var es_array_push = __webpack_require__(4114);
@@ -3671,8 +3700,8 @@ var component = normalizeComponent(
3671
3700
  )
3672
3701
 
3673
3702
  /* harmony default export */ var GanttViewFilter = (component.exports);
3674
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/MainView.vue?vue&type=template&id=1a4b756c
3675
- var MainViewvue_type_template_id_1a4b756c_render = function render() {
3703
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/MainView.vue?vue&type=template&id=79e1eba9
3704
+ var MainViewvue_type_template_id_79e1eba9_render = function render() {
3676
3705
  var _vm = this,
3677
3706
  _c = _vm._self._c;
3678
3707
  return _c('div', {
@@ -3741,7 +3770,11 @@ var MainViewvue_type_template_id_1a4b756c_render = function render() {
3741
3770
  return _vm.chartWheel.apply(null, arguments);
3742
3771
  }
3743
3772
  }
3744
- }, [_c('chart')], 1)])]), _c('div', {
3773
+ }, [_c('chart', {
3774
+ on: {
3775
+ "task-updated": _vm.handleTaskUpdated
3776
+ }
3777
+ })], 1)])]), _c('div', {
3745
3778
  ref: "chartScrollContainerVertical",
3746
3779
  staticClass: "gantt-elastic__chart-scroll-container gantt-elastic__chart-scroll-container--vertical",
3747
3780
  style: {
@@ -3777,7 +3810,7 @@ var MainViewvue_type_template_id_1a4b756c_render = function render() {
3777
3810
  }
3778
3811
  })])]);
3779
3812
  };
3780
- var MainViewvue_type_template_id_1a4b756c_staticRenderFns = [];
3813
+ var MainViewvue_type_template_id_79e1eba9_staticRenderFns = [];
3781
3814
 
3782
3815
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/TaskList/TaskList.vue?vue&type=template&id=74ce1216
3783
3816
  var TaskListvue_type_template_id_74ce1216_render = function render() {
@@ -4584,8 +4617,8 @@ var TaskList_component = normalizeComponent(
4584
4617
  )
4585
4618
 
4586
4619
  /* harmony default export */ var TaskList = (TaskList_component.exports);
4587
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Chart.vue?vue&type=template&id=1d5eb6d6
4588
- var Chartvue_type_template_id_1d5eb6d6_render = function render() {
4620
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Chart.vue?vue&type=template&id=0856b85c
4621
+ var Chartvue_type_template_id_0856b85c_render = function render() {
4589
4622
  var _vm = this,
4590
4623
  _c = _vm._self._c;
4591
4624
  return _c('div', {
@@ -4653,14 +4686,17 @@ var Chartvue_type_template_id_1d5eb6d6_render = function render() {
4653
4686
  tag: "component",
4654
4687
  attrs: {
4655
4688
  "task": task
4689
+ },
4690
+ on: {
4691
+ "task-updated": _vm.handleTaskUpdated
4656
4692
  }
4657
4693
  })], 1);
4658
4694
  })], 2)])])])]);
4659
4695
  };
4660
- var Chartvue_type_template_id_1d5eb6d6_staticRenderFns = [];
4696
+ var Chartvue_type_template_id_0856b85c_staticRenderFns = [];
4661
4697
 
4662
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Grid.vue?vue&type=template&id=b2e4dec2
4663
- var Gridvue_type_template_id_b2e4dec2_render = function render() {
4698
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Grid.vue?vue&type=template&id=244ea0ee
4699
+ var Gridvue_type_template_id_244ea0ee_render = function render() {
4664
4700
  var _vm = this,
4665
4701
  _c = _vm._self._c;
4666
4702
  return _c('svg', {
@@ -4722,7 +4758,7 @@ var Gridvue_type_template_id_b2e4dec2_render = function render() {
4722
4758
  }
4723
4759
  })], 2)]);
4724
4760
  };
4725
- var Gridvue_type_template_id_b2e4dec2_staticRenderFns = [];
4761
+ var Gridvue_type_template_id_244ea0ee_staticRenderFns = [];
4726
4762
 
4727
4763
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Grid.vue?vue&type=script&lang=js
4728
4764
 
@@ -4830,15 +4866,41 @@ var Gridvue_type_template_id_b2e4dec2_staticRenderFns = [];
4830
4866
  let lines = [];
4831
4867
  const state = this.root.state.options;
4832
4868
  let tasks = this.root.visibleTasks;
4833
- for (let index = 0, len = tasks.length; index <= len; index++) {
4834
- const y = index * (state.row.height + state.chart.grid.horizontal.gap * 2) + this.root.style['grid-line-vertical']['stroke-width'] / 2;
4835
- lines.push({
4836
- key: 'hl' + index,
4837
- x1: 0,
4838
- y1: y,
4839
- x2: '100%',
4840
- y2: y
4841
- });
4869
+
4870
+ // If we have tasks, show full grid for all tasks
4871
+ if (tasks.length > 0) {
4872
+ const rowHeight = state.row.height + state.chart.grid.horizontal.gap * 2;
4873
+ const rowCount = tasks.length; // Use actual task count
4874
+
4875
+ for (let index = 0; index <= rowCount; index++) {
4876
+ const y = index * rowHeight + this.root.style['grid-line-vertical']['stroke-width'] / 2;
4877
+ lines.push({
4878
+ key: 'hl' + index,
4879
+ x1: 0,
4880
+ y1: y,
4881
+ x2: '100%',
4882
+ y2: y
4883
+ });
4884
+ }
4885
+ } else {
4886
+ // If no tasks, use reduced viewport height for empty state
4887
+ const viewportHeight = window.innerHeight;
4888
+ const headerHeight = state.calendar.height + state.calendar.gap;
4889
+ const availableHeight = viewportHeight * 0.7 - headerHeight - 40; // 70% of viewport, 40px for padding/margins
4890
+ const reducedHeight = Math.max(availableHeight, 300); // Minimum 300px height
4891
+
4892
+ const rowHeight = state.row.height + state.chart.grid.horizontal.gap * 2;
4893
+ const maxRows = Math.floor(reducedHeight / rowHeight);
4894
+ for (let index = 0; index <= maxRows; index++) {
4895
+ const y = index * rowHeight + this.root.style['grid-line-vertical']['stroke-width'] / 2;
4896
+ lines.push({
4897
+ key: 'hl' + index,
4898
+ x1: 0,
4899
+ y1: y,
4900
+ x2: '100%',
4901
+ y2: y
4902
+ });
4903
+ }
4842
4904
  }
4843
4905
  return lines;
4844
4906
  },
@@ -4887,8 +4949,8 @@ var Gridvue_type_template_id_b2e4dec2_staticRenderFns = [];
4887
4949
  ;
4888
4950
  var Grid_component = normalizeComponent(
4889
4951
  Chart_Gridvue_type_script_lang_js,
4890
- Gridvue_type_template_id_b2e4dec2_render,
4891
- Gridvue_type_template_id_b2e4dec2_staticRenderFns,
4952
+ Gridvue_type_template_id_244ea0ee_render,
4953
+ Gridvue_type_template_id_244ea0ee_staticRenderFns,
4892
4954
  false,
4893
4955
  null,
4894
4956
  null,
@@ -5840,8 +5902,8 @@ var DependencyLines_component = normalizeComponent(
5840
5902
  )
5841
5903
 
5842
5904
  /* harmony default export */ var DependencyLines = (DependencyLines_component.exports);
5843
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Task.vue?vue&type=template&id=208a9baa
5844
- var Taskvue_type_template_id_208a9baa_render = function render() {
5905
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Task.vue?vue&type=template&id=23849415
5906
+ var Taskvue_type_template_id_23849415_render = function render() {
5845
5907
  var _vm = this,
5846
5908
  _c = _vm._self._c;
5847
5909
  return _c('g', {
@@ -5878,11 +5940,11 @@ var Taskvue_type_template_id_208a9baa_render = function render() {
5878
5940
  ..._vm.task.style['chart-row-bar']
5879
5941
  },
5880
5942
  attrs: {
5881
- "x": _vm.task.x,
5943
+ "x": _vm.task.x - 8,
5882
5944
  "y": _vm.task.y,
5883
- "width": _vm.task.width,
5945
+ "width": _vm.task.width + 16,
5884
5946
  "height": _vm.task.height,
5885
- "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
5947
+ "viewBox": `-8 0 ${_vm.task.width + 16} ${_vm.task.height}`,
5886
5948
  "xmlns": "http://www.w3.org/2000/svg"
5887
5949
  },
5888
5950
  on: {
@@ -5937,20 +5999,76 @@ var Taskvue_type_template_id_208a9baa_render = function render() {
5937
5999
  ..._vm.task.style['chart-row-bar-polygon']
5938
6000
  },
5939
6001
  attrs: {
5940
- "points": _vm.getPoints
6002
+ "points": _vm.getPointsAdjusted
6003
+ },
6004
+ on: {
6005
+ "mousedown": function ($event) {
6006
+ return _vm.startDrag($event, 'move');
6007
+ },
6008
+ "touchstart": function ($event) {
6009
+ return _vm.startDrag($event, 'move');
6010
+ }
5941
6011
  }
5942
6012
  }), _c('progress-bar', {
5943
6013
  attrs: {
5944
6014
  "task": _vm.task,
5945
6015
  "clip-path": 'url(#' + _vm.clipPathId + ')'
5946
6016
  }
6017
+ }), _c('rect', {
6018
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
6019
+ staticStyle: {
6020
+ "pointer-events": "all",
6021
+ "z-index": "50",
6022
+ "cursor": "ew-resize !important"
6023
+ },
6024
+ style: _vm.root.style['chart-row-extend-handle'],
6025
+ attrs: {
6026
+ "x": "0",
6027
+ "y": "0",
6028
+ "width": 12,
6029
+ "height": _vm.task.height
6030
+ },
6031
+ on: {
6032
+ "mousedown": function ($event) {
6033
+ $event.stopPropagation();
6034
+ return _vm.startDrag($event, 'start');
6035
+ },
6036
+ "touchstart": function ($event) {
6037
+ $event.stopPropagation();
6038
+ return _vm.startDrag($event, 'start');
6039
+ }
6040
+ }
6041
+ }), _c('rect', {
6042
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
6043
+ staticStyle: {
6044
+ "pointer-events": "all",
6045
+ "z-index": "50",
6046
+ "cursor": "ew-resize !important"
6047
+ },
6048
+ style: _vm.root.style['chart-row-extend-handle'],
6049
+ attrs: {
6050
+ "x": _vm.task.width - 12,
6051
+ "y": "0",
6052
+ "width": 12,
6053
+ "height": _vm.task.height
6054
+ },
6055
+ on: {
6056
+ "mousedown": function ($event) {
6057
+ $event.stopPropagation();
6058
+ return _vm.startDrag($event, 'end');
6059
+ },
6060
+ "touchstart": function ($event) {
6061
+ $event.stopPropagation();
6062
+ return _vm.startDrag($event, 'end');
6063
+ }
6064
+ }
5947
6065
  })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
5948
6066
  attrs: {
5949
6067
  "task": _vm.task
5950
6068
  }
5951
6069
  }) : _vm._e()], 1);
5952
6070
  };
5953
- var Taskvue_type_template_id_208a9baa_staticRenderFns = [];
6071
+ var Taskvue_type_template_id_23849415_staticRenderFns = [];
5954
6072
 
5955
6073
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Text.vue?vue&type=template&id=634f40aa
5956
6074
  var Textvue_type_template_id_634f40aa_render = function render() {
@@ -6087,15 +6205,16 @@ var Text_component = normalizeComponent(
6087
6205
  )
6088
6206
 
6089
6207
  /* harmony default export */ var Text = (Text_component.exports);
6090
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/ProgressBar.vue?vue&type=template&id=bc869ae8
6091
- var ProgressBarvue_type_template_id_bc869ae8_render = function render() {
6208
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/ProgressBar.vue?vue&type=template&id=2323ee21
6209
+ var ProgressBarvue_type_template_id_2323ee21_render = function render() {
6092
6210
  var _vm = this,
6093
6211
  _c = _vm._self._c;
6094
6212
  return _c('g', {
6095
6213
  staticClass: "gantt-elastic__chart-row-progress-bar-wrapper",
6096
6214
  style: {
6097
6215
  ..._vm.root.style['chart-row-progress-bar-wrapper'],
6098
- ..._vm.task.style['chart-row-progress-bar-wrapper']
6216
+ ..._vm.task.style['chart-row-progress-bar-wrapper'],
6217
+ 'pointer-events': 'none'
6099
6218
  }
6100
6219
  }, [_c('defs', [_c('pattern', {
6101
6220
  attrs: {
@@ -6117,8 +6236,11 @@ var ProgressBarvue_type_template_id_bc869ae8_render = function render() {
6117
6236
  "x2": "0",
6118
6237
  "y2": _vm.root.state.options.chart.progress.width
6119
6238
  }
6120
- })])]), _vm.root.state.options.chart.progress.bar ? _c('rect', {
6239
+ })])]), _vm.root.state.options.chart.progress.bar && _vm.task.progress > 0 ? _c('rect', {
6121
6240
  staticClass: "gantt-elastic__chart-row-progress-bar-solid",
6241
+ staticStyle: {
6242
+ "pointer-events": "none"
6243
+ },
6122
6244
  style: {
6123
6245
  ..._vm.root.style['chart-row-progress-bar-solid'],
6124
6246
  ..._vm.task.style['chart-row-progress-bar-solid']
@@ -6128,7 +6250,11 @@ var ProgressBarvue_type_template_id_bc869ae8_render = function render() {
6128
6250
  "y": "0",
6129
6251
  "width": _vm.getProgressWidth
6130
6252
  }
6131
- }) : _vm._e(), _vm.root.state.options.chart.progress.pattern ? _c('g', [_c('rect', {
6253
+ }) : _vm._e(), _vm.root.state.options.chart.progress.pattern && _vm.task.progress > 0 ? _c('g', {
6254
+ staticStyle: {
6255
+ "pointer-events": "none"
6256
+ }
6257
+ }, [_c('rect', {
6132
6258
  staticClass: "gantt-elastic__chart-row-progress-bar-pattern",
6133
6259
  style: {
6134
6260
  ..._vm.root.style['chart-row-progress-bar-pattern'],
@@ -6152,7 +6278,7 @@ var ProgressBarvue_type_template_id_bc869ae8_render = function render() {
6152
6278
  }
6153
6279
  })]) : _vm._e()]);
6154
6280
  };
6155
- var ProgressBarvue_type_template_id_bc869ae8_staticRenderFns = [];
6281
+ var ProgressBarvue_type_template_id_2323ee21_staticRenderFns = [];
6156
6282
 
6157
6283
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/ProgressBar.vue?vue&type=script&lang=js
6158
6284
  /* harmony default export */ var ProgressBarvue_type_script_lang_js = ({
@@ -6213,8 +6339,8 @@ var ProgressBarvue_type_template_id_bc869ae8_staticRenderFns = [];
6213
6339
  ;
6214
6340
  var ProgressBar_component = normalizeComponent(
6215
6341
  Chart_ProgressBarvue_type_script_lang_js,
6216
- ProgressBarvue_type_template_id_bc869ae8_render,
6217
- ProgressBarvue_type_template_id_bc869ae8_staticRenderFns,
6342
+ ProgressBarvue_type_template_id_2323ee21_render,
6343
+ ProgressBarvue_type_template_id_2323ee21_staticRenderFns,
6218
6344
  false,
6219
6345
  null,
6220
6346
  null,
@@ -6271,11 +6397,631 @@ var ProgressBar_component = normalizeComponent(
6271
6397
  }
6272
6398
  }
6273
6399
  });
6400
+ ;// ./src/components/Chart/Row/Draggable.mixin.js
6401
+
6402
+
6403
+ /* harmony default export */ var Draggable_mixin = ({
6404
+ data() {
6405
+ return {
6406
+ isDragging: false,
6407
+ dragStartX: 0,
6408
+ dragStartTime: 0,
6409
+ dragType: null,
6410
+ // 'start', 'end', or 'move'
6411
+ originalStartTime: 0,
6412
+ originalEndTime: 0,
6413
+ originalDuration: 0
6414
+ };
6415
+ },
6416
+ methods: {
6417
+ startDrag(event, type) {
6418
+ event.preventDefault();
6419
+ event.stopPropagation();
6420
+
6421
+ // Debug logging
6422
+ // console.log('Starting drag:', {
6423
+ // type: type,
6424
+ // taskId: this.task.id,
6425
+ // taskType: this.task.type,
6426
+ // originalStart: this.task.startTime,
6427
+ // originalEnd: this.task.endTime
6428
+ // });
6429
+
6430
+ // Safety checks
6431
+ if (!this.root || !this.root.state || !this.root.state.options || !this.root.state.options.times) {
6432
+ console.error('Root or times options not available for dragging');
6433
+ return;
6434
+ }
6435
+ this.isDragging = true;
6436
+ this.dragType = type;
6437
+ this.dragStartX = event.clientX || event.touches[0].clientX;
6438
+ this.dragStartTime = this.task.startTime;
6439
+ this.originalStartTime = this.task.startTime;
6440
+ this.originalEndTime = this.task.endTime;
6441
+ this.originalDuration = this.task.duration;
6442
+
6443
+ // Add event listeners
6444
+ document.addEventListener('mousemove', this.handleDrag);
6445
+ document.addEventListener('mouseup', this.endDrag);
6446
+ document.addEventListener('touchmove', this.handleDrag);
6447
+ document.addEventListener('touchend', this.endDrag);
6448
+
6449
+ // Hide hover tooltip when dragging starts
6450
+ this.hideHoverTooltip();
6451
+
6452
+ // Add context menu for extending tasks
6453
+ // this.$el.addEventListener('contextmenu', this.showContextMenu);
6454
+
6455
+ // Add keyboard shortcuts
6456
+ this.$el.addEventListener('keydown', this.handleKeyboardShortcuts);
6457
+
6458
+ // Add dragging class for visual feedback
6459
+ this.$el.classList.add('gantt-elastic__task-dragging');
6460
+ this.$el.classList.add(`gantt-elastic__task-dragging--${type}`);
6461
+
6462
+ // Create date tooltip for all dragging types
6463
+ this.createDateTooltip();
6464
+ },
6465
+ handleDrag(event) {
6466
+ if (!this.isDragging) return;
6467
+ event.preventDefault();
6468
+ const currentX = event.clientX || event.touches[0].clientX;
6469
+ const deltaX = currentX - this.dragStartX;
6470
+
6471
+ // Convert pixel delta to time delta
6472
+ const timeDelta = deltaX * this.root.state.options.times.timePerPixel;
6473
+ if (this.dragType === 'move') {
6474
+ // Move entire task
6475
+ const newStartTime = this.originalStartTime + timeDelta;
6476
+ const newEndTime = this.originalEndTime + timeDelta;
6477
+
6478
+ // Ensure task doesn't go before chart start
6479
+ const chartStartTime = this.root.state.options.times.firstTime;
6480
+ const chartEndTime = this.root.state.options.times.lastTime;
6481
+ if (newStartTime >= chartStartTime && newEndTime <= chartEndTime) {
6482
+ this.updateTaskTime(newStartTime, newEndTime);
6483
+
6484
+ // Update date tooltip for move dragging
6485
+ if (this.dateTooltip) {
6486
+ this.updateDateTooltip(newStartTime);
6487
+ }
6488
+ }
6489
+ } else if (this.dragType === 'start') {
6490
+ // Resize from start - change start date
6491
+ const newStartTime = this.originalStartTime + timeDelta;
6492
+ const newEndTime = this.originalEndTime;
6493
+
6494
+ // Ensure start doesn't go after end and respects minimum duration
6495
+ const minDuration = 24 * 60 * 60 * 1000; // 1 day minimum
6496
+ const chartStartTime = this.root.state.options.times.firstTime;
6497
+ if (newStartTime < newEndTime && newEndTime - newStartTime >= minDuration && newStartTime >= chartStartTime) {
6498
+ this.updateTaskTime(newStartTime, newEndTime);
6499
+
6500
+ // Update date tooltip for start dragging
6501
+ if (this.dateTooltip) {
6502
+ this.updateDateTooltip(newStartTime);
6503
+ }
6504
+ }
6505
+ } else if (this.dragType === 'end') {
6506
+ // Resize from end - change end date while keeping start fixed
6507
+ const newStartTime = this.originalStartTime;
6508
+ const newEndTime = this.originalEndTime + timeDelta;
6509
+
6510
+ // Ensure end doesn't go before start and respects minimum duration
6511
+ const minDuration = 24 * 60 * 60 * 1000; // 1 day minimum
6512
+
6513
+ if (newEndTime > newStartTime && newEndTime - newStartTime >= minDuration) {
6514
+ // Allow extending beyond chart end time if needed
6515
+ this.updateTaskTime(newStartTime, newEndTime);
6516
+
6517
+ // Update date tooltip for end dragging
6518
+ if (this.dateTooltip) {
6519
+ this.updateDateTooltip(newEndTime);
6520
+ }
6521
+ }
6522
+ }
6523
+ },
6524
+ endDrag(event) {
6525
+ if (!this.isDragging) return;
6526
+ this.isDragging = false;
6527
+
6528
+ // Remove event listeners
6529
+ document.removeEventListener('mousemove', this.handleDrag);
6530
+ document.removeEventListener('mouseup', this.endDrag);
6531
+ document.removeEventListener('touchmove', this.handleDrag);
6532
+ document.removeEventListener('touchend', this.endDrag);
6533
+
6534
+ // Remove dragging classes
6535
+ this.$el.classList.remove('gantt-elastic__task-dragging');
6536
+ this.$el.classList.remove(`gantt-elastic__task-dragging--${this.dragType}`);
6537
+
6538
+ // Remove date tooltip
6539
+ this.removeDateTooltip();
6540
+
6541
+ // Emit save event with updated data
6542
+ this.emitSaveEvent();
6543
+ },
6544
+ updateTaskTime(newStartTime, newEndTime) {
6545
+ // Ensure valid times
6546
+ if (newStartTime >= newEndTime) {
6547
+ return; // Don't update if invalid
6548
+ }
6549
+
6550
+ // Debug logging for epic tasks
6551
+ if (this.task.type === 'epic') {
6552
+ // console.log('Epic task drag:', {
6553
+ // dragType: this.dragType,
6554
+ // originalStart: this.originalStartTime,
6555
+ // originalEnd: this.originalEndTime,
6556
+ // newStart: newStartTime,
6557
+ // newEnd: newEndTime,
6558
+ // startChanged: newStartTime !== this.originalStartTime,
6559
+ // endChanged: newEndTime !== this.originalEndTime
6560
+ // });
6561
+ }
6562
+
6563
+ // Update task data
6564
+ this.task.startTime = newStartTime;
6565
+ this.task.endTime = newEndTime;
6566
+ this.task.duration = newEndTime - newStartTime;
6567
+
6568
+ // Debug logging
6569
+ // console.log('Updating task time:', {
6570
+ // taskId: this.task.id,
6571
+ // newStartTime,
6572
+ // newEndTime,
6573
+ // duration: this.task.duration,
6574
+ // root: !!this.root,
6575
+ // timeToPixelOffsetX: !!(this.root && this.root.timeToPixelOffsetX),
6576
+ // timePerPixel: this.root && this.root.state && this.root.state.options && this.root.state.options.times && this.root.state.options.times.timePerPixel
6577
+ // });
6578
+
6579
+ // Update task position and width using the correct method
6580
+ if (this.root && this.root.timeToPixelOffsetX) {
6581
+ this.task.x = this.root.timeToPixelOffsetX(newStartTime);
6582
+ this.task.width = this.root.timeToPixelOffsetX(newEndTime) - this.task.x;
6583
+ } else {
6584
+ // Fallback calculation if method is not available
6585
+ const timePerPixel = this.root && this.root.state && this.root.state.options && this.root.state.options.times && this.root.state.options.times.timePerPixel;
6586
+ if (timePerPixel > 0) {
6587
+ this.task.x = (newStartTime - this.root.state.options.times.firstTime) / timePerPixel;
6588
+ this.task.width = (newEndTime - newStartTime) / timePerPixel;
6589
+ } else {
6590
+ console.error('timePerPixel is not available or invalid:', timePerPixel);
6591
+ }
6592
+ }
6593
+
6594
+ // Force update
6595
+ this.$forceUpdate();
6596
+ },
6597
+ emitSaveEvent() {
6598
+ // Calculate date information
6599
+ const startDate = new Date(this.task.startTime);
6600
+ const endDate = new Date(this.task.endTime);
6601
+ const durationDays = Math.ceil(this.task.duration / (24 * 60 * 60 * 1000));
6602
+
6603
+ // Emit event to parent component with updated task data
6604
+ this.$emit('task-updated', {
6605
+ id: this.task.id,
6606
+ startTime: this.task.startTime,
6607
+ endTime: this.task.endTime,
6608
+ duration: this.task.duration,
6609
+ durationDays: durationDays,
6610
+ startDate: startDate.toISOString(),
6611
+ endDate: endDate.toISOString(),
6612
+ startDateFormatted: startDate.toLocaleDateString(),
6613
+ endDateFormatted: endDate.toLocaleDateString(),
6614
+ dragType: this.dragType,
6615
+ originalStartTime: this.originalStartTime,
6616
+ originalEndTime: this.originalEndTime,
6617
+ originalDuration: this.originalDuration
6618
+ });
6619
+
6620
+ // Log the update for debugging
6621
+ // console.log('Task drag completed:', {
6622
+ // id: this.task.id,
6623
+ // dragType: this.dragType,
6624
+ // startDate: startDate.toLocaleDateString(),
6625
+ // endDate: endDate.toLocaleDateString(),
6626
+ // duration: `${durationDays} days`,
6627
+ // startTime: this.task.startTime,
6628
+ // endTime: this.task.endTime
6629
+ // });
6630
+ },
6631
+ /**
6632
+ * Show context menu for task actions
6633
+ *
6634
+ * @param {Event} event - Right-click event
6635
+ */
6636
+ // showContextMenu(event) {
6637
+ // event.preventDefault();
6638
+ //
6639
+ // // Remove existing context menu
6640
+ // this.hideContextMenu();
6641
+ //
6642
+ // // Create context menu
6643
+ // const contextMenu = document.createElement('div');
6644
+ // contextMenu.className = 'gantt-elastic__context-menu';
6645
+ // contextMenu.style.cssText = `
6646
+ // position: fixed;
6647
+ // top: ${event.clientY}px;
6648
+ // left: ${event.clientX}px;
6649
+ // background: white;
6650
+ // border: 1px solid #e5e7eb;
6651
+ // border-radius: 6px;
6652
+ // box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
6653
+ // z-index: 1000;
6654
+ // min-width: 150px;
6655
+ // padding: 4px 0;
6656
+ // `;
6657
+ //
6658
+ // // Add menu items
6659
+ // const menuItems = [
6660
+ // { text: 'Extend to Next Date', action: () => this.extendTaskToNextDate() },
6661
+ // { text: 'Extend by 1 Day', action: () => this.extendTaskByDays(1) },
6662
+ // { text: 'Extend by 3 Days', action: () => this.extendTaskByDays(3) },
6663
+ // { text: 'Extend by 1 Week', action: () => this.extendTaskByDays(7) }
6664
+ // ];
6665
+ //
6666
+ // menuItems.forEach(item => {
6667
+ // const menuItem = document.createElement('div');
6668
+ // menuItem.className = 'gantt-elastic__context-menu-item';
6669
+ // menuItem.textContent = item.text;
6670
+ // menuItem.style.cssText = `
6671
+ // padding: 8px 16px;
6672
+ // cursor: pointer;
6673
+ // font-size: 14px;
6674
+ // color: #374151;
6675
+ // transition: background-color 0.2s;
6676
+ // `;
6677
+ //
6678
+ // menuItem.addEventListener('mouseenter', () => {
6679
+ // menuItem.style.backgroundColor = '#f3f4f6';
6680
+ // });
6681
+ //
6682
+ // menuItem.addEventListener('mouseleave', () => {
6683
+ // menuItem.style.backgroundColor = 'transparent';
6684
+ // });
6685
+ //
6686
+ // menuItem.addEventListener('click', () => {
6687
+ // item.action();
6688
+ // this.hideContextMenu();
6689
+ // });
6690
+ //
6691
+ // contextMenu.appendChild(menuItem);
6692
+ // });
6693
+ //
6694
+ // // Add to document
6695
+ // document.body.appendChild(contextMenu);
6696
+ // this.contextMenu = contextMenu;
6697
+ //
6698
+ // // Close menu when clicking outside
6699
+ // setTimeout(() => {
6700
+ // document.addEventListener('click', this.hideContextMenu);
6701
+ // }, 0);
6702
+ // },
6703
+
6704
+ /**
6705
+ * Hide context menu
6706
+ */
6707
+ // hideContextMenu() {
6708
+ // if (this.contextMenu) {
6709
+ // document.body.removeChild(this.contextMenu);
6710
+ // this.contextMenu = null;
6711
+ // document.removeEventListener('click', this.hideContextMenu);
6712
+ // }
6713
+ // },
6714
+
6715
+ /**
6716
+ * Extend task to next date (1 day)
6717
+ */
6718
+ // extendTaskToNextDate() {
6719
+ // const additionalDuration = 24 * 60 * 60 * 1000; // 1 day
6720
+ // this.task.duration += additionalDuration;
6721
+ // this.task.endTime += additionalDuration;
6722
+ //
6723
+ // // Update task position and width
6724
+ // if (this.root && this.root.timeToPixelOffsetX) {
6725
+ // this.task.width = this.root.timeToPixelOffsetX(this.task.endTime) - this.task.x;
6726
+ // } else {
6727
+ // const timePerPixel = this.root && this.root.state && this.root.state.options && this.root.state.options.times && this.root.state.options.times.timePerPixel;
6728
+ // if (timePerPixel > 0) {
6729
+ // this.task.width = (this.task.endTime - this.task.startTime) / timePerPixel;
6730
+ // }
6731
+ // }
6732
+ //
6733
+ // // Emit update event
6734
+ // this.emitSaveEvent();
6735
+ //
6736
+ // console.log(`✅ Task extended to next date:`, {
6737
+ // taskId: this.task.id,
6738
+ // newDuration: this.task.duration,
6739
+ // newEndDate: new Date(this.task.endTime).toLocaleDateString()
6740
+ // });
6741
+ // },
6742
+
6743
+ /**
6744
+ * Extend task by specific number of days
6745
+ *
6746
+ * @param {number} days - Number of days to add
6747
+ */
6748
+ // extendTaskByDays(days) {
6749
+ // const additionalDuration = days * 24 * 60 * 60 * 1000;
6750
+ // this.task.duration += additionalDuration;
6751
+ // this.task.endTime += additionalDuration;
6752
+ //
6753
+ // // Update task position and width
6754
+ // if (this.root && this.root.timeToPixelOffsetX) {
6755
+ // this.task.width = this.root.timeToPixelOffsetX(this.task.endTime) - this.task.x;
6756
+ // } else {
6757
+ // const timePerPixel = this.root && this.root.state && this.root.state.options && this.root.state.options.times && this.root.state.options.times.timePerPixel;
6758
+ // if (timePerPixel > 0) {
6759
+ // this.task.width = (this.task.endTime - this.task.startTime) / timePerPixel;
6760
+ // }
6761
+ // }
6762
+ //
6763
+ // // Emit update event
6764
+ // this.emitSaveEvent();
6765
+ //
6766
+ // console.log(`✅ Task extended by ${days} day(s):`, {
6767
+ // taskId: this.task.id,
6768
+ // daysAdded: days,
6769
+ // newDuration: this.task.duration,
6770
+ // newEndDate: new Date(this.task.endTime).toLocaleDateString()
6771
+ // });
6772
+ // },
6773
+
6774
+ /**
6775
+ * Handle keyboard shortcuts for task extension
6776
+ *
6777
+ * @param {KeyboardEvent} event - Keyboard event
6778
+ */
6779
+ handleKeyboardShortcuts(event) {
6780
+ // Only handle if task is focused and not dragging
6781
+ if (this.isDragging) return;
6782
+
6783
+ // Check for Ctrl/Cmd + E for extend to next date
6784
+ if ((event.ctrlKey || event.metaKey) && event.key === 'e') {
6785
+ event.preventDefault();
6786
+ this.extendTaskToNextDate();
6787
+ }
6788
+ // Check for Ctrl/Cmd + Shift + E for extend by 1 day
6789
+ else if ((event.ctrlKey || event.metaKey) && event.shiftKey && event.key === 'E') {
6790
+ event.preventDefault();
6791
+ this.extendTaskByDays(1);
6792
+ }
6793
+ // Check for Ctrl/Cmd + 3 for extend by 3 days
6794
+ else if ((event.ctrlKey || event.metaKey) && event.key === '3') {
6795
+ event.preventDefault();
6796
+ this.extendTaskByDays(3);
6797
+ }
6798
+ // Check for Ctrl/Cmd + 7 for extend by 1 week
6799
+ else if ((event.ctrlKey || event.metaKey) && event.key === '7') {
6800
+ event.preventDefault();
6801
+ this.extendTaskByDays(7);
6802
+ }
6803
+ },
6804
+ /**
6805
+ * Create date tooltip for end dragging
6806
+ */
6807
+ createDateTooltip() {
6808
+ this.dateTooltip = document.createElement('div');
6809
+ this.dateTooltip.className = 'gantt-elastic__date-tooltip';
6810
+ this.dateTooltip.style.cssText = `
6811
+ position: fixed;
6812
+ background: #000000;
6813
+ color: white;
6814
+ padding: 6px 12px;
6815
+ border-radius: 6px;
6816
+ font-size: 13px;
6817
+ font-family: system-ui, -apple-system, sans-serif;
6818
+ font-weight: 500;
6819
+ pointer-events: none;
6820
+ z-index: 10000;
6821
+ white-space: nowrap;
6822
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
6823
+ border: 1px solid rgba(255, 255, 255, 0.1);
6824
+ `;
6825
+ document.body.appendChild(this.dateTooltip);
6826
+
6827
+ // Initialize tooltip with current values
6828
+ if (this.dragType === 'start') {
6829
+ this.updateDateTooltip(this.originalStartTime);
6830
+ } else if (this.dragType === 'end') {
6831
+ this.updateDateTooltip(this.originalEndTime);
6832
+ } else if (this.dragType === 'move') {
6833
+ this.updateDateTooltip(this.originalStartTime);
6834
+ }
6835
+ },
6836
+ /**
6837
+ * Update date tooltip with new time and day changes
6838
+ *
6839
+ * @param {number} newTime - New time in milliseconds
6840
+ */
6841
+ updateDateTooltip(newTime) {
6842
+ if (!this.dateTooltip) return;
6843
+ const newDate = new Date(newTime);
6844
+ const formattedDate = newDate.toLocaleDateString('en-US', {
6845
+ year: 'numeric',
6846
+ month: 'short',
6847
+ day: 'numeric'
6848
+ });
6849
+
6850
+ // Calculate day changes based on drag type
6851
+ let dayChanges = '';
6852
+ if (this.dragType === 'start') {
6853
+ // For start drag, show how many days we're moving the start date
6854
+ const daysDiff = Math.round((newTime - this.originalStartTime) / (24 * 60 * 60 * 1000));
6855
+ if (daysDiff !== 0) {
6856
+ dayChanges = daysDiff > 0 ? ` (+${daysDiff} days)` : ` (${daysDiff} days)`;
6857
+ }
6858
+ } else if (this.dragType === 'end') {
6859
+ // For end drag, show how many days we're moving the end date
6860
+ const daysDiff = Math.round((newTime - this.originalEndTime) / (24 * 60 * 60 * 1000));
6861
+ if (daysDiff !== 0) {
6862
+ dayChanges = daysDiff > 0 ? ` (+${daysDiff} days)` : ` (${daysDiff} days)`;
6863
+ }
6864
+ } else if (this.dragType === 'move') {
6865
+ // For move drag, show how many days we're moving the entire task
6866
+ const daysDiff = Math.round((newTime - this.originalStartTime) / (24 * 60 * 60 * 1000));
6867
+ if (daysDiff !== 0) {
6868
+ dayChanges = daysDiff > 0 ? ` (+${daysDiff} days)` : ` (${daysDiff} days)`;
6869
+ }
6870
+ }
6871
+ this.dateTooltip.textContent = `${formattedDate}${dayChanges}`;
6872
+
6873
+ // Position tooltip based on drag type
6874
+ const rect = this.$el.getBoundingClientRect();
6875
+ if (this.dragType === 'start') {
6876
+ // Position tooltip on the left side for start drag
6877
+ this.dateTooltip.style.left = `${rect.left - this.dateTooltip.offsetWidth - 10}px`;
6878
+ this.dateTooltip.style.top = `${rect.top + rect.height / 2 - 10}px`;
6879
+ } else if (this.dragType === 'end') {
6880
+ // Position tooltip on the right side for end drag
6881
+ this.dateTooltip.style.left = `${rect.right + 10}px`;
6882
+ this.dateTooltip.style.top = `${rect.top + rect.height / 2 - 10}px`;
6883
+ } else if (this.dragType === 'move') {
6884
+ // Position tooltip on the right side for move drag
6885
+ this.dateTooltip.style.left = `${rect.right + 10}px`;
6886
+ this.dateTooltip.style.top = `${rect.top + rect.height / 2 - 10}px`;
6887
+ }
6888
+ },
6889
+ /**
6890
+ * Remove date tooltip
6891
+ */
6892
+ removeDateTooltip() {
6893
+ if (this.dateTooltip) {
6894
+ document.body.removeChild(this.dateTooltip);
6895
+ this.dateTooltip = null;
6896
+ }
6897
+ },
6898
+ /**
6899
+ * Add hover tooltips for drag handles
6900
+ */
6901
+ addHoverTooltips() {
6902
+ // Find drag handles in the current element
6903
+ const dragHandles = this.$el.querySelectorAll('.gantt-elastic__chart-row-extend-handle');
6904
+ dragHandles.forEach((handle, index) => {
6905
+ const isStartHandle = index === 0; // First handle is start, second is end
6906
+
6907
+ // Remove existing listeners to avoid duplicates
6908
+ handle.removeEventListener('mouseenter', this.handleMouseEnter);
6909
+ handle.removeEventListener('mouseleave', this.handleMouseLeave);
6910
+
6911
+ // Add new listeners
6912
+ handle.addEventListener('mouseenter', this.handleMouseEnter.bind(this));
6913
+ handle.addEventListener('mouseleave', this.handleMouseLeave.bind(this));
6914
+ });
6915
+ },
6916
+ /**
6917
+ * Handle mouse enter on drag handle
6918
+ */
6919
+ handleMouseEnter(event) {
6920
+ if (!this.isDragging) {
6921
+ this.showHoverTooltip(event, false);
6922
+ }
6923
+ },
6924
+ /**
6925
+ * Handle mouse leave on drag handle
6926
+ */
6927
+ handleMouseLeave() {
6928
+ if (!this.isDragging) {
6929
+ this.hideHoverTooltip();
6930
+ }
6931
+ },
6932
+ /**
6933
+ * Show hover tooltip with date range and duration
6934
+ */
6935
+ showHoverTooltip(event, isStartHandle) {
6936
+ this.hideHoverTooltip(); // Remove any existing tooltip
6937
+
6938
+ const startDate = new Date(this.task.startTime);
6939
+ const endDate = new Date(this.task.endTime);
6940
+ const startFormatted = startDate.toLocaleDateString('en-US', {
6941
+ year: 'numeric',
6942
+ month: 'short',
6943
+ day: 'numeric'
6944
+ });
6945
+ const endFormatted = endDate.toLocaleDateString('en-US', {
6946
+ year: 'numeric',
6947
+ month: 'short',
6948
+ day: 'numeric'
6949
+ });
6950
+
6951
+ // Calculate duration in days
6952
+ const durationMs = this.task.endTime - this.task.startTime;
6953
+ const durationDays = Math.ceil(durationMs / (24 * 60 * 60 * 1000));
6954
+ this.hoverTooltip = document.createElement('div');
6955
+ this.hoverTooltip.className = 'gantt-elastic__hover-tooltip';
6956
+ this.hoverTooltip.textContent = `${startFormatted} - ${endFormatted} (${durationDays} days)`;
6957
+ this.hoverTooltip.style.cssText = `
6958
+ position: fixed;
6959
+ background: #333333;
6960
+ color: white;
6961
+ padding: 8px 12px;
6962
+ border-radius: 6px;
6963
+ font-size: 13px;
6964
+ font-family: system-ui, -apple-system, sans-serif;
6965
+ font-weight: 500;
6966
+ pointer-events: none;
6967
+ z-index: 10001;
6968
+ white-space: nowrap;
6969
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
6970
+ border: 1px solid rgba(255, 255, 255, 0.1);
6971
+ `;
6972
+ document.body.appendChild(this.hoverTooltip);
6973
+
6974
+ // Position tooltip above the handle
6975
+ const rect = event.target.getBoundingClientRect();
6976
+ this.hoverTooltip.style.left = `${rect.left + rect.width / 2 - this.hoverTooltip.offsetWidth / 2}px`;
6977
+ this.hoverTooltip.style.top = `${rect.top - this.hoverTooltip.offsetHeight - 8}px`;
6978
+ },
6979
+ /**
6980
+ * Hide hover tooltip
6981
+ */
6982
+ hideHoverTooltip() {
6983
+ if (this.hoverTooltip) {
6984
+ document.body.removeChild(this.hoverTooltip);
6985
+ this.hoverTooltip = null;
6986
+ }
6987
+ }
6988
+ },
6989
+ mounted() {
6990
+ // Add hover tooltips when component is mounted
6991
+ this.$nextTick(() => {
6992
+ this.addHoverTooltips();
6993
+ });
6994
+ },
6995
+ beforeDestroy() {
6996
+ // Clean up event listeners
6997
+ document.removeEventListener('mousemove', this.handleDrag);
6998
+ document.removeEventListener('mouseup', this.endDrag);
6999
+ document.removeEventListener('touchmove', this.handleDrag);
7000
+ document.removeEventListener('touchend', this.endDrag);
7001
+ document.removeEventListener('click', this.hideContextMenu);
7002
+
7003
+ // Clean up context menu
7004
+ this.hideContextMenu();
7005
+
7006
+ // Clean up date tooltip
7007
+ this.removeDateTooltip();
7008
+
7009
+ // Clean up hover tooltip
7010
+ this.hideHoverTooltip();
7011
+
7012
+ // Clean up keyboard listeners
7013
+ if (this.$el) {
7014
+ // this.$el.removeEventListener('contextmenu', this.showContextMenu);
7015
+ this.$el.removeEventListener('keydown', this.handleKeyboardShortcuts);
7016
+ }
7017
+ }
7018
+ });
6274
7019
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Task.vue?vue&type=script&lang=js
6275
7020
 
6276
7021
 
6277
7022
 
6278
7023
 
7024
+
6279
7025
  /* harmony default export */ var Taskvue_type_script_lang_js = ({
6280
7026
  name: 'Task',
6281
7027
  components: {
@@ -6285,7 +7031,7 @@ var ProgressBar_component = normalizeComponent(
6285
7031
  },
6286
7032
  inject: ['root'],
6287
7033
  props: ['task'],
6288
- mixins: [Task_mixin],
7034
+ mixins: [Task_mixin, Draggable_mixin],
6289
7035
  data() {
6290
7036
  return {};
6291
7037
  },
@@ -6306,6 +7052,15 @@ var ProgressBar_component = normalizeComponent(
6306
7052
  getPoints() {
6307
7053
  const task = this.task;
6308
7054
  return `0,0 ${task.width},0 ${task.width},${task.height} 0,${task.height}`;
7055
+ },
7056
+ /**
7057
+ * Get points adjusted for viewBox
7058
+ *
7059
+ * @returns {string}
7060
+ */
7061
+ getPointsAdjusted() {
7062
+ const task = this.task;
7063
+ return `8,0 ${task.width + 8},0 ${task.width + 8},${task.height} 8,${task.height}`;
6309
7064
  }
6310
7065
  }
6311
7066
  });
@@ -6321,8 +7076,8 @@ var ProgressBar_component = normalizeComponent(
6321
7076
  ;
6322
7077
  var Task_component = normalizeComponent(
6323
7078
  Row_Taskvue_type_script_lang_js,
6324
- Taskvue_type_template_id_208a9baa_render,
6325
- Taskvue_type_template_id_208a9baa_staticRenderFns,
7079
+ Taskvue_type_template_id_23849415_render,
7080
+ Taskvue_type_template_id_23849415_staticRenderFns,
6326
7081
  false,
6327
7082
  null,
6328
7083
  null,
@@ -6331,8 +7086,8 @@ var Task_component = normalizeComponent(
6331
7086
  )
6332
7087
 
6333
7088
  /* harmony default export */ var Task = (Task_component.exports);
6334
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Milestone.vue?vue&type=template&id=edd49e02
6335
- var Milestonevue_type_template_id_edd49e02_render = function render() {
7089
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Milestone.vue?vue&type=template&id=c9bfeb4a
7090
+ var Milestonevue_type_template_id_c9bfeb4a_render = function render() {
6336
7091
  var _vm = this,
6337
7092
  _c = _vm._self._c;
6338
7093
  return _c('g', {
@@ -6369,11 +7124,11 @@ var Milestonevue_type_template_id_edd49e02_render = function render() {
6369
7124
  ..._vm.task.style['chart-row-bar']
6370
7125
  },
6371
7126
  attrs: {
6372
- "x": _vm.task.x,
7127
+ "x": _vm.task.x - 8,
6373
7128
  "y": _vm.task.y,
6374
- "width": _vm.task.width,
7129
+ "width": _vm.task.width + 16,
6375
7130
  "height": _vm.task.height,
6376
- "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
7131
+ "viewBox": `-8 0 ${_vm.task.width + 16} ${_vm.task.height}`,
6377
7132
  "xmlns": "http://www.w3.org/2000/svg"
6378
7133
  },
6379
7134
  on: {
@@ -6428,26 +7183,83 @@ var Milestonevue_type_template_id_edd49e02_render = function render() {
6428
7183
  ..._vm.task.style['chart-row-bar-polygon']
6429
7184
  },
6430
7185
  attrs: {
6431
- "points": _vm.getPoints
7186
+ "points": _vm.getPointsAdjusted
7187
+ },
7188
+ on: {
7189
+ "mousedown": function ($event) {
7190
+ return _vm.startDrag($event, 'move');
7191
+ },
7192
+ "touchstart": function ($event) {
7193
+ return _vm.startDrag($event, 'move');
7194
+ }
6432
7195
  }
6433
7196
  }), _c('progress-bar', {
6434
7197
  attrs: {
6435
7198
  "task": _vm.task,
6436
7199
  "clip-path": 'url(#' + _vm.clipPathId + ')'
6437
7200
  }
7201
+ }), _c('rect', {
7202
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
7203
+ staticStyle: {
7204
+ "pointer-events": "all",
7205
+ "z-index": "50",
7206
+ "cursor": "ew-resize !important"
7207
+ },
7208
+ style: _vm.root.style['chart-row-extend-handle'],
7209
+ attrs: {
7210
+ "x": "0",
7211
+ "y": "0",
7212
+ "width": 12,
7213
+ "height": _vm.task.height
7214
+ },
7215
+ on: {
7216
+ "mousedown": function ($event) {
7217
+ $event.stopPropagation();
7218
+ return _vm.startDrag($event, 'start');
7219
+ },
7220
+ "touchstart": function ($event) {
7221
+ $event.stopPropagation();
7222
+ return _vm.startDrag($event, 'start');
7223
+ }
7224
+ }
7225
+ }), _c('rect', {
7226
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
7227
+ staticStyle: {
7228
+ "pointer-events": "all",
7229
+ "z-index": "50",
7230
+ "cursor": "ew-resize !important"
7231
+ },
7232
+ style: _vm.root.style['chart-row-extend-handle'],
7233
+ attrs: {
7234
+ "x": _vm.task.width - 12,
7235
+ "y": "0",
7236
+ "width": 12,
7237
+ "height": _vm.task.height
7238
+ },
7239
+ on: {
7240
+ "mousedown": function ($event) {
7241
+ $event.stopPropagation();
7242
+ return _vm.startDrag($event, 'end');
7243
+ },
7244
+ "touchstart": function ($event) {
7245
+ $event.stopPropagation();
7246
+ return _vm.startDrag($event, 'end');
7247
+ }
7248
+ }
6438
7249
  })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
6439
7250
  attrs: {
6440
7251
  "task": _vm.task
6441
7252
  }
6442
7253
  }) : _vm._e()], 1);
6443
7254
  };
6444
- var Milestonevue_type_template_id_edd49e02_staticRenderFns = [];
7255
+ var Milestonevue_type_template_id_c9bfeb4a_staticRenderFns = [];
6445
7256
 
6446
7257
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Milestone.vue?vue&type=script&lang=js
6447
7258
 
6448
7259
 
6449
7260
 
6450
7261
 
7262
+
6451
7263
  /* harmony default export */ var Milestonevue_type_script_lang_js = ({
6452
7264
  name: 'Milestone',
6453
7265
  components: {
@@ -6457,7 +7269,7 @@ var Milestonevue_type_template_id_edd49e02_staticRenderFns = [];
6457
7269
  },
6458
7270
  inject: ['root'],
6459
7271
  props: ['task'],
6460
- mixins: [Task_mixin],
7272
+ mixins: [Task_mixin, Draggable_mixin],
6461
7273
  data() {
6462
7274
  return {};
6463
7275
  },
@@ -6488,6 +7300,25 @@ var Milestonevue_type_template_id_edd49e02_staticRenderFns = [];
6488
7300
  ${task.width},${fifty}
6489
7301
  ${task.width - offset},${task.height}
6490
7302
  ${offset},${task.height}`;
7303
+ },
7304
+ /**
7305
+ * Get points adjusted for viewBox
7306
+ *
7307
+ * @returns {string}
7308
+ */
7309
+ getPointsAdjusted() {
7310
+ const task = this.task;
7311
+ const fifty = task.height / 2;
7312
+ let offset = fifty;
7313
+ if (task.width / 2 - offset < 0) {
7314
+ offset = task.width / 2;
7315
+ }
7316
+ return `${8},${fifty}
7317
+ ${8 + offset},0
7318
+ ${8 + task.width - offset},0
7319
+ ${8 + task.width},${fifty}
7320
+ ${8 + task.width - offset},${task.height}
7321
+ ${8 + offset},${task.height}`;
6491
7322
  }
6492
7323
  }
6493
7324
  });
@@ -6503,8 +7334,8 @@ var Milestonevue_type_template_id_edd49e02_staticRenderFns = [];
6503
7334
  ;
6504
7335
  var Milestone_component = normalizeComponent(
6505
7336
  Row_Milestonevue_type_script_lang_js,
6506
- Milestonevue_type_template_id_edd49e02_render,
6507
- Milestonevue_type_template_id_edd49e02_staticRenderFns,
7337
+ Milestonevue_type_template_id_c9bfeb4a_render,
7338
+ Milestonevue_type_template_id_c9bfeb4a_staticRenderFns,
6508
7339
  false,
6509
7340
  null,
6510
7341
  null,
@@ -6513,8 +7344,8 @@ var Milestone_component = normalizeComponent(
6513
7344
  )
6514
7345
 
6515
7346
  /* harmony default export */ var Milestone = (Milestone_component.exports);
6516
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Project.vue?vue&type=template&id=760bf767
6517
- var Projectvue_type_template_id_760bf767_render = function render() {
7347
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Project.vue?vue&type=template&id=72239142
7348
+ var Projectvue_type_template_id_72239142_render = function render() {
6518
7349
  var _vm = this,
6519
7350
  _c = _vm._self._c;
6520
7351
  return _c('g', {
@@ -6551,11 +7382,11 @@ var Projectvue_type_template_id_760bf767_render = function render() {
6551
7382
  ..._vm.task.style['chart-row-bar']
6552
7383
  },
6553
7384
  attrs: {
6554
- "x": _vm.task.x,
7385
+ "x": _vm.task.x - 8,
6555
7386
  "y": _vm.task.y,
6556
- "width": _vm.task.width,
7387
+ "width": _vm.task.width + 16,
6557
7388
  "height": _vm.task.height,
6558
- "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
7389
+ "viewBox": `-8 0 ${_vm.task.width + 16} ${_vm.task.height}`,
6559
7390
  "xmlns": "http://www.w3.org/2000/svg"
6560
7391
  },
6561
7392
  on: {
@@ -6610,26 +7441,83 @@ var Projectvue_type_template_id_760bf767_render = function render() {
6610
7441
  ..._vm.task.style['chart-row-bar-polygon']
6611
7442
  },
6612
7443
  attrs: {
6613
- "d": _vm.getPoints
7444
+ "d": _vm.getPointsAdjusted
7445
+ },
7446
+ on: {
7447
+ "mousedown": function ($event) {
7448
+ return _vm.startDrag($event, 'move');
7449
+ },
7450
+ "touchstart": function ($event) {
7451
+ return _vm.startDrag($event, 'move');
7452
+ }
6614
7453
  }
6615
7454
  }), _c('progress-bar', {
6616
7455
  attrs: {
6617
7456
  "task": _vm.task,
6618
7457
  "clip-path": 'url(#' + _vm.clipPathId + ')'
6619
7458
  }
7459
+ }), _c('rect', {
7460
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
7461
+ staticStyle: {
7462
+ "pointer-events": "all",
7463
+ "z-index": "50",
7464
+ "cursor": "ew-resize !important"
7465
+ },
7466
+ style: _vm.root.style['chart-row-extend-handle'],
7467
+ attrs: {
7468
+ "x": "0",
7469
+ "y": "0",
7470
+ "width": 12,
7471
+ "height": _vm.task.height
7472
+ },
7473
+ on: {
7474
+ "mousedown": function ($event) {
7475
+ $event.stopPropagation();
7476
+ return _vm.startDrag($event, 'start');
7477
+ },
7478
+ "touchstart": function ($event) {
7479
+ $event.stopPropagation();
7480
+ return _vm.startDrag($event, 'start');
7481
+ }
7482
+ }
7483
+ }), _c('rect', {
7484
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
7485
+ staticStyle: {
7486
+ "pointer-events": "all",
7487
+ "z-index": "50",
7488
+ "cursor": "ew-resize !important"
7489
+ },
7490
+ style: _vm.root.style['chart-row-extend-handle'],
7491
+ attrs: {
7492
+ "x": _vm.task.width - 12,
7493
+ "y": "0",
7494
+ "width": 12,
7495
+ "height": _vm.task.height
7496
+ },
7497
+ on: {
7498
+ "mousedown": function ($event) {
7499
+ $event.stopPropagation();
7500
+ return _vm.startDrag($event, 'end');
7501
+ },
7502
+ "touchstart": function ($event) {
7503
+ $event.stopPropagation();
7504
+ return _vm.startDrag($event, 'end');
7505
+ }
7506
+ }
6620
7507
  })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
6621
7508
  attrs: {
6622
7509
  "task": _vm.task
6623
7510
  }
6624
7511
  }) : _vm._e()], 1);
6625
7512
  };
6626
- var Projectvue_type_template_id_760bf767_staticRenderFns = [];
7513
+ var Projectvue_type_template_id_72239142_staticRenderFns = [];
6627
7514
 
6628
7515
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Project.vue?vue&type=script&lang=js
6629
7516
 
6630
7517
 
6631
7518
 
6632
7519
 
7520
+
6633
7521
  /* harmony default export */ var Projectvue_type_script_lang_js = ({
6634
7522
  name: 'Project',
6635
7523
  components: {
@@ -6639,7 +7527,7 @@ var Projectvue_type_template_id_760bf767_staticRenderFns = [];
6639
7527
  },
6640
7528
  inject: ['root'],
6641
7529
  props: ['task'],
6642
- mixins: [Task_mixin],
7530
+ mixins: [Task_mixin, Draggable_mixin],
6643
7531
  data() {
6644
7532
  return {};
6645
7533
  },
@@ -6675,6 +7563,29 @@ var Projectvue_type_template_id_760bf767_staticRenderFns = [];
6675
7563
  Z
6676
7564
  `;
6677
7565
  },
7566
+ /**
7567
+ * Get points adjusted for viewBox
7568
+ *
7569
+ * @returns {string}
7570
+ */
7571
+ getPointsAdjusted() {
7572
+ const task = this.task;
7573
+ const bottom = task.height - task.height / 4;
7574
+ const corner = task.height / 6;
7575
+ const smallCorner = task.height / 8;
7576
+ return `M ${8 + smallCorner},0
7577
+ L ${8 + task.width - smallCorner} 0
7578
+ L ${8 + task.width} ${smallCorner}
7579
+ L ${8 + task.width} ${bottom}
7580
+ L ${8 + task.width - corner} ${task.height}
7581
+ L ${8 + task.width - corner * 2} ${bottom}
7582
+ L ${8 + corner * 2} ${bottom}
7583
+ L ${8 + corner} ${task.height}
7584
+ L ${8} ${bottom}
7585
+ L ${8} ${smallCorner}
7586
+ Z
7587
+ `;
7588
+ },
6678
7589
  /**
6679
7590
  * Should we display expander?
6680
7591
  *
@@ -6699,8 +7610,8 @@ var Projectvue_type_template_id_760bf767_staticRenderFns = [];
6699
7610
  ;
6700
7611
  var Project_component = normalizeComponent(
6701
7612
  Row_Projectvue_type_script_lang_js,
6702
- Projectvue_type_template_id_760bf767_render,
6703
- Projectvue_type_template_id_760bf767_staticRenderFns,
7613
+ Projectvue_type_template_id_72239142_render,
7614
+ Projectvue_type_template_id_72239142_staticRenderFns,
6704
7615
  false,
6705
7616
  null,
6706
7617
  null,
@@ -6709,8 +7620,8 @@ var Project_component = normalizeComponent(
6709
7620
  )
6710
7621
 
6711
7622
  /* harmony default export */ var Project = (Project_component.exports);
6712
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Epic.vue?vue&type=template&id=a2e89cd8
6713
- var Epicvue_type_template_id_a2e89cd8_render = function render() {
7623
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Epic.vue?vue&type=template&id=80ad2e9c
7624
+ var Epicvue_type_template_id_80ad2e9c_render = function render() {
6714
7625
  var _vm = this,
6715
7626
  _c = _vm._self._c;
6716
7627
  return _c('g', {
@@ -6747,11 +7658,11 @@ var Epicvue_type_template_id_a2e89cd8_render = function render() {
6747
7658
  ..._vm.task.style['chart-row-bar']
6748
7659
  },
6749
7660
  attrs: {
6750
- "x": _vm.task.x,
7661
+ "x": _vm.task.x - 8,
6751
7662
  "y": _vm.task.y,
6752
- "width": _vm.task.width,
7663
+ "width": _vm.task.width + 16,
6753
7664
  "height": _vm.task.height,
6754
- "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
7665
+ "viewBox": `-8 0 ${_vm.task.width + 16} ${_vm.task.height}`,
6755
7666
  "xmlns": "http://www.w3.org/2000/svg"
6756
7667
  },
6757
7668
  on: {
@@ -6803,29 +7714,88 @@ var Epicvue_type_template_id_a2e89cd8_render = function render() {
6803
7714
  ..._vm.root.style['chart-row-bar-polygon'],
6804
7715
  ..._vm.root.style['chart-row-epic-polygon'],
6805
7716
  ..._vm.task.style['base'],
6806
- ..._vm.task.style['chart-row-bar-polygon']
7717
+ ..._vm.task.style['chart-row-bar-polygon'],
7718
+ 'pointer-events': 'all',
7719
+ 'z-index': '10'
6807
7720
  },
6808
7721
  attrs: {
6809
- "d": _vm.getPoints
7722
+ "d": _vm.getPointsAdjusted
7723
+ },
7724
+ on: {
7725
+ "mousedown": function ($event) {
7726
+ return _vm.startDrag($event, 'move');
7727
+ },
7728
+ "touchstart": function ($event) {
7729
+ return _vm.startDrag($event, 'move');
7730
+ }
6810
7731
  }
6811
- }), _c('progress-bar', {
7732
+ }), _vm.task.progress > 0 ? _c('progress-bar', {
6812
7733
  attrs: {
6813
7734
  "task": _vm.task,
6814
7735
  "clip-path": 'url(#' + _vm.clipPathId + ')'
6815
7736
  }
7737
+ }) : _vm._e(), _c('rect', {
7738
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
7739
+ staticStyle: {
7740
+ "pointer-events": "all",
7741
+ "z-index": "50",
7742
+ "cursor": "ew-resize !important"
7743
+ },
7744
+ style: _vm.root.style['chart-row-extend-handle'],
7745
+ attrs: {
7746
+ "x": "0",
7747
+ "y": "0",
7748
+ "width": 12,
7749
+ "height": _vm.task.height
7750
+ },
7751
+ on: {
7752
+ "mousedown": function ($event) {
7753
+ $event.stopPropagation();
7754
+ return _vm.startDrag($event, 'start');
7755
+ },
7756
+ "touchstart": function ($event) {
7757
+ $event.stopPropagation();
7758
+ return _vm.startDrag($event, 'start');
7759
+ }
7760
+ }
7761
+ }), _c('rect', {
7762
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
7763
+ staticStyle: {
7764
+ "pointer-events": "all",
7765
+ "z-index": "50",
7766
+ "cursor": "ew-resize !important"
7767
+ },
7768
+ style: _vm.root.style['chart-row-extend-handle'],
7769
+ attrs: {
7770
+ "x": _vm.task.width - 12,
7771
+ "y": "0",
7772
+ "width": 12,
7773
+ "height": _vm.task.height
7774
+ },
7775
+ on: {
7776
+ "mousedown": function ($event) {
7777
+ $event.stopPropagation();
7778
+ return _vm.startDrag($event, 'end');
7779
+ },
7780
+ "touchstart": function ($event) {
7781
+ $event.stopPropagation();
7782
+ return _vm.startDrag($event, 'end');
7783
+ }
7784
+ }
6816
7785
  })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
6817
7786
  attrs: {
6818
7787
  "task": _vm.task
6819
7788
  }
6820
7789
  }) : _vm._e()], 1);
6821
7790
  };
6822
- var Epicvue_type_template_id_a2e89cd8_staticRenderFns = [];
7791
+ var Epicvue_type_template_id_80ad2e9c_staticRenderFns = [];
6823
7792
 
6824
7793
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Epic.vue?vue&type=script&lang=js
6825
7794
 
6826
7795
 
6827
7796
 
6828
7797
 
7798
+
6829
7799
  /* harmony default export */ var Epicvue_type_script_lang_js = ({
6830
7800
  name: 'Epic',
6831
7801
  components: {
@@ -6835,7 +7805,7 @@ var Epicvue_type_template_id_a2e89cd8_staticRenderFns = [];
6835
7805
  },
6836
7806
  inject: ['root'],
6837
7807
  props: ['task'],
6838
- mixins: [Task_mixin],
7808
+ mixins: [Task_mixin, Draggable_mixin],
6839
7809
  data() {
6840
7810
  return {};
6841
7811
  },
@@ -6871,6 +7841,29 @@ var Epicvue_type_template_id_a2e89cd8_staticRenderFns = [];
6871
7841
  Z
6872
7842
  `;
6873
7843
  },
7844
+ /**
7845
+ * Get points adjusted for viewBox
7846
+ *
7847
+ * @returns {string}
7848
+ */
7849
+ getPointsAdjusted() {
7850
+ const task = this.task;
7851
+ const bottom = task.height - task.height / 4;
7852
+ const corner = task.height / 6;
7853
+ const smallCorner = task.height / 8;
7854
+ return `M ${8 + smallCorner},0
7855
+ L ${8 + task.width - smallCorner} 0
7856
+ L ${8 + task.width} ${smallCorner}
7857
+ L ${8 + task.width} ${bottom}
7858
+ L ${8 + task.width - corner} ${task.height}
7859
+ L ${8 + task.width - corner * 2} ${bottom}
7860
+ L ${8 + corner * 2} ${bottom}
7861
+ L ${8 + corner} ${task.height}
7862
+ L ${8} ${bottom}
7863
+ L ${8} ${smallCorner}
7864
+ Z
7865
+ `;
7866
+ },
6874
7867
  /**
6875
7868
  * Should we display expander?
6876
7869
  *
@@ -6895,8 +7888,8 @@ var Epicvue_type_template_id_a2e89cd8_staticRenderFns = [];
6895
7888
  ;
6896
7889
  var Epic_component = normalizeComponent(
6897
7890
  Row_Epicvue_type_script_lang_js,
6898
- Epicvue_type_template_id_a2e89cd8_render,
6899
- Epicvue_type_template_id_a2e89cd8_staticRenderFns,
7891
+ Epicvue_type_template_id_80ad2e9c_render,
7892
+ Epicvue_type_template_id_80ad2e9c_staticRenderFns,
6900
7893
  false,
6901
7894
  null,
6902
7895
  null,
@@ -6905,8 +7898,8 @@ var Epic_component = normalizeComponent(
6905
7898
  )
6906
7899
 
6907
7900
  /* harmony default export */ var Epic = (Epic_component.exports);
6908
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Subtask.vue?vue&type=template&id=86599310
6909
- var Subtaskvue_type_template_id_86599310_render = function render() {
7901
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Subtask.vue?vue&type=template&id=52219a35
7902
+ var Subtaskvue_type_template_id_52219a35_render = function render() {
6910
7903
  var _vm = this,
6911
7904
  _c = _vm._self._c;
6912
7905
  return _c('g', {
@@ -6943,11 +7936,11 @@ var Subtaskvue_type_template_id_86599310_render = function render() {
6943
7936
  ..._vm.task.style['chart-row-bar']
6944
7937
  },
6945
7938
  attrs: {
6946
- "x": _vm.task.x,
7939
+ "x": _vm.task.x - 8,
6947
7940
  "y": _vm.task.y,
6948
- "width": _vm.task.width,
7941
+ "width": _vm.task.width + 16,
6949
7942
  "height": _vm.task.height,
6950
- "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
7943
+ "viewBox": `-8 0 ${_vm.task.width + 16} ${_vm.task.height}`,
6951
7944
  "xmlns": "http://www.w3.org/2000/svg"
6952
7945
  },
6953
7946
  on: {
@@ -7002,26 +7995,83 @@ var Subtaskvue_type_template_id_86599310_render = function render() {
7002
7995
  ..._vm.task.style['chart-row-bar-polygon']
7003
7996
  },
7004
7997
  attrs: {
7005
- "points": _vm.getPoints
7998
+ "points": _vm.getPointsAdjusted
7999
+ },
8000
+ on: {
8001
+ "mousedown": function ($event) {
8002
+ return _vm.startDrag($event, 'move');
8003
+ },
8004
+ "touchstart": function ($event) {
8005
+ return _vm.startDrag($event, 'move');
8006
+ }
7006
8007
  }
7007
8008
  }), _c('progress-bar', {
7008
8009
  attrs: {
7009
8010
  "task": _vm.task,
7010
8011
  "clip-path": 'url(#' + _vm.clipPathId + ')'
7011
8012
  }
8013
+ }), _c('rect', {
8014
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
8015
+ staticStyle: {
8016
+ "pointer-events": "all",
8017
+ "z-index": "50",
8018
+ "cursor": "ew-resize !important"
8019
+ },
8020
+ style: _vm.root.style['chart-row-extend-handle'],
8021
+ attrs: {
8022
+ "x": "0",
8023
+ "y": "0",
8024
+ "width": 12,
8025
+ "height": _vm.task.height
8026
+ },
8027
+ on: {
8028
+ "mousedown": function ($event) {
8029
+ $event.stopPropagation();
8030
+ return _vm.startDrag($event, 'start');
8031
+ },
8032
+ "touchstart": function ($event) {
8033
+ $event.stopPropagation();
8034
+ return _vm.startDrag($event, 'start');
8035
+ }
8036
+ }
8037
+ }), _c('rect', {
8038
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
8039
+ staticStyle: {
8040
+ "pointer-events": "all",
8041
+ "z-index": "50",
8042
+ "cursor": "ew-resize !important"
8043
+ },
8044
+ style: _vm.root.style['chart-row-extend-handle'],
8045
+ attrs: {
8046
+ "x": _vm.task.width - 12,
8047
+ "y": "0",
8048
+ "width": 12,
8049
+ "height": _vm.task.height
8050
+ },
8051
+ on: {
8052
+ "mousedown": function ($event) {
8053
+ $event.stopPropagation();
8054
+ return _vm.startDrag($event, 'end');
8055
+ },
8056
+ "touchstart": function ($event) {
8057
+ $event.stopPropagation();
8058
+ return _vm.startDrag($event, 'end');
8059
+ }
8060
+ }
7012
8061
  })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
7013
8062
  attrs: {
7014
8063
  "task": _vm.task
7015
8064
  }
7016
8065
  }) : _vm._e()], 1);
7017
8066
  };
7018
- var Subtaskvue_type_template_id_86599310_staticRenderFns = [];
8067
+ var Subtaskvue_type_template_id_52219a35_staticRenderFns = [];
7019
8068
 
7020
8069
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Subtask.vue?vue&type=script&lang=js
7021
8070
 
7022
8071
 
7023
8072
 
7024
8073
 
8074
+
7025
8075
  /* harmony default export */ var Subtaskvue_type_script_lang_js = ({
7026
8076
  name: 'Subtask',
7027
8077
  components: {
@@ -7031,7 +8081,7 @@ var Subtaskvue_type_template_id_86599310_staticRenderFns = [];
7031
8081
  },
7032
8082
  inject: ['root'],
7033
8083
  props: ['task'],
7034
- mixins: [Task_mixin],
8084
+ mixins: [Task_mixin, Draggable_mixin],
7035
8085
  data() {
7036
8086
  return {};
7037
8087
  },
@@ -7053,6 +8103,15 @@ var Subtaskvue_type_template_id_86599310_staticRenderFns = [];
7053
8103
  const task = this.task;
7054
8104
  return `0,0 ${task.width},0 ${task.width},${task.height} 0,${task.height}`;
7055
8105
  },
8106
+ /**
8107
+ * Get points adjusted for viewBox
8108
+ *
8109
+ * @returns {string}
8110
+ */
8111
+ getPointsAdjusted() {
8112
+ const task = this.task;
8113
+ return `8,0 ${task.width + 8},0 ${task.width + 8},${task.height} 8,${task.height}`;
8114
+ },
7056
8115
  /**
7057
8116
  * Should we display expander?
7058
8117
  *
@@ -7077,8 +8136,8 @@ var Subtaskvue_type_template_id_86599310_staticRenderFns = [];
7077
8136
  ;
7078
8137
  var Subtask_component = normalizeComponent(
7079
8138
  Row_Subtaskvue_type_script_lang_js,
7080
- Subtaskvue_type_template_id_86599310_render,
7081
- Subtaskvue_type_template_id_86599310_staticRenderFns,
8139
+ Subtaskvue_type_template_id_52219a35_render,
8140
+ Subtaskvue_type_template_id_52219a35_staticRenderFns,
7082
8141
  false,
7083
8142
  null,
7084
8143
  null,
@@ -7087,8 +8146,8 @@ var Subtask_component = normalizeComponent(
7087
8146
  )
7088
8147
 
7089
8148
  /* harmony default export */ var Subtask = (Subtask_component.exports);
7090
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Story.vue?vue&type=template&id=1f59b61a
7091
- var Storyvue_type_template_id_1f59b61a_render = function render() {
8149
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Story.vue?vue&type=template&id=5d688d0c
8150
+ var Storyvue_type_template_id_5d688d0c_render = function render() {
7092
8151
  var _vm = this,
7093
8152
  _c = _vm._self._c;
7094
8153
  return _c('g', {
@@ -7125,11 +8184,11 @@ var Storyvue_type_template_id_1f59b61a_render = function render() {
7125
8184
  ..._vm.task.style['chart-row-bar']
7126
8185
  },
7127
8186
  attrs: {
7128
- "x": _vm.task.x,
8187
+ "x": _vm.task.x - 8,
7129
8188
  "y": _vm.task.y,
7130
- "width": _vm.task.width,
8189
+ "width": _vm.task.width + 16,
7131
8190
  "height": _vm.task.height,
7132
- "viewBox": `0 0 ${_vm.task.width} ${_vm.task.height}`,
8191
+ "viewBox": `-8 0 ${_vm.task.width + 16} ${_vm.task.height}`,
7133
8192
  "xmlns": "http://www.w3.org/2000/svg"
7134
8193
  },
7135
8194
  on: {
@@ -7184,26 +8243,83 @@ var Storyvue_type_template_id_1f59b61a_render = function render() {
7184
8243
  ..._vm.task.style['chart-row-bar-polygon']
7185
8244
  },
7186
8245
  attrs: {
7187
- "d": _vm.getPoints
8246
+ "d": _vm.getPointsAdjusted
8247
+ },
8248
+ on: {
8249
+ "mousedown": function ($event) {
8250
+ return _vm.startDrag($event, 'move');
8251
+ },
8252
+ "touchstart": function ($event) {
8253
+ return _vm.startDrag($event, 'move');
8254
+ }
7188
8255
  }
7189
8256
  }), _c('progress-bar', {
7190
8257
  attrs: {
7191
8258
  "task": _vm.task,
7192
8259
  "clip-path": 'url(#' + _vm.clipPathId + ')'
7193
8260
  }
8261
+ }), _c('rect', {
8262
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
8263
+ staticStyle: {
8264
+ "pointer-events": "all",
8265
+ "z-index": "50",
8266
+ "cursor": "ew-resize !important"
8267
+ },
8268
+ style: _vm.root.style['chart-row-extend-handle'],
8269
+ attrs: {
8270
+ "x": "0",
8271
+ "y": "0",
8272
+ "width": 12,
8273
+ "height": _vm.task.height
8274
+ },
8275
+ on: {
8276
+ "mousedown": function ($event) {
8277
+ $event.stopPropagation();
8278
+ return _vm.startDrag($event, 'start');
8279
+ },
8280
+ "touchstart": function ($event) {
8281
+ $event.stopPropagation();
8282
+ return _vm.startDrag($event, 'start');
8283
+ }
8284
+ }
8285
+ }), _c('rect', {
8286
+ staticClass: "gantt-elastic__chart-row-extend-handle gantt-elastic__drag-handle",
8287
+ staticStyle: {
8288
+ "pointer-events": "all",
8289
+ "z-index": "50",
8290
+ "cursor": "ew-resize !important"
8291
+ },
8292
+ style: _vm.root.style['chart-row-extend-handle'],
8293
+ attrs: {
8294
+ "x": _vm.task.width - 12,
8295
+ "y": "0",
8296
+ "width": 12,
8297
+ "height": _vm.task.height
8298
+ },
8299
+ on: {
8300
+ "mousedown": function ($event) {
8301
+ $event.stopPropagation();
8302
+ return _vm.startDrag($event, 'end');
8303
+ },
8304
+ "touchstart": function ($event) {
8305
+ $event.stopPropagation();
8306
+ return _vm.startDrag($event, 'end');
8307
+ }
8308
+ }
7194
8309
  })], 1), _vm.root.state.options.chart.text.display ? _c('chart-text', {
7195
8310
  attrs: {
7196
8311
  "task": _vm.task
7197
8312
  }
7198
8313
  }) : _vm._e()], 1);
7199
8314
  };
7200
- var Storyvue_type_template_id_1f59b61a_staticRenderFns = [];
8315
+ var Storyvue_type_template_id_5d688d0c_staticRenderFns = [];
7201
8316
 
7202
8317
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/Chart/Row/Story.vue?vue&type=script&lang=js
7203
8318
 
7204
8319
 
7205
8320
 
7206
8321
 
8322
+
7207
8323
  /* harmony default export */ var Storyvue_type_script_lang_js = ({
7208
8324
  name: 'Story',
7209
8325
  components: {
@@ -7213,7 +8329,7 @@ var Storyvue_type_template_id_1f59b61a_staticRenderFns = [];
7213
8329
  },
7214
8330
  inject: ['root'],
7215
8331
  props: ['task'],
7216
- mixins: [Task_mixin],
8332
+ mixins: [Task_mixin, Draggable_mixin],
7217
8333
  data() {
7218
8334
  return {};
7219
8335
  },
@@ -7245,6 +8361,25 @@ var Storyvue_type_template_id_1f59b61a_staticRenderFns = [];
7245
8361
  Q 0 0 ${corner} 0
7246
8362
  Z`;
7247
8363
  },
8364
+ /**
8365
+ * Get points adjusted for viewBox
8366
+ *
8367
+ * @returns {string}
8368
+ */
8369
+ getPointsAdjusted() {
8370
+ const task = this.task;
8371
+ const corner = Math.min(task.height / 4, 8); // Rounded corners
8372
+ return `M ${8 + corner},0
8373
+ L ${8 + task.width - corner} 0
8374
+ Q ${8 + task.width} 0 ${8 + task.width} ${corner}
8375
+ L ${8 + task.width} ${task.height - corner}
8376
+ Q ${8 + task.width} ${task.height} ${8 + task.width - corner} ${task.height}
8377
+ L ${8 + corner} ${task.height}
8378
+ Q ${8} ${task.height} ${8} ${task.height - corner}
8379
+ L ${8} ${corner}
8380
+ Q ${8} 0 ${8 + corner} 0
8381
+ Z`;
8382
+ },
7248
8383
  /**
7249
8384
  * Should we display expander?
7250
8385
  *
@@ -7269,8 +8404,8 @@ var Storyvue_type_template_id_1f59b61a_staticRenderFns = [];
7269
8404
  ;
7270
8405
  var Story_component = normalizeComponent(
7271
8406
  Row_Storyvue_type_script_lang_js,
7272
- Storyvue_type_template_id_1f59b61a_render,
7273
- Storyvue_type_template_id_1f59b61a_staticRenderFns,
8407
+ Storyvue_type_template_id_5d688d0c_render,
8408
+ Storyvue_type_template_id_5d688d0c_staticRenderFns,
7274
8409
  false,
7275
8410
  null,
7276
8411
  null,
@@ -7320,6 +8455,43 @@ var Story_component = normalizeComponent(
7320
8455
  this.root.state.refs.chartGraph = this.$refs.chartGraph;
7321
8456
  this.root.state.refs.chartGraphSvg = this.$refs.chartGraphSvg;
7322
8457
  },
8458
+ methods: {
8459
+ /**
8460
+ * Handle task updated event
8461
+ *
8462
+ * @param {Object} updatedTask - Updated task data
8463
+ */
8464
+ handleTaskUpdated(updatedTask) {
8465
+ // Emit event to parent component
8466
+ console.log("task-updated --Chart");
8467
+ this.$emit('task-updated', updatedTask);
8468
+
8469
+ // Update the task in the root state
8470
+ const taskIndex = this.root.state.tasks.findIndex(task => task.id === updatedTask.id);
8471
+ if (taskIndex !== -1) {
8472
+ // Update task data
8473
+ this.root.state.tasks[taskIndex].startTime = updatedTask.startTime;
8474
+ this.root.state.tasks[taskIndex].endTime = updatedTask.endTime;
8475
+ this.root.state.tasks[taskIndex].duration = updatedTask.duration;
8476
+
8477
+ // Update task position and width
8478
+ if (this.root && this.root.timeToPixelOffsetX) {
8479
+ this.root.state.tasks[taskIndex].x = this.root.timeToPixelOffsetX(updatedTask.startTime);
8480
+ this.root.state.tasks[taskIndex].width = this.root.timeToPixelOffsetX(updatedTask.endTime) - this.root.state.tasks[taskIndex].x;
8481
+ } else {
8482
+ // Fallback calculation if method is not available
8483
+ const timePerPixel = this.root.state.options.times.timePerPixel;
8484
+ if (timePerPixel > 0) {
8485
+ this.root.state.tasks[taskIndex].x = (updatedTask.startTime - this.root.state.options.times.firstTime) / timePerPixel;
8486
+ this.root.state.tasks[taskIndex].width = (updatedTask.endTime - updatedTask.startTime) / timePerPixel;
8487
+ }
8488
+ }
8489
+
8490
+ // Force update
8491
+ this.$forceUpdate();
8492
+ }
8493
+ }
8494
+ },
7323
8495
  computed: {
7324
8496
  /**
7325
8497
  * Get view box
@@ -7343,8 +8515,8 @@ var Story_component = normalizeComponent(
7343
8515
  ;
7344
8516
  var Chart_component = normalizeComponent(
7345
8517
  Chart_Chartvue_type_script_lang_js,
7346
- Chartvue_type_template_id_1d5eb6d6_render,
7347
- Chartvue_type_template_id_1d5eb6d6_staticRenderFns,
8518
+ Chartvue_type_template_id_0856b85c_render,
8519
+ Chartvue_type_template_id_0856b85c_staticRenderFns,
7348
8520
  false,
7349
8521
  null,
7350
8522
  null,
@@ -7433,6 +8605,16 @@ let ignoreScrollEvents = false;
7433
8605
  }
7434
8606
  },
7435
8607
  methods: {
8608
+ /**
8609
+ * Handle task updated event from chart
8610
+ *
8611
+ * @param {Object} updatedTask - Updated task data
8612
+ */
8613
+ handleTaskUpdated(updatedTask) {
8614
+ // Emit event to parent component
8615
+ console.log("task-updated --MainView");
8616
+ this.$emit('task-updated', updatedTask);
8617
+ },
7436
8618
  /**
7437
8619
  * Emit event when mouse is moving inside main view
7438
8620
  */
@@ -7549,8 +8731,8 @@ let ignoreScrollEvents = false;
7549
8731
  ;
7550
8732
  var MainView_component = normalizeComponent(
7551
8733
  components_MainViewvue_type_script_lang_js,
7552
- MainViewvue_type_template_id_1a4b756c_render,
7553
- MainViewvue_type_template_id_1a4b756c_staticRenderFns,
8734
+ MainViewvue_type_template_id_79e1eba9_render,
8735
+ MainViewvue_type_template_id_79e1eba9_staticRenderFns,
7554
8736
  false,
7555
8737
  null,
7556
8738
  null,
@@ -7873,6 +9055,192 @@ function getStyle(fontSize = '12px', fontFamily = 'Arial, sans-serif') {
7873
9055
  'text-overflow': 'ellipsis',
7874
9056
  'max-width': '120px'
7875
9057
  },
9058
+ 'chart-row-resize-handle': {
9059
+ fill: 'rgba(59, 130, 246, 0.2)',
9060
+ stroke: 'rgba(59, 130, 246, 0.8)',
9061
+ 'stroke-width': '2',
9062
+ cursor: 'ew-resize',
9063
+ opacity: '0.3',
9064
+ transition: 'opacity 0.2s ease',
9065
+ 'pointer-events': 'all'
9066
+ },
9067
+ 'chart-row-resize-handle--start': {
9068
+ cursor: 'w-resize',
9069
+ fill: 'rgba(34, 197, 94, 0.3)',
9070
+ stroke: 'rgba(34, 197, 94, 0.9)',
9071
+ 'stroke-width': '2'
9072
+ },
9073
+ 'chart-row-resize-handle--end': {
9074
+ cursor: 'e-resize',
9075
+ fill: 'rgba(239, 68, 68, 0.4)',
9076
+ stroke: 'rgba(239, 68, 68, 1)',
9077
+ 'stroke-width': '2'
9078
+ },
9079
+ 'chart-row-bar-wrapper:hover .chart-row-resize-handle': {
9080
+ opacity: '0.8'
9081
+ },
9082
+ 'chart-row-resize-handle:hover': {
9083
+ opacity: '1',
9084
+ fill: 'rgba(59, 130, 246, 0.4)',
9085
+ stroke: 'rgba(59, 130, 246, 1)'
9086
+ },
9087
+ 'chart-row-resize-handle--start:hover': {
9088
+ fill: 'rgba(34, 197, 94, 0.4)',
9089
+ stroke: 'rgba(34, 197, 94, 1)'
9090
+ },
9091
+ 'chart-row-resize-handle--end:hover': {
9092
+ fill: 'rgba(239, 68, 68, 0.5)',
9093
+ stroke: 'rgba(239, 68, 68, 1)',
9094
+ 'stroke-width': '3'
9095
+ },
9096
+ 'chart-row-resize-handle--corner': {
9097
+ fill: 'rgba(147, 51, 234, 0.6)',
9098
+ stroke: 'rgba(147, 51, 234, 1)',
9099
+ 'stroke-width': '2',
9100
+ cursor: 'nw-resize',
9101
+ opacity: '0.9',
9102
+ transition: 'opacity 0.2s ease',
9103
+ 'pointer-events': 'all'
9104
+ },
9105
+ 'chart-row-resize-handle--corner:hover': {
9106
+ fill: 'rgba(147, 51, 234, 0.8)',
9107
+ stroke: 'rgba(147, 51, 234, 1)',
9108
+ 'stroke-width': '3',
9109
+ opacity: '1'
9110
+ },
9111
+ 'chart-row-resize-handle--corner--start': {
9112
+ fill: 'rgba(34, 197, 94, 0.7)',
9113
+ stroke: 'rgba(34, 197, 94, 1)',
9114
+ 'stroke-width': '2',
9115
+ cursor: 'w-resize'
9116
+ },
9117
+ 'chart-row-resize-handle--corner--end': {
9118
+ fill: 'rgba(239, 68, 68, 0.7)',
9119
+ stroke: 'rgba(239, 68, 68, 1)',
9120
+ 'stroke-width': '2',
9121
+ cursor: 'e-resize'
9122
+ },
9123
+ 'chart-row-corner-handle--start': {
9124
+ fill: 'rgba(34, 197, 94, 0.8)',
9125
+ stroke: 'rgba(34, 197, 94, 1)',
9126
+ 'stroke-width': '2',
9127
+ cursor: 'w-resize',
9128
+ opacity: '0.9',
9129
+ transition: 'opacity 0.2s ease',
9130
+ 'pointer-events': 'all'
9131
+ },
9132
+ 'chart-row-corner-handle--end': {
9133
+ fill: 'rgba(239, 68, 68, 0.8)',
9134
+ stroke: 'rgba(239, 68, 68, 1)',
9135
+ 'stroke-width': '2',
9136
+ cursor: 'e-resize',
9137
+ opacity: '0.9',
9138
+ transition: 'opacity 0.2s ease',
9139
+ 'pointer-events': 'all'
9140
+ },
9141
+ 'chart-row-corner-handle--start:hover': {
9142
+ fill: 'rgba(34, 197, 94, 0.5)',
9143
+ stroke: 'rgba(34, 197, 94, 1)',
9144
+ 'stroke-width': '2',
9145
+ opacity: '0.9'
9146
+ },
9147
+ 'chart-row-corner-handle--end:hover': {
9148
+ fill: 'rgba(239, 68, 68, 0.5)',
9149
+ stroke: 'rgba(239, 68, 68, 1)',
9150
+ 'stroke-width': '2',
9151
+ opacity: '0.9'
9152
+ },
9153
+ 'chart-row-extend-handle': {
9154
+ fill: 'rgba(255, 255, 255, 0.1)',
9155
+ stroke: 'rgba(255, 255, 255, 0.3)',
9156
+ 'stroke-width': '1',
9157
+ cursor: 'ew-resize',
9158
+ opacity: '0.3',
9159
+ transition: 'opacity 0.2s ease',
9160
+ 'pointer-events': 'all',
9161
+ 'z-index': '10'
9162
+ },
9163
+ 'chart-row-extend-handle:hover': {
9164
+ fill: 'rgba(255, 255, 255, 0.2)',
9165
+ stroke: 'rgba(255, 255, 255, 0.6)',
9166
+ 'stroke-width': '2',
9167
+ opacity: '0.8'
9168
+ },
9169
+ 'chart-row-expand-icon-bg': {
9170
+ fill: 'rgba(255, 255, 255, 0.95)',
9171
+ stroke: 'rgba(0, 0, 0, 0.5)',
9172
+ 'stroke-width': '1.5',
9173
+ cursor: 'ew-resize',
9174
+ opacity: '1',
9175
+ transition: 'opacity 0.2s ease',
9176
+ 'pointer-events': 'all'
9177
+ },
9178
+ 'chart-row-expand-icon-arrow': {
9179
+ fill: 'rgba(0, 0, 0, 0.9)',
9180
+ cursor: 'ew-resize',
9181
+ 'pointer-events': 'all'
9182
+ },
9183
+ 'chart-row-expand-icon:hover .gantt-elastic__chart-row-expand-icon-bg': {
9184
+ fill: 'rgba(255, 255, 255, 1)',
9185
+ stroke: 'rgba(0, 0, 0, 0.5)',
9186
+ 'stroke-width': '1.5',
9187
+ opacity: '1'
9188
+ },
9189
+ 'chart-row-expand-icon:hover .gantt-elastic__chart-row-expand-icon-arrow': {
9190
+ fill: 'rgba(0, 0, 0, 1)'
9191
+ },
9192
+ 'gantt-elastic__task-dragging': {
9193
+ opacity: '0.8',
9194
+ 'pointer-events': 'none',
9195
+ 'filter': 'drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2))'
9196
+ },
9197
+ 'gantt-elastic__task-dragging--start': {
9198
+ 'border-left': '3px solid #22c55e',
9199
+ 'box-shadow': 'inset 3px 0 0 #22c55e'
9200
+ },
9201
+ 'gantt-elastic__task-dragging--end': {
9202
+ 'border-right': '3px solid #ef4444',
9203
+ 'box-shadow': 'inset -3px 0 0 #ef4444'
9204
+ },
9205
+ 'gantt-elastic__task-dragging--move': {
9206
+ 'border': '2px solid #3b82f6',
9207
+ 'box-shadow': '0 0 0 2px rgba(59, 130, 246, 0.3)'
9208
+ },
9209
+ 'gantt-elastic__context-menu': {
9210
+ 'position': 'fixed',
9211
+ 'background': 'white',
9212
+ 'border': '1px solid #e5e7eb',
9213
+ 'border-radius': '6px',
9214
+ 'box-shadow': '0 4px 6px -1px rgba(0, 0, 0, 0.1)',
9215
+ 'z-index': '1000',
9216
+ 'min-width': '150px',
9217
+ 'padding': '4px 0',
9218
+ 'font-family': 'system-ui, -apple-system, sans-serif'
9219
+ },
9220
+ 'gantt-elastic__context-menu-item': {
9221
+ 'padding': '8px 16px',
9222
+ 'cursor': 'pointer',
9223
+ 'font-size': '14px',
9224
+ 'color': '#374151',
9225
+ 'transition': 'background-color 0.2s',
9226
+ 'user-select': 'none'
9227
+ },
9228
+ 'gantt-elastic__context-menu-item:hover': {
9229
+ 'background-color': '#f3f4f6'
9230
+ },
9231
+ 'gantt-elastic__date-tooltip': {
9232
+ 'position': 'fixed',
9233
+ 'background': 'rgba(0, 0, 0, 0.8)',
9234
+ 'color': 'white',
9235
+ 'padding': '4px 8px',
9236
+ 'border-radius': '4px',
9237
+ 'font-size': '12px',
9238
+ 'font-family': 'system-ui, -apple-system, sans-serif',
9239
+ 'pointer-events': 'none',
9240
+ 'z-index': '10000',
9241
+ 'white-space': 'nowrap',
9242
+ 'box-shadow': '0 2px 4px rgba(0, 0, 0, 0.2)'
9243
+ },
7876
9244
  'chart-row-text-content--text': {},
7877
9245
  'chart-row-text-content--html': {},
7878
9246
  'chart-row-wrapper': {},
@@ -10046,6 +11414,15 @@ const GanttElastic = {
10046
11414
  }
10047
11415
  }
10048
11416
 
11417
+ // Emit event to parent component
11418
+ this.$emit('view-mode-changed', mode);
11419
+
11420
+ // Also emit to root for plugin usage
11421
+ this.$root.$emit('gantt-view-mode-changed', mode);
11422
+
11423
+ // Log the view mode change for debugging
11424
+ console.log('View mode changed - from GanttElastic:', mode);
11425
+
10049
11426
  // Force recalculation by triggering a reactive update
10050
11427
  this.$nextTick(() => {
10051
11428
  this.$forceUpdate();
@@ -10064,6 +11441,20 @@ const GanttElastic = {
10064
11441
  }
10065
11442
  });
10066
11443
  },
11444
+ /**
11445
+ * Handle task updated event from dragging
11446
+ *
11447
+ * @param {Object} updatedTask - Updated task data
11448
+ */
11449
+ handleTaskUpdated(updatedTask) {
11450
+ // Emit event to parent component
11451
+ console.log('Task updated -- GanttElastic:');
11452
+ this.$emit('task-updated', updatedTask);
11453
+ this.$emit('gantt-task-updated', updatedTask);
11454
+
11455
+ // Also emit to root for plugin usage
11456
+ this.$root.$emit('gantt-task-updated', updatedTask);
11457
+ },
10067
11458
  /**
10068
11459
  * Calculate height of scrollbar in current browser
10069
11460
  *
@@ -10416,7 +11807,18 @@ const GanttElastic = {
10416
11807
  * @returns {number}
10417
11808
  */
10418
11809
  getHeight(visibleTasks, outer = false) {
10419
- 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;
11810
+ let height;
11811
+
11812
+ // If we have tasks, use their actual height for full grid
11813
+ if (visibleTasks.length > 0) {
11814
+ 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;
11815
+ } else {
11816
+ // If no tasks, use 70% of viewport height for empty state
11817
+ const viewportHeight = window.innerHeight;
11818
+ const headerHeight = this.state.options.calendar.height + this.state.options.calendar.gap;
11819
+ const availableHeight = viewportHeight * 0.7 - headerHeight - 40; // 70% of viewport, 40px for padding/margins
11820
+ height = Math.max(availableHeight, 300); // Minimum 300px height
11821
+ }
10420
11822
  if (outer) {
10421
11823
  height += this.state.options.scrollBarHeight;
10422
11824
  }
@@ -10439,7 +11841,20 @@ const GanttElastic = {
10439
11841
  * @returns {number}
10440
11842
  */
10441
11843
  getTasksHeight(visibleTasks) {
10442
- return visibleTasks.length * this.getTaskHeight();
11844
+ const taskHeight = visibleTasks.length * this.getTaskHeight();
11845
+
11846
+ // If we have tasks, use their actual height for full grid
11847
+ if (visibleTasks.length > 0) {
11848
+ return taskHeight;
11849
+ }
11850
+
11851
+ // If no tasks, use 70% of viewport height for empty state
11852
+ const viewportHeight = window.innerHeight;
11853
+ const headerHeight = this.state.options.calendar.height + this.state.options.calendar.gap;
11854
+ const availableHeight = viewportHeight * 0.7 - headerHeight - 40; // 70% of viewport, 40px for padding/margins
11855
+ const reducedHeight = Math.max(availableHeight, 300); // Minimum 300px height
11856
+
11857
+ return reducedHeight;
10443
11858
  },
10444
11859
  /**
10445
11860
  * Convert time (in milliseconds) to pixel offset inside chart
@@ -10746,15 +12161,15 @@ const GanttElastic = {
10746
12161
  getMaxWidthMultiplier(stepDuration, stepCount) {
10747
12162
  const clientWidth = this.state.options.clientWidth;
10748
12163
 
10749
- // Base multipliers for different screen sizes
12164
+ // Base multipliers for different screen sizes (reduced for better balance)
10750
12165
  const baseMultipliers = {
10751
- mobile: 2,
10752
- // 2x viewport width on mobile
10753
- tablet: 2.5,
10754
- // 2.5x viewport width on tablet
10755
- desktopSmall: 3,
10756
- // 3x viewport width on small desktop
10757
- desktopBig: 4 // 4x viewport width on big desktop
12166
+ mobile: 1.5,
12167
+ // 1.5x viewport width on mobile
12168
+ tablet: 1.8,
12169
+ // 1.8x viewport width on tablet
12170
+ desktopSmall: 2.2,
12171
+ // 2.2x viewport width on small desktop
12172
+ desktopBig: 2.5 // 2.5x viewport width on big desktop
10758
12173
  };
10759
12174
 
10760
12175
  // Determine screen size
@@ -10781,7 +12196,7 @@ const GanttElastic = {
10781
12196
  // If we have more data than minimum visibility, allow more width
10782
12197
  if (stepCount > minVisibilitySteps[stepDuration]) {
10783
12198
  const dataRatio = stepCount / minVisibilitySteps[stepDuration];
10784
- multiplier = Math.min(multiplier * (1 + dataRatio * 0.5), 6); // Max 6x viewport width
12199
+ multiplier = Math.min(multiplier * (1 + dataRatio * 0.3), 3); // Max 3x viewport width
10785
12200
  }
10786
12201
  return multiplier;
10787
12202
  },
@@ -10882,7 +12297,7 @@ const GanttElastic = {
10882
12297
  const maxWidth = this.state.options.clientWidth * maxWidthMultiplier;
10883
12298
 
10884
12299
  // Ensure minimum width for scrolling when we have minimum visibility requirements
10885
- const minWidthForScrolling = this.state.options.clientWidth * 1.2; // 20% more than viewport
12300
+ const minWidthForScrolling = this.state.options.clientWidth * 1.1; // 10% more than viewport
10886
12301
  const finalWidth = Math.max(calculatedWidth, minWidthForScrolling);
10887
12302
  if (finalWidth > maxWidth) {
10888
12303
  // Only limit width if it's truly excessive
@@ -11172,6 +12587,29 @@ const GanttElastic = {
11172
12587
  width: 0
11173
12588
  }).width;
11174
12589
  },
12590
+ /**
12591
+ * Recalculate height based on current tasks and viewport
12592
+ */
12593
+ recalculateHeight() {
12594
+ const visibleTasks = this.state.tasks.filter(task => this.isTaskVisible(task));
12595
+ if (visibleTasks.length > 0) {
12596
+ // Use full task height for complete grid
12597
+ this.state.options.rowsHeight = this.getTasksHeight(visibleTasks);
12598
+ this.state.options.height = this.getHeight(visibleTasks);
12599
+ this.state.options.allVisibleTasksHeight = this.getTasksHeight(visibleTasks);
12600
+ this.state.options.outerHeight = this.getHeight(visibleTasks, true);
12601
+ } else {
12602
+ // Use reduced viewport height for empty state
12603
+ const viewportHeight = window.innerHeight;
12604
+ const headerHeight = this.state.options.calendar.height + this.state.options.calendar.gap;
12605
+ const availableHeight = viewportHeight * 0.7 - headerHeight - 40;
12606
+ const reducedHeight = Math.max(availableHeight, 300);
12607
+ this.state.options.rowsHeight = reducedHeight;
12608
+ this.state.options.height = reducedHeight + this.state.options.calendar.height + this.state.options.calendar.gap;
12609
+ this.state.options.allVisibleTasksHeight = reducedHeight;
12610
+ this.state.options.outerHeight = this.state.options.height + this.state.options.scrollBarHeight;
12611
+ }
12612
+ },
11175
12613
  /**
11176
12614
  * Global resize event (from window.addEventListener)
11177
12615
  */
@@ -11180,6 +12618,15 @@ const GanttElastic = {
11180
12618
  return;
11181
12619
  }
11182
12620
  this.state.options.clientWidth = this.$el.clientWidth;
12621
+
12622
+ // Only set height if no tasks are present (let visibleTasks computed property handle height when tasks exist)
12623
+ if (this.state.tasks.length === 0) {
12624
+ // Set height to 70% of viewport height for better balance when no tasks
12625
+ const viewportHeight = window.innerHeight;
12626
+ const headerHeight = this.state.options.calendar.height + this.state.options.calendar.gap;
12627
+ const availableHeight = viewportHeight * 0.7 - headerHeight - 40; // 70% of viewport, 40px for padding/margins
12628
+ this.state.options.height = Math.max(availableHeight, 300); // Minimum 300px height
12629
+ }
11183
12630
  if (this.state.options.taskList.widthFromPercentage > this.state.options.clientWidth / 100 * this.state.options.taskList.widthThreshold) {
11184
12631
  const diff = this.state.options.taskList.widthFromPercentage - this.state.options.clientWidth / 100 * this.state.options.taskList.widthThreshold;
11185
12632
  let diffPercent = 100 - diff / this.state.options.taskList.widthFromPercentage * 100;
@@ -11202,6 +12649,9 @@ const GanttElastic = {
11202
12649
  this.computeCalendarWidths();
11203
12650
  this.$emit('calendar-recalculate');
11204
12651
  this.syncScrollTop();
12652
+
12653
+ // Recalculate height after resize
12654
+ this.recalculateHeight();
11205
12655
  }
11206
12656
  },
11207
12657
  computed: {
@@ -11212,16 +12662,17 @@ const GanttElastic = {
11212
12662
  */
11213
12663
  visibleTasks() {
11214
12664
  const visibleTasks = this.state.tasks.filter(task => this.isTaskVisible(task));
11215
- const maxRows = visibleTasks.slice(0, this.state.options.maxRows);
11216
- this.state.options.rowsHeight = this.getTasksHeight(maxRows);
12665
+
12666
+ // Use full visible tasks for height calculations to show complete grid
12667
+ this.state.options.rowsHeight = this.getTasksHeight(visibleTasks);
11217
12668
  let heightCompensation = 0;
11218
12669
  if (this.state.options.maxHeight && this.state.options.rowsHeight > this.state.options.maxHeight) {
11219
12670
  heightCompensation = this.state.options.rowsHeight - this.state.options.maxHeight;
11220
12671
  this.state.options.rowsHeight = this.state.options.maxHeight;
11221
12672
  }
11222
- this.state.options.height = this.getHeight(maxRows) - heightCompensation;
12673
+ this.state.options.height = this.getHeight(visibleTasks) - heightCompensation;
11223
12674
  this.state.options.allVisibleTasksHeight = this.getTasksHeight(visibleTasks);
11224
- this.state.options.outerHeight = this.getHeight(maxRows, true) - heightCompensation;
12675
+ this.state.options.outerHeight = this.getHeight(visibleTasks, true) - heightCompensation;
11225
12676
  let len = visibleTasks.length;
11226
12677
  for (let index = 0; index < len; index++) {
11227
12678
  let task = visibleTasks[index];
@@ -11272,6 +12723,10 @@ const GanttElastic = {
11272
12723
  if (notEqual) {
11273
12724
  this.setup('tasks');
11274
12725
  }
12726
+ // Recalculate height when tasks change
12727
+ this.$nextTick(() => {
12728
+ this.recalculateHeight();
12729
+ });
11275
12730
  }, {
11276
12731
  deep: true
11277
12732
  });
@@ -11321,15 +12776,59 @@ const GanttElastic = {
11321
12776
  */
11322
12777
  mounted() {
11323
12778
  this.state.options.clientWidth = this.$el.clientWidth;
12779
+
12780
+ // Set initial height based on whether tasks exist
12781
+ if (this.state.tasks.length === 0) {
12782
+ const viewportHeight = window.innerHeight;
12783
+ const headerHeight = this.state.options.calendar.height + this.state.options.calendar.gap;
12784
+ const availableHeight = viewportHeight * 0.7 - headerHeight - 40;
12785
+ this.state.options.height = Math.max(availableHeight, 300);
12786
+ }
11324
12787
  this.state.resizeObserver = new ResizeObserver_es((entries, observer) => {
11325
12788
  this.globalOnResize();
11326
12789
  });
11327
12790
  this.state.resizeObserver.observe(this.$el.parentNode);
12791
+
12792
+ // Add window resize listener for full viewport responsiveness
12793
+ window.addEventListener('resize', this.globalOnResize);
11328
12794
  this.globalOnResize();
12795
+ this.recalculateHeight();
11329
12796
  this.$emit('ready', this);
11330
12797
  this.$root.$emit('gantt-elastic-mounted', this);
11331
12798
  this.$emit('mounted', this);
11332
12799
  this.$root.$emit('gantt-elastic-ready', this);
12800
+
12801
+ // Expose methods for plugin usage
12802
+ this.$gantt = {
12803
+ onTaskUpdated: this.handleTaskUpdated,
12804
+ onViewModeChanged: this.onViewModeChanged,
12805
+ getTasks: () => this.state.tasks,
12806
+ updateTask: (taskId, updates) => {
12807
+ const taskIndex = this.state.tasks.findIndex(task => task.id === taskId);
12808
+ if (taskIndex !== -1) {
12809
+ Object.assign(this.state.tasks[taskIndex], updates);
12810
+ this.$forceUpdate();
12811
+ }
12812
+ }
12813
+ };
12814
+
12815
+ /*
12816
+ * PLUGIN USAGE EXAMPLE:
12817
+ *
12818
+ * // Listen to events when using as plugin:
12819
+ * this.$root.$on('gantt-task-updated', (updatedTask) => {
12820
+ * console.log('Task updated:', updatedTask);
12821
+ * });
12822
+ *
12823
+ * this.$root.$on('gantt-view-mode-changed', (mode) => {
12824
+ * console.log('View mode changed:', mode);
12825
+ * });
12826
+ *
12827
+ * // Access gantt methods:
12828
+ * const ganttInstance = this.$refs.ganttChart.$gantt;
12829
+ * ganttInstance.updateTask(1, { label: 'New Task Name' });
12830
+ * const tasks = ganttInstance.getTasks();
12831
+ */
11333
12832
  },
11334
12833
  /**
11335
12834
  * Emit event when data was changed and before update (you can cleanup dom events here for example)
@@ -11350,6 +12849,7 @@ const GanttElastic = {
11350
12849
  */
11351
12850
  beforeDestroy() {
11352
12851
  this.state.resizeObserver.unobserve(this.$el.parentNode);
12852
+ window.removeEventListener('resize', this.globalOnResize);
11353
12853
  this.state.unwatchTasks();
11354
12854
  this.state.unwatchOptions();
11355
12855
  this.state.unwatchStyle();
@@ -11368,10 +12868,10 @@ const GanttElastic = {
11368
12868
  /* harmony default export */ var GanttElasticvue_type_script_lang_js = (GanttElastic);
11369
12869
  ;// ./src/GanttElastic.vue?vue&type=script&lang=js
11370
12870
  /* harmony default export */ var src_GanttElasticvue_type_script_lang_js = (GanttElasticvue_type_script_lang_js);
11371
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.vue?vue&type=style&index=0&id=2767341e&prod&lang=css
12871
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/GanttElastic.vue?vue&type=style&index=0&id=0a0b0d9f&prod&lang=css
11372
12872
  // extracted by mini-css-extract-plugin
11373
12873
 
11374
- ;// ./src/GanttElastic.vue?vue&type=style&index=0&id=2767341e&prod&lang=css
12874
+ ;// ./src/GanttElastic.vue?vue&type=style&index=0&id=0a0b0d9f&prod&lang=css
11375
12875
 
11376
12876
  ;// ./src/GanttElastic.vue
11377
12877
 
@@ -11384,8 +12884,8 @@ const GanttElastic = {
11384
12884
 
11385
12885
  var GanttElastic_component = normalizeComponent(
11386
12886
  src_GanttElasticvue_type_script_lang_js,
11387
- GanttElasticvue_type_template_id_2767341e_render,
11388
- GanttElasticvue_type_template_id_2767341e_staticRenderFns,
12887
+ GanttElasticvue_type_template_id_0a0b0d9f_render,
12888
+ GanttElasticvue_type_template_id_0a0b0d9f_staticRenderFns,
11389
12889
  false,
11390
12890
  null,
11391
12891
  null,