gantt-lib 0.86.1 → 0.87.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -4642,6 +4642,8 @@ var TaskListRow = React9.memo(
4642
4642
  isFilterMatch = false,
4643
4643
  isFilterHideMode = false,
4644
4644
  resolvedColumns,
4645
+ isTaskSelected = false,
4646
+ onTaskSelectionChange,
4645
4647
  taskListMenuCommands = []
4646
4648
  }) => {
4647
4649
  const [editingColumnId, setEditingColumnId] = useState4(null);
@@ -5435,6 +5437,23 @@ var TaskListRow = React9.memo(
5435
5437
  const isSelectedDependencyOwner = selectedChip != null && selectedChip.successorId === task.id;
5436
5438
  const startDateISO = toISODate2(normalizedTask.startDate);
5437
5439
  const endDateISO = editingDuration ? getEndDate(normalizedTask.startDate, durationValue) : toISODate2(normalizedTask.endDate);
5440
+ const selectionCell = /* @__PURE__ */ jsx12(
5441
+ "div",
5442
+ {
5443
+ className: "gantt-tl-cell gantt-tl-cell-selection",
5444
+ onClick: (e) => e.stopPropagation(),
5445
+ children: /* @__PURE__ */ jsx12(
5446
+ "input",
5447
+ {
5448
+ type: "checkbox",
5449
+ className: "gantt-tl-selection-checkbox",
5450
+ "aria-label": `\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0437\u0430\u0434\u0430\u0447\u0443 ${taskNumber ? `${taskNumber}. ` : ""}${task.name}`,
5451
+ checked: isTaskSelected,
5452
+ onChange: (event) => onTaskSelectionChange?.(task.id, event.target.checked)
5453
+ }
5454
+ )
5455
+ }
5456
+ );
5438
5457
  const numberCell = /* @__PURE__ */ jsxs9(
5439
5458
  "div",
5440
5459
  {
@@ -6152,6 +6171,7 @@ var TaskListRow = React9.memo(
6152
6171
  }
6153
6172
  );
6154
6173
  const builtInCells = {
6174
+ selection: selectionCell,
6155
6175
  number: numberCell,
6156
6176
  name: nameCell,
6157
6177
  startDate: startDateCell,
@@ -6304,6 +6324,7 @@ var NewTaskRow = ({
6304
6324
 
6305
6325
  // src/components/TaskList/columns/createBuiltInColumns.tsx
6306
6326
  var BUILT_IN_COLUMN_WIDTHS = {
6327
+ selection: 36,
6307
6328
  number: 40,
6308
6329
  name: 200,
6309
6330
  startDate: 90,
@@ -6314,7 +6335,7 @@ var BUILT_IN_COLUMN_WIDTHS = {
6314
6335
  actions: 80
6315
6336
  };
6316
6337
  function createBuiltInColumns(opts) {
6317
- return [
6338
+ const columns = [
6318
6339
  { id: "number", header: "\u2116", width: BUILT_IN_COLUMN_WIDTHS.number, renderCell: () => null },
6319
6340
  { id: "name", header: "\u0418\u043C\u044F", width: BUILT_IN_COLUMN_WIDTHS.name, renderCell: () => null },
6320
6341
  { id: "startDate", header: "\u041D\u0430\u0447\u0430\u043B\u043E", width: BUILT_IN_COLUMN_WIDTHS.startDate, renderCell: () => null },
@@ -6323,6 +6344,15 @@ function createBuiltInColumns(opts) {
6323
6344
  { id: "progress", header: "%", width: BUILT_IN_COLUMN_WIDTHS.progress, renderCell: () => null },
6324
6345
  { id: "dependencies", header: null, width: BUILT_IN_COLUMN_WIDTHS.dependencies, renderCell: () => null }
6325
6346
  ];
6347
+ if (opts?.enableTaskMultiSelect) {
6348
+ columns.unshift({
6349
+ id: "selection",
6350
+ header: null,
6351
+ width: BUILT_IN_COLUMN_WIDTHS.selection,
6352
+ renderCell: () => null
6353
+ });
6354
+ }
6355
+ return columns;
6326
6356
  }
6327
6357
 
6328
6358
  // src/components/TaskList/columns/resolveTaskListColumns.ts
@@ -6383,6 +6413,7 @@ import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
6383
6413
  var LINK_TYPE_ORDER2 = ["FS", "SS", "FF", "SF"];
6384
6414
  var MIN_TASK_LIST_WIDTH = 530;
6385
6415
  var BUILT_IN_CSS_CLASSES = {
6416
+ selection: "gantt-tl-cell-selection",
6386
6417
  number: "gantt-tl-cell-number",
6387
6418
  name: "gantt-tl-cell-name",
6388
6419
  startDate: "gantt-tl-cell-date",
@@ -6458,6 +6489,30 @@ function getTaskNumber(tasks, taskIndex) {
6458
6489
  }
6459
6490
  return `${parentNumber}.${siblingIndex + 1}`;
6460
6491
  }
6492
+ var SelectAllCheckbox = ({
6493
+ checked,
6494
+ indeterminate,
6495
+ onChange
6496
+ }) => {
6497
+ const ref = useRef6(null);
6498
+ useEffect6(() => {
6499
+ if (ref.current) {
6500
+ ref.current.indeterminate = indeterminate;
6501
+ }
6502
+ }, [indeterminate]);
6503
+ return /* @__PURE__ */ jsx14(
6504
+ "input",
6505
+ {
6506
+ ref,
6507
+ type: "checkbox",
6508
+ className: "gantt-tl-selection-checkbox",
6509
+ "aria-label": "\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435 \u0432\u0438\u0434\u0438\u043C\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438",
6510
+ checked,
6511
+ onChange: (event) => onChange(event.target.checked),
6512
+ onClick: (event) => event.stopPropagation()
6513
+ }
6514
+ );
6515
+ };
6461
6516
  var TaskList = ({
6462
6517
  tasks,
6463
6518
  rowHeight,
@@ -6488,6 +6543,9 @@ var TaskList = ({
6488
6543
  isWeekend: isWeekend3,
6489
6544
  businessDays,
6490
6545
  highlightedTaskIds = /* @__PURE__ */ new Set(),
6546
+ enableTaskMultiSelect = false,
6547
+ selectedTaskIds,
6548
+ onSelectedTaskIdsChange,
6491
6549
  filterMode = "highlight",
6492
6550
  filteredTaskIds = /* @__PURE__ */ new Set(),
6493
6551
  isFilterActive = false,
@@ -6495,6 +6553,14 @@ var TaskList = ({
6495
6553
  hiddenTaskListColumns,
6496
6554
  taskListMenuCommands
6497
6555
  }) => {
6556
+ const [internalSelectedTaskIds, setInternalSelectedTaskIds] = useState6(/* @__PURE__ */ new Set());
6557
+ const effectiveSelectedTaskIds = selectedTaskIds ?? internalSelectedTaskIds;
6558
+ const emitSelectedTaskIdsChange = useCallback5((nextSelectedTaskIds) => {
6559
+ if (!selectedTaskIds) {
6560
+ setInternalSelectedTaskIds(nextSelectedTaskIds);
6561
+ }
6562
+ onSelectedTaskIdsChange?.(nextSelectedTaskIds);
6563
+ }, [onSelectedTaskIdsChange, selectedTaskIds]);
6498
6564
  const [internalCollapsedParentIds, setInternalCollapsedParentIds] = useState6(/* @__PURE__ */ new Set());
6499
6565
  const collapsedParentIds = externalCollapsedParentIds ?? internalCollapsedParentIds;
6500
6566
  const handleToggleCollapse = externalOnToggleCollapse ?? useCallback5((parentId) => {
@@ -6541,6 +6607,33 @@ var TaskList = ({
6541
6607
  ),
6542
6608
  [visibleTasks]
6543
6609
  );
6610
+ const visibleTaskIds = useMemo8(() => visibleTasks.map((task) => task.id), [visibleTasks]);
6611
+ const selectedVisibleTaskCount = useMemo8(
6612
+ () => visibleTaskIds.filter((taskId) => effectiveSelectedTaskIds.has(taskId)).length,
6613
+ [effectiveSelectedTaskIds, visibleTaskIds]
6614
+ );
6615
+ const areAllVisibleTasksSelected = visibleTaskIds.length > 0 && selectedVisibleTaskCount === visibleTaskIds.length;
6616
+ const areSomeVisibleTasksSelected = selectedVisibleTaskCount > 0 && !areAllVisibleTasksSelected;
6617
+ const handleToggleTaskSelection = useCallback5((taskId, checked) => {
6618
+ const nextSelectedTaskIds = new Set(effectiveSelectedTaskIds);
6619
+ if (checked) {
6620
+ nextSelectedTaskIds.add(taskId);
6621
+ } else {
6622
+ nextSelectedTaskIds.delete(taskId);
6623
+ }
6624
+ emitSelectedTaskIdsChange(nextSelectedTaskIds);
6625
+ }, [effectiveSelectedTaskIds, emitSelectedTaskIdsChange]);
6626
+ const handleToggleAllVisibleTaskSelection = useCallback5((checked) => {
6627
+ const nextSelectedTaskIds = new Set(effectiveSelectedTaskIds);
6628
+ for (const taskId of visibleTaskIds) {
6629
+ if (checked) {
6630
+ nextSelectedTaskIds.add(taskId);
6631
+ } else {
6632
+ nextSelectedTaskIds.delete(taskId);
6633
+ }
6634
+ }
6635
+ emitSelectedTaskIdsChange(nextSelectedTaskIds);
6636
+ }, [effectiveSelectedTaskIds, emitSelectedTaskIdsChange, visibleTaskIds]);
6544
6637
  const originalTaskNumberMap = useMemo8(
6545
6638
  () => {
6546
6639
  const numberMap = /* @__PURE__ */ new Map();
@@ -7022,7 +7115,10 @@ var TaskList = ({
7022
7115
  const duplicatedTasks = duplicateTaskSubtree(taskId, orderedTasks);
7023
7116
  onReorder?.(duplicatedTasks);
7024
7117
  }, [orderedTasks, onReorder]);
7025
- const builtInColumns = useMemo8(() => createBuiltInColumns({ businessDays }), [businessDays]);
7118
+ const builtInColumns = useMemo8(
7119
+ () => createBuiltInColumns({ businessDays, enableTaskMultiSelect }),
7120
+ [businessDays, enableTaskMultiSelect]
7121
+ );
7026
7122
  const resolvedColumns = useMemo8(
7027
7123
  () => resolveTaskListColumns(
7028
7124
  builtInColumns,
@@ -7046,6 +7142,24 @@ var TaskList = ({
7046
7142
  style: { "--tasklist-width": `${effectiveTaskListWidth}px` },
7047
7143
  children: /* @__PURE__ */ jsxs11("div", { className: "gantt-tl-table", children: [
7048
7144
  /* @__PURE__ */ jsx14("div", { className: "gantt-tl-header", style: { height: `${tableHeaderHeight}px` }, children: resolvedColumns.map((col) => {
7145
+ if (col.id === "selection") {
7146
+ return /* @__PURE__ */ jsx14(
7147
+ "div",
7148
+ {
7149
+ className: "gantt-tl-headerCell gantt-tl-cell-selection",
7150
+ "data-column-id": "selection",
7151
+ children: /* @__PURE__ */ jsx14(
7152
+ SelectAllCheckbox,
7153
+ {
7154
+ checked: areAllVisibleTasksSelected,
7155
+ indeterminate: areSomeVisibleTasksSelected,
7156
+ onChange: handleToggleAllVisibleTaskSelection
7157
+ }
7158
+ )
7159
+ },
7160
+ col.id
7161
+ );
7162
+ }
7049
7163
  if (col.id === "dependencies") {
7050
7164
  return /* @__PURE__ */ jsxs11(
7051
7165
  "div",
@@ -7171,6 +7285,8 @@ var TaskList = ({
7171
7285
  isFilterMatch: filterMode === "highlight" ? highlightedTaskIds.has(task.id) : false,
7172
7286
  isFilterHideMode: filterMode === "hide" && isFilterActive,
7173
7287
  resolvedColumns,
7288
+ isTaskSelected: effectiveSelectedTaskIds.has(task.id),
7289
+ onTaskSelectionChange: handleToggleTaskSelection,
7174
7290
  taskListMenuCommands
7175
7291
  }
7176
7292
  ),
@@ -9251,6 +9367,9 @@ function TaskGanttChartInner(props, ref) {
9251
9367
  collapsedParentIds: externalCollapsedParentIds,
9252
9368
  onToggleCollapse: externalOnToggleCollapse,
9253
9369
  highlightedTaskIds,
9370
+ enableTaskMultiSelect = false,
9371
+ selectedTaskIds,
9372
+ onSelectedTaskIdsChange,
9254
9373
  disableTaskDrag = false,
9255
9374
  showChart = true,
9256
9375
  additionalColumns,
@@ -9821,6 +9940,9 @@ function TaskGanttChartInner(props, ref) {
9821
9940
  onDemoteTask: onDemoteTask ?? handleDemoteTask,
9822
9941
  onUngroupTask: onUngroupTask ?? handleUngroupTask,
9823
9942
  highlightedTaskIds: taskListHighlightedTaskIds,
9943
+ enableTaskMultiSelect,
9944
+ selectedTaskIds,
9945
+ onSelectedTaskIdsChange,
9824
9946
  customDays,
9825
9947
  isWeekend: isWeekend3,
9826
9948
  businessDays,