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