roosterjs-content-model-core 9.46.0 → 9.47.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/lib/corePlugin/cache/textMutationObserver.js +2 -1
- package/lib/corePlugin/cache/textMutationObserver.js.map +1 -1
- package/lib/corePlugin/selection/SelectionPlugin.js +29 -4
- package/lib/corePlugin/selection/SelectionPlugin.js.map +1 -1
- package/lib-amd/corePlugin/cache/textMutationObserver.js +2 -1
- package/lib-amd/corePlugin/cache/textMutationObserver.js.map +1 -1
- package/lib-amd/corePlugin/selection/SelectionPlugin.js +29 -4
- package/lib-amd/corePlugin/selection/SelectionPlugin.js.map +1 -1
- package/lib-mjs/corePlugin/cache/textMutationObserver.js +2 -1
- package/lib-mjs/corePlugin/cache/textMutationObserver.js.map +1 -1
- package/lib-mjs/corePlugin/selection/SelectionPlugin.js +30 -5
- package/lib-mjs/corePlugin/selection/SelectionPlugin.js.map +1 -1
- package/package.json +3 -3
|
@@ -24,7 +24,8 @@ var TextMutationObserverImpl = /** @class */ (function () {
|
|
|
24
24
|
continue;
|
|
25
25
|
}
|
|
26
26
|
else if (!includedNodes.has(target)) {
|
|
27
|
-
if (
|
|
27
|
+
if (!_this.domHelper.isNodeInEditor(target) ||
|
|
28
|
+
(0, roosterjs_content_model_dom_1.findClosestEntityWrapper)(target, _this.domHelper) ||
|
|
28
29
|
(0, roosterjs_content_model_dom_1.findClosestBlockEntityContainer)(target, _this.domHelper)) {
|
|
29
30
|
ignoredNodes.add(target);
|
|
30
31
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textMutationObserver.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/textMutationObserver.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"textMutationObserver.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/textMutationObserver.ts"],"names":[],"mappings":"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","sourcesContent":["import { createDOMHelper } from '../../editor/core/DOMHelperImpl';\nimport {\n findClosestBlockEntityContainer,\n findClosestEntityWrapper,\n isNodeOfType,\n} from 'roosterjs-content-model-dom';\nimport type { DOMHelper, TextMutationObserver } from 'roosterjs-content-model-types';\nimport type { Mutation } from './MutationType';\n\nclass TextMutationObserverImpl implements TextMutationObserver {\n private observer: MutationObserver;\n private domHelper: DOMHelper;\n\n constructor(\n private contentDiv: HTMLDivElement,\n private onMutation: (mutation: Mutation) => void\n ) {\n this.observer = new MutationObserver(this.onMutationInternal);\n this.domHelper = createDOMHelper(contentDiv);\n }\n\n startObserving() {\n this.observer.observe(this.contentDiv, {\n subtree: true,\n childList: true,\n attributes: true,\n characterData: true,\n });\n }\n\n stopObserving() {\n this.observer.disconnect();\n }\n\n flushMutations(ignoreMutations?: boolean) {\n const mutations = this.observer.takeRecords();\n\n if (!ignoreMutations) {\n this.onMutationInternal(mutations);\n }\n }\n\n private onMutationInternal = (mutations: MutationRecord[]) => {\n let canHandle = true;\n let firstTarget: Node | null = null;\n let lastTextChangeNode: Node | null = null;\n let addedNodes: Node[] = [];\n let removedNodes: Node[] = [];\n let reconcileText = false;\n\n const ignoredNodes = new Set<Node>();\n const includedNodes = new Set<Node>();\n\n for (let i = 0; i < mutations.length && canHandle; i++) {\n const mutation = mutations[i];\n const target = mutation.target;\n\n if (ignoredNodes.has(target)) {\n continue;\n } else if (!includedNodes.has(target)) {\n if (\n !this.domHelper.isNodeInEditor(target) ||\n findClosestEntityWrapper(target, this.domHelper) ||\n findClosestBlockEntityContainer(target, this.domHelper)\n ) {\n ignoredNodes.add(target);\n\n continue;\n } else {\n includedNodes.add(target);\n }\n }\n\n switch (mutation.type) {\n case 'attributes':\n if (this.domHelper.isNodeInEditor(target, true /*excludingSelf*/)) {\n if (\n mutation.attributeName == 'id' &&\n isNodeOfType(target, 'ELEMENT_NODE')\n ) {\n this.onMutation({ type: 'elementId', element: target });\n } else {\n // We cannot handle attributes changes on editor content for now\n canHandle = false;\n }\n }\n break;\n\n case 'characterData':\n if (lastTextChangeNode && lastTextChangeNode != mutation.target) {\n // Multiple text nodes got changed, we don't know how to handle it\n canHandle = false;\n } else {\n lastTextChangeNode = mutation.target;\n reconcileText = true;\n }\n break;\n\n case 'childList':\n if (!firstTarget) {\n firstTarget = mutation.target;\n } else if (firstTarget != mutation.target) {\n canHandle = false;\n }\n\n if (canHandle) {\n addedNodes = addedNodes.concat(Array.from(mutation.addedNodes));\n removedNodes = removedNodes.concat(Array.from(mutation.removedNodes));\n }\n\n break;\n }\n }\n\n if (canHandle) {\n if (addedNodes.length > 0 || removedNodes.length > 0) {\n this.onMutation({\n type: 'childList',\n addedNodes,\n removedNodes,\n });\n }\n\n if (reconcileText) {\n this.onMutation({ type: 'text' });\n }\n } else {\n this.onMutation({ type: 'unknown' });\n }\n };\n}\n\n/**\n * @internal\n */\nexport function createTextMutationObserver(\n contentDiv: HTMLDivElement,\n onMutation: (mutation: Mutation) => void\n): TextMutationObserver {\n return new TextMutationObserverImpl(contentDiv, onMutation);\n}\n"]}
|
|
@@ -343,7 +343,9 @@ var SelectionPlugin = /** @class */ (function () {
|
|
|
343
343
|
rawEvent.preventDefault();
|
|
344
344
|
}
|
|
345
345
|
else {
|
|
346
|
-
win === null || win === void 0 ? void 0 : win.requestAnimationFrame(function () {
|
|
346
|
+
win === null || win === void 0 ? void 0 : win.requestAnimationFrame(function () {
|
|
347
|
+
return _this.handleSelectionInTable(key, selection.range);
|
|
348
|
+
});
|
|
347
349
|
}
|
|
348
350
|
}
|
|
349
351
|
}
|
|
@@ -392,7 +394,7 @@ var SelectionPlugin = /** @class */ (function () {
|
|
|
392
394
|
SelectionPlugin.prototype.getTabKey = function (rawEvent) {
|
|
393
395
|
return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';
|
|
394
396
|
};
|
|
395
|
-
SelectionPlugin.prototype.handleSelectionInTable = function (key) {
|
|
397
|
+
SelectionPlugin.prototype.handleSelectionInTable = function (key, rangeBeforeChange) {
|
|
396
398
|
var _a, _b, _c, _d, _e, _f;
|
|
397
399
|
if (!this.editor || !this.state.tableSelection) {
|
|
398
400
|
return;
|
|
@@ -426,7 +428,15 @@ var SelectionPlugin = /** @class */ (function () {
|
|
|
426
428
|
}
|
|
427
429
|
}
|
|
428
430
|
if (collapsed && td) {
|
|
429
|
-
|
|
431
|
+
var textOffset = (key == 'ArrowUp' || key == 'ArrowDown') && rangeBeforeChange
|
|
432
|
+
? this.getTextOffset(this.editor, rangeBeforeChange, td, key == 'ArrowUp')
|
|
433
|
+
: null;
|
|
434
|
+
if (textOffset) {
|
|
435
|
+
this.setRangeSelectionInTable(textOffset.node, textOffset.offset, this.editor, false /* selectAll */);
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
this.setRangeSelectionInTable(td, 0, this.editor, false /* selectAll */);
|
|
439
|
+
}
|
|
430
440
|
}
|
|
431
441
|
else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {
|
|
432
442
|
this.selectBeforeOrAfterElement(this.editor, table, change == 1 /* after */, change != 1 /* setSelectionInNextSiblingElement */);
|
|
@@ -477,8 +487,23 @@ var SelectionPlugin = /** @class */ (function () {
|
|
|
477
487
|
}
|
|
478
488
|
}
|
|
479
489
|
};
|
|
490
|
+
SelectionPlugin.prototype.getTextOffset = function (editor, range, td, isKeyUp) {
|
|
491
|
+
var doc = editor.getDocument();
|
|
492
|
+
var cursorRect = range
|
|
493
|
+
? (0, roosterjs_content_model_dom_1.getDOMInsertPointRect)(doc, {
|
|
494
|
+
node: range.startContainer,
|
|
495
|
+
offset: range.startOffset,
|
|
496
|
+
})
|
|
497
|
+
: undefined;
|
|
498
|
+
var rect = td === null || td === void 0 ? void 0 : td.getBoundingClientRect();
|
|
499
|
+
var textOffset = cursorRect && rect
|
|
500
|
+
? (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(doc, editor.getDOMHelper(), cursorRect.left, isKeyUp ? rect.top - 1 : rect.top + 1)
|
|
501
|
+
: null;
|
|
502
|
+
return textOffset;
|
|
503
|
+
};
|
|
480
504
|
SelectionPlugin.prototype.setRangeSelectionInTable = function (cell, nodeOffset, editor, selectAll) {
|
|
481
|
-
var
|
|
505
|
+
var doc = editor.getDocument();
|
|
506
|
+
var range = doc.createRange();
|
|
482
507
|
if (selectAll && cell.firstChild && cell.lastChild) {
|
|
483
508
|
var cellStart = cell.firstChild;
|
|
484
509
|
var cellEnd = cell.lastChild;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/selection/SelectionPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { findCoordinate } from './findCoordinate';\nimport { findTableCellElement } from '../../coreApi/setDOMSelection/findTableCellElement';\nimport { isSingleImageInSelection } from './isSingleImageInSelection';\nimport { normalizePos } from './normalizePos';\nimport {\n isCharacterValue,\n isElementOfType,\n isModifierKey,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n PluginEvent,\n PluginWithState,\n SelectionPluginState,\n EditorOptions,\n DOMHelper,\n ParsedTable,\n TableSelectionInfo,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst MouseLeftButton = 0;\nconst MouseRightButton = 2;\nconst Up = 'ArrowUp';\nconst Down = 'ArrowDown';\nconst Left = 'ArrowLeft';\nconst Right = 'ArrowRight';\nconst Tab = 'Tab';\n\n/**\n * @internal\n */\nexport const DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n/**\n * @internal\n */\nexport const DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = '#C6C6C6';\n\nclass SelectionPlugin implements PluginWithState<SelectionPluginState> {\n private editor: IEditor | null = null;\n private state: SelectionPluginState;\n private disposer: (() => void) | null = null;\n private logicalRootDisposer: (() => void) | null = null;\n private isSafari = false;\n private isMac = false;\n private scrollTopCache: number = 0;\n\n constructor(options: EditorOptions) {\n this.state = {\n selection: null,\n tableSelection: null,\n imageSelectionBorderColor:\n options.imageSelectionBorderColor ?? DEFAULT_SELECTION_BORDER_COLOR,\n imageSelectionBorderColorDark: options.imageSelectionBorderColor\n ? undefined\n : DEFAULT_SELECTION_BORDER_COLOR,\n tableCellSelectionBackgroundColor:\n options.tableCellSelectionBackgroundColor ??\n DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n tableCellSelectionBackgroundColorDark: options.tableCellSelectionBackgroundColor\n ? undefined\n : DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n };\n }\n\n getName() {\n return 'Selection';\n }\n\n initialize(editor: IEditor) {\n this.editor = editor;\n\n if (!this.state.imageSelectionBorderColorDark && this.state.imageSelectionBorderColor) {\n this.state.imageSelectionBorderColorDark = editor\n .getColorManager()\n .getDarkColor(this.state.imageSelectionBorderColor, undefined, 'border');\n }\n\n if (\n !this.state.tableCellSelectionBackgroundColorDark &&\n this.state.tableCellSelectionBackgroundColor\n ) {\n this.state.tableCellSelectionBackgroundColorDark = editor\n .getColorManager()\n .getDarkColor(\n this.state.tableCellSelectionBackgroundColor,\n undefined,\n 'background'\n );\n }\n\n const env = this.editor.getEnvironment();\n const document = this.editor.getDocument();\n\n this.isSafari = !!env.isSafari;\n this.isMac = !!env.isMac;\n document.addEventListener('selectionchange', this.onSelectionChange);\n if (this.isSafari) {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n }\n\n dispose() {\n this.editor?.getDocument().removeEventListener('selectionchange', this.onSelectionChange);\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n }\n\n this.logicalRootDisposer?.();\n this.logicalRootDisposer = null;\n\n this.detachMouseEvent();\n this.editor = null;\n }\n\n getState(): SelectionPluginState {\n return this.state;\n }\n\n onPluginEvent(event: PluginEvent) {\n if (!this.editor) {\n return;\n }\n\n switch (event.eventType) {\n case 'mouseDown':\n this.onMouseDown(this.editor, event.rawEvent);\n break;\n\n case 'mouseUp':\n this.onMouseUp();\n break;\n\n case 'keyDown':\n this.onKeyDown(this.editor, event.rawEvent);\n break;\n\n case 'contentChanged':\n this.state.tableSelection = null;\n break;\n\n case 'scroll':\n if (!this.editor.hasFocus()) {\n this.scrollTopCache = event.scrollContainer.scrollTop;\n }\n break;\n\n case 'logicalRootChanged':\n this.logicalRootDisposer?.();\n if (this.isSafari) {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n break;\n }\n }\n\n private onMouseDown(editor: IEditor, rawEvent: MouseEvent) {\n const selection = editor.getDOMSelection();\n let image: HTMLImageElement | null;\n\n // Image selection\n if (\n selection?.type == 'image' &&\n (rawEvent.button == MouseLeftButton ||\n (rawEvent.button == MouseRightButton &&\n !this.getClickingImage(rawEvent) &&\n !this.getContainedTargetImage(rawEvent, selection)))\n ) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n if (\n (image =\n this.getClickingImage(rawEvent) ??\n this.getContainedTargetImage(rawEvent, selection)) &&\n image.isContentEditable\n ) {\n this.setDOMSelection(\n {\n type: 'image',\n image: image,\n },\n null\n );\n return;\n }\n\n // Table selection\n if (selection?.type == 'table' && rawEvent.button == MouseLeftButton) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n let tableSelection: TableSelectionInfo | null;\n const target = rawEvent.target as Node;\n\n if (\n target &&\n rawEvent.button == MouseLeftButton &&\n (tableSelection = this.parseTableSelection(target, target, editor.getDOMHelper()))\n ) {\n this.state.tableSelection = tableSelection;\n\n if (rawEvent.detail >= 3) {\n const lastCo = findCoordinate(\n tableSelection.parsedTable,\n rawEvent.target as Node,\n editor.getDOMHelper()\n );\n\n if (lastCo) {\n // Triple click, select the current cell\n tableSelection.lastCo = lastCo;\n this.updateTableSelection(lastCo);\n rawEvent.preventDefault();\n }\n }\n\n this.state.mouseDisposer?.();\n this.state.mouseDisposer = editor.attachDomEvent({\n mousemove: {\n beforeDispatch: this.onMouseMove,\n },\n });\n }\n }\n\n private onMouseMove = (event: Event) => {\n if (this.editor && this.state.tableSelection) {\n const hasTableSelection = !!this.state.tableSelection.lastCo;\n const currentNode = event.target as Node;\n const domHelper = this.editor.getDOMHelper();\n\n const range = this.editor.getDocument().createRange();\n const startNode = this.state.tableSelection.startNode;\n const isReverted =\n currentNode.compareDocumentPosition(startNode) == Node.DOCUMENT_POSITION_FOLLOWING;\n\n if (isReverted) {\n range.setStart(currentNode, 0);\n range.setEnd(\n startNode,\n isNodeOfType(startNode, 'TEXT_NODE')\n ? startNode.nodeValue?.length ?? 0\n : startNode.childNodes.length\n );\n } else {\n range.setStart(startNode, 0);\n range.setEnd(currentNode, 0);\n }\n\n // Use common container of the range to search a common table that covers both start and end node\n const tableStart = range.commonAncestorContainer;\n const newTableSelection = this.parseTableSelection(tableStart, startNode, domHelper);\n\n if (newTableSelection) {\n const lastCo = findCoordinate(\n newTableSelection.parsedTable,\n currentNode,\n domHelper\n );\n\n if (newTableSelection.table != this.state.tableSelection.table) {\n // Move mouse into another table (nest table scenario)\n this.state.tableSelection = newTableSelection;\n this.state.tableSelection.lastCo = lastCo ?? undefined;\n }\n\n const updated = lastCo && this.updateTableSelection(lastCo);\n\n if (hasTableSelection || updated) {\n event.preventDefault();\n }\n } else if (this.editor.getDOMSelection()?.type == 'table') {\n // Move mouse out of table\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted,\n },\n this.state.tableSelection\n );\n }\n }\n };\n\n private onMouseUp() {\n this.detachMouseEvent();\n }\n\n private onDrop = () => {\n this.detachMouseEvent();\n };\n\n private onKeyDown(editor: IEditor, rawEvent: KeyboardEvent) {\n const key = rawEvent.key;\n const selection = editor.getDOMSelection();\n const win = editor.getDocument().defaultView;\n\n switch (selection?.type) {\n case 'image':\n if (!isModifierKey(rawEvent) && !rawEvent.shiftKey && selection.image.parentNode) {\n if (key === 'Escape') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n rawEvent.stopPropagation();\n } else if (key !== 'Delete' && key !== 'Backspace') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n }\n }\n\n if (\n (isModifierKey(rawEvent) || rawEvent.shiftKey) &&\n selection.image &&\n !this.isSafari\n ) {\n const range = selection.image.ownerDocument.createRange();\n range.selectNode(selection.image);\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /* tableSelection */\n );\n }\n break;\n\n case 'range':\n if (key == Up || key == Down || key == Left || key == Right || key == Tab) {\n const start = selection.range.startContainer;\n this.state.tableSelection = this.parseTableSelection(\n start,\n start,\n editor.getDOMHelper()\n );\n\n if (this.state.tableSelection && !rawEvent.defaultPrevented) {\n if (key == Tab) {\n this.handleSelectionInTable(this.getTabKey(rawEvent));\n rawEvent.preventDefault();\n } else {\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n\n case 'table':\n // After a content change event is handled tableSelection state is reset to null\n // Since we have table selection from DOMSelection, we can use it to re-create the tableSelection state\n if (this.state.tableSelection == null) {\n const { table, firstRow, firstColumn, lastRow, lastColumn } = selection;\n\n const parsedTable = parseTableCells(table);\n if (parsedTable) {\n const firstCo = { row: firstRow, col: firstColumn };\n const lastCo = { row: lastRow, col: lastColumn };\n\n // Create the tableSelection with current table info\n this.state.tableSelection = {\n table,\n parsedTable,\n firstCo,\n lastCo,\n startNode: findTableCellElement(parsedTable, firstCo)?.cell || table,\n };\n }\n }\n if (this.state.tableSelection?.lastCo) {\n const { shiftKey, key } = rawEvent;\n\n if (shiftKey && (key == Left || key == Right)) {\n const isRtl =\n win?.getComputedStyle(this.state.tableSelection.table).direction ==\n 'rtl';\n\n this.updateTableSelectionFromKeyboard(\n 0,\n (key == Left ? -1 : 1) * (isRtl ? -1 : 1)\n );\n rawEvent.preventDefault();\n } else if (shiftKey && (key == Up || key == Down)) {\n this.updateTableSelectionFromKeyboard(key == Up ? -1 : 1, 0);\n rawEvent.preventDefault();\n } else if (key != 'Shift' && !isCharacterValue(rawEvent)) {\n if (key == Up || key == Down || key == Left || key == Right) {\n this.setDOMSelection(null /*domSelection*/, this.state.tableSelection);\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n }\n }\n\n private getTabKey(rawEvent: KeyboardEvent) {\n return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';\n }\n\n private handleSelectionInTable(\n key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'TabLeft' | 'TabRight'\n ) {\n if (!this.editor || !this.state.tableSelection) {\n return;\n }\n\n const selection = this.editor.getDOMSelection();\n const domHelper = this.editor.getDOMHelper();\n\n if (selection?.type == 'range') {\n const {\n range: { collapsed, startContainer, endContainer, commonAncestorContainer },\n isReverted,\n } = selection;\n const start = isReverted ? endContainer : startContainer;\n const end: Node | null = isReverted ? startContainer : endContainer;\n const tableSel = this.parseTableSelection(commonAncestorContainer, start, domHelper);\n\n if (!tableSel) {\n return;\n }\n\n let lastCo = findCoordinate(tableSel?.parsedTable, end, domHelper);\n let tabMove = false;\n const { parsedTable, firstCo: oldCo, table } = this.state.tableSelection;\n\n if (lastCo && tableSel.table == table) {\n if (lastCo.col != oldCo.col && (key == Up || key == Down)) {\n const change = key == Up ? -1 : 1;\n const originalTd = findTableCellElement(parsedTable, oldCo)?.cell;\n let td: HTMLTableCellElement | null = null;\n\n lastCo = { row: oldCo.row + change, col: oldCo.col };\n\n while (lastCo.row >= 0 && lastCo.row < parsedTable.length) {\n td = findTableCellElement(parsedTable, lastCo)?.cell || null;\n\n if (td == originalTd) {\n lastCo.row += change;\n } else {\n break;\n }\n }\n\n if (collapsed && td) {\n this.setRangeSelectionInTable(\n td,\n key == Up ? td.childNodes.length : 0,\n this.editor\n );\n } else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {\n this.selectBeforeOrAfterElement(\n this.editor,\n table,\n change == 1 /* after */,\n change != 1 /* setSelectionInNextSiblingElement */\n );\n }\n } else if (key == 'TabLeft' || key == 'TabRight') {\n const reverse = key == 'TabLeft';\n for (\n let step = reverse ? -1 : 1,\n row = lastCo.row ?? 0,\n col = (lastCo.col ?? 0) + step;\n ;\n col += step\n ) {\n if (col < 0 || col >= parsedTable[row].length) {\n row += step;\n if (row < 0) {\n this.selectBeforeOrAfterElement(this.editor, tableSel.table);\n break;\n } else if (row >= parsedTable.length) {\n this.selectBeforeOrAfterElement(\n this.editor,\n tableSel.table,\n true /*after*/\n );\n break;\n }\n col = reverse ? parsedTable[row].length - 1 : 0;\n }\n const cell = parsedTable[row][col];\n\n if (typeof cell != 'string') {\n tabMove = true;\n this.setRangeSelectionInTable(\n cell,\n 0,\n this.editor,\n true /* selectAll */\n );\n lastCo.row = row;\n lastCo.col = col;\n break;\n }\n }\n if (this.editor.getSnapshotsManager().hasNewContent) {\n this.editor.takeSnapshot();\n }\n } else {\n this.state.tableSelection = null;\n }\n\n if (\n collapsed &&\n (lastCo.col != oldCo.col || lastCo.row != oldCo.row) &&\n lastCo.row >= 0 &&\n lastCo.row == parsedTable.length - 1 &&\n lastCo.col == parsedTable[lastCo.row]?.length - 1\n ) {\n this.editor?.announce({ defaultStrings: 'announceOnFocusLastCell' });\n }\n }\n\n if (!collapsed && lastCo && !tabMove) {\n this.state.tableSelection = tableSel;\n this.updateTableSelection(lastCo);\n }\n }\n }\n\n private setRangeSelectionInTable(\n cell: Node,\n nodeOffset: number,\n editor: IEditor,\n selectAll?: boolean\n ) {\n const range = editor.getDocument().createRange();\n if (selectAll && cell.firstChild && cell.lastChild) {\n const cellStart = cell.firstChild;\n const cellEnd = cell.lastChild;\n // Get first deepest editable position in the cell\n const posStart = normalizePos(cellStart, 0);\n // Get last deepest editable position in the cell\n const posEnd = normalizePos(cellEnd, cellEnd.childNodes.length);\n\n range.setStart(posStart.node, posStart.offset);\n range.setEnd(posEnd.node, posEnd.offset);\n\n if (range.toString() === '') {\n range.collapse(true /* toStart */);\n }\n } else {\n // Get deepest editable position in the cell\n const { node, offset } = normalizePos(cell, nodeOffset);\n\n range.setStart(node, offset);\n range.collapse(true /* toStart */);\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n\n private updateTableSelectionFromKeyboard(rowChange: number, colChange: number) {\n if (this.state.tableSelection?.lastCo && this.editor) {\n const { lastCo, parsedTable } = this.state.tableSelection;\n const row = lastCo.row + rowChange;\n const col = lastCo.col + colChange;\n\n if (row >= 0 && row < parsedTable.length && col >= 0 && col < parsedTable[row].length) {\n this.updateTableSelection({ row, col });\n }\n }\n }\n\n private selectBeforeOrAfterElement(\n editor: IEditor,\n element: HTMLElement,\n after?: boolean,\n setSelectionInNextSiblingElement?: boolean\n ) {\n const doc = editor.getDocument();\n const parent = element.parentNode;\n const index = parent && toArray(parent.childNodes).indexOf(element);\n let sibling: Element | undefined | null;\n\n if (parent && index !== null && index >= 0) {\n const range = doc.createRange();\n if (\n setSelectionInNextSiblingElement &&\n (sibling = after ? element.nextElementSibling : element.previousElementSibling) &&\n isNodeOfType(sibling, 'ELEMENT_NODE')\n ) {\n range.selectNodeContents(sibling);\n range.collapse(false /* toStart */);\n } else {\n range.setStart(parent, index + (after ? 1 : 0));\n range.collapse();\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range: range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n }\n\n private getClickingImage(event: UIEvent): HTMLImageElement | null {\n const target = event.target as Node;\n\n return isNodeOfType(target, 'ELEMENT_NODE') && isElementOfType(target, 'img')\n ? target\n : null;\n }\n\n // MacOS will not create a mouseUp event if contextMenu event is not prevent defaulted.\n // Make sure we capture image target even if image is wrapped\n private getContainedTargetImage = (\n event: MouseEvent,\n previousSelection: DOMSelection | null\n ): HTMLImageElement | null => {\n if (!this.isMac || !previousSelection || previousSelection.type !== 'image') {\n return null;\n }\n\n const target = event.target as Node;\n if (\n isNodeOfType(target, 'ELEMENT_NODE') &&\n isElementOfType(target, 'span') &&\n target.firstChild === previousSelection.image\n ) {\n return previousSelection.image;\n }\n return null;\n };\n\n private onFocus = () => {\n if (!this.state.skipReselectOnFocus && this.state.selection) {\n this.setDOMSelection(this.state.selection, this.state.tableSelection);\n }\n\n if (this.state.selection?.type == 'range' && !this.isSafari) {\n // Editor is focused, now we can get live selection. So no need to keep a selection if the selection type is range.\n this.state.selection = null;\n }\n\n if (this.scrollTopCache && this.editor) {\n const sc = this.editor.getScrollContainer();\n sc.scrollTop = this.scrollTopCache;\n this.scrollTopCache = 0;\n }\n };\n\n private onBlur = () => {\n if (this.editor) {\n if (!this.state.selection) {\n this.state.selection = this.editor.getDOMSelection();\n }\n const sc = this.editor.getScrollContainer();\n this.scrollTopCache = sc.scrollTop;\n }\n };\n\n private onSelectionChange = () => {\n if (this.editor?.hasFocus() && !this.editor.isInShadowEdit()) {\n const newSelection = this.editor.getDOMSelection();\n\n //If am image selection changed to a wider range due a keyboard event, we should update the selection\n const selection = this.editor.getDocument().getSelection();\n if (selection && selection.focusNode) {\n const image = isSingleImageInSelection(selection);\n if (newSelection?.type == 'image' && !image) {\n const range = selection.getRangeAt(0);\n this.editor.setDOMSelection({\n type: 'range',\n range,\n isReverted:\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset,\n });\n } else if (newSelection?.type !== 'image' && image) {\n this.editor.setDOMSelection({\n type: 'image',\n image,\n });\n }\n }\n\n // Safari has problem to handle onBlur event. When blur, we cannot get the original selection from editor.\n // So we always save a selection whenever editor has focus. Then after blur, we can still use this cached selection.\n if (newSelection?.type == 'range') {\n if (this.isSafari) {\n this.state.selection = newSelection;\n }\n }\n }\n };\n\n private parseTableSelection(\n tableStart: Node,\n tdStart: Node,\n domHelper: DOMHelper\n ): TableSelectionInfo | null {\n let table: HTMLTableElement | null;\n let parsedTable: ParsedTable | null;\n let firstCo: TableCellCoordinate | null;\n\n if (\n (table = domHelper.findClosestElementAncestor(tableStart, 'table')) &&\n table.isContentEditable &&\n (parsedTable = parseTableCells(table)) &&\n (firstCo = findCoordinate(parsedTable, tdStart, domHelper))\n ) {\n return { table, parsedTable, firstCo, startNode: tdStart };\n } else {\n return null;\n }\n }\n\n private updateTableSelection(lastCo: TableCellCoordinate) {\n if (this.state.tableSelection && this.editor) {\n const {\n table,\n firstCo,\n parsedTable,\n startNode,\n lastCo: oldCo,\n } = this.state.tableSelection;\n\n if (oldCo || firstCo.row != lastCo.row || firstCo.col != lastCo.col) {\n this.state.tableSelection.lastCo = lastCo;\n this.setDOMSelection(\n {\n type: 'table',\n table,\n firstRow: firstCo.row,\n firstColumn: firstCo.col,\n lastRow: lastCo.row,\n lastColumn: lastCo.col,\n tableSelectionInfo: this.state.tableSelection,\n },\n { table, firstCo, lastCo, parsedTable, startNode }\n );\n\n return true;\n }\n }\n\n return false;\n }\n\n private setDOMSelection(\n selection: DOMSelection | null,\n tableSelection: TableSelectionInfo | null\n ) {\n this.editor?.setDOMSelection(selection);\n this.state.tableSelection = tableSelection;\n }\n\n private detachMouseEvent() {\n if (this.state.mouseDisposer) {\n this.state.mouseDisposer();\n this.state.mouseDisposer = undefined;\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of SelectionPlugin.\n * @param option The editor option\n */\nexport function createSelectionPlugin(\n options: EditorOptions\n): PluginWithState<SelectionPluginState> {\n return new SelectionPlugin(options);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SelectionPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/selection/SelectionPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { findCoordinate } from './findCoordinate';\nimport { findTableCellElement } from '../../coreApi/setDOMSelection/findTableCellElement';\nimport { isSingleImageInSelection } from './isSingleImageInSelection';\nimport { normalizePos } from './normalizePos';\nimport {\n getDOMInsertPointRect,\n getNodePositionFromEvent,\n isCharacterValue,\n isElementOfType,\n isModifierKey,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n PluginEvent,\n PluginWithState,\n SelectionPluginState,\n EditorOptions,\n DOMHelper,\n ParsedTable,\n TableSelectionInfo,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst MouseLeftButton = 0;\nconst MouseRightButton = 2;\nconst Up = 'ArrowUp';\nconst Down = 'ArrowDown';\nconst Left = 'ArrowLeft';\nconst Right = 'ArrowRight';\nconst Tab = 'Tab';\n\n/**\n * @internal\n */\nexport const DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n/**\n * @internal\n */\nexport const DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = '#C6C6C6';\n\nclass SelectionPlugin implements PluginWithState<SelectionPluginState> {\n private editor: IEditor | null = null;\n private state: SelectionPluginState;\n private disposer: (() => void) | null = null;\n private logicalRootDisposer: (() => void) | null = null;\n private isSafari = false;\n private isMac = false;\n private scrollTopCache: number = 0;\n\n constructor(options: EditorOptions) {\n this.state = {\n selection: null,\n tableSelection: null,\n imageSelectionBorderColor:\n options.imageSelectionBorderColor ?? DEFAULT_SELECTION_BORDER_COLOR,\n imageSelectionBorderColorDark: options.imageSelectionBorderColor\n ? undefined\n : DEFAULT_SELECTION_BORDER_COLOR,\n tableCellSelectionBackgroundColor:\n options.tableCellSelectionBackgroundColor ??\n DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n tableCellSelectionBackgroundColorDark: options.tableCellSelectionBackgroundColor\n ? undefined\n : DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n };\n }\n\n getName() {\n return 'Selection';\n }\n\n initialize(editor: IEditor) {\n this.editor = editor;\n\n if (!this.state.imageSelectionBorderColorDark && this.state.imageSelectionBorderColor) {\n this.state.imageSelectionBorderColorDark = editor\n .getColorManager()\n .getDarkColor(this.state.imageSelectionBorderColor, undefined, 'border');\n }\n\n if (\n !this.state.tableCellSelectionBackgroundColorDark &&\n this.state.tableCellSelectionBackgroundColor\n ) {\n this.state.tableCellSelectionBackgroundColorDark = editor\n .getColorManager()\n .getDarkColor(\n this.state.tableCellSelectionBackgroundColor,\n undefined,\n 'background'\n );\n }\n\n const env = this.editor.getEnvironment();\n const document = this.editor.getDocument();\n\n this.isSafari = !!env.isSafari;\n this.isMac = !!env.isMac;\n document.addEventListener('selectionchange', this.onSelectionChange);\n if (this.isSafari) {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n }\n\n dispose() {\n this.editor?.getDocument().removeEventListener('selectionchange', this.onSelectionChange);\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n }\n\n this.logicalRootDisposer?.();\n this.logicalRootDisposer = null;\n\n this.detachMouseEvent();\n this.editor = null;\n }\n\n getState(): SelectionPluginState {\n return this.state;\n }\n\n onPluginEvent(event: PluginEvent) {\n if (!this.editor) {\n return;\n }\n\n switch (event.eventType) {\n case 'mouseDown':\n this.onMouseDown(this.editor, event.rawEvent);\n break;\n\n case 'mouseUp':\n this.onMouseUp();\n break;\n\n case 'keyDown':\n this.onKeyDown(this.editor, event.rawEvent);\n break;\n\n case 'contentChanged':\n this.state.tableSelection = null;\n break;\n\n case 'scroll':\n if (!this.editor.hasFocus()) {\n this.scrollTopCache = event.scrollContainer.scrollTop;\n }\n break;\n\n case 'logicalRootChanged':\n this.logicalRootDisposer?.();\n if (this.isSafari) {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n break;\n }\n }\n\n private onMouseDown(editor: IEditor, rawEvent: MouseEvent) {\n const selection = editor.getDOMSelection();\n let image: HTMLImageElement | null;\n\n // Image selection\n if (\n selection?.type == 'image' &&\n (rawEvent.button == MouseLeftButton ||\n (rawEvent.button == MouseRightButton &&\n !this.getClickingImage(rawEvent) &&\n !this.getContainedTargetImage(rawEvent, selection)))\n ) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n if (\n (image =\n this.getClickingImage(rawEvent) ??\n this.getContainedTargetImage(rawEvent, selection)) &&\n image.isContentEditable\n ) {\n this.setDOMSelection(\n {\n type: 'image',\n image: image,\n },\n null\n );\n return;\n }\n\n // Table selection\n if (selection?.type == 'table' && rawEvent.button == MouseLeftButton) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n let tableSelection: TableSelectionInfo | null;\n const target = rawEvent.target as Node;\n\n if (\n target &&\n rawEvent.button == MouseLeftButton &&\n (tableSelection = this.parseTableSelection(target, target, editor.getDOMHelper()))\n ) {\n this.state.tableSelection = tableSelection;\n\n if (rawEvent.detail >= 3) {\n const lastCo = findCoordinate(\n tableSelection.parsedTable,\n rawEvent.target as Node,\n editor.getDOMHelper()\n );\n\n if (lastCo) {\n // Triple click, select the current cell\n tableSelection.lastCo = lastCo;\n this.updateTableSelection(lastCo);\n rawEvent.preventDefault();\n }\n }\n\n this.state.mouseDisposer?.();\n this.state.mouseDisposer = editor.attachDomEvent({\n mousemove: {\n beforeDispatch: this.onMouseMove,\n },\n });\n }\n }\n\n private onMouseMove = (event: Event) => {\n if (this.editor && this.state.tableSelection) {\n const hasTableSelection = !!this.state.tableSelection.lastCo;\n const currentNode = event.target as Node;\n const domHelper = this.editor.getDOMHelper();\n\n const range = this.editor.getDocument().createRange();\n const startNode = this.state.tableSelection.startNode;\n const isReverted =\n currentNode.compareDocumentPosition(startNode) == Node.DOCUMENT_POSITION_FOLLOWING;\n\n if (isReverted) {\n range.setStart(currentNode, 0);\n range.setEnd(\n startNode,\n isNodeOfType(startNode, 'TEXT_NODE')\n ? startNode.nodeValue?.length ?? 0\n : startNode.childNodes.length\n );\n } else {\n range.setStart(startNode, 0);\n range.setEnd(currentNode, 0);\n }\n\n // Use common container of the range to search a common table that covers both start and end node\n const tableStart = range.commonAncestorContainer;\n const newTableSelection = this.parseTableSelection(tableStart, startNode, domHelper);\n\n if (newTableSelection) {\n const lastCo = findCoordinate(\n newTableSelection.parsedTable,\n currentNode,\n domHelper\n );\n\n if (newTableSelection.table != this.state.tableSelection.table) {\n // Move mouse into another table (nest table scenario)\n this.state.tableSelection = newTableSelection;\n this.state.tableSelection.lastCo = lastCo ?? undefined;\n }\n\n const updated = lastCo && this.updateTableSelection(lastCo);\n\n if (hasTableSelection || updated) {\n event.preventDefault();\n }\n } else if (this.editor.getDOMSelection()?.type == 'table') {\n // Move mouse out of table\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted,\n },\n this.state.tableSelection\n );\n }\n }\n };\n\n private onMouseUp() {\n this.detachMouseEvent();\n }\n\n private onDrop = () => {\n this.detachMouseEvent();\n };\n\n private onKeyDown(editor: IEditor, rawEvent: KeyboardEvent) {\n const key = rawEvent.key;\n const selection = editor.getDOMSelection();\n const win = editor.getDocument().defaultView;\n\n switch (selection?.type) {\n case 'image':\n if (!isModifierKey(rawEvent) && !rawEvent.shiftKey && selection.image.parentNode) {\n if (key === 'Escape') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n rawEvent.stopPropagation();\n } else if (key !== 'Delete' && key !== 'Backspace') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n }\n }\n\n if (\n (isModifierKey(rawEvent) || rawEvent.shiftKey) &&\n selection.image &&\n !this.isSafari\n ) {\n const range = selection.image.ownerDocument.createRange();\n range.selectNode(selection.image);\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /* tableSelection */\n );\n }\n break;\n\n case 'range':\n if (key == Up || key == Down || key == Left || key == Right || key == Tab) {\n const start = selection.range.startContainer;\n this.state.tableSelection = this.parseTableSelection(\n start,\n start,\n editor.getDOMHelper()\n );\n\n if (this.state.tableSelection && !rawEvent.defaultPrevented) {\n if (key == Tab) {\n this.handleSelectionInTable(this.getTabKey(rawEvent));\n rawEvent.preventDefault();\n } else {\n win?.requestAnimationFrame(() =>\n this.handleSelectionInTable(key, selection.range)\n );\n }\n }\n }\n break;\n\n case 'table':\n // After a content change event is handled tableSelection state is reset to null\n // Since we have table selection from DOMSelection, we can use it to re-create the tableSelection state\n if (this.state.tableSelection == null) {\n const { table, firstRow, firstColumn, lastRow, lastColumn } = selection;\n\n const parsedTable = parseTableCells(table);\n if (parsedTable) {\n const firstCo = { row: firstRow, col: firstColumn };\n const lastCo = { row: lastRow, col: lastColumn };\n\n // Create the tableSelection with current table info\n this.state.tableSelection = {\n table,\n parsedTable,\n firstCo,\n lastCo,\n startNode: findTableCellElement(parsedTable, firstCo)?.cell || table,\n };\n }\n }\n if (this.state.tableSelection?.lastCo) {\n const { shiftKey, key } = rawEvent;\n\n if (shiftKey && (key == Left || key == Right)) {\n const isRtl =\n win?.getComputedStyle(this.state.tableSelection.table).direction ==\n 'rtl';\n\n this.updateTableSelectionFromKeyboard(\n 0,\n (key == Left ? -1 : 1) * (isRtl ? -1 : 1)\n );\n rawEvent.preventDefault();\n } else if (shiftKey && (key == Up || key == Down)) {\n this.updateTableSelectionFromKeyboard(key == Up ? -1 : 1, 0);\n rawEvent.preventDefault();\n } else if (key != 'Shift' && !isCharacterValue(rawEvent)) {\n if (key == Up || key == Down || key == Left || key == Right) {\n this.setDOMSelection(null /*domSelection*/, this.state.tableSelection);\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n }\n }\n\n private getTabKey(rawEvent: KeyboardEvent) {\n return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';\n }\n\n private handleSelectionInTable(\n key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'TabLeft' | 'TabRight',\n rangeBeforeChange?: Range\n ) {\n if (!this.editor || !this.state.tableSelection) {\n return;\n }\n\n const selection = this.editor.getDOMSelection();\n const domHelper = this.editor.getDOMHelper();\n\n if (selection?.type == 'range') {\n const {\n range: { collapsed, startContainer, endContainer, commonAncestorContainer },\n isReverted,\n } = selection;\n const start = isReverted ? endContainer : startContainer;\n const end: Node | null = isReverted ? startContainer : endContainer;\n const tableSel = this.parseTableSelection(commonAncestorContainer, start, domHelper);\n\n if (!tableSel) {\n return;\n }\n\n let lastCo = findCoordinate(tableSel?.parsedTable, end, domHelper);\n let tabMove = false;\n const { parsedTable, firstCo: oldCo, table } = this.state.tableSelection;\n\n if (lastCo && tableSel.table == table) {\n if (lastCo.col != oldCo.col && (key == Up || key == Down)) {\n const change = key == Up ? -1 : 1;\n const originalTd = findTableCellElement(parsedTable, oldCo)?.cell;\n let td: HTMLTableCellElement | null = null;\n\n lastCo = { row: oldCo.row + change, col: oldCo.col };\n\n while (lastCo.row >= 0 && lastCo.row < parsedTable.length) {\n td = findTableCellElement(parsedTable, lastCo)?.cell || null;\n\n if (td == originalTd) {\n lastCo.row += change;\n } else {\n break;\n }\n }\n\n if (collapsed && td) {\n const textOffset =\n (key == 'ArrowUp' || key == 'ArrowDown') && rangeBeforeChange\n ? this.getTextOffset(\n this.editor,\n rangeBeforeChange,\n td,\n key == 'ArrowUp'\n )\n : null;\n if (textOffset) {\n this.setRangeSelectionInTable(\n textOffset.node,\n textOffset.offset,\n this.editor,\n false /* selectAll */\n );\n } else {\n this.setRangeSelectionInTable(\n td,\n 0,\n this.editor,\n false /* selectAll */\n );\n }\n } else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {\n this.selectBeforeOrAfterElement(\n this.editor,\n table,\n change == 1 /* after */,\n change != 1 /* setSelectionInNextSiblingElement */\n );\n }\n } else if (key == 'TabLeft' || key == 'TabRight') {\n const reverse = key == 'TabLeft';\n for (\n let step = reverse ? -1 : 1,\n row = lastCo.row ?? 0,\n col = (lastCo.col ?? 0) + step;\n ;\n col += step\n ) {\n if (col < 0 || col >= parsedTable[row].length) {\n row += step;\n if (row < 0) {\n this.selectBeforeOrAfterElement(this.editor, tableSel.table);\n break;\n } else if (row >= parsedTable.length) {\n this.selectBeforeOrAfterElement(\n this.editor,\n tableSel.table,\n true /*after*/\n );\n break;\n }\n col = reverse ? parsedTable[row].length - 1 : 0;\n }\n const cell = parsedTable[row][col];\n\n if (typeof cell != 'string') {\n tabMove = true;\n this.setRangeSelectionInTable(\n cell,\n 0,\n this.editor,\n true /* selectAll */\n );\n lastCo.row = row;\n lastCo.col = col;\n break;\n }\n }\n if (this.editor.getSnapshotsManager().hasNewContent) {\n this.editor.takeSnapshot();\n }\n } else {\n this.state.tableSelection = null;\n }\n\n if (\n collapsed &&\n (lastCo.col != oldCo.col || lastCo.row != oldCo.row) &&\n lastCo.row >= 0 &&\n lastCo.row == parsedTable.length - 1 &&\n lastCo.col == parsedTable[lastCo.row]?.length - 1\n ) {\n this.editor?.announce({ defaultStrings: 'announceOnFocusLastCell' });\n }\n }\n\n if (!collapsed && lastCo && !tabMove) {\n this.state.tableSelection = tableSel;\n this.updateTableSelection(lastCo);\n }\n }\n }\n\n private getTextOffset(editor: IEditor, range: Range, td: HTMLElement, isKeyUp: boolean) {\n const doc = editor.getDocument();\n const cursorRect = range\n ? getDOMInsertPointRect(doc, {\n node: range.startContainer,\n offset: range.startOffset,\n })\n : undefined;\n const rect = td?.getBoundingClientRect();\n const textOffset =\n cursorRect && rect\n ? getNodePositionFromEvent(\n doc,\n editor.getDOMHelper(),\n cursorRect.left,\n isKeyUp ? rect.top - 1 : rect.top + 1\n )\n : null;\n return textOffset;\n }\n\n private setRangeSelectionInTable(\n cell: Node,\n nodeOffset: number,\n editor: IEditor,\n selectAll?: boolean\n ) {\n const doc = editor.getDocument();\n const range = doc.createRange();\n if (selectAll && cell.firstChild && cell.lastChild) {\n const cellStart = cell.firstChild;\n const cellEnd = cell.lastChild;\n // Get first deepest editable position in the cell\n const posStart = normalizePos(cellStart, 0);\n // Get last deepest editable position in the cell\n const posEnd = normalizePos(cellEnd, cellEnd.childNodes.length);\n\n range.setStart(posStart.node, posStart.offset);\n range.setEnd(posEnd.node, posEnd.offset);\n\n if (range.toString() === '') {\n range.collapse(true /* toStart */);\n }\n } else {\n // Get deepest editable position in the cell\n const { node, offset } = normalizePos(cell, nodeOffset);\n range.setStart(node, offset);\n range.collapse(true /* toStart */);\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n\n private updateTableSelectionFromKeyboard(rowChange: number, colChange: number) {\n if (this.state.tableSelection?.lastCo && this.editor) {\n const { lastCo, parsedTable } = this.state.tableSelection;\n const row = lastCo.row + rowChange;\n const col = lastCo.col + colChange;\n\n if (row >= 0 && row < parsedTable.length && col >= 0 && col < parsedTable[row].length) {\n this.updateTableSelection({ row, col });\n }\n }\n }\n\n private selectBeforeOrAfterElement(\n editor: IEditor,\n element: HTMLElement,\n after?: boolean,\n setSelectionInNextSiblingElement?: boolean\n ) {\n const doc = editor.getDocument();\n const parent = element.parentNode;\n const index = parent && toArray(parent.childNodes).indexOf(element);\n let sibling: Element | undefined | null;\n\n if (parent && index !== null && index >= 0) {\n const range = doc.createRange();\n if (\n setSelectionInNextSiblingElement &&\n (sibling = after ? element.nextElementSibling : element.previousElementSibling) &&\n isNodeOfType(sibling, 'ELEMENT_NODE')\n ) {\n range.selectNodeContents(sibling);\n range.collapse(false /* toStart */);\n } else {\n range.setStart(parent, index + (after ? 1 : 0));\n range.collapse();\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range: range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n }\n\n private getClickingImage(event: UIEvent): HTMLImageElement | null {\n const target = event.target as Node;\n\n return isNodeOfType(target, 'ELEMENT_NODE') && isElementOfType(target, 'img')\n ? target\n : null;\n }\n\n // MacOS will not create a mouseUp event if contextMenu event is not prevent defaulted.\n // Make sure we capture image target even if image is wrapped\n private getContainedTargetImage = (\n event: MouseEvent,\n previousSelection: DOMSelection | null\n ): HTMLImageElement | null => {\n if (!this.isMac || !previousSelection || previousSelection.type !== 'image') {\n return null;\n }\n\n const target = event.target as Node;\n if (\n isNodeOfType(target, 'ELEMENT_NODE') &&\n isElementOfType(target, 'span') &&\n target.firstChild === previousSelection.image\n ) {\n return previousSelection.image;\n }\n return null;\n };\n\n private onFocus = () => {\n if (!this.state.skipReselectOnFocus && this.state.selection) {\n this.setDOMSelection(this.state.selection, this.state.tableSelection);\n }\n\n if (this.state.selection?.type == 'range' && !this.isSafari) {\n // Editor is focused, now we can get live selection. So no need to keep a selection if the selection type is range.\n this.state.selection = null;\n }\n\n if (this.scrollTopCache && this.editor) {\n const sc = this.editor.getScrollContainer();\n sc.scrollTop = this.scrollTopCache;\n this.scrollTopCache = 0;\n }\n };\n\n private onBlur = () => {\n if (this.editor) {\n if (!this.state.selection) {\n this.state.selection = this.editor.getDOMSelection();\n }\n const sc = this.editor.getScrollContainer();\n this.scrollTopCache = sc.scrollTop;\n }\n };\n\n private onSelectionChange = () => {\n if (this.editor?.hasFocus() && !this.editor.isInShadowEdit()) {\n const newSelection = this.editor.getDOMSelection();\n\n //If am image selection changed to a wider range due a keyboard event, we should update the selection\n const selection = this.editor.getDocument().getSelection();\n if (selection && selection.focusNode) {\n const image = isSingleImageInSelection(selection);\n if (newSelection?.type == 'image' && !image) {\n const range = selection.getRangeAt(0);\n this.editor.setDOMSelection({\n type: 'range',\n range,\n isReverted:\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset,\n });\n } else if (newSelection?.type !== 'image' && image) {\n this.editor.setDOMSelection({\n type: 'image',\n image,\n });\n }\n }\n\n // Safari has problem to handle onBlur event. When blur, we cannot get the original selection from editor.\n // So we always save a selection whenever editor has focus. Then after blur, we can still use this cached selection.\n if (newSelection?.type == 'range') {\n if (this.isSafari) {\n this.state.selection = newSelection;\n }\n }\n }\n };\n\n private parseTableSelection(\n tableStart: Node,\n tdStart: Node,\n domHelper: DOMHelper\n ): TableSelectionInfo | null {\n let table: HTMLTableElement | null;\n let parsedTable: ParsedTable | null;\n let firstCo: TableCellCoordinate | null;\n\n if (\n (table = domHelper.findClosestElementAncestor(tableStart, 'table')) &&\n table.isContentEditable &&\n (parsedTable = parseTableCells(table)) &&\n (firstCo = findCoordinate(parsedTable, tdStart, domHelper))\n ) {\n return { table, parsedTable, firstCo, startNode: tdStart };\n } else {\n return null;\n }\n }\n\n private updateTableSelection(lastCo: TableCellCoordinate) {\n if (this.state.tableSelection && this.editor) {\n const {\n table,\n firstCo,\n parsedTable,\n startNode,\n lastCo: oldCo,\n } = this.state.tableSelection;\n\n if (oldCo || firstCo.row != lastCo.row || firstCo.col != lastCo.col) {\n this.state.tableSelection.lastCo = lastCo;\n this.setDOMSelection(\n {\n type: 'table',\n table,\n firstRow: firstCo.row,\n firstColumn: firstCo.col,\n lastRow: lastCo.row,\n lastColumn: lastCo.col,\n tableSelectionInfo: this.state.tableSelection,\n },\n { table, firstCo, lastCo, parsedTable, startNode }\n );\n\n return true;\n }\n }\n\n return false;\n }\n\n private setDOMSelection(\n selection: DOMSelection | null,\n tableSelection: TableSelectionInfo | null\n ) {\n this.editor?.setDOMSelection(selection);\n this.state.tableSelection = tableSelection;\n }\n\n private detachMouseEvent() {\n if (this.state.mouseDisposer) {\n this.state.mouseDisposer();\n this.state.mouseDisposer = undefined;\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of SelectionPlugin.\n * @param option The editor option\n */\nexport function createSelectionPlugin(\n options: EditorOptions\n): PluginWithState<SelectionPluginState> {\n return new SelectionPlugin(options);\n}\n"]}
|
|
@@ -23,7 +23,8 @@ define(["require", "exports", "../../editor/core/DOMHelperImpl", "roosterjs-cont
|
|
|
23
23
|
continue;
|
|
24
24
|
}
|
|
25
25
|
else if (!includedNodes.has(target)) {
|
|
26
|
-
if (
|
|
26
|
+
if (!_this.domHelper.isNodeInEditor(target) ||
|
|
27
|
+
(0, roosterjs_content_model_dom_1.findClosestEntityWrapper)(target, _this.domHelper) ||
|
|
27
28
|
(0, roosterjs_content_model_dom_1.findClosestBlockEntityContainer)(target, _this.domHelper)) {
|
|
28
29
|
ignoredNodes.add(target);
|
|
29
30
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textMutationObserver.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/textMutationObserver.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"textMutationObserver.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/textMutationObserver.ts"],"names":[],"mappings":"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","sourcesContent":["import { createDOMHelper } from '../../editor/core/DOMHelperImpl';\nimport {\n findClosestBlockEntityContainer,\n findClosestEntityWrapper,\n isNodeOfType,\n} from 'roosterjs-content-model-dom';\nimport type { DOMHelper, TextMutationObserver } from 'roosterjs-content-model-types';\nimport type { Mutation } from './MutationType';\n\nclass TextMutationObserverImpl implements TextMutationObserver {\n private observer: MutationObserver;\n private domHelper: DOMHelper;\n\n constructor(\n private contentDiv: HTMLDivElement,\n private onMutation: (mutation: Mutation) => void\n ) {\n this.observer = new MutationObserver(this.onMutationInternal);\n this.domHelper = createDOMHelper(contentDiv);\n }\n\n startObserving() {\n this.observer.observe(this.contentDiv, {\n subtree: true,\n childList: true,\n attributes: true,\n characterData: true,\n });\n }\n\n stopObserving() {\n this.observer.disconnect();\n }\n\n flushMutations(ignoreMutations?: boolean) {\n const mutations = this.observer.takeRecords();\n\n if (!ignoreMutations) {\n this.onMutationInternal(mutations);\n }\n }\n\n private onMutationInternal = (mutations: MutationRecord[]) => {\n let canHandle = true;\n let firstTarget: Node | null = null;\n let lastTextChangeNode: Node | null = null;\n let addedNodes: Node[] = [];\n let removedNodes: Node[] = [];\n let reconcileText = false;\n\n const ignoredNodes = new Set<Node>();\n const includedNodes = new Set<Node>();\n\n for (let i = 0; i < mutations.length && canHandle; i++) {\n const mutation = mutations[i];\n const target = mutation.target;\n\n if (ignoredNodes.has(target)) {\n continue;\n } else if (!includedNodes.has(target)) {\n if (\n !this.domHelper.isNodeInEditor(target) ||\n findClosestEntityWrapper(target, this.domHelper) ||\n findClosestBlockEntityContainer(target, this.domHelper)\n ) {\n ignoredNodes.add(target);\n\n continue;\n } else {\n includedNodes.add(target);\n }\n }\n\n switch (mutation.type) {\n case 'attributes':\n if (this.domHelper.isNodeInEditor(target, true /*excludingSelf*/)) {\n if (\n mutation.attributeName == 'id' &&\n isNodeOfType(target, 'ELEMENT_NODE')\n ) {\n this.onMutation({ type: 'elementId', element: target });\n } else {\n // We cannot handle attributes changes on editor content for now\n canHandle = false;\n }\n }\n break;\n\n case 'characterData':\n if (lastTextChangeNode && lastTextChangeNode != mutation.target) {\n // Multiple text nodes got changed, we don't know how to handle it\n canHandle = false;\n } else {\n lastTextChangeNode = mutation.target;\n reconcileText = true;\n }\n break;\n\n case 'childList':\n if (!firstTarget) {\n firstTarget = mutation.target;\n } else if (firstTarget != mutation.target) {\n canHandle = false;\n }\n\n if (canHandle) {\n addedNodes = addedNodes.concat(Array.from(mutation.addedNodes));\n removedNodes = removedNodes.concat(Array.from(mutation.removedNodes));\n }\n\n break;\n }\n }\n\n if (canHandle) {\n if (addedNodes.length > 0 || removedNodes.length > 0) {\n this.onMutation({\n type: 'childList',\n addedNodes,\n removedNodes,\n });\n }\n\n if (reconcileText) {\n this.onMutation({ type: 'text' });\n }\n } else {\n this.onMutation({ type: 'unknown' });\n }\n };\n}\n\n/**\n * @internal\n */\nexport function createTextMutationObserver(\n contentDiv: HTMLDivElement,\n onMutation: (mutation: Mutation) => void\n): TextMutationObserver {\n return new TextMutationObserverImpl(contentDiv, onMutation);\n}\n"]}
|
|
@@ -339,7 +339,9 @@ define(["require", "exports", "./findCoordinate", "../../coreApi/setDOMSelection
|
|
|
339
339
|
rawEvent.preventDefault();
|
|
340
340
|
}
|
|
341
341
|
else {
|
|
342
|
-
win === null || win === void 0 ? void 0 : win.requestAnimationFrame(function () {
|
|
342
|
+
win === null || win === void 0 ? void 0 : win.requestAnimationFrame(function () {
|
|
343
|
+
return _this.handleSelectionInTable(key, selection.range);
|
|
344
|
+
});
|
|
343
345
|
}
|
|
344
346
|
}
|
|
345
347
|
}
|
|
@@ -388,7 +390,7 @@ define(["require", "exports", "./findCoordinate", "../../coreApi/setDOMSelection
|
|
|
388
390
|
SelectionPlugin.prototype.getTabKey = function (rawEvent) {
|
|
389
391
|
return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';
|
|
390
392
|
};
|
|
391
|
-
SelectionPlugin.prototype.handleSelectionInTable = function (key) {
|
|
393
|
+
SelectionPlugin.prototype.handleSelectionInTable = function (key, rangeBeforeChange) {
|
|
392
394
|
var _a, _b, _c, _d, _e, _f;
|
|
393
395
|
if (!this.editor || !this.state.tableSelection) {
|
|
394
396
|
return;
|
|
@@ -422,7 +424,15 @@ define(["require", "exports", "./findCoordinate", "../../coreApi/setDOMSelection
|
|
|
422
424
|
}
|
|
423
425
|
}
|
|
424
426
|
if (collapsed && td) {
|
|
425
|
-
|
|
427
|
+
var textOffset = (key == 'ArrowUp' || key == 'ArrowDown') && rangeBeforeChange
|
|
428
|
+
? this.getTextOffset(this.editor, rangeBeforeChange, td, key == 'ArrowUp')
|
|
429
|
+
: null;
|
|
430
|
+
if (textOffset) {
|
|
431
|
+
this.setRangeSelectionInTable(textOffset.node, textOffset.offset, this.editor, false /* selectAll */);
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
this.setRangeSelectionInTable(td, 0, this.editor, false /* selectAll */);
|
|
435
|
+
}
|
|
426
436
|
}
|
|
427
437
|
else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {
|
|
428
438
|
this.selectBeforeOrAfterElement(this.editor, table, change == 1 /* after */, change != 1 /* setSelectionInNextSiblingElement */);
|
|
@@ -473,8 +483,23 @@ define(["require", "exports", "./findCoordinate", "../../coreApi/setDOMSelection
|
|
|
473
483
|
}
|
|
474
484
|
}
|
|
475
485
|
};
|
|
486
|
+
SelectionPlugin.prototype.getTextOffset = function (editor, range, td, isKeyUp) {
|
|
487
|
+
var doc = editor.getDocument();
|
|
488
|
+
var cursorRect = range
|
|
489
|
+
? (0, roosterjs_content_model_dom_1.getDOMInsertPointRect)(doc, {
|
|
490
|
+
node: range.startContainer,
|
|
491
|
+
offset: range.startOffset,
|
|
492
|
+
})
|
|
493
|
+
: undefined;
|
|
494
|
+
var rect = td === null || td === void 0 ? void 0 : td.getBoundingClientRect();
|
|
495
|
+
var textOffset = cursorRect && rect
|
|
496
|
+
? (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(doc, editor.getDOMHelper(), cursorRect.left, isKeyUp ? rect.top - 1 : rect.top + 1)
|
|
497
|
+
: null;
|
|
498
|
+
return textOffset;
|
|
499
|
+
};
|
|
476
500
|
SelectionPlugin.prototype.setRangeSelectionInTable = function (cell, nodeOffset, editor, selectAll) {
|
|
477
|
-
var
|
|
501
|
+
var doc = editor.getDocument();
|
|
502
|
+
var range = doc.createRange();
|
|
478
503
|
if (selectAll && cell.firstChild && cell.lastChild) {
|
|
479
504
|
var cellStart = cell.firstChild;
|
|
480
505
|
var cellEnd = cell.lastChild;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/selection/SelectionPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { findCoordinate } from './findCoordinate';\nimport { findTableCellElement } from '../../coreApi/setDOMSelection/findTableCellElement';\nimport { isSingleImageInSelection } from './isSingleImageInSelection';\nimport { normalizePos } from './normalizePos';\nimport {\n isCharacterValue,\n isElementOfType,\n isModifierKey,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n PluginEvent,\n PluginWithState,\n SelectionPluginState,\n EditorOptions,\n DOMHelper,\n ParsedTable,\n TableSelectionInfo,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst MouseLeftButton = 0;\nconst MouseRightButton = 2;\nconst Up = 'ArrowUp';\nconst Down = 'ArrowDown';\nconst Left = 'ArrowLeft';\nconst Right = 'ArrowRight';\nconst Tab = 'Tab';\n\n/**\n * @internal\n */\nexport const DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n/**\n * @internal\n */\nexport const DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = '#C6C6C6';\n\nclass SelectionPlugin implements PluginWithState<SelectionPluginState> {\n private editor: IEditor | null = null;\n private state: SelectionPluginState;\n private disposer: (() => void) | null = null;\n private logicalRootDisposer: (() => void) | null = null;\n private isSafari = false;\n private isMac = false;\n private scrollTopCache: number = 0;\n\n constructor(options: EditorOptions) {\n this.state = {\n selection: null,\n tableSelection: null,\n imageSelectionBorderColor:\n options.imageSelectionBorderColor ?? DEFAULT_SELECTION_BORDER_COLOR,\n imageSelectionBorderColorDark: options.imageSelectionBorderColor\n ? undefined\n : DEFAULT_SELECTION_BORDER_COLOR,\n tableCellSelectionBackgroundColor:\n options.tableCellSelectionBackgroundColor ??\n DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n tableCellSelectionBackgroundColorDark: options.tableCellSelectionBackgroundColor\n ? undefined\n : DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n };\n }\n\n getName() {\n return 'Selection';\n }\n\n initialize(editor: IEditor) {\n this.editor = editor;\n\n if (!this.state.imageSelectionBorderColorDark && this.state.imageSelectionBorderColor) {\n this.state.imageSelectionBorderColorDark = editor\n .getColorManager()\n .getDarkColor(this.state.imageSelectionBorderColor, undefined, 'border');\n }\n\n if (\n !this.state.tableCellSelectionBackgroundColorDark &&\n this.state.tableCellSelectionBackgroundColor\n ) {\n this.state.tableCellSelectionBackgroundColorDark = editor\n .getColorManager()\n .getDarkColor(\n this.state.tableCellSelectionBackgroundColor,\n undefined,\n 'background'\n );\n }\n\n const env = this.editor.getEnvironment();\n const document = this.editor.getDocument();\n\n this.isSafari = !!env.isSafari;\n this.isMac = !!env.isMac;\n document.addEventListener('selectionchange', this.onSelectionChange);\n if (this.isSafari) {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n }\n\n dispose() {\n this.editor?.getDocument().removeEventListener('selectionchange', this.onSelectionChange);\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n }\n\n this.logicalRootDisposer?.();\n this.logicalRootDisposer = null;\n\n this.detachMouseEvent();\n this.editor = null;\n }\n\n getState(): SelectionPluginState {\n return this.state;\n }\n\n onPluginEvent(event: PluginEvent) {\n if (!this.editor) {\n return;\n }\n\n switch (event.eventType) {\n case 'mouseDown':\n this.onMouseDown(this.editor, event.rawEvent);\n break;\n\n case 'mouseUp':\n this.onMouseUp();\n break;\n\n case 'keyDown':\n this.onKeyDown(this.editor, event.rawEvent);\n break;\n\n case 'contentChanged':\n this.state.tableSelection = null;\n break;\n\n case 'scroll':\n if (!this.editor.hasFocus()) {\n this.scrollTopCache = event.scrollContainer.scrollTop;\n }\n break;\n\n case 'logicalRootChanged':\n this.logicalRootDisposer?.();\n if (this.isSafari) {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n break;\n }\n }\n\n private onMouseDown(editor: IEditor, rawEvent: MouseEvent) {\n const selection = editor.getDOMSelection();\n let image: HTMLImageElement | null;\n\n // Image selection\n if (\n selection?.type == 'image' &&\n (rawEvent.button == MouseLeftButton ||\n (rawEvent.button == MouseRightButton &&\n !this.getClickingImage(rawEvent) &&\n !this.getContainedTargetImage(rawEvent, selection)))\n ) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n if (\n (image =\n this.getClickingImage(rawEvent) ??\n this.getContainedTargetImage(rawEvent, selection)) &&\n image.isContentEditable\n ) {\n this.setDOMSelection(\n {\n type: 'image',\n image: image,\n },\n null\n );\n return;\n }\n\n // Table selection\n if (selection?.type == 'table' && rawEvent.button == MouseLeftButton) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n let tableSelection: TableSelectionInfo | null;\n const target = rawEvent.target as Node;\n\n if (\n target &&\n rawEvent.button == MouseLeftButton &&\n (tableSelection = this.parseTableSelection(target, target, editor.getDOMHelper()))\n ) {\n this.state.tableSelection = tableSelection;\n\n if (rawEvent.detail >= 3) {\n const lastCo = findCoordinate(\n tableSelection.parsedTable,\n rawEvent.target as Node,\n editor.getDOMHelper()\n );\n\n if (lastCo) {\n // Triple click, select the current cell\n tableSelection.lastCo = lastCo;\n this.updateTableSelection(lastCo);\n rawEvent.preventDefault();\n }\n }\n\n this.state.mouseDisposer?.();\n this.state.mouseDisposer = editor.attachDomEvent({\n mousemove: {\n beforeDispatch: this.onMouseMove,\n },\n });\n }\n }\n\n private onMouseMove = (event: Event) => {\n if (this.editor && this.state.tableSelection) {\n const hasTableSelection = !!this.state.tableSelection.lastCo;\n const currentNode = event.target as Node;\n const domHelper = this.editor.getDOMHelper();\n\n const range = this.editor.getDocument().createRange();\n const startNode = this.state.tableSelection.startNode;\n const isReverted =\n currentNode.compareDocumentPosition(startNode) == Node.DOCUMENT_POSITION_FOLLOWING;\n\n if (isReverted) {\n range.setStart(currentNode, 0);\n range.setEnd(\n startNode,\n isNodeOfType(startNode, 'TEXT_NODE')\n ? startNode.nodeValue?.length ?? 0\n : startNode.childNodes.length\n );\n } else {\n range.setStart(startNode, 0);\n range.setEnd(currentNode, 0);\n }\n\n // Use common container of the range to search a common table that covers both start and end node\n const tableStart = range.commonAncestorContainer;\n const newTableSelection = this.parseTableSelection(tableStart, startNode, domHelper);\n\n if (newTableSelection) {\n const lastCo = findCoordinate(\n newTableSelection.parsedTable,\n currentNode,\n domHelper\n );\n\n if (newTableSelection.table != this.state.tableSelection.table) {\n // Move mouse into another table (nest table scenario)\n this.state.tableSelection = newTableSelection;\n this.state.tableSelection.lastCo = lastCo ?? undefined;\n }\n\n const updated = lastCo && this.updateTableSelection(lastCo);\n\n if (hasTableSelection || updated) {\n event.preventDefault();\n }\n } else if (this.editor.getDOMSelection()?.type == 'table') {\n // Move mouse out of table\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted,\n },\n this.state.tableSelection\n );\n }\n }\n };\n\n private onMouseUp() {\n this.detachMouseEvent();\n }\n\n private onDrop = () => {\n this.detachMouseEvent();\n };\n\n private onKeyDown(editor: IEditor, rawEvent: KeyboardEvent) {\n const key = rawEvent.key;\n const selection = editor.getDOMSelection();\n const win = editor.getDocument().defaultView;\n\n switch (selection?.type) {\n case 'image':\n if (!isModifierKey(rawEvent) && !rawEvent.shiftKey && selection.image.parentNode) {\n if (key === 'Escape') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n rawEvent.stopPropagation();\n } else if (key !== 'Delete' && key !== 'Backspace') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n }\n }\n\n if (\n (isModifierKey(rawEvent) || rawEvent.shiftKey) &&\n selection.image &&\n !this.isSafari\n ) {\n const range = selection.image.ownerDocument.createRange();\n range.selectNode(selection.image);\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /* tableSelection */\n );\n }\n break;\n\n case 'range':\n if (key == Up || key == Down || key == Left || key == Right || key == Tab) {\n const start = selection.range.startContainer;\n this.state.tableSelection = this.parseTableSelection(\n start,\n start,\n editor.getDOMHelper()\n );\n\n if (this.state.tableSelection && !rawEvent.defaultPrevented) {\n if (key == Tab) {\n this.handleSelectionInTable(this.getTabKey(rawEvent));\n rawEvent.preventDefault();\n } else {\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n\n case 'table':\n // After a content change event is handled tableSelection state is reset to null\n // Since we have table selection from DOMSelection, we can use it to re-create the tableSelection state\n if (this.state.tableSelection == null) {\n const { table, firstRow, firstColumn, lastRow, lastColumn } = selection;\n\n const parsedTable = parseTableCells(table);\n if (parsedTable) {\n const firstCo = { row: firstRow, col: firstColumn };\n const lastCo = { row: lastRow, col: lastColumn };\n\n // Create the tableSelection with current table info\n this.state.tableSelection = {\n table,\n parsedTable,\n firstCo,\n lastCo,\n startNode: findTableCellElement(parsedTable, firstCo)?.cell || table,\n };\n }\n }\n if (this.state.tableSelection?.lastCo) {\n const { shiftKey, key } = rawEvent;\n\n if (shiftKey && (key == Left || key == Right)) {\n const isRtl =\n win?.getComputedStyle(this.state.tableSelection.table).direction ==\n 'rtl';\n\n this.updateTableSelectionFromKeyboard(\n 0,\n (key == Left ? -1 : 1) * (isRtl ? -1 : 1)\n );\n rawEvent.preventDefault();\n } else if (shiftKey && (key == Up || key == Down)) {\n this.updateTableSelectionFromKeyboard(key == Up ? -1 : 1, 0);\n rawEvent.preventDefault();\n } else if (key != 'Shift' && !isCharacterValue(rawEvent)) {\n if (key == Up || key == Down || key == Left || key == Right) {\n this.setDOMSelection(null /*domSelection*/, this.state.tableSelection);\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n }\n }\n\n private getTabKey(rawEvent: KeyboardEvent) {\n return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';\n }\n\n private handleSelectionInTable(\n key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'TabLeft' | 'TabRight'\n ) {\n if (!this.editor || !this.state.tableSelection) {\n return;\n }\n\n const selection = this.editor.getDOMSelection();\n const domHelper = this.editor.getDOMHelper();\n\n if (selection?.type == 'range') {\n const {\n range: { collapsed, startContainer, endContainer, commonAncestorContainer },\n isReverted,\n } = selection;\n const start = isReverted ? endContainer : startContainer;\n const end: Node | null = isReverted ? startContainer : endContainer;\n const tableSel = this.parseTableSelection(commonAncestorContainer, start, domHelper);\n\n if (!tableSel) {\n return;\n }\n\n let lastCo = findCoordinate(tableSel?.parsedTable, end, domHelper);\n let tabMove = false;\n const { parsedTable, firstCo: oldCo, table } = this.state.tableSelection;\n\n if (lastCo && tableSel.table == table) {\n if (lastCo.col != oldCo.col && (key == Up || key == Down)) {\n const change = key == Up ? -1 : 1;\n const originalTd = findTableCellElement(parsedTable, oldCo)?.cell;\n let td: HTMLTableCellElement | null = null;\n\n lastCo = { row: oldCo.row + change, col: oldCo.col };\n\n while (lastCo.row >= 0 && lastCo.row < parsedTable.length) {\n td = findTableCellElement(parsedTable, lastCo)?.cell || null;\n\n if (td == originalTd) {\n lastCo.row += change;\n } else {\n break;\n }\n }\n\n if (collapsed && td) {\n this.setRangeSelectionInTable(\n td,\n key == Up ? td.childNodes.length : 0,\n this.editor\n );\n } else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {\n this.selectBeforeOrAfterElement(\n this.editor,\n table,\n change == 1 /* after */,\n change != 1 /* setSelectionInNextSiblingElement */\n );\n }\n } else if (key == 'TabLeft' || key == 'TabRight') {\n const reverse = key == 'TabLeft';\n for (\n let step = reverse ? -1 : 1,\n row = lastCo.row ?? 0,\n col = (lastCo.col ?? 0) + step;\n ;\n col += step\n ) {\n if (col < 0 || col >= parsedTable[row].length) {\n row += step;\n if (row < 0) {\n this.selectBeforeOrAfterElement(this.editor, tableSel.table);\n break;\n } else if (row >= parsedTable.length) {\n this.selectBeforeOrAfterElement(\n this.editor,\n tableSel.table,\n true /*after*/\n );\n break;\n }\n col = reverse ? parsedTable[row].length - 1 : 0;\n }\n const cell = parsedTable[row][col];\n\n if (typeof cell != 'string') {\n tabMove = true;\n this.setRangeSelectionInTable(\n cell,\n 0,\n this.editor,\n true /* selectAll */\n );\n lastCo.row = row;\n lastCo.col = col;\n break;\n }\n }\n if (this.editor.getSnapshotsManager().hasNewContent) {\n this.editor.takeSnapshot();\n }\n } else {\n this.state.tableSelection = null;\n }\n\n if (\n collapsed &&\n (lastCo.col != oldCo.col || lastCo.row != oldCo.row) &&\n lastCo.row >= 0 &&\n lastCo.row == parsedTable.length - 1 &&\n lastCo.col == parsedTable[lastCo.row]?.length - 1\n ) {\n this.editor?.announce({ defaultStrings: 'announceOnFocusLastCell' });\n }\n }\n\n if (!collapsed && lastCo && !tabMove) {\n this.state.tableSelection = tableSel;\n this.updateTableSelection(lastCo);\n }\n }\n }\n\n private setRangeSelectionInTable(\n cell: Node,\n nodeOffset: number,\n editor: IEditor,\n selectAll?: boolean\n ) {\n const range = editor.getDocument().createRange();\n if (selectAll && cell.firstChild && cell.lastChild) {\n const cellStart = cell.firstChild;\n const cellEnd = cell.lastChild;\n // Get first deepest editable position in the cell\n const posStart = normalizePos(cellStart, 0);\n // Get last deepest editable position in the cell\n const posEnd = normalizePos(cellEnd, cellEnd.childNodes.length);\n\n range.setStart(posStart.node, posStart.offset);\n range.setEnd(posEnd.node, posEnd.offset);\n\n if (range.toString() === '') {\n range.collapse(true /* toStart */);\n }\n } else {\n // Get deepest editable position in the cell\n const { node, offset } = normalizePos(cell, nodeOffset);\n\n range.setStart(node, offset);\n range.collapse(true /* toStart */);\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n\n private updateTableSelectionFromKeyboard(rowChange: number, colChange: number) {\n if (this.state.tableSelection?.lastCo && this.editor) {\n const { lastCo, parsedTable } = this.state.tableSelection;\n const row = lastCo.row + rowChange;\n const col = lastCo.col + colChange;\n\n if (row >= 0 && row < parsedTable.length && col >= 0 && col < parsedTable[row].length) {\n this.updateTableSelection({ row, col });\n }\n }\n }\n\n private selectBeforeOrAfterElement(\n editor: IEditor,\n element: HTMLElement,\n after?: boolean,\n setSelectionInNextSiblingElement?: boolean\n ) {\n const doc = editor.getDocument();\n const parent = element.parentNode;\n const index = parent && toArray(parent.childNodes).indexOf(element);\n let sibling: Element | undefined | null;\n\n if (parent && index !== null && index >= 0) {\n const range = doc.createRange();\n if (\n setSelectionInNextSiblingElement &&\n (sibling = after ? element.nextElementSibling : element.previousElementSibling) &&\n isNodeOfType(sibling, 'ELEMENT_NODE')\n ) {\n range.selectNodeContents(sibling);\n range.collapse(false /* toStart */);\n } else {\n range.setStart(parent, index + (after ? 1 : 0));\n range.collapse();\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range: range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n }\n\n private getClickingImage(event: UIEvent): HTMLImageElement | null {\n const target = event.target as Node;\n\n return isNodeOfType(target, 'ELEMENT_NODE') && isElementOfType(target, 'img')\n ? target\n : null;\n }\n\n // MacOS will not create a mouseUp event if contextMenu event is not prevent defaulted.\n // Make sure we capture image target even if image is wrapped\n private getContainedTargetImage = (\n event: MouseEvent,\n previousSelection: DOMSelection | null\n ): HTMLImageElement | null => {\n if (!this.isMac || !previousSelection || previousSelection.type !== 'image') {\n return null;\n }\n\n const target = event.target as Node;\n if (\n isNodeOfType(target, 'ELEMENT_NODE') &&\n isElementOfType(target, 'span') &&\n target.firstChild === previousSelection.image\n ) {\n return previousSelection.image;\n }\n return null;\n };\n\n private onFocus = () => {\n if (!this.state.skipReselectOnFocus && this.state.selection) {\n this.setDOMSelection(this.state.selection, this.state.tableSelection);\n }\n\n if (this.state.selection?.type == 'range' && !this.isSafari) {\n // Editor is focused, now we can get live selection. So no need to keep a selection if the selection type is range.\n this.state.selection = null;\n }\n\n if (this.scrollTopCache && this.editor) {\n const sc = this.editor.getScrollContainer();\n sc.scrollTop = this.scrollTopCache;\n this.scrollTopCache = 0;\n }\n };\n\n private onBlur = () => {\n if (this.editor) {\n if (!this.state.selection) {\n this.state.selection = this.editor.getDOMSelection();\n }\n const sc = this.editor.getScrollContainer();\n this.scrollTopCache = sc.scrollTop;\n }\n };\n\n private onSelectionChange = () => {\n if (this.editor?.hasFocus() && !this.editor.isInShadowEdit()) {\n const newSelection = this.editor.getDOMSelection();\n\n //If am image selection changed to a wider range due a keyboard event, we should update the selection\n const selection = this.editor.getDocument().getSelection();\n if (selection && selection.focusNode) {\n const image = isSingleImageInSelection(selection);\n if (newSelection?.type == 'image' && !image) {\n const range = selection.getRangeAt(0);\n this.editor.setDOMSelection({\n type: 'range',\n range,\n isReverted:\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset,\n });\n } else if (newSelection?.type !== 'image' && image) {\n this.editor.setDOMSelection({\n type: 'image',\n image,\n });\n }\n }\n\n // Safari has problem to handle onBlur event. When blur, we cannot get the original selection from editor.\n // So we always save a selection whenever editor has focus. Then after blur, we can still use this cached selection.\n if (newSelection?.type == 'range') {\n if (this.isSafari) {\n this.state.selection = newSelection;\n }\n }\n }\n };\n\n private parseTableSelection(\n tableStart: Node,\n tdStart: Node,\n domHelper: DOMHelper\n ): TableSelectionInfo | null {\n let table: HTMLTableElement | null;\n let parsedTable: ParsedTable | null;\n let firstCo: TableCellCoordinate | null;\n\n if (\n (table = domHelper.findClosestElementAncestor(tableStart, 'table')) &&\n table.isContentEditable &&\n (parsedTable = parseTableCells(table)) &&\n (firstCo = findCoordinate(parsedTable, tdStart, domHelper))\n ) {\n return { table, parsedTable, firstCo, startNode: tdStart };\n } else {\n return null;\n }\n }\n\n private updateTableSelection(lastCo: TableCellCoordinate) {\n if (this.state.tableSelection && this.editor) {\n const {\n table,\n firstCo,\n parsedTable,\n startNode,\n lastCo: oldCo,\n } = this.state.tableSelection;\n\n if (oldCo || firstCo.row != lastCo.row || firstCo.col != lastCo.col) {\n this.state.tableSelection.lastCo = lastCo;\n this.setDOMSelection(\n {\n type: 'table',\n table,\n firstRow: firstCo.row,\n firstColumn: firstCo.col,\n lastRow: lastCo.row,\n lastColumn: lastCo.col,\n tableSelectionInfo: this.state.tableSelection,\n },\n { table, firstCo, lastCo, parsedTable, startNode }\n );\n\n return true;\n }\n }\n\n return false;\n }\n\n private setDOMSelection(\n selection: DOMSelection | null,\n tableSelection: TableSelectionInfo | null\n ) {\n this.editor?.setDOMSelection(selection);\n this.state.tableSelection = tableSelection;\n }\n\n private detachMouseEvent() {\n if (this.state.mouseDisposer) {\n this.state.mouseDisposer();\n this.state.mouseDisposer = undefined;\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of SelectionPlugin.\n * @param option The editor option\n */\nexport function createSelectionPlugin(\n options: EditorOptions\n): PluginWithState<SelectionPluginState> {\n return new SelectionPlugin(options);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SelectionPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/selection/SelectionPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { findCoordinate } from './findCoordinate';\nimport { findTableCellElement } from '../../coreApi/setDOMSelection/findTableCellElement';\nimport { isSingleImageInSelection } from './isSingleImageInSelection';\nimport { normalizePos } from './normalizePos';\nimport {\n getDOMInsertPointRect,\n getNodePositionFromEvent,\n isCharacterValue,\n isElementOfType,\n isModifierKey,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n PluginEvent,\n PluginWithState,\n SelectionPluginState,\n EditorOptions,\n DOMHelper,\n ParsedTable,\n TableSelectionInfo,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst MouseLeftButton = 0;\nconst MouseRightButton = 2;\nconst Up = 'ArrowUp';\nconst Down = 'ArrowDown';\nconst Left = 'ArrowLeft';\nconst Right = 'ArrowRight';\nconst Tab = 'Tab';\n\n/**\n * @internal\n */\nexport const DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n/**\n * @internal\n */\nexport const DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = '#C6C6C6';\n\nclass SelectionPlugin implements PluginWithState<SelectionPluginState> {\n private editor: IEditor | null = null;\n private state: SelectionPluginState;\n private disposer: (() => void) | null = null;\n private logicalRootDisposer: (() => void) | null = null;\n private isSafari = false;\n private isMac = false;\n private scrollTopCache: number = 0;\n\n constructor(options: EditorOptions) {\n this.state = {\n selection: null,\n tableSelection: null,\n imageSelectionBorderColor:\n options.imageSelectionBorderColor ?? DEFAULT_SELECTION_BORDER_COLOR,\n imageSelectionBorderColorDark: options.imageSelectionBorderColor\n ? undefined\n : DEFAULT_SELECTION_BORDER_COLOR,\n tableCellSelectionBackgroundColor:\n options.tableCellSelectionBackgroundColor ??\n DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n tableCellSelectionBackgroundColorDark: options.tableCellSelectionBackgroundColor\n ? undefined\n : DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n };\n }\n\n getName() {\n return 'Selection';\n }\n\n initialize(editor: IEditor) {\n this.editor = editor;\n\n if (!this.state.imageSelectionBorderColorDark && this.state.imageSelectionBorderColor) {\n this.state.imageSelectionBorderColorDark = editor\n .getColorManager()\n .getDarkColor(this.state.imageSelectionBorderColor, undefined, 'border');\n }\n\n if (\n !this.state.tableCellSelectionBackgroundColorDark &&\n this.state.tableCellSelectionBackgroundColor\n ) {\n this.state.tableCellSelectionBackgroundColorDark = editor\n .getColorManager()\n .getDarkColor(\n this.state.tableCellSelectionBackgroundColor,\n undefined,\n 'background'\n );\n }\n\n const env = this.editor.getEnvironment();\n const document = this.editor.getDocument();\n\n this.isSafari = !!env.isSafari;\n this.isMac = !!env.isMac;\n document.addEventListener('selectionchange', this.onSelectionChange);\n if (this.isSafari) {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n }\n\n dispose() {\n this.editor?.getDocument().removeEventListener('selectionchange', this.onSelectionChange);\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n }\n\n this.logicalRootDisposer?.();\n this.logicalRootDisposer = null;\n\n this.detachMouseEvent();\n this.editor = null;\n }\n\n getState(): SelectionPluginState {\n return this.state;\n }\n\n onPluginEvent(event: PluginEvent) {\n if (!this.editor) {\n return;\n }\n\n switch (event.eventType) {\n case 'mouseDown':\n this.onMouseDown(this.editor, event.rawEvent);\n break;\n\n case 'mouseUp':\n this.onMouseUp();\n break;\n\n case 'keyDown':\n this.onKeyDown(this.editor, event.rawEvent);\n break;\n\n case 'contentChanged':\n this.state.tableSelection = null;\n break;\n\n case 'scroll':\n if (!this.editor.hasFocus()) {\n this.scrollTopCache = event.scrollContainer.scrollTop;\n }\n break;\n\n case 'logicalRootChanged':\n this.logicalRootDisposer?.();\n if (this.isSafari) {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n break;\n }\n }\n\n private onMouseDown(editor: IEditor, rawEvent: MouseEvent) {\n const selection = editor.getDOMSelection();\n let image: HTMLImageElement | null;\n\n // Image selection\n if (\n selection?.type == 'image' &&\n (rawEvent.button == MouseLeftButton ||\n (rawEvent.button == MouseRightButton &&\n !this.getClickingImage(rawEvent) &&\n !this.getContainedTargetImage(rawEvent, selection)))\n ) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n if (\n (image =\n this.getClickingImage(rawEvent) ??\n this.getContainedTargetImage(rawEvent, selection)) &&\n image.isContentEditable\n ) {\n this.setDOMSelection(\n {\n type: 'image',\n image: image,\n },\n null\n );\n return;\n }\n\n // Table selection\n if (selection?.type == 'table' && rawEvent.button == MouseLeftButton) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n let tableSelection: TableSelectionInfo | null;\n const target = rawEvent.target as Node;\n\n if (\n target &&\n rawEvent.button == MouseLeftButton &&\n (tableSelection = this.parseTableSelection(target, target, editor.getDOMHelper()))\n ) {\n this.state.tableSelection = tableSelection;\n\n if (rawEvent.detail >= 3) {\n const lastCo = findCoordinate(\n tableSelection.parsedTable,\n rawEvent.target as Node,\n editor.getDOMHelper()\n );\n\n if (lastCo) {\n // Triple click, select the current cell\n tableSelection.lastCo = lastCo;\n this.updateTableSelection(lastCo);\n rawEvent.preventDefault();\n }\n }\n\n this.state.mouseDisposer?.();\n this.state.mouseDisposer = editor.attachDomEvent({\n mousemove: {\n beforeDispatch: this.onMouseMove,\n },\n });\n }\n }\n\n private onMouseMove = (event: Event) => {\n if (this.editor && this.state.tableSelection) {\n const hasTableSelection = !!this.state.tableSelection.lastCo;\n const currentNode = event.target as Node;\n const domHelper = this.editor.getDOMHelper();\n\n const range = this.editor.getDocument().createRange();\n const startNode = this.state.tableSelection.startNode;\n const isReverted =\n currentNode.compareDocumentPosition(startNode) == Node.DOCUMENT_POSITION_FOLLOWING;\n\n if (isReverted) {\n range.setStart(currentNode, 0);\n range.setEnd(\n startNode,\n isNodeOfType(startNode, 'TEXT_NODE')\n ? startNode.nodeValue?.length ?? 0\n : startNode.childNodes.length\n );\n } else {\n range.setStart(startNode, 0);\n range.setEnd(currentNode, 0);\n }\n\n // Use common container of the range to search a common table that covers both start and end node\n const tableStart = range.commonAncestorContainer;\n const newTableSelection = this.parseTableSelection(tableStart, startNode, domHelper);\n\n if (newTableSelection) {\n const lastCo = findCoordinate(\n newTableSelection.parsedTable,\n currentNode,\n domHelper\n );\n\n if (newTableSelection.table != this.state.tableSelection.table) {\n // Move mouse into another table (nest table scenario)\n this.state.tableSelection = newTableSelection;\n this.state.tableSelection.lastCo = lastCo ?? undefined;\n }\n\n const updated = lastCo && this.updateTableSelection(lastCo);\n\n if (hasTableSelection || updated) {\n event.preventDefault();\n }\n } else if (this.editor.getDOMSelection()?.type == 'table') {\n // Move mouse out of table\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted,\n },\n this.state.tableSelection\n );\n }\n }\n };\n\n private onMouseUp() {\n this.detachMouseEvent();\n }\n\n private onDrop = () => {\n this.detachMouseEvent();\n };\n\n private onKeyDown(editor: IEditor, rawEvent: KeyboardEvent) {\n const key = rawEvent.key;\n const selection = editor.getDOMSelection();\n const win = editor.getDocument().defaultView;\n\n switch (selection?.type) {\n case 'image':\n if (!isModifierKey(rawEvent) && !rawEvent.shiftKey && selection.image.parentNode) {\n if (key === 'Escape') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n rawEvent.stopPropagation();\n } else if (key !== 'Delete' && key !== 'Backspace') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n }\n }\n\n if (\n (isModifierKey(rawEvent) || rawEvent.shiftKey) &&\n selection.image &&\n !this.isSafari\n ) {\n const range = selection.image.ownerDocument.createRange();\n range.selectNode(selection.image);\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /* tableSelection */\n );\n }\n break;\n\n case 'range':\n if (key == Up || key == Down || key == Left || key == Right || key == Tab) {\n const start = selection.range.startContainer;\n this.state.tableSelection = this.parseTableSelection(\n start,\n start,\n editor.getDOMHelper()\n );\n\n if (this.state.tableSelection && !rawEvent.defaultPrevented) {\n if (key == Tab) {\n this.handleSelectionInTable(this.getTabKey(rawEvent));\n rawEvent.preventDefault();\n } else {\n win?.requestAnimationFrame(() =>\n this.handleSelectionInTable(key, selection.range)\n );\n }\n }\n }\n break;\n\n case 'table':\n // After a content change event is handled tableSelection state is reset to null\n // Since we have table selection from DOMSelection, we can use it to re-create the tableSelection state\n if (this.state.tableSelection == null) {\n const { table, firstRow, firstColumn, lastRow, lastColumn } = selection;\n\n const parsedTable = parseTableCells(table);\n if (parsedTable) {\n const firstCo = { row: firstRow, col: firstColumn };\n const lastCo = { row: lastRow, col: lastColumn };\n\n // Create the tableSelection with current table info\n this.state.tableSelection = {\n table,\n parsedTable,\n firstCo,\n lastCo,\n startNode: findTableCellElement(parsedTable, firstCo)?.cell || table,\n };\n }\n }\n if (this.state.tableSelection?.lastCo) {\n const { shiftKey, key } = rawEvent;\n\n if (shiftKey && (key == Left || key == Right)) {\n const isRtl =\n win?.getComputedStyle(this.state.tableSelection.table).direction ==\n 'rtl';\n\n this.updateTableSelectionFromKeyboard(\n 0,\n (key == Left ? -1 : 1) * (isRtl ? -1 : 1)\n );\n rawEvent.preventDefault();\n } else if (shiftKey && (key == Up || key == Down)) {\n this.updateTableSelectionFromKeyboard(key == Up ? -1 : 1, 0);\n rawEvent.preventDefault();\n } else if (key != 'Shift' && !isCharacterValue(rawEvent)) {\n if (key == Up || key == Down || key == Left || key == Right) {\n this.setDOMSelection(null /*domSelection*/, this.state.tableSelection);\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n }\n }\n\n private getTabKey(rawEvent: KeyboardEvent) {\n return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';\n }\n\n private handleSelectionInTable(\n key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'TabLeft' | 'TabRight',\n rangeBeforeChange?: Range\n ) {\n if (!this.editor || !this.state.tableSelection) {\n return;\n }\n\n const selection = this.editor.getDOMSelection();\n const domHelper = this.editor.getDOMHelper();\n\n if (selection?.type == 'range') {\n const {\n range: { collapsed, startContainer, endContainer, commonAncestorContainer },\n isReverted,\n } = selection;\n const start = isReverted ? endContainer : startContainer;\n const end: Node | null = isReverted ? startContainer : endContainer;\n const tableSel = this.parseTableSelection(commonAncestorContainer, start, domHelper);\n\n if (!tableSel) {\n return;\n }\n\n let lastCo = findCoordinate(tableSel?.parsedTable, end, domHelper);\n let tabMove = false;\n const { parsedTable, firstCo: oldCo, table } = this.state.tableSelection;\n\n if (lastCo && tableSel.table == table) {\n if (lastCo.col != oldCo.col && (key == Up || key == Down)) {\n const change = key == Up ? -1 : 1;\n const originalTd = findTableCellElement(parsedTable, oldCo)?.cell;\n let td: HTMLTableCellElement | null = null;\n\n lastCo = { row: oldCo.row + change, col: oldCo.col };\n\n while (lastCo.row >= 0 && lastCo.row < parsedTable.length) {\n td = findTableCellElement(parsedTable, lastCo)?.cell || null;\n\n if (td == originalTd) {\n lastCo.row += change;\n } else {\n break;\n }\n }\n\n if (collapsed && td) {\n const textOffset =\n (key == 'ArrowUp' || key == 'ArrowDown') && rangeBeforeChange\n ? this.getTextOffset(\n this.editor,\n rangeBeforeChange,\n td,\n key == 'ArrowUp'\n )\n : null;\n if (textOffset) {\n this.setRangeSelectionInTable(\n textOffset.node,\n textOffset.offset,\n this.editor,\n false /* selectAll */\n );\n } else {\n this.setRangeSelectionInTable(\n td,\n 0,\n this.editor,\n false /* selectAll */\n );\n }\n } else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {\n this.selectBeforeOrAfterElement(\n this.editor,\n table,\n change == 1 /* after */,\n change != 1 /* setSelectionInNextSiblingElement */\n );\n }\n } else if (key == 'TabLeft' || key == 'TabRight') {\n const reverse = key == 'TabLeft';\n for (\n let step = reverse ? -1 : 1,\n row = lastCo.row ?? 0,\n col = (lastCo.col ?? 0) + step;\n ;\n col += step\n ) {\n if (col < 0 || col >= parsedTable[row].length) {\n row += step;\n if (row < 0) {\n this.selectBeforeOrAfterElement(this.editor, tableSel.table);\n break;\n } else if (row >= parsedTable.length) {\n this.selectBeforeOrAfterElement(\n this.editor,\n tableSel.table,\n true /*after*/\n );\n break;\n }\n col = reverse ? parsedTable[row].length - 1 : 0;\n }\n const cell = parsedTable[row][col];\n\n if (typeof cell != 'string') {\n tabMove = true;\n this.setRangeSelectionInTable(\n cell,\n 0,\n this.editor,\n true /* selectAll */\n );\n lastCo.row = row;\n lastCo.col = col;\n break;\n }\n }\n if (this.editor.getSnapshotsManager().hasNewContent) {\n this.editor.takeSnapshot();\n }\n } else {\n this.state.tableSelection = null;\n }\n\n if (\n collapsed &&\n (lastCo.col != oldCo.col || lastCo.row != oldCo.row) &&\n lastCo.row >= 0 &&\n lastCo.row == parsedTable.length - 1 &&\n lastCo.col == parsedTable[lastCo.row]?.length - 1\n ) {\n this.editor?.announce({ defaultStrings: 'announceOnFocusLastCell' });\n }\n }\n\n if (!collapsed && lastCo && !tabMove) {\n this.state.tableSelection = tableSel;\n this.updateTableSelection(lastCo);\n }\n }\n }\n\n private getTextOffset(editor: IEditor, range: Range, td: HTMLElement, isKeyUp: boolean) {\n const doc = editor.getDocument();\n const cursorRect = range\n ? getDOMInsertPointRect(doc, {\n node: range.startContainer,\n offset: range.startOffset,\n })\n : undefined;\n const rect = td?.getBoundingClientRect();\n const textOffset =\n cursorRect && rect\n ? getNodePositionFromEvent(\n doc,\n editor.getDOMHelper(),\n cursorRect.left,\n isKeyUp ? rect.top - 1 : rect.top + 1\n )\n : null;\n return textOffset;\n }\n\n private setRangeSelectionInTable(\n cell: Node,\n nodeOffset: number,\n editor: IEditor,\n selectAll?: boolean\n ) {\n const doc = editor.getDocument();\n const range = doc.createRange();\n if (selectAll && cell.firstChild && cell.lastChild) {\n const cellStart = cell.firstChild;\n const cellEnd = cell.lastChild;\n // Get first deepest editable position in the cell\n const posStart = normalizePos(cellStart, 0);\n // Get last deepest editable position in the cell\n const posEnd = normalizePos(cellEnd, cellEnd.childNodes.length);\n\n range.setStart(posStart.node, posStart.offset);\n range.setEnd(posEnd.node, posEnd.offset);\n\n if (range.toString() === '') {\n range.collapse(true /* toStart */);\n }\n } else {\n // Get deepest editable position in the cell\n const { node, offset } = normalizePos(cell, nodeOffset);\n range.setStart(node, offset);\n range.collapse(true /* toStart */);\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n\n private updateTableSelectionFromKeyboard(rowChange: number, colChange: number) {\n if (this.state.tableSelection?.lastCo && this.editor) {\n const { lastCo, parsedTable } = this.state.tableSelection;\n const row = lastCo.row + rowChange;\n const col = lastCo.col + colChange;\n\n if (row >= 0 && row < parsedTable.length && col >= 0 && col < parsedTable[row].length) {\n this.updateTableSelection({ row, col });\n }\n }\n }\n\n private selectBeforeOrAfterElement(\n editor: IEditor,\n element: HTMLElement,\n after?: boolean,\n setSelectionInNextSiblingElement?: boolean\n ) {\n const doc = editor.getDocument();\n const parent = element.parentNode;\n const index = parent && toArray(parent.childNodes).indexOf(element);\n let sibling: Element | undefined | null;\n\n if (parent && index !== null && index >= 0) {\n const range = doc.createRange();\n if (\n setSelectionInNextSiblingElement &&\n (sibling = after ? element.nextElementSibling : element.previousElementSibling) &&\n isNodeOfType(sibling, 'ELEMENT_NODE')\n ) {\n range.selectNodeContents(sibling);\n range.collapse(false /* toStart */);\n } else {\n range.setStart(parent, index + (after ? 1 : 0));\n range.collapse();\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range: range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n }\n\n private getClickingImage(event: UIEvent): HTMLImageElement | null {\n const target = event.target as Node;\n\n return isNodeOfType(target, 'ELEMENT_NODE') && isElementOfType(target, 'img')\n ? target\n : null;\n }\n\n // MacOS will not create a mouseUp event if contextMenu event is not prevent defaulted.\n // Make sure we capture image target even if image is wrapped\n private getContainedTargetImage = (\n event: MouseEvent,\n previousSelection: DOMSelection | null\n ): HTMLImageElement | null => {\n if (!this.isMac || !previousSelection || previousSelection.type !== 'image') {\n return null;\n }\n\n const target = event.target as Node;\n if (\n isNodeOfType(target, 'ELEMENT_NODE') &&\n isElementOfType(target, 'span') &&\n target.firstChild === previousSelection.image\n ) {\n return previousSelection.image;\n }\n return null;\n };\n\n private onFocus = () => {\n if (!this.state.skipReselectOnFocus && this.state.selection) {\n this.setDOMSelection(this.state.selection, this.state.tableSelection);\n }\n\n if (this.state.selection?.type == 'range' && !this.isSafari) {\n // Editor is focused, now we can get live selection. So no need to keep a selection if the selection type is range.\n this.state.selection = null;\n }\n\n if (this.scrollTopCache && this.editor) {\n const sc = this.editor.getScrollContainer();\n sc.scrollTop = this.scrollTopCache;\n this.scrollTopCache = 0;\n }\n };\n\n private onBlur = () => {\n if (this.editor) {\n if (!this.state.selection) {\n this.state.selection = this.editor.getDOMSelection();\n }\n const sc = this.editor.getScrollContainer();\n this.scrollTopCache = sc.scrollTop;\n }\n };\n\n private onSelectionChange = () => {\n if (this.editor?.hasFocus() && !this.editor.isInShadowEdit()) {\n const newSelection = this.editor.getDOMSelection();\n\n //If am image selection changed to a wider range due a keyboard event, we should update the selection\n const selection = this.editor.getDocument().getSelection();\n if (selection && selection.focusNode) {\n const image = isSingleImageInSelection(selection);\n if (newSelection?.type == 'image' && !image) {\n const range = selection.getRangeAt(0);\n this.editor.setDOMSelection({\n type: 'range',\n range,\n isReverted:\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset,\n });\n } else if (newSelection?.type !== 'image' && image) {\n this.editor.setDOMSelection({\n type: 'image',\n image,\n });\n }\n }\n\n // Safari has problem to handle onBlur event. When blur, we cannot get the original selection from editor.\n // So we always save a selection whenever editor has focus. Then after blur, we can still use this cached selection.\n if (newSelection?.type == 'range') {\n if (this.isSafari) {\n this.state.selection = newSelection;\n }\n }\n }\n };\n\n private parseTableSelection(\n tableStart: Node,\n tdStart: Node,\n domHelper: DOMHelper\n ): TableSelectionInfo | null {\n let table: HTMLTableElement | null;\n let parsedTable: ParsedTable | null;\n let firstCo: TableCellCoordinate | null;\n\n if (\n (table = domHelper.findClosestElementAncestor(tableStart, 'table')) &&\n table.isContentEditable &&\n (parsedTable = parseTableCells(table)) &&\n (firstCo = findCoordinate(parsedTable, tdStart, domHelper))\n ) {\n return { table, parsedTable, firstCo, startNode: tdStart };\n } else {\n return null;\n }\n }\n\n private updateTableSelection(lastCo: TableCellCoordinate) {\n if (this.state.tableSelection && this.editor) {\n const {\n table,\n firstCo,\n parsedTable,\n startNode,\n lastCo: oldCo,\n } = this.state.tableSelection;\n\n if (oldCo || firstCo.row != lastCo.row || firstCo.col != lastCo.col) {\n this.state.tableSelection.lastCo = lastCo;\n this.setDOMSelection(\n {\n type: 'table',\n table,\n firstRow: firstCo.row,\n firstColumn: firstCo.col,\n lastRow: lastCo.row,\n lastColumn: lastCo.col,\n tableSelectionInfo: this.state.tableSelection,\n },\n { table, firstCo, lastCo, parsedTable, startNode }\n );\n\n return true;\n }\n }\n\n return false;\n }\n\n private setDOMSelection(\n selection: DOMSelection | null,\n tableSelection: TableSelectionInfo | null\n ) {\n this.editor?.setDOMSelection(selection);\n this.state.tableSelection = tableSelection;\n }\n\n private detachMouseEvent() {\n if (this.state.mouseDisposer) {\n this.state.mouseDisposer();\n this.state.mouseDisposer = undefined;\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of SelectionPlugin.\n * @param option The editor option\n */\nexport function createSelectionPlugin(\n options: EditorOptions\n): PluginWithState<SelectionPluginState> {\n return new SelectionPlugin(options);\n}\n"]}
|
|
@@ -21,7 +21,8 @@ var TextMutationObserverImpl = /** @class */ (function () {
|
|
|
21
21
|
continue;
|
|
22
22
|
}
|
|
23
23
|
else if (!includedNodes.has(target)) {
|
|
24
|
-
if (
|
|
24
|
+
if (!_this.domHelper.isNodeInEditor(target) ||
|
|
25
|
+
findClosestEntityWrapper(target, _this.domHelper) ||
|
|
25
26
|
findClosestBlockEntityContainer(target, _this.domHelper)) {
|
|
26
27
|
ignoredNodes.add(target);
|
|
27
28
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textMutationObserver.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/textMutationObserver.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"textMutationObserver.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/textMutationObserver.ts"],"names":[],"mappings":"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","sourcesContent":["import { createDOMHelper } from '../../editor/core/DOMHelperImpl';\nimport {\n findClosestBlockEntityContainer,\n findClosestEntityWrapper,\n isNodeOfType,\n} from 'roosterjs-content-model-dom';\nimport type { DOMHelper, TextMutationObserver } from 'roosterjs-content-model-types';\nimport type { Mutation } from './MutationType';\n\nclass TextMutationObserverImpl implements TextMutationObserver {\n private observer: MutationObserver;\n private domHelper: DOMHelper;\n\n constructor(\n private contentDiv: HTMLDivElement,\n private onMutation: (mutation: Mutation) => void\n ) {\n this.observer = new MutationObserver(this.onMutationInternal);\n this.domHelper = createDOMHelper(contentDiv);\n }\n\n startObserving() {\n this.observer.observe(this.contentDiv, {\n subtree: true,\n childList: true,\n attributes: true,\n characterData: true,\n });\n }\n\n stopObserving() {\n this.observer.disconnect();\n }\n\n flushMutations(ignoreMutations?: boolean) {\n const mutations = this.observer.takeRecords();\n\n if (!ignoreMutations) {\n this.onMutationInternal(mutations);\n }\n }\n\n private onMutationInternal = (mutations: MutationRecord[]) => {\n let canHandle = true;\n let firstTarget: Node | null = null;\n let lastTextChangeNode: Node | null = null;\n let addedNodes: Node[] = [];\n let removedNodes: Node[] = [];\n let reconcileText = false;\n\n const ignoredNodes = new Set<Node>();\n const includedNodes = new Set<Node>();\n\n for (let i = 0; i < mutations.length && canHandle; i++) {\n const mutation = mutations[i];\n const target = mutation.target;\n\n if (ignoredNodes.has(target)) {\n continue;\n } else if (!includedNodes.has(target)) {\n if (\n !this.domHelper.isNodeInEditor(target) ||\n findClosestEntityWrapper(target, this.domHelper) ||\n findClosestBlockEntityContainer(target, this.domHelper)\n ) {\n ignoredNodes.add(target);\n\n continue;\n } else {\n includedNodes.add(target);\n }\n }\n\n switch (mutation.type) {\n case 'attributes':\n if (this.domHelper.isNodeInEditor(target, true /*excludingSelf*/)) {\n if (\n mutation.attributeName == 'id' &&\n isNodeOfType(target, 'ELEMENT_NODE')\n ) {\n this.onMutation({ type: 'elementId', element: target });\n } else {\n // We cannot handle attributes changes on editor content for now\n canHandle = false;\n }\n }\n break;\n\n case 'characterData':\n if (lastTextChangeNode && lastTextChangeNode != mutation.target) {\n // Multiple text nodes got changed, we don't know how to handle it\n canHandle = false;\n } else {\n lastTextChangeNode = mutation.target;\n reconcileText = true;\n }\n break;\n\n case 'childList':\n if (!firstTarget) {\n firstTarget = mutation.target;\n } else if (firstTarget != mutation.target) {\n canHandle = false;\n }\n\n if (canHandle) {\n addedNodes = addedNodes.concat(Array.from(mutation.addedNodes));\n removedNodes = removedNodes.concat(Array.from(mutation.removedNodes));\n }\n\n break;\n }\n }\n\n if (canHandle) {\n if (addedNodes.length > 0 || removedNodes.length > 0) {\n this.onMutation({\n type: 'childList',\n addedNodes,\n removedNodes,\n });\n }\n\n if (reconcileText) {\n this.onMutation({ type: 'text' });\n }\n } else {\n this.onMutation({ type: 'unknown' });\n }\n };\n}\n\n/**\n * @internal\n */\nexport function createTextMutationObserver(\n contentDiv: HTMLDivElement,\n onMutation: (mutation: Mutation) => void\n): TextMutationObserver {\n return new TextMutationObserverImpl(contentDiv, onMutation);\n}\n"]}
|
|
@@ -2,7 +2,7 @@ import { findCoordinate } from './findCoordinate';
|
|
|
2
2
|
import { findTableCellElement } from '../../coreApi/setDOMSelection/findTableCellElement';
|
|
3
3
|
import { isSingleImageInSelection } from './isSingleImageInSelection';
|
|
4
4
|
import { normalizePos } from './normalizePos';
|
|
5
|
-
import { isCharacterValue, isElementOfType, isModifierKey, isNodeOfType, parseTableCells, toArray, } from 'roosterjs-content-model-dom';
|
|
5
|
+
import { getDOMInsertPointRect, getNodePositionFromEvent, isCharacterValue, isElementOfType, isModifierKey, isNodeOfType, parseTableCells, toArray, } from 'roosterjs-content-model-dom';
|
|
6
6
|
var MouseLeftButton = 0;
|
|
7
7
|
var MouseRightButton = 2;
|
|
8
8
|
var Up = 'ArrowUp';
|
|
@@ -340,7 +340,9 @@ var SelectionPlugin = /** @class */ (function () {
|
|
|
340
340
|
rawEvent.preventDefault();
|
|
341
341
|
}
|
|
342
342
|
else {
|
|
343
|
-
win === null || win === void 0 ? void 0 : win.requestAnimationFrame(function () {
|
|
343
|
+
win === null || win === void 0 ? void 0 : win.requestAnimationFrame(function () {
|
|
344
|
+
return _this.handleSelectionInTable(key, selection.range);
|
|
345
|
+
});
|
|
344
346
|
}
|
|
345
347
|
}
|
|
346
348
|
}
|
|
@@ -389,7 +391,7 @@ var SelectionPlugin = /** @class */ (function () {
|
|
|
389
391
|
SelectionPlugin.prototype.getTabKey = function (rawEvent) {
|
|
390
392
|
return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';
|
|
391
393
|
};
|
|
392
|
-
SelectionPlugin.prototype.handleSelectionInTable = function (key) {
|
|
394
|
+
SelectionPlugin.prototype.handleSelectionInTable = function (key, rangeBeforeChange) {
|
|
393
395
|
var _a, _b, _c, _d, _e, _f;
|
|
394
396
|
if (!this.editor || !this.state.tableSelection) {
|
|
395
397
|
return;
|
|
@@ -423,7 +425,15 @@ var SelectionPlugin = /** @class */ (function () {
|
|
|
423
425
|
}
|
|
424
426
|
}
|
|
425
427
|
if (collapsed && td) {
|
|
426
|
-
|
|
428
|
+
var textOffset = (key == 'ArrowUp' || key == 'ArrowDown') && rangeBeforeChange
|
|
429
|
+
? this.getTextOffset(this.editor, rangeBeforeChange, td, key == 'ArrowUp')
|
|
430
|
+
: null;
|
|
431
|
+
if (textOffset) {
|
|
432
|
+
this.setRangeSelectionInTable(textOffset.node, textOffset.offset, this.editor, false /* selectAll */);
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
this.setRangeSelectionInTable(td, 0, this.editor, false /* selectAll */);
|
|
436
|
+
}
|
|
427
437
|
}
|
|
428
438
|
else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {
|
|
429
439
|
this.selectBeforeOrAfterElement(this.editor, table, change == 1 /* after */, change != 1 /* setSelectionInNextSiblingElement */);
|
|
@@ -474,8 +484,23 @@ var SelectionPlugin = /** @class */ (function () {
|
|
|
474
484
|
}
|
|
475
485
|
}
|
|
476
486
|
};
|
|
487
|
+
SelectionPlugin.prototype.getTextOffset = function (editor, range, td, isKeyUp) {
|
|
488
|
+
var doc = editor.getDocument();
|
|
489
|
+
var cursorRect = range
|
|
490
|
+
? getDOMInsertPointRect(doc, {
|
|
491
|
+
node: range.startContainer,
|
|
492
|
+
offset: range.startOffset,
|
|
493
|
+
})
|
|
494
|
+
: undefined;
|
|
495
|
+
var rect = td === null || td === void 0 ? void 0 : td.getBoundingClientRect();
|
|
496
|
+
var textOffset = cursorRect && rect
|
|
497
|
+
? getNodePositionFromEvent(doc, editor.getDOMHelper(), cursorRect.left, isKeyUp ? rect.top - 1 : rect.top + 1)
|
|
498
|
+
: null;
|
|
499
|
+
return textOffset;
|
|
500
|
+
};
|
|
477
501
|
SelectionPlugin.prototype.setRangeSelectionInTable = function (cell, nodeOffset, editor, selectAll) {
|
|
478
|
-
var
|
|
502
|
+
var doc = editor.getDocument();
|
|
503
|
+
var range = doc.createRange();
|
|
479
504
|
if (selectAll && cell.firstChild && cell.lastChild) {
|
|
480
505
|
var cellStart = cell.firstChild;
|
|
481
506
|
var cellEnd = cell.lastChild;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/selection/SelectionPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { findCoordinate } from './findCoordinate';\nimport { findTableCellElement } from '../../coreApi/setDOMSelection/findTableCellElement';\nimport { isSingleImageInSelection } from './isSingleImageInSelection';\nimport { normalizePos } from './normalizePos';\nimport {\n isCharacterValue,\n isElementOfType,\n isModifierKey,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n PluginEvent,\n PluginWithState,\n SelectionPluginState,\n EditorOptions,\n DOMHelper,\n ParsedTable,\n TableSelectionInfo,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst MouseLeftButton = 0;\nconst MouseRightButton = 2;\nconst Up = 'ArrowUp';\nconst Down = 'ArrowDown';\nconst Left = 'ArrowLeft';\nconst Right = 'ArrowRight';\nconst Tab = 'Tab';\n\n/**\n * @internal\n */\nexport const DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n/**\n * @internal\n */\nexport const DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = '#C6C6C6';\n\nclass SelectionPlugin implements PluginWithState<SelectionPluginState> {\n private editor: IEditor | null = null;\n private state: SelectionPluginState;\n private disposer: (() => void) | null = null;\n private logicalRootDisposer: (() => void) | null = null;\n private isSafari = false;\n private isMac = false;\n private scrollTopCache: number = 0;\n\n constructor(options: EditorOptions) {\n this.state = {\n selection: null,\n tableSelection: null,\n imageSelectionBorderColor:\n options.imageSelectionBorderColor ?? DEFAULT_SELECTION_BORDER_COLOR,\n imageSelectionBorderColorDark: options.imageSelectionBorderColor\n ? undefined\n : DEFAULT_SELECTION_BORDER_COLOR,\n tableCellSelectionBackgroundColor:\n options.tableCellSelectionBackgroundColor ??\n DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n tableCellSelectionBackgroundColorDark: options.tableCellSelectionBackgroundColor\n ? undefined\n : DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n };\n }\n\n getName() {\n return 'Selection';\n }\n\n initialize(editor: IEditor) {\n this.editor = editor;\n\n if (!this.state.imageSelectionBorderColorDark && this.state.imageSelectionBorderColor) {\n this.state.imageSelectionBorderColorDark = editor\n .getColorManager()\n .getDarkColor(this.state.imageSelectionBorderColor, undefined, 'border');\n }\n\n if (\n !this.state.tableCellSelectionBackgroundColorDark &&\n this.state.tableCellSelectionBackgroundColor\n ) {\n this.state.tableCellSelectionBackgroundColorDark = editor\n .getColorManager()\n .getDarkColor(\n this.state.tableCellSelectionBackgroundColor,\n undefined,\n 'background'\n );\n }\n\n const env = this.editor.getEnvironment();\n const document = this.editor.getDocument();\n\n this.isSafari = !!env.isSafari;\n this.isMac = !!env.isMac;\n document.addEventListener('selectionchange', this.onSelectionChange);\n if (this.isSafari) {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n }\n\n dispose() {\n this.editor?.getDocument().removeEventListener('selectionchange', this.onSelectionChange);\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n }\n\n this.logicalRootDisposer?.();\n this.logicalRootDisposer = null;\n\n this.detachMouseEvent();\n this.editor = null;\n }\n\n getState(): SelectionPluginState {\n return this.state;\n }\n\n onPluginEvent(event: PluginEvent) {\n if (!this.editor) {\n return;\n }\n\n switch (event.eventType) {\n case 'mouseDown':\n this.onMouseDown(this.editor, event.rawEvent);\n break;\n\n case 'mouseUp':\n this.onMouseUp();\n break;\n\n case 'keyDown':\n this.onKeyDown(this.editor, event.rawEvent);\n break;\n\n case 'contentChanged':\n this.state.tableSelection = null;\n break;\n\n case 'scroll':\n if (!this.editor.hasFocus()) {\n this.scrollTopCache = event.scrollContainer.scrollTop;\n }\n break;\n\n case 'logicalRootChanged':\n this.logicalRootDisposer?.();\n if (this.isSafari) {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n break;\n }\n }\n\n private onMouseDown(editor: IEditor, rawEvent: MouseEvent) {\n const selection = editor.getDOMSelection();\n let image: HTMLImageElement | null;\n\n // Image selection\n if (\n selection?.type == 'image' &&\n (rawEvent.button == MouseLeftButton ||\n (rawEvent.button == MouseRightButton &&\n !this.getClickingImage(rawEvent) &&\n !this.getContainedTargetImage(rawEvent, selection)))\n ) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n if (\n (image =\n this.getClickingImage(rawEvent) ??\n this.getContainedTargetImage(rawEvent, selection)) &&\n image.isContentEditable\n ) {\n this.setDOMSelection(\n {\n type: 'image',\n image: image,\n },\n null\n );\n return;\n }\n\n // Table selection\n if (selection?.type == 'table' && rawEvent.button == MouseLeftButton) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n let tableSelection: TableSelectionInfo | null;\n const target = rawEvent.target as Node;\n\n if (\n target &&\n rawEvent.button == MouseLeftButton &&\n (tableSelection = this.parseTableSelection(target, target, editor.getDOMHelper()))\n ) {\n this.state.tableSelection = tableSelection;\n\n if (rawEvent.detail >= 3) {\n const lastCo = findCoordinate(\n tableSelection.parsedTable,\n rawEvent.target as Node,\n editor.getDOMHelper()\n );\n\n if (lastCo) {\n // Triple click, select the current cell\n tableSelection.lastCo = lastCo;\n this.updateTableSelection(lastCo);\n rawEvent.preventDefault();\n }\n }\n\n this.state.mouseDisposer?.();\n this.state.mouseDisposer = editor.attachDomEvent({\n mousemove: {\n beforeDispatch: this.onMouseMove,\n },\n });\n }\n }\n\n private onMouseMove = (event: Event) => {\n if (this.editor && this.state.tableSelection) {\n const hasTableSelection = !!this.state.tableSelection.lastCo;\n const currentNode = event.target as Node;\n const domHelper = this.editor.getDOMHelper();\n\n const range = this.editor.getDocument().createRange();\n const startNode = this.state.tableSelection.startNode;\n const isReverted =\n currentNode.compareDocumentPosition(startNode) == Node.DOCUMENT_POSITION_FOLLOWING;\n\n if (isReverted) {\n range.setStart(currentNode, 0);\n range.setEnd(\n startNode,\n isNodeOfType(startNode, 'TEXT_NODE')\n ? startNode.nodeValue?.length ?? 0\n : startNode.childNodes.length\n );\n } else {\n range.setStart(startNode, 0);\n range.setEnd(currentNode, 0);\n }\n\n // Use common container of the range to search a common table that covers both start and end node\n const tableStart = range.commonAncestorContainer;\n const newTableSelection = this.parseTableSelection(tableStart, startNode, domHelper);\n\n if (newTableSelection) {\n const lastCo = findCoordinate(\n newTableSelection.parsedTable,\n currentNode,\n domHelper\n );\n\n if (newTableSelection.table != this.state.tableSelection.table) {\n // Move mouse into another table (nest table scenario)\n this.state.tableSelection = newTableSelection;\n this.state.tableSelection.lastCo = lastCo ?? undefined;\n }\n\n const updated = lastCo && this.updateTableSelection(lastCo);\n\n if (hasTableSelection || updated) {\n event.preventDefault();\n }\n } else if (this.editor.getDOMSelection()?.type == 'table') {\n // Move mouse out of table\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted,\n },\n this.state.tableSelection\n );\n }\n }\n };\n\n private onMouseUp() {\n this.detachMouseEvent();\n }\n\n private onDrop = () => {\n this.detachMouseEvent();\n };\n\n private onKeyDown(editor: IEditor, rawEvent: KeyboardEvent) {\n const key = rawEvent.key;\n const selection = editor.getDOMSelection();\n const win = editor.getDocument().defaultView;\n\n switch (selection?.type) {\n case 'image':\n if (!isModifierKey(rawEvent) && !rawEvent.shiftKey && selection.image.parentNode) {\n if (key === 'Escape') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n rawEvent.stopPropagation();\n } else if (key !== 'Delete' && key !== 'Backspace') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n }\n }\n\n if (\n (isModifierKey(rawEvent) || rawEvent.shiftKey) &&\n selection.image &&\n !this.isSafari\n ) {\n const range = selection.image.ownerDocument.createRange();\n range.selectNode(selection.image);\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /* tableSelection */\n );\n }\n break;\n\n case 'range':\n if (key == Up || key == Down || key == Left || key == Right || key == Tab) {\n const start = selection.range.startContainer;\n this.state.tableSelection = this.parseTableSelection(\n start,\n start,\n editor.getDOMHelper()\n );\n\n if (this.state.tableSelection && !rawEvent.defaultPrevented) {\n if (key == Tab) {\n this.handleSelectionInTable(this.getTabKey(rawEvent));\n rawEvent.preventDefault();\n } else {\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n\n case 'table':\n // After a content change event is handled tableSelection state is reset to null\n // Since we have table selection from DOMSelection, we can use it to re-create the tableSelection state\n if (this.state.tableSelection == null) {\n const { table, firstRow, firstColumn, lastRow, lastColumn } = selection;\n\n const parsedTable = parseTableCells(table);\n if (parsedTable) {\n const firstCo = { row: firstRow, col: firstColumn };\n const lastCo = { row: lastRow, col: lastColumn };\n\n // Create the tableSelection with current table info\n this.state.tableSelection = {\n table,\n parsedTable,\n firstCo,\n lastCo,\n startNode: findTableCellElement(parsedTable, firstCo)?.cell || table,\n };\n }\n }\n if (this.state.tableSelection?.lastCo) {\n const { shiftKey, key } = rawEvent;\n\n if (shiftKey && (key == Left || key == Right)) {\n const isRtl =\n win?.getComputedStyle(this.state.tableSelection.table).direction ==\n 'rtl';\n\n this.updateTableSelectionFromKeyboard(\n 0,\n (key == Left ? -1 : 1) * (isRtl ? -1 : 1)\n );\n rawEvent.preventDefault();\n } else if (shiftKey && (key == Up || key == Down)) {\n this.updateTableSelectionFromKeyboard(key == Up ? -1 : 1, 0);\n rawEvent.preventDefault();\n } else if (key != 'Shift' && !isCharacterValue(rawEvent)) {\n if (key == Up || key == Down || key == Left || key == Right) {\n this.setDOMSelection(null /*domSelection*/, this.state.tableSelection);\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n }\n }\n\n private getTabKey(rawEvent: KeyboardEvent) {\n return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';\n }\n\n private handleSelectionInTable(\n key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'TabLeft' | 'TabRight'\n ) {\n if (!this.editor || !this.state.tableSelection) {\n return;\n }\n\n const selection = this.editor.getDOMSelection();\n const domHelper = this.editor.getDOMHelper();\n\n if (selection?.type == 'range') {\n const {\n range: { collapsed, startContainer, endContainer, commonAncestorContainer },\n isReverted,\n } = selection;\n const start = isReverted ? endContainer : startContainer;\n const end: Node | null = isReverted ? startContainer : endContainer;\n const tableSel = this.parseTableSelection(commonAncestorContainer, start, domHelper);\n\n if (!tableSel) {\n return;\n }\n\n let lastCo = findCoordinate(tableSel?.parsedTable, end, domHelper);\n let tabMove = false;\n const { parsedTable, firstCo: oldCo, table } = this.state.tableSelection;\n\n if (lastCo && tableSel.table == table) {\n if (lastCo.col != oldCo.col && (key == Up || key == Down)) {\n const change = key == Up ? -1 : 1;\n const originalTd = findTableCellElement(parsedTable, oldCo)?.cell;\n let td: HTMLTableCellElement | null = null;\n\n lastCo = { row: oldCo.row + change, col: oldCo.col };\n\n while (lastCo.row >= 0 && lastCo.row < parsedTable.length) {\n td = findTableCellElement(parsedTable, lastCo)?.cell || null;\n\n if (td == originalTd) {\n lastCo.row += change;\n } else {\n break;\n }\n }\n\n if (collapsed && td) {\n this.setRangeSelectionInTable(\n td,\n key == Up ? td.childNodes.length : 0,\n this.editor\n );\n } else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {\n this.selectBeforeOrAfterElement(\n this.editor,\n table,\n change == 1 /* after */,\n change != 1 /* setSelectionInNextSiblingElement */\n );\n }\n } else if (key == 'TabLeft' || key == 'TabRight') {\n const reverse = key == 'TabLeft';\n for (\n let step = reverse ? -1 : 1,\n row = lastCo.row ?? 0,\n col = (lastCo.col ?? 0) + step;\n ;\n col += step\n ) {\n if (col < 0 || col >= parsedTable[row].length) {\n row += step;\n if (row < 0) {\n this.selectBeforeOrAfterElement(this.editor, tableSel.table);\n break;\n } else if (row >= parsedTable.length) {\n this.selectBeforeOrAfterElement(\n this.editor,\n tableSel.table,\n true /*after*/\n );\n break;\n }\n col = reverse ? parsedTable[row].length - 1 : 0;\n }\n const cell = parsedTable[row][col];\n\n if (typeof cell != 'string') {\n tabMove = true;\n this.setRangeSelectionInTable(\n cell,\n 0,\n this.editor,\n true /* selectAll */\n );\n lastCo.row = row;\n lastCo.col = col;\n break;\n }\n }\n if (this.editor.getSnapshotsManager().hasNewContent) {\n this.editor.takeSnapshot();\n }\n } else {\n this.state.tableSelection = null;\n }\n\n if (\n collapsed &&\n (lastCo.col != oldCo.col || lastCo.row != oldCo.row) &&\n lastCo.row >= 0 &&\n lastCo.row == parsedTable.length - 1 &&\n lastCo.col == parsedTable[lastCo.row]?.length - 1\n ) {\n this.editor?.announce({ defaultStrings: 'announceOnFocusLastCell' });\n }\n }\n\n if (!collapsed && lastCo && !tabMove) {\n this.state.tableSelection = tableSel;\n this.updateTableSelection(lastCo);\n }\n }\n }\n\n private setRangeSelectionInTable(\n cell: Node,\n nodeOffset: number,\n editor: IEditor,\n selectAll?: boolean\n ) {\n const range = editor.getDocument().createRange();\n if (selectAll && cell.firstChild && cell.lastChild) {\n const cellStart = cell.firstChild;\n const cellEnd = cell.lastChild;\n // Get first deepest editable position in the cell\n const posStart = normalizePos(cellStart, 0);\n // Get last deepest editable position in the cell\n const posEnd = normalizePos(cellEnd, cellEnd.childNodes.length);\n\n range.setStart(posStart.node, posStart.offset);\n range.setEnd(posEnd.node, posEnd.offset);\n\n if (range.toString() === '') {\n range.collapse(true /* toStart */);\n }\n } else {\n // Get deepest editable position in the cell\n const { node, offset } = normalizePos(cell, nodeOffset);\n\n range.setStart(node, offset);\n range.collapse(true /* toStart */);\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n\n private updateTableSelectionFromKeyboard(rowChange: number, colChange: number) {\n if (this.state.tableSelection?.lastCo && this.editor) {\n const { lastCo, parsedTable } = this.state.tableSelection;\n const row = lastCo.row + rowChange;\n const col = lastCo.col + colChange;\n\n if (row >= 0 && row < parsedTable.length && col >= 0 && col < parsedTable[row].length) {\n this.updateTableSelection({ row, col });\n }\n }\n }\n\n private selectBeforeOrAfterElement(\n editor: IEditor,\n element: HTMLElement,\n after?: boolean,\n setSelectionInNextSiblingElement?: boolean\n ) {\n const doc = editor.getDocument();\n const parent = element.parentNode;\n const index = parent && toArray(parent.childNodes).indexOf(element);\n let sibling: Element | undefined | null;\n\n if (parent && index !== null && index >= 0) {\n const range = doc.createRange();\n if (\n setSelectionInNextSiblingElement &&\n (sibling = after ? element.nextElementSibling : element.previousElementSibling) &&\n isNodeOfType(sibling, 'ELEMENT_NODE')\n ) {\n range.selectNodeContents(sibling);\n range.collapse(false /* toStart */);\n } else {\n range.setStart(parent, index + (after ? 1 : 0));\n range.collapse();\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range: range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n }\n\n private getClickingImage(event: UIEvent): HTMLImageElement | null {\n const target = event.target as Node;\n\n return isNodeOfType(target, 'ELEMENT_NODE') && isElementOfType(target, 'img')\n ? target\n : null;\n }\n\n // MacOS will not create a mouseUp event if contextMenu event is not prevent defaulted.\n // Make sure we capture image target even if image is wrapped\n private getContainedTargetImage = (\n event: MouseEvent,\n previousSelection: DOMSelection | null\n ): HTMLImageElement | null => {\n if (!this.isMac || !previousSelection || previousSelection.type !== 'image') {\n return null;\n }\n\n const target = event.target as Node;\n if (\n isNodeOfType(target, 'ELEMENT_NODE') &&\n isElementOfType(target, 'span') &&\n target.firstChild === previousSelection.image\n ) {\n return previousSelection.image;\n }\n return null;\n };\n\n private onFocus = () => {\n if (!this.state.skipReselectOnFocus && this.state.selection) {\n this.setDOMSelection(this.state.selection, this.state.tableSelection);\n }\n\n if (this.state.selection?.type == 'range' && !this.isSafari) {\n // Editor is focused, now we can get live selection. So no need to keep a selection if the selection type is range.\n this.state.selection = null;\n }\n\n if (this.scrollTopCache && this.editor) {\n const sc = this.editor.getScrollContainer();\n sc.scrollTop = this.scrollTopCache;\n this.scrollTopCache = 0;\n }\n };\n\n private onBlur = () => {\n if (this.editor) {\n if (!this.state.selection) {\n this.state.selection = this.editor.getDOMSelection();\n }\n const sc = this.editor.getScrollContainer();\n this.scrollTopCache = sc.scrollTop;\n }\n };\n\n private onSelectionChange = () => {\n if (this.editor?.hasFocus() && !this.editor.isInShadowEdit()) {\n const newSelection = this.editor.getDOMSelection();\n\n //If am image selection changed to a wider range due a keyboard event, we should update the selection\n const selection = this.editor.getDocument().getSelection();\n if (selection && selection.focusNode) {\n const image = isSingleImageInSelection(selection);\n if (newSelection?.type == 'image' && !image) {\n const range = selection.getRangeAt(0);\n this.editor.setDOMSelection({\n type: 'range',\n range,\n isReverted:\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset,\n });\n } else if (newSelection?.type !== 'image' && image) {\n this.editor.setDOMSelection({\n type: 'image',\n image,\n });\n }\n }\n\n // Safari has problem to handle onBlur event. When blur, we cannot get the original selection from editor.\n // So we always save a selection whenever editor has focus. Then after blur, we can still use this cached selection.\n if (newSelection?.type == 'range') {\n if (this.isSafari) {\n this.state.selection = newSelection;\n }\n }\n }\n };\n\n private parseTableSelection(\n tableStart: Node,\n tdStart: Node,\n domHelper: DOMHelper\n ): TableSelectionInfo | null {\n let table: HTMLTableElement | null;\n let parsedTable: ParsedTable | null;\n let firstCo: TableCellCoordinate | null;\n\n if (\n (table = domHelper.findClosestElementAncestor(tableStart, 'table')) &&\n table.isContentEditable &&\n (parsedTable = parseTableCells(table)) &&\n (firstCo = findCoordinate(parsedTable, tdStart, domHelper))\n ) {\n return { table, parsedTable, firstCo, startNode: tdStart };\n } else {\n return null;\n }\n }\n\n private updateTableSelection(lastCo: TableCellCoordinate) {\n if (this.state.tableSelection && this.editor) {\n const {\n table,\n firstCo,\n parsedTable,\n startNode,\n lastCo: oldCo,\n } = this.state.tableSelection;\n\n if (oldCo || firstCo.row != lastCo.row || firstCo.col != lastCo.col) {\n this.state.tableSelection.lastCo = lastCo;\n this.setDOMSelection(\n {\n type: 'table',\n table,\n firstRow: firstCo.row,\n firstColumn: firstCo.col,\n lastRow: lastCo.row,\n lastColumn: lastCo.col,\n tableSelectionInfo: this.state.tableSelection,\n },\n { table, firstCo, lastCo, parsedTable, startNode }\n );\n\n return true;\n }\n }\n\n return false;\n }\n\n private setDOMSelection(\n selection: DOMSelection | null,\n tableSelection: TableSelectionInfo | null\n ) {\n this.editor?.setDOMSelection(selection);\n this.state.tableSelection = tableSelection;\n }\n\n private detachMouseEvent() {\n if (this.state.mouseDisposer) {\n this.state.mouseDisposer();\n this.state.mouseDisposer = undefined;\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of SelectionPlugin.\n * @param option The editor option\n */\nexport function createSelectionPlugin(\n options: EditorOptions\n): PluginWithState<SelectionPluginState> {\n return new SelectionPlugin(options);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SelectionPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/selection/SelectionPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { findCoordinate } from './findCoordinate';\nimport { findTableCellElement } from '../../coreApi/setDOMSelection/findTableCellElement';\nimport { isSingleImageInSelection } from './isSingleImageInSelection';\nimport { normalizePos } from './normalizePos';\nimport {\n getDOMInsertPointRect,\n getNodePositionFromEvent,\n isCharacterValue,\n isElementOfType,\n isModifierKey,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n PluginEvent,\n PluginWithState,\n SelectionPluginState,\n EditorOptions,\n DOMHelper,\n ParsedTable,\n TableSelectionInfo,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst MouseLeftButton = 0;\nconst MouseRightButton = 2;\nconst Up = 'ArrowUp';\nconst Down = 'ArrowDown';\nconst Left = 'ArrowLeft';\nconst Right = 'ArrowRight';\nconst Tab = 'Tab';\n\n/**\n * @internal\n */\nexport const DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n/**\n * @internal\n */\nexport const DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = '#C6C6C6';\n\nclass SelectionPlugin implements PluginWithState<SelectionPluginState> {\n private editor: IEditor | null = null;\n private state: SelectionPluginState;\n private disposer: (() => void) | null = null;\n private logicalRootDisposer: (() => void) | null = null;\n private isSafari = false;\n private isMac = false;\n private scrollTopCache: number = 0;\n\n constructor(options: EditorOptions) {\n this.state = {\n selection: null,\n tableSelection: null,\n imageSelectionBorderColor:\n options.imageSelectionBorderColor ?? DEFAULT_SELECTION_BORDER_COLOR,\n imageSelectionBorderColorDark: options.imageSelectionBorderColor\n ? undefined\n : DEFAULT_SELECTION_BORDER_COLOR,\n tableCellSelectionBackgroundColor:\n options.tableCellSelectionBackgroundColor ??\n DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n tableCellSelectionBackgroundColorDark: options.tableCellSelectionBackgroundColor\n ? undefined\n : DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n };\n }\n\n getName() {\n return 'Selection';\n }\n\n initialize(editor: IEditor) {\n this.editor = editor;\n\n if (!this.state.imageSelectionBorderColorDark && this.state.imageSelectionBorderColor) {\n this.state.imageSelectionBorderColorDark = editor\n .getColorManager()\n .getDarkColor(this.state.imageSelectionBorderColor, undefined, 'border');\n }\n\n if (\n !this.state.tableCellSelectionBackgroundColorDark &&\n this.state.tableCellSelectionBackgroundColor\n ) {\n this.state.tableCellSelectionBackgroundColorDark = editor\n .getColorManager()\n .getDarkColor(\n this.state.tableCellSelectionBackgroundColor,\n undefined,\n 'background'\n );\n }\n\n const env = this.editor.getEnvironment();\n const document = this.editor.getDocument();\n\n this.isSafari = !!env.isSafari;\n this.isMac = !!env.isMac;\n document.addEventListener('selectionchange', this.onSelectionChange);\n if (this.isSafari) {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n }\n\n dispose() {\n this.editor?.getDocument().removeEventListener('selectionchange', this.onSelectionChange);\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n }\n\n this.logicalRootDisposer?.();\n this.logicalRootDisposer = null;\n\n this.detachMouseEvent();\n this.editor = null;\n }\n\n getState(): SelectionPluginState {\n return this.state;\n }\n\n onPluginEvent(event: PluginEvent) {\n if (!this.editor) {\n return;\n }\n\n switch (event.eventType) {\n case 'mouseDown':\n this.onMouseDown(this.editor, event.rawEvent);\n break;\n\n case 'mouseUp':\n this.onMouseUp();\n break;\n\n case 'keyDown':\n this.onKeyDown(this.editor, event.rawEvent);\n break;\n\n case 'contentChanged':\n this.state.tableSelection = null;\n break;\n\n case 'scroll':\n if (!this.editor.hasFocus()) {\n this.scrollTopCache = event.scrollContainer.scrollTop;\n }\n break;\n\n case 'logicalRootChanged':\n this.logicalRootDisposer?.();\n if (this.isSafari) {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n break;\n }\n }\n\n private onMouseDown(editor: IEditor, rawEvent: MouseEvent) {\n const selection = editor.getDOMSelection();\n let image: HTMLImageElement | null;\n\n // Image selection\n if (\n selection?.type == 'image' &&\n (rawEvent.button == MouseLeftButton ||\n (rawEvent.button == MouseRightButton &&\n !this.getClickingImage(rawEvent) &&\n !this.getContainedTargetImage(rawEvent, selection)))\n ) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n if (\n (image =\n this.getClickingImage(rawEvent) ??\n this.getContainedTargetImage(rawEvent, selection)) &&\n image.isContentEditable\n ) {\n this.setDOMSelection(\n {\n type: 'image',\n image: image,\n },\n null\n );\n return;\n }\n\n // Table selection\n if (selection?.type == 'table' && rawEvent.button == MouseLeftButton) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n let tableSelection: TableSelectionInfo | null;\n const target = rawEvent.target as Node;\n\n if (\n target &&\n rawEvent.button == MouseLeftButton &&\n (tableSelection = this.parseTableSelection(target, target, editor.getDOMHelper()))\n ) {\n this.state.tableSelection = tableSelection;\n\n if (rawEvent.detail >= 3) {\n const lastCo = findCoordinate(\n tableSelection.parsedTable,\n rawEvent.target as Node,\n editor.getDOMHelper()\n );\n\n if (lastCo) {\n // Triple click, select the current cell\n tableSelection.lastCo = lastCo;\n this.updateTableSelection(lastCo);\n rawEvent.preventDefault();\n }\n }\n\n this.state.mouseDisposer?.();\n this.state.mouseDisposer = editor.attachDomEvent({\n mousemove: {\n beforeDispatch: this.onMouseMove,\n },\n });\n }\n }\n\n private onMouseMove = (event: Event) => {\n if (this.editor && this.state.tableSelection) {\n const hasTableSelection = !!this.state.tableSelection.lastCo;\n const currentNode = event.target as Node;\n const domHelper = this.editor.getDOMHelper();\n\n const range = this.editor.getDocument().createRange();\n const startNode = this.state.tableSelection.startNode;\n const isReverted =\n currentNode.compareDocumentPosition(startNode) == Node.DOCUMENT_POSITION_FOLLOWING;\n\n if (isReverted) {\n range.setStart(currentNode, 0);\n range.setEnd(\n startNode,\n isNodeOfType(startNode, 'TEXT_NODE')\n ? startNode.nodeValue?.length ?? 0\n : startNode.childNodes.length\n );\n } else {\n range.setStart(startNode, 0);\n range.setEnd(currentNode, 0);\n }\n\n // Use common container of the range to search a common table that covers both start and end node\n const tableStart = range.commonAncestorContainer;\n const newTableSelection = this.parseTableSelection(tableStart, startNode, domHelper);\n\n if (newTableSelection) {\n const lastCo = findCoordinate(\n newTableSelection.parsedTable,\n currentNode,\n domHelper\n );\n\n if (newTableSelection.table != this.state.tableSelection.table) {\n // Move mouse into another table (nest table scenario)\n this.state.tableSelection = newTableSelection;\n this.state.tableSelection.lastCo = lastCo ?? undefined;\n }\n\n const updated = lastCo && this.updateTableSelection(lastCo);\n\n if (hasTableSelection || updated) {\n event.preventDefault();\n }\n } else if (this.editor.getDOMSelection()?.type == 'table') {\n // Move mouse out of table\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted,\n },\n this.state.tableSelection\n );\n }\n }\n };\n\n private onMouseUp() {\n this.detachMouseEvent();\n }\n\n private onDrop = () => {\n this.detachMouseEvent();\n };\n\n private onKeyDown(editor: IEditor, rawEvent: KeyboardEvent) {\n const key = rawEvent.key;\n const selection = editor.getDOMSelection();\n const win = editor.getDocument().defaultView;\n\n switch (selection?.type) {\n case 'image':\n if (!isModifierKey(rawEvent) && !rawEvent.shiftKey && selection.image.parentNode) {\n if (key === 'Escape') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n rawEvent.stopPropagation();\n } else if (key !== 'Delete' && key !== 'Backspace') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n }\n }\n\n if (\n (isModifierKey(rawEvent) || rawEvent.shiftKey) &&\n selection.image &&\n !this.isSafari\n ) {\n const range = selection.image.ownerDocument.createRange();\n range.selectNode(selection.image);\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /* tableSelection */\n );\n }\n break;\n\n case 'range':\n if (key == Up || key == Down || key == Left || key == Right || key == Tab) {\n const start = selection.range.startContainer;\n this.state.tableSelection = this.parseTableSelection(\n start,\n start,\n editor.getDOMHelper()\n );\n\n if (this.state.tableSelection && !rawEvent.defaultPrevented) {\n if (key == Tab) {\n this.handleSelectionInTable(this.getTabKey(rawEvent));\n rawEvent.preventDefault();\n } else {\n win?.requestAnimationFrame(() =>\n this.handleSelectionInTable(key, selection.range)\n );\n }\n }\n }\n break;\n\n case 'table':\n // After a content change event is handled tableSelection state is reset to null\n // Since we have table selection from DOMSelection, we can use it to re-create the tableSelection state\n if (this.state.tableSelection == null) {\n const { table, firstRow, firstColumn, lastRow, lastColumn } = selection;\n\n const parsedTable = parseTableCells(table);\n if (parsedTable) {\n const firstCo = { row: firstRow, col: firstColumn };\n const lastCo = { row: lastRow, col: lastColumn };\n\n // Create the tableSelection with current table info\n this.state.tableSelection = {\n table,\n parsedTable,\n firstCo,\n lastCo,\n startNode: findTableCellElement(parsedTable, firstCo)?.cell || table,\n };\n }\n }\n if (this.state.tableSelection?.lastCo) {\n const { shiftKey, key } = rawEvent;\n\n if (shiftKey && (key == Left || key == Right)) {\n const isRtl =\n win?.getComputedStyle(this.state.tableSelection.table).direction ==\n 'rtl';\n\n this.updateTableSelectionFromKeyboard(\n 0,\n (key == Left ? -1 : 1) * (isRtl ? -1 : 1)\n );\n rawEvent.preventDefault();\n } else if (shiftKey && (key == Up || key == Down)) {\n this.updateTableSelectionFromKeyboard(key == Up ? -1 : 1, 0);\n rawEvent.preventDefault();\n } else if (key != 'Shift' && !isCharacterValue(rawEvent)) {\n if (key == Up || key == Down || key == Left || key == Right) {\n this.setDOMSelection(null /*domSelection*/, this.state.tableSelection);\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n }\n }\n\n private getTabKey(rawEvent: KeyboardEvent) {\n return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';\n }\n\n private handleSelectionInTable(\n key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'TabLeft' | 'TabRight',\n rangeBeforeChange?: Range\n ) {\n if (!this.editor || !this.state.tableSelection) {\n return;\n }\n\n const selection = this.editor.getDOMSelection();\n const domHelper = this.editor.getDOMHelper();\n\n if (selection?.type == 'range') {\n const {\n range: { collapsed, startContainer, endContainer, commonAncestorContainer },\n isReverted,\n } = selection;\n const start = isReverted ? endContainer : startContainer;\n const end: Node | null = isReverted ? startContainer : endContainer;\n const tableSel = this.parseTableSelection(commonAncestorContainer, start, domHelper);\n\n if (!tableSel) {\n return;\n }\n\n let lastCo = findCoordinate(tableSel?.parsedTable, end, domHelper);\n let tabMove = false;\n const { parsedTable, firstCo: oldCo, table } = this.state.tableSelection;\n\n if (lastCo && tableSel.table == table) {\n if (lastCo.col != oldCo.col && (key == Up || key == Down)) {\n const change = key == Up ? -1 : 1;\n const originalTd = findTableCellElement(parsedTable, oldCo)?.cell;\n let td: HTMLTableCellElement | null = null;\n\n lastCo = { row: oldCo.row + change, col: oldCo.col };\n\n while (lastCo.row >= 0 && lastCo.row < parsedTable.length) {\n td = findTableCellElement(parsedTable, lastCo)?.cell || null;\n\n if (td == originalTd) {\n lastCo.row += change;\n } else {\n break;\n }\n }\n\n if (collapsed && td) {\n const textOffset =\n (key == 'ArrowUp' || key == 'ArrowDown') && rangeBeforeChange\n ? this.getTextOffset(\n this.editor,\n rangeBeforeChange,\n td,\n key == 'ArrowUp'\n )\n : null;\n if (textOffset) {\n this.setRangeSelectionInTable(\n textOffset.node,\n textOffset.offset,\n this.editor,\n false /* selectAll */\n );\n } else {\n this.setRangeSelectionInTable(\n td,\n 0,\n this.editor,\n false /* selectAll */\n );\n }\n } else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {\n this.selectBeforeOrAfterElement(\n this.editor,\n table,\n change == 1 /* after */,\n change != 1 /* setSelectionInNextSiblingElement */\n );\n }\n } else if (key == 'TabLeft' || key == 'TabRight') {\n const reverse = key == 'TabLeft';\n for (\n let step = reverse ? -1 : 1,\n row = lastCo.row ?? 0,\n col = (lastCo.col ?? 0) + step;\n ;\n col += step\n ) {\n if (col < 0 || col >= parsedTable[row].length) {\n row += step;\n if (row < 0) {\n this.selectBeforeOrAfterElement(this.editor, tableSel.table);\n break;\n } else if (row >= parsedTable.length) {\n this.selectBeforeOrAfterElement(\n this.editor,\n tableSel.table,\n true /*after*/\n );\n break;\n }\n col = reverse ? parsedTable[row].length - 1 : 0;\n }\n const cell = parsedTable[row][col];\n\n if (typeof cell != 'string') {\n tabMove = true;\n this.setRangeSelectionInTable(\n cell,\n 0,\n this.editor,\n true /* selectAll */\n );\n lastCo.row = row;\n lastCo.col = col;\n break;\n }\n }\n if (this.editor.getSnapshotsManager().hasNewContent) {\n this.editor.takeSnapshot();\n }\n } else {\n this.state.tableSelection = null;\n }\n\n if (\n collapsed &&\n (lastCo.col != oldCo.col || lastCo.row != oldCo.row) &&\n lastCo.row >= 0 &&\n lastCo.row == parsedTable.length - 1 &&\n lastCo.col == parsedTable[lastCo.row]?.length - 1\n ) {\n this.editor?.announce({ defaultStrings: 'announceOnFocusLastCell' });\n }\n }\n\n if (!collapsed && lastCo && !tabMove) {\n this.state.tableSelection = tableSel;\n this.updateTableSelection(lastCo);\n }\n }\n }\n\n private getTextOffset(editor: IEditor, range: Range, td: HTMLElement, isKeyUp: boolean) {\n const doc = editor.getDocument();\n const cursorRect = range\n ? getDOMInsertPointRect(doc, {\n node: range.startContainer,\n offset: range.startOffset,\n })\n : undefined;\n const rect = td?.getBoundingClientRect();\n const textOffset =\n cursorRect && rect\n ? getNodePositionFromEvent(\n doc,\n editor.getDOMHelper(),\n cursorRect.left,\n isKeyUp ? rect.top - 1 : rect.top + 1\n )\n : null;\n return textOffset;\n }\n\n private setRangeSelectionInTable(\n cell: Node,\n nodeOffset: number,\n editor: IEditor,\n selectAll?: boolean\n ) {\n const doc = editor.getDocument();\n const range = doc.createRange();\n if (selectAll && cell.firstChild && cell.lastChild) {\n const cellStart = cell.firstChild;\n const cellEnd = cell.lastChild;\n // Get first deepest editable position in the cell\n const posStart = normalizePos(cellStart, 0);\n // Get last deepest editable position in the cell\n const posEnd = normalizePos(cellEnd, cellEnd.childNodes.length);\n\n range.setStart(posStart.node, posStart.offset);\n range.setEnd(posEnd.node, posEnd.offset);\n\n if (range.toString() === '') {\n range.collapse(true /* toStart */);\n }\n } else {\n // Get deepest editable position in the cell\n const { node, offset } = normalizePos(cell, nodeOffset);\n range.setStart(node, offset);\n range.collapse(true /* toStart */);\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n\n private updateTableSelectionFromKeyboard(rowChange: number, colChange: number) {\n if (this.state.tableSelection?.lastCo && this.editor) {\n const { lastCo, parsedTable } = this.state.tableSelection;\n const row = lastCo.row + rowChange;\n const col = lastCo.col + colChange;\n\n if (row >= 0 && row < parsedTable.length && col >= 0 && col < parsedTable[row].length) {\n this.updateTableSelection({ row, col });\n }\n }\n }\n\n private selectBeforeOrAfterElement(\n editor: IEditor,\n element: HTMLElement,\n after?: boolean,\n setSelectionInNextSiblingElement?: boolean\n ) {\n const doc = editor.getDocument();\n const parent = element.parentNode;\n const index = parent && toArray(parent.childNodes).indexOf(element);\n let sibling: Element | undefined | null;\n\n if (parent && index !== null && index >= 0) {\n const range = doc.createRange();\n if (\n setSelectionInNextSiblingElement &&\n (sibling = after ? element.nextElementSibling : element.previousElementSibling) &&\n isNodeOfType(sibling, 'ELEMENT_NODE')\n ) {\n range.selectNodeContents(sibling);\n range.collapse(false /* toStart */);\n } else {\n range.setStart(parent, index + (after ? 1 : 0));\n range.collapse();\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range: range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n }\n\n private getClickingImage(event: UIEvent): HTMLImageElement | null {\n const target = event.target as Node;\n\n return isNodeOfType(target, 'ELEMENT_NODE') && isElementOfType(target, 'img')\n ? target\n : null;\n }\n\n // MacOS will not create a mouseUp event if contextMenu event is not prevent defaulted.\n // Make sure we capture image target even if image is wrapped\n private getContainedTargetImage = (\n event: MouseEvent,\n previousSelection: DOMSelection | null\n ): HTMLImageElement | null => {\n if (!this.isMac || !previousSelection || previousSelection.type !== 'image') {\n return null;\n }\n\n const target = event.target as Node;\n if (\n isNodeOfType(target, 'ELEMENT_NODE') &&\n isElementOfType(target, 'span') &&\n target.firstChild === previousSelection.image\n ) {\n return previousSelection.image;\n }\n return null;\n };\n\n private onFocus = () => {\n if (!this.state.skipReselectOnFocus && this.state.selection) {\n this.setDOMSelection(this.state.selection, this.state.tableSelection);\n }\n\n if (this.state.selection?.type == 'range' && !this.isSafari) {\n // Editor is focused, now we can get live selection. So no need to keep a selection if the selection type is range.\n this.state.selection = null;\n }\n\n if (this.scrollTopCache && this.editor) {\n const sc = this.editor.getScrollContainer();\n sc.scrollTop = this.scrollTopCache;\n this.scrollTopCache = 0;\n }\n };\n\n private onBlur = () => {\n if (this.editor) {\n if (!this.state.selection) {\n this.state.selection = this.editor.getDOMSelection();\n }\n const sc = this.editor.getScrollContainer();\n this.scrollTopCache = sc.scrollTop;\n }\n };\n\n private onSelectionChange = () => {\n if (this.editor?.hasFocus() && !this.editor.isInShadowEdit()) {\n const newSelection = this.editor.getDOMSelection();\n\n //If am image selection changed to a wider range due a keyboard event, we should update the selection\n const selection = this.editor.getDocument().getSelection();\n if (selection && selection.focusNode) {\n const image = isSingleImageInSelection(selection);\n if (newSelection?.type == 'image' && !image) {\n const range = selection.getRangeAt(0);\n this.editor.setDOMSelection({\n type: 'range',\n range,\n isReverted:\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset,\n });\n } else if (newSelection?.type !== 'image' && image) {\n this.editor.setDOMSelection({\n type: 'image',\n image,\n });\n }\n }\n\n // Safari has problem to handle onBlur event. When blur, we cannot get the original selection from editor.\n // So we always save a selection whenever editor has focus. Then after blur, we can still use this cached selection.\n if (newSelection?.type == 'range') {\n if (this.isSafari) {\n this.state.selection = newSelection;\n }\n }\n }\n };\n\n private parseTableSelection(\n tableStart: Node,\n tdStart: Node,\n domHelper: DOMHelper\n ): TableSelectionInfo | null {\n let table: HTMLTableElement | null;\n let parsedTable: ParsedTable | null;\n let firstCo: TableCellCoordinate | null;\n\n if (\n (table = domHelper.findClosestElementAncestor(tableStart, 'table')) &&\n table.isContentEditable &&\n (parsedTable = parseTableCells(table)) &&\n (firstCo = findCoordinate(parsedTable, tdStart, domHelper))\n ) {\n return { table, parsedTable, firstCo, startNode: tdStart };\n } else {\n return null;\n }\n }\n\n private updateTableSelection(lastCo: TableCellCoordinate) {\n if (this.state.tableSelection && this.editor) {\n const {\n table,\n firstCo,\n parsedTable,\n startNode,\n lastCo: oldCo,\n } = this.state.tableSelection;\n\n if (oldCo || firstCo.row != lastCo.row || firstCo.col != lastCo.col) {\n this.state.tableSelection.lastCo = lastCo;\n this.setDOMSelection(\n {\n type: 'table',\n table,\n firstRow: firstCo.row,\n firstColumn: firstCo.col,\n lastRow: lastCo.row,\n lastColumn: lastCo.col,\n tableSelectionInfo: this.state.tableSelection,\n },\n { table, firstCo, lastCo, parsedTable, startNode }\n );\n\n return true;\n }\n }\n\n return false;\n }\n\n private setDOMSelection(\n selection: DOMSelection | null,\n tableSelection: TableSelectionInfo | null\n ) {\n this.editor?.setDOMSelection(selection);\n this.state.tableSelection = tableSelection;\n }\n\n private detachMouseEvent() {\n if (this.state.mouseDisposer) {\n this.state.mouseDisposer();\n this.state.mouseDisposer = undefined;\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of SelectionPlugin.\n * @param option The editor option\n */\nexport function createSelectionPlugin(\n options: EditorOptions\n): PluginWithState<SelectionPluginState> {\n return new SelectionPlugin(options);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
"description": "Core editor for roosterjs",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"tslib": "^2.3.1",
|
|
6
|
-
"roosterjs-content-model-dom": "^9.
|
|
7
|
-
"roosterjs-content-model-types": "^9.
|
|
6
|
+
"roosterjs-content-model-dom": "^9.47.0",
|
|
7
|
+
"roosterjs-content-model-types": "^9.47.0"
|
|
8
8
|
},
|
|
9
|
-
"version": "9.
|
|
9
|
+
"version": "9.47.0",
|
|
10
10
|
"main": "./lib/index.js",
|
|
11
11
|
"typings": "./lib/index.d.ts",
|
|
12
12
|
"module": "./lib-mjs/index.js",
|