gantt-task-react-v 1.7.3 → 1.7.5

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.
@@ -5,5 +5,6 @@ export declare const useTableListResize: (clientColumns: readonly Column[] | und
5
5
  taskListWidth: number,
6
6
  tableWidth: number,
7
7
  onTableResizeStart: (clientX: number) => void,
8
- onColumnResizeStart: (columnIndex: number, clientX: number) => void
8
+ onColumnResizeStart: (columnIndex: number, clientX: number) => void,
9
+ handleColumnVisibilityChange: (columnId: string, hidden: boolean) => void
9
10
  ];
@@ -5378,22 +5378,16 @@ const useTableListResize = (clientColumns, canMoveTasks, onResizeColumn, ganttRe
5378
5378
  useEffect(() => {
5379
5379
  if (clientColumns) {
5380
5380
  setColumns([...clientColumns]);
5381
- const currentColumnIds = clientColumns.map((col) => col.id);
5382
- const newColumnIds = clientColumns.map((col) => col.id);
5383
- const widthOfAddedColumns = clientColumns.filter((col) => !currentColumnIds.includes(col.id)).reduce((res, { width }) => res + width, 0);
5384
- const widthOfRemovedColumns = clientColumns.filter((col) => !newColumnIds.includes(col.id)).reduce((res, { width }) => res + width, 0);
5381
+ const visibleColumns = clientColumns.filter((col) => !col.hidden);
5385
5382
  setTableWidth(
5386
- (prev) => Math.min(
5387
- prev + widthOfAddedColumns - widthOfRemovedColumns,
5388
- clientColumns.reduce((res, { width }) => res + width, 0) + extraWidth
5389
- )
5383
+ visibleColumns.reduce((res, { width }) => res + width, 0) + extraWidth
5390
5384
  );
5391
5385
  }
5392
5386
  }, [clientColumns, extraWidth]);
5393
5387
  const [tableResizeEvent, setTableResizeEvent] = useState(null);
5394
5388
  const [columnResizeEvent, setColumnResizeEvent] = useState(null);
5395
5389
  const [tableWidthState, setTableWidth] = useState(
5396
- () => columnsState.reduce((res, { width }) => res + width, 0) + extraWidth
5390
+ () => columnsState.filter((c) => !c.hidden).reduce((res, { width }) => res + width, 0) + extraWidth
5397
5391
  );
5398
5392
  const onTableResizeStart = (clientX) => {
5399
5393
  const newTableResizeEvent = {
@@ -5411,9 +5405,19 @@ const useTableListResize = (clientColumns, canMoveTasks, onResizeColumn, ganttRe
5411
5405
  initialTableWidth: tableWidthState
5412
5406
  });
5413
5407
  };
5408
+ const handleColumnVisibilityChange = (columnId, hidden2) => {
5409
+ setColumns((prev) => {
5410
+ const next = prev.map(
5411
+ (col) => col.id === columnId ? { ...col, hidden: hidden2 } : col
5412
+ );
5413
+ const visibleWidth = next.filter((c) => !c.hidden).reduce((s, { width }) => s + width, 0) + extraWidth;
5414
+ setTableWidth(visibleWidth);
5415
+ return next;
5416
+ });
5417
+ };
5414
5418
  const isResizeTableInProgress = Boolean(tableResizeEvent);
5415
5419
  const isResizeColumnInProgress = Boolean(columnResizeEvent);
5416
- const taskListWidth = columnsState.reduce((res, { width }) => res + width, 0) + extraWidth;
5420
+ const taskListWidth = columnsState.filter((c) => !c.hidden).reduce((res, { width }) => res + width, 0) + extraWidth;
5417
5421
  useEffect(() => {
5418
5422
  if (!isResizeTableInProgress) {
5419
5423
  return void 0;
@@ -5534,7 +5538,8 @@ const useTableListResize = (clientColumns, canMoveTasks, onResizeColumn, ganttRe
5534
5538
  taskListWidth,
5535
5539
  tableWidthState,
5536
5540
  onTableResizeStart,
5537
- onColumnResizeStart
5541
+ onColumnResizeStart,
5542
+ handleColumnVisibilityChange
5538
5543
  ];
5539
5544
  };
5540
5545
  const toggleWrapper = "_toggleWrapper_rjfhl_1";
@@ -5698,7 +5703,8 @@ const TaskListTableHeadersDefaultInner = ({
5698
5703
  position: "sticky",
5699
5704
  left: leftOffset,
5700
5705
  zIndex: 2,
5701
- backgroundColor: "var(--gantt-table-header-background-color, #fff)"
5706
+ backgroundColor: "var(--gantt-table-header-background-color, #fff)",
5707
+ paddingRight: 8
5702
5708
  };
5703
5709
  leftOffset += columns[i].width;
5704
5710
  }
@@ -5710,7 +5716,8 @@ const TaskListTableHeadersDefaultInner = ({
5710
5716
  position: "sticky",
5711
5717
  right: rightOffset,
5712
5718
  zIndex: 2,
5713
- backgroundColor: "var(--gantt-table-header-background-color, #fff)"
5719
+ backgroundColor: "var(--gantt-table-header-background-color, #fff)",
5720
+ paddingLeft: 8
5714
5721
  };
5715
5722
  rightOffset += columns[i].width;
5716
5723
  }
@@ -10450,7 +10457,7 @@ const TaskListTableRowInner = forwardRef(
10450
10457
  if (isOverlay2) {
10451
10458
  return "var(--gantt-table-drag-task-background-color)";
10452
10459
  }
10453
- return isSelected ? "var(--gantt-table-selected-task-background-color)" : isEven ? "var(--gantt-table-even-background-color)" : void 0;
10460
+ return isSelected ? "var(--gantt-table-selected-task-background-color)" : isEven ? "var(--gantt-table-even-background-color)" : "var(--gantt-background-color, #fff)";
10454
10461
  }, [isEven, isOverlay2, isSelected]);
10455
10462
  const rowClassName = useMemo(() => {
10456
10463
  const classNames = [styles$h.taskListTableRow];
@@ -10470,35 +10477,31 @@ const TaskListTableRowInner = forwardRef(
10470
10477
  }, [isCut2, moveOverPosition, isOverlay2, isDragging]);
10471
10478
  const pinnedStyles = useMemo(() => {
10472
10479
  const result = {};
10473
- let leftOffset = 0;
10474
- if (moveHandleProps || !isOverlay2 && task.type !== "project" && task.id !== "no-project-asigned") {
10475
- leftOffset = 24;
10476
- }
10480
+ const pinnedBg = backgroundColor || "var(--gantt-background-color, #fff)";
10477
10481
  for (let i = 0; i < columns.length; i++) {
10478
10482
  if (columns[i].pinned === "left") {
10479
10483
  result[i] = {
10480
- position: "sticky",
10481
- left: leftOffset,
10482
- zIndex: 1,
10483
- backgroundColor: "inherit"
10484
+ position: "relative",
10485
+ transform: "translateX(var(--pinned-translate-left, 0px))",
10486
+ zIndex: 2,
10487
+ backgroundColor: pinnedBg,
10488
+ paddingRight: 8
10484
10489
  };
10485
- leftOffset += columns[i].width;
10486
10490
  }
10487
10491
  }
10488
- let rightOffset = 0;
10489
10492
  for (let i = columns.length - 1; i >= 0; i--) {
10490
10493
  if (columns[i].pinned === "right") {
10491
10494
  result[i] = {
10492
- position: "sticky",
10493
- right: rightOffset,
10494
- zIndex: 1,
10495
- backgroundColor: "inherit"
10495
+ position: "relative",
10496
+ transform: "translateX(var(--pinned-translate-right, 0px))",
10497
+ zIndex: 2,
10498
+ backgroundColor: pinnedBg,
10499
+ paddingLeft: 8
10496
10500
  };
10497
- rightOffset += columns[i].width;
10498
10501
  }
10499
10502
  }
10500
10503
  return result;
10501
- }, [columns, moveHandleProps, isOverlay2, task.type, task.id]);
10504
+ }, [columns, backgroundColor]);
10502
10505
  return /* @__PURE__ */ jsxs(
10503
10506
  "div",
10504
10507
  {
@@ -11169,17 +11172,55 @@ const TaskListInner = ({
11169
11172
  taskListWidth,
11170
11173
  tableWidth,
11171
11174
  onTableResizeStart,
11172
- onColumnResizeStart
11175
+ onColumnResizeStart,
11176
+ internalColumnVisibilityChange
11173
11177
  ] = useTableListResize(
11174
11178
  columnsProp,
11175
11179
  canReorderTasks,
11176
11180
  onResizeColumn,
11177
11181
  ganttRef
11178
11182
  );
11183
+ const handleColumnVisibilityChange = useCallback(
11184
+ (columnId, hidden2) => {
11185
+ internalColumnVisibilityChange(columnId, hidden2);
11186
+ if (onColumnVisibilityChange) {
11187
+ onColumnVisibilityChange(columnId, hidden2);
11188
+ }
11189
+ },
11190
+ [internalColumnVisibilityChange, onColumnVisibilityChange]
11191
+ );
11179
11192
  const columns = useMemo(
11180
11193
  () => allColumns.filter((col) => !col.hidden),
11181
11194
  [allColumns]
11182
11195
  );
11196
+ const horizontalScrollRef = useRef(null);
11197
+ const setHorizontalScrollRef = useCallback(
11198
+ (el) => {
11199
+ horizontalScrollRef.current = el;
11200
+ if (taskListHorizontalScrollRef) {
11201
+ taskListHorizontalScrollRef.current = el;
11202
+ }
11203
+ },
11204
+ [taskListHorizontalScrollRef]
11205
+ );
11206
+ useEffect(() => {
11207
+ const scrollEl = horizontalScrollRef.current;
11208
+ const containerEl = taskListContainerRef.current;
11209
+ if (!scrollEl || !containerEl)
11210
+ return void 0;
11211
+ const update = () => {
11212
+ const sl = scrollEl.scrollLeft;
11213
+ const maxSl = scrollEl.scrollWidth - scrollEl.clientWidth;
11214
+ containerEl.style.setProperty("--pinned-translate-left", `${sl}px`);
11215
+ containerEl.style.setProperty(
11216
+ "--pinned-translate-right",
11217
+ `${sl - maxSl}px`
11218
+ );
11219
+ };
11220
+ update();
11221
+ scrollEl.addEventListener("scroll", update, { passive: true });
11222
+ return () => scrollEl.removeEventListener("scroll", update);
11223
+ }, [taskListContainerRef, taskListWidth, tableWidth]);
11183
11224
  const renderedIndexes = useOptimizedList(
11184
11225
  taskListContainerRef,
11185
11226
  "scrollTop",
@@ -11256,7 +11297,7 @@ const TaskListInner = ({
11256
11297
  /* @__PURE__ */ jsxs(
11257
11298
  "div",
11258
11299
  {
11259
- ref: taskListHorizontalScrollRef,
11300
+ ref: setHorizontalScrollRef,
11260
11301
  className: styles$e.taskListHorizontalScroll,
11261
11302
  style: {
11262
11303
  width: tableWidth
@@ -11271,7 +11312,7 @@ const TaskListInner = ({
11271
11312
  allColumns,
11272
11313
  canToggleColumns: !!canToggleColumns,
11273
11314
  onColumnResizeStart,
11274
- onColumnVisibilityChange,
11315
+ onColumnVisibilityChange: handleColumnVisibilityChange,
11275
11316
  canResizeColumns
11276
11317
  }
11277
11318
  ),
@@ -5395,22 +5395,16 @@
5395
5395
  React.useEffect(() => {
5396
5396
  if (clientColumns) {
5397
5397
  setColumns([...clientColumns]);
5398
- const currentColumnIds = clientColumns.map((col) => col.id);
5399
- const newColumnIds = clientColumns.map((col) => col.id);
5400
- const widthOfAddedColumns = clientColumns.filter((col) => !currentColumnIds.includes(col.id)).reduce((res, { width }) => res + width, 0);
5401
- const widthOfRemovedColumns = clientColumns.filter((col) => !newColumnIds.includes(col.id)).reduce((res, { width }) => res + width, 0);
5398
+ const visibleColumns = clientColumns.filter((col) => !col.hidden);
5402
5399
  setTableWidth(
5403
- (prev) => Math.min(
5404
- prev + widthOfAddedColumns - widthOfRemovedColumns,
5405
- clientColumns.reduce((res, { width }) => res + width, 0) + extraWidth
5406
- )
5400
+ visibleColumns.reduce((res, { width }) => res + width, 0) + extraWidth
5407
5401
  );
5408
5402
  }
5409
5403
  }, [clientColumns, extraWidth]);
5410
5404
  const [tableResizeEvent, setTableResizeEvent] = React.useState(null);
5411
5405
  const [columnResizeEvent, setColumnResizeEvent] = React.useState(null);
5412
5406
  const [tableWidthState, setTableWidth] = React.useState(
5413
- () => columnsState.reduce((res, { width }) => res + width, 0) + extraWidth
5407
+ () => columnsState.filter((c) => !c.hidden).reduce((res, { width }) => res + width, 0) + extraWidth
5414
5408
  );
5415
5409
  const onTableResizeStart = (clientX) => {
5416
5410
  const newTableResizeEvent = {
@@ -5428,9 +5422,19 @@
5428
5422
  initialTableWidth: tableWidthState
5429
5423
  });
5430
5424
  };
5425
+ const handleColumnVisibilityChange = (columnId, hidden2) => {
5426
+ setColumns((prev) => {
5427
+ const next = prev.map(
5428
+ (col) => col.id === columnId ? { ...col, hidden: hidden2 } : col
5429
+ );
5430
+ const visibleWidth = next.filter((c) => !c.hidden).reduce((s, { width }) => s + width, 0) + extraWidth;
5431
+ setTableWidth(visibleWidth);
5432
+ return next;
5433
+ });
5434
+ };
5431
5435
  const isResizeTableInProgress = Boolean(tableResizeEvent);
5432
5436
  const isResizeColumnInProgress = Boolean(columnResizeEvent);
5433
- const taskListWidth = columnsState.reduce((res, { width }) => res + width, 0) + extraWidth;
5437
+ const taskListWidth = columnsState.filter((c) => !c.hidden).reduce((res, { width }) => res + width, 0) + extraWidth;
5434
5438
  React.useEffect(() => {
5435
5439
  if (!isResizeTableInProgress) {
5436
5440
  return void 0;
@@ -5551,7 +5555,8 @@
5551
5555
  taskListWidth,
5552
5556
  tableWidthState,
5553
5557
  onTableResizeStart,
5554
- onColumnResizeStart
5558
+ onColumnResizeStart,
5559
+ handleColumnVisibilityChange
5555
5560
  ];
5556
5561
  };
5557
5562
  const toggleWrapper = "_toggleWrapper_rjfhl_1";
@@ -5715,7 +5720,8 @@
5715
5720
  position: "sticky",
5716
5721
  left: leftOffset,
5717
5722
  zIndex: 2,
5718
- backgroundColor: "var(--gantt-table-header-background-color, #fff)"
5723
+ backgroundColor: "var(--gantt-table-header-background-color, #fff)",
5724
+ paddingRight: 8
5719
5725
  };
5720
5726
  leftOffset += columns[i].width;
5721
5727
  }
@@ -5727,7 +5733,8 @@
5727
5733
  position: "sticky",
5728
5734
  right: rightOffset,
5729
5735
  zIndex: 2,
5730
- backgroundColor: "var(--gantt-table-header-background-color, #fff)"
5736
+ backgroundColor: "var(--gantt-table-header-background-color, #fff)",
5737
+ paddingLeft: 8
5731
5738
  };
5732
5739
  rightOffset += columns[i].width;
5733
5740
  }
@@ -10467,7 +10474,7 @@
10467
10474
  if (isOverlay2) {
10468
10475
  return "var(--gantt-table-drag-task-background-color)";
10469
10476
  }
10470
- return isSelected ? "var(--gantt-table-selected-task-background-color)" : isEven ? "var(--gantt-table-even-background-color)" : void 0;
10477
+ return isSelected ? "var(--gantt-table-selected-task-background-color)" : isEven ? "var(--gantt-table-even-background-color)" : "var(--gantt-background-color, #fff)";
10471
10478
  }, [isEven, isOverlay2, isSelected]);
10472
10479
  const rowClassName = React.useMemo(() => {
10473
10480
  const classNames = [styles$h.taskListTableRow];
@@ -10487,35 +10494,31 @@
10487
10494
  }, [isCut2, moveOverPosition, isOverlay2, isDragging]);
10488
10495
  const pinnedStyles = React.useMemo(() => {
10489
10496
  const result = {};
10490
- let leftOffset = 0;
10491
- if (moveHandleProps || !isOverlay2 && task.type !== "project" && task.id !== "no-project-asigned") {
10492
- leftOffset = 24;
10493
- }
10497
+ const pinnedBg = backgroundColor || "var(--gantt-background-color, #fff)";
10494
10498
  for (let i = 0; i < columns.length; i++) {
10495
10499
  if (columns[i].pinned === "left") {
10496
10500
  result[i] = {
10497
- position: "sticky",
10498
- left: leftOffset,
10499
- zIndex: 1,
10500
- backgroundColor: "inherit"
10501
+ position: "relative",
10502
+ transform: "translateX(var(--pinned-translate-left, 0px))",
10503
+ zIndex: 2,
10504
+ backgroundColor: pinnedBg,
10505
+ paddingRight: 8
10501
10506
  };
10502
- leftOffset += columns[i].width;
10503
10507
  }
10504
10508
  }
10505
- let rightOffset = 0;
10506
10509
  for (let i = columns.length - 1; i >= 0; i--) {
10507
10510
  if (columns[i].pinned === "right") {
10508
10511
  result[i] = {
10509
- position: "sticky",
10510
- right: rightOffset,
10511
- zIndex: 1,
10512
- backgroundColor: "inherit"
10512
+ position: "relative",
10513
+ transform: "translateX(var(--pinned-translate-right, 0px))",
10514
+ zIndex: 2,
10515
+ backgroundColor: pinnedBg,
10516
+ paddingLeft: 8
10513
10517
  };
10514
- rightOffset += columns[i].width;
10515
10518
  }
10516
10519
  }
10517
10520
  return result;
10518
- }, [columns, moveHandleProps, isOverlay2, task.type, task.id]);
10521
+ }, [columns, backgroundColor]);
10519
10522
  return /* @__PURE__ */ jsxRuntime.jsxs(
10520
10523
  "div",
10521
10524
  {
@@ -11186,17 +11189,55 @@
11186
11189
  taskListWidth,
11187
11190
  tableWidth,
11188
11191
  onTableResizeStart,
11189
- onColumnResizeStart
11192
+ onColumnResizeStart,
11193
+ internalColumnVisibilityChange
11190
11194
  ] = useTableListResize(
11191
11195
  columnsProp,
11192
11196
  canReorderTasks,
11193
11197
  onResizeColumn,
11194
11198
  ganttRef
11195
11199
  );
11200
+ const handleColumnVisibilityChange = React.useCallback(
11201
+ (columnId, hidden2) => {
11202
+ internalColumnVisibilityChange(columnId, hidden2);
11203
+ if (onColumnVisibilityChange) {
11204
+ onColumnVisibilityChange(columnId, hidden2);
11205
+ }
11206
+ },
11207
+ [internalColumnVisibilityChange, onColumnVisibilityChange]
11208
+ );
11196
11209
  const columns = React.useMemo(
11197
11210
  () => allColumns.filter((col) => !col.hidden),
11198
11211
  [allColumns]
11199
11212
  );
11213
+ const horizontalScrollRef = React.useRef(null);
11214
+ const setHorizontalScrollRef = React.useCallback(
11215
+ (el) => {
11216
+ horizontalScrollRef.current = el;
11217
+ if (taskListHorizontalScrollRef) {
11218
+ taskListHorizontalScrollRef.current = el;
11219
+ }
11220
+ },
11221
+ [taskListHorizontalScrollRef]
11222
+ );
11223
+ React.useEffect(() => {
11224
+ const scrollEl = horizontalScrollRef.current;
11225
+ const containerEl = taskListContainerRef.current;
11226
+ if (!scrollEl || !containerEl)
11227
+ return void 0;
11228
+ const update = () => {
11229
+ const sl = scrollEl.scrollLeft;
11230
+ const maxSl = scrollEl.scrollWidth - scrollEl.clientWidth;
11231
+ containerEl.style.setProperty("--pinned-translate-left", `${sl}px`);
11232
+ containerEl.style.setProperty(
11233
+ "--pinned-translate-right",
11234
+ `${sl - maxSl}px`
11235
+ );
11236
+ };
11237
+ update();
11238
+ scrollEl.addEventListener("scroll", update, { passive: true });
11239
+ return () => scrollEl.removeEventListener("scroll", update);
11240
+ }, [taskListContainerRef, taskListWidth, tableWidth]);
11200
11241
  const renderedIndexes = useOptimizedList(
11201
11242
  taskListContainerRef,
11202
11243
  "scrollTop",
@@ -11273,7 +11314,7 @@
11273
11314
  /* @__PURE__ */ jsxRuntime.jsxs(
11274
11315
  "div",
11275
11316
  {
11276
- ref: taskListHorizontalScrollRef,
11317
+ ref: setHorizontalScrollRef,
11277
11318
  className: styles$e.taskListHorizontalScroll,
11278
11319
  style: {
11279
11320
  width: tableWidth
@@ -11288,7 +11329,7 @@
11288
11329
  allColumns,
11289
11330
  canToggleColumns: !!canToggleColumns,
11290
11331
  onColumnResizeStart,
11291
- onColumnVisibilityChange,
11332
+ onColumnVisibilityChange: handleColumnVisibilityChange,
11292
11333
  canResizeColumns
11293
11334
  }
11294
11335
  ),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gantt-task-react-v",
3
- "version": "1.7.3",
3
+ "version": "1.7.5",
4
4
  "description": "Interactive Gantt Chart for React with TypeScript.",
5
5
  "author": "aguilanbon",
6
6
  "homepage": "https://github.com/aguilanbon/gantt-task-react-v",