prosemirror-view 1.23.13 → 1.24.0-beta.3

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.
@@ -1,25 +1,29 @@
1
- import {TextSelection, NodeSelection} from "prosemirror-state"
1
+ import {TextSelection, NodeSelection, Selection} from "prosemirror-state"
2
+ import {ResolvedPos} from "prosemirror-model"
2
3
 
3
- import browser from "./browser"
4
+ import * as browser from "./browser"
4
5
  import {selectionCollapsed, isEquivalentPosition, domIndex, isOnEdge} from "./dom"
6
+ import {EditorView} from "./index"
7
+ import {NodeViewDesc} from "./viewdesc"
5
8
 
6
- export function selectionFromDOM(view, origin) {
7
- let domSel = view.root.getSelection(), doc = view.state.doc
9
+ export function selectionFromDOM(view: EditorView, origin: string | null = null) {
10
+ let domSel = view.domSelection(), doc = view.state.doc
8
11
  if (!domSel.focusNode) return null
9
12
  let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0
10
- let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset)
13
+ let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1)
11
14
  if (head < 0) return null
12
15
  let $head = doc.resolve(head), $anchor, selection
13
16
  if (selectionCollapsed(domSel)) {
14
17
  $anchor = $head
15
18
  while (nearestDesc && !nearestDesc.node) nearestDesc = nearestDesc.parent
16
- if (nearestDesc && nearestDesc.node.isAtom && NodeSelection.isSelectable(nearestDesc.node) && nearestDesc.parent
17
- && !(nearestDesc.node.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {
19
+ let nearestDescNode = (nearestDesc as NodeViewDesc).node
20
+ if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent
21
+ && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {
18
22
  let pos = nearestDesc.posBefore
19
23
  selection = new NodeSelection(head == pos ? $head : doc.resolve(pos))
20
24
  }
21
25
  } else {
22
- let anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset)
26
+ let anchor = view.docView.posFromDOM(domSel.anchorNode!, domSel.anchorOffset, 1)
23
27
  if (anchor < 0) return null
24
28
  $anchor = doc.resolve(anchor)
25
29
  }
@@ -31,12 +35,12 @@ export function selectionFromDOM(view, origin) {
31
35
  return selection
32
36
  }
33
37
 
34
- function editorOwnsSelection(view) {
38
+ function editorOwnsSelection(view: EditorView) {
35
39
  return view.editable ? view.hasFocus() :
36
40
  hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom)
37
41
  }
38
42
 
39
- export function selectionToDOM(view, force) {
43
+ export function selectionToDOM(view: EditorView, force = false) {
40
44
  let sel = view.state.selection
41
45
  syncNodeSelection(view, sel)
42
46
 
@@ -45,11 +49,12 @@ export function selectionToDOM(view, force) {
45
49
  // The delayed drag selection causes issues with Cell Selections
46
50
  // in Safari. And the drag selection delay is to workarond issues
47
51
  // which only present in Chrome.
48
- if (!force && view.mouseDown && view.mouseDown.allowDefault && browser.chrome) {
49
- let domSel = view.root.getSelection(), curSel = view.domObserver.currentSelection
50
- if (domSel.anchorNode && isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset,
51
- curSel.anchorNode, curSel.anchorOffset)) {
52
- view.mouseDown.delayedSelectionSync = true
52
+ if (!force && view.input.mouseDown && view.input.mouseDown.allowDefault && browser.chrome) {
53
+ let domSel = view.domSelection(), curSel = view.domObserver.currentSelection
54
+ if (domSel.anchorNode && curSel.anchorNode &&
55
+ isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset,
56
+ curSel.anchorNode, curSel.anchorOffset)) {
57
+ view.input.mouseDown.delayedSelectionSync = true
53
58
  view.domObserver.setCurSelection()
54
59
  return
55
60
  }
@@ -90,36 +95,37 @@ export function selectionToDOM(view, force) {
90
95
 
91
96
  const brokenSelectBetweenUneditable = browser.safari || browser.chrome && browser.chrome_version < 63
92
97
 
93
- function temporarilyEditableNear(view, pos) {
98
+ function temporarilyEditableNear(view: EditorView, pos: number) {
94
99
  let {node, offset} = view.docView.domFromPos(pos, 0)
95
100
  let after = offset < node.childNodes.length ? node.childNodes[offset] : null
96
101
  let before = offset ? node.childNodes[offset - 1] : null
97
- if (browser.safari && after && after.contentEditable == "false") return setEditable(after)
98
- if ((!after || after.contentEditable == "false") && (!before || before.contentEditable == "false")) {
99
- if (after) return setEditable(after)
100
- else if (before) return setEditable(before)
102
+ if (browser.safari && after && (after as HTMLElement).contentEditable == "false") return setEditable(after as HTMLElement)
103
+ if ((!after || (after as HTMLElement).contentEditable == "false") &&
104
+ (!before || (before as HTMLElement).contentEditable == "false")) {
105
+ if (after) return setEditable(after as HTMLElement)
106
+ else if (before) return setEditable(before as HTMLElement)
101
107
  }
102
108
  }
103
109
 
104
- function setEditable(element) {
110
+ function setEditable(element: HTMLElement) {
105
111
  element.contentEditable = "true"
106
- if (browser.safari && element.draggable) { element.draggable = false; element.wasDraggable = true }
112
+ if (browser.safari && element.draggable) { element.draggable = false; (element as any).wasDraggable = true }
107
113
  return element
108
114
  }
109
115
 
110
- function resetEditable(element) {
116
+ function resetEditable(element: HTMLElement) {
111
117
  element.contentEditable = "false"
112
- if (element.wasDraggable) { element.draggable = true; element.wasDraggable = null }
118
+ if ((element as any).wasDraggable) { element.draggable = true; (element as any).wasDraggable = null }
113
119
  }
114
120
 
115
- function removeClassOnSelectionChange(view) {
121
+ function removeClassOnSelectionChange(view: EditorView) {
116
122
  let doc = view.dom.ownerDocument
117
- doc.removeEventListener("selectionchange", view.hideSelectionGuard)
118
- let domSel = view.root.getSelection()
123
+ doc.removeEventListener("selectionchange", view.input.hideSelectionGuard!)
124
+ let domSel = view.domSelection()
119
125
  let node = domSel.anchorNode, offset = domSel.anchorOffset
120
- doc.addEventListener("selectionchange", view.hideSelectionGuard = () => {
126
+ doc.addEventListener("selectionchange", view.input.hideSelectionGuard = () => {
121
127
  if (domSel.anchorNode != node || domSel.anchorOffset != offset) {
122
- doc.removeEventListener("selectionchange", view.hideSelectionGuard)
128
+ doc.removeEventListener("selectionchange", view.input.hideSelectionGuard!)
123
129
  setTimeout(() => {
124
130
  if (!editorOwnsSelection(view) || view.state.selection.visible)
125
131
  view.dom.classList.remove("ProseMirror-hideselection")
@@ -128,10 +134,10 @@ function removeClassOnSelectionChange(view) {
128
134
  })
129
135
  }
130
136
 
131
- function selectCursorWrapper(view) {
132
- let domSel = view.root.getSelection(), range = document.createRange()
133
- let node = view.cursorWrapper.dom, img = node.nodeName == "IMG"
134
- if (img) range.setEnd(node.parentNode, domIndex(node) + 1)
137
+ function selectCursorWrapper(view: EditorView) {
138
+ let domSel = view.domSelection(), range = document.createRange()
139
+ let node = view.cursorWrapper!.dom, img = node.nodeName == "IMG"
140
+ if (img) range.setEnd(node.parentNode!, domIndex(node) + 1)
135
141
  else range.setEnd(node, 0)
136
142
  range.collapse(false)
137
143
  domSel.removeAllRanges()
@@ -142,17 +148,17 @@ function selectCursorWrapper(view) {
142
148
  // positioned wrapper, rather than the root editable node, the
143
149
  // focused element.
144
150
  if (!img && !view.state.selection.visible && browser.ie && browser.ie_version <= 11) {
145
- node.disabled = true
146
- node.disabled = false
151
+ ;(node as any).disabled = true
152
+ ;(node as any).disabled = false
147
153
  }
148
154
  }
149
155
 
150
- export function syncNodeSelection(view, sel) {
156
+ export function syncNodeSelection(view: EditorView, sel: Selection) {
151
157
  if (sel instanceof NodeSelection) {
152
158
  let desc = view.docView.descAt(sel.from)
153
159
  if (desc != view.lastSelectedViewDesc) {
154
160
  clearNodeSelection(view)
155
- if (desc) desc.selectNode()
161
+ if (desc) (desc as NodeViewDesc).selectNode()
156
162
  view.lastSelectedViewDesc = desc
157
163
  }
158
164
  } else {
@@ -161,40 +167,40 @@ export function syncNodeSelection(view, sel) {
161
167
  }
162
168
 
163
169
  // Clear all DOM statefulness of the last node selection.
164
- function clearNodeSelection(view) {
170
+ function clearNodeSelection(view: EditorView) {
165
171
  if (view.lastSelectedViewDesc) {
166
172
  if (view.lastSelectedViewDesc.parent)
167
- view.lastSelectedViewDesc.deselectNode()
168
- view.lastSelectedViewDesc = null
173
+ (view.lastSelectedViewDesc as NodeViewDesc).deselectNode()
174
+ view.lastSelectedViewDesc = undefined
169
175
  }
170
176
  }
171
177
 
172
- export function selectionBetween(view, $anchor, $head, bias) {
178
+ export function selectionBetween(view: EditorView, $anchor: ResolvedPos, $head: ResolvedPos, bias?: number) {
173
179
  return view.someProp("createSelectionBetween", f => f(view, $anchor, $head))
174
180
  || TextSelection.between($anchor, $head, bias)
175
181
  }
176
182
 
177
- export function hasFocusAndSelection(view) {
183
+ export function hasFocusAndSelection(view: EditorView) {
178
184
  if (view.editable && view.root.activeElement != view.dom) return false
179
185
  return hasSelection(view)
180
186
  }
181
187
 
182
- export function hasSelection(view) {
183
- let sel = view.root.getSelection()
188
+ export function hasSelection(view: EditorView) {
189
+ let sel = view.domSelection()
184
190
  if (!sel.anchorNode) return false
185
191
  try {
186
192
  // Firefox will raise 'permission denied' errors when accessing
187
193
  // properties of `sel.anchorNode` when it's in a generated CSS
188
194
  // element.
189
195
  return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&
190
- (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode))
196
+ (view.editable || view.dom.contains(sel.focusNode!.nodeType == 3 ? sel.focusNode!.parentNode : sel.focusNode))
191
197
  } catch(_) {
192
198
  return false
193
199
  }
194
200
  }
195
201
 
196
- export function anchorInRightPlace(view) {
202
+ export function anchorInRightPlace(view: EditorView) {
197
203
  let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0)
198
- let domSel = view.root.getSelection()
199
- return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset)
204
+ let domSel = view.domSelection()
205
+ return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode!, domSel.anchorOffset)
200
206
  }