@operato/gantt 8.0.0-beta.2 → 8.0.0

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.
@@ -2,27 +2,14 @@ import { __decorate } from "tslib";
2
2
  import './ox-task-tooltip.js';
3
3
  import './ox-resource-chart.js';
4
4
  import { LitElement, html, css } from 'lit';
5
- import { customElement, property, query, state } from 'lit/decorators.js';
5
+ import { customElement, property, query } from 'lit/decorators.js';
6
6
  import * as d3 from 'd3';
7
7
  import { locales } from './locales';
8
8
  import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles';
9
9
  import { ScrollbarStyles } from '@operato/styles';
10
10
  import { GanttChartController } from './gantt-chart-controller';
11
11
  import { levelDown, levelUp } from './utils';
12
- import { gesture } from '@operato/utils/gesture-mixin.js';
13
- let OxGanttChart = class OxGanttChart extends gesture(LitElement) {
14
- constructor() {
15
- super(...arguments);
16
- this.fromDate = new Date(new Date().getFullYear(), 0, 1)
17
- .toISOString()
18
- .split('T')[0];
19
- this.toDate = new Date(new Date().getFullYear(), 11, 31)
20
- .toISOString()
21
- .split('T')[0];
22
- this.axisScale = 'week-day';
23
- this.tasks = [];
24
- this.locale = 'en-US';
25
- }
12
+ let OxGanttChart = class OxGanttChart extends LitElement {
26
13
  static { this.styles = [
27
14
  MDTypeScaleStyles,
28
15
  ScrollbarStyles,
@@ -31,21 +18,15 @@ let OxGanttChart = class OxGanttChart extends gesture(LitElement) {
31
18
  display: flex;
32
19
  overflow: hidden;
33
20
  position: relative;
34
- user-select: none;
35
21
  }
36
-
37
22
  div[chart-container] {
38
23
  display: block;
39
24
  overflow-x: auto;
40
25
  overflow-y: hidden;
41
- overscroll-behavior: none;
42
- touch-action: none;
43
26
  }
44
-
45
27
  svg {
46
28
  min-width: 100%;
47
29
  }
48
-
49
30
  svg[header] {
50
31
  display: block;
51
32
  min-width: 100%;
@@ -58,56 +39,53 @@ let OxGanttChart = class OxGanttChart extends gesture(LitElement) {
58
39
  top: 0;
59
40
  z-index: 1;
60
41
  }
61
-
62
- .scroll-button {
42
+ .scroll-buttons {
63
43
  position: absolute;
64
- top: 46px; /* 헤더 바로 아래 위치 */
65
- width: 14px;
66
- height: 14px;
44
+ top: 44px; /* 헤더 바로 아래 위치 */
45
+ right: 4px;
46
+ display: flex;
47
+ align-items: center;
48
+ gap: 2px;
49
+ }
50
+ .scroll-button {
51
+ width: 10px;
52
+ height: 10px;
67
53
  background-color: var(--ox-gantt-header-color, var(--md-sys-color-on-secondary-container));
68
- opacity: 0.5;
69
54
  clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
70
55
  cursor: pointer;
71
56
  transform: rotate(90deg);
72
57
  }
73
-
74
58
  .scroll-button.left {
75
- left: 6px;
76
59
  transform: rotate(-90deg);
77
60
  }
78
-
79
61
  .scroll-button.right {
80
62
  transform: rotate(90deg);
81
- right: 6px;
82
63
  }
83
64
  `
84
65
  ]; }
85
- firstUpdated(_changedProperties) {
86
- this.initHeaderGestureHandlers();
87
- // this.addEventListener('date-range-cleared', e => this.clearSelection())
88
- }
89
- connectedCallback() {
90
- super.connectedCallback();
66
+ constructor() {
67
+ super();
68
+ this.fromDate = new Date(new Date().getFullYear(), 0, 1)
69
+ .toISOString()
70
+ .split('T')[0];
71
+ this.toDate = new Date(new Date().getFullYear(), 11, 31)
72
+ .toISOString()
73
+ .split('T')[0];
74
+ this.axisScale = 'week-day';
75
+ this.tasks = [];
76
+ this.locale = 'en-US';
91
77
  this.ganttChartController = new GanttChartController(this, this.fromDate, this.toDate, this.axisScale);
92
- this.addEventListener('pinch', this.ganttChartController.handlePinchForBody);
93
- this.addEventListener('drag', this.ganttChartController.handleDragForBody);
94
- this.addEventListener('doubletap', this.ganttChartController.handleDoubleTapForBody);
95
78
  }
96
- disconnectedCallback() {
97
- super.disconnectedCallback();
98
- this.removeEventListener('pinch', this.ganttChartController.handlePinchForBody);
99
- this.removeEventListener('drag', this.ganttChartController.handleDragForBody);
100
- this.removeEventListener('doubletap', this.ganttChartController.handleDoubleTapForBody);
101
- this.ganttChartController.dispose();
79
+ firstUpdated(_changedProperties) {
80
+ this.initHeaderGestureHandlers();
102
81
  }
103
82
  updated(changedProperties) {
104
83
  if (changedProperties.has('fromDate') || changedProperties.has('toDate')) {
105
84
  this.ganttChartController.updateRange(this.fromDate, this.toDate);
106
85
  }
107
86
  if (changedProperties.has('tasks')) {
108
- const flattenTasks = this.flattenTasks(this.tasks);
109
- this.ganttChartController.setTasks(flattenTasks);
110
- this.svgBody.style.height = Math.max(flattenTasks.length * 30, 2000) + 'px';
87
+ this.ganttChartController.setTasks(this.flattenTasks(this.tasks));
88
+ this.svgBody.style.height = Math.max(this.tasks.length * 30, 2000) + 'px';
111
89
  }
112
90
  if (changedProperties.has('locale')) {
113
91
  this.updateLocale(this.locale);
@@ -124,15 +102,25 @@ let OxGanttChart = class OxGanttChart extends gesture(LitElement) {
124
102
  }
125
103
  this.ganttChartController.drawAxes(this.svgHeader);
126
104
  this.ganttChartController.drawBody(this.svgBody, this.tooltip);
127
- this.drawSelectedRange();
128
105
  }
129
106
  render() {
130
107
  return html `
131
- <div chart-container @wheel=${(e) => this.ganttChartController.handleWheelForBody(e, this.container)}>
132
- <svg header @wheel=${this.handleWheelForHeader.bind(this)}></svg>
108
+ <div
109
+ chart-container
110
+ @wheel=${(e) => this.ganttChartController.handleWheelForBody(e, this.container)}
111
+ @touchstart=${(e) => this.ganttChartController.handleTouchStartForBody(e, this.container)}
112
+ @touchmove=${(e) => this.ganttChartController.handleTouchMoveForBody(e, this.container)}
113
+ >
114
+ <svg
115
+ header
116
+ @date-range-selected=${(e) => this.handleDateRangeSelected(e)}
117
+ @wheel=${this.handleWheelForHeader.bind(this)}
118
+ ></svg>
133
119
  <svg body></svg>
134
- <div class="scroll-button left" @click=${this.scrollToStart} @touchstart=${this.scrollToStart}></div>
135
- <div class="scroll-button right" @click=${this.scrollToEnd} @touchstart=${this.scrollToEnd}></div>
120
+ <div class="scroll-buttons">
121
+ <div class="scroll-button left" @click=${this.scrollToStart}></div>
122
+ <div class="scroll-button right" @click=${this.scrollToEnd}></div>
123
+ </div>
136
124
  <ox-task-tooltip></ox-task-tooltip>
137
125
  </div>
138
126
  `;
@@ -215,6 +203,10 @@ let OxGanttChart = class OxGanttChart extends gesture(LitElement) {
215
203
  });
216
204
  this.dispatchEvent(customEvent);
217
205
  }
206
+ handleDateRangeSelected(event) {
207
+ const detail = event.detail;
208
+ this.dispatchEvent(new CustomEvent('date-range-selected', { detail }));
209
+ }
218
210
  updateLocale(locale) {
219
211
  const localeDefinition = locales[locale || 'en-US'];
220
212
  if (localeDefinition) {
@@ -224,35 +216,125 @@ let OxGanttChart = class OxGanttChart extends gesture(LitElement) {
224
216
  }
225
217
  initHeaderGestureHandlers() {
226
218
  const header = d3.select(this.svgHeader);
219
+ let isDragging = false;
227
220
  let startX = null;
228
- const handlePointerDown = (event) => {
221
+ let lastTouchDistance = null;
222
+ const handleTouchStart = (event) => {
223
+ event.preventDefault();
224
+ if (event.touches.length === 2) {
225
+ lastTouchDistance = getTouchDistance(event.touches);
226
+ }
227
+ else {
228
+ isDragging = true;
229
+ const touch = event.touches[0];
230
+ const containerOffsetX = header.node().getBoundingClientRect().left;
231
+ startX = touch.clientX - containerOffsetX;
232
+ }
233
+ };
234
+ const handleTouchMove = (event) => {
229
235
  event.preventDefault();
230
- event.stopPropagation();
236
+ if (event.touches.length === 2 && lastTouchDistance !== null) {
237
+ const currentDistance = getTouchDistance(event.touches);
238
+ const zoomFactor = currentDistance / lastTouchDistance;
239
+ this.ganttChartController.baseWidth *= zoomFactor;
240
+ if (this.ganttChartController.baseWidth > 60) {
241
+ if (this.ganttChartController.level == 'year-quarter') {
242
+ this.ganttChartController.baseWidth = 60;
243
+ }
244
+ else {
245
+ this.ganttChartController.level = levelUp(this.ganttChartController.level);
246
+ this.ganttChartController.baseWidth = 30;
247
+ }
248
+ }
249
+ else if (this.ganttChartController.baseWidth < 30) {
250
+ if (this.ganttChartController.level == 'week-day') {
251
+ this.ganttChartController.baseWidth = 30;
252
+ }
253
+ else {
254
+ this.ganttChartController.level = levelDown(this.ganttChartController.level);
255
+ this.ganttChartController.baseWidth = 60;
256
+ }
257
+ }
258
+ lastTouchDistance = currentDistance;
259
+ this.ganttChartController.updateTimeScale();
260
+ this.requestUpdate();
261
+ // Dispatch custom event to sync with ox-resource-chart
262
+ const customEvent = new CustomEvent('timescale-changed', {
263
+ detail: {
264
+ baseWidth: this.ganttChartController.baseWidth,
265
+ level: this.ganttChartController.level
266
+ },
267
+ bubbles: true,
268
+ composed: true
269
+ });
270
+ this.dispatchEvent(customEvent);
271
+ }
272
+ else if (isDragging && startX !== null) {
273
+ const touch = event.touches[0];
274
+ const containerOffsetX = header.node().getBoundingClientRect().left;
275
+ const currentX = touch.clientX - containerOffsetX;
276
+ this.highlightSelection(startX, currentX);
277
+ }
278
+ };
279
+ const handleTouchEnd = (event) => {
280
+ event.preventDefault();
281
+ if (event.touches.length < 2) {
282
+ lastTouchDistance = null;
283
+ }
284
+ if (!isDragging || startX === null) {
285
+ const touch = event.changedTouches[0];
286
+ const containerOffsetX = header.node().getBoundingClientRect().left;
287
+ const clickX = touch.clientX - containerOffsetX;
288
+ this.finalizeSelection(clickX, clickX);
289
+ return;
290
+ }
291
+ const touch = event.changedTouches[0];
292
+ const containerOffsetX = header.node().getBoundingClientRect().left;
293
+ const endX = touch.clientX - containerOffsetX;
294
+ this.finalizeSelection(startX, endX);
295
+ isDragging = false;
296
+ startX = null;
297
+ };
298
+ const getTouchDistance = (touches) => {
299
+ const dx = touches[0].clientX - touches[1].clientX;
300
+ const dy = touches[0].clientY - touches[1].clientY;
301
+ return Math.sqrt(dx * dx + dy * dy);
302
+ };
303
+ const handleMouseDown = (event) => {
304
+ isDragging = true;
231
305
  const containerOffsetX = header.node().getBoundingClientRect().left;
232
306
  startX = event.clientX - containerOffsetX;
233
- window.addEventListener('pointermove', handlePointerMove);
234
- window.addEventListener('pointerup', handlePointerUp);
235
307
  };
236
- const handlePointerMove = (event) => {
237
- event.preventDefault();
238
- event.stopPropagation();
308
+ const handleMouseMove = (event) => {
309
+ if (!isDragging || startX === null)
310
+ return;
239
311
  const containerOffsetX = header.node().getBoundingClientRect().left;
240
312
  const currentX = event.clientX - containerOffsetX;
241
313
  this.highlightSelection(startX, currentX);
242
314
  };
243
- const handlePointerUp = (event) => {
244
- event.preventDefault();
245
- event.stopPropagation();
246
- window.removeEventListener('pointermove', handlePointerMove);
247
- window.removeEventListener('pointerup', handlePointerUp);
315
+ const handleMouseUp = (event) => {
316
+ if (!isDragging || startX === null) {
317
+ const containerOffsetX = header.node().getBoundingClientRect().left;
318
+ const clickX = event.clientX - containerOffsetX;
319
+ this.finalizeSelection(clickX, clickX);
320
+ return;
321
+ }
248
322
  const containerOffsetX = header.node().getBoundingClientRect().left;
249
323
  const endX = event.clientX - containerOffsetX;
250
324
  this.finalizeSelection(startX, endX);
325
+ isDragging = false;
251
326
  startX = null;
252
327
  };
253
- header.on('pointerdown', handlePointerDown);
328
+ header.on('mousedown', handleMouseDown);
329
+ header.on('mousemove', handleMouseMove);
330
+ header.on('mouseup', handleMouseUp);
331
+ header.on('touchstart', handleTouchStart);
332
+ header.on('touchmove', handleTouchMove);
333
+ header.on('touchend', handleTouchEnd);
254
334
  }
255
335
  highlightSelection(startX, endX) {
336
+ const header = d3.select(this.svgHeader);
337
+ const body = d3.select(this.svgBody);
256
338
  let startDate = this.ganttChartController.timeScale.invert(startX);
257
339
  let endDate = this.ganttChartController.timeScale.invert(endX);
258
340
  let start, end;
@@ -272,9 +354,34 @@ let OxGanttChart = class OxGanttChart extends gesture(LitElement) {
272
354
  start = d3.timeMonth.every(3).floor(d3.min([startDate, endDate]));
273
355
  end = d3.timeDay.offset(d3.timeMonth.every(3).ceil(d3.max([startDate, endDate])), -1);
274
356
  }
275
- this.dateRangeSelected = { start: start, end: end };
357
+ header.selectAll('.selection-rect').remove();
358
+ body.selectAll('.selection-rect').remove();
359
+ header
360
+ .append('rect')
361
+ .attr('class', 'selection-rect')
362
+ .attr('x', this.ganttChartController.timeScale(start))
363
+ .attr('y', 20)
364
+ .attr('width', this.ganttChartController.timeScale(end) -
365
+ this.ganttChartController.timeScale(start) +
366
+ this.ganttChartController.baseWidth / this.ganttChartController.getScale())
367
+ .attr('height', 20)
368
+ .attr('fill', 'var(--ox-gantt-selection-color, var(--md-sys-color-on-primary-container))')
369
+ .attr('opacity', '.2');
370
+ body
371
+ .append('rect')
372
+ .attr('class', 'selection-rect')
373
+ .attr('x', this.ganttChartController.timeScale(start))
374
+ .attr('y', 0)
375
+ .attr('width', this.ganttChartController.timeScale(end) -
376
+ this.ganttChartController.timeScale(start) +
377
+ this.ganttChartController.baseWidth / this.ganttChartController.getScale())
378
+ .attr('height', '100%')
379
+ .attr('fill', 'var(--ox-gantt-selection-color, var(--md-sys-color-on-primary-container))')
380
+ .attr('opacity', '.2');
276
381
  }
277
382
  finalizeSelection(startX, endX) {
383
+ const header = d3.select(this.svgHeader);
384
+ const body = d3.select(this.svgBody);
278
385
  let startDate = this.ganttChartController.timeScale.invert(startX);
279
386
  let endDate = this.ganttChartController.timeScale.invert(endX);
280
387
  let start, end;
@@ -294,21 +401,6 @@ let OxGanttChart = class OxGanttChart extends gesture(LitElement) {
294
401
  start = d3.timeMonth.every(3).floor(d3.min([startDate, endDate]));
295
402
  end = d3.timeDay.offset(d3.timeMonth.every(3).ceil(d3.max([startDate, endDate])), -1);
296
403
  }
297
- this.dateRangeSelected = { start: start, end: end };
298
- const formatDate = d3.timeFormat('%Y-%m-%d');
299
- this.dispatchEvent(new CustomEvent('date-range-selected', {
300
- detail: { start: formatDate(start), end: formatDate(end) },
301
- bubbles: true,
302
- composed: true
303
- }));
304
- }
305
- drawSelectedRange() {
306
- if (!this.dateRangeSelected) {
307
- return;
308
- }
309
- let { start, end } = this.dateRangeSelected;
310
- const header = d3.select(this.svgHeader);
311
- const body = d3.select(this.svgBody);
312
404
  header.selectAll('.selection-rect').remove();
313
405
  body.selectAll('.selection-rect').remove();
314
406
  header
@@ -333,6 +425,11 @@ let OxGanttChart = class OxGanttChart extends gesture(LitElement) {
333
425
  .attr('height', '100%')
334
426
  .attr('fill', 'var(--ox-gantt-selection-color, var(--md-sys-color-on-primary-container))')
335
427
  .attr('opacity', '.2');
428
+ const formatDate = d3.timeFormat('%Y-%m-%d');
429
+ const customEvent = new CustomEvent('date-range-selected', {
430
+ detail: { start: formatDate(start), end: formatDate(end) }
431
+ });
432
+ header.node()?.dispatchEvent(customEvent);
336
433
  }
337
434
  };
338
435
  __decorate([
@@ -356,9 +453,6 @@ __decorate([
356
453
  __decorate([
357
454
  property({ type: Object })
358
455
  ], OxGanttChart.prototype, "colorProvider", void 0);
359
- __decorate([
360
- state()
361
- ], OxGanttChart.prototype, "dateRangeSelected", void 0);
362
456
  __decorate([
363
457
  query('svg[header]')
364
458
  ], OxGanttChart.prototype, "svgHeader", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"ox-gantt-chart.js","sourceRoot":"","sources":["../../src/ox-gantt-chart.ts"],"names":[],"mappings":"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","sourcesContent":["import './ox-task-tooltip.js'\nimport './ox-resource-chart.js'\n\nimport { LitElement, html, css, PropertyValues, PropertyValueMap } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport * as d3 from 'd3'\nimport { locales } from './locales'\n\nimport { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { GanttChartController } from './gantt-chart-controller'\nimport { Task, TimeScale } from './types.js'\nimport { levelDown, levelUp } from './utils'\nimport { OxTaskTooltip } from './ox-task-tooltip.js'\n\nimport { gesture } from '@operato/utils/gesture-mixin.js'\n\n@customElement('ox-gantt-chart')\nexport class OxGanttChart extends gesture(LitElement) {\n static styles = [\n MDTypeScaleStyles,\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n overflow: hidden;\n position: relative;\n user-select: none;\n }\n\n div[chart-container] {\n display: block;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior: none;\n touch-action: none;\n }\n\n svg {\n min-width: 100%;\n }\n\n svg[header] {\n display: block;\n min-width: 100%;\n box-sizing: border-box;\n height: 40px;\n color: var(--ox-gantt-header-color, var(--md-sys-color-on-secondary-container));\n background-color: var(--ox-gantt-header-background-color, var(--md-sys-color-secondary-container));\n border-bottom: 1px solid var(--ox-gantt-header-border-color, var(--md-sys-color-outline));\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n .scroll-button {\n position: absolute;\n top: 46px; /* 헤더 바로 아래 위치 */\n width: 14px;\n height: 14px;\n background-color: var(--ox-gantt-header-color, var(--md-sys-color-on-secondary-container));\n opacity: 0.5;\n clip-path: polygon(50% 0%, 0% 100%, 100% 100%);\n cursor: pointer;\n transform: rotate(90deg);\n }\n\n .scroll-button.left {\n left: 6px;\n transform: rotate(-90deg);\n }\n\n .scroll-button.right {\n transform: rotate(90deg);\n right: 6px;\n }\n `\n ]\n\n @property({ type: String, attribute: 'from-date' }) fromDate: string = new Date(new Date().getFullYear(), 0, 1)\n .toISOString()\n .split('T')[0]\n @property({ type: String, attribute: 'to-date' }) toDate: string = new Date(new Date().getFullYear(), 11, 31)\n .toISOString()\n .split('T')[0]\n @property({ type: String, attribute: 'axis-scale' }) axisScale: TimeScale = 'week-day'\n @property({ type: Array }) tasks: Task[] = []\n @property({ type: String, attribute: 'selected-task-id' }) selectedTaskId?: string\n @property({ type: String }) locale: string = 'en-US'\n @property({ type: Object }) colorProvider!: (task: Task) => string\n\n @state() dateRangeSelected?: { start: Date; end: Date }\n\n @query('svg[header]') svgHeader!: SVGElement\n @query('svg[body]') svgBody!: SVGElement\n @query('[chart-container]') container!: HTMLDivElement\n @query('ox-task-tooltip') tooltip!: OxTaskTooltip\n\n private ganttChartController!: GanttChartController\n\n protected firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n this.initHeaderGestureHandlers()\n\n // this.addEventListener('date-range-cleared', e => this.clearSelection())\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n this.ganttChartController = new GanttChartController(this, this.fromDate, this.toDate, this.axisScale)\n\n this.addEventListener('pinch', this.ganttChartController.handlePinchForBody as EventListener)\n this.addEventListener('drag', this.ganttChartController.handleDragForBody as EventListener)\n this.addEventListener('doubletap', this.ganttChartController.handleDoubleTapForBody as EventListener)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n\n this.removeEventListener('pinch', this.ganttChartController.handlePinchForBody as EventListener)\n this.removeEventListener('drag', this.ganttChartController.handleDragForBody as EventListener)\n this.removeEventListener('doubletap', this.ganttChartController.handleDoubleTapForBody as EventListener)\n\n this.ganttChartController.dispose()\n }\n\n updated(changedProperties: PropertyValues<this>) {\n if (changedProperties.has('fromDate') || changedProperties.has('toDate')) {\n this.ganttChartController.updateRange(this.fromDate, this.toDate)\n }\n\n if (changedProperties.has('tasks')) {\n const flattenTasks = this.flattenTasks(this.tasks)\n this.ganttChartController.setTasks(flattenTasks)\n this.svgBody.style.height = Math.max(flattenTasks.length * 30, 2000) + 'px'\n }\n\n if (changedProperties.has('locale')) {\n this.updateLocale(this.locale)\n }\n\n if (changedProperties.has('selectedTaskId')) {\n this.ganttChartController.selectedTaskId = this.selectedTaskId\n }\n\n if (changedProperties.has('axisScale')) {\n this.ganttChartController.level = this.axisScale\n this.ganttChartController.updateTimeScale()\n }\n\n if (changedProperties.has('colorProvider')) {\n this.ganttChartController.setColorProvider(this.colorProvider)\n }\n\n this.ganttChartController.drawAxes(this.svgHeader)\n this.ganttChartController.drawBody(this.svgBody, this.tooltip)\n this.drawSelectedRange()\n }\n\n render() {\n return html`\n <div chart-container @wheel=${(e: WheelEvent) => this.ganttChartController.handleWheelForBody(e, this.container)}>\n <svg header @wheel=${this.handleWheelForHeader.bind(this)}></svg>\n <svg body></svg>\n <div class=\"scroll-button left\" @click=${this.scrollToStart} @touchstart=${this.scrollToStart}></div>\n <div class=\"scroll-button right\" @click=${this.scrollToEnd} @touchstart=${this.scrollToEnd}></div>\n <ox-task-tooltip></ox-task-tooltip>\n </div>\n `\n }\n\n scrollToStart() {\n this.container.scrollTo({ left: 0, behavior: 'auto' })\n\n this.syncScrollPosition()\n }\n\n scrollToEnd() {\n this.container.scrollTo({ left: this.container.scrollWidth, behavior: 'auto' })\n this.syncScrollPosition()\n }\n\n syncScrollPosition() {\n const scrollLeft = this.container.scrollLeft\n const customEvent = new CustomEvent('scroll', {\n detail: { scrollLeft },\n bubbles: true,\n composed: true\n })\n\n this.dispatchEvent(customEvent)\n }\n\n setVerticalOffset(offset: number) {\n this.container.scrollTop = offset\n }\n\n getVerticalOffset(): number {\n return this.container.scrollTop\n }\n\n setHorizontalOffset(offset: number) {\n this.container.scrollLeft = offset\n }\n\n getHorizontalOffset(): number {\n return this.container.scrollLeft\n }\n\n flattenTasks(tasks: Task[], level: number = 0): Task[] {\n return tasks.flatMap(task =>\n task.collapsed ? [{ ...task, level }] : [{ ...task, level }, ...this.flattenTasks(task.children || [], level + 1)]\n )\n }\n\n // 나머지 메서드는 기존 코드와 동일하게 유지\n handleWheelForHeader(event: WheelEvent) {\n event.preventDefault()\n event.stopPropagation()\n\n const deltaModeFactor =\n event.deltaMode === WheelEvent.DOM_DELTA_LINE\n ? 16\n : event.deltaMode === WheelEvent.DOM_DELTA_PAGE\n ? this.container.clientHeight\n : 1\n\n // deltaY 값이 0인 경우, deltaX 값을 사용하여 확대/축소를 처리\n const delta = event.deltaY !== 0 ? event.deltaY : event.deltaX\n const adjustedDelta = delta * deltaModeFactor\n\n // 확대/축소 처리\n const zoomFactor = adjustedDelta < 0 ? 1.1 : 0.9\n this.ganttChartController.baseWidth *= zoomFactor\n\n if (this.ganttChartController.baseWidth > 40) {\n if (this.ganttChartController.level === 'week-day') {\n this.ganttChartController.baseWidth = 40\n } else {\n this.ganttChartController.level = levelDown(this.ganttChartController.level)\n this.ganttChartController.baseWidth = 30\n }\n } else if (this.ganttChartController.baseWidth < 30) {\n if (this.ganttChartController.level === 'year-quarter') {\n this.ganttChartController.baseWidth = 30\n }\n }\n\n if (this.ganttChartController.baseWidth < 20) {\n this.ganttChartController.level = levelUp(this.ganttChartController.level)\n this.ganttChartController.baseWidth = 30\n }\n\n this.ganttChartController.updateTimeScale()\n this.requestUpdate()\n\n // Dispatch custom event to sync with ox-resource-chart\n const customEvent = new CustomEvent('timescale-changed', {\n detail: {\n baseWidth: this.ganttChartController.baseWidth,\n level: this.ganttChartController.level\n },\n bubbles: true,\n composed: true\n })\n this.dispatchEvent(customEvent)\n }\n\n updateLocale(locale: string) {\n const localeDefinition = (locales as any)[locale || 'en-US']\n if (localeDefinition) {\n d3.timeFormatDefaultLocale(localeDefinition)\n this.ganttChartController.updateTimeScale()\n }\n }\n\n initHeaderGestureHandlers() {\n const header = d3.select(this.svgHeader)\n\n let startX: number | null = null\n\n const handlePointerDown = (event: PointerEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n const containerOffsetX = header.node()!.getBoundingClientRect().left\n startX = event.clientX - containerOffsetX\n\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', handlePointerUp)\n }\n\n const handlePointerMove = (event: PointerEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n const containerOffsetX = header.node()!.getBoundingClientRect().left\n const currentX = event.clientX - containerOffsetX\n\n this.highlightSelection(startX!, currentX)\n }\n\n const handlePointerUp = (event: PointerEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', handlePointerUp)\n\n const containerOffsetX = header.node()!.getBoundingClientRect().left\n const endX = event.clientX - containerOffsetX\n this.finalizeSelection(startX!, endX)\n\n startX = null\n }\n\n header.on('pointerdown', handlePointerDown)\n }\n\n highlightSelection(startX: number, endX: number) {\n let startDate = this.ganttChartController.timeScale.invert(startX)\n let endDate = this.ganttChartController.timeScale.invert(endX)\n\n let start, end\n\n if (this.ganttChartController.level === 'week-day') {\n start = d3.timeDay.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeDay.ceil(d3.max([startDate, endDate])!), -1)\n } else if (this.ganttChartController.level === 'quarter-week') {\n start = d3.timeWeek.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeWeek.ceil(d3.max([startDate, endDate])!), -1)\n } else if (this.ganttChartController.level === 'year-month') {\n start = d3.timeMonth.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeMonth.ceil(d3.max([startDate, endDate])!), -1)\n } else if (this.ganttChartController.level === 'year-quarter') {\n start = d3.timeMonth.every(3)!.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeMonth.every(3)!.ceil(d3.max([startDate, endDate])!), -1)\n }\n\n this.dateRangeSelected = { start: start!, end: end! }\n }\n\n finalizeSelection(startX: number, endX: number) {\n let startDate = this.ganttChartController.timeScale.invert(startX)\n let endDate = this.ganttChartController.timeScale.invert(endX)\n\n let start, end\n\n if (this.ganttChartController.level === 'week-day') {\n start = d3.timeDay.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeDay.ceil(d3.max([startDate, endDate])!), -1)\n } else if (this.ganttChartController.level === 'quarter-week') {\n start = d3.timeWeek.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeWeek.ceil(d3.max([startDate, endDate])!), -1)\n } else if (this.ganttChartController.level === 'year-month') {\n start = d3.timeMonth.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeMonth.ceil(d3.max([startDate, endDate])!), -1)\n } else if (this.ganttChartController.level === 'year-quarter') {\n start = d3.timeMonth.every(3)!.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeMonth.every(3)!.ceil(d3.max([startDate, endDate])!), -1)\n }\n\n this.dateRangeSelected = { start: start!, end: end! }\n\n const formatDate = d3.timeFormat('%Y-%m-%d')\n\n this.dispatchEvent(\n new CustomEvent('date-range-selected', {\n detail: { start: formatDate(start!), end: formatDate(end!) },\n bubbles: true,\n composed: true\n })\n )\n }\n\n drawSelectedRange() {\n if (!this.dateRangeSelected) {\n return\n }\n\n let { start, end } = this.dateRangeSelected\n\n const header = d3.select(this.svgHeader)\n const body = d3.select(this.svgBody)\n\n header.selectAll('.selection-rect').remove()\n body.selectAll('.selection-rect').remove()\n\n header\n .append('rect')\n .attr('class', 'selection-rect')\n .attr('x', this.ganttChartController.timeScale(start!))\n .attr('y', 20)\n .attr(\n 'width',\n this.ganttChartController.timeScale(end!) -\n this.ganttChartController.timeScale(start!) +\n this.ganttChartController.baseWidth / this.ganttChartController.getScale()\n )\n .attr('height', 20)\n .attr('fill', 'var(--ox-gantt-selection-color, var(--md-sys-color-on-primary-container))')\n .attr('opacity', '.2')\n\n body\n .append('rect')\n .attr('class', 'selection-rect')\n .attr('x', this.ganttChartController.timeScale(start!))\n .attr('y', 0)\n .attr(\n 'width',\n this.ganttChartController.timeScale(end!) -\n this.ganttChartController.timeScale(start!) +\n this.ganttChartController.baseWidth / this.ganttChartController.getScale()\n )\n .attr('height', '100%')\n .attr('fill', 'var(--ox-gantt-selection-color, var(--md-sys-color-on-primary-container))')\n .attr('opacity', '.2')\n }\n}\n"]}
1
+ {"version":3,"file":"ox-gantt-chart.js","sourceRoot":"","sources":["../../src/ox-gantt-chart.ts"],"names":[],"mappings":"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","sourcesContent":["import './ox-task-tooltip.js'\nimport './ox-resource-chart.js'\n\nimport { LitElement, html, css, PropertyValues, PropertyValueMap } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport * as d3 from 'd3'\nimport { locales } from './locales'\n\nimport { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { GanttChartController } from './gantt-chart-controller'\nimport { Task, TimeScale } from './types.js'\nimport { levelDown, levelUp } from './utils'\nimport { OxTaskTooltip } from './ox-task-tooltip.js'\n\n@customElement('ox-gantt-chart')\nexport class OxGanttChart extends LitElement {\n static styles = [\n MDTypeScaleStyles,\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n overflow: hidden;\n position: relative;\n }\n div[chart-container] {\n display: block;\n overflow-x: auto;\n overflow-y: hidden;\n }\n svg {\n min-width: 100%;\n }\n svg[header] {\n display: block;\n min-width: 100%;\n box-sizing: border-box;\n height: 40px;\n color: var(--ox-gantt-header-color, var(--md-sys-color-on-secondary-container));\n background-color: var(--ox-gantt-header-background-color, var(--md-sys-color-secondary-container));\n border-bottom: 1px solid var(--ox-gantt-header-border-color, var(--md-sys-color-outline));\n position: sticky;\n top: 0;\n z-index: 1;\n }\n .scroll-buttons {\n position: absolute;\n top: 44px; /* 헤더 바로 아래 위치 */\n right: 4px;\n display: flex;\n align-items: center;\n gap: 2px;\n }\n .scroll-button {\n width: 10px;\n height: 10px;\n background-color: var(--ox-gantt-header-color, var(--md-sys-color-on-secondary-container));\n clip-path: polygon(50% 0%, 0% 100%, 100% 100%);\n cursor: pointer;\n transform: rotate(90deg);\n }\n .scroll-button.left {\n transform: rotate(-90deg);\n }\n .scroll-button.right {\n transform: rotate(90deg);\n }\n `\n ]\n\n @property({ type: String, attribute: 'from-date' }) fromDate: string = new Date(new Date().getFullYear(), 0, 1)\n .toISOString()\n .split('T')[0]\n @property({ type: String, attribute: 'to-date' }) toDate: string = new Date(new Date().getFullYear(), 11, 31)\n .toISOString()\n .split('T')[0]\n @property({ type: String, attribute: 'axis-scale' }) axisScale: TimeScale = 'week-day'\n @property({ type: Array }) tasks: Task[] = []\n @property({ type: String, attribute: 'selected-task-id' }) selectedTaskId?: string\n @property({ type: String }) locale: string = 'en-US'\n @property({ type: Object }) colorProvider!: (task: Task) => string\n\n @query('svg[header]') svgHeader!: SVGElement\n @query('svg[body]') svgBody!: SVGElement\n @query('[chart-container]') container!: HTMLDivElement\n @query('ox-task-tooltip') tooltip!: OxTaskTooltip\n\n private ganttChartController: GanttChartController\n\n constructor() {\n super()\n this.ganttChartController = new GanttChartController(this, this.fromDate, this.toDate, this.axisScale)\n }\n\n protected firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n this.initHeaderGestureHandlers()\n }\n\n updated(changedProperties: PropertyValues<this>) {\n if (changedProperties.has('fromDate') || changedProperties.has('toDate')) {\n this.ganttChartController.updateRange(this.fromDate, this.toDate)\n }\n\n if (changedProperties.has('tasks')) {\n this.ganttChartController.setTasks(this.flattenTasks(this.tasks))\n this.svgBody.style.height = Math.max(this.tasks.length * 30, 2000) + 'px'\n }\n\n if (changedProperties.has('locale')) {\n this.updateLocale(this.locale)\n }\n\n if (changedProperties.has('selectedTaskId')) {\n this.ganttChartController.selectedTaskId = this.selectedTaskId\n }\n\n if (changedProperties.has('axisScale')) {\n this.ganttChartController.level = this.axisScale\n this.ganttChartController.updateTimeScale()\n }\n\n if (changedProperties.has('colorProvider')) {\n this.ganttChartController.setColorProvider(this.colorProvider)\n }\n\n this.ganttChartController.drawAxes(this.svgHeader)\n this.ganttChartController.drawBody(this.svgBody, this.tooltip)\n }\n\n render() {\n return html`\n <div\n chart-container\n @wheel=${(e: WheelEvent) => this.ganttChartController.handleWheelForBody(e, this.container)}\n @touchstart=${(e: TouchEvent) => this.ganttChartController.handleTouchStartForBody(e, this.container)}\n @touchmove=${(e: TouchEvent) => this.ganttChartController.handleTouchMoveForBody(e, this.container)}\n >\n <svg\n header\n @date-range-selected=${(e: CustomEvent) => this.handleDateRangeSelected(e)}\n @wheel=${this.handleWheelForHeader.bind(this)}\n ></svg>\n <svg body></svg>\n <div class=\"scroll-buttons\">\n <div class=\"scroll-button left\" @click=${this.scrollToStart}></div>\n <div class=\"scroll-button right\" @click=${this.scrollToEnd}></div>\n </div>\n <ox-task-tooltip></ox-task-tooltip>\n </div>\n `\n }\n\n scrollToStart() {\n this.container.scrollTo({ left: 0, behavior: 'auto' })\n\n this.syncScrollPosition()\n }\n\n scrollToEnd() {\n this.container.scrollTo({ left: this.container.scrollWidth, behavior: 'auto' })\n this.syncScrollPosition()\n }\n\n syncScrollPosition() {\n const scrollLeft = this.container.scrollLeft\n const customEvent = new CustomEvent('scroll', {\n detail: { scrollLeft },\n bubbles: true,\n composed: true\n })\n\n this.dispatchEvent(customEvent)\n }\n\n setVerticalOffset(offset: number) {\n this.container.scrollTop = offset\n }\n\n getVerticalOffset(): number {\n return this.container.scrollTop\n }\n\n setHorizontalOffset(offset: number) {\n this.container.scrollLeft = offset\n }\n\n getHorizontalOffset(): number {\n return this.container.scrollLeft\n }\n\n flattenTasks(tasks: Task[], level: number = 0): Task[] {\n return tasks.flatMap(task =>\n task.collapsed ? [{ ...task, level }] : [{ ...task, level }, ...this.flattenTasks(task.children || [], level + 1)]\n )\n }\n\n // 나머지 메서드는 기존 코드와 동일하게 유지\n handleWheelForHeader(event: WheelEvent) {\n event.preventDefault()\n event.stopPropagation()\n\n const deltaModeFactor =\n event.deltaMode === WheelEvent.DOM_DELTA_LINE\n ? 16\n : event.deltaMode === WheelEvent.DOM_DELTA_PAGE\n ? this.container.clientHeight\n : 1\n\n // deltaY 값이 0인 경우, deltaX 값을 사용하여 확대/축소를 처리\n const delta = event.deltaY !== 0 ? event.deltaY : event.deltaX\n const adjustedDelta = delta * deltaModeFactor\n\n // 확대/축소 처리\n const zoomFactor = adjustedDelta < 0 ? 1.1 : 0.9\n this.ganttChartController.baseWidth *= zoomFactor\n\n if (this.ganttChartController.baseWidth > 40) {\n if (this.ganttChartController.level === 'week-day') {\n this.ganttChartController.baseWidth = 40\n } else {\n this.ganttChartController.level = levelDown(this.ganttChartController.level)\n this.ganttChartController.baseWidth = 30\n }\n } else if (this.ganttChartController.baseWidth < 30) {\n if (this.ganttChartController.level === 'year-quarter') {\n this.ganttChartController.baseWidth = 30\n }\n }\n\n if (this.ganttChartController.baseWidth < 20) {\n this.ganttChartController.level = levelUp(this.ganttChartController.level)\n this.ganttChartController.baseWidth = 30\n }\n\n this.ganttChartController.updateTimeScale()\n this.requestUpdate()\n\n // Dispatch custom event to sync with ox-resource-chart\n const customEvent = new CustomEvent('timescale-changed', {\n detail: {\n baseWidth: this.ganttChartController.baseWidth,\n level: this.ganttChartController.level\n },\n bubbles: true,\n composed: true\n })\n this.dispatchEvent(customEvent)\n }\n\n handleDateRangeSelected(event: CustomEvent) {\n const detail = event.detail\n this.dispatchEvent(new CustomEvent('date-range-selected', { detail }))\n }\n\n updateLocale(locale: string) {\n const localeDefinition = (locales as any)[locale || 'en-US']\n if (localeDefinition) {\n d3.timeFormatDefaultLocale(localeDefinition)\n this.ganttChartController.updateTimeScale()\n }\n }\n\n initHeaderGestureHandlers() {\n const header = d3.select(this.svgHeader)\n\n let isDragging = false\n let startX: number | null = null\n let lastTouchDistance: number | null = null\n\n const handleTouchStart = (event: TouchEvent) => {\n event.preventDefault()\n\n if (event.touches.length === 2) {\n lastTouchDistance = getTouchDistance(event.touches)\n } else {\n isDragging = true\n const touch = event.touches[0]\n const containerOffsetX = header.node()!.getBoundingClientRect().left\n startX = touch.clientX - containerOffsetX\n }\n }\n\n const handleTouchMove = (event: TouchEvent) => {\n event.preventDefault()\n\n if (event.touches.length === 2 && lastTouchDistance !== null) {\n const currentDistance = getTouchDistance(event.touches)\n const zoomFactor = currentDistance / lastTouchDistance\n this.ganttChartController.baseWidth *= zoomFactor\n\n if (this.ganttChartController.baseWidth > 60) {\n if (this.ganttChartController.level == 'year-quarter') {\n this.ganttChartController.baseWidth = 60\n } else {\n this.ganttChartController.level = levelUp(this.ganttChartController.level)\n this.ganttChartController.baseWidth = 30\n }\n } else if (this.ganttChartController.baseWidth < 30) {\n if (this.ganttChartController.level == 'week-day') {\n this.ganttChartController.baseWidth = 30\n } else {\n this.ganttChartController.level = levelDown(this.ganttChartController.level)\n this.ganttChartController.baseWidth = 60\n }\n }\n\n lastTouchDistance = currentDistance\n this.ganttChartController.updateTimeScale()\n this.requestUpdate()\n\n // Dispatch custom event to sync with ox-resource-chart\n const customEvent = new CustomEvent('timescale-changed', {\n detail: {\n baseWidth: this.ganttChartController.baseWidth,\n level: this.ganttChartController.level\n },\n bubbles: true,\n composed: true\n })\n this.dispatchEvent(customEvent)\n } else if (isDragging && startX !== null) {\n const touch = event.touches[0]\n const containerOffsetX = header.node()!.getBoundingClientRect().left\n const currentX = touch.clientX - containerOffsetX\n this.highlightSelection(startX, currentX)\n }\n }\n\n const handleTouchEnd = (event: TouchEvent) => {\n event.preventDefault()\n\n if (event.touches.length < 2) {\n lastTouchDistance = null\n }\n\n if (!isDragging || startX === null) {\n const touch = event.changedTouches[0]\n const containerOffsetX = header.node()!.getBoundingClientRect().left\n const clickX = touch.clientX - containerOffsetX\n this.finalizeSelection(clickX, clickX)\n return\n }\n\n const touch = event.changedTouches[0]\n const containerOffsetX = header.node()!.getBoundingClientRect().left\n const endX = touch.clientX - containerOffsetX\n this.finalizeSelection(startX, endX)\n\n isDragging = false\n startX = null\n }\n\n const getTouchDistance = (touches: TouchList): number => {\n const dx = touches[0].clientX - touches[1].clientX\n const dy = touches[0].clientY - touches[1].clientY\n return Math.sqrt(dx * dx + dy * dy)\n }\n\n const handleMouseDown = (event: MouseEvent) => {\n isDragging = true\n const containerOffsetX = header.node()!.getBoundingClientRect().left\n startX = event.clientX - containerOffsetX\n }\n\n const handleMouseMove = (event: MouseEvent) => {\n if (!isDragging || startX === null) return\n\n const containerOffsetX = header.node()!.getBoundingClientRect().left\n const currentX = event.clientX - containerOffsetX\n this.highlightSelection(startX, currentX)\n }\n\n const handleMouseUp = (event: MouseEvent) => {\n if (!isDragging || startX === null) {\n const containerOffsetX = header.node()!.getBoundingClientRect().left\n const clickX = event.clientX - containerOffsetX\n this.finalizeSelection(clickX, clickX)\n return\n }\n\n const containerOffsetX = header.node()!.getBoundingClientRect().left\n const endX = event.clientX - containerOffsetX\n this.finalizeSelection(startX, endX)\n\n isDragging = false\n startX = null\n }\n\n header.on('mousedown', handleMouseDown)\n header.on('mousemove', handleMouseMove)\n header.on('mouseup', handleMouseUp)\n header.on('touchstart', handleTouchStart)\n header.on('touchmove', handleTouchMove)\n header.on('touchend', handleTouchEnd)\n }\n\n highlightSelection(startX: number, endX: number) {\n const header = d3.select(this.svgHeader)\n const body = d3.select(this.svgBody)\n\n let startDate = this.ganttChartController.timeScale.invert(startX)\n let endDate = this.ganttChartController.timeScale.invert(endX)\n\n let start, end\n\n if (this.ganttChartController.level === 'week-day') {\n start = d3.timeDay.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeDay.ceil(d3.max([startDate, endDate])!), -1)\n } else if (this.ganttChartController.level === 'quarter-week') {\n start = d3.timeWeek.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeWeek.ceil(d3.max([startDate, endDate])!), -1)\n } else if (this.ganttChartController.level === 'year-month') {\n start = d3.timeMonth.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeMonth.ceil(d3.max([startDate, endDate])!), -1)\n } else if (this.ganttChartController.level === 'year-quarter') {\n start = d3.timeMonth.every(3)!.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeMonth.every(3)!.ceil(d3.max([startDate, endDate])!), -1)\n }\n\n header.selectAll('.selection-rect').remove()\n body.selectAll('.selection-rect').remove()\n\n header\n .append('rect')\n .attr('class', 'selection-rect')\n .attr('x', this.ganttChartController.timeScale(start!))\n .attr('y', 20)\n .attr(\n 'width',\n this.ganttChartController.timeScale(end!) -\n this.ganttChartController.timeScale(start!) +\n this.ganttChartController.baseWidth / this.ganttChartController.getScale()\n )\n .attr('height', 20)\n .attr('fill', 'var(--ox-gantt-selection-color, var(--md-sys-color-on-primary-container))')\n .attr('opacity', '.2')\n\n body\n .append('rect')\n .attr('class', 'selection-rect')\n .attr('x', this.ganttChartController.timeScale(start!))\n .attr('y', 0)\n .attr(\n 'width',\n this.ganttChartController.timeScale(end!) -\n this.ganttChartController.timeScale(start!) +\n this.ganttChartController.baseWidth / this.ganttChartController.getScale()\n )\n .attr('height', '100%')\n .attr('fill', 'var(--ox-gantt-selection-color, var(--md-sys-color-on-primary-container))')\n .attr('opacity', '.2')\n }\n\n finalizeSelection(startX: number, endX: number) {\n const header = d3.select(this.svgHeader)\n const body = d3.select(this.svgBody)\n\n let startDate = this.ganttChartController.timeScale.invert(startX)\n let endDate = this.ganttChartController.timeScale.invert(endX)\n\n let start, end\n\n if (this.ganttChartController.level === 'week-day') {\n start = d3.timeDay.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeDay.ceil(d3.max([startDate, endDate])!), -1)\n } else if (this.ganttChartController.level === 'quarter-week') {\n start = d3.timeWeek.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeWeek.ceil(d3.max([startDate, endDate])!), -1)\n } else if (this.ganttChartController.level === 'year-month') {\n start = d3.timeMonth.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeMonth.ceil(d3.max([startDate, endDate])!), -1)\n } else if (this.ganttChartController.level === 'year-quarter') {\n start = d3.timeMonth.every(3)!.floor(d3.min([startDate, endDate])!)\n end = d3.timeDay.offset(d3.timeMonth.every(3)!.ceil(d3.max([startDate, endDate])!), -1)\n }\n\n header.selectAll('.selection-rect').remove()\n body.selectAll('.selection-rect').remove()\n\n header\n .append('rect')\n .attr('class', 'selection-rect')\n .attr('x', this.ganttChartController.timeScale(start!))\n .attr('y', 20)\n .attr(\n 'width',\n this.ganttChartController.timeScale(end!) -\n this.ganttChartController.timeScale(start!) +\n this.ganttChartController.baseWidth / this.ganttChartController.getScale()\n )\n .attr('height', 20)\n .attr('fill', 'var(--ox-gantt-selection-color, var(--md-sys-color-on-primary-container))')\n .attr('opacity', '.2')\n\n body\n .append('rect')\n .attr('class', 'selection-rect')\n .attr('x', this.ganttChartController.timeScale(start!))\n .attr('y', 0)\n .attr(\n 'width',\n this.ganttChartController.timeScale(end!) -\n this.ganttChartController.timeScale(start!) +\n this.ganttChartController.baseWidth / this.ganttChartController.getScale()\n )\n .attr('height', '100%')\n .attr('fill', 'var(--ox-gantt-selection-color, var(--md-sys-color-on-primary-container))')\n .attr('opacity', '.2')\n\n const formatDate = d3.timeFormat('%Y-%m-%d')\n const customEvent = new CustomEvent('date-range-selected', {\n detail: { start: formatDate(start!), end: formatDate(end!) }\n })\n\n header.node()?.dispatchEvent(customEvent)\n }\n}\n"]}
@@ -5,12 +5,8 @@ export declare class OxGanttResizeSplitter extends LitElement {
5
5
  connectedCallback(): void;
6
6
  render(): import("lit-html").TemplateResult<1>;
7
7
  private onMouseDown;
8
- private onTouchStart;
9
- private startDrag;
8
+ private onMouseMoveHandler;
9
+ private onMouseUpHandler;
10
10
  private onMouseMove;
11
- private onTouchMove;
12
- private moveDrag;
13
11
  private onMouseUp;
14
- private onTouchEnd;
15
- private endDrag;
16
12
  }