sense-react-timeline-editor 1.1.22 → 1.1.24

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.
Files changed (3) hide show
  1. package/dist/index.esm.js +200 -123
  2. package/dist/index.js +200 -123
  3. package/package.json +1 -1
package/dist/index.esm.js CHANGED
@@ -2180,6 +2180,36 @@ var resolveSmartRow = function resolveSmartRow(_ref2) {
2180
2180
  needCreateNewRow: false
2181
2181
  };
2182
2182
  };
2183
+ var hasMultiDragConflict = function hasMultiDragConflict(_ref3) {
2184
+ var editorData = _ref3.editorData,
2185
+ selectedActionIds = _ref3.selectedActionIds,
2186
+ primaryAction = _ref3.primaryAction,
2187
+ timeOffset = _ref3.timeOffset,
2188
+ rowDelta = _ref3.rowDelta;
2189
+ var selectedSet = new Set(selectedActionIds);
2190
+ return selectedActionIds.some(function (selectedId) {
2191
+ var sourceRowIndex = -1;
2192
+ var sourceAction;
2193
+ editorData.some(function (candidateRow, rowIndex) {
2194
+ var action = candidateRow.actions.find(function (item) {
2195
+ return item.id === selectedId;
2196
+ });
2197
+ if (!action) return false;
2198
+ sourceRowIndex = rowIndex;
2199
+ sourceAction = action;
2200
+ return true;
2201
+ });
2202
+ var initialAction = sourceAction || (selectedId === primaryAction.id ? primaryAction : undefined);
2203
+ if (!initialAction || sourceRowIndex < 0) return true;
2204
+ var targetRow = editorData[sourceRowIndex + rowDelta];
2205
+ if (!targetRow) return true;
2206
+ var nextStart = initialAction.start + timeOffset;
2207
+ var nextEnd = initialAction.end + timeOffset;
2208
+ return targetRow.actions.some(function (item) {
2209
+ return !selectedSet.has(item.id) && item.start < nextEnd && item.end > nextStart;
2210
+ });
2211
+ });
2212
+ };
2183
2213
  var clearRipplePreview = function clearRipplePreview(container) {
2184
2214
  if (!container) return;
2185
2215
  var previewNodes = container.querySelectorAll('[data-ripple-preview="true"]');
@@ -2190,45 +2220,45 @@ var clearRipplePreview = function clearRipplePreview(container) {
2190
2220
  node.removeAttribute('data-ripple-preview');
2191
2221
  });
2192
2222
  };
2193
- var EditActionO = function EditActionO(_ref7) {
2194
- var editorData = _ref7.editorData,
2195
- row = _ref7.row,
2196
- action = _ref7.action,
2197
- effects = _ref7.effects,
2198
- rowHeight = _ref7.rowHeight,
2199
- scale = _ref7.scale,
2200
- scaleWidth = _ref7.scaleWidth,
2201
- scaleSplitCount = _ref7.scaleSplitCount,
2202
- startLeft = _ref7.startLeft,
2203
- gridSnap = _ref7.gridSnap,
2204
- disableDrag = _ref7.disableDrag,
2205
- scaleCount = _ref7.scaleCount,
2206
- maxScaleCount = _ref7.maxScaleCount,
2207
- setScaleCount = _ref7.setScaleCount,
2208
- onActionMoveStart = _ref7.onActionMoveStart,
2209
- onActionMoving = _ref7.onActionMoving,
2210
- onActionMoveEnd = _ref7.onActionMoveEnd,
2211
- onActionResizeStart = _ref7.onActionResizeStart,
2212
- onActionResizeEnd = _ref7.onActionResizeEnd,
2213
- onActionResizing = _ref7.onActionResizing,
2214
- dragLineData = _ref7.dragLineData,
2215
- setEditorData = _ref7.setEditorData,
2216
- onClickAction = _ref7.onClickAction,
2217
- onClickActionOnly = _ref7.onClickActionOnly,
2218
- onDoubleClickAction = _ref7.onDoubleClickAction,
2219
- onContextMenuAction = _ref7.onContextMenuAction,
2220
- getActionRender = _ref7.getActionRender,
2221
- handleTime = _ref7.handleTime,
2222
- areaRef = _ref7.areaRef,
2223
- deltaScrollLeft = _ref7.deltaScrollLeft,
2224
- _ref7$allowCreateTrac = _ref7.allowCreateTrack,
2225
- allowCreateTrack = _ref7$allowCreateTrac === void 0 ? true : _ref7$allowCreateTrac,
2226
- insertPreview = _ref7.insertPreview,
2227
- setInsertPreview = _ref7.setInsertPreview,
2228
- trackPreview = _ref7.trackPreview,
2229
- setTrackPreview = _ref7.setTrackPreview,
2230
- containerRef = _ref7.containerRef,
2231
- selectedActionIds = _ref7.selectedActionIds;
2223
+ var EditActionO = function EditActionO(_ref8) {
2224
+ var editorData = _ref8.editorData,
2225
+ row = _ref8.row,
2226
+ action = _ref8.action,
2227
+ effects = _ref8.effects,
2228
+ rowHeight = _ref8.rowHeight,
2229
+ scale = _ref8.scale,
2230
+ scaleWidth = _ref8.scaleWidth,
2231
+ scaleSplitCount = _ref8.scaleSplitCount,
2232
+ startLeft = _ref8.startLeft,
2233
+ gridSnap = _ref8.gridSnap,
2234
+ disableDrag = _ref8.disableDrag,
2235
+ scaleCount = _ref8.scaleCount,
2236
+ maxScaleCount = _ref8.maxScaleCount,
2237
+ setScaleCount = _ref8.setScaleCount,
2238
+ onActionMoveStart = _ref8.onActionMoveStart,
2239
+ onActionMoving = _ref8.onActionMoving,
2240
+ onActionMoveEnd = _ref8.onActionMoveEnd,
2241
+ onActionResizeStart = _ref8.onActionResizeStart,
2242
+ onActionResizeEnd = _ref8.onActionResizeEnd,
2243
+ onActionResizing = _ref8.onActionResizing,
2244
+ dragLineData = _ref8.dragLineData,
2245
+ setEditorData = _ref8.setEditorData,
2246
+ onClickAction = _ref8.onClickAction,
2247
+ onClickActionOnly = _ref8.onClickActionOnly,
2248
+ onDoubleClickAction = _ref8.onDoubleClickAction,
2249
+ onContextMenuAction = _ref8.onContextMenuAction,
2250
+ getActionRender = _ref8.getActionRender,
2251
+ handleTime = _ref8.handleTime,
2252
+ areaRef = _ref8.areaRef,
2253
+ deltaScrollLeft = _ref8.deltaScrollLeft,
2254
+ _ref8$allowCreateTrac = _ref8.allowCreateTrack,
2255
+ allowCreateTrack = _ref8$allowCreateTrac === void 0 ? true : _ref8$allowCreateTrac,
2256
+ insertPreview = _ref8.insertPreview,
2257
+ setInsertPreview = _ref8.setInsertPreview,
2258
+ trackPreview = _ref8.trackPreview,
2259
+ setTrackPreview = _ref8.setTrackPreview,
2260
+ containerRef = _ref8.containerRef,
2261
+ selectedActionIds = _ref8.selectedActionIds;
2232
2262
  var rowRnd = useRef();
2233
2263
  var isDragWhenClick = useRef(false);
2234
2264
  var originalPosition = useRef({
@@ -2374,11 +2404,11 @@ var EditActionO = function EditActionO(_ref7) {
2374
2404
  row: row
2375
2405
  });
2376
2406
  };
2377
- var handleDrag = function handleDrag(_ref8) {
2378
- var left = _ref8.left,
2379
- width = _ref8.width,
2380
- top = _ref8.top,
2381
- args = _objectWithoutProperties(_ref8, _excluded);
2407
+ var handleDrag = function handleDrag(_ref9) {
2408
+ var left = _ref9.left,
2409
+ width = _ref9.width,
2410
+ top = _ref9.top,
2411
+ args = _objectWithoutProperties(_ref9, _excluded);
2382
2412
  isDragWhenClick.current = true;
2383
2413
  var currentRange = parserTransformToTime({
2384
2414
  left: left,
@@ -2388,59 +2418,81 @@ var EditActionO = function EditActionO(_ref7) {
2388
2418
  scale: scale,
2389
2419
  startLeft: startLeft
2390
2420
  });
2391
- var placement = resolveTargetRowPlacement({
2421
+ var isSelectionMultiDrag = ((selectedActionIds === null || selectedActionIds === void 0 ? void 0 : selectedActionIds.length) || 0) > 1 && (selectedActionIds === null || selectedActionIds === void 0 ? void 0 : selectedActionIds.includes(action.id));
2422
+ var multiDragConflict = isSelectionMultiDrag ? hasMultiDragConflict({
2392
2423
  editorData: editorData,
2393
- row: row,
2394
- top: top,
2395
- rowHeight: rowHeight,
2396
- allowCreateTrack: allowCreateTrack
2397
- });
2398
- var currentRowIndex = editorData.findIndex(function (item) {
2399
- return item.id === row.id;
2400
- });
2401
- if (placement.needCreateNewRow) {
2402
- // 鼠标已拖到所有轨道的边界外,直接显示新轨道插入线
2403
- setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview(null);
2404
- setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview({
2405
- kind: 'new-row',
2406
- insertIndex: placement.targetRowIndex,
2407
- sourceRow: row
2424
+ selectedActionIds: selectedActionIds || [],
2425
+ primaryAction: action,
2426
+ timeOffset: currentRange.start - action.start,
2427
+ rowDelta: Math.round((top || 0) / rowHeight)
2428
+ }) : false;
2429
+ if (multiDragConflict) {
2430
+ setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview({
2431
+ actionId: action.id,
2432
+ rowId: row.id,
2433
+ start: action.start,
2434
+ end: action.end,
2435
+ shiftByActionId: {}
2408
2436
  });
2409
- } else {
2410
- // smart row 找真实可用行(冲突则往下级联)
2411
- var smart = resolveSmartRow({
2437
+ setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview(null);
2438
+ } else if (isSelectionMultiDrag) {
2439
+ clearRipplePreview(areaRef.current);
2440
+ }
2441
+ if (!multiDragConflict) {
2442
+ var placement = resolveTargetRowPlacement({
2412
2443
  editorData: editorData,
2413
- initialTargetRowIndex: placement.targetRowIndex,
2414
- actionId: action.id,
2415
- start: currentRange.start,
2416
- end: currentRange.end,
2444
+ row: row,
2445
+ top: top,
2446
+ rowHeight: rowHeight,
2417
2447
  allowCreateTrack: allowCreateTrack
2418
2448
  });
2419
- if (smart.needCreateNewRow) {
2449
+ var _currentRowIndex = editorData.findIndex(function (item) {
2450
+ return item.id === row.id;
2451
+ });
2452
+ if (placement.needCreateNewRow) {
2453
+ // 鼠标已拖到所有轨道的边界外,直接显示新轨道插入线
2420
2454
  setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview(null);
2421
2455
  setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview({
2422
2456
  kind: 'new-row',
2423
- insertIndex: smart.targetRowIndex,
2457
+ insertIndex: placement.targetRowIndex,
2424
2458
  sourceRow: row
2425
2459
  });
2426
2460
  } else {
2427
- var targetRow = editorData[smart.targetRowIndex];
2428
- var isSameRow = smart.targetRowIndex === currentRowIndex;
2429
- if (targetRow) {
2430
- setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview({
2431
- actionId: action.id,
2432
- rowId: targetRow.id,
2433
- start: currentRange.start,
2434
- end: currentRange.end,
2435
- shiftByActionId: {}
2436
- });
2437
- setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview(isSameRow ? null : {
2438
- kind: 'row',
2439
- rowId: targetRow.id
2461
+ // smart row 找真实可用行(冲突则往下级联)
2462
+ var smart = resolveSmartRow({
2463
+ editorData: editorData,
2464
+ initialTargetRowIndex: placement.targetRowIndex,
2465
+ actionId: action.id,
2466
+ start: currentRange.start,
2467
+ end: currentRange.end,
2468
+ allowCreateTrack: allowCreateTrack
2469
+ });
2470
+ if (smart.needCreateNewRow) {
2471
+ setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview(null);
2472
+ setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview({
2473
+ kind: 'new-row',
2474
+ insertIndex: smart.targetRowIndex,
2475
+ sourceRow: row
2440
2476
  });
2441
2477
  } else {
2442
- setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview(null);
2443
- setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview(null);
2478
+ var targetRow = editorData[smart.targetRowIndex];
2479
+ var isSameRow = smart.targetRowIndex === _currentRowIndex;
2480
+ if (targetRow) {
2481
+ setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview({
2482
+ actionId: action.id,
2483
+ rowId: targetRow.id,
2484
+ start: currentRange.start,
2485
+ end: currentRange.end,
2486
+ shiftByActionId: {}
2487
+ });
2488
+ setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview(isSameRow ? null : {
2489
+ kind: 'row',
2490
+ rowId: targetRow.id
2491
+ });
2492
+ } else {
2493
+ setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview(null);
2494
+ setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview(null);
2495
+ }
2444
2496
  }
2445
2497
  }
2446
2498
  }
@@ -2476,14 +2528,14 @@ var EditActionO = function EditActionO(_ref7) {
2476
2528
  }
2477
2529
  handleScaleCount(left, width);
2478
2530
  };
2479
- var handleDragEndBase = useCallback(function (_ref9) {
2531
+ var handleDragEndBase = useCallback(function (_ref0) {
2480
2532
  var _areaRef$current2;
2481
- var left = _ref9.left,
2482
- width = _ref9.width,
2483
- top = _ref9.top,
2484
- height = _ref9.height,
2485
- isMultiDrag = _ref9.isMultiDrag,
2486
- fnCallback = _ref9.fn;
2533
+ var left = _ref0.left,
2534
+ width = _ref0.width,
2535
+ top = _ref0.top,
2536
+ height = _ref0.height,
2537
+ isMultiDrag = _ref0.isMultiDrag,
2538
+ fnCallback = _ref0.fn;
2487
2539
  window.dispatchEvent(new CustomEvent('timeline-action-dragging-change', {
2488
2540
  detail: false
2489
2541
  }));
@@ -2677,9 +2729,9 @@ var EditActionO = function EditActionO(_ref7) {
2677
2729
  dir: dir
2678
2730
  });
2679
2731
  };
2680
- var handleResizing = function handleResizing(dir, _ref0) {
2681
- var left = _ref0.left,
2682
- width = _ref0.width;
2732
+ var handleResizing = function handleResizing(dir, _ref1) {
2733
+ var left = _ref1.left,
2734
+ width = _ref1.width;
2683
2735
  isDragWhenClick.current = true;
2684
2736
  if (onActionResizing) {
2685
2737
  var _parserTransformToTim2 = parserTransformToTime({
@@ -2708,9 +2760,9 @@ var EditActionO = function EditActionO(_ref7) {
2708
2760
  });
2709
2761
  handleScaleCount(left, width);
2710
2762
  };
2711
- var handleResizeEnd = function handleResizeEnd(dir, _ref1) {
2712
- var left = _ref1.left,
2713
- width = _ref1.width;
2763
+ var handleResizeEnd = function handleResizeEnd(dir, _ref10) {
2764
+ var left = _ref10.left,
2765
+ width = _ref10.width;
2714
2766
  // 计算时间
2715
2767
  var _parserTransformToTim3 = parserTransformToTime({
2716
2768
  left: left,
@@ -2765,13 +2817,13 @@ var EditActionO = function EditActionO(_ref7) {
2765
2817
  });
2766
2818
  useEffect(function () {
2767
2819
  var handleActionMoveEnd = function handleActionMoveEnd(e) {
2768
- var _ref10 = e.detail || {},
2769
- left = _ref10.left,
2770
- width = _ref10.width,
2771
- top = _ref10.top,
2772
- height = _ref10.height,
2773
- id = _ref10.id,
2774
- fn = _ref10.fn;
2820
+ var _ref11 = e.detail || {},
2821
+ left = _ref11.left,
2822
+ width = _ref11.width,
2823
+ top = _ref11.top,
2824
+ height = _ref11.height,
2825
+ id = _ref11.id,
2826
+ fn = _ref11.fn;
2775
2827
  if (id === action.id) {
2776
2828
  handleDragEnd({
2777
2829
  left: left,
@@ -3155,7 +3207,7 @@ var useRowSelection = function useRowSelection(options) {
3155
3207
  var handleClickOutside = useCallback(function (target) {
3156
3208
  if (disabled) return;
3157
3209
  // 如果点击的不是选中的 action 或框选框,清除选择
3158
- if (!target.closest('.timeline-editor-selection-box') && !target.closest('.timeline-editor-action') && !target.closest('[data-draggable="true"]') && !target.closest('.voice-studio-right-config-panel') && !target.closest('.voice-studio-main-content-panel') && !target.closest('.ant-modal')) {
3210
+ if (!target.closest('.timeline-editor-selection-box') && !target.closest('.timeline-editor-action') && !target.closest('.timeline-editor-cursor') && !target.closest('.timeline-editor-cursor-area') && !target.closest('.timeline-editor-time-area') && !target.closest('[data-draggable="true"]') && !target.closest('.voice-studio-right-config-panel') && !target.closest('.voice-studio-main-content-panel') && !target.closest('.ant-modal')) {
3159
3211
  clearSelection();
3160
3212
  }
3161
3213
  }, [disabled, clearSelection]);
@@ -4151,7 +4203,7 @@ var EditAreaO = /*#__PURE__*/React.forwardRef(function (props, ref) {
4151
4203
  ref: gridRef,
4152
4204
  cellRenderer: cellRenderer,
4153
4205
  columnWidth: Math.max(scaleCount * scaleWidth + startLeft, width),
4154
- width: width,
4206
+ width: Math.max(scaleCount * scaleWidth + startLeft, width),
4155
4207
  height: height,
4156
4208
  rowHeight: function rowHeight(_ref5) {
4157
4209
  var index = _ref5.index;
@@ -4311,13 +4363,14 @@ var TimeArea = function TimeArea(_ref) {
4311
4363
  height: height
4312
4364
  },
4313
4365
  onClick: function onClick(e) {
4366
+ var _timelineEditorEl$scr;
4314
4367
  if (hideCursor) return;
4368
+ var timelineEditorEl = document.querySelector('.timeline-editor');
4315
4369
  var rect = e.currentTarget.getBoundingClientRect();
4316
4370
  var position = e.clientX - rect.x;
4317
- var left = Math.max(position, startLeft);
4318
- // const left = Math.max(position + scrollLeft, startLeft);
4371
+ var actualScrollLeft = (_timelineEditorEl$scr = timelineEditorEl === null || timelineEditorEl === void 0 ? void 0 : timelineEditorEl.scrollLeft) !== null && _timelineEditorEl$scr !== void 0 ? _timelineEditorEl$scr : scrollLeft;
4372
+ var left = Math.max(position + actualScrollLeft, startLeft);
4319
4373
  if (left > maxScaleCount * scaleWidth + startLeft) return;
4320
- // if (left > maxScaleCount * scaleWidth + startLeft - scrollLeft) return;
4321
4374
  var time = parserPixelToTime(left, {
4322
4375
  startLeft: startLeft,
4323
4376
  scale: scale,
@@ -4642,14 +4695,34 @@ var Timeline = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (p
4642
4695
  return result;
4643
4696
  }, [startLeft, scale, scaleWidth, autoReRender]);
4644
4697
  /** 设置 scrollLeft */
4698
+ var getMaxScrollLeft = useCallback(function () {
4699
+ if (!Number.isFinite(width) || width <= 0) return 0;
4700
+ return Math.max(scaleCount * scaleWidth + startLeft - width, 0);
4701
+ }, [scaleCount, scaleWidth, startLeft, width]);
4645
4702
  var handleDeltaScrollLeft = useCallback(function (delta) {
4646
4703
  // 当超过最大距离时,禁止自动滚动
4647
4704
  var data = scrollSync.current.state.scrollLeft + delta;
4648
- if (data > scaleCount * (scaleWidth - 1) + startLeft - width) return;
4705
+ var maxScrollLeft = getMaxScrollLeft();
4706
+ if (data > maxScrollLeft) return;
4649
4707
  scrollSync.current && scrollSync.current.setState({
4650
4708
  scrollLeft: Math.max(scrollSync.current.state.scrollLeft + delta, 0)
4651
4709
  });
4652
- }, [scaleCount, scaleWidth, startLeft, width]);
4710
+ }, [getMaxScrollLeft]);
4711
+ useLayoutEffect(function () {
4712
+ var _scrollSync$current$s, _scrollSync$current;
4713
+ var maxScrollLeft = getMaxScrollLeft();
4714
+ var currentScrollLeft = (_scrollSync$current$s = (_scrollSync$current = scrollSync.current) === null || _scrollSync$current === void 0 ? void 0 : _scrollSync$current.state.scrollLeft) !== null && _scrollSync$current$s !== void 0 ? _scrollSync$current$s : 0;
4715
+ var nextScrollLeft = Math.min(Math.max(currentScrollLeft, 0), maxScrollLeft);
4716
+ var timelineEl = document.querySelector('.timeline-editor');
4717
+ if (timelineEl && Math.abs(timelineEl.scrollLeft - nextScrollLeft) > 1) {
4718
+ timelineEl.scrollLeft = nextScrollLeft;
4719
+ }
4720
+ if (scrollSync.current && Math.abs(currentScrollLeft - nextScrollLeft) > 1) {
4721
+ scrollSync.current.setState({
4722
+ scrollLeft: nextScrollLeft
4723
+ });
4724
+ }
4725
+ }, [getMaxScrollLeft, scale, scaleWidth, scaleCount, width]);
4653
4726
  var handleInitDragLine = useCallback(function (data) {
4654
4727
  var _checkedProps$onActio, _checkedProps$onActio2, _dragLineControllerRe;
4655
4728
  (_checkedProps$onActio = checkedProps.onActionMoveStart) === null || _checkedProps$onActio === void 0 ? void 0 : _checkedProps$onActio.call(checkedProps, data);
@@ -4735,17 +4808,19 @@ var Timeline = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (p
4735
4808
  },
4736
4809
  pause: engineRef.current.pause.bind(engineRef.current),
4737
4810
  setScrollLeft: function setScrollLeft(val) {
4811
+ var nextScrollLeft = Math.min(Math.max(val, 0), getMaxScrollLeft());
4738
4812
  scrollSync.current && scrollSync.current.setState({
4739
- scrollLeft: Math.max(val, 0)
4813
+ scrollLeft: nextScrollLeft
4740
4814
  });
4741
4815
  },
4742
4816
  setScrollLeftFromTime: function setScrollLeftFromTime(val) {
4743
4817
  var containerEl = document.querySelector('.timeline-editor');
4744
4818
  if (!containerEl) return;
4745
4819
  var left = startLeft + scaleWidth / scale * val;
4746
- containerEl.scrollLeft = Math.max(left, 0);
4820
+ var nextScrollLeft = Math.min(Math.max(left, 0), getMaxScrollLeft());
4821
+ containerEl.scrollLeft = nextScrollLeft;
4747
4822
  scrollSync.current && scrollSync.current.setState({
4748
- scrollLeft: Math.max(left, 0)
4823
+ scrollLeft: nextScrollLeft
4749
4824
  });
4750
4825
  },
4751
4826
  setScrollTop: function setScrollTop(val) {
@@ -4756,11 +4831,13 @@ var Timeline = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (p
4756
4831
  };
4757
4832
  });
4758
4833
  var onClickTimeline = useCallback(function (e) {
4759
- var _e$target;
4834
+ var _ref2, _timelineEditorEl$scr, _scrollSync$current2, _e$target;
4760
4835
  if (!domRef.current) return;
4836
+ var timelineEditorEl = document.querySelector('.timeline-editor');
4761
4837
  var rect = domRef.current.getBoundingClientRect();
4762
4838
  var position = e.clientX - rect.x;
4763
- var left = position + scrollSync.current.state.scrollLeft;
4839
+ var scrollLeft = (_ref2 = (_timelineEditorEl$scr = timelineEditorEl === null || timelineEditorEl === void 0 ? void 0 : timelineEditorEl.scrollLeft) !== null && _timelineEditorEl$scr !== void 0 ? _timelineEditorEl$scr : (_scrollSync$current2 = scrollSync.current) === null || _scrollSync$current2 === void 0 ? void 0 : _scrollSync$current2.state.scrollLeft) !== null && _ref2 !== void 0 ? _ref2 : 0;
4840
+ var left = position + scrollLeft;
4764
4841
  var time = parserPixelToTime(left, {
4765
4842
  startLeft: startLeft,
4766
4843
  scale: scale,
@@ -4830,9 +4907,9 @@ var Timeline = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (p
4830
4907
  className: "".concat(className || '', " ").concat(theme || '', " ").concat(PREFIX, " ").concat(disableDrag ? PREFIX + '-disable' : '')
4831
4908
  }, /*#__PURE__*/React.createElement(ScrollSync, {
4832
4909
  ref: scrollSync
4833
- }, function (_ref2) {
4834
- var scrollTop = _ref2.scrollTop,
4835
- _onScroll = _ref2.onScroll;
4910
+ }, function (_ref3) {
4911
+ var scrollTop = _ref3.scrollTop,
4912
+ _onScroll = _ref3.onScroll;
4836
4913
  var scrollLeft = (containerEl === null || containerEl === void 0 ? void 0 : containerEl.scrollLeft) || 0;
4837
4914
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(TimeArea, _objectSpread2(_objectSpread2({}, checkedProps), {}, {
4838
4915
  timelineWidth: width,
@@ -4847,8 +4924,8 @@ var Timeline = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (p
4847
4924
  cursorRef: cursorRef
4848
4925
  })), areaCount === 1 ? (/*#__PURE__*/React.createElement(EditArea, _objectSpread2(_objectSpread2({}, checkedProps), {}, {
4849
4926
  timelineWidth: width,
4850
- ref: function ref(_ref3) {
4851
- return areaRef.current = _ref3 === null || _ref3 === void 0 ? void 0 : _ref3.domRef.current;
4927
+ ref: function ref(_ref4) {
4928
+ return areaRef.current = _ref4 === null || _ref4 === void 0 ? void 0 : _ref4.domRef.current;
4852
4929
  },
4853
4930
  disableDrag: disableDrag || isPlaying,
4854
4931
  editorData: editorData,
@@ -4909,8 +4986,8 @@ var Timeline = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (p
4909
4986
  }, checkedProps), {}, {
4910
4987
  className: index !== 0 ? "no-flex ".concat(key, " ").concat(index, " overflow-hidden") : "overflow-hidden ".concat(key, " ").concat(index),
4911
4988
  timelineWidth: width,
4912
- ref: function ref(_ref4) {
4913
- return areaRef.current = _ref4 === null || _ref4 === void 0 ? void 0 : _ref4.domRef.current;
4989
+ ref: function ref(_ref5) {
4990
+ return areaRef.current = _ref5 === null || _ref5 === void 0 ? void 0 : _ref5.domRef.current;
4914
4991
  },
4915
4992
  disableDrag: disableDrag || isPlaying,
4916
4993
  editorData: groupedData[key],
package/dist/index.js CHANGED
@@ -2190,6 +2190,36 @@ var resolveSmartRow = function resolveSmartRow(_ref2) {
2190
2190
  needCreateNewRow: false
2191
2191
  };
2192
2192
  };
2193
+ var hasMultiDragConflict = function hasMultiDragConflict(_ref3) {
2194
+ var editorData = _ref3.editorData,
2195
+ selectedActionIds = _ref3.selectedActionIds,
2196
+ primaryAction = _ref3.primaryAction,
2197
+ timeOffset = _ref3.timeOffset,
2198
+ rowDelta = _ref3.rowDelta;
2199
+ var selectedSet = new Set(selectedActionIds);
2200
+ return selectedActionIds.some(function (selectedId) {
2201
+ var sourceRowIndex = -1;
2202
+ var sourceAction;
2203
+ editorData.some(function (candidateRow, rowIndex) {
2204
+ var action = candidateRow.actions.find(function (item) {
2205
+ return item.id === selectedId;
2206
+ });
2207
+ if (!action) return false;
2208
+ sourceRowIndex = rowIndex;
2209
+ sourceAction = action;
2210
+ return true;
2211
+ });
2212
+ var initialAction = sourceAction || (selectedId === primaryAction.id ? primaryAction : undefined);
2213
+ if (!initialAction || sourceRowIndex < 0) return true;
2214
+ var targetRow = editorData[sourceRowIndex + rowDelta];
2215
+ if (!targetRow) return true;
2216
+ var nextStart = initialAction.start + timeOffset;
2217
+ var nextEnd = initialAction.end + timeOffset;
2218
+ return targetRow.actions.some(function (item) {
2219
+ return !selectedSet.has(item.id) && item.start < nextEnd && item.end > nextStart;
2220
+ });
2221
+ });
2222
+ };
2193
2223
  var clearRipplePreview = function clearRipplePreview(container) {
2194
2224
  if (!container) return;
2195
2225
  var previewNodes = container.querySelectorAll('[data-ripple-preview="true"]');
@@ -2200,45 +2230,45 @@ var clearRipplePreview = function clearRipplePreview(container) {
2200
2230
  node.removeAttribute('data-ripple-preview');
2201
2231
  });
2202
2232
  };
2203
- var EditActionO = function EditActionO(_ref7) {
2204
- var editorData = _ref7.editorData,
2205
- row = _ref7.row,
2206
- action = _ref7.action,
2207
- effects = _ref7.effects,
2208
- rowHeight = _ref7.rowHeight,
2209
- scale = _ref7.scale,
2210
- scaleWidth = _ref7.scaleWidth,
2211
- scaleSplitCount = _ref7.scaleSplitCount,
2212
- startLeft = _ref7.startLeft,
2213
- gridSnap = _ref7.gridSnap,
2214
- disableDrag = _ref7.disableDrag,
2215
- scaleCount = _ref7.scaleCount,
2216
- maxScaleCount = _ref7.maxScaleCount,
2217
- setScaleCount = _ref7.setScaleCount,
2218
- onActionMoveStart = _ref7.onActionMoveStart,
2219
- onActionMoving = _ref7.onActionMoving,
2220
- onActionMoveEnd = _ref7.onActionMoveEnd,
2221
- onActionResizeStart = _ref7.onActionResizeStart,
2222
- onActionResizeEnd = _ref7.onActionResizeEnd,
2223
- onActionResizing = _ref7.onActionResizing,
2224
- dragLineData = _ref7.dragLineData,
2225
- setEditorData = _ref7.setEditorData,
2226
- onClickAction = _ref7.onClickAction,
2227
- onClickActionOnly = _ref7.onClickActionOnly,
2228
- onDoubleClickAction = _ref7.onDoubleClickAction,
2229
- onContextMenuAction = _ref7.onContextMenuAction,
2230
- getActionRender = _ref7.getActionRender,
2231
- handleTime = _ref7.handleTime,
2232
- areaRef = _ref7.areaRef,
2233
- deltaScrollLeft = _ref7.deltaScrollLeft,
2234
- _ref7$allowCreateTrac = _ref7.allowCreateTrack,
2235
- allowCreateTrack = _ref7$allowCreateTrac === void 0 ? true : _ref7$allowCreateTrac,
2236
- insertPreview = _ref7.insertPreview,
2237
- setInsertPreview = _ref7.setInsertPreview,
2238
- trackPreview = _ref7.trackPreview,
2239
- setTrackPreview = _ref7.setTrackPreview,
2240
- containerRef = _ref7.containerRef,
2241
- selectedActionIds = _ref7.selectedActionIds;
2233
+ var EditActionO = function EditActionO(_ref8) {
2234
+ var editorData = _ref8.editorData,
2235
+ row = _ref8.row,
2236
+ action = _ref8.action,
2237
+ effects = _ref8.effects,
2238
+ rowHeight = _ref8.rowHeight,
2239
+ scale = _ref8.scale,
2240
+ scaleWidth = _ref8.scaleWidth,
2241
+ scaleSplitCount = _ref8.scaleSplitCount,
2242
+ startLeft = _ref8.startLeft,
2243
+ gridSnap = _ref8.gridSnap,
2244
+ disableDrag = _ref8.disableDrag,
2245
+ scaleCount = _ref8.scaleCount,
2246
+ maxScaleCount = _ref8.maxScaleCount,
2247
+ setScaleCount = _ref8.setScaleCount,
2248
+ onActionMoveStart = _ref8.onActionMoveStart,
2249
+ onActionMoving = _ref8.onActionMoving,
2250
+ onActionMoveEnd = _ref8.onActionMoveEnd,
2251
+ onActionResizeStart = _ref8.onActionResizeStart,
2252
+ onActionResizeEnd = _ref8.onActionResizeEnd,
2253
+ onActionResizing = _ref8.onActionResizing,
2254
+ dragLineData = _ref8.dragLineData,
2255
+ setEditorData = _ref8.setEditorData,
2256
+ onClickAction = _ref8.onClickAction,
2257
+ onClickActionOnly = _ref8.onClickActionOnly,
2258
+ onDoubleClickAction = _ref8.onDoubleClickAction,
2259
+ onContextMenuAction = _ref8.onContextMenuAction,
2260
+ getActionRender = _ref8.getActionRender,
2261
+ handleTime = _ref8.handleTime,
2262
+ areaRef = _ref8.areaRef,
2263
+ deltaScrollLeft = _ref8.deltaScrollLeft,
2264
+ _ref8$allowCreateTrac = _ref8.allowCreateTrack,
2265
+ allowCreateTrack = _ref8$allowCreateTrac === void 0 ? true : _ref8$allowCreateTrac,
2266
+ insertPreview = _ref8.insertPreview,
2267
+ setInsertPreview = _ref8.setInsertPreview,
2268
+ trackPreview = _ref8.trackPreview,
2269
+ setTrackPreview = _ref8.setTrackPreview,
2270
+ containerRef = _ref8.containerRef,
2271
+ selectedActionIds = _ref8.selectedActionIds;
2242
2272
  var rowRnd = React.useRef();
2243
2273
  var isDragWhenClick = React.useRef(false);
2244
2274
  var originalPosition = React.useRef({
@@ -2384,11 +2414,11 @@ var EditActionO = function EditActionO(_ref7) {
2384
2414
  row: row
2385
2415
  });
2386
2416
  };
2387
- var handleDrag = function handleDrag(_ref8) {
2388
- var left = _ref8.left,
2389
- width = _ref8.width,
2390
- top = _ref8.top,
2391
- args = _objectWithoutProperties(_ref8, _excluded);
2417
+ var handleDrag = function handleDrag(_ref9) {
2418
+ var left = _ref9.left,
2419
+ width = _ref9.width,
2420
+ top = _ref9.top,
2421
+ args = _objectWithoutProperties(_ref9, _excluded);
2392
2422
  isDragWhenClick.current = true;
2393
2423
  var currentRange = parserTransformToTime({
2394
2424
  left: left,
@@ -2398,59 +2428,81 @@ var EditActionO = function EditActionO(_ref7) {
2398
2428
  scale: scale,
2399
2429
  startLeft: startLeft
2400
2430
  });
2401
- var placement = resolveTargetRowPlacement({
2431
+ var isSelectionMultiDrag = ((selectedActionIds === null || selectedActionIds === void 0 ? void 0 : selectedActionIds.length) || 0) > 1 && (selectedActionIds === null || selectedActionIds === void 0 ? void 0 : selectedActionIds.includes(action.id));
2432
+ var multiDragConflict = isSelectionMultiDrag ? hasMultiDragConflict({
2402
2433
  editorData: editorData,
2403
- row: row,
2404
- top: top,
2405
- rowHeight: rowHeight,
2406
- allowCreateTrack: allowCreateTrack
2407
- });
2408
- var currentRowIndex = editorData.findIndex(function (item) {
2409
- return item.id === row.id;
2410
- });
2411
- if (placement.needCreateNewRow) {
2412
- // 鼠标已拖到所有轨道的边界外,直接显示新轨道插入线
2413
- setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview(null);
2414
- setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview({
2415
- kind: 'new-row',
2416
- insertIndex: placement.targetRowIndex,
2417
- sourceRow: row
2434
+ selectedActionIds: selectedActionIds || [],
2435
+ primaryAction: action,
2436
+ timeOffset: currentRange.start - action.start,
2437
+ rowDelta: Math.round((top || 0) / rowHeight)
2438
+ }) : false;
2439
+ if (multiDragConflict) {
2440
+ setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview({
2441
+ actionId: action.id,
2442
+ rowId: row.id,
2443
+ start: action.start,
2444
+ end: action.end,
2445
+ shiftByActionId: {}
2418
2446
  });
2419
- } else {
2420
- // smart row 找真实可用行(冲突则往下级联)
2421
- var smart = resolveSmartRow({
2447
+ setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview(null);
2448
+ } else if (isSelectionMultiDrag) {
2449
+ clearRipplePreview(areaRef.current);
2450
+ }
2451
+ if (!multiDragConflict) {
2452
+ var placement = resolveTargetRowPlacement({
2422
2453
  editorData: editorData,
2423
- initialTargetRowIndex: placement.targetRowIndex,
2424
- actionId: action.id,
2425
- start: currentRange.start,
2426
- end: currentRange.end,
2454
+ row: row,
2455
+ top: top,
2456
+ rowHeight: rowHeight,
2427
2457
  allowCreateTrack: allowCreateTrack
2428
2458
  });
2429
- if (smart.needCreateNewRow) {
2459
+ var _currentRowIndex = editorData.findIndex(function (item) {
2460
+ return item.id === row.id;
2461
+ });
2462
+ if (placement.needCreateNewRow) {
2463
+ // 鼠标已拖到所有轨道的边界外,直接显示新轨道插入线
2430
2464
  setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview(null);
2431
2465
  setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview({
2432
2466
  kind: 'new-row',
2433
- insertIndex: smart.targetRowIndex,
2467
+ insertIndex: placement.targetRowIndex,
2434
2468
  sourceRow: row
2435
2469
  });
2436
2470
  } else {
2437
- var targetRow = editorData[smart.targetRowIndex];
2438
- var isSameRow = smart.targetRowIndex === currentRowIndex;
2439
- if (targetRow) {
2440
- setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview({
2441
- actionId: action.id,
2442
- rowId: targetRow.id,
2443
- start: currentRange.start,
2444
- end: currentRange.end,
2445
- shiftByActionId: {}
2446
- });
2447
- setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview(isSameRow ? null : {
2448
- kind: 'row',
2449
- rowId: targetRow.id
2471
+ // smart row 找真实可用行(冲突则往下级联)
2472
+ var smart = resolveSmartRow({
2473
+ editorData: editorData,
2474
+ initialTargetRowIndex: placement.targetRowIndex,
2475
+ actionId: action.id,
2476
+ start: currentRange.start,
2477
+ end: currentRange.end,
2478
+ allowCreateTrack: allowCreateTrack
2479
+ });
2480
+ if (smart.needCreateNewRow) {
2481
+ setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview(null);
2482
+ setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview({
2483
+ kind: 'new-row',
2484
+ insertIndex: smart.targetRowIndex,
2485
+ sourceRow: row
2450
2486
  });
2451
2487
  } else {
2452
- setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview(null);
2453
- setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview(null);
2488
+ var targetRow = editorData[smart.targetRowIndex];
2489
+ var isSameRow = smart.targetRowIndex === _currentRowIndex;
2490
+ if (targetRow) {
2491
+ setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview({
2492
+ actionId: action.id,
2493
+ rowId: targetRow.id,
2494
+ start: currentRange.start,
2495
+ end: currentRange.end,
2496
+ shiftByActionId: {}
2497
+ });
2498
+ setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview(isSameRow ? null : {
2499
+ kind: 'row',
2500
+ rowId: targetRow.id
2501
+ });
2502
+ } else {
2503
+ setInsertPreview === null || setInsertPreview === void 0 ? void 0 : setInsertPreview(null);
2504
+ setTrackPreview === null || setTrackPreview === void 0 ? void 0 : setTrackPreview(null);
2505
+ }
2454
2506
  }
2455
2507
  }
2456
2508
  }
@@ -2486,14 +2538,14 @@ var EditActionO = function EditActionO(_ref7) {
2486
2538
  }
2487
2539
  handleScaleCount(left, width);
2488
2540
  };
2489
- var handleDragEndBase = React.useCallback(function (_ref9) {
2541
+ var handleDragEndBase = React.useCallback(function (_ref0) {
2490
2542
  var _areaRef$current2;
2491
- var left = _ref9.left,
2492
- width = _ref9.width,
2493
- top = _ref9.top,
2494
- height = _ref9.height,
2495
- isMultiDrag = _ref9.isMultiDrag,
2496
- fnCallback = _ref9.fn;
2543
+ var left = _ref0.left,
2544
+ width = _ref0.width,
2545
+ top = _ref0.top,
2546
+ height = _ref0.height,
2547
+ isMultiDrag = _ref0.isMultiDrag,
2548
+ fnCallback = _ref0.fn;
2497
2549
  window.dispatchEvent(new CustomEvent('timeline-action-dragging-change', {
2498
2550
  detail: false
2499
2551
  }));
@@ -2687,9 +2739,9 @@ var EditActionO = function EditActionO(_ref7) {
2687
2739
  dir: dir
2688
2740
  });
2689
2741
  };
2690
- var handleResizing = function handleResizing(dir, _ref0) {
2691
- var left = _ref0.left,
2692
- width = _ref0.width;
2742
+ var handleResizing = function handleResizing(dir, _ref1) {
2743
+ var left = _ref1.left,
2744
+ width = _ref1.width;
2693
2745
  isDragWhenClick.current = true;
2694
2746
  if (onActionResizing) {
2695
2747
  var _parserTransformToTim2 = parserTransformToTime({
@@ -2718,9 +2770,9 @@ var EditActionO = function EditActionO(_ref7) {
2718
2770
  });
2719
2771
  handleScaleCount(left, width);
2720
2772
  };
2721
- var handleResizeEnd = function handleResizeEnd(dir, _ref1) {
2722
- var left = _ref1.left,
2723
- width = _ref1.width;
2773
+ var handleResizeEnd = function handleResizeEnd(dir, _ref10) {
2774
+ var left = _ref10.left,
2775
+ width = _ref10.width;
2724
2776
  // 计算时间
2725
2777
  var _parserTransformToTim3 = parserTransformToTime({
2726
2778
  left: left,
@@ -2775,13 +2827,13 @@ var EditActionO = function EditActionO(_ref7) {
2775
2827
  });
2776
2828
  React.useEffect(function () {
2777
2829
  var handleActionMoveEnd = function handleActionMoveEnd(e) {
2778
- var _ref10 = e.detail || {},
2779
- left = _ref10.left,
2780
- width = _ref10.width,
2781
- top = _ref10.top,
2782
- height = _ref10.height,
2783
- id = _ref10.id,
2784
- fn = _ref10.fn;
2830
+ var _ref11 = e.detail || {},
2831
+ left = _ref11.left,
2832
+ width = _ref11.width,
2833
+ top = _ref11.top,
2834
+ height = _ref11.height,
2835
+ id = _ref11.id,
2836
+ fn = _ref11.fn;
2785
2837
  if (id === action.id) {
2786
2838
  handleDragEnd({
2787
2839
  left: left,
@@ -3165,7 +3217,7 @@ var useRowSelection = function useRowSelection(options) {
3165
3217
  var handleClickOutside = React.useCallback(function (target) {
3166
3218
  if (disabled) return;
3167
3219
  // 如果点击的不是选中的 action 或框选框,清除选择
3168
- if (!target.closest('.timeline-editor-selection-box') && !target.closest('.timeline-editor-action') && !target.closest('[data-draggable="true"]') && !target.closest('.voice-studio-right-config-panel') && !target.closest('.voice-studio-main-content-panel') && !target.closest('.ant-modal')) {
3220
+ if (!target.closest('.timeline-editor-selection-box') && !target.closest('.timeline-editor-action') && !target.closest('.timeline-editor-cursor') && !target.closest('.timeline-editor-cursor-area') && !target.closest('.timeline-editor-time-area') && !target.closest('[data-draggable="true"]') && !target.closest('.voice-studio-right-config-panel') && !target.closest('.voice-studio-main-content-panel') && !target.closest('.ant-modal')) {
3169
3221
  clearSelection();
3170
3222
  }
3171
3223
  }, [disabled, clearSelection]);
@@ -4161,7 +4213,7 @@ var EditAreaO = /*#__PURE__*/React__default['default'].forwardRef(function (prop
4161
4213
  ref: gridRef,
4162
4214
  cellRenderer: cellRenderer,
4163
4215
  columnWidth: Math.max(scaleCount * scaleWidth + startLeft, width),
4164
- width: width,
4216
+ width: Math.max(scaleCount * scaleWidth + startLeft, width),
4165
4217
  height: height,
4166
4218
  rowHeight: function rowHeight(_ref5) {
4167
4219
  var index = _ref5.index;
@@ -4321,13 +4373,14 @@ var TimeArea = function TimeArea(_ref) {
4321
4373
  height: height
4322
4374
  },
4323
4375
  onClick: function onClick(e) {
4376
+ var _timelineEditorEl$scr;
4324
4377
  if (hideCursor) return;
4378
+ var timelineEditorEl = document.querySelector('.timeline-editor');
4325
4379
  var rect = e.currentTarget.getBoundingClientRect();
4326
4380
  var position = e.clientX - rect.x;
4327
- var left = Math.max(position, startLeft);
4328
- // const left = Math.max(position + scrollLeft, startLeft);
4381
+ var actualScrollLeft = (_timelineEditorEl$scr = timelineEditorEl === null || timelineEditorEl === void 0 ? void 0 : timelineEditorEl.scrollLeft) !== null && _timelineEditorEl$scr !== void 0 ? _timelineEditorEl$scr : scrollLeft;
4382
+ var left = Math.max(position + actualScrollLeft, startLeft);
4329
4383
  if (left > maxScaleCount * scaleWidth + startLeft) return;
4330
- // if (left > maxScaleCount * scaleWidth + startLeft - scrollLeft) return;
4331
4384
  var time = parserPixelToTime(left, {
4332
4385
  startLeft: startLeft,
4333
4386
  scale: scale,
@@ -4652,14 +4705,34 @@ var Timeline = /*#__PURE__*/React__default['default'].memo(/*#__PURE__*/React__d
4652
4705
  return result;
4653
4706
  }, [startLeft, scale, scaleWidth, autoReRender]);
4654
4707
  /** 设置 scrollLeft */
4708
+ var getMaxScrollLeft = React.useCallback(function () {
4709
+ if (!Number.isFinite(width) || width <= 0) return 0;
4710
+ return Math.max(scaleCount * scaleWidth + startLeft - width, 0);
4711
+ }, [scaleCount, scaleWidth, startLeft, width]);
4655
4712
  var handleDeltaScrollLeft = React.useCallback(function (delta) {
4656
4713
  // 当超过最大距离时,禁止自动滚动
4657
4714
  var data = scrollSync.current.state.scrollLeft + delta;
4658
- if (data > scaleCount * (scaleWidth - 1) + startLeft - width) return;
4715
+ var maxScrollLeft = getMaxScrollLeft();
4716
+ if (data > maxScrollLeft) return;
4659
4717
  scrollSync.current && scrollSync.current.setState({
4660
4718
  scrollLeft: Math.max(scrollSync.current.state.scrollLeft + delta, 0)
4661
4719
  });
4662
- }, [scaleCount, scaleWidth, startLeft, width]);
4720
+ }, [getMaxScrollLeft]);
4721
+ React.useLayoutEffect(function () {
4722
+ var _scrollSync$current$s, _scrollSync$current;
4723
+ var maxScrollLeft = getMaxScrollLeft();
4724
+ var currentScrollLeft = (_scrollSync$current$s = (_scrollSync$current = scrollSync.current) === null || _scrollSync$current === void 0 ? void 0 : _scrollSync$current.state.scrollLeft) !== null && _scrollSync$current$s !== void 0 ? _scrollSync$current$s : 0;
4725
+ var nextScrollLeft = Math.min(Math.max(currentScrollLeft, 0), maxScrollLeft);
4726
+ var timelineEl = document.querySelector('.timeline-editor');
4727
+ if (timelineEl && Math.abs(timelineEl.scrollLeft - nextScrollLeft) > 1) {
4728
+ timelineEl.scrollLeft = nextScrollLeft;
4729
+ }
4730
+ if (scrollSync.current && Math.abs(currentScrollLeft - nextScrollLeft) > 1) {
4731
+ scrollSync.current.setState({
4732
+ scrollLeft: nextScrollLeft
4733
+ });
4734
+ }
4735
+ }, [getMaxScrollLeft, scale, scaleWidth, scaleCount, width]);
4663
4736
  var handleInitDragLine = React.useCallback(function (data) {
4664
4737
  var _checkedProps$onActio, _checkedProps$onActio2, _dragLineControllerRe;
4665
4738
  (_checkedProps$onActio = checkedProps.onActionMoveStart) === null || _checkedProps$onActio === void 0 ? void 0 : _checkedProps$onActio.call(checkedProps, data);
@@ -4745,17 +4818,19 @@ var Timeline = /*#__PURE__*/React__default['default'].memo(/*#__PURE__*/React__d
4745
4818
  },
4746
4819
  pause: engineRef.current.pause.bind(engineRef.current),
4747
4820
  setScrollLeft: function setScrollLeft(val) {
4821
+ var nextScrollLeft = Math.min(Math.max(val, 0), getMaxScrollLeft());
4748
4822
  scrollSync.current && scrollSync.current.setState({
4749
- scrollLeft: Math.max(val, 0)
4823
+ scrollLeft: nextScrollLeft
4750
4824
  });
4751
4825
  },
4752
4826
  setScrollLeftFromTime: function setScrollLeftFromTime(val) {
4753
4827
  var containerEl = document.querySelector('.timeline-editor');
4754
4828
  if (!containerEl) return;
4755
4829
  var left = startLeft + scaleWidth / scale * val;
4756
- containerEl.scrollLeft = Math.max(left, 0);
4830
+ var nextScrollLeft = Math.min(Math.max(left, 0), getMaxScrollLeft());
4831
+ containerEl.scrollLeft = nextScrollLeft;
4757
4832
  scrollSync.current && scrollSync.current.setState({
4758
- scrollLeft: Math.max(left, 0)
4833
+ scrollLeft: nextScrollLeft
4759
4834
  });
4760
4835
  },
4761
4836
  setScrollTop: function setScrollTop(val) {
@@ -4766,11 +4841,13 @@ var Timeline = /*#__PURE__*/React__default['default'].memo(/*#__PURE__*/React__d
4766
4841
  };
4767
4842
  });
4768
4843
  var onClickTimeline = React.useCallback(function (e) {
4769
- var _e$target;
4844
+ var _ref2, _timelineEditorEl$scr, _scrollSync$current2, _e$target;
4770
4845
  if (!domRef.current) return;
4846
+ var timelineEditorEl = document.querySelector('.timeline-editor');
4771
4847
  var rect = domRef.current.getBoundingClientRect();
4772
4848
  var position = e.clientX - rect.x;
4773
- var left = position + scrollSync.current.state.scrollLeft;
4849
+ var scrollLeft = (_ref2 = (_timelineEditorEl$scr = timelineEditorEl === null || timelineEditorEl === void 0 ? void 0 : timelineEditorEl.scrollLeft) !== null && _timelineEditorEl$scr !== void 0 ? _timelineEditorEl$scr : (_scrollSync$current2 = scrollSync.current) === null || _scrollSync$current2 === void 0 ? void 0 : _scrollSync$current2.state.scrollLeft) !== null && _ref2 !== void 0 ? _ref2 : 0;
4850
+ var left = position + scrollLeft;
4774
4851
  var time = parserPixelToTime(left, {
4775
4852
  startLeft: startLeft,
4776
4853
  scale: scale,
@@ -4840,9 +4917,9 @@ var Timeline = /*#__PURE__*/React__default['default'].memo(/*#__PURE__*/React__d
4840
4917
  className: "".concat(className || '', " ").concat(theme || '', " ").concat(PREFIX, " ").concat(disableDrag ? PREFIX + '-disable' : '')
4841
4918
  }, /*#__PURE__*/React__default['default'].createElement(reactVirtualized.ScrollSync, {
4842
4919
  ref: scrollSync
4843
- }, function (_ref2) {
4844
- var scrollTop = _ref2.scrollTop,
4845
- _onScroll = _ref2.onScroll;
4920
+ }, function (_ref3) {
4921
+ var scrollTop = _ref3.scrollTop,
4922
+ _onScroll = _ref3.onScroll;
4846
4923
  var scrollLeft = (containerEl === null || containerEl === void 0 ? void 0 : containerEl.scrollLeft) || 0;
4847
4924
  return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(TimeArea, _objectSpread2(_objectSpread2({}, checkedProps), {}, {
4848
4925
  timelineWidth: width,
@@ -4857,8 +4934,8 @@ var Timeline = /*#__PURE__*/React__default['default'].memo(/*#__PURE__*/React__d
4857
4934
  cursorRef: cursorRef
4858
4935
  })), areaCount === 1 ? (/*#__PURE__*/React__default['default'].createElement(EditArea, _objectSpread2(_objectSpread2({}, checkedProps), {}, {
4859
4936
  timelineWidth: width,
4860
- ref: function ref(_ref3) {
4861
- return areaRef.current = _ref3 === null || _ref3 === void 0 ? void 0 : _ref3.domRef.current;
4937
+ ref: function ref(_ref4) {
4938
+ return areaRef.current = _ref4 === null || _ref4 === void 0 ? void 0 : _ref4.domRef.current;
4862
4939
  },
4863
4940
  disableDrag: disableDrag || isPlaying,
4864
4941
  editorData: editorData,
@@ -4919,8 +4996,8 @@ var Timeline = /*#__PURE__*/React__default['default'].memo(/*#__PURE__*/React__d
4919
4996
  }, checkedProps), {}, {
4920
4997
  className: index !== 0 ? "no-flex ".concat(key, " ").concat(index, " overflow-hidden") : "overflow-hidden ".concat(key, " ").concat(index),
4921
4998
  timelineWidth: width,
4922
- ref: function ref(_ref4) {
4923
- return areaRef.current = _ref4 === null || _ref4 === void 0 ? void 0 : _ref4.domRef.current;
4999
+ ref: function ref(_ref5) {
5000
+ return areaRef.current = _ref5 === null || _ref5 === void 0 ? void 0 : _ref5.domRef.current;
4924
5001
  },
4925
5002
  disableDrag: disableDrag || isPlaying,
4926
5003
  editorData: groupedData[key],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sense-react-timeline-editor",
3
- "version": "1.1.22",
3
+ "version": "1.1.24",
4
4
  "author": "xzdarcy",
5
5
  "license": "MIT",
6
6
  "keywords": [