gantt-lib 0.136.0 → 0.136.1

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
@@ -4264,16 +4264,17 @@ var useTaskDrag = (options) => {
4264
4264
 
4265
4265
  // src/components/TaskRow/TaskRow.tsx
4266
4266
  import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
4267
+ var COMPOSITE_SEGMENT_CUT_MIN_PX = 10;
4267
4268
  var formatCompositePreviewDate = (date) => {
4268
4269
  const month = new Intl.DateTimeFormat("ru-RU", { month: "short", timeZone: "UTC" }).format(date).replace(/\.$/, "");
4269
4270
  const yearSuffix = date.getUTCFullYear() === (/* @__PURE__ */ new Date()).getFullYear() ? "" : ` ${String(date.getUTCFullYear()).slice(-2)}`;
4270
4271
  return `${date.getUTCDate()} ${month}${yearSuffix}`;
4271
4272
  };
4272
4273
  var arePropsEqual = (prevProps, nextProps) => {
4273
- return prevProps.task.id === nextProps.task.id && prevProps.task.name === nextProps.task.name && prevProps.task.startDate === nextProps.task.startDate && prevProps.task.endDate === nextProps.task.endDate && prevProps.task.baselineStartDate === nextProps.task.baselineStartDate && prevProps.task.baselineEndDate === nextProps.task.baselineEndDate && prevProps.task.type === nextProps.task.type && prevProps.task.color === nextProps.task.color && prevProps.task.progress === nextProps.task.progress && prevProps.task.accepted === nextProps.task.accepted && prevProps.monthStart.getTime() === nextProps.monthStart.getTime() && prevProps.dayWidth === nextProps.dayWidth && prevProps.rowHeight === nextProps.rowHeight && prevProps.overridePosition?.left === nextProps.overridePosition?.left && prevProps.overridePosition?.width === nextProps.overridePosition?.width && prevProps.previewPositionStore === nextProps.previewPositionStore && prevProps.allTasks === nextProps.allTasks && prevProps.disableConstraints === nextProps.disableConstraints && prevProps.deferCascadePreview === nextProps.deferCascadePreview && prevProps.task.locked === nextProps.task.locked && prevProps.task.synced === nextProps.task.synced && prevProps.task.divider === nextProps.task.divider && prevProps.highlightExpiredTasks === nextProps.highlightExpiredTasks && prevProps.isCritical === nextProps.isCritical && prevProps.showBaseline === nextProps.showBaseline && prevProps.onCompositeToggle === nextProps.onCompositeToggle && prevProps.compactDetail === nextProps.compactDetail && prevProps.compositeParentColor === nextProps.compositeParentColor && prevProps.compositeExpanded === nextProps.compositeExpanded && prevProps.isFilterMatch === nextProps.isFilterMatch && prevProps.businessDays === nextProps.businessDays && prevProps.customDays === nextProps.customDays && prevProps.isWeekend === nextProps.isWeekend && prevProps.disableTaskDrag === nextProps.disableTaskDrag && prevProps.disableDependencyEditing === nextProps.disableDependencyEditing && prevProps.isDependencyDragActive === nextProps.isDependencyDragActive && prevProps.viewMode === nextProps.viewMode && prevProps.showTaskDateLabels === nextProps.showTaskDateLabels && prevProps.showTaskNames === nextProps.showTaskNames;
4274
+ return prevProps.task.id === nextProps.task.id && prevProps.task.name === nextProps.task.name && prevProps.task.startDate === nextProps.task.startDate && prevProps.task.endDate === nextProps.task.endDate && prevProps.task.baselineStartDate === nextProps.task.baselineStartDate && prevProps.task.baselineEndDate === nextProps.task.baselineEndDate && prevProps.task.type === nextProps.task.type && prevProps.task.color === nextProps.task.color && prevProps.task.progress === nextProps.task.progress && prevProps.task.accepted === nextProps.task.accepted && prevProps.monthStart.getTime() === nextProps.monthStart.getTime() && prevProps.dayWidth === nextProps.dayWidth && prevProps.rowHeight === nextProps.rowHeight && prevProps.overridePosition?.left === nextProps.overridePosition?.left && prevProps.overridePosition?.width === nextProps.overridePosition?.width && prevProps.previewPositionStore === nextProps.previewPositionStore && prevProps.allTasks === nextProps.allTasks && prevProps.disableConstraints === nextProps.disableConstraints && prevProps.deferCascadePreview === nextProps.deferCascadePreview && prevProps.task.locked === nextProps.task.locked && prevProps.task.synced === nextProps.task.synced && prevProps.task.divider === nextProps.task.divider && prevProps.highlightExpiredTasks === nextProps.highlightExpiredTasks && prevProps.isCritical === nextProps.isCritical && prevProps.showBaseline === nextProps.showBaseline && prevProps.onCompositeToggle === nextProps.onCompositeToggle && prevProps.compactDetail === nextProps.compactDetail && prevProps.compositeParentColor === nextProps.compositeParentColor && prevProps.compositeExpanded === nextProps.compositeExpanded && prevProps.isFilterMatch === nextProps.isFilterMatch && prevProps.businessDays === nextProps.businessDays && prevProps.customDays === nextProps.customDays && prevProps.isWeekend === nextProps.isWeekend && prevProps.disableTaskDrag === nextProps.disableTaskDrag && prevProps.disableDependencyEditing === nextProps.disableDependencyEditing && prevProps.isDependencyDragActive === nextProps.isDependencyDragActive && prevProps.viewMode === nextProps.viewMode && prevProps.showTaskDateLabels === nextProps.showTaskDateLabels && prevProps.showTaskNames === nextProps.showTaskNames && prevProps.showCompositeSegments === nextProps.showCompositeSegments;
4274
4275
  };
4275
4276
  var TaskRow = React2.memo(
4276
- ({ task, monthStart, dayWidth, rowHeight, onTasksChange, onScheduleIntent, onDragStateChange, rowIndex, allTasks, enableAutoSchedule, disableConstraints, deferCascadePreview = false, overridePosition, previewPositionStore, onCascadeProgress, onCascade, divider, highlightExpiredTasks, isCritical = false, showBaseline = false, isFilterMatch = false, businessDays, customDays, isWeekend: isWeekend3, disableTaskDrag = false, disableDependencyEditing = false, onDependencyPortPointerDown, isDependencyDragActive = false, viewMode = "day", showTaskDateLabels = true, showTaskNames = true, onCompositeToggle, compactDetail = false, compositeParentColor, compositeExpanded = false }) => {
4277
+ ({ task, monthStart, dayWidth, rowHeight, onTasksChange, onScheduleIntent, onDragStateChange, rowIndex, allTasks, enableAutoSchedule, disableConstraints, deferCascadePreview = false, overridePosition, previewPositionStore, onCascadeProgress, onCascade, divider, highlightExpiredTasks, isCritical = false, showBaseline = false, isFilterMatch = false, businessDays, customDays, isWeekend: isWeekend3, disableTaskDrag = false, disableDependencyEditing = false, onDependencyPortPointerDown, isDependencyDragActive = false, viewMode = "day", showTaskDateLabels = true, showTaskNames = true, showCompositeSegments: showCompositeSegmentsProp = true, onCompositeToggle, compactDetail = false, compositeParentColor, compositeExpanded = false }) => {
4277
4278
  const defaultParentBarColor = "#782FC4";
4278
4279
  const [showCompositePreview, setShowCompositePreview] = useState2(false);
4279
4280
  const [compositePreviewPosition, setCompositePreviewPosition] = useState2(null);
@@ -4455,22 +4456,32 @@ var TaskRow = React2.memo(
4455
4456
  const compositeSegments = useMemo2(() => {
4456
4457
  if (!task.composite || width <= 0) return [];
4457
4458
  const laneEnds = [];
4458
- return compositeChildren.map((child) => {
4459
+ const segments2 = compositeChildren.map((child) => {
4459
4460
  const segment = calculateTaskBar(parseUTCDate(child.startDate), parseUTCDate(child.endDate), monthStart, dayWidth);
4460
- let lane = laneEnds.findIndex((end) => end <= segment.left);
4461
- if (lane < 0) lane = laneEnds.length;
4461
+ let lane = Math.max(0, laneEnds.length - 1);
4462
+ if (laneEnds.length > 0 && segment.left < laneEnds[lane]) {
4463
+ lane = laneEnds.length;
4464
+ }
4462
4465
  laneEnds[lane] = segment.left + segment.width;
4463
4466
  return {
4464
4467
  id: child.id,
4465
4468
  name: child.name,
4466
4469
  left: (segment.left - left) / width * 100,
4467
4470
  width: segment.width / width * 100,
4468
- lane
4471
+ lane,
4472
+ pxLeft: segment.left - left,
4473
+ cut: false
4469
4474
  };
4470
4475
  });
4476
+ const lastCutByLane = [];
4477
+ for (const segment of [...segments2].sort((a, b) => a.pxLeft - b.pxLeft)) {
4478
+ segment.cut = segment.pxLeft >= 1 && segment.pxLeft - (lastCutByLane[segment.lane] ?? 0) >= COMPOSITE_SEGMENT_CUT_MIN_PX;
4479
+ if (segment.cut) lastCutByLane[segment.lane] = segment.pxLeft;
4480
+ }
4481
+ return segments2;
4471
4482
  }, [task.composite, compositeChildren, monthStart, dayWidth, left, width, displayLeft]);
4472
4483
  const compositeLaneCount = Math.max(1, ...compositeSegments.map((segment) => segment.lane + 1));
4473
- const showCompositeSegments = task.composite && compositeSegments.length > 0 && visualWidth / compositeSegments.length >= 22;
4484
+ const shouldRenderCompositeSegments = showCompositeSegmentsProp && task.composite && compositeSegments.length > 0 && visualWidth / compositeSegments.length >= 22;
4474
4485
  const shouldRenderBaseline = showBaseline && baselineGeometry !== null;
4475
4486
  const hasPreviewPosition = isDragging || effectiveOverridePosition !== void 0;
4476
4487
  const currentStartDate = hasPreviewPosition ? pixelsToDate(displayLeft, monthStart, dayWidth) : taskStartDate;
@@ -4599,19 +4610,33 @@ var TaskRow = React2.memo(
4599
4610
  }
4600
4611
  ),
4601
4612
  !milestone && /* @__PURE__ */ jsx2("div", { className: "gantt-tr-resizeHandle gantt-tr-resizeHandleLeft" }),
4602
- showCompositeSegments && /* @__PURE__ */ jsx2("span", { className: "gantt-tr-compositeSegments", "aria-hidden": "true", children: compositeSegments.map((segment) => /* @__PURE__ */ jsx2(
4603
- "span",
4604
- {
4605
- className: "gantt-tr-compositeSegment",
4606
- style: {
4607
- left: `${segment.left}%`,
4608
- width: `${segment.width}%`,
4609
- top: `${segment.lane / compositeLaneCount * 100}%`,
4610
- height: `${100 / compositeLaneCount}%`
4611
- }
4612
- },
4613
- segment.id
4614
- )) }),
4613
+ shouldRenderCompositeSegments && /* @__PURE__ */ jsxs2("span", { className: "gantt-tr-compositeSegments", "aria-hidden": "true", children: [
4614
+ compositeSegments.map((segment) => /* @__PURE__ */ jsx2(
4615
+ "span",
4616
+ {
4617
+ className: "gantt-tr-compositeSegment",
4618
+ style: {
4619
+ left: `${segment.left}%`,
4620
+ width: `${segment.width}%`,
4621
+ top: `${segment.lane / compositeLaneCount * 100}%`,
4622
+ height: `${100 / compositeLaneCount}%`
4623
+ }
4624
+ },
4625
+ segment.id
4626
+ )),
4627
+ compositeSegments.map((segment) => segment.cut ? /* @__PURE__ */ jsx2(
4628
+ "span",
4629
+ {
4630
+ className: "gantt-tr-compositeSegmentCut",
4631
+ style: {
4632
+ left: `${segment.left}%`,
4633
+ top: `${segment.lane / compositeLaneCount * 100}%`,
4634
+ height: `${100 / compositeLaneCount}%`
4635
+ }
4636
+ },
4637
+ `${segment.id}-cut`
4638
+ ) : null)
4639
+ ] }),
4615
4640
  task.composite && /* @__PURE__ */ jsx2("span", { className: "gantt-tr-compositeHoverChevron", "aria-hidden": "true", children: /* @__PURE__ */ jsx2("svg", { className: `gantt-tr-compositeChevron${compositeExpanded ? " gantt-tr-compositeChevron-open" : ""}`, viewBox: "0 0 20 20", children: /* @__PURE__ */ jsx2("path", { d: "m7 4 6 6-6 6", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) }),
4616
4641
  showDurationInside && /* @__PURE__ */ jsx2("span", { className: "gantt-tr-taskDuration", children: isVisualParent ? getChildCountLabel(childCount) : `${durationDays} \u0434` }),
4617
4642
  progressWidth > 0 && showProgressInside && /* @__PURE__ */ jsxs2("span", { className: "gantt-tr-progressText", children: [
@@ -14343,6 +14368,7 @@ function TaskGanttChartInner(props, ref) {
14343
14368
  skeletonStartJitterDays = 0,
14344
14369
  showTaskDateLabels = true,
14345
14370
  showTaskNames = true,
14371
+ showCompositeSegments = true,
14346
14372
  timelineMarkers,
14347
14373
  additionalColumns,
14348
14374
  hiddenTaskListColumns,
@@ -14564,8 +14590,8 @@ function TaskGanttChartInner(props, ref) {
14564
14590
  const resolvedRowContentLines = isPlanFactMode ? Math.max(2, Math.floor(rowContentLines)) : Math.max(1, Math.floor(rowContentLines));
14565
14591
  const shouldFillParentRowsInTaskList = fillParentRowsInTaskList ?? isPlanFactMode;
14566
14592
  const effectiveRowHeight = useMemo13(
14567
- () => Math.max(rowHeight, 10 + resolvedRowContentLines * 18),
14568
- [resolvedRowContentLines, rowHeight]
14593
+ () => rowContentLines === 0 && !isPlanFactMode ? rowHeight : Math.max(rowHeight, 10 + resolvedRowContentLines * 18),
14594
+ [isPlanFactMode, resolvedRowContentLines, rowContentLines, rowHeight]
14569
14595
  );
14570
14596
  const normalizedTasks = useMemo13(() => {
14571
14597
  const ordered = normalizeHierarchyTasks(tasks);
@@ -15909,6 +15935,7 @@ function TaskGanttChartInner(props, ref) {
15909
15935
  viewMode,
15910
15936
  showTaskDateLabels,
15911
15937
  showTaskNames,
15938
+ showCompositeSegments,
15912
15939
  onCompositeToggle: task.composite ? (source) => handleCompositeBarToggle(task.id, source) : void 0,
15913
15940
  compositeExpanded: task.composite ? !collapsedParentIds.has(task.id) : void 0
15914
15941
  }