@levelcaptech/gantt-task-react-custom 0.1.0 → 0.4.2

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.
@@ -1,63 +1,49 @@
1
- import React, { useMemo, useRef, useState, useEffect } from 'react';
2
-
3
- function _extends() {
4
- _extends = Object.assign || function (target) {
5
- for (var i = 1; i < arguments.length; i++) {
6
- var source = arguments[i];
7
-
8
- for (var key in source) {
9
- if (Object.prototype.hasOwnProperty.call(source, key)) {
10
- target[key] = source[key];
11
- }
12
- }
13
- }
14
-
15
- return target;
16
- };
17
-
18
- return _extends.apply(this, arguments);
19
- }
20
-
21
- function _unsupportedIterableToArray(o, minLen) {
22
- if (!o) return;
23
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
24
- var n = Object.prototype.toString.call(o).slice(8, -1);
25
- if (n === "Object" && o.constructor) n = o.constructor.name;
26
- if (n === "Map" || n === "Set") return Array.from(o);
27
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
28
- }
29
-
30
- function _arrayLikeToArray(arr, len) {
31
- if (len == null || len > arr.length) len = arr.length;
32
-
33
- for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
34
-
35
- return arr2;
1
+ import React, { useState, useRef, useMemo, useCallback, useEffect } from 'react';
2
+ import { createPortal } from 'react-dom';
3
+ import { useSensors, useSensor, PointerSensor, DndContext } from '@dnd-kit/core';
4
+ import { SortableContext, horizontalListSortingStrategy, useSortable, arrayMove } from '@dnd-kit/sortable';
5
+ import { CSS as CSS$1 } from '@dnd-kit/utilities';
6
+
7
+ function _arrayLikeToArray(r, a) {
8
+ (null == a || a > r.length) && (a = r.length);
9
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
10
+ return n;
36
11
  }
37
-
38
- function _createForOfIteratorHelperLoose(o, allowArrayLike) {
39
- var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
40
- if (it) return (it = it.call(o)).next.bind(it);
41
-
42
- if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
43
- if (it) o = it;
44
- var i = 0;
12
+ function _createForOfIteratorHelperLoose(r, e) {
13
+ var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
14
+ if (t) return (t = t.call(r)).next.bind(t);
15
+ if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
16
+ t && (r = t);
17
+ var o = 0;
45
18
  return function () {
46
- if (i >= o.length) return {
47
- done: true
48
- };
49
- return {
50
- done: false,
51
- value: o[i++]
19
+ return o >= r.length ? {
20
+ done: !0
21
+ } : {
22
+ done: !1,
23
+ value: r[o++]
52
24
  };
53
25
  };
54
26
  }
55
-
56
27
  throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
57
28
  }
29
+ function _extends() {
30
+ return _extends = Object.assign ? Object.assign.bind() : function (n) {
31
+ for (var e = 1; e < arguments.length; e++) {
32
+ var t = arguments[e];
33
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
34
+ }
35
+ return n;
36
+ }, _extends.apply(null, arguments);
37
+ }
38
+ function _unsupportedIterableToArray(r, a) {
39
+ if (r) {
40
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
41
+ var t = {}.toString.call(r).slice(8, -1);
42
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
43
+ }
44
+ }
58
45
 
59
46
  var ViewMode;
60
-
61
47
  (function (ViewMode) {
62
48
  ViewMode["Hour"] = "Hour";
63
49
  ViewMode["QuarterDay"] = "Quarter Day";
@@ -74,15 +60,12 @@ var getCachedDateTimeFormat = function getCachedDateTimeFormat(locString, opts)
74
60
  if (opts === void 0) {
75
61
  opts = {};
76
62
  }
77
-
78
63
  var key = JSON.stringify([locString, opts]);
79
64
  var dtf = intlDTCache[key];
80
-
81
65
  if (!dtf) {
82
66
  dtf = new Intl.DateTimeFormat(locString, opts);
83
67
  intlDTCache[key] = dtf;
84
68
  }
85
-
86
69
  return dtf;
87
70
  };
88
71
  var addToDate = function addToDate(date, quantity, scale) {
@@ -91,31 +74,25 @@ var addToDate = function addToDate(date, quantity, scale) {
91
74
  };
92
75
  var startOfDate = function startOfDate(date, scale) {
93
76
  var scores = ["millisecond", "second", "minute", "hour", "day", "month", "year"];
94
-
95
77
  var shouldReset = function shouldReset(_scale) {
96
78
  var maxScore = scores.indexOf(scale);
97
79
  return scores.indexOf(_scale) <= maxScore;
98
80
  };
99
-
100
81
  var newDate = new Date(date.getFullYear(), shouldReset("year") ? 0 : date.getMonth(), shouldReset("month") ? 1 : date.getDate(), shouldReset("day") ? 0 : date.getHours(), shouldReset("hour") ? 0 : date.getMinutes(), shouldReset("minute") ? 0 : date.getSeconds(), shouldReset("second") ? 0 : date.getMilliseconds());
101
82
  return newDate;
102
83
  };
103
84
  var ganttDateRange = function ganttDateRange(tasks, viewMode, preStepsCount) {
104
85
  var newStartDate = tasks[0].start;
105
86
  var newEndDate = tasks[0].start;
106
-
107
87
  for (var _iterator = _createForOfIteratorHelperLoose(tasks), _step; !(_step = _iterator()).done;) {
108
88
  var task = _step.value;
109
-
110
89
  if (task.start < newStartDate) {
111
90
  newStartDate = task.start;
112
91
  }
113
-
114
92
  if (task.end > newEndDate) {
115
93
  newEndDate = task.end;
116
94
  }
117
95
  }
118
-
119
96
  switch (viewMode) {
120
97
  case ViewMode.Year:
121
98
  newStartDate = addToDate(newStartDate, -1, "year");
@@ -123,49 +100,42 @@ var ganttDateRange = function ganttDateRange(tasks, viewMode, preStepsCount) {
123
100
  newEndDate = addToDate(newEndDate, 1, "year");
124
101
  newEndDate = startOfDate(newEndDate, "year");
125
102
  break;
126
-
127
103
  case ViewMode.QuarterYear:
128
104
  newStartDate = addToDate(newStartDate, -3, "month");
129
105
  newStartDate = startOfDate(newStartDate, "month");
130
106
  newEndDate = addToDate(newEndDate, 3, "year");
131
107
  newEndDate = startOfDate(newEndDate, "year");
132
108
  break;
133
-
134
109
  case ViewMode.Month:
135
110
  newStartDate = addToDate(newStartDate, -1 * preStepsCount, "month");
136
111
  newStartDate = startOfDate(newStartDate, "month");
137
112
  newEndDate = addToDate(newEndDate, 1, "year");
138
113
  newEndDate = startOfDate(newEndDate, "year");
139
114
  break;
140
-
141
115
  case ViewMode.Week:
142
116
  newStartDate = startOfDate(newStartDate, "day");
143
117
  newStartDate = addToDate(getMonday(newStartDate), -7 * preStepsCount, "day");
144
118
  newEndDate = startOfDate(newEndDate, "day");
145
119
  newEndDate = addToDate(newEndDate, 1.5, "month");
146
120
  break;
147
-
148
121
  case ViewMode.Day:
149
122
  newStartDate = startOfDate(newStartDate, "day");
150
123
  newStartDate = addToDate(newStartDate, -1 * preStepsCount, "day");
151
124
  newEndDate = startOfDate(newEndDate, "day");
152
125
  newEndDate = addToDate(newEndDate, 19, "day");
153
126
  break;
154
-
155
127
  case ViewMode.QuarterDay:
156
128
  newStartDate = startOfDate(newStartDate, "day");
157
129
  newStartDate = addToDate(newStartDate, -1 * preStepsCount, "day");
158
130
  newEndDate = startOfDate(newEndDate, "day");
159
131
  newEndDate = addToDate(newEndDate, 66, "hour");
160
132
  break;
161
-
162
133
  case ViewMode.HalfDay:
163
134
  newStartDate = startOfDate(newStartDate, "day");
164
135
  newStartDate = addToDate(newStartDate, -1 * preStepsCount, "day");
165
136
  newEndDate = startOfDate(newEndDate, "day");
166
137
  newEndDate = addToDate(newEndDate, 108, "hour");
167
138
  break;
168
-
169
139
  case ViewMode.Hour:
170
140
  newStartDate = startOfDate(newStartDate, "hour");
171
141
  newStartDate = addToDate(newStartDate, -1 * preStepsCount, "hour");
@@ -173,51 +143,40 @@ var ganttDateRange = function ganttDateRange(tasks, viewMode, preStepsCount) {
173
143
  newEndDate = addToDate(newEndDate, 1, "day");
174
144
  break;
175
145
  }
176
-
177
146
  return [newStartDate, newEndDate];
178
147
  };
179
148
  var seedDates = function seedDates(startDate, endDate, viewMode) {
180
149
  var currentDate = new Date(startDate);
181
150
  var dates = [currentDate];
182
-
183
151
  while (currentDate < endDate) {
184
152
  switch (viewMode) {
185
153
  case ViewMode.Year:
186
154
  currentDate = addToDate(currentDate, 1, "year");
187
155
  break;
188
-
189
156
  case ViewMode.QuarterYear:
190
157
  currentDate = addToDate(currentDate, 3, "month");
191
158
  break;
192
-
193
159
  case ViewMode.Month:
194
160
  currentDate = addToDate(currentDate, 1, "month");
195
161
  break;
196
-
197
162
  case ViewMode.Week:
198
163
  currentDate = addToDate(currentDate, 7, "day");
199
164
  break;
200
-
201
165
  case ViewMode.Day:
202
166
  currentDate = addToDate(currentDate, 1, "day");
203
167
  break;
204
-
205
168
  case ViewMode.HalfDay:
206
169
  currentDate = addToDate(currentDate, 12, "hour");
207
170
  break;
208
-
209
171
  case ViewMode.QuarterDay:
210
172
  currentDate = addToDate(currentDate, 6, "hour");
211
173
  break;
212
-
213
174
  case ViewMode.Hour:
214
175
  currentDate = addToDate(currentDate, 1, "hour");
215
176
  break;
216
177
  }
217
-
218
178
  dates.push(currentDate);
219
179
  }
220
-
221
180
  return dates;
222
181
  };
223
182
  var getLocaleMonth = function getLocaleMonth(date, locale) {
@@ -234,26 +193,21 @@ var getLocalDayOfWeek = function getLocalDayOfWeek(date, locale, format) {
234
193
  bottomValue = bottomValue.replace(bottomValue[0], bottomValue[0].toLocaleUpperCase());
235
194
  return bottomValue;
236
195
  };
237
-
238
196
  var getMonday = function getMonday(date) {
239
197
  var day = date.getDay();
240
198
  var diff = date.getDate() - day + (day === 0 ? -6 : 1);
241
199
  return new Date(date.setDate(diff));
242
200
  };
243
-
244
201
  var getWeekNumberISO8601 = function getWeekNumberISO8601(date) {
245
202
  var tmpDate = new Date(date.valueOf());
246
203
  var dayNumber = (tmpDate.getDay() + 6) % 7;
247
204
  tmpDate.setDate(tmpDate.getDate() - dayNumber + 3);
248
205
  var firstThursday = tmpDate.valueOf();
249
206
  tmpDate.setMonth(0, 1);
250
-
251
207
  if (tmpDate.getDay() !== 4) {
252
208
  tmpDate.setMonth(0, 1 + (4 - tmpDate.getDay() + 7) % 7);
253
209
  }
254
-
255
210
  var weekNumber = (1 + Math.ceil((firstThursday - tmpDate.valueOf()) / 604800000)).toString();
256
-
257
211
  if (weekNumber.length === 1) {
258
212
  return "0" + weekNumber;
259
213
  } else {
@@ -264,14 +218,913 @@ var getDaysInMonth = function getDaysInMonth(month, year) {
264
218
  return new Date(year, month + 1, 0).getDate();
265
219
  };
266
220
 
267
- var styles = {"ganttTable":"_3_ygE","ganttTable_Header":"_1nBOt","ganttTable_HeaderSeparator":"_2eZzQ","ganttTable_HeaderItem":"_WuQ0f"};
221
+ var TASK_PROCESS_OPTIONS = ["設計", "開発", "テスト", "レビュー", "リリース", "その他"];
222
+ var TASK_STATUS_OPTIONS = ["未着手", "進行中", "完了", "保留"];
223
+ var TASK_STATUS_COLORS = {
224
+ 未着手: "#9e9e9e",
225
+ 進行中: "#2196f3",
226
+ 完了: "#4caf50",
227
+ 保留: "#ff9800"
228
+ };
229
+ var TASK_STATUS_BADGE_TEXT = {
230
+ 未着手: "未",
231
+ 進行中: "進",
232
+ 完了: "完",
233
+ 保留: "保"
234
+ };
268
235
 
269
- var TaskListHeaderDefault = function TaskListHeaderDefault(_ref) {
236
+ var DEFAULT_VISIBLE_FIELDS = ["name", "start", "end", "process", "assignee", "plannedStart", "plannedEnd", "plannedEffort", "actualEffort", "status"];
237
+ var padTwo = function padTwo(value) {
238
+ return value.toString().padStart(2, "0");
239
+ };
240
+ var formatDate = function formatDate(date) {
241
+ if (!date) return "";
242
+ return date.getFullYear() + "-" + padTwo(date.getMonth() + 1) + "-" + padTwo(date.getDate());
243
+ };
244
+ var parseDateFromInput = function parseDateFromInput(value) {
245
+ if (!value) return undefined;
246
+ var _value$split$map = value.split("-").map(function (v) {
247
+ return parseInt(v, 10);
248
+ }),
249
+ year = _value$split$map[0],
250
+ month = _value$split$map[1],
251
+ day = _value$split$map[2];
252
+ if (Number.isNaN(year) || Number.isNaN(month) || Number.isNaN(day) || month < 1 || month > 12 || day < 1 || day > 31) {
253
+ return undefined;
254
+ }
255
+ var date = new Date(year, month - 1, day);
256
+ if (Number.isNaN(date.getTime()) || date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
257
+ return undefined;
258
+ }
259
+ return date;
260
+ };
261
+ var formatEffort = function formatEffort(effort, unit) {
262
+ if (unit === void 0) {
263
+ unit = "MH";
264
+ }
265
+ if (effort === undefined || effort === null || !Number.isFinite(effort) || effort < 0) {
266
+ return "";
267
+ }
268
+ var base = unit === "MD" ? 8 : unit === "MM" ? 160 : 1;
269
+ var converted = effort / base;
270
+ var rounded = unit === "MH" ? effort : Math.round(converted * 10) / 10;
271
+ return "" + rounded + unit;
272
+ };
273
+ var sanitizeEffortInput = function sanitizeEffortInput(value) {
274
+ if (value === "") return undefined;
275
+ var parsed = Number(value);
276
+ if (!Number.isFinite(parsed) || parsed < 0) return undefined;
277
+ return parsed;
278
+ };
279
+ var DEFAULT_TASK_PROCESS = TASK_PROCESS_OPTIONS.includes("その他") ? "その他" : TASK_PROCESS_OPTIONS[0];
280
+ var normalizeProcess = function normalizeProcess(process) {
281
+ return TASK_PROCESS_OPTIONS.includes(process) ? process : DEFAULT_TASK_PROCESS;
282
+ };
283
+ var normalizeStatus = function normalizeStatus(status) {
284
+ return TASK_STATUS_OPTIONS.includes(status) ? status : TASK_STATUS_OPTIONS[0];
285
+ };
286
+ var getStatusColor = function getStatusColor(status) {
287
+ return TASK_STATUS_COLORS[normalizeStatus(status)];
288
+ };
289
+ var getStatusBadgeText = function getStatusBadgeText(status) {
290
+ return TASK_STATUS_BADGE_TEXT[normalizeStatus(status)];
291
+ };
292
+ var resolveVisibleFields = function resolveVisibleFields(visibleFields) {
293
+ return visibleFields && visibleFields.length > 0 ? visibleFields : DEFAULT_VISIBLE_FIELDS;
294
+ };
295
+
296
+ var styles = {"ganttTable":"_3_ygE","ganttTable_Header":"_1nBOt","ganttTable_HeaderSeparator":"_2eZzQ","ganttTable_HeaderItem":"_WuQ0f","ganttTable_HeaderItemDragging":"_Fc5Tl","ganttTable_DragHandle":"_b6dPy","ganttTable_DragHandleDisabled":"_3ZMNU","ganttTable_DragIcon":"_QZHO8","ganttTable_HeaderLabel":"_2ANS-","ganttTable_ResizeHandle":"_OJ-Vg","ganttTable_ResizeHandleActive":"_21P28"};
297
+
298
+ function createCommonjsModule(fn, module) {
299
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
300
+ }
301
+
302
+ var classnames = createCommonjsModule(function (module) {
303
+ /*!
304
+ Copyright (c) 2018 Jed Watson.
305
+ Licensed under the MIT License (MIT), see
306
+ http://jedwatson.github.io/classnames
307
+ */
308
+ /* global define */
309
+
310
+ (function () {
311
+
312
+ var hasOwn = {}.hasOwnProperty;
313
+
314
+ function classNames () {
315
+ var classes = '';
316
+
317
+ for (var i = 0; i < arguments.length; i++) {
318
+ var arg = arguments[i];
319
+ if (arg) {
320
+ classes = appendClass(classes, parseValue(arg));
321
+ }
322
+ }
323
+
324
+ return classes;
325
+ }
326
+
327
+ function parseValue (arg) {
328
+ if (typeof arg === 'string' || typeof arg === 'number') {
329
+ return arg;
330
+ }
331
+
332
+ if (typeof arg !== 'object') {
333
+ return '';
334
+ }
335
+
336
+ if (Array.isArray(arg)) {
337
+ return classNames.apply(null, arg);
338
+ }
339
+
340
+ if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {
341
+ return arg.toString();
342
+ }
343
+
344
+ var classes = '';
345
+
346
+ for (var key in arg) {
347
+ if (hasOwn.call(arg, key) && arg[key]) {
348
+ classes = appendClass(classes, key);
349
+ }
350
+ }
351
+
352
+ return classes;
353
+ }
354
+
355
+ function appendClass (value, newClass) {
356
+ if (!newClass) {
357
+ return value;
358
+ }
359
+
360
+ if (value) {
361
+ return value + ' ' + newClass;
362
+ }
363
+
364
+ return value + newClass;
365
+ }
366
+
367
+ if ( module.exports) {
368
+ classNames.default = classNames;
369
+ module.exports = classNames;
370
+ } else {
371
+ window.classNames = classNames;
372
+ }
373
+ }());
374
+ });
375
+
376
+ // A type of promise-like that resolves synchronously and supports only one observer
377
+
378
+ const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator"))) : "@@iterator";
379
+
380
+ const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol("Symbol.asyncIterator"))) : "@@asyncIterator";
381
+
382
+ // Asynchronously call a function and send errors to recovery continuation
383
+ function _catch(body, recover) {
384
+ try {
385
+ var result = body();
386
+ } catch(e) {
387
+ return recover(e);
388
+ }
389
+ if (result && result.then) {
390
+ return result.then(void 0, recover);
391
+ }
392
+ return result;
393
+ }
394
+
395
+ var styles$1 = {"taskListWrapper":"_3ZbQT","taskListTableRow":"_34SS0","taskListCell":"_3lLk3","overlayEditor":"_3Nu1y","overlayEditorPending":"_2jEdG","overlayEditorError":"_2TWaP","taskListNameWrapper":"_nI1Xw","taskListExpander":"_2QjE6","taskListEmptyExpander":"_2TfEi","taskListInput":"_1bdaa","taskListSelect":"_1u3fW","statusWrapper":"_dRJfs","statusBadge":"_33mea","statusText":"_vpQEz"};
396
+
397
+ var NULL_CHAR_REGEX = new RegExp(String.fromCharCode(0), "g");
398
+ var ALPHANUMERIC_REGEX = /[a-zA-Z0-9]/;
399
+ var resolveOverlayInputType = function resolveOverlayInputType(columnId) {
400
+ switch (columnId) {
401
+ case "start":
402
+ case "end":
403
+ case "plannedStart":
404
+ case "plannedEnd":
405
+ return "date";
406
+ case "plannedEffort":
407
+ case "actualEffort":
408
+ return "number";
409
+ case "process":
410
+ case "status":
411
+ return "select";
412
+ case "name":
413
+ case "assignee":
414
+ default:
415
+ return "text";
416
+ }
417
+ };
418
+ var escapeSelectorValue = function escapeSelectorValue(value) {
419
+ if (typeof CSS !== "undefined" && typeof CSS.escape === "function") {
420
+ return CSS.escape(value);
421
+ }
422
+ var sanitized = value.replace(NULL_CHAR_REGEX, "\uFFFD");
423
+ return Array.from(sanitized).map(function (_char, index) {
424
+ var codePoint = _char.codePointAt(0);
425
+ if (codePoint === undefined) {
426
+ return "";
427
+ }
428
+ if (codePoint >= 0x1 && codePoint <= 0x1f || codePoint === 0x7f || index === 0 && codePoint >= 0x30 && codePoint <= 0x39 || index === 1 && codePoint >= 0x30 && codePoint <= 0x39 && sanitized.charCodeAt(0) === 0x2d) {
429
+ return "\\" + codePoint.toString(16) + " ";
430
+ }
431
+ if (_char === "-" || _char === "_" || ALPHANUMERIC_REGEX.test(_char)) {
432
+ return _char;
433
+ }
434
+ return "\\" + _char;
435
+ }).join("");
436
+ };
437
+ var OverlayEditor = function OverlayEditor(_ref) {
438
+ var editingState = _ref.editingState,
439
+ taskListRef = _ref.taskListRef,
440
+ headerContainerRef = _ref.headerContainerRef,
441
+ bodyContainerRef = _ref.bodyContainerRef,
442
+ onCommit = _ref.onCommit,
443
+ onCancel = _ref.onCancel;
444
+ var _useState = useState(null),
445
+ rect = _useState[0],
446
+ setRect = _useState[1];
447
+ var _useState2 = useState(null),
448
+ targetElement = _useState2[0],
449
+ setTargetElement = _useState2[1];
450
+ var inputRef = useRef(null);
451
+ var defaultValueRef = useRef("");
452
+ var compositionRef = useRef(false);
453
+ var rafIdRef = useRef(null);
454
+ var inputType = useMemo(function () {
455
+ return resolveOverlayInputType(editingState.columnId);
456
+ }, [editingState.columnId]);
457
+ var selectOptions = useMemo(function () {
458
+ if (editingState.columnId === "process") {
459
+ return TASK_PROCESS_OPTIONS;
460
+ }
461
+ if (editingState.columnId === "status") {
462
+ return TASK_STATUS_OPTIONS;
463
+ }
464
+ return [];
465
+ }, [editingState.columnId]);
466
+ var portalRoot = useMemo(function () {
467
+ if (typeof document === "undefined") {
468
+ return null;
469
+ }
470
+ return document.body;
471
+ }, []);
472
+ var resolveDefaultValue = useCallback(function (target) {
473
+ var _target$textContent;
474
+ var input = target.querySelector("input, textarea, select");
475
+ if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) {
476
+ return input.value;
477
+ }
478
+ if (input instanceof HTMLSelectElement) {
479
+ return input.value;
480
+ }
481
+ return ((_target$textContent = target.textContent) != null ? _target$textContent : "").trim();
482
+ }, []);
483
+ var findTargetElement = useCallback(function () {
484
+ if (!taskListRef.current || !editingState.rowId || !editingState.columnId) {
485
+ return null;
486
+ }
487
+ var rowId = escapeSelectorValue(editingState.rowId);
488
+ var columnId = escapeSelectorValue(editingState.columnId);
489
+ return taskListRef.current.querySelector("[data-row-id=\"" + rowId + "\"][data-column-id=\"" + columnId + "\"]");
490
+ }, [editingState.columnId, editingState.rowId, taskListRef]);
491
+ var updateRect = useCallback(function () {
492
+ if (editingState.mode !== "editing") {
493
+ setRect(null);
494
+ setTargetElement(null);
495
+ return;
496
+ }
497
+ var target = findTargetElement();
498
+ if (!target) {
499
+ setRect(null);
500
+ setTargetElement(null);
501
+ onCancel("unmounted");
502
+ return;
503
+ }
504
+ if (targetElement !== target) {
505
+ var nextDefaultValue = resolveDefaultValue(target);
506
+ defaultValueRef.current = nextDefaultValue;
507
+ if (inputRef.current) {
508
+ inputRef.current.value = nextDefaultValue;
509
+ }
510
+ setTargetElement(target);
511
+ }
512
+ var nextRect = target.getBoundingClientRect();
513
+ setRect({
514
+ top: Math.round(nextRect.top),
515
+ left: Math.round(nextRect.left),
516
+ width: Math.round(nextRect.width),
517
+ height: Math.round(nextRect.height)
518
+ });
519
+ }, [editingState.mode, findTargetElement, onCancel, resolveDefaultValue, targetElement]);
520
+ var scheduleRectUpdate = useCallback(function () {
521
+ if (rafIdRef.current !== null) {
522
+ return;
523
+ }
524
+ rafIdRef.current = window.requestAnimationFrame(function () {
525
+ rafIdRef.current = null;
526
+ updateRect();
527
+ });
528
+ }, [updateRect]);
529
+ useEffect(function () {
530
+ if (editingState.mode !== "editing") {
531
+ defaultValueRef.current = "";
532
+ compositionRef.current = false;
533
+ setRect(null);
534
+ setTargetElement(null);
535
+ return;
536
+ }
537
+ scheduleRectUpdate();
538
+ }, [editingState.mode, scheduleRectUpdate]);
539
+ useEffect(function () {
540
+ if (editingState.mode !== "editing") {
541
+ return undefined;
542
+ }
543
+ var handleScroll = function handleScroll() {
544
+ return scheduleRectUpdate();
545
+ };
546
+ var handleResize = function handleResize() {
547
+ return scheduleRectUpdate();
548
+ };
549
+ window.addEventListener("scroll", handleScroll, {
550
+ capture: true,
551
+ passive: true
552
+ });
553
+ window.addEventListener("resize", handleResize, {
554
+ capture: true
555
+ });
556
+ document.addEventListener("scroll", handleScroll, {
557
+ capture: true,
558
+ passive: true
559
+ });
560
+ var scrollTargets = [taskListRef.current, bodyContainerRef === null || bodyContainerRef === void 0 ? void 0 : bodyContainerRef.current, headerContainerRef === null || headerContainerRef === void 0 ? void 0 : headerContainerRef.current].filter(Boolean);
561
+ scrollTargets.forEach(function (element) {
562
+ return element.addEventListener("scroll", handleScroll, {
563
+ capture: true,
564
+ passive: true
565
+ });
566
+ });
567
+ var ResizeObserverConstructor = typeof window !== "undefined" ? window.ResizeObserver : undefined;
568
+ var resizeObserver = ResizeObserverConstructor ? new ResizeObserverConstructor(function () {
569
+ return scheduleRectUpdate();
570
+ }) : null;
571
+ var observedElements = [targetElement, taskListRef.current, bodyContainerRef === null || bodyContainerRef === void 0 ? void 0 : bodyContainerRef.current, headerContainerRef === null || headerContainerRef === void 0 ? void 0 : headerContainerRef.current].filter(Boolean);
572
+ observedElements.forEach(function (element) {
573
+ return resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.observe(element);
574
+ });
575
+ return function () {
576
+ window.removeEventListener("scroll", handleScroll, {
577
+ capture: true
578
+ });
579
+ window.removeEventListener("resize", handleResize, {
580
+ capture: true
581
+ });
582
+ document.removeEventListener("scroll", handleScroll, {
583
+ capture: true
584
+ });
585
+ scrollTargets.forEach(function (element) {
586
+ return element.removeEventListener("scroll", handleScroll, {
587
+ capture: true
588
+ });
589
+ });
590
+ resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect();
591
+ };
592
+ }, [bodyContainerRef, editingState.mode, headerContainerRef, scheduleRectUpdate, targetElement, taskListRef]);
593
+ useEffect(function () {
594
+ return function () {
595
+ if (rafIdRef.current !== null) {
596
+ window.cancelAnimationFrame(rafIdRef.current);
597
+ rafIdRef.current = null;
598
+ }
599
+ };
600
+ }, []);
601
+ useEffect(function () {
602
+ if (editingState.mode !== "editing") {
603
+ return;
604
+ }
605
+ var input = inputRef.current;
606
+ if (!input) {
607
+ return;
608
+ }
609
+ if (editingState.pending) {
610
+ input.focus();
611
+ return;
612
+ }
613
+ input.focus();
614
+ if (input instanceof HTMLInputElement) {
615
+ input.select();
616
+ }
617
+ }, [editingState.mode, editingState.pending, targetElement]);
618
+ var handleCommit = useCallback(function () {
619
+ try {
620
+ if (editingState.pending) {
621
+ return Promise.resolve();
622
+ }
623
+ var input = inputRef.current;
624
+ if (!input) {
625
+ return Promise.resolve();
626
+ }
627
+ return Promise.resolve(onCommit(input.value, "enter")).then(function () {});
628
+ } catch (e) {
629
+ return Promise.reject(e);
630
+ }
631
+ }, [editingState.pending, onCommit]);
632
+ var handleKeyDown = useCallback(function (event) {
633
+ if (editingState.pending) {
634
+ if (event.key === "Escape" || event.key === "Enter") {
635
+ event.preventDefault();
636
+ }
637
+ return;
638
+ }
639
+ if (event.key === "Enter") {
640
+ event.preventDefault();
641
+ void handleCommit();
642
+ return;
643
+ }
644
+ if (event.key === "Escape") {
645
+ event.preventDefault();
646
+ onCancel("escape");
647
+ }
648
+ }, [editingState.pending, handleCommit, onCancel]);
649
+ var handleBlur = useCallback(function () {
650
+ if (editingState.pending || compositionRef.current) {
651
+ return;
652
+ }
653
+ var input = inputRef.current;
654
+ if (!input) {
655
+ return;
656
+ }
657
+ if (input.value === defaultValueRef.current) {
658
+ onCancel("nochange-blur");
659
+ }
660
+ }, [editingState.pending, onCancel]);
661
+ var handleInput = useCallback(function (event) {
662
+ if (!editingState.pending) {
663
+ return;
664
+ }
665
+ var input = event.currentTarget;
666
+ input.value = defaultValueRef.current;
667
+ }, [editingState.pending]);
668
+ var handleCompositionStart = function handleCompositionStart() {
669
+ compositionRef.current = true;
670
+ };
671
+ var handleCompositionEnd = function handleCompositionEnd() {
672
+ compositionRef.current = false;
673
+ };
674
+ var handleInputElementRef = useCallback(function (element) {
675
+ inputRef.current = element;
676
+ }, []);
677
+ if (editingState.mode !== "editing" || !rect || !portalRoot) {
678
+ return null;
679
+ }
680
+ return createPortal(React.createElement("div", {
681
+ className: styles$1.overlayEditor + " " + (editingState.pending ? styles$1.overlayEditorPending : ""),
682
+ "data-testid": "overlay-editor",
683
+ style: {
684
+ top: rect.top,
685
+ left: rect.left,
686
+ width: rect.width,
687
+ height: rect.height
688
+ }
689
+ }, inputType === "select" ? React.createElement("select", {
690
+ className: styles$1.taskListSelect,
691
+ "data-testid": "overlay-editor-input",
692
+ "aria-label": "\u30BB\u30EB\u7DE8\u96C6",
693
+ defaultValue: defaultValueRef.current,
694
+ style: {
695
+ height: "100%"
696
+ },
697
+ ref: handleInputElementRef,
698
+ disabled: editingState.pending,
699
+ onKeyDown: handleKeyDown,
700
+ onBlur: handleBlur,
701
+ onInput: handleInput,
702
+ onChange: handleInput
703
+ }, selectOptions.map(function (option) {
704
+ return React.createElement("option", {
705
+ key: option,
706
+ value: option
707
+ }, option);
708
+ })) : React.createElement("input", {
709
+ className: styles$1.taskListInput,
710
+ "data-testid": "overlay-editor-input",
711
+ type: inputType,
712
+ "aria-label": "\u30BB\u30EB\u7DE8\u96C6",
713
+ defaultValue: defaultValueRef.current,
714
+ style: {
715
+ height: "100%"
716
+ },
717
+ ref: handleInputElementRef,
718
+ readOnly: editingState.pending,
719
+ onKeyDown: handleKeyDown,
720
+ onBlur: handleBlur,
721
+ onInput: handleInput,
722
+ onChange: handleInput,
723
+ onCompositionStart: handleCompositionStart,
724
+ onCompositionEnd: handleCompositionEnd
725
+ }), editingState.errorMessage && React.createElement("div", {
726
+ className: styles$1.overlayEditorError,
727
+ role: "alert"
728
+ }, editingState.errorMessage)), portalRoot);
729
+ };
730
+
731
+ var TaskListEditingStateContext = React.createContext(null);
732
+ var DEFAULT_MIN_WIDTH = 32;
733
+ var getDefaultWidth = function getDefaultWidth(field, rowWidth) {
734
+ return field === "name" ? 140 : Number.parseInt(rowWidth, 10) || 155;
735
+ };
736
+ var TaskList = function TaskList(_ref) {
270
737
  var headerHeight = _ref.headerHeight,
271
- fontFamily = _ref.fontFamily,
272
- fontSize = _ref.fontSize,
273
- rowWidth = _ref.rowWidth;
738
+ fontFamily = _ref.fontFamily,
739
+ fontSize = _ref.fontSize,
740
+ rowWidth = _ref.rowWidth,
741
+ rowHeight = _ref.rowHeight,
742
+ scrollY = _ref.scrollY,
743
+ _ref$horizontalScroll = _ref.horizontalScroll,
744
+ horizontalScroll = _ref$horizontalScroll === void 0 ? 0 : _ref$horizontalScroll,
745
+ tasks = _ref.tasks,
746
+ selectedTask = _ref.selectedTask,
747
+ setSelectedTask = _ref.setSelectedTask,
748
+ onExpanderClick = _ref.onExpanderClick,
749
+ ganttHeight = _ref.ganttHeight,
750
+ taskListRef = _ref.taskListRef,
751
+ headerContainerRef = _ref.headerContainerRef,
752
+ bodyContainerRef = _ref.bodyContainerRef,
753
+ horizontalContainerClass = _ref.horizontalContainerClass,
754
+ TaskListHeader = _ref.TaskListHeader,
755
+ TaskListTable = _ref.TaskListTable,
756
+ visibleFields = _ref.visibleFields,
757
+ onUpdateTask = _ref.onUpdateTask,
758
+ onCellCommit = _ref.onCellCommit,
759
+ effortDisplayUnit = _ref.effortDisplayUnit,
760
+ _ref$enableColumnDrag = _ref.enableColumnDrag,
761
+ enableColumnDrag = _ref$enableColumnDrag === void 0 ? true : _ref$enableColumnDrag,
762
+ onHorizontalScroll = _ref.onHorizontalScroll;
763
+ var internalHorizontalRef = useRef(null);
764
+ var internalHeaderRef = useRef(null);
765
+ var horizontalContainerRef = bodyContainerRef != null ? bodyContainerRef : internalHorizontalRef;
766
+ var headerRef = headerContainerRef != null ? headerContainerRef : internalHeaderRef;
767
+ useEffect(function () {
768
+ if (horizontalContainerRef.current) {
769
+ horizontalContainerRef.current.scrollTop = scrollY;
770
+ }
771
+ }, [scrollY, horizontalContainerRef]);
772
+ useEffect(function () {
773
+ if (horizontalContainerRef.current) {
774
+ horizontalContainerRef.current.scrollLeft = horizontalScroll;
775
+ }
776
+ if (headerRef.current) {
777
+ headerRef.current.scrollLeft = horizontalScroll;
778
+ }
779
+ }, [horizontalScroll, horizontalContainerRef, headerRef]);
780
+ var initialColumns = useMemo(function () {
781
+ return visibleFields.map(function (field) {
782
+ return {
783
+ id: field,
784
+ label: field,
785
+ width: getDefaultWidth(field, rowWidth),
786
+ minWidth: DEFAULT_MIN_WIDTH,
787
+ visible: true
788
+ };
789
+ });
790
+ }, [visibleFields, rowWidth]);
791
+ var _useState = useState(initialColumns),
792
+ columnsState = _useState[0],
793
+ setColumnsState = _useState[1];
794
+ useEffect(function () {
795
+ setColumnsState(function (prev) {
796
+ var existingMap = new Map(prev.map(function (column) {
797
+ return [column.id, column];
798
+ }));
799
+ var nextColumns = visibleFields.map(function (field) {
800
+ var existing = existingMap.get(field);
801
+ if (existing) {
802
+ return existing;
803
+ }
804
+ return {
805
+ id: field,
806
+ label: field,
807
+ width: getDefaultWidth(field, rowWidth),
808
+ minWidth: DEFAULT_MIN_WIDTH,
809
+ visible: true
810
+ };
811
+ });
812
+ return nextColumns;
813
+ });
814
+ }, [visibleFields, rowWidth]);
815
+ var visibleColumns = useMemo(function () {
816
+ return columnsState.filter(function (column) {
817
+ return column.visible;
818
+ });
819
+ }, [columnsState]);
820
+ var headerProps = {
821
+ headerHeight: headerHeight,
822
+ fontFamily: fontFamily,
823
+ fontSize: fontSize,
824
+ rowWidth: rowWidth,
825
+ visibleFields: visibleFields,
826
+ columnsState: columnsState,
827
+ setColumnsState: setColumnsState,
828
+ enableColumnDrag: enableColumnDrag
829
+ };
830
+ var selectedTaskId = selectedTask ? selectedTask.id : "";
831
+ var tableProps = {
832
+ rowHeight: rowHeight,
833
+ rowWidth: rowWidth,
834
+ fontFamily: fontFamily,
835
+ fontSize: fontSize,
836
+ tasks: tasks,
837
+ selectedTaskId: selectedTaskId,
838
+ setSelectedTask: setSelectedTask,
839
+ onExpanderClick: onExpanderClick,
840
+ visibleFields: visibleFields,
841
+ onUpdateTask: onUpdateTask,
842
+ onCellCommit: onCellCommit,
843
+ effortDisplayUnit: effortDisplayUnit,
844
+ columnsState: visibleColumns
845
+ };
846
+ var _useState2 = useState({
847
+ mode: "viewing",
848
+ rowId: null,
849
+ columnId: null,
850
+ trigger: null,
851
+ pending: false,
852
+ errorMessage: null
853
+ }),
854
+ editingState = _useState2[0],
855
+ setEditingState = _useState2[1];
856
+ var previousEditingStateRef = useRef(null);
857
+ var closeEditing = useCallback(function () {
858
+ setEditingState(function (prev) {
859
+ if (prev.mode === "viewing") {
860
+ return prev;
861
+ }
862
+ return {
863
+ mode: "viewing",
864
+ rowId: null,
865
+ columnId: null,
866
+ trigger: null,
867
+ pending: false,
868
+ errorMessage: null
869
+ };
870
+ });
871
+ }, []);
872
+ var mountedRef = useRef(true);
873
+ useEffect(function () {
874
+ return function () {
875
+ mountedRef.current = false;
876
+ };
877
+ }, []);
878
+ var cancelEditing = useCallback(function (reason) {
879
+ if (editingState.mode !== "editing") {
880
+ return;
881
+ }
882
+ console.debug("[edit:cancel]", {
883
+ rowId: editingState.rowId,
884
+ columnId: editingState.columnId,
885
+ reason: reason
886
+ });
887
+ closeEditing();
888
+ }, [closeEditing, editingState.columnId, editingState.mode, editingState.rowId]);
889
+ var commitEditing = useCallback(function (value, trigger) {
890
+ try {
891
+ if (!onCellCommit) {
892
+ return Promise.resolve();
893
+ }
894
+ if (editingState.mode !== "editing" || editingState.pending) {
895
+ return Promise.resolve();
896
+ }
897
+ if (!editingState.rowId || !editingState.columnId) {
898
+ return Promise.resolve();
899
+ }
900
+ var rowId = editingState.rowId;
901
+ var columnId = editingState.columnId;
902
+ setEditingState(function (prev) {
903
+ if (prev.mode !== "editing" || prev.pending || prev.rowId !== rowId || prev.columnId !== columnId) {
904
+ return prev;
905
+ }
906
+ return _extends({}, prev, {
907
+ pending: true,
908
+ errorMessage: null
909
+ });
910
+ });
911
+ return Promise.resolve(_catch(function () {
912
+ return Promise.resolve(onCellCommit({
913
+ rowId: rowId,
914
+ columnId: columnId,
915
+ value: value,
916
+ trigger: trigger
917
+ })).then(function () {
918
+ if (!mountedRef.current) {
919
+ return;
920
+ }
921
+ setEditingState(function (prev) {
922
+ if (prev.mode !== "editing" || prev.rowId !== rowId || prev.columnId !== columnId) {
923
+ return prev;
924
+ }
925
+ return {
926
+ mode: "viewing",
927
+ rowId: null,
928
+ columnId: null,
929
+ trigger: null,
930
+ pending: false,
931
+ errorMessage: null
932
+ };
933
+ });
934
+ });
935
+ }, function (error) {
936
+ console.error("[commit:error]", {
937
+ rowId: rowId,
938
+ columnId: columnId,
939
+ trigger: trigger,
940
+ message: error instanceof Error ? error.message : "unknown"
941
+ });
942
+ if (!mountedRef.current) {
943
+ return;
944
+ }
945
+ setEditingState(function (prev) {
946
+ if (prev.mode !== "editing" || prev.rowId !== rowId || prev.columnId !== columnId) {
947
+ return prev;
948
+ }
949
+ return _extends({}, prev, {
950
+ pending: false,
951
+ errorMessage: "Commit failed. Please retry."
952
+ });
953
+ });
954
+ }));
955
+ } catch (e) {
956
+ return Promise.reject(e);
957
+ }
958
+ }, [editingState, onCellCommit]);
959
+ var selectCell = useCallback(function (rowId, columnId) {
960
+ console.debug("[TaskList] select cell", {
961
+ rowId: rowId,
962
+ columnId: columnId
963
+ });
964
+ setEditingState({
965
+ mode: "selected",
966
+ rowId: rowId,
967
+ columnId: columnId,
968
+ trigger: null,
969
+ pending: false,
970
+ errorMessage: null
971
+ });
972
+ }, []);
973
+ var startEditing = useCallback(function (rowId, columnId, trigger) {
974
+ if (editingState.pending) {
975
+ console.debug("[TaskList] ignore enter editing", {
976
+ reason: "pending",
977
+ rowId: rowId,
978
+ columnId: columnId
979
+ });
980
+ return;
981
+ }
982
+ console.debug("[TaskList] enter editing", {
983
+ rowId: rowId,
984
+ columnId: columnId,
985
+ trigger: trigger
986
+ });
987
+ setEditingState({
988
+ mode: "editing",
989
+ rowId: rowId,
990
+ columnId: columnId,
991
+ trigger: trigger,
992
+ pending: false,
993
+ errorMessage: null
994
+ });
995
+ }, [editingState.pending]);
996
+ useEffect(function () {
997
+ var previous = previousEditingStateRef.current;
998
+ if (previous) {
999
+ var buildLogContext = function buildLogContext() {
1000
+ var _editingState$rowId, _editingState$columnI, _editingState$trigger;
1001
+ return {
1002
+ rowId: (_editingState$rowId = editingState.rowId) != null ? _editingState$rowId : previous.rowId,
1003
+ columnId: (_editingState$columnI = editingState.columnId) != null ? _editingState$columnI : previous.columnId,
1004
+ trigger: (_editingState$trigger = editingState.trigger) != null ? _editingState$trigger : previous.trigger
1005
+ };
1006
+ };
1007
+ if (previous.mode !== "editing" && editingState.mode === "editing") {
1008
+ console.log("[edit:start]", buildLogContext());
1009
+ }
1010
+ if (!previous.pending && editingState.pending) {
1011
+ console.log("[commit:start]", buildLogContext());
1012
+ }
1013
+ if (previous.pending && !editingState.pending) {
1014
+ var logContext = buildLogContext();
1015
+ if (editingState.mode === "editing") {
1016
+ console.log("[commit:reject]", logContext);
1017
+ } else {
1018
+ console.log("[commit:resolve]", logContext);
1019
+ }
1020
+ }
1021
+ if (previous.mode === "editing" && editingState.mode !== "editing") {
1022
+ console.log("[edit:end]", _extends({}, buildLogContext(), {
1023
+ to: editingState.mode
1024
+ }));
1025
+ }
1026
+ }
1027
+ previousEditingStateRef.current = editingState;
1028
+ }, [editingState]);
1029
+ var editingContextValue = useMemo(function () {
1030
+ return {
1031
+ editingState: editingState,
1032
+ selectCell: selectCell,
1033
+ startEditing: startEditing
1034
+ };
1035
+ }, [editingState, selectCell, startEditing]);
274
1036
  return React.createElement("div", {
1037
+ ref: taskListRef
1038
+ }, React.createElement(OverlayEditor, {
1039
+ editingState: editingState,
1040
+ taskListRef: taskListRef,
1041
+ headerContainerRef: headerRef,
1042
+ bodyContainerRef: horizontalContainerRef,
1043
+ onCommit: commitEditing,
1044
+ onCancel: cancelEditing
1045
+ }), React.createElement("div", {
1046
+ ref: headerRef,
1047
+ onScroll: onHorizontalScroll,
1048
+ style: {
1049
+ width: "100%",
1050
+ overflowX: "hidden"
1051
+ }
1052
+ }, React.createElement(TaskListHeader, Object.assign({}, headerProps))), React.createElement("div", {
1053
+ ref: horizontalContainerRef,
1054
+ className: horizontalContainerClass,
1055
+ style: ganttHeight ? {
1056
+ height: ganttHeight
1057
+ } : {},
1058
+ onScroll: onHorizontalScroll
1059
+ }, React.createElement(TaskListEditingStateContext.Provider, {
1060
+ value: editingContextValue
1061
+ }, React.createElement(TaskListTable, Object.assign({}, tableProps)))));
1062
+ };
1063
+
1064
+ var TaskListHeaderDefault = function TaskListHeaderDefault(_ref) {
1065
+ var headerHeight = _ref.headerHeight,
1066
+ fontFamily = _ref.fontFamily,
1067
+ fontSize = _ref.fontSize,
1068
+ rowWidth = _ref.rowWidth,
1069
+ visibleFields = _ref.visibleFields,
1070
+ columnsState = _ref.columnsState,
1071
+ setColumnsState = _ref.setColumnsState,
1072
+ _ref$enableColumnDrag = _ref.enableColumnDrag,
1073
+ enableColumnDrag = _ref$enableColumnDrag === void 0 ? true : _ref$enableColumnDrag;
1074
+ var labels = {
1075
+ name: "タスク名",
1076
+ start: "開始日",
1077
+ end: "終了日",
1078
+ process: "工程",
1079
+ assignee: "担当者",
1080
+ plannedStart: "予定開始",
1081
+ plannedEnd: "予定終了",
1082
+ plannedEffort: "予定工数",
1083
+ actualEffort: "実績工数",
1084
+ status: "ステータス"
1085
+ };
1086
+ var fallbackColumns = resolveVisibleFields(visibleFields).map(function (field) {
1087
+ return {
1088
+ id: field,
1089
+ label: labels[field],
1090
+ width: getDefaultWidth(field, rowWidth),
1091
+ minWidth: DEFAULT_MIN_WIDTH,
1092
+ visible: true
1093
+ };
1094
+ });
1095
+ var resolvedColumns = useMemo(function () {
1096
+ return (columnsState || fallbackColumns).filter(function (column) {
1097
+ return column.visible !== false;
1098
+ });
1099
+ }, [columnsState, fallbackColumns]);
1100
+ var sensors = useSensors(useSensor(PointerSensor));
1101
+ var _useState = useState(null),
1102
+ resizingId = _useState[0],
1103
+ setResizingId = _useState[1];
1104
+ var onDragEnd = function onDragEnd(event) {
1105
+ if (!setColumnsState || !enableColumnDrag) return;
1106
+ var active = event.active,
1107
+ over = event.over;
1108
+ if (!over || active.id === over.id) return;
1109
+ setColumnsState(function (prev) {
1110
+ var visible = prev.filter(function (column) {
1111
+ return column.visible !== false;
1112
+ });
1113
+ var oldIndex = visible.findIndex(function (column) {
1114
+ return column.id === active.id;
1115
+ });
1116
+ var newIndex = visible.findIndex(function (column) {
1117
+ return column.id === over.id;
1118
+ });
1119
+ if (oldIndex < 0 || newIndex < 0) return prev;
1120
+ var moved = arrayMove(visible, oldIndex, newIndex);
1121
+ var idx = 0;
1122
+ return prev.map(function (column) {
1123
+ return column.visible !== false ? moved[idx++] : column;
1124
+ });
1125
+ });
1126
+ };
1127
+ var headerContent = React.createElement("div", {
275
1128
  className: styles.ganttTable,
276
1129
  style: {
277
1130
  fontFamily: fontFamily,
@@ -282,191 +1135,532 @@ var TaskListHeaderDefault = function TaskListHeaderDefault(_ref) {
282
1135
  style: {
283
1136
  height: headerHeight - 2
284
1137
  }
285
- }, React.createElement("div", {
286
- className: styles.ganttTable_HeaderItem,
287
- style: {
288
- minWidth: rowWidth
1138
+ }, resolvedColumns.map(function (column, index) {
1139
+ return React.createElement(React.Fragment, {
1140
+ key: column.id
1141
+ }, React.createElement(SortableHeaderItem, {
1142
+ column: column,
1143
+ labels: labels,
1144
+ setColumnsState: setColumnsState,
1145
+ enableDrag: enableColumnDrag && !!setColumnsState,
1146
+ setResizingId: setResizingId,
1147
+ isResizing: resizingId === column.id
1148
+ }), index !== resolvedColumns.length - 1 && React.createElement("div", {
1149
+ className: styles.ganttTable_HeaderSeparator,
1150
+ style: {
1151
+ height: headerHeight * 0.5,
1152
+ marginTop: headerHeight * 0.2
1153
+ }
1154
+ }));
1155
+ })));
1156
+ return React.createElement(DndContext, {
1157
+ sensors: sensors,
1158
+ onDragEnd: enableColumnDrag ? onDragEnd : undefined
1159
+ }, React.createElement(SortableContext, {
1160
+ items: resolvedColumns.map(function (column) {
1161
+ return column.id;
1162
+ }),
1163
+ strategy: horizontalListSortingStrategy
1164
+ }, headerContent));
1165
+ };
1166
+ var SortableHeaderItem = function SortableHeaderItem(_ref2) {
1167
+ var _classNames, _classNames2, _classNames3;
1168
+ var column = _ref2.column,
1169
+ labels = _ref2.labels,
1170
+ setColumnsState = _ref2.setColumnsState,
1171
+ enableDrag = _ref2.enableDrag,
1172
+ setResizingId = _ref2.setResizingId,
1173
+ isResizing = _ref2.isResizing;
1174
+ var _useSortable = useSortable({
1175
+ id: column.id,
1176
+ disabled: !enableDrag
1177
+ }),
1178
+ attributes = _useSortable.attributes,
1179
+ listeners = _useSortable.listeners,
1180
+ setNodeRef = _useSortable.setNodeRef,
1181
+ transform = _useSortable.transform,
1182
+ transition = _useSortable.transition,
1183
+ isDragging = _useSortable.isDragging;
1184
+ var startXRef = useRef(null);
1185
+ var startWidthRef = useRef(null);
1186
+ var moveHandlerRef = useRef(null);
1187
+ var upHandlerRef = useRef(null);
1188
+ useEffect(function () {
1189
+ return function () {
1190
+ if (moveHandlerRef.current) {
1191
+ document.removeEventListener("mousemove", moveHandlerRef.current);
1192
+ moveHandlerRef.current = null;
1193
+ }
1194
+ if (upHandlerRef.current) {
1195
+ document.removeEventListener("mouseup", upHandlerRef.current);
1196
+ upHandlerRef.current = null;
1197
+ }
1198
+ };
1199
+ }, []);
1200
+ var style = {
1201
+ minWidth: column.width,
1202
+ maxWidth: column.width,
1203
+ transform: CSS$1.Transform.toString(transform),
1204
+ transition: transition
1205
+ };
1206
+ var onMouseDownResize = function onMouseDownResize(event) {
1207
+ event.stopPropagation();
1208
+ event.preventDefault();
1209
+ startXRef.current = event.clientX;
1210
+ startWidthRef.current = column.width;
1211
+ setResizingId(column.id);
1212
+ var handleMouseMove = function handleMouseMove(moveEvent) {
1213
+ if (startXRef.current == null || startWidthRef.current == null) return;
1214
+ var delta = moveEvent.clientX - startXRef.current;
1215
+ var nextWidth = Math.max(column.minWidth, startWidthRef.current + delta);
1216
+ setColumnsState === null || setColumnsState === void 0 ? void 0 : setColumnsState(function (prev) {
1217
+ return prev.map(function (item) {
1218
+ return item.id === column.id ? _extends({}, item, {
1219
+ width: nextWidth
1220
+ }) : item;
1221
+ });
1222
+ });
1223
+ };
1224
+ var handleMouseUp = function handleMouseUp() {
1225
+ startXRef.current = null;
1226
+ startWidthRef.current = null;
1227
+ setResizingId(null);
1228
+ if (moveHandlerRef.current) {
1229
+ document.removeEventListener("mousemove", moveHandlerRef.current);
1230
+ moveHandlerRef.current = null;
1231
+ }
1232
+ if (upHandlerRef.current) {
1233
+ document.removeEventListener("mouseup", upHandlerRef.current);
1234
+ upHandlerRef.current = null;
1235
+ }
1236
+ };
1237
+ moveHandlerRef.current = handleMouseMove;
1238
+ upHandlerRef.current = handleMouseUp;
1239
+ document.addEventListener("mousemove", handleMouseMove);
1240
+ document.addEventListener("mouseup", handleMouseUp);
1241
+ };
1242
+ return React.createElement("div", {
1243
+ ref: setNodeRef,
1244
+ className: classnames(styles.ganttTable_HeaderItem, (_classNames = {}, _classNames[styles.ganttTable_HeaderItemDragging] = isDragging, _classNames)),
1245
+ style: style
1246
+ }, React.createElement("div", Object.assign({
1247
+ className: classnames(styles.ganttTable_DragHandle, (_classNames2 = {}, _classNames2[styles.ganttTable_DragHandleDisabled] = !enableDrag, _classNames2))
1248
+ }, attributes, listeners, {
1249
+ "aria-label": "Drag column",
1250
+ onMouseDown: function onMouseDown(event) {
1251
+ return event.stopPropagation();
1252
+ }
1253
+ }), React.createElement("span", {
1254
+ className: styles.ganttTable_DragIcon,
1255
+ "aria-hidden": "true"
1256
+ }, "\u22EE\u22EE")), React.createElement("div", {
1257
+ className: styles.ganttTable_HeaderLabel
1258
+ }, labels[column.id]), React.createElement("div", {
1259
+ className: classnames(styles.ganttTable_ResizeHandle, (_classNames3 = {}, _classNames3[styles.ganttTable_ResizeHandleActive] = isResizing, _classNames3)),
1260
+ onMouseDown: onMouseDownResize,
1261
+ "aria-label": "Resize column",
1262
+ role: "separator",
1263
+ "aria-orientation": "vertical"
1264
+ }));
1265
+ };
1266
+
1267
+ var TaskListTableDefault = function TaskListTableDefault(_ref) {
1268
+ var _columnsState$filter;
1269
+ var rowHeight = _ref.rowHeight,
1270
+ rowWidth = _ref.rowWidth,
1271
+ tasks = _ref.tasks,
1272
+ fontFamily = _ref.fontFamily,
1273
+ fontSize = _ref.fontSize,
1274
+ onExpanderClick = _ref.onExpanderClick,
1275
+ visibleFields = _ref.visibleFields,
1276
+ onCellCommit = _ref.onCellCommit,
1277
+ effortDisplayUnit = _ref.effortDisplayUnit,
1278
+ columnsState = _ref.columnsState;
1279
+ var columns = (_columnsState$filter = columnsState === null || columnsState === void 0 ? void 0 : columnsState.filter(function (column) {
1280
+ return column.visible !== false;
1281
+ })) != null ? _columnsState$filter : resolveVisibleFields(visibleFields).map(function (field) {
1282
+ return {
1283
+ id: field,
1284
+ width: getDefaultWidth(field, rowWidth)
1285
+ };
1286
+ });
1287
+ var isCommitEnabled = !!onCellCommit;
1288
+ var allowEditing = isCommitEnabled;
1289
+ var editingContext = React.useContext(TaskListEditingStateContext);
1290
+ var editingState = editingContext === null || editingContext === void 0 ? void 0 : editingContext.editingState;
1291
+ var editableFields = new Set(["name", "start", "end", "process", "assignee", "plannedStart", "plannedEnd", "plannedEffort", "actualEffort", "status"]);
1292
+ var columnIds = columns.map(function (column) {
1293
+ return typeof column === "string" ? column : column.id;
1294
+ });
1295
+ var resolveColumnId = function resolveColumnId(column) {
1296
+ return typeof column === "string" ? column : column.id;
1297
+ };
1298
+ var isCellEditable = function isCellEditable(task, columnId) {
1299
+ var tableEditable = allowEditing;
1300
+ var columnEditable = editableFields.has(columnId);
1301
+ var rowEditable = task.isDisabled !== true;
1302
+ var cellEditableByRule = true;
1303
+ return tableEditable && columnEditable && rowEditable && cellEditableByRule;
1304
+ };
1305
+ var selectCell = editingContext === null || editingContext === void 0 ? void 0 : editingContext.selectCell;
1306
+ var startEditing = editingContext === null || editingContext === void 0 ? void 0 : editingContext.startEditing;
1307
+ var findCellPosition = function findCellPosition() {
1308
+ if (!editingState || editingState.mode === "viewing") {
1309
+ return null;
1310
+ }
1311
+ var rowIndex = tasks.findIndex(function (task) {
1312
+ return task.id === editingState.rowId;
1313
+ });
1314
+ var columnIndex = columnIds.indexOf(editingState.columnId);
1315
+ if (rowIndex < 0 || columnIndex < 0) {
1316
+ return null;
1317
+ }
1318
+ return {
1319
+ rowIndex: rowIndex,
1320
+ columnIndex: columnIndex
1321
+ };
1322
+ };
1323
+ var resolveSelectedCell = function resolveSelectedCell() {
1324
+ if (!editingState || editingState.mode !== "selected") {
1325
+ return null;
1326
+ }
1327
+ var columnId = editingState.columnId;
1328
+ if (!columnId || !columnIds.includes(columnId)) {
1329
+ return null;
1330
+ }
1331
+ var task = tasks.find(function (row) {
1332
+ return row.id === editingState.rowId;
1333
+ });
1334
+ if (!task) {
1335
+ return null;
1336
+ }
1337
+ return {
1338
+ task: task,
1339
+ columnId: columnId
1340
+ };
1341
+ };
1342
+ var moveSelection = function moveSelection(direction) {
1343
+ if (!selectCell || tasks.length === 0 || columnIds.length === 0) {
1344
+ return;
1345
+ }
1346
+ var position = findCellPosition();
1347
+ if (!position) {
1348
+ var firstColumn = columnIds[0];
1349
+ selectCell(tasks[0].id, firstColumn);
1350
+ return;
1351
+ }
1352
+ var rowIndex = position.rowIndex,
1353
+ columnIndex = position.columnIndex;
1354
+ switch (direction) {
1355
+ case "up":
1356
+ rowIndex = Math.max(0, rowIndex - 1);
1357
+ break;
1358
+ case "down":
1359
+ rowIndex = Math.min(tasks.length - 1, rowIndex + 1);
1360
+ break;
1361
+ case "left":
1362
+ columnIndex = Math.max(0, columnIndex - 1);
1363
+ break;
1364
+ case "right":
1365
+ columnIndex = Math.min(columnIds.length - 1, columnIndex + 1);
1366
+ break;
1367
+ }
1368
+ selectCell(tasks[rowIndex].id, columnIds[columnIndex]);
1369
+ };
1370
+ var shouldIgnoreKeyEvent = function shouldIgnoreKeyEvent(target) {
1371
+ if (!(target instanceof HTMLElement)) {
1372
+ return false;
1373
+ }
1374
+ if (target.isContentEditable) {
1375
+ return true;
1376
+ }
1377
+ var tagName = target.tagName;
1378
+ return tagName === "INPUT" || tagName === "TEXTAREA" || tagName === "SELECT";
1379
+ };
1380
+ var handleWrapperKeyDown = function handleWrapperKeyDown(event) {
1381
+ if (event.defaultPrevented) {
1382
+ return;
1383
+ }
1384
+ if (shouldIgnoreKeyEvent(event.target)) {
1385
+ return;
1386
+ }
1387
+ if ((editingState === null || editingState === void 0 ? void 0 : editingState.mode) === "editing") {
1388
+ return;
289
1389
  }
290
- }, "\xA0Name"), React.createElement("div", {
291
- className: styles.ganttTable_HeaderSeparator,
292
- style: {
293
- height: headerHeight * 0.5,
294
- marginTop: headerHeight * 0.2
1390
+ switch (event.key) {
1391
+ case "ArrowUp":
1392
+ event.preventDefault();
1393
+ moveSelection("up");
1394
+ return;
1395
+ case "ArrowDown":
1396
+ event.preventDefault();
1397
+ moveSelection("down");
1398
+ return;
1399
+ case "ArrowLeft":
1400
+ event.preventDefault();
1401
+ moveSelection("left");
1402
+ return;
1403
+ case "ArrowRight":
1404
+ event.preventDefault();
1405
+ moveSelection("right");
1406
+ return;
295
1407
  }
296
- }), React.createElement("div", {
297
- className: styles.ganttTable_HeaderItem,
298
- style: {
299
- minWidth: rowWidth
1408
+ if ((editingState === null || editingState === void 0 ? void 0 : editingState.mode) !== "selected") {
1409
+ return;
300
1410
  }
301
- }, "\xA0From"), React.createElement("div", {
302
- className: styles.ganttTable_HeaderSeparator,
303
- style: {
304
- height: headerHeight * 0.5,
305
- marginTop: headerHeight * 0.25
1411
+ var selectedCell = resolveSelectedCell();
1412
+ if (!selectedCell || !startEditing) {
1413
+ return;
306
1414
  }
307
- }), React.createElement("div", {
308
- className: styles.ganttTable_HeaderItem,
309
- style: {
310
- minWidth: rowWidth
1415
+ if (event.key === "Enter") {
1416
+ if (!isCellEditable(selectedCell.task, selectedCell.columnId)) {
1417
+ console.debug("[TaskList] ignore enter editing", {
1418
+ reason: "not-editable",
1419
+ rowId: selectedCell.task.id,
1420
+ columnId: selectedCell.columnId
1421
+ });
1422
+ return;
1423
+ }
1424
+ event.preventDefault();
1425
+ startEditing(selectedCell.task.id, selectedCell.columnId, "enter");
1426
+ return;
311
1427
  }
312
- }, "\xA0To")));
313
- };
314
-
315
- var styles$1 = {"taskListWrapper":"_3ZbQT","taskListTableRow":"_34SS0","taskListCell":"_3lLk3","taskListNameWrapper":"_nI1Xw","taskListExpander":"_2QjE6","taskListEmptyExpander":"_2TfEi"};
316
-
317
- var localeDateStringCache = {};
318
-
319
- var toLocaleDateStringFactory = function toLocaleDateStringFactory(locale) {
320
- return function (date, dateTimeOptions) {
321
- var key = date.toString();
322
- var lds = localeDateStringCache[key];
323
-
324
- if (!lds) {
325
- lds = date.toLocaleDateString(locale, dateTimeOptions);
326
- localeDateStringCache[key] = lds;
1428
+ if (event.key === "Escape") {
1429
+ return;
1430
+ }
1431
+ var isPrintableKey = event.key.length === 1 && !event.metaKey && !event.ctrlKey && !event.altKey;
1432
+ if (isPrintableKey) {
1433
+ if (!isCellEditable(selectedCell.task, selectedCell.columnId)) {
1434
+ console.debug("[TaskList] ignore enter editing", {
1435
+ reason: "not-editable",
1436
+ rowId: selectedCell.task.id,
1437
+ columnId: selectedCell.columnId
1438
+ });
1439
+ return;
1440
+ }
1441
+ event.preventDefault();
1442
+ startEditing(selectedCell.task.id, selectedCell.columnId, "key");
327
1443
  }
328
-
329
- return lds;
330
1444
  };
331
- };
332
-
333
- var dateTimeOptions = {
334
- weekday: "short",
335
- year: "numeric",
336
- month: "long",
337
- day: "numeric"
338
- };
339
- var TaskListTableDefault = function TaskListTableDefault(_ref) {
340
- var rowHeight = _ref.rowHeight,
341
- rowWidth = _ref.rowWidth,
342
- tasks = _ref.tasks,
343
- fontFamily = _ref.fontFamily,
344
- fontSize = _ref.fontSize,
345
- locale = _ref.locale,
346
- onExpanderClick = _ref.onExpanderClick;
347
- var toLocaleDateString = useMemo(function () {
348
- return toLocaleDateStringFactory(locale);
349
- }, [locale]);
350
1445
  return React.createElement("div", {
351
1446
  className: styles$1.taskListWrapper,
1447
+ tabIndex: 0,
1448
+ onKeyDown: handleWrapperKeyDown,
352
1449
  style: {
353
1450
  fontFamily: fontFamily,
354
1451
  fontSize: fontSize
355
1452
  }
356
1453
  }, tasks.map(function (t) {
357
1454
  var expanderSymbol = "";
358
-
359
1455
  if (t.hideChildren === false) {
360
1456
  expanderSymbol = "▼";
361
1457
  } else if (t.hideChildren === true) {
362
1458
  expanderSymbol = "▶";
363
1459
  }
364
-
1460
+ var renderCell = function renderCell(field) {
1461
+ switch (field) {
1462
+ case "name":
1463
+ return React.createElement("div", {
1464
+ className: styles$1.taskListNameWrapper
1465
+ }, React.createElement("div", {
1466
+ className: expanderSymbol ? styles$1.taskListExpander : styles$1.taskListEmptyExpander,
1467
+ onClick: function onClick() {
1468
+ return onExpanderClick(t);
1469
+ }
1470
+ }, expanderSymbol), React.createElement("div", null, t.name));
1471
+ case "start":
1472
+ return React.createElement("span", null, formatDate(t.start));
1473
+ case "end":
1474
+ return React.createElement("span", null, formatDate(t.end));
1475
+ case "process":
1476
+ return React.createElement("span", null, normalizeProcess(t.process));
1477
+ case "assignee":
1478
+ return React.createElement("span", null, t.assignee || "");
1479
+ case "plannedStart":
1480
+ return React.createElement("span", null, formatDate(t.plannedStart));
1481
+ case "plannedEnd":
1482
+ return React.createElement("span", null, formatDate(t.plannedEnd));
1483
+ case "plannedEffort":
1484
+ return React.createElement("span", null, formatEffort(t.plannedEffort, effortDisplayUnit));
1485
+ case "actualEffort":
1486
+ return React.createElement("span", null, formatEffort(t.actualEffort, effortDisplayUnit));
1487
+ case "status":
1488
+ {
1489
+ var statusValue = normalizeStatus(t.status);
1490
+ return React.createElement("div", {
1491
+ className: styles$1.statusWrapper
1492
+ }, React.createElement("span", {
1493
+ className: styles$1.statusBadge,
1494
+ style: {
1495
+ backgroundColor: getStatusColor(statusValue)
1496
+ }
1497
+ }, getStatusBadgeText(statusValue)), React.createElement("span", {
1498
+ className: styles$1.statusText
1499
+ }, statusValue));
1500
+ }
1501
+ default:
1502
+ return null;
1503
+ }
1504
+ };
365
1505
  return React.createElement("div", {
366
1506
  className: styles$1.taskListTableRow,
367
1507
  style: {
368
1508
  height: rowHeight
369
1509
  },
370
1510
  key: t.id + "row"
371
- }, React.createElement("div", {
372
- className: styles$1.taskListCell,
373
- style: {
374
- minWidth: rowWidth,
375
- maxWidth: rowWidth
376
- },
377
- title: t.name
378
- }, React.createElement("div", {
379
- className: styles$1.taskListNameWrapper
380
- }, React.createElement("div", {
381
- className: expanderSymbol ? styles$1.taskListExpander : styles$1.taskListEmptyExpander,
382
- onClick: function onClick() {
383
- return onExpanderClick(t);
384
- }
385
- }, expanderSymbol), React.createElement("div", null, t.name))), React.createElement("div", {
386
- className: styles$1.taskListCell,
387
- style: {
388
- minWidth: rowWidth,
389
- maxWidth: rowWidth
390
- }
391
- }, "\xA0", toLocaleDateString(t.start, dateTimeOptions)), React.createElement("div", {
392
- className: styles$1.taskListCell,
393
- style: {
394
- minWidth: rowWidth,
395
- maxWidth: rowWidth
396
- }
397
- }, "\xA0", toLocaleDateString(t.end, dateTimeOptions)));
1511
+ }, columns.map(function (column) {
1512
+ var columnId = resolveColumnId(column);
1513
+ var isSelected = (editingState === null || editingState === void 0 ? void 0 : editingState.mode) !== "viewing" && (editingState === null || editingState === void 0 ? void 0 : editingState.rowId) === t.id && (editingState === null || editingState === void 0 ? void 0 : editingState.columnId) === columnId;
1514
+ var handleCellClick = function handleCellClick(event) {
1515
+ if ((editingState === null || editingState === void 0 ? void 0 : editingState.mode) === "editing") {
1516
+ var pending = editingState.pending;
1517
+ console.log("[edit:select]", {
1518
+ rowId: t.id,
1519
+ columnId: columnId,
1520
+ pending: pending
1521
+ });
1522
+ if (pending) {
1523
+ return;
1524
+ }
1525
+ }
1526
+ if (selectCell) {
1527
+ selectCell(t.id, columnId);
1528
+ }
1529
+ event.currentTarget.focus();
1530
+ };
1531
+ var handleCellDoubleClick = function handleCellDoubleClick() {
1532
+ if (!startEditing) {
1533
+ return;
1534
+ }
1535
+ if (!isCellEditable(t, columnId)) {
1536
+ console.debug("[TaskList] ignore enter editing", {
1537
+ reason: "not-editable",
1538
+ rowId: t.id,
1539
+ columnId: columnId
1540
+ });
1541
+ return;
1542
+ }
1543
+ startEditing(t.id, columnId, "dblclick");
1544
+ };
1545
+ var handleCellKeyDown = function handleCellKeyDown(event) {
1546
+ if (shouldIgnoreKeyEvent(event.target)) {
1547
+ return;
1548
+ }
1549
+ if (!isSelected || (editingState === null || editingState === void 0 ? void 0 : editingState.mode) !== "selected") {
1550
+ return;
1551
+ }
1552
+ if (event.key === "Enter") {
1553
+ if (!startEditing) {
1554
+ return;
1555
+ }
1556
+ if (!isCellEditable(t, columnId)) {
1557
+ console.debug("[TaskList] ignore enter editing", {
1558
+ reason: "not-editable",
1559
+ rowId: t.id,
1560
+ columnId: columnId
1561
+ });
1562
+ return;
1563
+ }
1564
+ event.preventDefault();
1565
+ startEditing(t.id, columnId, "enter");
1566
+ return;
1567
+ }
1568
+ if (event.key === "Escape") {
1569
+ return;
1570
+ }
1571
+ var isPrintableKey = event.key.length === 1 && !event.metaKey && !event.ctrlKey && !event.altKey;
1572
+ if (isPrintableKey) {
1573
+ if (!startEditing) {
1574
+ return;
1575
+ }
1576
+ if (!isCellEditable(t, columnId)) {
1577
+ console.debug("[TaskList] ignore enter editing", {
1578
+ reason: "not-editable",
1579
+ rowId: t.id,
1580
+ columnId: columnId
1581
+ });
1582
+ return;
1583
+ }
1584
+ event.preventDefault();
1585
+ startEditing(t.id, columnId, "key");
1586
+ }
1587
+ };
1588
+ return React.createElement("div", {
1589
+ key: t.id + "-" + columnId,
1590
+ className: styles$1.taskListCell,
1591
+ "data-row-id": t.id,
1592
+ "data-column-id": columnId,
1593
+ "aria-selected": isSelected || undefined,
1594
+ tabIndex: isSelected ? 0 : -1,
1595
+ onClick: handleCellClick,
1596
+ onDoubleClick: handleCellDoubleClick,
1597
+ onKeyDown: handleCellKeyDown,
1598
+ style: {
1599
+ minWidth: typeof column === "string" ? rowWidth : column.width + "px",
1600
+ maxWidth: typeof column === "string" ? rowWidth : column.width + "px"
1601
+ },
1602
+ title: columnId === "name" ? t.name : undefined
1603
+ }, renderCell(columnId));
1604
+ }));
398
1605
  }));
399
1606
  };
400
1607
 
401
- var styles$2 = {"tooltipDefaultContainer":"_3T42e","tooltipDefaultContainerParagraph":"_29NTg","tooltipDetailsContainer":"_25P-K","tooltipDetailsContainerHidden":"_3gVAq"};
1608
+ var styles$2 = {"tooltipDefaultContainer":"_3T42e","tooltipDefaultContainerParagraph":"_29NTg","tooltipTitle":"_OlR7X","tooltipName":"_1LUF2","tooltipDate":"_18-nf","tooltipRow":"_2rDF0","tooltipLabel":"_2vh4d","tooltipValue":"_2HKiU","tooltipStatus":"_2Vw2t","tooltipStatusText":"_33_nk","tooltipDetailsContainer":"_25P-K","tooltipDetailsContainerHidden":"_3gVAq"};
402
1609
 
403
1610
  var Tooltip = function Tooltip(_ref) {
404
1611
  var task = _ref.task,
405
- rowHeight = _ref.rowHeight,
406
- rtl = _ref.rtl,
407
- svgContainerHeight = _ref.svgContainerHeight,
408
- svgContainerWidth = _ref.svgContainerWidth,
409
- scrollX = _ref.scrollX,
410
- scrollY = _ref.scrollY,
411
- arrowIndent = _ref.arrowIndent,
412
- fontSize = _ref.fontSize,
413
- fontFamily = _ref.fontFamily,
414
- headerHeight = _ref.headerHeight,
415
- taskListWidth = _ref.taskListWidth,
416
- TooltipContent = _ref.TooltipContent;
1612
+ rowHeight = _ref.rowHeight,
1613
+ rtl = _ref.rtl,
1614
+ svgContainerHeight = _ref.svgContainerHeight,
1615
+ svgContainerWidth = _ref.svgContainerWidth,
1616
+ scrollX = _ref.scrollX,
1617
+ scrollY = _ref.scrollY,
1618
+ arrowIndent = _ref.arrowIndent,
1619
+ fontSize = _ref.fontSize,
1620
+ fontFamily = _ref.fontFamily,
1621
+ headerHeight = _ref.headerHeight,
1622
+ taskListWidth = _ref.taskListWidth,
1623
+ TooltipContent = _ref.TooltipContent,
1624
+ effortDisplayUnit = _ref.effortDisplayUnit;
417
1625
  var tooltipRef = useRef(null);
418
-
419
1626
  var _useState = useState(0),
420
- relatedY = _useState[0],
421
- setRelatedY = _useState[1];
422
-
1627
+ relatedY = _useState[0],
1628
+ setRelatedY = _useState[1];
423
1629
  var _useState2 = useState(0),
424
- relatedX = _useState2[0],
425
- setRelatedX = _useState2[1];
426
-
1630
+ relatedX = _useState2[0],
1631
+ setRelatedX = _useState2[1];
427
1632
  useEffect(function () {
428
1633
  if (tooltipRef.current) {
429
1634
  var tooltipHeight = tooltipRef.current.offsetHeight * 1.1;
430
1635
  var tooltipWidth = tooltipRef.current.offsetWidth * 1.1;
431
1636
  var newRelatedY = task.index * rowHeight - scrollY + headerHeight;
432
1637
  var newRelatedX;
433
-
434
1638
  if (rtl) {
435
1639
  newRelatedX = task.x1 - arrowIndent * 1.5 - tooltipWidth - scrollX;
436
-
437
1640
  if (newRelatedX < 0) {
438
1641
  newRelatedX = task.x2 + arrowIndent * 1.5 - scrollX;
439
1642
  }
440
-
441
1643
  var tooltipLeftmostPoint = tooltipWidth + newRelatedX;
442
-
443
1644
  if (tooltipLeftmostPoint > svgContainerWidth) {
444
1645
  newRelatedX = svgContainerWidth - tooltipWidth;
445
1646
  newRelatedY += rowHeight;
446
1647
  }
447
1648
  } else {
448
1649
  newRelatedX = task.x2 + arrowIndent * 1.5 + taskListWidth - scrollX;
449
-
450
1650
  var _tooltipLeftmostPoint = tooltipWidth + newRelatedX;
451
-
452
1651
  var fullChartWidth = taskListWidth + svgContainerWidth;
453
-
454
1652
  if (_tooltipLeftmostPoint > fullChartWidth) {
455
1653
  newRelatedX = task.x1 + taskListWidth - arrowIndent * 1.5 - scrollX - tooltipWidth;
456
1654
  }
457
-
458
1655
  if (newRelatedX < taskListWidth) {
459
1656
  newRelatedX = svgContainerWidth + taskListWidth - tooltipWidth;
460
1657
  newRelatedY += rowHeight;
461
1658
  }
462
1659
  }
463
-
464
1660
  var tooltipLowerPoint = tooltipHeight + newRelatedY - scrollY;
465
-
466
1661
  if (tooltipLowerPoint > svgContainerHeight - scrollY) {
467
1662
  newRelatedY = svgContainerHeight - tooltipHeight;
468
1663
  }
469
-
470
1664
  setRelatedY(newRelatedY);
471
1665
  setRelatedX(newRelatedX);
472
1666
  }
@@ -481,40 +1675,92 @@ var Tooltip = function Tooltip(_ref) {
481
1675
  }, React.createElement(TooltipContent, {
482
1676
  task: task,
483
1677
  fontSize: fontSize,
484
- fontFamily: fontFamily
1678
+ fontFamily: fontFamily,
1679
+ effortDisplayUnit: effortDisplayUnit
485
1680
  }));
486
1681
  };
487
1682
  var StandardTooltipContent = function StandardTooltipContent(_ref2) {
488
1683
  var task = _ref2.task,
489
- fontSize = _ref2.fontSize,
490
- fontFamily = _ref2.fontFamily;
1684
+ fontSize = _ref2.fontSize,
1685
+ fontFamily = _ref2.fontFamily,
1686
+ _ref2$effortDisplayUn = _ref2.effortDisplayUnit,
1687
+ effortDisplayUnit = _ref2$effortDisplayUn === void 0 ? "MH" : _ref2$effortDisplayUn;
491
1688
  var style = {
492
1689
  fontSize: fontSize,
493
1690
  fontFamily: fontFamily
494
1691
  };
1692
+ var normalizedStatus = normalizeStatus(task.status);
1693
+ var normalizedProcess = normalizeProcess(task.process);
1694
+ var dateRange = formatDate(task.start) + " \u301C " + formatDate(task.end);
1695
+ var plannedRange = task.plannedStart || task.plannedEnd ? formatDate(task.plannedStart) + " \u301C " + formatDate(task.plannedEnd) : "";
1696
+ var plannedEffort = formatEffort(task.plannedEffort, effortDisplayUnit);
1697
+ var actualEffort = formatEffort(task.actualEffort, effortDisplayUnit);
495
1698
  return React.createElement("div", {
496
1699
  className: styles$2.tooltipDefaultContainer,
497
1700
  style: style
1701
+ }, React.createElement("div", {
1702
+ className: styles$2.tooltipTitle
498
1703
  }, React.createElement("b", {
1704
+ className: styles$2.tooltipName
1705
+ }, task.name), React.createElement("span", {
1706
+ className: styles$2.tooltipDate
1707
+ }, dateRange)), React.createElement("div", {
1708
+ className: styles$2.tooltipRow
1709
+ }, React.createElement("span", {
1710
+ className: styles$2.tooltipLabel
1711
+ }, "\u5DE5\u7A0B"), React.createElement("span", {
1712
+ className: styles$2.tooltipValue
1713
+ }, normalizedProcess)), React.createElement("div", {
1714
+ className: styles$2.tooltipRow
1715
+ }, React.createElement("span", {
1716
+ className: styles$2.tooltipLabel
1717
+ }, "\u62C5\u5F53"), React.createElement("span", {
1718
+ className: styles$2.tooltipValue
1719
+ }, task.assignee || "-")), plannedRange && React.createElement("div", {
1720
+ className: styles$2.tooltipRow
1721
+ }, React.createElement("span", {
1722
+ className: styles$2.tooltipLabel
1723
+ }, "\u4E88\u5B9A"), React.createElement("span", {
1724
+ className: styles$2.tooltipValue
1725
+ }, plannedRange)), plannedEffort && React.createElement("div", {
1726
+ className: styles$2.tooltipRow
1727
+ }, React.createElement("span", {
1728
+ className: styles$2.tooltipLabel
1729
+ }, "\u4E88\u5B9A\u5DE5\u6570"), React.createElement("span", {
1730
+ className: styles$2.tooltipValue
1731
+ }, plannedEffort)), actualEffort && React.createElement("div", {
1732
+ className: styles$2.tooltipRow
1733
+ }, React.createElement("span", {
1734
+ className: styles$2.tooltipLabel
1735
+ }, "\u5B9F\u7E3E\u5DE5\u6570"), React.createElement("span", {
1736
+ className: styles$2.tooltipValue
1737
+ }, actualEffort)), React.createElement("div", {
1738
+ className: styles$2.tooltipRow
1739
+ }, React.createElement("span", {
1740
+ className: styles$2.tooltipLabel
1741
+ }, "\u30B9\u30C6\u30FC\u30BF\u30B9"), React.createElement("span", {
1742
+ className: styles$2.tooltipValue
1743
+ }, React.createElement("span", {
1744
+ className: styles$2.tooltipStatus,
499
1745
  style: {
500
- fontSize: fontSize + 6
1746
+ backgroundColor: getStatusColor(normalizedStatus)
501
1747
  }
502
- }, task.name + ": " + task.start.getDate() + "-" + (task.start.getMonth() + 1) + "-" + task.start.getFullYear() + " - " + task.end.getDate() + "-" + (task.end.getMonth() + 1) + "-" + task.end.getFullYear()), task.end.getTime() - task.start.getTime() !== 0 && React.createElement("p", {
1748
+ }, getStatusBadgeText(normalizedStatus)), React.createElement("span", {
1749
+ className: styles$2.tooltipStatusText
1750
+ }, normalizedStatus))), !!task.progress && React.createElement("p", {
503
1751
  className: styles$2.tooltipDefaultContainerParagraph
504
- }, "Duration: " + ~~((task.end.getTime() - task.start.getTime()) / (1000 * 60 * 60 * 24)) + " day(s)"), React.createElement("p", {
505
- className: styles$2.tooltipDefaultContainerParagraph
506
- }, !!task.progress && "Progress: " + task.progress + " %"));
1752
+ }, "\u9032\u6357\u7387: ", task.progress, " %"));
507
1753
  };
508
1754
 
509
1755
  var styles$3 = {"scroll":"_1eT-t"};
510
1756
 
511
1757
  var VerticalScroll = function VerticalScroll(_ref) {
512
1758
  var scroll = _ref.scroll,
513
- ganttHeight = _ref.ganttHeight,
514
- ganttFullHeight = _ref.ganttFullHeight,
515
- headerHeight = _ref.headerHeight,
516
- rtl = _ref.rtl,
517
- onScroll = _ref.onScroll;
1759
+ ganttHeight = _ref.ganttHeight,
1760
+ ganttFullHeight = _ref.ganttFullHeight,
1761
+ headerHeight = _ref.headerHeight,
1762
+ rtl = _ref.rtl,
1763
+ onScroll = _ref.onScroll;
518
1764
  var scrollRef = useRef(null);
519
1765
  useEffect(function () {
520
1766
  if (scrollRef.current) {
@@ -523,9 +1769,11 @@ var VerticalScroll = function VerticalScroll(_ref) {
523
1769
  }, [scroll]);
524
1770
  return React.createElement("div", {
525
1771
  style: {
1772
+ position: "absolute",
1773
+ top: headerHeight,
526
1774
  height: ganttHeight,
527
- marginTop: headerHeight,
528
- marginLeft: rtl ? "" : "-1rem"
1775
+ right: rtl ? undefined : 0,
1776
+ left: rtl ? 0 : undefined
529
1777
  },
530
1778
  className: styles$3.scroll,
531
1779
  onScroll: onScroll,
@@ -538,68 +1786,168 @@ var VerticalScroll = function VerticalScroll(_ref) {
538
1786
  }));
539
1787
  };
540
1788
 
541
- var TaskList = function TaskList(_ref) {
542
- var headerHeight = _ref.headerHeight,
543
- fontFamily = _ref.fontFamily,
544
- fontSize = _ref.fontSize,
545
- rowWidth = _ref.rowWidth,
546
- rowHeight = _ref.rowHeight,
547
- scrollY = _ref.scrollY,
548
- tasks = _ref.tasks,
549
- selectedTask = _ref.selectedTask,
550
- setSelectedTask = _ref.setSelectedTask,
551
- onExpanderClick = _ref.onExpanderClick,
552
- locale = _ref.locale,
553
- ganttHeight = _ref.ganttHeight,
554
- taskListRef = _ref.taskListRef,
555
- horizontalContainerClass = _ref.horizontalContainerClass,
556
- TaskListHeader = _ref.TaskListHeader,
557
- TaskListTable = _ref.TaskListTable;
558
- var horizontalContainerRef = useRef(null);
559
- useEffect(function () {
560
- if (horizontalContainerRef.current) {
561
- horizontalContainerRef.current.scrollTop = scrollY;
562
- }
563
- }, [scrollY]);
564
- var headerProps = {
565
- headerHeight: headerHeight,
566
- fontFamily: fontFamily,
567
- fontSize: fontSize,
568
- rowWidth: rowWidth
569
- };
570
- var selectedTaskId = selectedTask ? selectedTask.id : "";
571
- var tableProps = {
572
- rowHeight: rowHeight,
573
- rowWidth: rowWidth,
574
- fontFamily: fontFamily,
575
- fontSize: fontSize,
576
- tasks: tasks,
1789
+ var JP_HOLIDAYS = {
1790
+ 2024: ["2024-01-01", "2024-01-08", "2024-02-11", "2024-02-12", "2024-02-23", "2024-03-20", "2024-04-29", "2024-05-03", "2024-05-04", "2024-05-05", "2024-05-06", "2024-07-15", "2024-08-11", "2024-08-12", "2024-09-16", "2024-09-22", "2024-09-23", "2024-10-14", "2024-11-03", "2024-11-04", "2024-11-23"],
1791
+ 2025: ["2025-01-01", "2025-01-13", "2025-02-11", "2025-02-23", "2025-02-24", "2025-03-20", "2025-04-29", "2025-05-03", "2025-05-04", "2025-05-05", "2025-05-06", "2025-07-21", "2025-08-11", "2025-09-15", "2025-09-23", "2025-10-13", "2025-11-03", "2025-11-23", "2025-11-24"],
1792
+ 2026: ["2026-01-01", "2026-01-12", "2026-02-11", "2026-02-23", "2026-03-20", "2026-04-29", "2026-05-03", "2026-05-04", "2026-05-05", "2026-05-06", "2026-07-20", "2026-08-11", "2026-09-21", "2026-09-22", "2026-10-12", "2026-11-03", "2026-11-23"]
1793
+ };
1794
+ var getJPHolidaySet = function getJPHolidaySet() {
1795
+ var holidays = new Set();
1796
+ Object.values(JP_HOLIDAYS).forEach(function (yearHolidays) {
1797
+ yearHolidays.forEach(function (holiday) {
1798
+ return holidays.add(holiday);
1799
+ });
1800
+ });
1801
+ return holidays;
1802
+ };
1803
+ var JP_HOLIDAYS_SET = getJPHolidaySet();
1804
+
1805
+ var emittedWarnings = new Set();
1806
+ var warnOnce = function warnOnce(key, message) {
1807
+ if (!emittedWarnings.has(key) && typeof console !== "undefined") {
1808
+ console.warn(message);
1809
+ emittedWarnings.add(key);
1810
+ }
1811
+ };
1812
+ var normalizeCalendarConfig = function normalizeCalendarConfig(config) {
1813
+ var _config$locale, _config$enableJPHolid, _config$highlightNonW;
1814
+ var rawLocale = ((_config$locale = config.locale) === null || _config$locale === void 0 ? void 0 : _config$locale.trim()) || "";
1815
+ var locale = rawLocale || "ja";
1816
+ var dateFormat = config.dateFormat || "MM/dd(EEE)";
1817
+ var enableJPHoliday = (_config$enableJPHolid = config.enableJPHoliday) != null ? _config$enableJPHolid : true;
1818
+ var highlightNonWorkingDays = (_config$highlightNonW = config.highlightNonWorkingDays) != null ? _config$highlightNonW : true;
1819
+ var workOnSaturday = config.workOnSaturday === true;
1820
+ var extraHolidays = new Set();
1821
+ if (config.extraHolidays) {
1822
+ config.extraHolidays.forEach(function (dateStr) {
1823
+ var normalized = normalizeISODate(dateStr);
1824
+ if (normalized) {
1825
+ extraHolidays.add(normalized);
1826
+ }
1827
+ });
1828
+ }
1829
+ var extraWorkingDays = new Set();
1830
+ if (config.extraWorkingDays) {
1831
+ config.extraWorkingDays.forEach(function (dateStr) {
1832
+ var normalized = normalizeISODate(dateStr);
1833
+ if (normalized) {
1834
+ extraWorkingDays.add(normalized);
1835
+ }
1836
+ });
1837
+ }
1838
+ if (!locale.toLowerCase().startsWith("ja")) {
1839
+ var localeKey = locale.trim().toLowerCase();
1840
+ warnOnce("gantt-calendar-locale-" + localeKey, "[Gantt Calendar] Non-Japanese locale \"" + locale + "\" specified. " + "Holiday definitions (including Japanese public holidays) are still based on the Japanese calendar.");
1841
+ }
1842
+ if (dateFormat !== "MM/dd(EEE)") {
1843
+ var dateFormatKey = dateFormat.trim().toLowerCase();
1844
+ warnOnce("gantt-calendar-dateFormat-" + dateFormatKey, "[Gantt Calendar] Custom dateFormat \"" + dateFormat + "\" specified. " + "Note: dateFormat is currently a legacy field and does not affect date rendering. " + "The format \"MM/dd(EEE)\" is used internally regardless of this setting.");
1845
+ }
1846
+ return {
577
1847
  locale: locale,
578
- selectedTaskId: selectedTaskId,
579
- setSelectedTask: setSelectedTask,
580
- onExpanderClick: onExpanderClick
1848
+ dateFormat: dateFormat,
1849
+ enableJPHoliday: enableJPHoliday,
1850
+ highlightNonWorkingDays: highlightNonWorkingDays,
1851
+ workOnSaturday: workOnSaturday,
1852
+ extraHolidays: extraHolidays,
1853
+ extraWorkingDays: extraWorkingDays
581
1854
  };
582
- return React.createElement("div", {
583
- ref: taskListRef
584
- }, React.createElement(TaskListHeader, Object.assign({}, headerProps)), React.createElement("div", {
585
- ref: horizontalContainerRef,
586
- className: horizontalContainerClass,
587
- style: ganttHeight ? {
588
- height: ganttHeight
589
- } : {}
590
- }, React.createElement(TaskListTable, Object.assign({}, tableProps))));
1855
+ };
1856
+ var normalizeISODate = function normalizeISODate(dateStr) {
1857
+ try {
1858
+ var trimmed = dateStr.trim();
1859
+ if (!/^\d{4}-\d{1,2}-\d{1,2}$/.test(trimmed)) {
1860
+ return null;
1861
+ }
1862
+ var parts = trimmed.split("-");
1863
+ if (parts.length !== 3) return null;
1864
+ var year = Number(parts[0]);
1865
+ var month = Number(parts[1]);
1866
+ var day = Number(parts[2]);
1867
+ if (isNaN(year) || isNaN(month) || isNaN(day) || month < 1 || month > 12 || day < 1 || day > 31) {
1868
+ return null;
1869
+ }
1870
+ var date = new Date(year, month - 1, day);
1871
+ if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
1872
+ return null;
1873
+ }
1874
+ var paddedMonth = String(month).padStart(2, "0");
1875
+ var paddedDay = String(day).padStart(2, "0");
1876
+ return year + "-" + paddedMonth + "-" + paddedDay;
1877
+ } catch (e) {
1878
+ if (typeof console !== "undefined") {
1879
+ console.warn("[Gantt Calendar] Invalid date string: " + dateStr);
1880
+ }
1881
+ return null;
1882
+ }
1883
+ };
1884
+ var toISODateString = function toISODateString(date) {
1885
+ var year = date.getFullYear();
1886
+ var month = String(date.getMonth() + 1).padStart(2, "0");
1887
+ var day = String(date.getDate()).padStart(2, "0");
1888
+ return year + "-" + month + "-" + day;
1889
+ };
1890
+ var isWorkingDay = function isWorkingDay(date, config) {
1891
+ var dateStr = toISODateString(date);
1892
+ if (config.extraWorkingDays.has(dateStr)) {
1893
+ return true;
1894
+ }
1895
+ if (config.extraHolidays.has(dateStr)) {
1896
+ return false;
1897
+ }
1898
+ var dayOfWeek = date.getDay();
1899
+ if (dayOfWeek === 0) {
1900
+ return false;
1901
+ }
1902
+ if (dayOfWeek === 6 && !config.workOnSaturday) {
1903
+ return false;
1904
+ }
1905
+ if (config.enableJPHoliday) {
1906
+ if (JP_HOLIDAYS_SET.has(dateStr)) {
1907
+ return false;
1908
+ }
1909
+ }
1910
+ return true;
1911
+ };
1912
+ var formatJapaneseDate = function formatJapaneseDate(date) {
1913
+ try {
1914
+ var formatter = new Intl.DateTimeFormat("ja", {
1915
+ month: "2-digit",
1916
+ day: "2-digit",
1917
+ weekday: "short"
1918
+ });
1919
+ var parts = formatter.formatToParts(date);
1920
+ var month = "";
1921
+ var day = "";
1922
+ var weekday = "";
1923
+ parts.forEach(function (part) {
1924
+ if (part.type === "month") {
1925
+ month = part.value;
1926
+ } else if (part.type === "day") {
1927
+ day = part.value;
1928
+ } else if (part.type === "weekday") {
1929
+ weekday = part.value;
1930
+ }
1931
+ });
1932
+ return month + "/" + day + "(" + weekday + ")";
1933
+ } catch (e) {
1934
+ var _month = String(date.getMonth() + 1).padStart(2, "0");
1935
+ var _day = String(date.getDate()).padStart(2, "0");
1936
+ return _month + "/" + _day;
1937
+ }
591
1938
  };
592
1939
 
593
1940
  var styles$4 = {"gridRow":"_2dZTy","gridRowLine":"_3rUKi","gridTick":"_RuwuK"};
594
1941
 
595
1942
  var GridBody = function GridBody(_ref) {
596
1943
  var tasks = _ref.tasks,
597
- dates = _ref.dates,
598
- rowHeight = _ref.rowHeight,
599
- svgWidth = _ref.svgWidth,
600
- columnWidth = _ref.columnWidth,
601
- todayColor = _ref.todayColor,
602
- rtl = _ref.rtl;
1944
+ dates = _ref.dates,
1945
+ rowHeight = _ref.rowHeight,
1946
+ svgWidth = _ref.svgWidth,
1947
+ columnWidth = _ref.columnWidth,
1948
+ todayColor = _ref.todayColor,
1949
+ rtl = _ref.rtl,
1950
+ calendarConfig = _ref.calendarConfig;
603
1951
  var y = 0;
604
1952
  var gridRows = [];
605
1953
  var rowLines = [React.createElement("line", {
@@ -610,7 +1958,6 @@ var GridBody = function GridBody(_ref) {
610
1958
  y2: 0,
611
1959
  className: styles$4.gridRowLine
612
1960
  })];
613
-
614
1961
  for (var _iterator = _createForOfIteratorHelperLoose(tasks), _step; !(_step = _iterator()).done;) {
615
1962
  var task = _step.value;
616
1963
  gridRows.push(React.createElement("rect", {
@@ -631,12 +1978,11 @@ var GridBody = function GridBody(_ref) {
631
1978
  }));
632
1979
  y += rowHeight;
633
1980
  }
634
-
635
1981
  var now = new Date();
636
1982
  var tickX = 0;
637
1983
  var ticks = [];
1984
+ var nonWorkingDays = [];
638
1985
  var today = React.createElement("rect", null);
639
-
640
1986
  for (var i = 0; i < dates.length; i++) {
641
1987
  var date = dates[i];
642
1988
  ticks.push(React.createElement("line", {
@@ -647,7 +1993,16 @@ var GridBody = function GridBody(_ref) {
647
1993
  y2: y,
648
1994
  className: styles$4.gridTick
649
1995
  }));
650
-
1996
+ if (calendarConfig && calendarConfig.highlightNonWorkingDays && !isWorkingDay(date, calendarConfig)) {
1997
+ nonWorkingDays.push(React.createElement("rect", {
1998
+ key: "non-working-" + date.getTime(),
1999
+ x: tickX,
2000
+ y: 0,
2001
+ width: columnWidth,
2002
+ height: y,
2003
+ fill: "rgba(0, 0, 0, 0.05)"
2004
+ }));
2005
+ }
651
2006
  if (i + 1 !== dates.length && date.getTime() < now.getTime() && dates[i + 1].getTime() >= now.getTime() || i !== 0 && i + 1 === dates.length && date.getTime() < now.getTime() && addToDate(date, date.getTime() - dates[i - 1].getTime(), "millisecond").getTime() >= now.getTime()) {
652
2007
  today = React.createElement("rect", {
653
2008
  x: tickX,
@@ -657,7 +2012,6 @@ var GridBody = function GridBody(_ref) {
657
2012
  fill: todayColor
658
2013
  });
659
2014
  }
660
-
661
2015
  if (rtl && i + 1 !== dates.length && date.getTime() >= now.getTime() && dates[i + 1].getTime() < now.getTime()) {
662
2016
  today = React.createElement("rect", {
663
2017
  x: tickX + columnWidth,
@@ -667,15 +2021,15 @@ var GridBody = function GridBody(_ref) {
667
2021
  fill: todayColor
668
2022
  });
669
2023
  }
670
-
671
2024
  tickX += columnWidth;
672
2025
  }
673
-
674
2026
  return React.createElement("g", {
675
2027
  className: "gridBody"
676
2028
  }, React.createElement("g", {
677
2029
  className: "rows"
678
2030
  }, gridRows), React.createElement("g", {
2031
+ className: "nonWorkingDays"
2032
+ }, nonWorkingDays), React.createElement("g", {
679
2033
  className: "rowLines"
680
2034
  }, rowLines), React.createElement("g", {
681
2035
  className: "ticks"
@@ -694,11 +2048,11 @@ var styles$5 = {"calendarBottomText":"_9w8d5","calendarTopTick":"_1rLuZ","calend
694
2048
 
695
2049
  var TopPartOfCalendar = function TopPartOfCalendar(_ref) {
696
2050
  var value = _ref.value,
697
- x1Line = _ref.x1Line,
698
- y1Line = _ref.y1Line,
699
- y2Line = _ref.y2Line,
700
- xText = _ref.xText,
701
- yText = _ref.yText;
2051
+ x1Line = _ref.x1Line,
2052
+ y1Line = _ref.y1Line,
2053
+ y2Line = _ref.y2Line,
2054
+ xText = _ref.xText,
2055
+ yText = _ref.yText;
702
2056
  return React.createElement("g", {
703
2057
  className: "calendarTop"
704
2058
  }, React.createElement("line", {
@@ -718,19 +2072,19 @@ var TopPartOfCalendar = function TopPartOfCalendar(_ref) {
718
2072
 
719
2073
  var Calendar = function Calendar(_ref) {
720
2074
  var dateSetup = _ref.dateSetup,
721
- locale = _ref.locale,
722
- viewMode = _ref.viewMode,
723
- rtl = _ref.rtl,
724
- headerHeight = _ref.headerHeight,
725
- columnWidth = _ref.columnWidth,
726
- fontFamily = _ref.fontFamily,
727
- fontSize = _ref.fontSize;
728
-
2075
+ locale = _ref.locale,
2076
+ viewMode = _ref.viewMode,
2077
+ rtl = _ref.rtl,
2078
+ headerHeight = _ref.headerHeight,
2079
+ columnWidth = _ref.columnWidth,
2080
+ fontFamily = _ref.fontFamily,
2081
+ fontSize = _ref.fontSize,
2082
+ calendarConfig = _ref.calendarConfig;
2083
+ var effectiveLocale = (calendarConfig === null || calendarConfig === void 0 ? void 0 : calendarConfig.locale) || locale;
729
2084
  var getCalendarValuesForYear = function getCalendarValuesForYear() {
730
2085
  var topValues = [];
731
2086
  var bottomValues = [];
732
2087
  var topDefaultHeight = headerHeight * 0.5;
733
-
734
2088
  for (var i = 0; i < dateSetup.dates.length; i++) {
735
2089
  var date = dateSetup.dates[i];
736
2090
  var bottomValue = date.getFullYear();
@@ -740,17 +2094,14 @@ var Calendar = function Calendar(_ref) {
740
2094
  x: columnWidth * i + columnWidth * 0.5,
741
2095
  className: styles$5.calendarBottomText
742
2096
  }, bottomValue));
743
-
744
2097
  if (i === 0 || date.getFullYear() !== dateSetup.dates[i - 1].getFullYear()) {
745
2098
  var topValue = date.getFullYear().toString();
746
2099
  var xText = void 0;
747
-
748
2100
  if (rtl) {
749
2101
  xText = (6 + i + date.getFullYear() + 1) * columnWidth;
750
2102
  } else {
751
2103
  xText = (6 + i - date.getFullYear()) * columnWidth;
752
2104
  }
753
-
754
2105
  topValues.push(React.createElement(TopPartOfCalendar, {
755
2106
  key: topValue,
756
2107
  value: topValue,
@@ -762,15 +2113,12 @@ var Calendar = function Calendar(_ref) {
762
2113
  }));
763
2114
  }
764
2115
  }
765
-
766
2116
  return [topValues, bottomValues];
767
2117
  };
768
-
769
2118
  var getCalendarValuesForQuarterYear = function getCalendarValuesForQuarterYear() {
770
2119
  var topValues = [];
771
2120
  var bottomValues = [];
772
2121
  var topDefaultHeight = headerHeight * 0.5;
773
-
774
2122
  for (var i = 0; i < dateSetup.dates.length; i++) {
775
2123
  var date = dateSetup.dates[i];
776
2124
  var quarter = "Q" + Math.floor((date.getMonth() + 3) / 3);
@@ -780,17 +2128,14 @@ var Calendar = function Calendar(_ref) {
780
2128
  x: columnWidth * i + columnWidth * 0.5,
781
2129
  className: styles$5.calendarBottomText
782
2130
  }, quarter));
783
-
784
2131
  if (i === 0 || date.getFullYear() !== dateSetup.dates[i - 1].getFullYear()) {
785
2132
  var topValue = date.getFullYear().toString();
786
2133
  var xText = void 0;
787
-
788
2134
  if (rtl) {
789
2135
  xText = (6 + i + date.getMonth() + 1) * columnWidth;
790
2136
  } else {
791
2137
  xText = (6 + i - date.getMonth()) * columnWidth;
792
2138
  }
793
-
794
2139
  topValues.push(React.createElement(TopPartOfCalendar, {
795
2140
  key: topValue,
796
2141
  value: topValue,
@@ -802,35 +2147,29 @@ var Calendar = function Calendar(_ref) {
802
2147
  }));
803
2148
  }
804
2149
  }
805
-
806
2150
  return [topValues, bottomValues];
807
2151
  };
808
-
809
2152
  var getCalendarValuesForMonth = function getCalendarValuesForMonth() {
810
2153
  var topValues = [];
811
2154
  var bottomValues = [];
812
2155
  var topDefaultHeight = headerHeight * 0.5;
813
-
814
2156
  for (var i = 0; i < dateSetup.dates.length; i++) {
815
2157
  var date = dateSetup.dates[i];
816
- var bottomValue = getLocaleMonth(date, locale);
2158
+ var bottomValue = getLocaleMonth(date, effectiveLocale);
817
2159
  bottomValues.push(React.createElement("text", {
818
2160
  key: bottomValue + date.getFullYear(),
819
2161
  y: headerHeight * 0.8,
820
2162
  x: columnWidth * i + columnWidth * 0.5,
821
2163
  className: styles$5.calendarBottomText
822
2164
  }, bottomValue));
823
-
824
2165
  if (i === 0 || date.getFullYear() !== dateSetup.dates[i - 1].getFullYear()) {
825
2166
  var topValue = date.getFullYear().toString();
826
2167
  var xText = void 0;
827
-
828
2168
  if (rtl) {
829
2169
  xText = (6 + i + date.getMonth() + 1) * columnWidth;
830
2170
  } else {
831
2171
  xText = (6 + i - date.getMonth()) * columnWidth;
832
2172
  }
833
-
834
2173
  topValues.push(React.createElement(TopPartOfCalendar, {
835
2174
  key: topValue,
836
2175
  value: topValue,
@@ -842,25 +2181,20 @@ var Calendar = function Calendar(_ref) {
842
2181
  }));
843
2182
  }
844
2183
  }
845
-
846
2184
  return [topValues, bottomValues];
847
2185
  };
848
-
849
2186
  var getCalendarValuesForWeek = function getCalendarValuesForWeek() {
850
2187
  var topValues = [];
851
2188
  var bottomValues = [];
852
2189
  var weeksCount = 1;
853
2190
  var topDefaultHeight = headerHeight * 0.5;
854
2191
  var dates = dateSetup.dates;
855
-
856
2192
  for (var i = dates.length - 1; i >= 0; i--) {
857
2193
  var date = dates[i];
858
2194
  var topValue = "";
859
-
860
2195
  if (i === 0 || date.getMonth() !== dates[i - 1].getMonth()) {
861
- topValue = getLocaleMonth(date, locale) + ", " + date.getFullYear();
2196
+ topValue = getLocaleMonth(date, effectiveLocale) + ", " + date.getFullYear();
862
2197
  }
863
-
864
2198
  var bottomValue = "W" + getWeekNumberISO8601(date);
865
2199
  bottomValues.push(React.createElement("text", {
866
2200
  key: date.getTime(),
@@ -868,7 +2202,6 @@ var Calendar = function Calendar(_ref) {
868
2202
  x: columnWidth * (i + +rtl),
869
2203
  className: styles$5.calendarBottomText
870
2204
  }, bottomValue));
871
-
872
2205
  if (topValue) {
873
2206
  if (i !== dates.length - 1) {
874
2207
  topValues.push(React.createElement(TopPartOfCalendar, {
@@ -881,34 +2214,29 @@ var Calendar = function Calendar(_ref) {
881
2214
  yText: topDefaultHeight * 0.9
882
2215
  }));
883
2216
  }
884
-
885
2217
  weeksCount = 0;
886
2218
  }
887
-
888
2219
  weeksCount++;
889
2220
  }
890
-
891
2221
  return [topValues, bottomValues];
892
2222
  };
893
-
894
2223
  var getCalendarValuesForDay = function getCalendarValuesForDay() {
895
2224
  var topValues = [];
896
2225
  var bottomValues = [];
897
2226
  var topDefaultHeight = headerHeight * 0.5;
898
2227
  var dates = dateSetup.dates;
899
-
900
2228
  for (var i = 0; i < dates.length; i++) {
901
2229
  var date = dates[i];
902
- var bottomValue = getLocalDayOfWeek(date, locale, "short") + ", " + date.getDate().toString();
2230
+ var useJapaneseFormat = !!calendarConfig && typeof calendarConfig.locale === "string" && calendarConfig.locale.toLowerCase().startsWith("ja");
2231
+ var bottomValue = useJapaneseFormat ? formatJapaneseDate(date) : getLocalDayOfWeek(date, effectiveLocale, "short") + ", " + date.getDate().toString();
903
2232
  bottomValues.push(React.createElement("text", {
904
2233
  key: date.getTime(),
905
2234
  y: headerHeight * 0.8,
906
2235
  x: columnWidth * i + columnWidth * 0.5,
907
2236
  className: styles$5.calendarBottomText
908
2237
  }, bottomValue));
909
-
910
2238
  if (i + 1 !== dates.length && date.getMonth() !== dates[i + 1].getMonth()) {
911
- var topValue = getLocaleMonth(date, locale);
2239
+ var topValue = getLocaleMonth(date, effectiveLocale);
912
2240
  topValues.push(React.createElement(TopPartOfCalendar, {
913
2241
  key: topValue + date.getFullYear(),
914
2242
  value: topValue,
@@ -920,20 +2248,17 @@ var Calendar = function Calendar(_ref) {
920
2248
  }));
921
2249
  }
922
2250
  }
923
-
924
2251
  return [topValues, bottomValues];
925
2252
  };
926
-
927
2253
  var getCalendarValuesForPartOfDay = function getCalendarValuesForPartOfDay() {
928
2254
  var topValues = [];
929
2255
  var bottomValues = [];
930
2256
  var ticks = viewMode === ViewMode.HalfDay ? 2 : 4;
931
2257
  var topDefaultHeight = headerHeight * 0.5;
932
2258
  var dates = dateSetup.dates;
933
-
934
2259
  for (var i = 0; i < dates.length; i++) {
935
2260
  var date = dates[i];
936
- var bottomValue = getCachedDateTimeFormat(locale, {
2261
+ var bottomValue = getCachedDateTimeFormat(effectiveLocale, {
937
2262
  hour: "numeric"
938
2263
  }).format(date);
939
2264
  bottomValues.push(React.createElement("text", {
@@ -943,9 +2268,8 @@ var Calendar = function Calendar(_ref) {
943
2268
  className: styles$5.calendarBottomText,
944
2269
  fontFamily: fontFamily
945
2270
  }, bottomValue));
946
-
947
2271
  if (i === 0 || date.getDate() !== dates[i - 1].getDate()) {
948
- var topValue = getLocalDayOfWeek(date, locale, "short") + ", " + date.getDate() + " " + getLocaleMonth(date, locale);
2272
+ var topValue = getLocalDayOfWeek(date, effectiveLocale, "short") + ", " + date.getDate() + " " + getLocaleMonth(date, effectiveLocale);
949
2273
  topValues.push(React.createElement(TopPartOfCalendar, {
950
2274
  key: topValue + date.getFullYear(),
951
2275
  value: topValue,
@@ -957,19 +2281,16 @@ var Calendar = function Calendar(_ref) {
957
2281
  }));
958
2282
  }
959
2283
  }
960
-
961
2284
  return [topValues, bottomValues];
962
2285
  };
963
-
964
2286
  var getCalendarValuesForHour = function getCalendarValuesForHour() {
965
2287
  var topValues = [];
966
2288
  var bottomValues = [];
967
2289
  var topDefaultHeight = headerHeight * 0.5;
968
2290
  var dates = dateSetup.dates;
969
-
970
2291
  for (var i = 0; i < dates.length; i++) {
971
2292
  var date = dates[i];
972
- var bottomValue = getCachedDateTimeFormat(locale, {
2293
+ var bottomValue = getCachedDateTimeFormat(effectiveLocale, {
973
2294
  hour: "numeric"
974
2295
  }).format(date);
975
2296
  bottomValues.push(React.createElement("text", {
@@ -979,10 +2300,9 @@ var Calendar = function Calendar(_ref) {
979
2300
  className: styles$5.calendarBottomText,
980
2301
  fontFamily: fontFamily
981
2302
  }, bottomValue));
982
-
983
2303
  if (i !== 0 && date.getDate() !== dates[i - 1].getDate()) {
984
2304
  var displayDate = dates[i - 1];
985
- var topValue = getLocalDayOfWeek(displayDate, locale, "long") + ", " + displayDate.getDate() + " " + getLocaleMonth(displayDate, locale);
2305
+ var topValue = getLocalDayOfWeek(displayDate, effectiveLocale, "long") + ", " + displayDate.getDate() + " " + getLocaleMonth(displayDate, effectiveLocale);
986
2306
  var topPosition = (date.getHours() - 24) / 2;
987
2307
  topValues.push(React.createElement(TopPartOfCalendar, {
988
2308
  key: topValue + displayDate.getFullYear(),
@@ -995,64 +2315,47 @@ var Calendar = function Calendar(_ref) {
995
2315
  }));
996
2316
  }
997
2317
  }
998
-
999
2318
  return [topValues, bottomValues];
1000
2319
  };
1001
-
1002
2320
  var topValues = [];
1003
2321
  var bottomValues = [];
1004
-
1005
2322
  switch (dateSetup.viewMode) {
1006
2323
  case ViewMode.Year:
1007
2324
  var _getCalendarValuesFor = getCalendarValuesForYear();
1008
-
1009
2325
  topValues = _getCalendarValuesFor[0];
1010
2326
  bottomValues = _getCalendarValuesFor[1];
1011
2327
  break;
1012
-
1013
2328
  case ViewMode.QuarterYear:
1014
2329
  var _getCalendarValuesFor2 = getCalendarValuesForQuarterYear();
1015
-
1016
2330
  topValues = _getCalendarValuesFor2[0];
1017
2331
  bottomValues = _getCalendarValuesFor2[1];
1018
2332
  break;
1019
-
1020
2333
  case ViewMode.Month:
1021
2334
  var _getCalendarValuesFor3 = getCalendarValuesForMonth();
1022
-
1023
2335
  topValues = _getCalendarValuesFor3[0];
1024
2336
  bottomValues = _getCalendarValuesFor3[1];
1025
2337
  break;
1026
-
1027
2338
  case ViewMode.Week:
1028
2339
  var _getCalendarValuesFor4 = getCalendarValuesForWeek();
1029
-
1030
2340
  topValues = _getCalendarValuesFor4[0];
1031
2341
  bottomValues = _getCalendarValuesFor4[1];
1032
2342
  break;
1033
-
1034
2343
  case ViewMode.Day:
1035
2344
  var _getCalendarValuesFor5 = getCalendarValuesForDay();
1036
-
1037
2345
  topValues = _getCalendarValuesFor5[0];
1038
2346
  bottomValues = _getCalendarValuesFor5[1];
1039
2347
  break;
1040
-
1041
2348
  case ViewMode.QuarterDay:
1042
2349
  case ViewMode.HalfDay:
1043
2350
  var _getCalendarValuesFor6 = getCalendarValuesForPartOfDay();
1044
-
1045
2351
  topValues = _getCalendarValuesFor6[0];
1046
2352
  bottomValues = _getCalendarValuesFor6[1];
1047
2353
  break;
1048
-
1049
2354
  case ViewMode.Hour:
1050
2355
  var _getCalendarValuesFor7 = getCalendarValuesForHour();
1051
-
1052
2356
  topValues = _getCalendarValuesFor7[0];
1053
2357
  bottomValues = _getCalendarValuesFor7[1];
1054
2358
  }
1055
-
1056
2359
  return React.createElement("g", {
1057
2360
  className: "calendar",
1058
2361
  fontSize: fontSize,
@@ -1066,47 +2369,24 @@ var Calendar = function Calendar(_ref) {
1066
2369
  }), bottomValues, " ", topValues);
1067
2370
  };
1068
2371
 
1069
- // A type of promise-like that resolves synchronously and supports only one observer
1070
-
1071
- const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator"))) : "@@iterator";
1072
-
1073
- const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol("Symbol.asyncIterator"))) : "@@asyncIterator";
1074
-
1075
- // Asynchronously call a function and send errors to recovery continuation
1076
- function _catch(body, recover) {
1077
- try {
1078
- var result = body();
1079
- } catch(e) {
1080
- return recover(e);
1081
- }
1082
- if (result && result.then) {
1083
- return result.then(void 0, recover);
1084
- }
1085
- return result;
1086
- }
1087
-
1088
2372
  var Arrow = function Arrow(_ref) {
1089
2373
  var taskFrom = _ref.taskFrom,
1090
- taskTo = _ref.taskTo,
1091
- rowHeight = _ref.rowHeight,
1092
- taskHeight = _ref.taskHeight,
1093
- arrowIndent = _ref.arrowIndent,
1094
- rtl = _ref.rtl;
2374
+ taskTo = _ref.taskTo,
2375
+ rowHeight = _ref.rowHeight,
2376
+ taskHeight = _ref.taskHeight,
2377
+ arrowIndent = _ref.arrowIndent,
2378
+ rtl = _ref.rtl;
1095
2379
  var path;
1096
2380
  var trianglePoints;
1097
-
1098
2381
  if (rtl) {
1099
2382
  var _drownPathAndTriangle = drownPathAndTriangleRTL(taskFrom, taskTo, rowHeight, taskHeight, arrowIndent);
1100
-
1101
2383
  path = _drownPathAndTriangle[0];
1102
2384
  trianglePoints = _drownPathAndTriangle[1];
1103
2385
  } else {
1104
2386
  var _drownPathAndTriangle2 = drownPathAndTriangle(taskFrom, taskTo, rowHeight, taskHeight, arrowIndent);
1105
-
1106
2387
  path = _drownPathAndTriangle2[0];
1107
2388
  trianglePoints = _drownPathAndTriangle2[1];
1108
2389
  }
1109
-
1110
2390
  return React.createElement("g", {
1111
2391
  className: "arrow"
1112
2392
  }, React.createElement("path", {
@@ -1117,7 +2397,6 @@ var Arrow = function Arrow(_ref) {
1117
2397
  points: trianglePoints
1118
2398
  }));
1119
2399
  };
1120
-
1121
2400
  var drownPathAndTriangle = function drownPathAndTriangle(taskFrom, taskTo, rowHeight, taskHeight, arrowIndent) {
1122
2401
  var indexCompare = taskFrom.index > taskTo.index ? -1 : 1;
1123
2402
  var taskToEndPosition = taskTo.y + taskHeight / 2;
@@ -1128,7 +2407,6 @@ var drownPathAndTriangle = function drownPathAndTriangle(taskFrom, taskTo, rowHe
1128
2407
  var trianglePoints = taskTo.x1 + "," + taskToEndPosition + " \n " + (taskTo.x1 - 5) + "," + (taskToEndPosition - 5) + " \n " + (taskTo.x1 - 5) + "," + (taskToEndPosition + 5);
1129
2408
  return [path, trianglePoints];
1130
2409
  };
1131
-
1132
2410
  var drownPathAndTriangleRTL = function drownPathAndTriangleRTL(taskFrom, taskTo, rowHeight, taskHeight, arrowIndent) {
1133
2411
  var indexCompare = taskFrom.index > taskTo.index ? -1 : 1;
1134
2412
  var taskToEndPosition = taskTo.y + taskHeight / 2;
@@ -1146,47 +2424,37 @@ var convertToBarTasks = function convertToBarTasks(tasks, dates, columnWidth, ro
1146
2424
  });
1147
2425
  barTasks = barTasks.map(function (task) {
1148
2426
  var dependencies = task.dependencies || [];
1149
-
1150
2427
  var _loop = function _loop(j) {
1151
2428
  var dependence = barTasks.findIndex(function (value) {
1152
2429
  return value.id === dependencies[j];
1153
2430
  });
1154
2431
  if (dependence !== -1) barTasks[dependence].barChildren.push(task);
1155
2432
  };
1156
-
1157
2433
  for (var j = 0; j < dependencies.length; j++) {
1158
2434
  _loop(j);
1159
2435
  }
1160
-
1161
2436
  return task;
1162
2437
  });
1163
2438
  return barTasks;
1164
2439
  };
1165
-
1166
2440
  var convertToBarTask = function convertToBarTask(task, index, dates, columnWidth, rowHeight, taskHeight, barCornerRadius, handleWidth, rtl, barProgressColor, barProgressSelectedColor, barBackgroundColor, barBackgroundSelectedColor, projectProgressColor, projectProgressSelectedColor, projectBackgroundColor, projectBackgroundSelectedColor, milestoneBackgroundColor, milestoneBackgroundSelectedColor) {
1167
2441
  var barTask;
1168
-
1169
2442
  switch (task.type) {
1170
2443
  case "milestone":
1171
2444
  barTask = convertToMilestone(task, index, dates, columnWidth, rowHeight, taskHeight, barCornerRadius, handleWidth, milestoneBackgroundColor, milestoneBackgroundSelectedColor);
1172
2445
  break;
1173
-
1174
2446
  case "project":
1175
2447
  barTask = convertToBar(task, index, dates, columnWidth, rowHeight, taskHeight, barCornerRadius, handleWidth, rtl, projectProgressColor, projectProgressSelectedColor, projectBackgroundColor, projectBackgroundSelectedColor);
1176
2448
  break;
1177
-
1178
2449
  default:
1179
2450
  barTask = convertToBar(task, index, dates, columnWidth, rowHeight, taskHeight, barCornerRadius, handleWidth, rtl, barProgressColor, barProgressSelectedColor, barBackgroundColor, barBackgroundSelectedColor);
1180
2451
  break;
1181
2452
  }
1182
-
1183
2453
  return barTask;
1184
2454
  };
1185
-
1186
2455
  var convertToBar = function convertToBar(task, index, dates, columnWidth, rowHeight, taskHeight, barCornerRadius, handleWidth, rtl, barProgressColor, barProgressSelectedColor, barBackgroundColor, barBackgroundSelectedColor) {
1187
2456
  var x1;
1188
2457
  var x2;
1189
-
1190
2458
  if (rtl) {
1191
2459
  x2 = taskXCoordinateRTL(task.start, dates, columnWidth);
1192
2460
  x1 = taskXCoordinateRTL(task.end, dates, columnWidth);
@@ -1194,28 +2462,22 @@ var convertToBar = function convertToBar(task, index, dates, columnWidth, rowHei
1194
2462
  x1 = taskXCoordinate(task.start, dates, columnWidth);
1195
2463
  x2 = taskXCoordinate(task.end, dates, columnWidth);
1196
2464
  }
1197
-
1198
2465
  var typeInternal = task.type;
1199
-
1200
2466
  if (typeInternal === "task" && x2 - x1 < handleWidth * 2) {
1201
2467
  typeInternal = "smalltask";
1202
2468
  x2 = x1 + handleWidth * 2;
1203
2469
  }
1204
-
1205
2470
  var _progressWithByParams = progressWithByParams(x1, x2, task.progress, rtl),
1206
- progressWidth = _progressWithByParams[0],
1207
- progressX = _progressWithByParams[1];
1208
-
2471
+ progressWidth = _progressWithByParams[0],
2472
+ progressX = _progressWithByParams[1];
1209
2473
  var y = taskYCoordinate(index, rowHeight, taskHeight);
1210
2474
  var hideChildren = task.type === "project" ? task.hideChildren : undefined;
1211
-
1212
2475
  var styles = _extends({
1213
2476
  backgroundColor: barBackgroundColor,
1214
2477
  backgroundSelectedColor: barBackgroundSelectedColor,
1215
2478
  progressColor: barProgressColor,
1216
2479
  progressSelectedColor: barProgressSelectedColor
1217
2480
  }, task.styles);
1218
-
1219
2481
  return _extends({}, task, {
1220
2482
  typeInternal: typeInternal,
1221
2483
  x1: x1,
@@ -1232,21 +2494,18 @@ var convertToBar = function convertToBar(task, index, dates, columnWidth, rowHei
1232
2494
  styles: styles
1233
2495
  });
1234
2496
  };
1235
-
1236
2497
  var convertToMilestone = function convertToMilestone(task, index, dates, columnWidth, rowHeight, taskHeight, barCornerRadius, handleWidth, milestoneBackgroundColor, milestoneBackgroundSelectedColor) {
1237
2498
  var x = taskXCoordinate(task.start, dates, columnWidth);
1238
2499
  var y = taskYCoordinate(index, rowHeight, taskHeight);
1239
2500
  var x1 = x - taskHeight * 0.5;
1240
2501
  var x2 = x + taskHeight * 0.5;
1241
2502
  var rotatedHeight = taskHeight / 1.414;
1242
-
1243
2503
  var styles = _extends({
1244
2504
  backgroundColor: milestoneBackgroundColor,
1245
2505
  backgroundSelectedColor: milestoneBackgroundSelectedColor,
1246
2506
  progressColor: "",
1247
2507
  progressSelectedColor: ""
1248
2508
  }, task.styles);
1249
-
1250
2509
  return _extends({}, task, {
1251
2510
  end: task.start,
1252
2511
  x1: x1,
@@ -1265,7 +2524,6 @@ var convertToMilestone = function convertToMilestone(task, index, dates, columnW
1265
2524
  styles: styles
1266
2525
  });
1267
2526
  };
1268
-
1269
2527
  var taskXCoordinate = function taskXCoordinate(xDate, dates, columnWidth) {
1270
2528
  var index = dates.findIndex(function (d) {
1271
2529
  return d.getTime() >= xDate.getTime();
@@ -1275,31 +2533,25 @@ var taskXCoordinate = function taskXCoordinate(xDate, dates, columnWidth) {
1275
2533
  var x = index * columnWidth + percentOfInterval * columnWidth;
1276
2534
  return x;
1277
2535
  };
1278
-
1279
2536
  var taskXCoordinateRTL = function taskXCoordinateRTL(xDate, dates, columnWidth) {
1280
2537
  var x = taskXCoordinate(xDate, dates, columnWidth);
1281
2538
  x += columnWidth;
1282
2539
  return x;
1283
2540
  };
1284
-
1285
2541
  var taskYCoordinate = function taskYCoordinate(index, rowHeight, taskHeight) {
1286
2542
  var y = index * rowHeight + (rowHeight - taskHeight) / 2;
1287
2543
  return y;
1288
2544
  };
1289
-
1290
2545
  var progressWithByParams = function progressWithByParams(taskX1, taskX2, progress, rtl) {
1291
2546
  var progressWidth = (taskX2 - taskX1) * progress * 0.01;
1292
2547
  var progressX;
1293
-
1294
2548
  if (rtl) {
1295
2549
  progressX = taskX2 - progressWidth;
1296
2550
  } else {
1297
2551
  progressX = taskX1;
1298
2552
  }
1299
-
1300
2553
  return [progressWidth, progressX];
1301
2554
  };
1302
-
1303
2555
  var progressByX = function progressByX(x, task) {
1304
2556
  if (x >= task.x2) return 100;else if (x <= task.x1) return 0;else {
1305
2557
  var barWidth = task.x2 - task.x1;
@@ -1307,7 +2559,6 @@ var progressByX = function progressByX(x, task) {
1307
2559
  return progressPercent;
1308
2560
  }
1309
2561
  };
1310
-
1311
2562
  var progressByXRTL = function progressByXRTL(x, task) {
1312
2563
  if (x >= task.x2) return 0;else if (x <= task.x1) return 100;else {
1313
2564
  var barWidth = task.x2 - task.x1;
@@ -1315,34 +2566,28 @@ var progressByXRTL = function progressByXRTL(x, task) {
1315
2566
  return progressPercent;
1316
2567
  }
1317
2568
  };
1318
-
1319
2569
  var getProgressPoint = function getProgressPoint(progressX, taskY, taskHeight) {
1320
2570
  var point = [progressX - 5, taskY + taskHeight, progressX + 5, taskY + taskHeight, progressX, taskY + taskHeight - 8.66];
1321
2571
  return point.join(",");
1322
2572
  };
1323
-
1324
2573
  var startByX = function startByX(x, xStep, task) {
1325
2574
  if (x >= task.x2 - task.handleWidth * 2) {
1326
2575
  x = task.x2 - task.handleWidth * 2;
1327
2576
  }
1328
-
1329
2577
  var steps = Math.round((x - task.x1) / xStep);
1330
2578
  var additionalXValue = steps * xStep;
1331
2579
  var newX = task.x1 + additionalXValue;
1332
2580
  return newX;
1333
2581
  };
1334
-
1335
2582
  var endByX = function endByX(x, xStep, task) {
1336
2583
  if (x <= task.x1 + task.handleWidth * 2) {
1337
2584
  x = task.x1 + task.handleWidth * 2;
1338
2585
  }
1339
-
1340
2586
  var steps = Math.round((x - task.x2) / xStep);
1341
2587
  var additionalXValue = steps * xStep;
1342
2588
  var newX = task.x2 + additionalXValue;
1343
2589
  return newX;
1344
2590
  };
1345
-
1346
2591
  var moveByX = function moveByX(x, xStep, task) {
1347
2592
  var steps = Math.round((x - task.x1) / xStep);
1348
2593
  var additionalXValue = steps * xStep;
@@ -1350,34 +2595,26 @@ var moveByX = function moveByX(x, xStep, task) {
1350
2595
  var newX2 = newX1 + task.x2 - task.x1;
1351
2596
  return [newX1, newX2];
1352
2597
  };
1353
-
1354
2598
  var dateByX = function dateByX(x, taskX, taskDate, xStep, timeStep) {
1355
2599
  var newDate = new Date((x - taskX) / xStep * timeStep + taskDate.getTime());
1356
2600
  newDate = new Date(newDate.getTime() + (newDate.getTimezoneOffset() - taskDate.getTimezoneOffset()) * 60000);
1357
2601
  return newDate;
1358
2602
  };
1359
-
1360
2603
  var handleTaskBySVGMouseEvent = function handleTaskBySVGMouseEvent(svgX, action, selectedTask, xStep, timeStep, initEventX1Delta, rtl) {
1361
2604
  var result;
1362
-
1363
2605
  switch (selectedTask.type) {
1364
2606
  case "milestone":
1365
2607
  result = handleTaskBySVGMouseEventForMilestone(svgX, action, selectedTask, xStep, timeStep, initEventX1Delta);
1366
2608
  break;
1367
-
1368
2609
  default:
1369
2610
  result = handleTaskBySVGMouseEventForBar(svgX, action, selectedTask, xStep, timeStep, initEventX1Delta, rtl);
1370
2611
  break;
1371
2612
  }
1372
-
1373
2613
  return result;
1374
2614
  };
1375
-
1376
2615
  var handleTaskBySVGMouseEventForBar = function handleTaskBySVGMouseEventForBar(svgX, action, selectedTask, xStep, timeStep, initEventX1Delta, rtl) {
1377
2616
  var changedTask = _extends({}, selectedTask);
1378
-
1379
2617
  var isChanged = false;
1380
-
1381
2618
  switch (action) {
1382
2619
  case "progress":
1383
2620
  if (rtl) {
@@ -1385,125 +2622,97 @@ var handleTaskBySVGMouseEventForBar = function handleTaskBySVGMouseEventForBar(s
1385
2622
  } else {
1386
2623
  changedTask.progress = progressByX(svgX, selectedTask);
1387
2624
  }
1388
-
1389
2625
  isChanged = changedTask.progress !== selectedTask.progress;
1390
-
1391
2626
  if (isChanged) {
1392
2627
  var _progressWithByParams2 = progressWithByParams(changedTask.x1, changedTask.x2, changedTask.progress, rtl),
1393
- progressWidth = _progressWithByParams2[0],
1394
- progressX = _progressWithByParams2[1];
1395
-
2628
+ progressWidth = _progressWithByParams2[0],
2629
+ progressX = _progressWithByParams2[1];
1396
2630
  changedTask.progressWidth = progressWidth;
1397
2631
  changedTask.progressX = progressX;
1398
2632
  }
1399
-
1400
2633
  break;
1401
-
1402
2634
  case "start":
1403
2635
  {
1404
2636
  var newX1 = startByX(svgX, xStep, selectedTask);
1405
2637
  changedTask.x1 = newX1;
1406
2638
  isChanged = changedTask.x1 !== selectedTask.x1;
1407
-
1408
2639
  if (isChanged) {
1409
2640
  if (rtl) {
1410
2641
  changedTask.end = dateByX(newX1, selectedTask.x1, selectedTask.end, xStep, timeStep);
1411
2642
  } else {
1412
2643
  changedTask.start = dateByX(newX1, selectedTask.x1, selectedTask.start, xStep, timeStep);
1413
2644
  }
1414
-
1415
2645
  var _progressWithByParams3 = progressWithByParams(changedTask.x1, changedTask.x2, changedTask.progress, rtl),
1416
- _progressWidth = _progressWithByParams3[0],
1417
- _progressX = _progressWithByParams3[1];
1418
-
2646
+ _progressWidth = _progressWithByParams3[0],
2647
+ _progressX = _progressWithByParams3[1];
1419
2648
  changedTask.progressWidth = _progressWidth;
1420
2649
  changedTask.progressX = _progressX;
1421
2650
  }
1422
-
1423
2651
  break;
1424
2652
  }
1425
-
1426
2653
  case "end":
1427
2654
  {
1428
2655
  var newX2 = endByX(svgX, xStep, selectedTask);
1429
2656
  changedTask.x2 = newX2;
1430
2657
  isChanged = changedTask.x2 !== selectedTask.x2;
1431
-
1432
2658
  if (isChanged) {
1433
2659
  if (rtl) {
1434
2660
  changedTask.start = dateByX(newX2, selectedTask.x2, selectedTask.start, xStep, timeStep);
1435
2661
  } else {
1436
2662
  changedTask.end = dateByX(newX2, selectedTask.x2, selectedTask.end, xStep, timeStep);
1437
2663
  }
1438
-
1439
2664
  var _progressWithByParams4 = progressWithByParams(changedTask.x1, changedTask.x2, changedTask.progress, rtl),
1440
- _progressWidth2 = _progressWithByParams4[0],
1441
- _progressX2 = _progressWithByParams4[1];
1442
-
2665
+ _progressWidth2 = _progressWithByParams4[0],
2666
+ _progressX2 = _progressWithByParams4[1];
1443
2667
  changedTask.progressWidth = _progressWidth2;
1444
2668
  changedTask.progressX = _progressX2;
1445
2669
  }
1446
-
1447
2670
  break;
1448
2671
  }
1449
-
1450
2672
  case "move":
1451
2673
  {
1452
2674
  var _moveByX = moveByX(svgX - initEventX1Delta, xStep, selectedTask),
1453
- newMoveX1 = _moveByX[0],
1454
- newMoveX2 = _moveByX[1];
1455
-
2675
+ newMoveX1 = _moveByX[0],
2676
+ newMoveX2 = _moveByX[1];
1456
2677
  isChanged = newMoveX1 !== selectedTask.x1;
1457
-
1458
2678
  if (isChanged) {
1459
2679
  changedTask.start = dateByX(newMoveX1, selectedTask.x1, selectedTask.start, xStep, timeStep);
1460
2680
  changedTask.end = dateByX(newMoveX2, selectedTask.x2, selectedTask.end, xStep, timeStep);
1461
2681
  changedTask.x1 = newMoveX1;
1462
2682
  changedTask.x2 = newMoveX2;
1463
-
1464
2683
  var _progressWithByParams5 = progressWithByParams(changedTask.x1, changedTask.x2, changedTask.progress, rtl),
1465
- _progressWidth3 = _progressWithByParams5[0],
1466
- _progressX3 = _progressWithByParams5[1];
1467
-
2684
+ _progressWidth3 = _progressWithByParams5[0],
2685
+ _progressX3 = _progressWithByParams5[1];
1468
2686
  changedTask.progressWidth = _progressWidth3;
1469
2687
  changedTask.progressX = _progressX3;
1470
2688
  }
1471
-
1472
2689
  break;
1473
2690
  }
1474
2691
  }
1475
-
1476
2692
  return {
1477
2693
  isChanged: isChanged,
1478
2694
  changedTask: changedTask
1479
2695
  };
1480
2696
  };
1481
-
1482
2697
  var handleTaskBySVGMouseEventForMilestone = function handleTaskBySVGMouseEventForMilestone(svgX, action, selectedTask, xStep, timeStep, initEventX1Delta) {
1483
2698
  var changedTask = _extends({}, selectedTask);
1484
-
1485
2699
  var isChanged = false;
1486
-
1487
2700
  switch (action) {
1488
2701
  case "move":
1489
2702
  {
1490
2703
  var _moveByX2 = moveByX(svgX - initEventX1Delta, xStep, selectedTask),
1491
- newMoveX1 = _moveByX2[0],
1492
- newMoveX2 = _moveByX2[1];
1493
-
2704
+ newMoveX1 = _moveByX2[0],
2705
+ newMoveX2 = _moveByX2[1];
1494
2706
  isChanged = newMoveX1 !== selectedTask.x1;
1495
-
1496
2707
  if (isChanged) {
1497
2708
  changedTask.start = dateByX(newMoveX1, selectedTask.x1, selectedTask.start, xStep, timeStep);
1498
2709
  changedTask.end = changedTask.start;
1499
2710
  changedTask.x1 = newMoveX1;
1500
2711
  changedTask.x2 = newMoveX2;
1501
2712
  }
1502
-
1503
2713
  break;
1504
2714
  }
1505
2715
  }
1506
-
1507
2716
  return {
1508
2717
  isChanged: isChanged,
1509
2718
  changedTask: changedTask
@@ -1517,27 +2726,22 @@ function removeHiddenTasks(tasks) {
1517
2726
  var groupedTasks = tasks.filter(function (t) {
1518
2727
  return t.hideChildren && t.type === "project";
1519
2728
  });
1520
-
1521
2729
  if (groupedTasks.length > 0) {
1522
- var _loop = function _loop(i) {
2730
+ var _loop = function _loop() {
1523
2731
  var groupedTask = groupedTasks[i];
1524
2732
  var children = getChildren(tasks, groupedTask);
1525
2733
  tasks = tasks.filter(function (t) {
1526
2734
  return children.indexOf(t) === -1;
1527
2735
  });
1528
2736
  };
1529
-
1530
2737
  for (var i = 0; groupedTasks.length > i; i++) {
1531
- _loop(i);
2738
+ _loop();
1532
2739
  }
1533
2740
  }
1534
-
1535
2741
  return tasks;
1536
2742
  }
1537
-
1538
2743
  function getChildren(taskList, task) {
1539
2744
  var tasks = [];
1540
-
1541
2745
  if (task.type !== "project") {
1542
2746
  tasks = taskList.filter(function (t) {
1543
2747
  return t.dependencies && t.dependencies.indexOf(task.id) !== -1;
@@ -1547,7 +2751,6 @@ function getChildren(taskList, task) {
1547
2751
  return t.project && t.project === task.id;
1548
2752
  });
1549
2753
  }
1550
-
1551
2754
  var taskChildren = [];
1552
2755
  tasks.forEach(function (t) {
1553
2756
  taskChildren.push.apply(taskChildren, getChildren(taskList, t));
@@ -1555,11 +2758,9 @@ function getChildren(taskList, task) {
1555
2758
  tasks = tasks.concat(tasks, taskChildren);
1556
2759
  return tasks;
1557
2760
  }
1558
-
1559
2761
  var sortTasks = function sortTasks(taskA, taskB) {
1560
2762
  var orderA = taskA.displayOrder || Number.MAX_VALUE;
1561
2763
  var orderB = taskB.displayOrder || Number.MAX_VALUE;
1562
-
1563
2764
  if (orderA > orderB) {
1564
2765
  return 1;
1565
2766
  } else if (orderA < orderB) {
@@ -1573,24 +2774,21 @@ var styles$6 = {"barWrapper":"_KxSXS","barHandle":"_3w_5u","barBackground":"_31E
1573
2774
 
1574
2775
  var BarDisplay = function BarDisplay(_ref) {
1575
2776
  var x = _ref.x,
1576
- y = _ref.y,
1577
- width = _ref.width,
1578
- height = _ref.height,
1579
- isSelected = _ref.isSelected,
1580
- progressX = _ref.progressX,
1581
- progressWidth = _ref.progressWidth,
1582
- barCornerRadius = _ref.barCornerRadius,
1583
- styles = _ref.styles,
1584
- onMouseDown = _ref.onMouseDown;
1585
-
2777
+ y = _ref.y,
2778
+ width = _ref.width,
2779
+ height = _ref.height,
2780
+ isSelected = _ref.isSelected,
2781
+ progressX = _ref.progressX,
2782
+ progressWidth = _ref.progressWidth,
2783
+ barCornerRadius = _ref.barCornerRadius,
2784
+ styles = _ref.styles,
2785
+ onMouseDown = _ref.onMouseDown;
1586
2786
  var getProcessColor = function getProcessColor() {
1587
2787
  return isSelected ? styles.progressSelectedColor : styles.progressColor;
1588
2788
  };
1589
-
1590
2789
  var getBarColor = function getBarColor() {
1591
2790
  return isSelected ? styles.backgroundSelectedColor : styles.backgroundColor;
1592
2791
  };
1593
-
1594
2792
  return React.createElement("g", {
1595
2793
  onMouseDown: onMouseDown
1596
2794
  }, React.createElement("rect", {
@@ -1615,11 +2813,11 @@ var BarDisplay = function BarDisplay(_ref) {
1615
2813
 
1616
2814
  var BarDateHandle = function BarDateHandle(_ref) {
1617
2815
  var x = _ref.x,
1618
- y = _ref.y,
1619
- width = _ref.width,
1620
- height = _ref.height,
1621
- barCornerRadius = _ref.barCornerRadius,
1622
- onMouseDown = _ref.onMouseDown;
2816
+ y = _ref.y,
2817
+ width = _ref.width,
2818
+ height = _ref.height,
2819
+ barCornerRadius = _ref.barCornerRadius,
2820
+ onMouseDown = _ref.onMouseDown;
1623
2821
  return React.createElement("rect", {
1624
2822
  x: x,
1625
2823
  y: y,
@@ -1634,7 +2832,7 @@ var BarDateHandle = function BarDateHandle(_ref) {
1634
2832
 
1635
2833
  var BarProgressHandle = function BarProgressHandle(_ref) {
1636
2834
  var progressPoint = _ref.progressPoint,
1637
- onMouseDown = _ref.onMouseDown;
2835
+ onMouseDown = _ref.onMouseDown;
1638
2836
  return React.createElement("polygon", {
1639
2837
  className: styles$6.barHandle,
1640
2838
  points: progressPoint,
@@ -1644,11 +2842,11 @@ var BarProgressHandle = function BarProgressHandle(_ref) {
1644
2842
 
1645
2843
  var Bar = function Bar(_ref) {
1646
2844
  var task = _ref.task,
1647
- isProgressChangeable = _ref.isProgressChangeable,
1648
- isDateChangeable = _ref.isDateChangeable,
1649
- rtl = _ref.rtl,
1650
- onEventStart = _ref.onEventStart,
1651
- isSelected = _ref.isSelected;
2845
+ isProgressChangeable = _ref.isProgressChangeable,
2846
+ isDateChangeable = _ref.isDateChangeable,
2847
+ rtl = _ref.rtl,
2848
+ onEventStart = _ref.onEventStart,
2849
+ isSelected = _ref.isSelected;
1652
2850
  var progressPoint = getProgressPoint(+!rtl * task.progressWidth + task.progressX, task.y, task.height);
1653
2851
  var handleHeight = task.height - 2;
1654
2852
  return React.createElement("g", {
@@ -1697,10 +2895,10 @@ var Bar = function Bar(_ref) {
1697
2895
 
1698
2896
  var BarSmall = function BarSmall(_ref) {
1699
2897
  var task = _ref.task,
1700
- isProgressChangeable = _ref.isProgressChangeable,
1701
- isDateChangeable = _ref.isDateChangeable,
1702
- onEventStart = _ref.onEventStart,
1703
- isSelected = _ref.isSelected;
2898
+ isProgressChangeable = _ref.isProgressChangeable,
2899
+ isDateChangeable = _ref.isDateChangeable,
2900
+ onEventStart = _ref.onEventStart,
2901
+ isSelected = _ref.isSelected;
1704
2902
  var progressPoint = getProgressPoint(task.progressWidth + task.x1, task.y, task.height);
1705
2903
  return React.createElement("g", {
1706
2904
  className: styles$6.barWrapper,
@@ -1732,15 +2930,13 @@ var styles$7 = {"milestoneWrapper":"_RRr13","milestoneBackground":"_2P2B1"};
1732
2930
 
1733
2931
  var Milestone = function Milestone(_ref) {
1734
2932
  var task = _ref.task,
1735
- isDateChangeable = _ref.isDateChangeable,
1736
- onEventStart = _ref.onEventStart,
1737
- isSelected = _ref.isSelected;
2933
+ isDateChangeable = _ref.isDateChangeable,
2934
+ onEventStart = _ref.onEventStart,
2935
+ isSelected = _ref.isSelected;
1738
2936
  var transform = "rotate(45 " + (task.x1 + task.height * 0.356) + " \n " + (task.y + task.height * 0.85) + ")";
1739
-
1740
2937
  var getBarColor = function getBarColor() {
1741
2938
  return isSelected ? task.styles.backgroundSelectedColor : task.styles.backgroundColor;
1742
2939
  };
1743
-
1744
2940
  return React.createElement("g", {
1745
2941
  tabIndex: 0,
1746
2942
  className: styles$7.milestoneWrapper
@@ -1764,7 +2960,7 @@ var styles$8 = {"projectWrapper":"_1KJ6x","projectBackground":"_2RbVy","projectT
1764
2960
 
1765
2961
  var Project = function Project(_ref) {
1766
2962
  var task = _ref.task,
1767
- isSelected = _ref.isSelected;
2963
+ isSelected = _ref.isSelected;
1768
2964
  var barColor = isSelected ? task.styles.backgroundSelectedColor : task.styles.backgroundColor;
1769
2965
  var processColor = isSelected ? task.styles.progressSelectedColor : task.styles.progressColor;
1770
2966
  var projectWith = task.x2 - task.x1;
@@ -1810,68 +3006,79 @@ var Project = function Project(_ref) {
1810
3006
  }));
1811
3007
  };
1812
3008
 
1813
- var style = {"barLabel":"_3zRJQ","barLabelOutside":"_3KcaM"};
3009
+ var style = {"barLabel":"_3zRJQ","barLabelOutside":"_3KcaM","statusDot":"_3ITgM"};
1814
3010
 
1815
3011
  var TaskItem = function TaskItem(props) {
1816
3012
  var _props = _extends({}, props),
1817
- task = _props.task,
1818
- arrowIndent = _props.arrowIndent,
1819
- isDelete = _props.isDelete,
1820
- taskHeight = _props.taskHeight,
1821
- isSelected = _props.isSelected,
1822
- rtl = _props.rtl,
1823
- onEventStart = _props.onEventStart;
1824
-
3013
+ task = _props.task,
3014
+ arrowIndent = _props.arrowIndent,
3015
+ isDelete = _props.isDelete,
3016
+ taskHeight = _props.taskHeight,
3017
+ isSelected = _props.isSelected,
3018
+ rtl = _props.rtl,
3019
+ onEventStart = _props.onEventStart,
3020
+ isProgressChangeable = _props.isProgressChangeable,
3021
+ isDateChangeable = _props.isDateChangeable;
1825
3022
  var textRef = useRef(null);
1826
-
1827
3023
  var _useState = useState(React.createElement("div", null)),
1828
- taskItem = _useState[0],
1829
- setTaskItem = _useState[1];
1830
-
3024
+ taskItem = _useState[0],
3025
+ setTaskItem = _useState[1];
1831
3026
  var _useState2 = useState(true),
1832
- isTextInside = _useState2[0],
1833
- setIsTextInside = _useState2[1];
1834
-
3027
+ isTextInside = _useState2[0],
3028
+ setIsTextInside = _useState2[1];
3029
+ var normalizedStatus = normalizeStatus(task.status);
3030
+ var statusColor = getStatusColor(normalizedStatus);
3031
+ var statusBadgeText = getStatusBadgeText(normalizedStatus);
3032
+ var taskItemProps = useMemo(function () {
3033
+ return {
3034
+ task: task,
3035
+ arrowIndent: arrowIndent,
3036
+ taskHeight: taskHeight,
3037
+ isProgressChangeable: isProgressChangeable,
3038
+ isDateChangeable: isDateChangeable,
3039
+ isDelete: isDelete,
3040
+ isSelected: isSelected,
3041
+ rtl: rtl,
3042
+ onEventStart: onEventStart
3043
+ };
3044
+ }, [task, arrowIndent, taskHeight, isProgressChangeable, isDateChangeable, isDelete, isSelected, rtl, onEventStart]);
1835
3045
  useEffect(function () {
1836
3046
  switch (task.typeInternal) {
1837
3047
  case "milestone":
1838
- setTaskItem(React.createElement(Milestone, Object.assign({}, props)));
3048
+ setTaskItem(React.createElement(Milestone, Object.assign({}, taskItemProps)));
1839
3049
  break;
1840
-
1841
3050
  case "project":
1842
- setTaskItem(React.createElement(Project, Object.assign({}, props)));
3051
+ setTaskItem(React.createElement(Project, Object.assign({}, taskItemProps)));
1843
3052
  break;
1844
-
1845
3053
  case "smalltask":
1846
- setTaskItem(React.createElement(BarSmall, Object.assign({}, props)));
3054
+ setTaskItem(React.createElement(BarSmall, Object.assign({}, taskItemProps)));
1847
3055
  break;
1848
-
1849
3056
  default:
1850
- setTaskItem(React.createElement(Bar, Object.assign({}, props)));
3057
+ setTaskItem(React.createElement(Bar, Object.assign({}, taskItemProps)));
1851
3058
  break;
1852
3059
  }
1853
- }, [task, isSelected]);
1854
- useEffect(function () {
1855
- if (textRef.current) {
1856
- setIsTextInside(textRef.current.getBBox().width < task.x2 - task.x1);
3060
+ }, [task, taskItemProps]);
3061
+ var getBBoxWidth = function getBBoxWidth() {
3062
+ if (!textRef.current || typeof textRef.current.getBBox !== "function") {
3063
+ return 0;
1857
3064
  }
3065
+ return textRef.current.getBBox().width;
3066
+ };
3067
+ useEffect(function () {
3068
+ setIsTextInside(getBBoxWidth() < task.x2 - task.x1);
1858
3069
  }, [textRef, task]);
1859
-
1860
3070
  var getX = function getX() {
1861
3071
  var width = task.x2 - task.x1;
1862
3072
  var hasChild = task.barChildren.length > 0;
1863
-
1864
3073
  if (isTextInside) {
1865
3074
  return task.x1 + width * 0.5;
1866
3075
  }
1867
-
1868
3076
  if (rtl && textRef.current) {
1869
- return task.x1 - textRef.current.getBBox().width - arrowIndent * +hasChild - arrowIndent * 0.2;
3077
+ return task.x1 - getBBoxWidth() - arrowIndent * +hasChild - arrowIndent * 0.2;
1870
3078
  } else {
1871
3079
  return task.x1 + width + arrowIndent * +hasChild + arrowIndent * 0.2;
1872
3080
  }
1873
3081
  };
1874
-
1875
3082
  return React.createElement("g", {
1876
3083
  onKeyDown: function onKeyDown(e) {
1877
3084
  switch (e.key) {
@@ -1881,7 +3088,6 @@ var TaskItem = function TaskItem(props) {
1881
3088
  break;
1882
3089
  }
1883
3090
  }
1884
-
1885
3091
  e.stopPropagation();
1886
3092
  },
1887
3093
  onMouseEnter: function onMouseEnter(e) {
@@ -1904,48 +3110,47 @@ var TaskItem = function TaskItem(props) {
1904
3110
  y: task.y + taskHeight * 0.5,
1905
3111
  className: isTextInside ? style.barLabel : style.barLabelOutside,
1906
3112
  ref: textRef
1907
- }, task.name));
3113
+ }, !!statusBadgeText && React.createElement("tspan", {
3114
+ className: style.statusDot,
3115
+ fill: statusColor
3116
+ }, "\u25CF"), React.createElement("tspan", {
3117
+ dx: statusBadgeText ? 4 : 0
3118
+ }, task.name)));
1908
3119
  };
1909
3120
 
1910
3121
  var TaskGanttContent = function TaskGanttContent(_ref) {
1911
- var _svg$current;
1912
-
1913
3122
  var tasks = _ref.tasks,
1914
- dates = _ref.dates,
1915
- ganttEvent = _ref.ganttEvent,
1916
- selectedTask = _ref.selectedTask,
1917
- rowHeight = _ref.rowHeight,
1918
- columnWidth = _ref.columnWidth,
1919
- timeStep = _ref.timeStep,
1920
- svg = _ref.svg,
1921
- taskHeight = _ref.taskHeight,
1922
- arrowColor = _ref.arrowColor,
1923
- arrowIndent = _ref.arrowIndent,
1924
- fontFamily = _ref.fontFamily,
1925
- fontSize = _ref.fontSize,
1926
- rtl = _ref.rtl,
1927
- setGanttEvent = _ref.setGanttEvent,
1928
- setFailedTask = _ref.setFailedTask,
1929
- setSelectedTask = _ref.setSelectedTask,
1930
- onDateChange = _ref.onDateChange,
1931
- onProgressChange = _ref.onProgressChange,
1932
- onDoubleClick = _ref.onDoubleClick,
1933
- onClick = _ref.onClick,
1934
- onDelete = _ref.onDelete;
1935
- var point = svg === null || svg === void 0 ? void 0 : (_svg$current = svg.current) === null || _svg$current === void 0 ? void 0 : _svg$current.createSVGPoint();
1936
-
3123
+ dates = _ref.dates,
3124
+ ganttEvent = _ref.ganttEvent,
3125
+ selectedTask = _ref.selectedTask,
3126
+ rowHeight = _ref.rowHeight,
3127
+ columnWidth = _ref.columnWidth,
3128
+ timeStep = _ref.timeStep,
3129
+ svg = _ref.svg,
3130
+ taskHeight = _ref.taskHeight,
3131
+ arrowColor = _ref.arrowColor,
3132
+ arrowIndent = _ref.arrowIndent,
3133
+ fontFamily = _ref.fontFamily,
3134
+ fontSize = _ref.fontSize,
3135
+ rtl = _ref.rtl,
3136
+ setGanttEvent = _ref.setGanttEvent,
3137
+ setFailedTask = _ref.setFailedTask,
3138
+ setSelectedTask = _ref.setSelectedTask,
3139
+ onDateChange = _ref.onDateChange,
3140
+ onProgressChange = _ref.onProgressChange,
3141
+ onDoubleClick = _ref.onDoubleClick,
3142
+ onClick = _ref.onClick,
3143
+ onDelete = _ref.onDelete;
3144
+ var point = svg !== null && svg !== void 0 && svg.current && "createSVGPoint" in svg.current ? svg.current.createSVGPoint() : undefined;
1937
3145
  var _useState = useState(0),
1938
- xStep = _useState[0],
1939
- setXStep = _useState[1];
1940
-
3146
+ xStep = _useState[0],
3147
+ setXStep = _useState[1];
1941
3148
  var _useState2 = useState(0),
1942
- initEventX1Delta = _useState2[0],
1943
- setInitEventX1Delta = _useState2[1];
1944
-
3149
+ initEventX1Delta = _useState2[0],
3150
+ setInitEventX1Delta = _useState2[1];
1945
3151
  var _useState3 = useState(false),
1946
- isMoving = _useState3[0],
1947
- setIsMoving = _useState3[1];
1948
-
3152
+ isMoving = _useState3[0],
3153
+ setIsMoving = _useState3[1];
1949
3154
  useEffect(function () {
1950
3155
  var dateDelta = dates[1].getTime() - dates[0].getTime() - dates[1].getTimezoneOffset() * 60 * 1000 + dates[0].getTimezoneOffset() * 60 * 1000;
1951
3156
  var newXStep = timeStep * columnWidth / dateDelta;
@@ -1955,62 +3160,52 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
1955
3160
  var handleMouseMove = function handleMouseMove(event) {
1956
3161
  try {
1957
3162
  var _svg$current$getScree;
1958
-
1959
3163
  if (!ganttEvent.changedTask || !point || !(svg !== null && svg !== void 0 && svg.current)) return Promise.resolve();
1960
3164
  event.preventDefault();
1961
3165
  point.x = event.clientX;
1962
3166
  var cursor = point.matrixTransform(svg === null || svg === void 0 ? void 0 : (_svg$current$getScree = svg.current.getScreenCTM()) === null || _svg$current$getScree === void 0 ? void 0 : _svg$current$getScree.inverse());
1963
-
1964
3167
  var _handleTaskBySVGMouse = handleTaskBySVGMouseEvent(cursor.x, ganttEvent.action, ganttEvent.changedTask, xStep, timeStep, initEventX1Delta, rtl),
1965
- isChanged = _handleTaskBySVGMouse.isChanged,
1966
- changedTask = _handleTaskBySVGMouse.changedTask;
1967
-
3168
+ isChanged = _handleTaskBySVGMouse.isChanged,
3169
+ changedTask = _handleTaskBySVGMouse.changedTask;
1968
3170
  if (isChanged) {
1969
3171
  setGanttEvent({
1970
3172
  action: ganttEvent.action,
1971
3173
  changedTask: changedTask
1972
3174
  });
1973
3175
  }
1974
-
1975
3176
  return Promise.resolve();
1976
3177
  } catch (e) {
1977
3178
  return Promise.reject(e);
1978
3179
  }
1979
3180
  };
1980
-
1981
- var handleMouseUp = function handleMouseUp(event) {
3181
+ var _handleMouseUp = function handleMouseUp(event) {
1982
3182
  try {
1983
3183
  var _svg$current$getScree2;
1984
-
1985
- var _temp6 = function _temp6() {
3184
+ var _temp5 = function _temp5() {
1986
3185
  if (!operationSuccess) {
1987
3186
  setFailedTask(originalSelectedTask);
1988
3187
  }
1989
3188
  };
1990
-
1991
3189
  var action = ganttEvent.action,
1992
- originalSelectedTask = ganttEvent.originalSelectedTask,
1993
- changedTask = ganttEvent.changedTask;
3190
+ originalSelectedTask = ganttEvent.originalSelectedTask,
3191
+ changedTask = ganttEvent.changedTask;
1994
3192
  if (!changedTask || !point || !(svg !== null && svg !== void 0 && svg.current) || !originalSelectedTask) return Promise.resolve();
1995
3193
  event.preventDefault();
1996
3194
  point.x = event.clientX;
1997
3195
  var cursor = point.matrixTransform(svg === null || svg === void 0 ? void 0 : (_svg$current$getScree2 = svg.current.getScreenCTM()) === null || _svg$current$getScree2 === void 0 ? void 0 : _svg$current$getScree2.inverse());
1998
-
1999
3196
  var _handleTaskBySVGMouse2 = handleTaskBySVGMouseEvent(cursor.x, action, changedTask, xStep, timeStep, initEventX1Delta, rtl),
2000
- newChangedTask = _handleTaskBySVGMouse2.changedTask;
2001
-
3197
+ newChangedTask = _handleTaskBySVGMouse2.changedTask;
2002
3198
  var isNotLikeOriginal = originalSelectedTask.start !== newChangedTask.start || originalSelectedTask.end !== newChangedTask.end || originalSelectedTask.progress !== newChangedTask.progress;
2003
3199
  svg.current.removeEventListener("mousemove", handleMouseMove);
2004
- svg.current.removeEventListener("mouseup", handleMouseUp);
3200
+ svg.current.removeEventListener("mouseup", _handleMouseUp);
2005
3201
  setGanttEvent({
2006
3202
  action: ""
2007
3203
  });
2008
3204
  setIsMoving(false);
2009
3205
  var operationSuccess = true;
2010
-
2011
- var _temp7 = function () {
3206
+ var _temp4 = function () {
2012
3207
  if ((action === "move" || action === "end" || action === "start") && onDateChange && isNotLikeOriginal) {
2013
- var _temp8 = _catch(function () {
3208
+ var _temp = _catch(function () {
2014
3209
  return Promise.resolve(onDateChange(newChangedTask, newChangedTask.barChildren)).then(function (result) {
2015
3210
  if (result !== undefined) {
2016
3211
  operationSuccess = result;
@@ -2019,12 +3214,11 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2019
3214
  }, function () {
2020
3215
  operationSuccess = false;
2021
3216
  });
2022
-
2023
- if (_temp8 && _temp8.then) return _temp8.then(function () {});
3217
+ if (_temp && _temp.then) return _temp.then(function () {});
2024
3218
  } else {
2025
- var _temp9 = function () {
3219
+ var _temp6 = function () {
2026
3220
  if (onProgressChange && isNotLikeOriginal) {
2027
- var _temp10 = _catch(function () {
3221
+ var _temp2 = _catch(function () {
2028
3222
  return Promise.resolve(onProgressChange(newChangedTask, newChangedTask.barChildren)).then(function (result) {
2029
3223
  if (result !== undefined) {
2030
3224
  operationSuccess = result;
@@ -2033,28 +3227,23 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2033
3227
  }, function () {
2034
3228
  operationSuccess = false;
2035
3229
  });
2036
-
2037
- if (_temp10 && _temp10.then) return _temp10.then(function () {});
3230
+ if (_temp2 && _temp2.then) return _temp2.then(function () {});
2038
3231
  }
2039
3232
  }();
2040
-
2041
- if (_temp9 && _temp9.then) return _temp9.then(function () {});
3233
+ if (_temp6 && _temp6.then) return _temp6.then(function () {});
2042
3234
  }
2043
3235
  }();
2044
-
2045
- return Promise.resolve(_temp7 && _temp7.then ? _temp7.then(_temp6) : _temp6(_temp7));
3236
+ return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(_temp5) : _temp5(_temp4));
2046
3237
  } catch (e) {
2047
3238
  return Promise.reject(e);
2048
3239
  }
2049
3240
  };
2050
-
2051
3241
  if (!isMoving && (ganttEvent.action === "move" || ganttEvent.action === "end" || ganttEvent.action === "start" || ganttEvent.action === "progress") && svg !== null && svg !== void 0 && svg.current) {
2052
3242
  svg.current.addEventListener("mousemove", handleMouseMove);
2053
- svg.current.addEventListener("mouseup", handleMouseUp);
3243
+ svg.current.addEventListener("mouseup", _handleMouseUp);
2054
3244
  setIsMoving(true);
2055
3245
  }
2056
3246
  }, [ganttEvent, xStep, initEventX1Delta, onProgressChange, timeStep, onDateChange, svg, isMoving, point, rtl, setFailedTask, setGanttEvent]);
2057
-
2058
3247
  var handleBarEventStart = function handleBarEventStart(action, task, event) {
2059
3248
  try {
2060
3249
  return Promise.resolve(function () {
@@ -2064,11 +3253,11 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2064
3253
  }
2065
3254
  } else return function () {
2066
3255
  if (isKeyboardEvent(event)) {
2067
- var _temp14 = function () {
3256
+ var _temp9 = function () {
2068
3257
  if (action === "delete") {
2069
- var _temp15 = function () {
3258
+ var _temp8 = function () {
2070
3259
  if (onDelete) {
2071
- var _temp16 = _catch(function () {
3260
+ var _temp7 = _catch(function () {
2072
3261
  return Promise.resolve(onDelete(task)).then(function (result) {
2073
3262
  if (result !== undefined && result) {
2074
3263
  setGanttEvent({
@@ -2080,16 +3269,13 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2080
3269
  }, function (error) {
2081
3270
  console.error("Error on Delete. " + error);
2082
3271
  });
2083
-
2084
- if (_temp16 && _temp16.then) return _temp16.then(function () {});
3272
+ if (_temp7 && _temp7.then) return _temp7.then(function () {});
2085
3273
  }
2086
3274
  }();
2087
-
2088
- if (_temp15 && _temp15.then) return _temp15.then(function () {});
3275
+ if (_temp8 && _temp8.then) return _temp8.then(function () {});
2089
3276
  }
2090
3277
  }();
2091
-
2092
- if (_temp14 && _temp14.then) return _temp14.then(function () {});
3278
+ if (_temp9 && _temp9.then) return _temp9.then(function () {});
2093
3279
  } else if (action === "mouseenter") {
2094
3280
  if (!ganttEvent.action) {
2095
3281
  setGanttEvent({
@@ -2110,7 +3296,6 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2110
3296
  !!onClick && onClick(task);
2111
3297
  } else if (action === "move") {
2112
3298
  var _svg$current$getScree3;
2113
-
2114
3299
  if (!(svg !== null && svg !== void 0 && svg.current) || !point) return;
2115
3300
  point.x = event.clientX;
2116
3301
  var cursor = point.matrixTransform((_svg$current$getScree3 = svg.current.getScreenCTM()) === null || _svg$current$getScree3 === void 0 ? void 0 : _svg$current$getScree3.inverse());
@@ -2133,7 +3318,6 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2133
3318
  return Promise.reject(e);
2134
3319
  }
2135
3320
  };
2136
-
2137
3321
  return React.createElement("g", {
2138
3322
  className: "content"
2139
3323
  }, React.createElement("g", {
@@ -2172,36 +3356,36 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2172
3356
  })));
2173
3357
  };
2174
3358
 
2175
- var styles$9 = {"ganttVerticalContainer":"_CZjuD","horizontalContainer":"_2B2zv","wrapper":"_3eULf"};
3359
+ var styles$9 = {"ganttVerticalContainer":"_CZjuD","horizontalContainer":"_2B2zv","wrapper":"_3eULf","taskListPanel":"_3eX5j","splitHandle":"_1YST3","splitHandleActive":"_3cO1L","ganttPanel":"_1G4xA","scrollRow":"_2VUKJ","scrollCellLeft":"_1vvPx","scrollCellRight":"_3sIUT","scrollSplitter":"_3gMam"};
2176
3360
 
2177
3361
  var TaskGantt = function TaskGantt(_ref) {
2178
3362
  var gridProps = _ref.gridProps,
2179
- calendarProps = _ref.calendarProps,
2180
- barProps = _ref.barProps,
2181
- ganttHeight = _ref.ganttHeight,
2182
- scrollY = _ref.scrollY,
2183
- scrollX = _ref.scrollX;
3363
+ calendarProps = _ref.calendarProps,
3364
+ barProps = _ref.barProps,
3365
+ ganttHeight = _ref.ganttHeight,
3366
+ scrollY = _ref.scrollY,
3367
+ scrollX = _ref.scrollX,
3368
+ verticalGanttContainerRef = _ref.verticalGanttContainerRef;
2184
3369
  var ganttSVGRef = useRef(null);
2185
3370
  var horizontalContainerRef = useRef(null);
2186
- var verticalGanttContainerRef = useRef(null);
2187
-
3371
+ var internalVerticalRef = useRef(null);
3372
+ var ganttContainerRef = verticalGanttContainerRef || internalVerticalRef;
2188
3373
  var newBarProps = _extends({}, barProps, {
2189
3374
  svg: ganttSVGRef
2190
3375
  });
2191
-
2192
3376
  useEffect(function () {
2193
3377
  if (horizontalContainerRef.current) {
2194
3378
  horizontalContainerRef.current.scrollTop = scrollY;
2195
3379
  }
2196
3380
  }, [scrollY]);
2197
3381
  useEffect(function () {
2198
- if (verticalGanttContainerRef.current) {
2199
- verticalGanttContainerRef.current.scrollLeft = scrollX;
3382
+ if (ganttContainerRef.current) {
3383
+ ganttContainerRef.current.scrollLeft = scrollX;
2200
3384
  }
2201
- }, [scrollX]);
3385
+ }, [scrollX, ganttContainerRef]);
2202
3386
  return React.createElement("div", {
2203
3387
  className: styles$9.ganttVerticalContainer,
2204
- ref: verticalGanttContainerRef,
3388
+ ref: ganttContainerRef,
2205
3389
  dir: "ltr"
2206
3390
  }, React.createElement("svg", {
2207
3391
  xmlns: "http://www.w3.org/2000/svg",
@@ -2230,223 +3414,241 @@ var styles$a = {"scrollWrapper":"_2k9Ys","scroll":"_19jgW"};
2230
3414
 
2231
3415
  var HorizontalScroll = function HorizontalScroll(_ref) {
2232
3416
  var scroll = _ref.scroll,
2233
- svgWidth = _ref.svgWidth,
2234
- taskListWidth = _ref.taskListWidth,
2235
- rtl = _ref.rtl,
2236
- onScroll = _ref.onScroll;
3417
+ svgWidth = _ref.svgWidth,
3418
+ scrollerWidth = _ref.scrollerWidth,
3419
+ rtl = _ref.rtl,
3420
+ onScroll = _ref.onScroll,
3421
+ dataTestId = _ref["data-testid"],
3422
+ containerRef = _ref.containerRef,
3423
+ hidden = _ref.hidden;
2237
3424
  var scrollRef = useRef(null);
3425
+ var wrapperRef = containerRef != null ? containerRef : scrollRef;
2238
3426
  useEffect(function () {
2239
- if (scrollRef.current) {
2240
- scrollRef.current.scrollLeft = scroll;
3427
+ if (wrapperRef.current) {
3428
+ wrapperRef.current.scrollLeft = scroll;
2241
3429
  }
2242
- }, [scroll]);
3430
+ }, [scroll, wrapperRef]);
2243
3431
  return React.createElement("div", {
2244
- dir: "ltr",
2245
- style: {
2246
- margin: rtl ? "0px " + taskListWidth + "px 0px 0px" : "0px 0px 0px " + taskListWidth + "px"
2247
- },
3432
+ dir: rtl ? "rtl" : "ltr",
2248
3433
  className: styles$a.scrollWrapper,
2249
3434
  onScroll: onScroll,
2250
- ref: scrollRef
3435
+ ref: wrapperRef,
3436
+ "data-testid": dataTestId,
3437
+ style: hidden ? {
3438
+ display: "none"
3439
+ } : {
3440
+ width: svgWidth
3441
+ }
2251
3442
  }, React.createElement("div", {
2252
3443
  style: {
2253
- width: svgWidth
3444
+ width: scrollerWidth != null ? scrollerWidth : svgWidth
2254
3445
  },
2255
3446
  className: styles$a.scroll
2256
3447
  }));
2257
3448
  };
2258
3449
 
3450
+ var DEFAULT_TASK_LIST_WIDTH = 450;
3451
+ var MIN_PANE_WIDTH = 150;
3452
+ var SPLIT_HANDLE_WIDTH = 8;
3453
+ var clampTaskListWidth = function clampTaskListWidth(width, containerWidth) {
3454
+ var maxWidth = Math.max(MIN_PANE_WIDTH, containerWidth - MIN_PANE_WIDTH - SPLIT_HANDLE_WIDTH);
3455
+ return Math.min(Math.max(width, MIN_PANE_WIDTH), maxWidth);
3456
+ };
2259
3457
  var Gantt = function Gantt(_ref) {
2260
3458
  var tasks = _ref.tasks,
2261
- _ref$headerHeight = _ref.headerHeight,
2262
- headerHeight = _ref$headerHeight === void 0 ? 50 : _ref$headerHeight,
2263
- _ref$columnWidth = _ref.columnWidth,
2264
- columnWidth = _ref$columnWidth === void 0 ? 60 : _ref$columnWidth,
2265
- _ref$listCellWidth = _ref.listCellWidth,
2266
- listCellWidth = _ref$listCellWidth === void 0 ? "155px" : _ref$listCellWidth,
2267
- _ref$rowHeight = _ref.rowHeight,
2268
- rowHeight = _ref$rowHeight === void 0 ? 50 : _ref$rowHeight,
2269
- _ref$ganttHeight = _ref.ganttHeight,
2270
- ganttHeight = _ref$ganttHeight === void 0 ? 0 : _ref$ganttHeight,
2271
- _ref$viewMode = _ref.viewMode,
2272
- viewMode = _ref$viewMode === void 0 ? ViewMode.Day : _ref$viewMode,
2273
- _ref$preStepsCount = _ref.preStepsCount,
2274
- preStepsCount = _ref$preStepsCount === void 0 ? 1 : _ref$preStepsCount,
2275
- _ref$locale = _ref.locale,
2276
- locale = _ref$locale === void 0 ? "en-GB" : _ref$locale,
2277
- _ref$barFill = _ref.barFill,
2278
- barFill = _ref$barFill === void 0 ? 60 : _ref$barFill,
2279
- _ref$barCornerRadius = _ref.barCornerRadius,
2280
- barCornerRadius = _ref$barCornerRadius === void 0 ? 3 : _ref$barCornerRadius,
2281
- _ref$barProgressColor = _ref.barProgressColor,
2282
- barProgressColor = _ref$barProgressColor === void 0 ? "#a3a3ff" : _ref$barProgressColor,
2283
- _ref$barProgressSelec = _ref.barProgressSelectedColor,
2284
- barProgressSelectedColor = _ref$barProgressSelec === void 0 ? "#8282f5" : _ref$barProgressSelec,
2285
- _ref$barBackgroundCol = _ref.barBackgroundColor,
2286
- barBackgroundColor = _ref$barBackgroundCol === void 0 ? "#b8c2cc" : _ref$barBackgroundCol,
2287
- _ref$barBackgroundSel = _ref.barBackgroundSelectedColor,
2288
- barBackgroundSelectedColor = _ref$barBackgroundSel === void 0 ? "#aeb8c2" : _ref$barBackgroundSel,
2289
- _ref$projectProgressC = _ref.projectProgressColor,
2290
- projectProgressColor = _ref$projectProgressC === void 0 ? "#7db59a" : _ref$projectProgressC,
2291
- _ref$projectProgressS = _ref.projectProgressSelectedColor,
2292
- projectProgressSelectedColor = _ref$projectProgressS === void 0 ? "#59a985" : _ref$projectProgressS,
2293
- _ref$projectBackgroun = _ref.projectBackgroundColor,
2294
- projectBackgroundColor = _ref$projectBackgroun === void 0 ? "#fac465" : _ref$projectBackgroun,
2295
- _ref$projectBackgroun2 = _ref.projectBackgroundSelectedColor,
2296
- projectBackgroundSelectedColor = _ref$projectBackgroun2 === void 0 ? "#f7bb53" : _ref$projectBackgroun2,
2297
- _ref$milestoneBackgro = _ref.milestoneBackgroundColor,
2298
- milestoneBackgroundColor = _ref$milestoneBackgro === void 0 ? "#f1c453" : _ref$milestoneBackgro,
2299
- _ref$milestoneBackgro2 = _ref.milestoneBackgroundSelectedColor,
2300
- milestoneBackgroundSelectedColor = _ref$milestoneBackgro2 === void 0 ? "#f29e4c" : _ref$milestoneBackgro2,
2301
- _ref$rtl = _ref.rtl,
2302
- rtl = _ref$rtl === void 0 ? false : _ref$rtl,
2303
- _ref$handleWidth = _ref.handleWidth,
2304
- handleWidth = _ref$handleWidth === void 0 ? 8 : _ref$handleWidth,
2305
- _ref$timeStep = _ref.timeStep,
2306
- timeStep = _ref$timeStep === void 0 ? 300000 : _ref$timeStep,
2307
- _ref$arrowColor = _ref.arrowColor,
2308
- arrowColor = _ref$arrowColor === void 0 ? "grey" : _ref$arrowColor,
2309
- _ref$fontFamily = _ref.fontFamily,
2310
- fontFamily = _ref$fontFamily === void 0 ? "Arial, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue" : _ref$fontFamily,
2311
- _ref$fontSize = _ref.fontSize,
2312
- fontSize = _ref$fontSize === void 0 ? "14px" : _ref$fontSize,
2313
- _ref$arrowIndent = _ref.arrowIndent,
2314
- arrowIndent = _ref$arrowIndent === void 0 ? 20 : _ref$arrowIndent,
2315
- _ref$todayColor = _ref.todayColor,
2316
- todayColor = _ref$todayColor === void 0 ? "rgba(252, 248, 227, 0.5)" : _ref$todayColor,
2317
- viewDate = _ref.viewDate,
2318
- _ref$TooltipContent = _ref.TooltipContent,
2319
- TooltipContent = _ref$TooltipContent === void 0 ? StandardTooltipContent : _ref$TooltipContent,
2320
- _ref$TaskListHeader = _ref.TaskListHeader,
2321
- TaskListHeader = _ref$TaskListHeader === void 0 ? TaskListHeaderDefault : _ref$TaskListHeader,
2322
- _ref$TaskListTable = _ref.TaskListTable,
2323
- TaskListTable = _ref$TaskListTable === void 0 ? TaskListTableDefault : _ref$TaskListTable,
2324
- onDateChange = _ref.onDateChange,
2325
- onProgressChange = _ref.onProgressChange,
2326
- onDoubleClick = _ref.onDoubleClick,
2327
- onClick = _ref.onClick,
2328
- onDelete = _ref.onDelete,
2329
- onSelect = _ref.onSelect,
2330
- onExpanderClick = _ref.onExpanderClick;
3459
+ _ref$headerHeight = _ref.headerHeight,
3460
+ headerHeight = _ref$headerHeight === void 0 ? 50 : _ref$headerHeight,
3461
+ _ref$columnWidth = _ref.columnWidth,
3462
+ columnWidth = _ref$columnWidth === void 0 ? 60 : _ref$columnWidth,
3463
+ _ref$listCellWidth = _ref.listCellWidth,
3464
+ listCellWidth = _ref$listCellWidth === void 0 ? "155px" : _ref$listCellWidth,
3465
+ _ref$rowHeight = _ref.rowHeight,
3466
+ rowHeight = _ref$rowHeight === void 0 ? 50 : _ref$rowHeight,
3467
+ _ref$ganttHeight = _ref.ganttHeight,
3468
+ ganttHeight = _ref$ganttHeight === void 0 ? 0 : _ref$ganttHeight,
3469
+ _ref$viewMode = _ref.viewMode,
3470
+ viewMode = _ref$viewMode === void 0 ? ViewMode.Day : _ref$viewMode,
3471
+ _ref$preStepsCount = _ref.preStepsCount,
3472
+ preStepsCount = _ref$preStepsCount === void 0 ? 1 : _ref$preStepsCount,
3473
+ _ref$locale = _ref.locale,
3474
+ locale = _ref$locale === void 0 ? "en-GB" : _ref$locale,
3475
+ calendar = _ref.calendar,
3476
+ _ref$barFill = _ref.barFill,
3477
+ barFill = _ref$barFill === void 0 ? 60 : _ref$barFill,
3478
+ _ref$barCornerRadius = _ref.barCornerRadius,
3479
+ barCornerRadius = _ref$barCornerRadius === void 0 ? 3 : _ref$barCornerRadius,
3480
+ _ref$barProgressColor = _ref.barProgressColor,
3481
+ barProgressColor = _ref$barProgressColor === void 0 ? "#a3a3ff" : _ref$barProgressColor,
3482
+ _ref$barProgressSelec = _ref.barProgressSelectedColor,
3483
+ barProgressSelectedColor = _ref$barProgressSelec === void 0 ? "#8282f5" : _ref$barProgressSelec,
3484
+ _ref$barBackgroundCol = _ref.barBackgroundColor,
3485
+ barBackgroundColor = _ref$barBackgroundCol === void 0 ? "#b8c2cc" : _ref$barBackgroundCol,
3486
+ _ref$barBackgroundSel = _ref.barBackgroundSelectedColor,
3487
+ barBackgroundSelectedColor = _ref$barBackgroundSel === void 0 ? "#aeb8c2" : _ref$barBackgroundSel,
3488
+ _ref$projectProgressC = _ref.projectProgressColor,
3489
+ projectProgressColor = _ref$projectProgressC === void 0 ? "#7db59a" : _ref$projectProgressC,
3490
+ _ref$projectProgressS = _ref.projectProgressSelectedColor,
3491
+ projectProgressSelectedColor = _ref$projectProgressS === void 0 ? "#59a985" : _ref$projectProgressS,
3492
+ _ref$projectBackgroun = _ref.projectBackgroundColor,
3493
+ projectBackgroundColor = _ref$projectBackgroun === void 0 ? "#fac465" : _ref$projectBackgroun,
3494
+ _ref$projectBackgroun2 = _ref.projectBackgroundSelectedColor,
3495
+ projectBackgroundSelectedColor = _ref$projectBackgroun2 === void 0 ? "#f7bb53" : _ref$projectBackgroun2,
3496
+ _ref$milestoneBackgro = _ref.milestoneBackgroundColor,
3497
+ milestoneBackgroundColor = _ref$milestoneBackgro === void 0 ? "#f1c453" : _ref$milestoneBackgro,
3498
+ _ref$milestoneBackgro2 = _ref.milestoneBackgroundSelectedColor,
3499
+ milestoneBackgroundSelectedColor = _ref$milestoneBackgro2 === void 0 ? "#f29e4c" : _ref$milestoneBackgro2,
3500
+ _ref$rtl = _ref.rtl,
3501
+ rtl = _ref$rtl === void 0 ? false : _ref$rtl,
3502
+ _ref$handleWidth = _ref.handleWidth,
3503
+ handleWidth = _ref$handleWidth === void 0 ? 8 : _ref$handleWidth,
3504
+ _ref$timeStep = _ref.timeStep,
3505
+ timeStep = _ref$timeStep === void 0 ? 300000 : _ref$timeStep,
3506
+ _ref$arrowColor = _ref.arrowColor,
3507
+ arrowColor = _ref$arrowColor === void 0 ? "grey" : _ref$arrowColor,
3508
+ _ref$fontFamily = _ref.fontFamily,
3509
+ fontFamily = _ref$fontFamily === void 0 ? "Arial, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue" : _ref$fontFamily,
3510
+ _ref$fontSize = _ref.fontSize,
3511
+ fontSize = _ref$fontSize === void 0 ? "14px" : _ref$fontSize,
3512
+ _ref$arrowIndent = _ref.arrowIndent,
3513
+ arrowIndent = _ref$arrowIndent === void 0 ? 20 : _ref$arrowIndent,
3514
+ _ref$todayColor = _ref.todayColor,
3515
+ todayColor = _ref$todayColor === void 0 ? "rgba(252, 248, 227, 0.5)" : _ref$todayColor,
3516
+ viewDate = _ref.viewDate,
3517
+ _ref$TooltipContent = _ref.TooltipContent,
3518
+ TooltipContent = _ref$TooltipContent === void 0 ? StandardTooltipContent : _ref$TooltipContent,
3519
+ _ref$TaskListHeader = _ref.TaskListHeader,
3520
+ TaskListHeader = _ref$TaskListHeader === void 0 ? TaskListHeaderDefault : _ref$TaskListHeader,
3521
+ _ref$TaskListTable = _ref.TaskListTable,
3522
+ TaskListTable = _ref$TaskListTable === void 0 ? TaskListTableDefault : _ref$TaskListTable,
3523
+ _ref$visibleFields = _ref.visibleFields,
3524
+ visibleFields = _ref$visibleFields === void 0 ? DEFAULT_VISIBLE_FIELDS : _ref$visibleFields,
3525
+ _ref$effortDisplayUni = _ref.effortDisplayUnit,
3526
+ effortDisplayUnit = _ref$effortDisplayUni === void 0 ? "MH" : _ref$effortDisplayUni,
3527
+ enableColumnDrag = _ref.enableColumnDrag,
3528
+ onDateChange = _ref.onDateChange,
3529
+ onProgressChange = _ref.onProgressChange,
3530
+ onDoubleClick = _ref.onDoubleClick,
3531
+ onClick = _ref.onClick,
3532
+ onDelete = _ref.onDelete,
3533
+ onSelect = _ref.onSelect,
3534
+ onExpanderClick = _ref.onExpanderClick,
3535
+ onTaskUpdate = _ref.onTaskUpdate,
3536
+ onCellCommit = _ref.onCellCommit;
3537
+ var calendarConfig = useMemo(function () {
3538
+ return calendar ? normalizeCalendarConfig(calendar) : undefined;
3539
+ }, [calendar]);
2331
3540
  var wrapperRef = useRef(null);
2332
3541
  var taskListRef = useRef(null);
2333
-
3542
+ var taskListHeaderRef = useRef(null);
3543
+ var taskListBodyRef = useRef(null);
3544
+ var ganttContainerRef = useRef(null);
3545
+ var splitStartXRef = useRef(null);
3546
+ var splitStartWidthRef = useRef(null);
3547
+ var splitMoveHandlerRef = useRef(null);
3548
+ var splitUpHandlerRef = useRef(null);
3549
+ var supportsPointerEvents = typeof window !== "undefined" && "PointerEvent" in window;
2334
3550
  var _useState = useState(function () {
2335
- var _ganttDateRange = ganttDateRange(tasks, viewMode, preStepsCount),
3551
+ var _ganttDateRange = ganttDateRange(tasks, viewMode, preStepsCount),
2336
3552
  startDate = _ganttDateRange[0],
2337
3553
  endDate = _ganttDateRange[1];
2338
-
2339
- return {
2340
- viewMode: viewMode,
2341
- dates: seedDates(startDate, endDate, viewMode)
2342
- };
2343
- }),
2344
- dateSetup = _useState[0],
2345
- setDateSetup = _useState[1];
2346
-
3554
+ return {
3555
+ viewMode: viewMode,
3556
+ dates: seedDates(startDate, endDate, viewMode)
3557
+ };
3558
+ }),
3559
+ dateSetup = _useState[0],
3560
+ setDateSetup = _useState[1];
2347
3561
  var _useState2 = useState(undefined),
2348
- currentViewDate = _useState2[0],
2349
- setCurrentViewDate = _useState2[1];
2350
-
2351
- var _useState3 = useState(0),
2352
- taskListWidth = _useState3[0],
2353
- setTaskListWidth = _useState3[1];
2354
-
3562
+ currentViewDate = _useState2[0],
3563
+ setCurrentViewDate = _useState2[1];
3564
+ var _useState3 = useState(DEFAULT_TASK_LIST_WIDTH),
3565
+ taskListWidth = _useState3[0],
3566
+ setTaskListWidth = _useState3[1];
2355
3567
  var _useState4 = useState(0),
2356
- svgContainerWidth = _useState4[0],
2357
- setSvgContainerWidth = _useState4[1];
2358
-
2359
- var _useState5 = useState(ganttHeight),
2360
- svgContainerHeight = _useState5[0],
2361
- setSvgContainerHeight = _useState5[1];
2362
-
2363
- var _useState6 = useState([]),
2364
- barTasks = _useState6[0],
2365
- setBarTasks = _useState6[1];
2366
-
2367
- var _useState7 = useState({
2368
- action: ""
2369
- }),
2370
- ganttEvent = _useState7[0],
2371
- setGanttEvent = _useState7[1];
2372
-
3568
+ wrapperWidth = _useState4[0],
3569
+ setWrapperWidth = _useState4[1];
3570
+ var _useState5 = useState(false),
3571
+ isResizing = _useState5[0],
3572
+ setIsResizing = _useState5[1];
3573
+ var _useState6 = useState(0),
3574
+ svgContainerWidth = _useState6[0],
3575
+ setSvgContainerWidth = _useState6[1];
3576
+ var _useState7 = useState(ganttHeight),
3577
+ svgContainerHeight = _useState7[0],
3578
+ setSvgContainerHeight = _useState7[1];
3579
+ var _useState8 = useState([]),
3580
+ barTasks = _useState8[0],
3581
+ setBarTasks = _useState8[1];
3582
+ var _useState9 = useState({
3583
+ action: ""
3584
+ }),
3585
+ ganttEvent = _useState9[0],
3586
+ setGanttEvent = _useState9[1];
2373
3587
  var taskHeight = useMemo(function () {
2374
3588
  return rowHeight * barFill / 100;
2375
3589
  }, [rowHeight, barFill]);
2376
-
2377
- var _useState8 = useState(),
2378
- selectedTask = _useState8[0],
2379
- setSelectedTask = _useState8[1];
2380
-
2381
- var _useState9 = useState(null),
2382
- failedTask = _useState9[0],
2383
- setFailedTask = _useState9[1];
2384
-
3590
+ var _useState0 = useState(),
3591
+ selectedTask = _useState0[0],
3592
+ setSelectedTask = _useState0[1];
3593
+ var _useState1 = useState(null),
3594
+ failedTask = _useState1[0],
3595
+ setFailedTask = _useState1[1];
2385
3596
  var svgWidth = dateSetup.dates.length * columnWidth;
2386
3597
  var ganttFullHeight = barTasks.length * rowHeight;
2387
-
2388
3598
  var _useState10 = useState(0),
2389
- scrollY = _useState10[0],
2390
- setScrollY = _useState10[1];
2391
-
2392
- var _useState11 = useState(-1),
2393
- scrollX = _useState11[0],
2394
- setScrollX = _useState11[1];
2395
-
2396
- var _useState12 = useState(false),
2397
- ignoreScrollEvent = _useState12[0],
2398
- setIgnoreScrollEvent = _useState12[1];
2399
-
3599
+ scrollY = _useState10[0],
3600
+ setScrollY = _useState10[1];
3601
+ var _useState11 = useState(0),
3602
+ scrollXLeft = _useState11[0],
3603
+ setScrollXLeft = _useState11[1];
3604
+ var _useState12 = useState(-1),
3605
+ scrollXRight = _useState12[0],
3606
+ setScrollXRight = _useState12[1];
3607
+ var _useState13 = useState(1430),
3608
+ leftScrollerWidth = _useState13[0],
3609
+ setLeftScrollerWidth = _useState13[1];
3610
+ var ignoreScrollLeftRef = useRef(false);
3611
+ var ignoreScrollRightRef = useRef(false);
2400
3612
  useEffect(function () {
2401
3613
  var filteredTasks;
2402
-
2403
3614
  if (onExpanderClick) {
2404
3615
  filteredTasks = removeHiddenTasks(tasks);
2405
3616
  } else {
2406
3617
  filteredTasks = tasks;
2407
3618
  }
2408
-
2409
3619
  filteredTasks = filteredTasks.sort(sortTasks);
2410
-
2411
3620
  var _ganttDateRange2 = ganttDateRange(filteredTasks, viewMode, preStepsCount),
2412
- startDate = _ganttDateRange2[0],
2413
- endDate = _ganttDateRange2[1];
2414
-
3621
+ startDate = _ganttDateRange2[0],
3622
+ endDate = _ganttDateRange2[1];
2415
3623
  var newDates = seedDates(startDate, endDate, viewMode);
2416
-
2417
3624
  if (rtl) {
2418
3625
  newDates = newDates.reverse();
2419
-
2420
- if (scrollX === -1) {
2421
- setScrollX(newDates.length * columnWidth);
3626
+ if (scrollXRight === -1) {
3627
+ setScrollXRight(newDates.length * columnWidth);
2422
3628
  }
2423
3629
  }
2424
-
2425
3630
  setDateSetup({
2426
3631
  dates: newDates,
2427
3632
  viewMode: viewMode
2428
3633
  });
2429
3634
  setBarTasks(convertToBarTasks(filteredTasks, newDates, columnWidth, rowHeight, taskHeight, barCornerRadius, handleWidth, rtl, barProgressColor, barProgressSelectedColor, barBackgroundColor, barBackgroundSelectedColor, projectProgressColor, projectProgressSelectedColor, projectBackgroundColor, projectBackgroundSelectedColor, milestoneBackgroundColor, milestoneBackgroundSelectedColor));
2430
- }, [tasks, viewMode, preStepsCount, rowHeight, barCornerRadius, columnWidth, taskHeight, handleWidth, barProgressColor, barProgressSelectedColor, barBackgroundColor, barBackgroundSelectedColor, projectProgressColor, projectProgressSelectedColor, projectBackgroundColor, projectBackgroundSelectedColor, milestoneBackgroundColor, milestoneBackgroundSelectedColor, rtl, scrollX, onExpanderClick]);
3635
+ }, [tasks, viewMode, preStepsCount, rowHeight, barCornerRadius, columnWidth, taskHeight, handleWidth, barProgressColor, barProgressSelectedColor, barBackgroundColor, barBackgroundSelectedColor, projectProgressColor, projectProgressSelectedColor, projectBackgroundColor, projectBackgroundSelectedColor, milestoneBackgroundColor, milestoneBackgroundSelectedColor, rtl, scrollXRight, onExpanderClick]);
2431
3636
  useEffect(function () {
2432
3637
  if (viewMode === dateSetup.viewMode && (viewDate && !currentViewDate || viewDate && (currentViewDate === null || currentViewDate === void 0 ? void 0 : currentViewDate.valueOf()) !== viewDate.valueOf())) {
2433
3638
  var dates = dateSetup.dates;
2434
3639
  var index = dates.findIndex(function (d, i) {
2435
3640
  return viewDate.valueOf() >= d.valueOf() && i + 1 !== dates.length && viewDate.valueOf() < dates[i + 1].valueOf();
2436
3641
  });
2437
-
2438
3642
  if (index === -1) {
2439
3643
  return;
2440
3644
  }
2441
-
2442
3645
  setCurrentViewDate(viewDate);
2443
- setScrollX(columnWidth * index);
3646
+ setScrollXRight(columnWidth * index);
2444
3647
  }
2445
3648
  }, [viewDate, columnWidth, dateSetup.dates, dateSetup.viewMode, viewMode, currentViewDate, setCurrentViewDate]);
2446
3649
  useEffect(function () {
2447
3650
  var changedTask = ganttEvent.changedTask,
2448
- action = ganttEvent.action;
2449
-
3651
+ action = ganttEvent.action;
2450
3652
  if (changedTask) {
2451
3653
  if (action === "delete") {
2452
3654
  setGanttEvent({
@@ -2459,7 +3661,6 @@ var Gantt = function Gantt(_ref) {
2459
3661
  var prevStateTask = barTasks.find(function (t) {
2460
3662
  return t.id === changedTask.id;
2461
3663
  });
2462
-
2463
3664
  if (prevStateTask && (prevStateTask.start.getTime() !== changedTask.start.getTime() || prevStateTask.end.getTime() !== changedTask.end.getTime() || prevStateTask.progress !== changedTask.progress)) {
2464
3665
  var newTaskList = barTasks.map(function (t) {
2465
3666
  return t.id === changedTask.id ? changedTask : t;
@@ -2477,20 +3678,35 @@ var Gantt = function Gantt(_ref) {
2477
3678
  setFailedTask(null);
2478
3679
  }
2479
3680
  }, [failedTask, barTasks]);
3681
+ useEffect(function () {
3682
+ var updateWrapperWidth = function updateWrapperWidth() {
3683
+ if (wrapperRef.current) {
3684
+ setWrapperWidth(wrapperRef.current.offsetWidth);
3685
+ }
3686
+ };
3687
+ updateWrapperWidth();
3688
+ window.addEventListener("resize", updateWrapperWidth);
3689
+ return function () {
3690
+ return window.removeEventListener("resize", updateWrapperWidth);
3691
+ };
3692
+ }, []);
2480
3693
  useEffect(function () {
2481
3694
  if (!listCellWidth) {
2482
3695
  setTaskListWidth(0);
3696
+ return;
2483
3697
  }
2484
-
2485
- if (taskListRef.current) {
2486
- setTaskListWidth(taskListRef.current.offsetWidth);
3698
+ if (wrapperWidth) {
3699
+ setTaskListWidth(function (prev) {
3700
+ return clampTaskListWidth(prev, wrapperWidth);
3701
+ });
2487
3702
  }
2488
- }, [taskListRef, listCellWidth]);
3703
+ }, [listCellWidth, wrapperWidth]);
3704
+ var taskListOffset = listCellWidth ? taskListWidth + SPLIT_HANDLE_WIDTH : 0;
2489
3705
  useEffect(function () {
2490
- if (wrapperRef.current) {
2491
- setSvgContainerWidth(wrapperRef.current.offsetWidth - taskListWidth);
3706
+ if (wrapperWidth) {
3707
+ setSvgContainerWidth(Math.max(wrapperWidth - taskListOffset, 0));
2492
3708
  }
2493
- }, [wrapperRef, taskListWidth]);
3709
+ }, [wrapperWidth, taskListOffset]);
2494
3710
  useEffect(function () {
2495
3711
  if (ganttHeight) {
2496
3712
  setSvgContainerHeight(ganttHeight + headerHeight);
@@ -2499,118 +3715,147 @@ var Gantt = function Gantt(_ref) {
2499
3715
  }
2500
3716
  }, [ganttHeight, tasks, headerHeight, rowHeight]);
2501
3717
  useEffect(function () {
2502
- var _wrapperRef$current;
2503
-
3718
+ return function () {
3719
+ if (splitMoveHandlerRef.current) {
3720
+ document.removeEventListener("mousemove", splitMoveHandlerRef.current);
3721
+ splitMoveHandlerRef.current = null;
3722
+ }
3723
+ if (splitUpHandlerRef.current) {
3724
+ document.removeEventListener("mouseup", splitUpHandlerRef.current);
3725
+ splitUpHandlerRef.current = null;
3726
+ }
3727
+ };
3728
+ }, []);
3729
+ useEffect(function () {
2504
3730
  var handleWheel = function handleWheel(event) {
2505
3731
  if (event.shiftKey || event.deltaX) {
2506
3732
  var scrollMove = event.deltaX ? event.deltaX : event.deltaY;
2507
- var newScrollX = scrollX + scrollMove;
2508
-
3733
+ var newScrollX = scrollXRight + scrollMove;
2509
3734
  if (newScrollX < 0) {
2510
3735
  newScrollX = 0;
2511
3736
  } else if (newScrollX > svgWidth) {
2512
3737
  newScrollX = svgWidth;
2513
3738
  }
2514
-
2515
- setScrollX(newScrollX);
3739
+ ignoreScrollRightRef.current = true;
3740
+ setScrollXRight(newScrollX);
2516
3741
  event.preventDefault();
2517
3742
  } else if (ganttHeight) {
2518
3743
  var newScrollY = scrollY + event.deltaY;
2519
-
2520
3744
  if (newScrollY < 0) {
2521
3745
  newScrollY = 0;
2522
3746
  } else if (newScrollY > ganttFullHeight - ganttHeight) {
2523
3747
  newScrollY = ganttFullHeight - ganttHeight;
2524
3748
  }
2525
-
2526
3749
  if (newScrollY !== scrollY) {
2527
3750
  setScrollY(newScrollY);
2528
3751
  event.preventDefault();
2529
3752
  }
2530
3753
  }
2531
-
2532
- setIgnoreScrollEvent(true);
2533
3754
  };
2534
-
2535
- (_wrapperRef$current = wrapperRef.current) === null || _wrapperRef$current === void 0 ? void 0 : _wrapperRef$current.addEventListener("wheel", handleWheel, {
3755
+ var wrapperEl = wrapperRef.current;
3756
+ wrapperEl === null || wrapperEl === void 0 ? void 0 : wrapperEl.addEventListener("wheel", handleWheel, {
2536
3757
  passive: false
2537
3758
  });
2538
3759
  return function () {
2539
- var _wrapperRef$current2;
2540
-
2541
- (_wrapperRef$current2 = wrapperRef.current) === null || _wrapperRef$current2 === void 0 ? void 0 : _wrapperRef$current2.removeEventListener("wheel", handleWheel);
3760
+ wrapperEl === null || wrapperEl === void 0 ? void 0 : wrapperEl.removeEventListener("wheel", handleWheel);
2542
3761
  };
2543
- }, [wrapperRef, scrollY, scrollX, ganttHeight, svgWidth, rtl, ganttFullHeight]);
2544
-
3762
+ }, [scrollY, scrollXRight, ganttHeight, svgWidth, rtl, ganttFullHeight]);
3763
+ useEffect(function () {
3764
+ var updateLeftScroller = function updateLeftScroller() {
3765
+ var el = taskListBodyRef.current;
3766
+ if (el) {
3767
+ setLeftScrollerWidth(el.scrollWidth || 0);
3768
+ }
3769
+ };
3770
+ updateLeftScroller();
3771
+ var RO = window.ResizeObserver;
3772
+ var ro = RO ? new RO(updateLeftScroller) : null;
3773
+ if (ro && taskListBodyRef.current) {
3774
+ ro.observe(taskListBodyRef.current);
3775
+ }
3776
+ window.addEventListener("resize", updateLeftScroller);
3777
+ return function () {
3778
+ if (ro) {
3779
+ ro.disconnect();
3780
+ }
3781
+ window.removeEventListener("resize", updateLeftScroller);
3782
+ };
3783
+ }, [tasks, fontFamily, fontSize, listCellWidth, taskListBodyRef, visibleFields]);
2545
3784
  var handleScrollY = function handleScrollY(event) {
2546
- if (scrollY !== event.currentTarget.scrollTop && !ignoreScrollEvent) {
3785
+ if (scrollY !== event.currentTarget.scrollTop && !ignoreScrollLeftRef.current) {
2547
3786
  setScrollY(event.currentTarget.scrollTop);
2548
- setIgnoreScrollEvent(true);
3787
+ ignoreScrollLeftRef.current = true;
2549
3788
  } else {
2550
- setIgnoreScrollEvent(false);
3789
+ ignoreScrollLeftRef.current = false;
2551
3790
  }
2552
3791
  };
2553
-
2554
- var handleScrollX = function handleScrollX(event) {
2555
- if (scrollX !== event.currentTarget.scrollLeft && !ignoreScrollEvent) {
2556
- setScrollX(event.currentTarget.scrollLeft);
2557
- setIgnoreScrollEvent(true);
3792
+ var handleScrollLeft = function handleScrollLeft(event) {
3793
+ if (scrollXLeft !== event.currentTarget.scrollLeft && !ignoreScrollLeftRef.current) {
3794
+ setScrollXLeft(event.currentTarget.scrollLeft);
3795
+ ignoreScrollLeftRef.current = true;
2558
3796
  } else {
2559
- setIgnoreScrollEvent(false);
3797
+ ignoreScrollLeftRef.current = false;
3798
+ }
3799
+ };
3800
+ var handleScrollRight = function handleScrollRight(event) {
3801
+ if (scrollXRight !== event.currentTarget.scrollLeft && !ignoreScrollRightRef.current) {
3802
+ setScrollXRight(event.currentTarget.scrollLeft);
3803
+ ignoreScrollRightRef.current = true;
3804
+ } else {
3805
+ ignoreScrollRightRef.current = false;
3806
+ }
3807
+ if (ganttContainerRef.current && ganttContainerRef.current.scrollLeft !== event.currentTarget.scrollLeft) {
3808
+ ganttContainerRef.current.scrollLeft = event.currentTarget.scrollLeft;
2560
3809
  }
2561
3810
  };
2562
-
2563
3811
  var handleKeyDown = function handleKeyDown(event) {
3812
+ var target = event.target;
3813
+ if (target instanceof HTMLElement) {
3814
+ if (target.isContentEditable || target.tagName === "INPUT" || target.tagName === "TEXTAREA" || target.tagName === "SELECT") {
3815
+ return;
3816
+ }
3817
+ }
2564
3818
  event.preventDefault();
2565
3819
  var newScrollY = scrollY;
2566
- var newScrollX = scrollX;
3820
+ var newScrollX = scrollXRight;
2567
3821
  var isX = true;
2568
-
2569
3822
  switch (event.key) {
2570
3823
  case "Down":
2571
3824
  case "ArrowDown":
2572
3825
  newScrollY += rowHeight;
2573
3826
  isX = false;
2574
3827
  break;
2575
-
2576
3828
  case "Up":
2577
3829
  case "ArrowUp":
2578
3830
  newScrollY -= rowHeight;
2579
3831
  isX = false;
2580
3832
  break;
2581
-
2582
3833
  case "Left":
2583
3834
  case "ArrowLeft":
2584
3835
  newScrollX -= columnWidth;
2585
3836
  break;
2586
-
2587
3837
  case "Right":
2588
3838
  case "ArrowRight":
2589
3839
  newScrollX += columnWidth;
2590
3840
  break;
2591
3841
  }
2592
-
2593
3842
  if (isX) {
2594
3843
  if (newScrollX < 0) {
2595
3844
  newScrollX = 0;
2596
3845
  } else if (newScrollX > svgWidth) {
2597
3846
  newScrollX = svgWidth;
2598
3847
  }
2599
-
2600
- setScrollX(newScrollX);
3848
+ ignoreScrollRightRef.current = true;
3849
+ setScrollXRight(newScrollX);
2601
3850
  } else {
2602
3851
  if (newScrollY < 0) {
2603
3852
  newScrollY = 0;
2604
3853
  } else if (newScrollY > ganttFullHeight - ganttHeight) {
2605
3854
  newScrollY = ganttFullHeight - ganttHeight;
2606
3855
  }
2607
-
2608
3856
  setScrollY(newScrollY);
2609
3857
  }
2610
-
2611
- setIgnoreScrollEvent(true);
2612
3858
  };
2613
-
2614
3859
  var handleSelectedTask = function handleSelectedTask(taskId) {
2615
3860
  var newSelectedTask = barTasks.find(function (t) {
2616
3861
  return t.id === taskId;
@@ -2618,20 +3863,16 @@ var Gantt = function Gantt(_ref) {
2618
3863
  var oldSelectedTask = barTasks.find(function (t) {
2619
3864
  return !!selectedTask && t.id === selectedTask.id;
2620
3865
  });
2621
-
2622
3866
  if (onSelect) {
2623
3867
  if (oldSelectedTask) {
2624
3868
  onSelect(oldSelectedTask, false);
2625
3869
  }
2626
-
2627
3870
  if (newSelectedTask) {
2628
3871
  onSelect(newSelectedTask, true);
2629
3872
  }
2630
3873
  }
2631
-
2632
3874
  setSelectedTask(newSelectedTask);
2633
3875
  };
2634
-
2635
3876
  var handleExpanderClick = function handleExpanderClick(task) {
2636
3877
  if (onExpanderClick && task.hideChildren !== undefined) {
2637
3878
  onExpanderClick(_extends({}, task, {
@@ -2639,7 +3880,69 @@ var Gantt = function Gantt(_ref) {
2639
3880
  }));
2640
3881
  }
2641
3882
  };
2642
-
3883
+ var updateTaskListWidth = function updateTaskListWidth(clientX) {
3884
+ if (splitStartXRef.current == null || splitStartWidthRef.current == null) {
3885
+ return;
3886
+ }
3887
+ if (!wrapperRef.current) {
3888
+ return;
3889
+ }
3890
+ var delta = clientX - splitStartXRef.current;
3891
+ var nextWidth = clampTaskListWidth(splitStartWidthRef.current + delta, wrapperRef.current.offsetWidth);
3892
+ setTaskListWidth(nextWidth);
3893
+ };
3894
+ var handleSplitPointerDown = function handleSplitPointerDown(event) {
3895
+ event.preventDefault();
3896
+ splitStartXRef.current = event.clientX;
3897
+ splitStartWidthRef.current = taskListWidth;
3898
+ setIsResizing(true);
3899
+ if (event.currentTarget.setPointerCapture) {
3900
+ event.currentTarget.setPointerCapture(event.pointerId);
3901
+ }
3902
+ };
3903
+ var handleSplitPointerMove = function handleSplitPointerMove(event) {
3904
+ updateTaskListWidth(event.clientX);
3905
+ };
3906
+ var handleSplitPointerUp = function handleSplitPointerUp(event) {
3907
+ splitStartXRef.current = null;
3908
+ splitStartWidthRef.current = null;
3909
+ setIsResizing(false);
3910
+ if (event.currentTarget.releasePointerCapture) {
3911
+ event.currentTarget.releasePointerCapture(event.pointerId);
3912
+ }
3913
+ };
3914
+ var handleSplitMouseDown = function handleSplitMouseDown(event) {
3915
+ event.preventDefault();
3916
+ splitStartXRef.current = event.clientX;
3917
+ splitStartWidthRef.current = taskListWidth;
3918
+ setIsResizing(true);
3919
+ if (splitMoveHandlerRef.current) {
3920
+ document.removeEventListener("mousemove", splitMoveHandlerRef.current);
3921
+ }
3922
+ if (splitUpHandlerRef.current) {
3923
+ document.removeEventListener("mouseup", splitUpHandlerRef.current);
3924
+ }
3925
+ var handleMouseMove = function handleMouseMove(moveEvent) {
3926
+ updateTaskListWidth(moveEvent.clientX);
3927
+ };
3928
+ var handleMouseUp = function handleMouseUp() {
3929
+ splitStartXRef.current = null;
3930
+ splitStartWidthRef.current = null;
3931
+ setIsResizing(false);
3932
+ if (splitMoveHandlerRef.current) {
3933
+ document.removeEventListener("mousemove", splitMoveHandlerRef.current);
3934
+ splitMoveHandlerRef.current = null;
3935
+ }
3936
+ if (splitUpHandlerRef.current) {
3937
+ document.removeEventListener("mouseup", splitUpHandlerRef.current);
3938
+ splitUpHandlerRef.current = null;
3939
+ }
3940
+ };
3941
+ splitMoveHandlerRef.current = handleMouseMove;
3942
+ splitUpHandlerRef.current = handleMouseUp;
3943
+ document.addEventListener("mousemove", handleMouseMove);
3944
+ document.addEventListener("mouseup", handleMouseUp);
3945
+ };
2643
3946
  var gridProps = {
2644
3947
  columnWidth: columnWidth,
2645
3948
  svgWidth: svgWidth,
@@ -2647,7 +3950,8 @@ var Gantt = function Gantt(_ref) {
2647
3950
  rowHeight: rowHeight,
2648
3951
  dates: dateSetup.dates,
2649
3952
  todayColor: todayColor,
2650
- rtl: rtl
3953
+ rtl: rtl,
3954
+ calendarConfig: calendarConfig
2651
3955
  };
2652
3956
  var calendarProps = {
2653
3957
  dateSetup: dateSetup,
@@ -2657,7 +3961,8 @@ var Gantt = function Gantt(_ref) {
2657
3961
  columnWidth: columnWidth,
2658
3962
  fontFamily: fontFamily,
2659
3963
  fontSize: fontSize,
2660
- rtl: rtl
3964
+ rtl: rtl,
3965
+ calendarConfig: calendarConfig
2661
3966
  };
2662
3967
  var barProps = {
2663
3968
  tasks: barTasks,
@@ -2689,45 +3994,78 @@ var Gantt = function Gantt(_ref) {
2689
3994
  fontFamily: fontFamily,
2690
3995
  fontSize: fontSize,
2691
3996
  tasks: barTasks,
2692
- locale: locale,
2693
3997
  headerHeight: headerHeight,
2694
3998
  scrollY: scrollY,
3999
+ horizontalScroll: scrollXLeft,
2695
4000
  ganttHeight: ganttHeight,
2696
4001
  horizontalContainerClass: styles$9.horizontalContainer,
4002
+ headerContainerRef: taskListHeaderRef,
4003
+ bodyContainerRef: taskListBodyRef,
4004
+ onHorizontalScroll: handleScrollLeft,
2697
4005
  selectedTask: selectedTask,
2698
4006
  taskListRef: taskListRef,
2699
4007
  setSelectedTask: handleSelectedTask,
2700
4008
  onExpanderClick: handleExpanderClick,
2701
4009
  TaskListHeader: TaskListHeader,
2702
- TaskListTable: TaskListTable
4010
+ TaskListTable: TaskListTable,
4011
+ visibleFields: visibleFields,
4012
+ onUpdateTask: onTaskUpdate,
4013
+ onCellCommit: onCellCommit,
4014
+ effortDisplayUnit: effortDisplayUnit,
4015
+ enableColumnDrag: enableColumnDrag
2703
4016
  };
2704
4017
  return React.createElement("div", null, React.createElement("div", {
2705
4018
  className: styles$9.wrapper,
2706
4019
  onKeyDown: handleKeyDown,
2707
4020
  tabIndex: 0,
2708
4021
  ref: wrapperRef
2709
- }, listCellWidth && React.createElement(TaskList, Object.assign({}, tableProps)), React.createElement(TaskGantt, {
4022
+ }, listCellWidth && React.createElement("div", {
4023
+ className: styles$9.taskListPanel,
4024
+ style: {
4025
+ width: taskListWidth
4026
+ },
4027
+ "data-testid": "task-list-panel"
4028
+ }, React.createElement(TaskList, Object.assign({}, tableProps))), listCellWidth && React.createElement("div", {
4029
+ className: styles$9.splitHandle + " " + (isResizing ? styles$9.splitHandleActive : ""),
4030
+ onPointerDown: supportsPointerEvents ? handleSplitPointerDown : undefined,
4031
+ onPointerMove: supportsPointerEvents ? handleSplitPointerMove : undefined,
4032
+ onPointerUp: supportsPointerEvents ? handleSplitPointerUp : undefined,
4033
+ onPointerCancel: supportsPointerEvents ? handleSplitPointerUp : undefined,
4034
+ onMouseDown: supportsPointerEvents ? undefined : handleSplitMouseDown,
4035
+ role: "separator",
4036
+ "aria-label": "Task/Schedule divider",
4037
+ "aria-orientation": "vertical",
4038
+ "data-testid": "pane-splitter"
4039
+ }), React.createElement("div", {
4040
+ className: styles$9.ganttPanel,
4041
+ style: {
4042
+ minWidth: MIN_PANE_WIDTH
4043
+ },
4044
+ "data-testid": "gantt-panel"
4045
+ }, React.createElement(TaskGantt, {
2710
4046
  gridProps: gridProps,
2711
4047
  calendarProps: calendarProps,
2712
4048
  barProps: barProps,
2713
4049
  ganttHeight: ganttHeight,
2714
4050
  scrollY: scrollY,
2715
- scrollX: scrollX
2716
- }), ganttEvent.changedTask && React.createElement(Tooltip, {
4051
+ scrollX: scrollXRight,
4052
+ verticalGanttContainerRef: ganttContainerRef
4053
+ })), ganttEvent.changedTask && React.createElement(Tooltip, {
2717
4054
  arrowIndent: arrowIndent,
2718
4055
  rowHeight: rowHeight,
2719
4056
  svgContainerHeight: svgContainerHeight,
2720
4057
  svgContainerWidth: svgContainerWidth,
2721
4058
  fontFamily: fontFamily,
2722
4059
  fontSize: fontSize,
2723
- scrollX: scrollX,
4060
+ scrollX: scrollXRight,
2724
4061
  scrollY: scrollY,
2725
4062
  task: ganttEvent.changedTask,
2726
4063
  headerHeight: headerHeight,
2727
- taskListWidth: taskListWidth,
4064
+ taskListWidth: taskListOffset,
2728
4065
  TooltipContent: TooltipContent,
2729
4066
  rtl: rtl,
2730
- svgWidth: svgWidth
4067
+ svgWidth: svgWidth,
4068
+ effortDisplayUnit: effortDisplayUnit
2731
4069
  }), React.createElement(VerticalScroll, {
2732
4070
  ganttFullHeight: ganttFullHeight,
2733
4071
  ganttHeight: ganttHeight,
@@ -2735,14 +4073,30 @@ var Gantt = function Gantt(_ref) {
2735
4073
  scroll: scrollY,
2736
4074
  onScroll: handleScrollY,
2737
4075
  rtl: rtl
2738
- })), React.createElement(HorizontalScroll, {
4076
+ })), React.createElement("div", {
4077
+ className: styles$9.scrollRow,
4078
+ style: {
4079
+ "--splitter-width": SPLIT_HANDLE_WIDTH + "px"
4080
+ }
4081
+ }, React.createElement("div", {
4082
+ className: styles$9.scrollCellLeft
4083
+ }, listCellWidth && React.createElement(HorizontalScroll, {
4084
+ svgWidth: taskListWidth,
4085
+ scrollerWidth: leftScrollerWidth,
4086
+ scroll: scrollXLeft,
4087
+ rtl: rtl,
4088
+ onScroll: handleScrollLeft
4089
+ })), listCellWidth && React.createElement("div", {
4090
+ className: styles$9.scrollSplitter
4091
+ }), React.createElement("div", {
4092
+ className: styles$9.scrollCellRight
4093
+ }, React.createElement(HorizontalScroll, {
2739
4094
  svgWidth: svgWidth,
2740
- taskListWidth: taskListWidth,
2741
- scroll: scrollX,
4095
+ scroll: scrollXRight,
2742
4096
  rtl: rtl,
2743
- onScroll: handleScrollX
2744
- }));
4097
+ onScroll: handleScrollRight
4098
+ }))));
2745
4099
  };
2746
4100
 
2747
- export { Gantt, ViewMode };
4101
+ export { DEFAULT_VISIBLE_FIELDS, Gantt, TASK_PROCESS_OPTIONS, TASK_STATUS_BADGE_TEXT, TASK_STATUS_COLORS, TASK_STATUS_OPTIONS, ViewMode, formatDate, formatEffort, getStatusBadgeText, getStatusColor, normalizeProcess, normalizeStatus, parseDateFromInput, resolveVisibleFields, sanitizeEffortInput };
2748
4102
  //# sourceMappingURL=index.modern.js.map