sense-react-timeline-editor 1.1.21 → 1.1.23

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 +189 -112
  2. package/dist/index.js +189 -112
  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;
@@ -4642,14 +4694,34 @@ var Timeline = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (p
4642
4694
  return result;
4643
4695
  }, [startLeft, scale, scaleWidth, autoReRender]);
4644
4696
  /** 设置 scrollLeft */
4697
+ var getMaxScrollLeft = useCallback(function () {
4698
+ if (!Number.isFinite(width) || width <= 0) return 0;
4699
+ return Math.max(scaleCount * scaleWidth + startLeft - width, 0);
4700
+ }, [scaleCount, scaleWidth, startLeft, width]);
4645
4701
  var handleDeltaScrollLeft = useCallback(function (delta) {
4646
4702
  // 当超过最大距离时,禁止自动滚动
4647
4703
  var data = scrollSync.current.state.scrollLeft + delta;
4648
- if (data > scaleCount * (scaleWidth - 1) + startLeft - width) return;
4704
+ var maxScrollLeft = getMaxScrollLeft();
4705
+ if (data > maxScrollLeft) return;
4649
4706
  scrollSync.current && scrollSync.current.setState({
4650
4707
  scrollLeft: Math.max(scrollSync.current.state.scrollLeft + delta, 0)
4651
4708
  });
4652
- }, [scaleCount, scaleWidth, startLeft, width]);
4709
+ }, [getMaxScrollLeft]);
4710
+ useLayoutEffect(function () {
4711
+ var _scrollSync$current$s, _scrollSync$current;
4712
+ var maxScrollLeft = getMaxScrollLeft();
4713
+ 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;
4714
+ var nextScrollLeft = Math.min(Math.max(currentScrollLeft, 0), maxScrollLeft);
4715
+ var timelineEl = document.querySelector('.timeline-editor');
4716
+ if (timelineEl && Math.abs(timelineEl.scrollLeft - nextScrollLeft) > 1) {
4717
+ timelineEl.scrollLeft = nextScrollLeft;
4718
+ }
4719
+ if (scrollSync.current && Math.abs(currentScrollLeft - nextScrollLeft) > 1) {
4720
+ scrollSync.current.setState({
4721
+ scrollLeft: nextScrollLeft
4722
+ });
4723
+ }
4724
+ }, [getMaxScrollLeft, scale, scaleWidth, scaleCount, width]);
4653
4725
  var handleInitDragLine = useCallback(function (data) {
4654
4726
  var _checkedProps$onActio, _checkedProps$onActio2, _dragLineControllerRe;
4655
4727
  (_checkedProps$onActio = checkedProps.onActionMoveStart) === null || _checkedProps$onActio === void 0 ? void 0 : _checkedProps$onActio.call(checkedProps, data);
@@ -4694,6 +4766,8 @@ var Timeline = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (p
4694
4766
  useEffect(function () {
4695
4767
  var handleClickOutside = function handleClickOutside(e) {
4696
4768
  var target = e.target;
4769
+ var actionEl = target.closest('.timeline-editor-time-area');
4770
+ if (actionEl) return;
4697
4771
  engineRef.current.trigger('mousedown', {
4698
4772
  target: target,
4699
4773
  evt: e
@@ -4733,17 +4807,19 @@ var Timeline = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (p
4733
4807
  },
4734
4808
  pause: engineRef.current.pause.bind(engineRef.current),
4735
4809
  setScrollLeft: function setScrollLeft(val) {
4810
+ var nextScrollLeft = Math.min(Math.max(val, 0), getMaxScrollLeft());
4736
4811
  scrollSync.current && scrollSync.current.setState({
4737
- scrollLeft: Math.max(val, 0)
4812
+ scrollLeft: nextScrollLeft
4738
4813
  });
4739
4814
  },
4740
4815
  setScrollLeftFromTime: function setScrollLeftFromTime(val) {
4741
4816
  var containerEl = document.querySelector('.timeline-editor');
4742
4817
  if (!containerEl) return;
4743
4818
  var left = startLeft + scaleWidth / scale * val;
4744
- containerEl.scrollLeft = Math.max(left, 0);
4819
+ var nextScrollLeft = Math.min(Math.max(left, 0), getMaxScrollLeft());
4820
+ containerEl.scrollLeft = nextScrollLeft;
4745
4821
  scrollSync.current && scrollSync.current.setState({
4746
- scrollLeft: Math.max(left, 0)
4822
+ scrollLeft: nextScrollLeft
4747
4823
  });
4748
4824
  },
4749
4825
  setScrollTop: function setScrollTop(val) {
@@ -4875,7 +4951,8 @@ var Timeline = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (p
4875
4951
  id: "time-editor-container",
4876
4952
  ref: containerRef,
4877
4953
  style: {
4878
- height: '100%'
4954
+ height: '100%',
4955
+ background: '#fff'
4879
4956
  },
4880
4957
  onClick: onClickTimeline
4881
4958
  }, Object.keys(groupedData).map(function (key, index) {
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;
@@ -4652,14 +4704,34 @@ var Timeline = /*#__PURE__*/React__default['default'].memo(/*#__PURE__*/React__d
4652
4704
  return result;
4653
4705
  }, [startLeft, scale, scaleWidth, autoReRender]);
4654
4706
  /** 设置 scrollLeft */
4707
+ var getMaxScrollLeft = React.useCallback(function () {
4708
+ if (!Number.isFinite(width) || width <= 0) return 0;
4709
+ return Math.max(scaleCount * scaleWidth + startLeft - width, 0);
4710
+ }, [scaleCount, scaleWidth, startLeft, width]);
4655
4711
  var handleDeltaScrollLeft = React.useCallback(function (delta) {
4656
4712
  // 当超过最大距离时,禁止自动滚动
4657
4713
  var data = scrollSync.current.state.scrollLeft + delta;
4658
- if (data > scaleCount * (scaleWidth - 1) + startLeft - width) return;
4714
+ var maxScrollLeft = getMaxScrollLeft();
4715
+ if (data > maxScrollLeft) return;
4659
4716
  scrollSync.current && scrollSync.current.setState({
4660
4717
  scrollLeft: Math.max(scrollSync.current.state.scrollLeft + delta, 0)
4661
4718
  });
4662
- }, [scaleCount, scaleWidth, startLeft, width]);
4719
+ }, [getMaxScrollLeft]);
4720
+ React.useLayoutEffect(function () {
4721
+ var _scrollSync$current$s, _scrollSync$current;
4722
+ var maxScrollLeft = getMaxScrollLeft();
4723
+ 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;
4724
+ var nextScrollLeft = Math.min(Math.max(currentScrollLeft, 0), maxScrollLeft);
4725
+ var timelineEl = document.querySelector('.timeline-editor');
4726
+ if (timelineEl && Math.abs(timelineEl.scrollLeft - nextScrollLeft) > 1) {
4727
+ timelineEl.scrollLeft = nextScrollLeft;
4728
+ }
4729
+ if (scrollSync.current && Math.abs(currentScrollLeft - nextScrollLeft) > 1) {
4730
+ scrollSync.current.setState({
4731
+ scrollLeft: nextScrollLeft
4732
+ });
4733
+ }
4734
+ }, [getMaxScrollLeft, scale, scaleWidth, scaleCount, width]);
4663
4735
  var handleInitDragLine = React.useCallback(function (data) {
4664
4736
  var _checkedProps$onActio, _checkedProps$onActio2, _dragLineControllerRe;
4665
4737
  (_checkedProps$onActio = checkedProps.onActionMoveStart) === null || _checkedProps$onActio === void 0 ? void 0 : _checkedProps$onActio.call(checkedProps, data);
@@ -4704,6 +4776,8 @@ var Timeline = /*#__PURE__*/React__default['default'].memo(/*#__PURE__*/React__d
4704
4776
  React.useEffect(function () {
4705
4777
  var handleClickOutside = function handleClickOutside(e) {
4706
4778
  var target = e.target;
4779
+ var actionEl = target.closest('.timeline-editor-time-area');
4780
+ if (actionEl) return;
4707
4781
  engineRef.current.trigger('mousedown', {
4708
4782
  target: target,
4709
4783
  evt: e
@@ -4743,17 +4817,19 @@ var Timeline = /*#__PURE__*/React__default['default'].memo(/*#__PURE__*/React__d
4743
4817
  },
4744
4818
  pause: engineRef.current.pause.bind(engineRef.current),
4745
4819
  setScrollLeft: function setScrollLeft(val) {
4820
+ var nextScrollLeft = Math.min(Math.max(val, 0), getMaxScrollLeft());
4746
4821
  scrollSync.current && scrollSync.current.setState({
4747
- scrollLeft: Math.max(val, 0)
4822
+ scrollLeft: nextScrollLeft
4748
4823
  });
4749
4824
  },
4750
4825
  setScrollLeftFromTime: function setScrollLeftFromTime(val) {
4751
4826
  var containerEl = document.querySelector('.timeline-editor');
4752
4827
  if (!containerEl) return;
4753
4828
  var left = startLeft + scaleWidth / scale * val;
4754
- containerEl.scrollLeft = Math.max(left, 0);
4829
+ var nextScrollLeft = Math.min(Math.max(left, 0), getMaxScrollLeft());
4830
+ containerEl.scrollLeft = nextScrollLeft;
4755
4831
  scrollSync.current && scrollSync.current.setState({
4756
- scrollLeft: Math.max(left, 0)
4832
+ scrollLeft: nextScrollLeft
4757
4833
  });
4758
4834
  },
4759
4835
  setScrollTop: function setScrollTop(val) {
@@ -4885,7 +4961,8 @@ var Timeline = /*#__PURE__*/React__default['default'].memo(/*#__PURE__*/React__d
4885
4961
  id: "time-editor-container",
4886
4962
  ref: containerRef,
4887
4963
  style: {
4888
- height: '100%'
4964
+ height: '100%',
4965
+ background: '#fff'
4889
4966
  },
4890
4967
  onClick: onClickTimeline
4891
4968
  }, Object.keys(groupedData).map(function (key, index) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sense-react-timeline-editor",
3
- "version": "1.1.21",
3
+ "version": "1.1.23",
4
4
  "author": "xzdarcy",
5
5
  "license": "MIT",
6
6
  "keywords": [