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 +10 -0
- package/dist/index.cjs +10 -3
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +10 -4
- package/package.json +1 -1
- package/src/domchange.ts +3 -2
- package/src/index.ts +6 -1
- package/src/input.ts +8 -2
- package/src/viewdesc.ts +1 -1
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,
|
|
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 &&
|
|
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
|
|
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,
|
|
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 &&
|
|
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 &&
|
|
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
|
|
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
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 &&
|
|
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
|
|
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
|
|
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,
|
|
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 &&
|
|
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
|
|
138
|
+
declare node: Node | null
|
|
139
139
|
|
|
140
140
|
constructor(
|
|
141
141
|
public parent: ViewDesc | undefined,
|