@operato/gantt 7.0.20 → 7.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/src/draw-time-scale-header.d.ts +5 -0
  3. package/dist/src/draw-time-scale-header.js +154 -0
  4. package/dist/src/draw-time-scale-header.js.map +1 -0
  5. package/dist/src/gantt-chart-controller.d.ts +1 -1
  6. package/dist/src/gantt-chart-controller.js +6 -161
  7. package/dist/src/gantt-chart-controller.js.map +1 -1
  8. package/dist/src/ox-gantt-chart.d.ts +6 -1
  9. package/dist/src/ox-gantt-chart.js +39 -8
  10. package/dist/src/ox-gantt-chart.js.map +1 -1
  11. package/dist/src/ox-gantt-resize-splitter.js +8 -7
  12. package/dist/src/ox-gantt-resize-splitter.js.map +1 -1
  13. package/dist/src/ox-gantt.d.ts +24 -15
  14. package/dist/src/ox-gantt.js +224 -82
  15. package/dist/src/ox-gantt.js.map +1 -1
  16. package/dist/src/ox-resource-chart.d.ts +42 -0
  17. package/dist/src/ox-resource-chart.js +317 -0
  18. package/dist/src/ox-resource-chart.js.map +1 -0
  19. package/dist/src/types.d.ts +5 -0
  20. package/dist/src/types.js.map +1 -1
  21. package/dist/stories/ox-gantt.stories.js +75 -4
  22. package/dist/stories/ox-gantt.stories.js.map +1 -1
  23. package/dist/tsconfig.tsbuildinfo +1 -1
  24. package/package.json +2 -2
  25. package/src/draw-time-scale-header.ts +192 -0
  26. package/src/gantt-chart-controller.ts +6 -189
  27. package/src/ox-gantt-chart.ts +46 -9
  28. package/src/ox-gantt-resize-splitter.ts +8 -7
  29. package/src/ox-gantt.ts +231 -86
  30. package/src/ox-resource-chart.ts +328 -0
  31. package/src/types.ts +6 -0
  32. package/stories/ox-gantt.stories.ts +75 -4
  33. package/translations/en.json +4 -1
  34. package/translations/ja.json +3 -1
  35. package/translations/ko.json +4 -1
  36. package/translations/ms.json +3 -1
  37. package/translations/zh.json +3 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,26 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ### [7.0.22](https://github.com/hatiolab/operato/compare/v7.0.21...v7.0.22) (2024-07-18)
7
+
8
+
9
+ ### :bug: Bug Fix
10
+
11
+ * gantt ox-resource-chart ([14b490e](https://github.com/hatiolab/operato/commit/14b490e19ba87111c76c5b755bbcf3a2ed080630))
12
+ * ox-resource-chart ([e0251bb](https://github.com/hatiolab/operato/commit/e0251bb6900f8db540230e8b0202ffefaf9f329f))
13
+
14
+
15
+
16
+ ### [7.0.21](https://github.com/hatiolab/operato/compare/v7.0.20...v7.0.21) (2024-07-18)
17
+
18
+
19
+ ### :bug: Bug Fix
20
+
21
+ * gantt resource chart ([0d14e2e](https://github.com/hatiolab/operato/commit/0d14e2e1542f83706817a1c82589f327d24cc6fd))
22
+ * gantt task hierachy ([9c21d39](https://github.com/hatiolab/operato/commit/9c21d39372e4cbb37606f51af7f1067605cca61e))
23
+
24
+
25
+
6
26
  ### [7.0.20](https://github.com/hatiolab/operato/compare/v7.0.19...v7.0.20) (2024-07-17)
7
27
 
8
28
  **Note:** Version bump only for package @operato/gantt
@@ -0,0 +1,5 @@
1
+ import * as d3 from 'd3';
2
+ import { TimeScale } from './types';
3
+ export declare function drawTimeScaleHeader(svgHeader: SVGElement, timeScale: d3.ScaleTime<number, number, never>, fromTime: Date, toTime: Date, baseWidth: number, level: TimeScale): void;
4
+ export declare function getChartWidth(fromTime: Date, toTime: Date, baseWidth: number, level: TimeScale): number;
5
+ export declare function getScale(level: TimeScale): number;
@@ -0,0 +1,154 @@
1
+ import * as d3 from 'd3';
2
+ export function drawTimeScaleHeader(svgHeader, timeScale, fromTime, toTime, baseWidth, level) {
3
+ const header = d3.select(svgHeader);
4
+ header.selectAll('*').remove();
5
+ header.attr('width', getChartWidth(fromTime, toTime, baseWidth, level));
6
+ const addGridLines = (ticks, yStart, yEnd) => {
7
+ ticks.forEach(tick => {
8
+ const startX = timeScale(tick);
9
+ header
10
+ .append('line')
11
+ .attr('x1', startX)
12
+ .attr('x2', startX)
13
+ .attr('y1', yStart)
14
+ .attr('y2', yEnd)
15
+ .attr('stroke', 'var(--ox-gantt-color-gridlines, var(--md-sys-color-on-secondary-container))')
16
+ .attr('stroke-width', 1);
17
+ });
18
+ };
19
+ const centerLabel = (selection, tickInterval) => {
20
+ selection.selectAll('text').attr('transform', (d) => {
21
+ const tickIntervalWidth = timeScale(tickInterval.offset(d, 1)) - timeScale(d);
22
+ return `translate(${tickIntervalWidth / 2}, -2)`;
23
+ });
24
+ };
25
+ if (level === 'week-day') {
26
+ const weekAxis = d3
27
+ .axisTop(timeScale)
28
+ .ticks(d3.timeWeek.every(1))
29
+ .tickFormat(d3.timeFormat('%B %d'))
30
+ .tickSize(0);
31
+ const weekTicks = d3.timeWeek.every(1).range(d3.timeWeek.floor(fromTime), d3.timeWeek.offset(toTime, 1));
32
+ addGridLines(weekTicks, 0, 20);
33
+ const weekAxisG = header
34
+ .append('g')
35
+ .classed('week-axis no-select md-typescale-label-small', true)
36
+ .attr('transform', `translate(0, 20)`)
37
+ .call(weekAxis);
38
+ centerLabel(weekAxisG, d3.timeWeek);
39
+ const dayAxis = d3
40
+ .axisTop(timeScale)
41
+ .ticks(d3.timeDay.every(1))
42
+ .tickFormat(d3.timeFormat('%d'))
43
+ .tickSize(0);
44
+ const dayTicks = d3.timeDay.every(1).range(d3.timeDay.floor(fromTime), d3.timeDay.offset(toTime, 1));
45
+ addGridLines(dayTicks, 20, 40);
46
+ const dayAxisG = header
47
+ .append('g')
48
+ .classed('day-axis no-select md-typescale-label-small', true)
49
+ .attr('transform', `translate(0, 40)`)
50
+ .call(dayAxis);
51
+ centerLabel(dayAxisG, d3.timeDay);
52
+ }
53
+ else if (level === 'quarter-week') {
54
+ const quarterAxis = d3
55
+ .axisTop(timeScale)
56
+ .ticks(d3.timeMonth.every(3))
57
+ .tickFormat(d3.timeFormat('%Y %b'))
58
+ .tickSize(0);
59
+ const quarterTicks = d3.timeMonth.every(3).range(d3.timeMonth.floor(fromTime), d3.timeMonth.offset(toTime, 3));
60
+ addGridLines(quarterTicks, 0, 20);
61
+ const quarterAxisG = header
62
+ .append('g')
63
+ .classed('quarter-axis no-select md-typescale-label-small', true)
64
+ .attr('transform', `translate(0, 20)`)
65
+ .call(quarterAxis);
66
+ centerLabel(quarterAxisG, d3.timeMonth.every(3));
67
+ const weekAxis = d3
68
+ .axisTop(timeScale)
69
+ .ticks(d3.timeWeek.every(1))
70
+ .tickFormat(d3.timeFormat('%b %d'))
71
+ .tickSize(0);
72
+ const weekTicks = d3.timeWeek.every(1).range(d3.timeWeek.floor(fromTime), d3.timeWeek.offset(toTime, 1));
73
+ addGridLines(weekTicks, 20, 40);
74
+ const weekAxisG = header
75
+ .append('g')
76
+ .classed('week-axis no-select md-typescale-label-small', true)
77
+ .attr('transform', `translate(0, 40)`)
78
+ .call(weekAxis);
79
+ centerLabel(weekAxisG, d3.timeWeek);
80
+ }
81
+ else if (level === 'year-month') {
82
+ const yearAxis = d3
83
+ .axisTop(timeScale)
84
+ .ticks(d3.timeYear.every(1))
85
+ .tickFormat(d3.timeFormat('%Y'))
86
+ .tickSize(0);
87
+ const yearTicks = d3.timeYear.every(1).range(d3.timeYear.floor(fromTime), d3.timeYear.offset(toTime, 1));
88
+ addGridLines(yearTicks, 0, 20);
89
+ const yearAxisG = header
90
+ .append('g')
91
+ .classed('year-axis no-select md-typescale-label-small', true)
92
+ .attr('transform', `translate(0, 20)`)
93
+ .call(yearAxis);
94
+ centerLabel(yearAxisG, d3.timeYear.every(1));
95
+ const monthAxis = d3
96
+ .axisTop(timeScale)
97
+ .ticks(d3.timeMonth.every(1))
98
+ .tickFormat(d3.timeFormat('%b'))
99
+ .tickSize(0);
100
+ const monthTicks = d3.timeMonth.every(1).range(d3.timeMonth.floor(fromTime), d3.timeMonth.offset(toTime, 1));
101
+ addGridLines(monthTicks, 20, 40);
102
+ const monthAxisG = header
103
+ .append('g')
104
+ .classed('month-axis no-select md-typescale-label-small', true)
105
+ .attr('transform', `translate(0, 40)`)
106
+ .call(monthAxis);
107
+ centerLabel(monthAxisG, d3.timeMonth.every(1));
108
+ }
109
+ else if (level === 'year-quarter') {
110
+ const yearAxis = d3
111
+ .axisTop(timeScale)
112
+ .ticks(d3.timeYear.every(1))
113
+ .tickFormat(d3.timeFormat('%Y'))
114
+ .tickSize(0);
115
+ const yearTicks = d3.timeYear.every(1).range(d3.timeYear.floor(fromTime), d3.timeYear.offset(toTime, 1));
116
+ addGridLines(yearTicks, 0, 20);
117
+ const yearAxisG = header
118
+ .append('g')
119
+ .classed('year-axis no-select md-typescale-label-small', true)
120
+ .attr('transform', `translate(0, 20)`)
121
+ .call(yearAxis);
122
+ centerLabel(yearAxisG, d3.timeYear.every(1));
123
+ const quarterAxis = d3
124
+ .axisTop(timeScale)
125
+ .ticks(d3.timeMonth.every(3))
126
+ .tickFormat(d3.timeFormat('%Y %b'))
127
+ .tickSize(0);
128
+ const quarterTicks = d3.timeMonth.every(3).range(d3.timeMonth.floor(fromTime), d3.timeMonth.offset(toTime, 3));
129
+ addGridLines(quarterTicks, 20, 40);
130
+ const quarterAxisG = header
131
+ .append('g')
132
+ .classed('quarter-axis no-select md-typescale-label-small', true)
133
+ .attr('transform', `translate(0, 40)`)
134
+ .call(quarterAxis);
135
+ centerLabel(quarterAxisG, d3.timeMonth.every(3));
136
+ }
137
+ }
138
+ export function getChartWidth(fromTime, toTime, baseWidth, level) {
139
+ const totalDays = d3.timeDay.count(fromTime, d3.timeDay.offset(toTime, 1));
140
+ return (totalDays * baseWidth) / getScale(level);
141
+ }
142
+ export function getScale(level) {
143
+ if (level === 'quarter-week') {
144
+ return 7 / 2;
145
+ }
146
+ else if (level === 'year-month') {
147
+ return 30 / 2;
148
+ }
149
+ else if (level === 'year-quarter') {
150
+ return 90 / 2;
151
+ }
152
+ return 1;
153
+ }
154
+ //# sourceMappingURL=draw-time-scale-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draw-time-scale-header.js","sourceRoot":"","sources":["../../src/draw-time-scale-header.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AAGxB,MAAM,UAAU,mBAAmB,CACjC,SAAqB,EACrB,SAA8C,EAC9C,QAAc,EACd,MAAY,EACZ,SAAiB,EACjB,KAAgB;IAEhB,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAEnC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAA;IAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAA;IAEvE,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE;QACnE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACnB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;YAC9B,MAAM;iBACH,MAAM,CAAC,MAAM,CAAC;iBACd,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;iBAClB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;iBAClB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;iBAClB,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;iBAChB,IAAI,CAAC,QAAQ,EAAE,6EAA6E,CAAC;iBAC7F,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,CAClB,SAAwD,EACxD,YAAsC,EACtC,EAAE;QACF,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAM,EAAE,EAAE;YACvD,MAAM,iBAAiB,GAAG,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;YAC7E,OAAO,aAAa,iBAAiB,GAAG,CAAC,OAAO,CAAA;QAClD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,EAAE;aAChB,OAAO,CAAC,SAAS,CAAC;aAClB,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAC3B,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAQ,CAAC;aACzC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACd,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QACzG,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAE9B,MAAM,SAAS,GAAG,MAAM;aACrB,MAAM,CAAC,GAAG,CAAC;aACX,OAAO,CAAC,8CAA8C,EAAE,IAAI,CAAC;aAC7D,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC;aACrC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAEjB,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAA;QAEnC,MAAM,OAAO,GAAG,EAAE;aACf,OAAO,CAAC,SAAS,CAAC;aAClB,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAC1B,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAQ,CAAC;aACtC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAEd,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QACrG,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAE9B,MAAM,QAAQ,GAAG,MAAM;aACpB,MAAM,CAAC,GAAG,CAAC;aACX,OAAO,CAAC,6CAA6C,EAAE,IAAI,CAAC;aAC5D,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC;aACrC,IAAI,CAAC,OAAO,CAAC,CAAA;QAEhB,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,CAAA;IACnC,CAAC;SAAM,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,EAAE;aACnB,OAAO,CAAC,SAAS,CAAC;aAClB,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAC5B,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAQ,CAAC;aACzC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAEd,MAAM,YAAY,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAC/G,YAAY,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEjC,MAAM,YAAY,GAAG,MAAM;aACxB,MAAM,CAAC,GAAG,CAAC;aACX,OAAO,CAAC,iDAAiD,EAAE,IAAI,CAAC;aAChE,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC;aACrC,IAAI,CAAC,WAAW,CAAC,CAAA;QAEpB,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAQ,CAAC,CAAA;QAEvD,MAAM,QAAQ,GAAG,EAAE;aAChB,OAAO,CAAC,SAAS,CAAC;aAClB,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAC3B,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAQ,CAAC;aACzC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACd,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QACzG,YAAY,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAE/B,MAAM,SAAS,GAAG,MAAM;aACrB,MAAM,CAAC,GAAG,CAAC;aACX,OAAO,CAAC,8CAA8C,EAAE,IAAI,CAAC;aAC7D,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC;aACrC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAEjB,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAA;IACrC,CAAC;SAAM,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,EAAE;aAChB,OAAO,CAAC,SAAS,CAAC;aAClB,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAC3B,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAQ,CAAC;aACtC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAEd,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QACzG,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAE9B,MAAM,SAAS,GAAG,MAAM;aACrB,MAAM,CAAC,GAAG,CAAC;aACX,OAAO,CAAC,8CAA8C,EAAE,IAAI,CAAC;aAC7D,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC;aACrC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAEjB,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAS,CAAC,CAAA;QAEpD,MAAM,SAAS,GAAG,EAAE;aACjB,OAAO,CAAC,SAAS,CAAC;aAClB,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAC5B,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAQ,CAAC;aACtC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAEd,MAAM,UAAU,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAC7G,YAAY,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAEhC,MAAM,UAAU,GAAG,MAAM;aACtB,MAAM,CAAC,GAAG,CAAC;aACX,OAAO,CAAC,+CAA+C,EAAE,IAAI,CAAC;aAC9D,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC;aACrC,IAAI,CAAC,SAAS,CAAC,CAAA;QAElB,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAQ,CAAC,CAAA;IACvD,CAAC;SAAM,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,EAAE;aAChB,OAAO,CAAC,SAAS,CAAC;aAClB,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAC3B,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAQ,CAAC;aACtC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAEd,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QACzG,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAE9B,MAAM,SAAS,GAAG,MAAM;aACrB,MAAM,CAAC,GAAG,CAAC;aACX,OAAO,CAAC,8CAA8C,EAAE,IAAI,CAAC;aAC7D,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC;aACrC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAEjB,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAS,CAAC,CAAA;QAEpD,MAAM,WAAW,GAAG,EAAE;aACnB,OAAO,CAAC,SAAS,CAAC;aAClB,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAC5B,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAQ,CAAC;aACzC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAEd,MAAM,YAAY,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAC/G,YAAY,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAElC,MAAM,YAAY,GAAG,MAAM;aACxB,MAAM,CAAC,GAAG,CAAC;aACX,OAAO,CAAC,iDAAiD,EAAE,IAAI,CAAC;aAChE,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC;aACrC,IAAI,CAAC,WAAW,CAAC,CAAA;QAEpB,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAQ,CAAC,CAAA;IACzD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAc,EAAE,MAAY,EAAE,SAAiB,EAAE,KAAgB;IAC7F,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;IAC1E,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAgB;IACvC,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;SAAM,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QAClC,OAAO,EAAE,GAAG,CAAC,CAAA;IACf,CAAC;SAAM,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;QACpC,OAAO,EAAE,GAAG,CAAC,CAAA;IACf,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC","sourcesContent":["import * as d3 from 'd3'\nimport { TimeScale } from './types'\n\nexport function drawTimeScaleHeader(\n svgHeader: SVGElement,\n timeScale: d3.ScaleTime<number, number, never>,\n fromTime: Date,\n toTime: Date,\n baseWidth: number,\n level: TimeScale\n) {\n const header = d3.select(svgHeader)\n\n header.selectAll('*').remove()\n header.attr('width', getChartWidth(fromTime, toTime, baseWidth, level))\n\n const addGridLines = (ticks: Date[], yStart: number, yEnd: number) => {\n ticks.forEach(tick => {\n const startX = timeScale(tick)\n header\n .append('line')\n .attr('x1', startX)\n .attr('x2', startX)\n .attr('y1', yStart)\n .attr('y2', yEnd)\n .attr('stroke', 'var(--ox-gantt-color-gridlines, var(--md-sys-color-on-secondary-container))')\n .attr('stroke-width', 1)\n })\n }\n\n const centerLabel = (\n selection: d3.Selection<SVGGElement, unknown, null, any>,\n tickInterval: d3.CountableTimeInterval\n ) => {\n selection.selectAll('text').attr('transform', (d: any) => {\n const tickIntervalWidth = timeScale(tickInterval.offset(d, 1)) - timeScale(d)\n return `translate(${tickIntervalWidth / 2}, -2)`\n })\n }\n\n if (level === 'week-day') {\n const weekAxis = d3\n .axisTop(timeScale)\n .ticks(d3.timeWeek.every(1))\n .tickFormat(d3.timeFormat('%B %d') as any)\n .tickSize(0)\n const weekTicks = d3.timeWeek.every(1)!.range(d3.timeWeek.floor(fromTime), d3.timeWeek.offset(toTime, 1))\n addGridLines(weekTicks, 0, 20)\n\n const weekAxisG = header\n .append('g')\n .classed('week-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 20)`)\n .call(weekAxis)\n\n centerLabel(weekAxisG, d3.timeWeek)\n\n const dayAxis = d3\n .axisTop(timeScale)\n .ticks(d3.timeDay.every(1))\n .tickFormat(d3.timeFormat('%d') as any)\n .tickSize(0)\n\n const dayTicks = d3.timeDay.every(1)!.range(d3.timeDay.floor(fromTime), d3.timeDay.offset(toTime, 1))\n addGridLines(dayTicks, 20, 40)\n\n const dayAxisG = header\n .append('g')\n .classed('day-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 40)`)\n .call(dayAxis)\n\n centerLabel(dayAxisG, d3.timeDay)\n } else if (level === 'quarter-week') {\n const quarterAxis = d3\n .axisTop(timeScale)\n .ticks(d3.timeMonth.every(3))\n .tickFormat(d3.timeFormat('%Y %b') as any)\n .tickSize(0)\n\n const quarterTicks = d3.timeMonth.every(3)!.range(d3.timeMonth.floor(fromTime), d3.timeMonth.offset(toTime, 3))\n addGridLines(quarterTicks, 0, 20)\n\n const quarterAxisG = header\n .append('g')\n .classed('quarter-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 20)`)\n .call(quarterAxis)\n\n centerLabel(quarterAxisG, d3.timeMonth.every(3) as any)\n\n const weekAxis = d3\n .axisTop(timeScale)\n .ticks(d3.timeWeek.every(1))\n .tickFormat(d3.timeFormat('%b %d') as any)\n .tickSize(0)\n const weekTicks = d3.timeWeek.every(1)!.range(d3.timeWeek.floor(fromTime), d3.timeWeek.offset(toTime, 1))\n addGridLines(weekTicks, 20, 40)\n\n const weekAxisG = header\n .append('g')\n .classed('week-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 40)`)\n .call(weekAxis)\n\n centerLabel(weekAxisG, d3.timeWeek)\n } else if (level === 'year-month') {\n const yearAxis = d3\n .axisTop(timeScale)\n .ticks(d3.timeYear.every(1))\n .tickFormat(d3.timeFormat('%Y') as any)\n .tickSize(0)\n\n const yearTicks = d3.timeYear.every(1)!.range(d3.timeYear.floor(fromTime), d3.timeYear.offset(toTime, 1))\n addGridLines(yearTicks, 0, 20)\n\n const yearAxisG = header\n .append('g')\n .classed('year-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 20)`)\n .call(yearAxis)\n\n centerLabel(yearAxisG, d3.timeYear.every(1)! as any)\n\n const monthAxis = d3\n .axisTop(timeScale)\n .ticks(d3.timeMonth.every(1))\n .tickFormat(d3.timeFormat('%b') as any)\n .tickSize(0)\n\n const monthTicks = d3.timeMonth.every(1)!.range(d3.timeMonth.floor(fromTime), d3.timeMonth.offset(toTime, 1))\n addGridLines(monthTicks, 20, 40)\n\n const monthAxisG = header\n .append('g')\n .classed('month-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 40)`)\n .call(monthAxis)\n\n centerLabel(monthAxisG, d3.timeMonth.every(1) as any)\n } else if (level === 'year-quarter') {\n const yearAxis = d3\n .axisTop(timeScale)\n .ticks(d3.timeYear.every(1))\n .tickFormat(d3.timeFormat('%Y') as any)\n .tickSize(0)\n\n const yearTicks = d3.timeYear.every(1)!.range(d3.timeYear.floor(fromTime), d3.timeYear.offset(toTime, 1))\n addGridLines(yearTicks, 0, 20)\n\n const yearAxisG = header\n .append('g')\n .classed('year-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 20)`)\n .call(yearAxis)\n\n centerLabel(yearAxisG, d3.timeYear.every(1)! as any)\n\n const quarterAxis = d3\n .axisTop(timeScale)\n .ticks(d3.timeMonth.every(3))\n .tickFormat(d3.timeFormat('%Y %b') as any)\n .tickSize(0)\n\n const quarterTicks = d3.timeMonth.every(3)!.range(d3.timeMonth.floor(fromTime), d3.timeMonth.offset(toTime, 3))\n addGridLines(quarterTicks, 20, 40)\n\n const quarterAxisG = header\n .append('g')\n .classed('quarter-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 40)`)\n .call(quarterAxis)\n\n centerLabel(quarterAxisG, d3.timeMonth.every(3) as any)\n }\n}\n\nexport function getChartWidth(fromTime: Date, toTime: Date, baseWidth: number, level: TimeScale): number {\n const totalDays = d3.timeDay.count(fromTime, d3.timeDay.offset(toTime, 1))\n return (totalDays * baseWidth) / getScale(level)\n}\n\nexport function getScale(level: TimeScale): number {\n if (level === 'quarter-week') {\n return 7 / 2\n } else if (level === 'year-month') {\n return 30 / 2\n } else if (level === 'year-quarter') {\n return 90 / 2\n }\n return 1\n}\n"]}
@@ -21,8 +21,8 @@ export declare class GanttChartController implements ReactiveController {
21
21
  updateRange(fromDate: string, toDate: string): void;
22
22
  setTasks(tasks: Task[]): void;
23
23
  updateTimeScale(): void;
24
- getChartWidth(): number;
25
24
  getScale(): number;
25
+ getChartWidth(): number;
26
26
  drawAxes(svgHeader: SVGElement): void;
27
27
  drawBody(svgBody: SVGElement, tooltip: OxTaskTooltip): void;
28
28
  getTaskColor(tags: TaskTag[]): string;
@@ -1,4 +1,5 @@
1
1
  import * as d3 from 'd3';
2
+ import { drawTimeScaleHeader, getScale, getChartWidth } from './draw-time-scale-header';
2
3
  export class GanttChartController {
3
4
  constructor(host, fromDate, toDate, axisScale) {
4
5
  this.baseWidth = 30;
@@ -37,170 +38,14 @@ export class GanttChartController {
37
38
  updateTimeScale() {
38
39
  this.timeScale.range([0, this.getChartWidth()]);
39
40
  }
40
- getChartWidth() {
41
- return (this.totalDays * this.baseWidth) / this.getScale();
42
- }
43
41
  getScale() {
44
- if (this.level == 'quarter-week') {
45
- return 7 / 2;
46
- }
47
- else if (this.level == 'year-month') {
48
- return 30 / 2;
49
- }
50
- else if (this.level == 'year-quarter') {
51
- return 90 / 2;
52
- }
53
- return 1;
42
+ return getScale(this.level);
43
+ }
44
+ getChartWidth() {
45
+ return getChartWidth(this.fromTime, this.toTime, this.baseWidth, this.level);
54
46
  }
55
47
  drawAxes(svgHeader) {
56
- const header = d3.select(svgHeader);
57
- header.selectAll('*').remove();
58
- header.attr('width', this.getChartWidth());
59
- const addGridLines = (ticks, yStart, yEnd) => {
60
- ticks.forEach(tick => {
61
- const startX = this.timeScale(tick);
62
- header
63
- .append('line')
64
- .attr('x1', startX)
65
- .attr('x2', startX)
66
- .attr('y1', yStart)
67
- .attr('y2', yEnd)
68
- .attr('stroke', 'var(--ox-gantt-color-gridlines, var(--md-sys-color-on-secondary-container))')
69
- .attr('stroke-width', 1);
70
- });
71
- };
72
- const centerLabel = (selection, tickInterval) => {
73
- selection.selectAll('text').attr('transform', (d) => {
74
- const tickIntervalWidth = this.timeScale(tickInterval.offset(d, 1)) - this.timeScale(d);
75
- return `translate(${tickIntervalWidth / 2}, -2)`;
76
- });
77
- };
78
- if (this.level === 'week-day') {
79
- const weekAxis = d3
80
- .axisTop(this.timeScale)
81
- .ticks(d3.timeWeek.every(1))
82
- .tickFormat(d3.timeFormat('%B %d'))
83
- .tickSize(0);
84
- const weekTicks = d3.timeWeek
85
- .every(1)
86
- .range(d3.timeWeek.floor(this.fromTime), d3.timeWeek.offset(this.toTime, 1));
87
- addGridLines(weekTicks, 0, 20);
88
- const weekAxisG = header
89
- .append('g')
90
- .classed('week-axis no-select md-typescale-label-small', true)
91
- .attr('transform', `translate(0, 20)`)
92
- .call(weekAxis);
93
- centerLabel(weekAxisG, d3.timeWeek);
94
- const dayAxis = d3
95
- .axisTop(this.timeScale)
96
- .ticks(d3.timeDay.every(1))
97
- .tickFormat(d3.timeFormat('%d'))
98
- .tickSize(0);
99
- const dayTicks = d3.timeDay.every(1).range(d3.timeDay.floor(this.fromTime), d3.timeDay.offset(this.toTime, 1));
100
- addGridLines(dayTicks, 20, 40);
101
- const dayAxisG = header
102
- .append('g')
103
- .classed('day-axis no-select md-typescale-label-small', true)
104
- .attr('transform', `translate(0, 40)`)
105
- .call(dayAxis);
106
- centerLabel(dayAxisG, d3.timeDay);
107
- }
108
- else if (this.level === 'quarter-week') {
109
- const quarterAxis = d3
110
- .axisTop(this.timeScale)
111
- .ticks(d3.timeMonth.every(3))
112
- .tickFormat(d3.timeFormat('%Y %b'))
113
- .tickSize(0);
114
- const quarterTicks = d3.timeMonth
115
- .every(3)
116
- .range(d3.timeMonth.floor(this.fromTime), d3.timeMonth.offset(this.toTime, 3));
117
- addGridLines(quarterTicks, 0, 20);
118
- const quarterAxisG = header
119
- .append('g')
120
- .classed('quarter-axis no-select md-typescale-label-small', true)
121
- .attr('transform', `translate(0, 20)`)
122
- .call(quarterAxis);
123
- centerLabel(quarterAxisG, d3.timeMonth.every(3));
124
- const weekAxis = d3
125
- .axisTop(this.timeScale)
126
- .ticks(d3.timeWeek.every(1))
127
- .tickFormat(d3.timeFormat('%b %d'))
128
- .tickSize(0);
129
- const weekTicks = d3.timeWeek
130
- .every(1)
131
- .range(d3.timeWeek.floor(this.fromTime), d3.timeWeek.offset(this.toTime, 1));
132
- addGridLines(weekTicks, 20, 40);
133
- const weekAxisG = header
134
- .append('g')
135
- .classed('week-axis no-select md-typescale-label-small', true)
136
- .attr('transform', `translate(0, 40)`)
137
- .call(weekAxis);
138
- centerLabel(weekAxisG, d3.timeWeek);
139
- }
140
- else if (this.level === 'year-month') {
141
- const yearAxis = d3
142
- .axisTop(this.timeScale)
143
- .ticks(d3.timeYear.every(1))
144
- .tickFormat(d3.timeFormat('%Y'))
145
- .tickSize(0);
146
- const yearTicks = d3.timeYear
147
- .every(1)
148
- .range(d3.timeYear.floor(this.fromTime), d3.timeYear.offset(this.toTime, 1));
149
- addGridLines(yearTicks, 0, 20);
150
- const yearAxisG = header
151
- .append('g')
152
- .classed('year-axis no-select md-typescale-label-small', true)
153
- .attr('transform', `translate(0, 20)`)
154
- .call(yearAxis);
155
- centerLabel(yearAxisG, d3.timeYear.every(1));
156
- const monthAxis = d3
157
- .axisTop(this.timeScale)
158
- .ticks(d3.timeMonth.every(1))
159
- .tickFormat(d3.timeFormat('%b'))
160
- .tickSize(0);
161
- const monthTicks = d3.timeMonth
162
- .every(1)
163
- .range(d3.timeMonth.floor(this.fromTime), d3.timeMonth.offset(this.toTime, 1));
164
- addGridLines(monthTicks, 20, 40);
165
- const monthAxisG = header
166
- .append('g')
167
- .classed('month-axis no-select md-typescale-label-small', true)
168
- .attr('transform', `translate(0, 40)`)
169
- .call(monthAxis);
170
- centerLabel(monthAxisG, d3.timeMonth.every(1));
171
- }
172
- else if (this.level === 'year-quarter') {
173
- const yearAxis = d3
174
- .axisTop(this.timeScale)
175
- .ticks(d3.timeYear.every(1))
176
- .tickFormat(d3.timeFormat('%Y'))
177
- .tickSize(0);
178
- const yearTicks = d3.timeYear
179
- .every(1)
180
- .range(d3.timeYear.floor(this.fromTime), d3.timeYear.offset(this.toTime, 1));
181
- addGridLines(yearTicks, 0, 20);
182
- const yearAxisG = header
183
- .append('g')
184
- .classed('year-axis no-select md-typescale-label-small', true)
185
- .attr('transform', `translate(0, 20)`)
186
- .call(yearAxis);
187
- centerLabel(yearAxisG, d3.timeYear.every(1));
188
- const quarterAxis = d3
189
- .axisTop(this.timeScale)
190
- .ticks(d3.timeMonth.every(3))
191
- .tickFormat(d3.timeFormat('%Y %b'))
192
- .tickSize(0);
193
- const quarterTicks = d3.timeMonth
194
- .every(3)
195
- .range(d3.timeMonth.floor(this.fromTime), d3.timeMonth.offset(this.toTime, 3));
196
- addGridLines(quarterTicks, 20, 40);
197
- const quarterAxisG = header
198
- .append('g')
199
- .classed('quarter-axis no-select md-typescale-label-small', true)
200
- .attr('transform', `translate(0, 40)`)
201
- .call(quarterAxis);
202
- centerLabel(quarterAxisG, d3.timeMonth.every(3));
203
- }
48
+ drawTimeScaleHeader(svgHeader, this.timeScale, this.fromTime, this.toTime, this.baseWidth, this.level);
204
49
  }
205
50
  drawBody(svgBody, tooltip) {
206
51
  const body = d3.select(svgBody);
@@ -1 +1 @@
1
- {"version":3,"file":"gantt-chart-controller.js","sourceRoot":"","sources":["../../src/gantt-chart-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, ReactiveController, ReactiveControllerHost } from 'lit'\nimport * as d3 from 'd3'\nimport { TimeScale, Task, TaskTag } from './types'\nimport { OxTaskTooltip } from './ox-task-tooltip'\n\nexport class GanttChartController implements ReactiveController {\n private host: ReactiveControllerHost & LitElement\n private fromTime: Date\n private toTime: Date\n private totalDays: number\n private _timeScale?: d3.ScaleTime<number, number, never>\n\n private touchStartY?: number\n private scrollStartY?: number\n\n public baseWidth: number = 30\n public level: TimeScale\n public selectedTaskId?: string\n\n public tasks: Task[] = []\n public extendGridLines: boolean = false\n\n constructor(host: ReactiveControllerHost & LitElement, fromDate: string, toDate: string, axisScale: TimeScale) {\n this.host = host\n this.fromTime = new Date(fromDate)\n this.toTime = new Date(toDate)\n this.level = axisScale\n this.totalDays = d3.timeDay.count(this.fromTime, d3.timeDay.offset(this.toTime, 1))\n this.host.addController(this)\n }\n\n hostConnected() {\n this.updateTimeScale()\n }\n\n get timeScale() {\n if (!this._timeScale) {\n this._timeScale = d3\n .scaleTime()\n .domain([d3.timeDay.floor(this.fromTime), d3.timeDay.offset(this.toTime, 1)])\n .range([0, this.getChartWidth()])\n }\n return this._timeScale\n }\n\n updateRange(fromDate: string, toDate: string) {\n this.fromTime = new Date(fromDate)\n this.toTime = new Date(toDate)\n this.totalDays = d3.timeDay.count(this.fromTime, d3.timeDay.offset(this.toTime, 1))\n this._timeScale = undefined\n this.host.requestUpdate()\n }\n\n setTasks(tasks: Task[]) {\n this.tasks = tasks\n this.host.requestUpdate()\n }\n\n updateTimeScale() {\n this.timeScale.range([0, this.getChartWidth()])\n }\n\n getChartWidth() {\n return (this.totalDays * this.baseWidth) / this.getScale()\n }\n\n getScale() {\n if (this.level == 'quarter-week') {\n return 7 / 2\n } else if (this.level == 'year-month') {\n return 30 / 2\n } else if (this.level == 'year-quarter') {\n return 90 / 2\n }\n return 1\n }\n\n drawAxes(svgHeader: SVGElement) {\n const header = d3.select(svgHeader)\n\n header.selectAll('*').remove()\n header.attr('width', this.getChartWidth())\n\n const addGridLines = (ticks: Date[], yStart: number, yEnd: number) => {\n ticks.forEach(tick => {\n const startX = this.timeScale(tick)\n header\n .append('line')\n .attr('x1', startX)\n .attr('x2', startX)\n .attr('y1', yStart)\n .attr('y2', yEnd)\n .attr('stroke', 'var(--ox-gantt-color-gridlines, var(--md-sys-color-on-secondary-container))')\n .attr('stroke-width', 1)\n })\n }\n\n const centerLabel = (\n selection: d3.Selection<SVGGElement, unknown, null, any>,\n tickInterval: d3.CountableTimeInterval\n ) => {\n selection.selectAll('text').attr('transform', (d: any) => {\n const tickIntervalWidth = this.timeScale(tickInterval.offset(d, 1)) - this.timeScale(d)\n return `translate(${tickIntervalWidth / 2}, -2)`\n })\n }\n\n if (this.level === 'week-day') {\n const weekAxis = d3\n .axisTop(this.timeScale)\n .ticks(d3.timeWeek.every(1))\n .tickFormat(d3.timeFormat('%B %d') as any)\n .tickSize(0)\n const weekTicks = d3.timeWeek\n .every(1)!\n .range(d3.timeWeek.floor(this.fromTime), d3.timeWeek.offset(this.toTime, 1))\n addGridLines(weekTicks, 0, 20)\n\n const weekAxisG = header\n .append('g')\n .classed('week-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 20)`)\n .call(weekAxis)\n\n centerLabel(weekAxisG, d3.timeWeek)\n\n const dayAxis = d3\n .axisTop(this.timeScale)\n .ticks(d3.timeDay.every(1))\n .tickFormat(d3.timeFormat('%d') as any)\n .tickSize(0)\n\n const dayTicks = d3.timeDay.every(1)!.range(d3.timeDay.floor(this.fromTime), d3.timeDay.offset(this.toTime, 1))\n addGridLines(dayTicks, 20, 40)\n\n const dayAxisG = header\n .append('g')\n .classed('day-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 40)`)\n .call(dayAxis)\n\n centerLabel(dayAxisG, d3.timeDay)\n } else if (this.level === 'quarter-week') {\n const quarterAxis = d3\n .axisTop(this.timeScale)\n .ticks(d3.timeMonth.every(3))\n .tickFormat(d3.timeFormat('%Y %b') as any)\n .tickSize(0)\n\n const quarterTicks = d3.timeMonth\n .every(3)!\n .range(d3.timeMonth.floor(this.fromTime), d3.timeMonth.offset(this.toTime, 3))\n addGridLines(quarterTicks, 0, 20)\n\n const quarterAxisG = header\n .append('g')\n .classed('quarter-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 20)`)\n .call(quarterAxis)\n\n centerLabel(quarterAxisG, d3.timeMonth.every(3) as any)\n\n const weekAxis = d3\n .axisTop(this.timeScale)\n .ticks(d3.timeWeek.every(1))\n .tickFormat(d3.timeFormat('%b %d') as any)\n .tickSize(0)\n const weekTicks = d3.timeWeek\n .every(1)!\n .range(d3.timeWeek.floor(this.fromTime), d3.timeWeek.offset(this.toTime, 1))\n addGridLines(weekTicks, 20, 40)\n\n const weekAxisG = header\n .append('g')\n .classed('week-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 40)`)\n .call(weekAxis)\n\n centerLabel(weekAxisG, d3.timeWeek)\n } else if (this.level === 'year-month') {\n const yearAxis = d3\n .axisTop(this.timeScale)\n .ticks(d3.timeYear.every(1))\n .tickFormat(d3.timeFormat('%Y') as any)\n .tickSize(0)\n\n const yearTicks = d3.timeYear\n .every(1)!\n .range(d3.timeYear.floor(this.fromTime), d3.timeYear.offset(this.toTime, 1))\n addGridLines(yearTicks, 0, 20)\n\n const yearAxisG = header\n .append('g')\n .classed('year-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 20)`)\n .call(yearAxis)\n\n centerLabel(yearAxisG, d3.timeYear.every(1)! as any)\n\n const monthAxis = d3\n .axisTop(this.timeScale)\n .ticks(d3.timeMonth.every(1))\n .tickFormat(d3.timeFormat('%b') as any)\n .tickSize(0)\n\n const monthTicks = d3.timeMonth\n .every(1)!\n .range(d3.timeMonth.floor(this.fromTime), d3.timeMonth.offset(this.toTime, 1))\n addGridLines(monthTicks, 20, 40)\n\n const monthAxisG = header\n .append('g')\n .classed('month-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 40)`)\n .call(monthAxis)\n\n centerLabel(monthAxisG, d3.timeMonth.every(1) as any)\n } else if (this.level === 'year-quarter') {\n const yearAxis = d3\n .axisTop(this.timeScale)\n .ticks(d3.timeYear.every(1))\n .tickFormat(d3.timeFormat('%Y') as any)\n .tickSize(0)\n\n const yearTicks = d3.timeYear\n .every(1)!\n .range(d3.timeYear.floor(this.fromTime), d3.timeYear.offset(this.toTime, 1))\n addGridLines(yearTicks, 0, 20)\n\n const yearAxisG = header\n .append('g')\n .classed('year-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 20)`)\n .call(yearAxis)\n\n centerLabel(yearAxisG, d3.timeYear.every(1)! as any)\n\n const quarterAxis = d3\n .axisTop(this.timeScale)\n .ticks(d3.timeMonth.every(3))\n .tickFormat(d3.timeFormat('%Y %b') as any)\n .tickSize(0)\n\n const quarterTicks = d3.timeMonth\n .every(3)!\n .range(d3.timeMonth.floor(this.fromTime), d3.timeMonth.offset(this.toTime, 3))\n addGridLines(quarterTicks, 20, 40)\n\n const quarterAxisG = header\n .append('g')\n .classed('quarter-axis no-select md-typescale-label-small', true)\n .attr('transform', `translate(0, 40)`)\n .call(quarterAxis)\n\n centerLabel(quarterAxisG, d3.timeMonth.every(3) as any)\n }\n }\n\n drawBody(svgBody: SVGElement, tooltip: OxTaskTooltip) {\n const body = d3.select(svgBody)\n\n body.selectAll('*').remove()\n body.attr('width', this.getChartWidth())\n\n if (this.extendGridLines) {\n const addGridLines = (ticks: Date[]) => {\n ticks.forEach(tick => {\n const startX = this.timeScale(tick)\n body\n .append('line')\n .attr('x1', startX)\n .attr('x2', startX)\n .attr('y1', 0)\n .attr('y2', Number(svgBody.getBoundingClientRect().height) || 0)\n .attr('stroke', 'var(--ox-gantt-color-gridlines, var(--md-sys-color-outline))')\n .attr('stroke-width', 1)\n })\n }\n\n if (this.level === 'week-day') {\n const dayTicks = d3.timeDay.every(1)!.range(d3.timeDay.floor(this.fromTime), d3.timeDay.offset(this.toTime, 1))\n addGridLines(dayTicks)\n } else if (this.level === 'quarter-week') {\n const weekTicks = d3.timeWeek\n .every(1)!\n .range(d3.timeWeek.floor(this.fromTime), d3.timeWeek.offset(this.toTime, 1))\n addGridLines(weekTicks)\n } else if (this.level === 'year-month') {\n const monthTicks = d3.timeMonth\n .every(1)!\n .range(d3.timeMonth.floor(this.fromTime), d3.timeMonth.offset(this.toTime, 1))\n addGridLines(monthTicks)\n } else if (this.level === 'year-quarter') {\n const quarterTicks = d3.timeMonth\n .every(3)!\n .range(d3.timeMonth.floor(this.fromTime), d3.timeMonth.offset(this.toTime, 3))\n addGridLines(quarterTicks)\n }\n }\n\n const taskPositions: { [key: string]: { x: number; y: number; width: number } } = {}\n\n this.tasks.forEach((task, index) => {\n const startDate = new Date(task.startDate)\n const endDate = new Date(task.endDate)\n\n const startX = this.timeScale(d3.timeDay.floor(d3.min([startDate, endDate])!))\n const endX = this.timeScale(d3.timeDay.offset(d3.timeDay.ceil(d3.max([startDate, endDate])!), -1))\n\n const taskWidth = endX - startX + this.baseWidth / this.getScale()\n const taskY = index * 30 + 7.5\n\n const showTooltip = (event: MouseEvent) => {\n tooltip.title = task.title\n tooltip.startDate = startDate.toISOString().split('T')[0]\n tooltip.endDate = endDate.toISOString().split('T')[0]\n tooltip.progress = task.progress ?? 0\n tooltip.type = task.type\n\n tooltip.show(event.clientX, event.clientY)\n }\n\n const hideTooltip = () => {\n tooltip.hide()\n }\n\n if (this.selectedTaskId === task.id) {\n body\n .append('rect')\n .attr('x', 0)\n .attr('y', taskY - 7.5)\n .attr('width', this.getChartWidth())\n .attr('height', 30)\n .attr('fill', 'var(--ox-gantt-selected-row-background-color, var(--md-sys-color-surface-variant))')\n }\n\n const taskBar = body\n .append('rect')\n .attr('x', startX)\n .attr('y', taskY)\n .attr('width', taskWidth)\n .attr('height', 15)\n .attr('fill', this.getTaskColor(task.tags || []))\n .attr('stroke', 'black')\n .attr('stroke-width', 1)\n\n taskBar\n .on('click', () => {\n this.selectedTaskId = task.id\n const customEvent = new CustomEvent('task-clicked', {\n detail: { taskId: task.id },\n bubbles: true,\n composed: true\n })\n this.host.dispatchEvent(customEvent)\n this.host.requestUpdate()\n })\n .on('mouseover', showTooltip)\n .on('mouseout', hideTooltip)\n\n if (task.progress !== undefined) {\n const progressWidth = taskWidth * (task.progress / 100)\n const progressBar = body\n .append('rect')\n .attr('x', startX)\n .attr('y', taskY + 7.5 - 3.75)\n .attr('width', progressWidth)\n .attr('height', 7.5)\n .attr('fill', 'lightgreen')\n\n progressBar\n .on('click', () => {\n this.selectedTaskId = task.id\n const customEvent = new CustomEvent('task-clicked', {\n detail: { taskId: task.id },\n bubbles: true,\n composed: true\n })\n this.host.dispatchEvent(customEvent)\n this.host.requestUpdate()\n })\n .on('mouseover', showTooltip)\n .on('mouseout', hideTooltip)\n }\n\n taskPositions[task.id] = { x: endX + this.baseWidth / this.getScale(), y: taskY + 7.5, width: taskWidth }\n })\n\n this.tasks.forEach(task => {\n if (task.dependsOn && taskPositions[task.dependsOn]) {\n const prevTask = taskPositions[task.dependsOn]\n const currTask = taskPositions[task.id]\n\n body\n .append('path')\n .attr(\n 'd',\n `\n M${prevTask.x},${prevTask.y}\n L${prevTask.x + 10},${prevTask.y}\n ${\n prevTask.x + 10 < currTask.x - 10 - currTask.width\n ? `\n L${(prevTask.x + currTask.x - currTask.width) / 2},${prevTask.y}\n L${(prevTask.x + currTask.x - currTask.width) / 2},${currTask.y}\n `\n : `\n L${prevTask.x + 10},${(prevTask.y + currTask.y) / 2}\n L${currTask.x - 10 - currTask.width},${(prevTask.y + currTask.y) / 2}\n `\n }\n L${currTask.x - 10 - currTask.width},${currTask.y}\n L${currTask.x - currTask.width},${currTask.y}\n `\n )\n .attr('stroke', 'black')\n .attr('fill', 'none')\n .attr('stroke-width', 1)\n }\n })\n }\n\n getTaskColor(tags: TaskTag[]): string {\n if (tags.includes('critical')) {\n return 'red'\n } else if (tags.includes('milestone')) {\n return 'blue'\n } else if (tags.includes('done')) {\n return 'green'\n } else {\n return 'grey'\n }\n }\n\n handleWheelForBody(event: WheelEvent, container: HTMLDivElement) {\n event.preventDefault()\n event.stopPropagation()\n\n if (event.altKey || event.ctrlKey || event.shiftKey || event.metaKey) {\n container.scrollLeft += event.shiftKey ? event.deltaX : event.deltaY\n } else {\n container.scrollTop += event.deltaY\n }\n\n const customEvent = new CustomEvent('scroll', {\n detail: { offset: event.shiftKey ? container.scrollLeft : container.scrollTop },\n bubbles: true,\n composed: true\n })\n\n this.host.dispatchEvent(customEvent)\n }\n\n handleTouchStartForBody(event: TouchEvent, container: HTMLDivElement) {\n event.stopPropagation()\n\n this.touchStartY = event.touches[0].clientY\n this.scrollStartY = container.scrollTop\n }\n\n handleTouchMoveForBody(event: TouchEvent, container: HTMLDivElement) {\n const touchCurrentY = event.touches[0].clientY\n const deltaY = this.touchStartY! - touchCurrentY\n container.scrollTop = this.scrollStartY! + deltaY\n\n const customEvent = new CustomEvent('scroll', {\n detail: { offset: container.scrollTop },\n bubbles: true,\n composed: true\n })\n this.host.dispatchEvent(customEvent)\n }\n}\n"]}
1
+ {"version":3,"file":"gantt-chart-controller.js","sourceRoot":"","sources":["../../src/gantt-chart-controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AAGxB,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAEvF,MAAM,OAAO,oBAAoB;IAiB/B,YAAY,IAAyC,EAAE,QAAgB,EAAE,MAAc,EAAE,SAAoB;QAPtG,cAAS,GAAW,EAAE,CAAA;QAItB,UAAK,GAAW,EAAE,CAAA;QAClB,oBAAe,GAAY,KAAK,CAAA;QAGrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAA;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAA;QACtB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QACnF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,eAAe,EAAE,CAAA;IACxB,CAAC;IAED,IAAI,SAAS;QACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,EAAE;iBACjB,SAAS,EAAE;iBACX,MAAM,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;iBAC5E,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;QACrC,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED,WAAW,CAAC,QAAgB,EAAE,MAAc;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAA;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QACnF,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAA;IAC3B,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAA;IAC3B,CAAC;IAED,eAAe;QACb,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;IACjD,CAAC;IAED,QAAQ;QACN,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,aAAa;QACX,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9E,CAAC;IAED,QAAQ,CAAC,SAAqB;QAC5B,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACxG,CAAC;IAED,QAAQ,CAAC,OAAmB,EAAE,OAAsB;QAClD,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAE/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAA;QAExC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE;gBACrC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACnB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;oBACnC,IAAI;yBACD,MAAM,CAAC,MAAM,CAAC;yBACd,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;yBAClB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;yBAClB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;yBACb,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;yBAC/D,IAAI,CAAC,QAAQ,EAAE,8DAA8D,CAAC;yBAC9E,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;gBAC5B,CAAC,CAAC,CAAA;YACJ,CAAC,CAAA;YAED,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;gBAC/G,YAAY,CAAC,QAAQ,CAAC,CAAA;YACxB,CAAC;iBAAM,IAAI,IAAI,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ;qBAC1B,KAAK,CAAC,CAAC,CAAE;qBACT,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;gBAC9E,YAAY,CAAC,SAAS,CAAC,CAAA;YACzB,CAAC;iBAAM,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;gBACvC,MAAM,UAAU,GAAG,EAAE,CAAC,SAAS;qBAC5B,KAAK,CAAC,CAAC,CAAE;qBACT,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;gBAChF,YAAY,CAAC,UAAU,CAAC,CAAA;YAC1B,CAAC;iBAAM,IAAI,IAAI,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;gBACzC,MAAM,YAAY,GAAG,EAAE,CAAC,SAAS;qBAC9B,KAAK,CAAC,CAAC,CAAE;qBACT,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;gBAChF,YAAY,CAAC,YAAY,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAA+D,EAAE,CAAA;QAEpF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACjC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC1C,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAEtC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAE,CAAC,CAAC,CAAA;YAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAElG,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;YAClE,MAAM,KAAK,GAAG,KAAK,GAAG,EAAE,GAAG,GAAG,CAAA;YAE9B,MAAM,WAAW,GAAG,CAAC,KAAiB,EAAE,EAAE;gBACxC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;gBAC1B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;gBACzD,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;gBACrD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAA;gBACrC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;gBAExB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;YAC5C,CAAC,CAAA;YAED,MAAM,WAAW,GAAG,GAAG,EAAE;gBACvB,OAAO,CAAC,IAAI,EAAE,CAAA;YAChB,CAAC,CAAA;YAED,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;gBACpC,IAAI;qBACD,MAAM,CAAC,MAAM,CAAC;qBACd,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;qBACZ,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,GAAG,CAAC;qBACtB,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;qBACnC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;qBAClB,IAAI,CAAC,MAAM,EAAE,oFAAoF,CAAC,CAAA;YACvG,CAAC;YAED,MAAM,OAAO,GAAG,IAAI;iBACjB,MAAM,CAAC,MAAM,CAAC;iBACd,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;iBACjB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;iBAChB,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;iBACxB,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;iBAClB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;iBAChD,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;iBACvB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;YAE1B,OAAO;iBACJ,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAChB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,CAAA;gBAC7B,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,cAAc,EAAE;oBAClD,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;oBAC3B,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAA;gBACF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAA;gBACpC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAA;YAC3B,CAAC,CAAC;iBACD,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;iBAC5B,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;YAE9B,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,aAAa,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAA;gBACvD,MAAM,WAAW,GAAG,IAAI;qBACrB,MAAM,CAAC,MAAM,CAAC;qBACd,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;qBACjB,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;qBAC7B,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;qBAC5B,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;qBACnB,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;gBAE7B,WAAW;qBACR,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBAChB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,CAAA;oBAC7B,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,cAAc,EAAE;wBAClD,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;wBAC3B,OAAO,EAAE,IAAI;wBACb,QAAQ,EAAE,IAAI;qBACf,CAAC,CAAA;oBACF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAA;oBACpC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAA;gBAC3B,CAAC,CAAC;qBACD,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;qBAC5B,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;YAChC,CAAC;YAED,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;QAC3G,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACxB,IAAI,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAEvC,IAAI;qBACD,MAAM,CAAC,MAAM,CAAC;qBACd,IAAI,CACH,GAAG,EACH;iBACK,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;iBACxB,QAAQ,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,CAAC;gBAE9B,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK;oBAChD,CAAC,CAAC;mBACD,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC;mBAC5D,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC;eAChE;oBACG,CAAC,CAAC;qBACC,QAAQ,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;qBAChD,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;eAExE;iBACG,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC;iBAC9C,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC;aAC7C,CACF;qBACA,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;qBACvB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;qBACpB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,YAAY,CAAC,IAAe;QAC1B,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAA;QACd,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACtC,OAAO,MAAM,CAAA;QACf,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,OAAO,OAAO,CAAA;QAChB,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,KAAiB,EAAE,SAAyB;QAC7D,KAAK,CAAC,cAAc,EAAE,CAAA;QACtB,KAAK,CAAC,eAAe,EAAE,CAAA;QAEvB,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACrE,SAAS,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA;QACtE,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,CAAA;QACrC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE;YAC5C,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE;YAC/E,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QAEF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAA;IACtC,CAAC;IAED,uBAAuB,CAAC,KAAiB,EAAE,SAAyB;QAClE,KAAK,CAAC,eAAe,EAAE,CAAA;QAEvB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;QAC3C,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,SAAS,CAAA;IACzC,CAAC;IAED,sBAAsB,CAAC,KAAiB,EAAE,SAAyB;QACjE,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAY,GAAG,aAAa,CAAA;QAChD,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,YAAa,GAAG,MAAM,CAAA;QAEjD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE;YAC5C,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE;YACvC,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAA;IACtC,CAAC;CACF","sourcesContent":["import { LitElement, ReactiveController, ReactiveControllerHost } from 'lit'\nimport * as d3 from 'd3'\nimport { TimeScale, Task, TaskTag } from './types'\nimport { OxTaskTooltip } from './ox-task-tooltip'\nimport { drawTimeScaleHeader, getScale, getChartWidth } from './draw-time-scale-header'\n\nexport class GanttChartController implements ReactiveController {\n private host: ReactiveControllerHost & LitElement\n private fromTime: Date\n private toTime: Date\n private totalDays: number\n private _timeScale?: d3.ScaleTime<number, number, never>\n\n private touchStartY?: number\n private scrollStartY?: number\n\n public baseWidth: number = 30\n public level: TimeScale\n public selectedTaskId?: string\n\n public tasks: Task[] = []\n public extendGridLines: boolean = false\n\n constructor(host: ReactiveControllerHost & LitElement, fromDate: string, toDate: string, axisScale: TimeScale) {\n this.host = host\n this.fromTime = new Date(fromDate)\n this.toTime = new Date(toDate)\n this.level = axisScale\n this.totalDays = d3.timeDay.count(this.fromTime, d3.timeDay.offset(this.toTime, 1))\n this.host.addController(this)\n }\n\n hostConnected() {\n this.updateTimeScale()\n }\n\n get timeScale() {\n if (!this._timeScale) {\n this._timeScale = d3\n .scaleTime()\n .domain([d3.timeDay.floor(this.fromTime), d3.timeDay.offset(this.toTime, 1)])\n .range([0, this.getChartWidth()])\n }\n return this._timeScale\n }\n\n updateRange(fromDate: string, toDate: string) {\n this.fromTime = new Date(fromDate)\n this.toTime = new Date(toDate)\n this.totalDays = d3.timeDay.count(this.fromTime, d3.timeDay.offset(this.toTime, 1))\n this._timeScale = undefined\n this.host.requestUpdate()\n }\n\n setTasks(tasks: Task[]) {\n this.tasks = tasks\n this.host.requestUpdate()\n }\n\n updateTimeScale() {\n this.timeScale.range([0, this.getChartWidth()])\n }\n\n getScale() {\n return getScale(this.level)\n }\n\n getChartWidth() {\n return getChartWidth(this.fromTime, this.toTime, this.baseWidth, this.level)\n }\n\n drawAxes(svgHeader: SVGElement) {\n drawTimeScaleHeader(svgHeader, this.timeScale, this.fromTime, this.toTime, this.baseWidth, this.level)\n }\n\n drawBody(svgBody: SVGElement, tooltip: OxTaskTooltip) {\n const body = d3.select(svgBody)\n\n body.selectAll('*').remove()\n body.attr('width', this.getChartWidth())\n\n if (this.extendGridLines) {\n const addGridLines = (ticks: Date[]) => {\n ticks.forEach(tick => {\n const startX = this.timeScale(tick)\n body\n .append('line')\n .attr('x1', startX)\n .attr('x2', startX)\n .attr('y1', 0)\n .attr('y2', Number(svgBody.getBoundingClientRect().height) || 0)\n .attr('stroke', 'var(--ox-gantt-color-gridlines, var(--md-sys-color-outline))')\n .attr('stroke-width', 1)\n })\n }\n\n if (this.level === 'week-day') {\n const dayTicks = d3.timeDay.every(1)!.range(d3.timeDay.floor(this.fromTime), d3.timeDay.offset(this.toTime, 1))\n addGridLines(dayTicks)\n } else if (this.level === 'quarter-week') {\n const weekTicks = d3.timeWeek\n .every(1)!\n .range(d3.timeWeek.floor(this.fromTime), d3.timeWeek.offset(this.toTime, 1))\n addGridLines(weekTicks)\n } else if (this.level === 'year-month') {\n const monthTicks = d3.timeMonth\n .every(1)!\n .range(d3.timeMonth.floor(this.fromTime), d3.timeMonth.offset(this.toTime, 1))\n addGridLines(monthTicks)\n } else if (this.level === 'year-quarter') {\n const quarterTicks = d3.timeMonth\n .every(3)!\n .range(d3.timeMonth.floor(this.fromTime), d3.timeMonth.offset(this.toTime, 3))\n addGridLines(quarterTicks)\n }\n }\n\n const taskPositions: { [key: string]: { x: number; y: number; width: number } } = {}\n\n this.tasks.forEach((task, index) => {\n const startDate = new Date(task.startDate)\n const endDate = new Date(task.endDate)\n\n const startX = this.timeScale(d3.timeDay.floor(d3.min([startDate, endDate])!))\n const endX = this.timeScale(d3.timeDay.offset(d3.timeDay.ceil(d3.max([startDate, endDate])!), -1))\n\n const taskWidth = endX - startX + this.baseWidth / this.getScale()\n const taskY = index * 30 + 7.5\n\n const showTooltip = (event: MouseEvent) => {\n tooltip.title = task.title\n tooltip.startDate = startDate.toISOString().split('T')[0]\n tooltip.endDate = endDate.toISOString().split('T')[0]\n tooltip.progress = task.progress ?? 0\n tooltip.type = task.type\n\n tooltip.show(event.clientX, event.clientY)\n }\n\n const hideTooltip = () => {\n tooltip.hide()\n }\n\n if (this.selectedTaskId === task.id) {\n body\n .append('rect')\n .attr('x', 0)\n .attr('y', taskY - 7.5)\n .attr('width', this.getChartWidth())\n .attr('height', 30)\n .attr('fill', 'var(--ox-gantt-selected-row-background-color, var(--md-sys-color-surface-variant))')\n }\n\n const taskBar = body\n .append('rect')\n .attr('x', startX)\n .attr('y', taskY)\n .attr('width', taskWidth)\n .attr('height', 15)\n .attr('fill', this.getTaskColor(task.tags || []))\n .attr('stroke', 'black')\n .attr('stroke-width', 1)\n\n taskBar\n .on('click', () => {\n this.selectedTaskId = task.id\n const customEvent = new CustomEvent('task-clicked', {\n detail: { taskId: task.id },\n bubbles: true,\n composed: true\n })\n this.host.dispatchEvent(customEvent)\n this.host.requestUpdate()\n })\n .on('mouseover', showTooltip)\n .on('mouseout', hideTooltip)\n\n if (task.progress !== undefined) {\n const progressWidth = taskWidth * (task.progress / 100)\n const progressBar = body\n .append('rect')\n .attr('x', startX)\n .attr('y', taskY + 7.5 - 3.75)\n .attr('width', progressWidth)\n .attr('height', 7.5)\n .attr('fill', 'lightgreen')\n\n progressBar\n .on('click', () => {\n this.selectedTaskId = task.id\n const customEvent = new CustomEvent('task-clicked', {\n detail: { taskId: task.id },\n bubbles: true,\n composed: true\n })\n this.host.dispatchEvent(customEvent)\n this.host.requestUpdate()\n })\n .on('mouseover', showTooltip)\n .on('mouseout', hideTooltip)\n }\n\n taskPositions[task.id] = { x: endX + this.baseWidth / this.getScale(), y: taskY + 7.5, width: taskWidth }\n })\n\n this.tasks.forEach(task => {\n if (task.dependsOn && taskPositions[task.dependsOn]) {\n const prevTask = taskPositions[task.dependsOn]\n const currTask = taskPositions[task.id]\n\n body\n .append('path')\n .attr(\n 'd',\n `\n M${prevTask.x},${prevTask.y}\n L${prevTask.x + 10},${prevTask.y}\n ${\n prevTask.x + 10 < currTask.x - 10 - currTask.width\n ? `\n L${(prevTask.x + currTask.x - currTask.width) / 2},${prevTask.y}\n L${(prevTask.x + currTask.x - currTask.width) / 2},${currTask.y}\n `\n : `\n L${prevTask.x + 10},${(prevTask.y + currTask.y) / 2}\n L${currTask.x - 10 - currTask.width},${(prevTask.y + currTask.y) / 2}\n `\n }\n L${currTask.x - 10 - currTask.width},${currTask.y}\n L${currTask.x - currTask.width},${currTask.y}\n `\n )\n .attr('stroke', 'black')\n .attr('fill', 'none')\n .attr('stroke-width', 1)\n }\n })\n }\n\n getTaskColor(tags: TaskTag[]): string {\n if (tags.includes('critical')) {\n return 'red'\n } else if (tags.includes('milestone')) {\n return 'blue'\n } else if (tags.includes('done')) {\n return 'green'\n } else {\n return 'grey'\n }\n }\n\n handleWheelForBody(event: WheelEvent, container: HTMLDivElement) {\n event.preventDefault()\n event.stopPropagation()\n\n if (event.altKey || event.ctrlKey || event.shiftKey || event.metaKey) {\n container.scrollLeft += event.shiftKey ? event.deltaX : event.deltaY\n } else {\n container.scrollTop += event.deltaY\n }\n\n const customEvent = new CustomEvent('scroll', {\n detail: { offset: event.shiftKey ? container.scrollLeft : container.scrollTop },\n bubbles: true,\n composed: true\n })\n\n this.host.dispatchEvent(customEvent)\n }\n\n handleTouchStartForBody(event: TouchEvent, container: HTMLDivElement) {\n event.stopPropagation()\n\n this.touchStartY = event.touches[0].clientY\n this.scrollStartY = container.scrollTop\n }\n\n handleTouchMoveForBody(event: TouchEvent, container: HTMLDivElement) {\n const touchCurrentY = event.touches[0].clientY\n const deltaY = this.touchStartY! - touchCurrentY\n container.scrollTop = this.scrollStartY! + deltaY\n\n const customEvent = new CustomEvent('scroll', {\n detail: { offset: container.scrollTop },\n bubbles: true,\n composed: true\n })\n this.host.dispatchEvent(customEvent)\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
- import './ox-task-tooltip';
1
+ import './ox-task-tooltip.js';
2
+ import './ox-resource-chart.js';
2
3
  import { LitElement, PropertyValues, PropertyValueMap } from 'lit';
3
4
  import { Task, TimeScale } from './types.js';
4
5
  import { OxTaskTooltip } from './ox-task-tooltip.js';
@@ -20,9 +21,13 @@ export declare class OxGanttChart extends LitElement {
20
21
  protected firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
21
22
  updated(changedProperties: PropertyValues<this>): void;
22
23
  render(): import("lit-html").TemplateResult<1>;
24
+ flattenTasks(tasks: Task[], level?: number): Task[];
23
25
  setVerticalOffset(offset: number): void;
24
26
  getVerticalOffset(): number;
27
+ setHorizontalOffset(offset: number): void;
28
+ getHorizontalOffset(): number;
25
29
  handleWheelForHeader(event: WheelEvent): void;
30
+ handleDateRangeSelected(event: CustomEvent): void;
26
31
  updateLocale(locale: string): void;
27
32
  initHeaderGestureHandlers(): void;
28
33
  highlightSelection(startX: number, endX: number): void;