prosemirror-view 1.38.1 → 1.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 1.39.0 (2025-04-04)
2
+
3
+ ### Bug fixes
4
+
5
+ Fix an issue where, with some types of schemas, pressing Enter on Android with a Chinese keyboard wouldn't properly detect the Enter press.
6
+
7
+ ### New features
8
+
9
+ The new `dragCopies` prop can be used to configure whether a drag event inside the editor copies or moves content.
10
+
1
11
  ## 1.38.1 (2025-03-04)
2
12
 
3
13
  ### Bug fixes
package/dist/index.cjs CHANGED
@@ -3411,6 +3411,7 @@ editHandlers.paste = function (view, _event) {
3411
3411
  if (view.composing && !android) return;
3412
3412
  var data = brokenClipboardAPI ? null : event.clipboardData;
3413
3413
  var plain = view.input.shiftKey && view.input.lastKeyCode != 45;
3414
+ console.log("paste event", !!data, view.state.selection.from, view.state.selection.to);
3414
3415
  if (data && doPaste(view, getText(data), data.getData("text/html"), plain, event)) event.preventDefault();else capturePaste(view, event);
3415
3416
  };
3416
3417
  var Dragging = _createClass(function Dragging(slice, move, node) {
@@ -3420,6 +3421,12 @@ var Dragging = _createClass(function Dragging(slice, move, node) {
3420
3421
  this.node = node;
3421
3422
  });
3422
3423
  var dragCopyModifier = mac ? "altKey" : "ctrlKey";
3424
+ function dragMoves(view, event) {
3425
+ var moves = view.someProp("dragCopies", function (test) {
3426
+ return !test(event);
3427
+ });
3428
+ return moves != null ? moves : !event[dragCopyModifier];
3429
+ }
3423
3430
  handlers.dragstart = function (view, _event) {
3424
3431
  var event = _event;
3425
3432
  var mouseDown = view.input.mouseDown;
@@ -3443,7 +3450,7 @@ handlers.dragstart = function (view, _event) {
3443
3450
  event.dataTransfer.setData(brokenClipboardAPI ? "Text" : "text/html", dom.innerHTML);
3444
3451
  event.dataTransfer.effectAllowed = "copyMove";
3445
3452
  if (!brokenClipboardAPI) event.dataTransfer.setData("text/plain", text);
3446
- view.dragging = new Dragging(slice, !event[dragCopyModifier], node);
3453
+ view.dragging = new Dragging(slice, dragMoves(view, event), node);
3447
3454
  };
3448
3455
  handlers.dragend = function (view) {
3449
3456
  var dragging = view.dragging;
@@ -3470,7 +3477,7 @@ editHandlers.drop = function (view, _event) {
3470
3477
  } else {
3471
3478
  slice = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData("text/html"), false, $mouse);
3472
3479
  }
3473
- var move = !!(dragging && !event[dragCopyModifier]);
3480
+ var move = !!(dragging && dragMoves(view, event));
3474
3481
  if (view.someProp("handleDrop", function (f) {
3475
3482
  return f(view, event, slice || prosemirrorModel.Slice.empty, move);
3476
3483
  })) {
@@ -4662,7 +4669,7 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
4662
4669
  var nextSel;
4663
4670
  if ((ios && view.input.lastIOSEnter > Date.now() - 225 && (!inlineChange || addedNodes.some(function (n) {
4664
4671
  return n.nodeName == "DIV" || n.nodeName == "P";
4665
- })) || !inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) && (nextSel = prosemirrorState.Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) && nextSel.head == $to.pos) && view.someProp("handleKeyDown", function (f) {
4672
+ })) || !inlineChange && $from.pos < parse.doc.content.size && (!$from.sameParent($to) || !$from.parent.inlineContent) && (nextSel = prosemirrorState.Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) && nextSel.head > $from.pos) && view.someProp("handleKeyDown", function (f) {
4666
4673
  return f(view, keyEvent(13, "Enter"));
4667
4674
  })) {
4668
4675
  view.input.lastIOSEnter = 0;
package/dist/index.d.cts CHANGED
@@ -699,6 +699,12 @@ interface EditorProps<P = any> {
699
699
  */
700
700
  handleScrollToSelection?: (this: P, view: EditorView) => boolean;
701
701
  /**
702
+ Determines whether an in-editor drag event should copy or move
703
+ the selection. When not given, the event's `altKey` property is
704
+ used on macOS, `ctrlKey` on other platforms.
705
+ */
706
+ dragCopies?: (event: DragEvent) => boolean;
707
+ /**
702
708
  Can be used to override the way a selection is created when
703
709
  reading a DOM selection between the given anchor and head.
704
710
  */
package/dist/index.d.ts CHANGED
@@ -699,6 +699,12 @@ interface EditorProps<P = any> {
699
699
  */
700
700
  handleScrollToSelection?: (this: P, view: EditorView) => boolean;
701
701
  /**
702
+ Determines whether an in-editor drag event should copy or move
703
+ the selection. When not given, the event's `altKey` property is
704
+ used on macOS, `ctrlKey` on other platforms.
705
+ */
706
+ dragCopies?: (event: DragEvent) => boolean;
707
+ /**
702
708
  Can be used to override the way a selection is created when
703
709
  reading a DOM selection between the given anchor and head.
704
710
  */
package/dist/index.js CHANGED
@@ -3663,6 +3663,7 @@ editHandlers.paste = (view, _event) => {
3663
3663
  return;
3664
3664
  let data = brokenClipboardAPI ? null : event.clipboardData;
3665
3665
  let plain = view.input.shiftKey && view.input.lastKeyCode != 45;
3666
+ console.log("paste event", !!data, view.state.selection.from, view.state.selection.to);
3666
3667
  if (data && doPaste(view, getText(data), data.getData("text/html"), plain, event))
3667
3668
  event.preventDefault();
3668
3669
  else
@@ -3676,6 +3677,10 @@ class Dragging {
3676
3677
  }
3677
3678
  }
3678
3679
  const dragCopyModifier = mac ? "altKey" : "ctrlKey";
3680
+ function dragMoves(view, event) {
3681
+ let moves = view.someProp("dragCopies", test => !test(event));
3682
+ return moves != null ? moves : !event[dragCopyModifier];
3683
+ }
3679
3684
  handlers.dragstart = (view, _event) => {
3680
3685
  let event = _event;
3681
3686
  let mouseDown = view.input.mouseDown;
@@ -3705,7 +3710,7 @@ handlers.dragstart = (view, _event) => {
3705
3710
  event.dataTransfer.effectAllowed = "copyMove";
3706
3711
  if (!brokenClipboardAPI)
3707
3712
  event.dataTransfer.setData("text/plain", text);
3708
- view.dragging = new Dragging(slice, !event[dragCopyModifier], node);
3713
+ view.dragging = new Dragging(slice, dragMoves(view, event), node);
3709
3714
  };
3710
3715
  handlers.dragend = view => {
3711
3716
  let dragging = view.dragging;
@@ -3732,7 +3737,7 @@ editHandlers.drop = (view, _event) => {
3732
3737
  else {
3733
3738
  slice = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData("text/html"), false, $mouse);
3734
3739
  }
3735
- let move = !!(dragging && !event[dragCopyModifier]);
3740
+ let move = !!(dragging && dragMoves(view, event));
3736
3741
  if (view.someProp("handleDrop", f => f(view, event, slice || Slice.empty, move))) {
3737
3742
  event.preventDefault();
3738
3743
  return;
@@ -5017,9 +5022,10 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
5017
5022
  // as being an iOS enter press), just dispatch an Enter key instead.
5018
5023
  if (((ios && view.input.lastIOSEnter > Date.now() - 225 &&
5019
5024
  (!inlineChange || addedNodes.some(n => n.nodeName == "DIV" || n.nodeName == "P"))) ||
5020
- (!inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) &&
5025
+ (!inlineChange && $from.pos < parse.doc.content.size &&
5026
+ (!$from.sameParent($to) || !$from.parent.inlineContent) &&
5021
5027
  (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&
5022
- nextSel.head == $to.pos)) &&
5028
+ nextSel.head > $from.pos)) &&
5023
5029
  view.someProp("handleKeyDown", f => f(view, keyEvent(13, "Enter")))) {
5024
5030
  view.input.lastIOSEnter = 0;
5025
5031
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prosemirror-view",
3
- "version": "1.38.1",
3
+ "version": "1.39.0",
4
4
  "description": "ProseMirror's view component",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
package/src/domchange.ts CHANGED
@@ -181,9 +181,10 @@ export function readDOMChange(view: EditorView, from: number, to: number, typeOv
181
181
  // as being an iOS enter press), just dispatch an Enter key instead.
182
182
  if (((browser.ios && view.input.lastIOSEnter > Date.now() - 225 &&
183
183
  (!inlineChange || addedNodes.some(n => n.nodeName == "DIV" || n.nodeName == "P"))) ||
184
- (!inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) &&
184
+ (!inlineChange && $from.pos < parse.doc.content.size &&
185
+ (!$from.sameParent($to) || !$from.parent.inlineContent) &&
185
186
  (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&
186
- nextSel.head == $to.pos)) &&
187
+ nextSel.head > $from.pos)) &&
187
188
  view.someProp("handleKeyDown", f => f(view, keyEvent(13, "Enter")))) {
188
189
  view.input.lastIOSEnter = 0
189
190
  return
package/src/index.ts CHANGED
@@ -51,7 +51,7 @@ export class EditorView {
51
51
  private prevDirectPlugins: readonly Plugin[] = []
52
52
  private pluginViews: PluginView[] = []
53
53
  /// @internal
54
- domObserver!: DOMObserver
54
+ declare domObserver: DOMObserver
55
55
  /// Holds `true` when a hack node is needed in Firefox to prevent the
56
56
  /// [space is eaten issue](https://github.com/ProseMirror/prosemirror/issues/651)
57
57
  /// @internal
@@ -673,6 +673,11 @@ export interface EditorProps<P = any> {
673
673
  /// handlers or the default behavior should be tried.
674
674
  handleScrollToSelection?: (this: P, view: EditorView) => boolean
675
675
 
676
+ /// Determines whether an in-editor drag event should copy or move
677
+ /// the selection. When not given, the event's `altKey` property is
678
+ /// used on macOS, `ctrlKey` on other platforms.
679
+ dragCopies?: (event: DragEvent) => boolean
680
+
676
681
  /// Can be used to override the way a selection is created when
677
682
  /// reading a DOM selection between the given anchor and head.
678
683
  createSelectionBetween?: (this: P, view: EditorView, anchor: ResolvedPos, head: ResolvedPos) => Selection | null
package/src/input.ts CHANGED
@@ -648,6 +648,7 @@ editHandlers.paste = (view, _event) => {
648
648
  if (view.composing && !browser.android) return
649
649
  let data = brokenClipboardAPI ? null : event.clipboardData
650
650
  let plain = view.input.shiftKey && view.input.lastKeyCode != 45
651
+ console.log("paste event", !!data, view.state.selection.from, view.state.selection.to)
651
652
  if (data && doPaste(view, getText(data), data.getData("text/html"), plain, event))
652
653
  event.preventDefault()
653
654
  else
@@ -660,6 +661,11 @@ export class Dragging {
660
661
 
661
662
  const dragCopyModifier: keyof DragEvent = browser.mac ? "altKey" : "ctrlKey"
662
663
 
664
+ function dragMoves(view: EditorView, event: DragEvent) {
665
+ let moves = view.someProp("dragCopies", test => !test(event))
666
+ return moves != null ? moves : !event[dragCopyModifier]
667
+ }
668
+
663
669
  handlers.dragstart = (view, _event) => {
664
670
  let event = _event as DragEvent
665
671
  let mouseDown = view.input.mouseDown
@@ -687,7 +693,7 @@ handlers.dragstart = (view, _event) => {
687
693
  // See https://github.com/ProseMirror/prosemirror/issues/1156
688
694
  event.dataTransfer.effectAllowed = "copyMove"
689
695
  if (!brokenClipboardAPI) event.dataTransfer.setData("text/plain", text)
690
- view.dragging = new Dragging(slice, !event[dragCopyModifier], node)
696
+ view.dragging = new Dragging(slice, dragMoves(view, event), node)
691
697
  }
692
698
 
693
699
  handlers.dragend = view => {
@@ -716,7 +722,7 @@ editHandlers.drop = (view, _event) => {
716
722
  slice = parseFromClipboard(view, getText(event.dataTransfer),
717
723
  brokenClipboardAPI ? null : event.dataTransfer.getData("text/html"), false, $mouse)
718
724
  }
719
- let move = !!(dragging && !event[dragCopyModifier])
725
+ let move = !!(dragging && dragMoves(view, event))
720
726
  if (view.someProp("handleDrop", f => f(view, event, slice || Slice.empty, move))) {
721
727
  event.preventDefault()
722
728
  return
package/src/viewdesc.ts CHANGED
@@ -135,7 +135,7 @@ const NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3
135
135
  // basic structure and shared methods.
136
136
  export class ViewDesc {
137
137
  dirty = NOT_DIRTY
138
- node!: Node | null
138
+ declare node: Node | null
139
139
 
140
140
  constructor(
141
141
  public parent: ViewDesc | undefined,