roosterjs-content-model-core 9.45.2 → 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.
Files changed (73) hide show
  1. package/lib/command/cutCopy/getContentForCopy.js +4 -15
  2. package/lib/command/cutCopy/getContentForCopy.js.map +1 -1
  3. package/lib/coreApi/setDOMSelection/setDOMSelection.js +5 -58
  4. package/lib/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  5. package/lib/coreApi/setDOMSelection/setTableCellsStyle.d.ts +17 -0
  6. package/lib/coreApi/setDOMSelection/setTableCellsStyle.js +85 -0
  7. package/lib/coreApi/setDOMSelection/setTableCellsStyle.js.map +1 -0
  8. package/lib/coreApi/setDOMSelection/toggleTableSelection.d.ts +8 -0
  9. package/lib/coreApi/setDOMSelection/toggleTableSelection.js +34 -0
  10. package/lib/coreApi/setDOMSelection/toggleTableSelection.js.map +1 -0
  11. package/lib/coreApi/switchShadowEdit/switchShadowEdit.js +3 -0
  12. package/lib/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
  13. package/lib/corePlugin/cache/textMutationObserver.js +2 -1
  14. package/lib/corePlugin/cache/textMutationObserver.js.map +1 -1
  15. package/lib/corePlugin/selection/SelectionPlugin.js +32 -4
  16. package/lib/corePlugin/selection/SelectionPlugin.js.map +1 -1
  17. package/lib/editor/Editor.js +1 -1
  18. package/lib/editor/Editor.js.map +1 -1
  19. package/lib-amd/command/cutCopy/getContentForCopy.js +5 -14
  20. package/lib-amd/command/cutCopy/getContentForCopy.js.map +1 -1
  21. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js +4 -58
  22. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  23. package/lib-amd/coreApi/setDOMSelection/setTableCellsStyle.d.ts +17 -0
  24. package/lib-amd/coreApi/setDOMSelection/setTableCellsStyle.js +85 -0
  25. package/lib-amd/coreApi/setDOMSelection/setTableCellsStyle.js.map +1 -0
  26. package/lib-amd/coreApi/setDOMSelection/toggleTableSelection.d.ts +8 -0
  27. package/lib-amd/coreApi/setDOMSelection/toggleTableSelection.js +34 -0
  28. package/lib-amd/coreApi/setDOMSelection/toggleTableSelection.js.map +1 -0
  29. package/lib-amd/coreApi/switchShadowEdit/switchShadowEdit.js +3 -1
  30. package/lib-amd/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
  31. package/lib-amd/corePlugin/cache/textMutationObserver.js +2 -1
  32. package/lib-amd/corePlugin/cache/textMutationObserver.js.map +1 -1
  33. package/lib-amd/corePlugin/selection/SelectionPlugin.js +32 -4
  34. package/lib-amd/corePlugin/selection/SelectionPlugin.js.map +1 -1
  35. package/lib-amd/editor/Editor.js +1 -1
  36. package/lib-amd/editor/Editor.js.map +1 -1
  37. package/lib-mjs/command/cutCopy/getContentForCopy.js +5 -16
  38. package/lib-mjs/command/cutCopy/getContentForCopy.js.map +1 -1
  39. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js +5 -58
  40. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  41. package/lib-mjs/coreApi/setDOMSelection/setTableCellsStyle.d.ts +17 -0
  42. package/lib-mjs/coreApi/setDOMSelection/setTableCellsStyle.js +80 -0
  43. package/lib-mjs/coreApi/setDOMSelection/setTableCellsStyle.js.map +1 -0
  44. package/lib-mjs/coreApi/setDOMSelection/toggleTableSelection.d.ts +8 -0
  45. package/lib-mjs/coreApi/setDOMSelection/toggleTableSelection.js +30 -0
  46. package/lib-mjs/coreApi/setDOMSelection/toggleTableSelection.js.map +1 -0
  47. package/lib-mjs/coreApi/switchShadowEdit/switchShadowEdit.js +3 -0
  48. package/lib-mjs/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
  49. package/lib-mjs/corePlugin/cache/textMutationObserver.js +2 -1
  50. package/lib-mjs/corePlugin/cache/textMutationObserver.js.map +1 -1
  51. package/lib-mjs/corePlugin/selection/SelectionPlugin.js +33 -5
  52. package/lib-mjs/corePlugin/selection/SelectionPlugin.js.map +1 -1
  53. package/lib-mjs/editor/Editor.js +1 -1
  54. package/lib-mjs/editor/Editor.js.map +1 -1
  55. package/package.json +3 -3
  56. package/lib/command/cutCopy/preprocessTable.d.ts +0 -5
  57. package/lib/command/cutCopy/preprocessTable.js +0 -22
  58. package/lib/command/cutCopy/preprocessTable.js.map +0 -1
  59. package/lib/command/cutCopy/pruneUnselectedModel.d.ts +0 -5
  60. package/lib/command/cutCopy/pruneUnselectedModel.js +0 -135
  61. package/lib/command/cutCopy/pruneUnselectedModel.js.map +0 -1
  62. package/lib-amd/command/cutCopy/preprocessTable.d.ts +0 -5
  63. package/lib-amd/command/cutCopy/preprocessTable.js +0 -22
  64. package/lib-amd/command/cutCopy/preprocessTable.js.map +0 -1
  65. package/lib-amd/command/cutCopy/pruneUnselectedModel.d.ts +0 -5
  66. package/lib-amd/command/cutCopy/pruneUnselectedModel.js +0 -136
  67. package/lib-amd/command/cutCopy/pruneUnselectedModel.js.map +0 -1
  68. package/lib-mjs/command/cutCopy/preprocessTable.d.ts +0 -5
  69. package/lib-mjs/command/cutCopy/preprocessTable.js +0 -18
  70. package/lib-mjs/command/cutCopy/preprocessTable.js.map +0 -1
  71. package/lib-mjs/command/cutCopy/pruneUnselectedModel.d.ts +0 -5
  72. package/lib-mjs/command/cutCopy/pruneUnselectedModel.js +0 -131
  73. package/lib-mjs/command/cutCopy/pruneUnselectedModel.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"setDOMSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setDOMSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { addRangeToSelection } from './addRangeToSelection';\nimport { areSameSelections } from '../../corePlugin/cache/areSameSelections';\nimport { ensureUniqueId } from '../setEditorStyle/ensureUniqueId';\nimport { findLastedCoInMergedCell } from './findLastedCoInMergedCell';\nimport { findTableCellElement } from './findTableCellElement';\nimport { toggleCaret } from './toggleCaret';\nimport {\n getSafeIdSelector,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n ParsedTable,\n SelectionChangedEvent,\n SetDOMSelection,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst DOM_SELECTION_CSS_KEY = '_DOMSelection';\nconst HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';\nconst IMAGE_ID = 'image';\nconst TABLE_ID = 'table';\nconst TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';\nconst SELECTION_SELECTOR = '*::selection';\nconst DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n\n/**\n * @internal\n */\nexport const setDOMSelection: SetDOMSelection = (core, selection, skipSelectionChangedEvent) => {\n const existingSelection = core.api.getDOMSelection(core);\n\n if (existingSelection && selection && areSameSelections(existingSelection, selection)) {\n return;\n }\n\n // We are applying a new selection, so we don't need to apply cached selection in DOMEventPlugin.\n // Set skipReselectOnFocus to skip this behavior\n const skipReselectOnFocus = core.selection.skipReselectOnFocus;\n\n const doc = core.physicalRoot.ownerDocument;\n const isDarkMode = core.lifecycle.isDarkMode;\n core.selection.skipReselectOnFocus = true;\n core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);\n core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, null /*cssRule*/);\n\n toggleCaret(core, false /* hide */);\n\n try {\n switch (selection?.type) {\n case 'image':\n const image = selection.image;\n\n core.selection.selection = selection;\n\n const imageSelectionColor = isDarkMode\n ? core.selection.imageSelectionBorderColorDark\n : core.selection.imageSelectionBorderColor;\n\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `outline-style:solid!important; outline-color:${\n imageSelectionColor || DEFAULT_SELECTION_BORDER_COLOR\n }!important;`,\n [getSafeIdSelector(ensureUniqueId(image, IMAGE_ID))]\n );\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n setRangeSelection(doc, image, false /* collapse */);\n break;\n case 'table':\n const { table, firstColumn, firstRow, lastColumn, lastRow } = selection;\n const parsedTable = parseTableCells(selection.table);\n let firstCell = {\n row: Math.min(firstRow, lastRow),\n col: Math.min(firstColumn, lastColumn),\n cell: <HTMLTableCellElement | null>null,\n };\n let lastCell = {\n row: Math.max(firstRow, lastRow),\n col: Math.max(firstColumn, lastColumn),\n };\n\n firstCell = findTableCellElement(parsedTable, firstCell) || firstCell;\n lastCell = findLastedCoInMergedCell(parsedTable, lastCell) || lastCell;\n\n if (\n isNaN(firstCell.row) ||\n isNaN(firstCell.col) ||\n isNaN(lastCell.row) ||\n isNaN(lastCell.col)\n ) {\n return;\n }\n\n selection = {\n type: 'table',\n table,\n firstRow: firstCell.row,\n firstColumn: firstCell.col,\n lastRow: lastCell.row,\n lastColumn: lastCell.col,\n tableSelectionInfo: selection.tableSelectionInfo,\n };\n\n const tableId = ensureUniqueId(table, TABLE_ID);\n const tableSelector = getSafeIdSelector(tableId);\n\n const tableSelectors =\n firstCell.row == 0 &&\n firstCell.col == 0 &&\n lastCell.row == parsedTable.length - 1 &&\n lastCell.col == (parsedTable[lastCell.row]?.length ?? 0) - 1\n ? [tableSelector, `${tableSelector} *`]\n : handleTableSelected(\n parsedTable,\n tableSelector,\n table,\n firstCell,\n lastCell\n );\n\n core.selection.selection = selection;\n\n const tableSelectionColor = isDarkMode\n ? core.selection.tableCellSelectionBackgroundColorDark\n : core.selection.tableCellSelectionBackgroundColor;\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `background-color:${tableSelectionColor}!important;`,\n tableSelectors\n );\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n toggleCaret(core, true /* hide */);\n\n const nodeToSelect = firstCell.cell?.firstElementChild || firstCell.cell;\n\n if (nodeToSelect) {\n setRangeSelection(\n doc,\n (nodeToSelect as HTMLElement) || undefined,\n true /* collapse */\n );\n }\n\n break;\n case 'range':\n addRangeToSelection(doc, selection.range, selection.isReverted);\n\n core.selection.selection = core.domHelper.hasFocus() ? null : selection;\n break;\n\n default:\n core.selection.selection = null;\n break;\n }\n } finally {\n core.selection.skipReselectOnFocus = skipReselectOnFocus;\n }\n\n if (!skipSelectionChangedEvent) {\n const eventData: SelectionChangedEvent = {\n eventType: 'selectionChanged',\n newSelection: selection,\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n }\n};\n\nfunction handleTableSelected(\n parsedTable: ParsedTable,\n tableSelector: string,\n table: HTMLTableElement,\n firstCell: TableCellCoordinate,\n lastCell: TableCellCoordinate\n) {\n const selectors: string[] = [];\n\n // Get whether table has thead, tbody or tfoot, then Set the start and end of each of the table children,\n // so we can build the selector according the element between the table and the row.\n let cont = 0;\n const indexes = toArray(table.childNodes)\n .filter(\n (node): node is HTMLTableSectionElement =>\n ['THEAD', 'TBODY', 'TFOOT'].indexOf(\n isNodeOfType(node, 'ELEMENT_NODE') ? node.tagName : ''\n ) > -1\n )\n .map(node => {\n const result = {\n el: node.tagName,\n start: cont,\n end: node.childNodes.length + cont,\n };\n\n cont = result.end;\n return result;\n });\n\n parsedTable.forEach((row, rowIndex) => {\n let tdCount = 0;\n\n //Get current TBODY/THEAD/TFOOT\n const midElement = indexes.filter(ind => ind.start <= rowIndex && ind.end > rowIndex)[0];\n const middleElSelector = midElement ? '>' + midElement.el + '>' : '>';\n const currentRow =\n midElement && rowIndex + 1 >= midElement.start\n ? rowIndex + 1 - midElement.start\n : rowIndex + 1;\n\n for (let cellIndex = 0; cellIndex < row.length; cellIndex++) {\n const cell = row[cellIndex];\n\n if (typeof cell == 'object') {\n tdCount++;\n\n if (\n rowIndex >= firstCell.row &&\n rowIndex <= lastCell.row &&\n cellIndex >= firstCell.col &&\n cellIndex <= lastCell.col\n ) {\n const selector = `${tableSelector}${middleElSelector} tr:nth-child(${currentRow})>${cell.tagName}:nth-child(${tdCount})`;\n\n selectors.push(selector, selector + ' *');\n }\n }\n }\n });\n\n return selectors;\n}\n\nfunction setRangeSelection(doc: Document, element: HTMLElement | undefined, collapse: boolean) {\n if (element && doc.contains(element)) {\n const range = doc.createRange();\n let isReverted: boolean | undefined = undefined;\n\n range.selectNode(element);\n if (collapse) {\n range.collapse();\n } else {\n const selection = doc.defaultView?.getSelection();\n const range = selection && selection.rangeCount > 0 && selection.getRangeAt(0);\n if (selection && range) {\n isReverted =\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset;\n }\n }\n\n addRangeToSelection(doc, range, isReverted);\n }\n}\n"]}
1
+ {"version":3,"file":"setDOMSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setDOMSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { addRangeToSelection } from './addRangeToSelection';\nimport { areSameSelections } from '../../corePlugin/cache/areSameSelections';\nimport { ensureUniqueId } from '../setEditorStyle/ensureUniqueId';\nimport { findLastedCoInMergedCell } from './findLastedCoInMergedCell';\nimport { findTableCellElement } from './findTableCellElement';\nimport { getSafeIdSelector, parseTableCells } from 'roosterjs-content-model-dom';\nimport { setTableCellsStyle } from './setTableCellsStyle';\nimport { toggleCaret } from './toggleCaret';\nimport type { SelectionChangedEvent, SetDOMSelection } from 'roosterjs-content-model-types';\n\nconst DOM_SELECTION_CSS_KEY = '_DOMSelection';\nconst HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';\nconst IMAGE_ID = 'image';\nconst TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';\nconst SELECTION_SELECTOR = '*::selection';\nconst DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n\n/**\n * @internal\n */\nexport const setDOMSelection: SetDOMSelection = (core, selection, skipSelectionChangedEvent) => {\n const existingSelection = core.api.getDOMSelection(core);\n\n if (existingSelection && selection && areSameSelections(existingSelection, selection)) {\n return;\n }\n\n // We are applying a new selection, so we don't need to apply cached selection in DOMEventPlugin.\n // Set skipReselectOnFocus to skip this behavior\n const skipReselectOnFocus = core.selection.skipReselectOnFocus;\n\n const doc = core.physicalRoot.ownerDocument;\n const isDarkMode = core.lifecycle.isDarkMode;\n core.selection.skipReselectOnFocus = true;\n core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);\n core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, null /*cssRule*/);\n\n toggleCaret(core, false /* hide */);\n\n try {\n switch (selection?.type) {\n case 'image':\n const image = selection.image;\n\n core.selection.selection = selection;\n\n const imageSelectionColor = isDarkMode\n ? core.selection.imageSelectionBorderColorDark\n : core.selection.imageSelectionBorderColor;\n\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `outline-style:solid!important; outline-color:${\n imageSelectionColor || DEFAULT_SELECTION_BORDER_COLOR\n }!important;`,\n [getSafeIdSelector(ensureUniqueId(image, IMAGE_ID))]\n );\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n setRangeSelection(doc, image, false /* collapse */);\n break;\n case 'table':\n const { table, firstColumn, firstRow, lastColumn, lastRow } = selection;\n const parsedTable = parseTableCells(selection.table);\n let firstCell = {\n row: Math.min(firstRow, lastRow),\n col: Math.min(firstColumn, lastColumn),\n cell: <HTMLTableCellElement | null>null,\n };\n let lastCell = {\n row: Math.max(firstRow, lastRow),\n col: Math.max(firstColumn, lastColumn),\n };\n\n firstCell = findTableCellElement(parsedTable, firstCell) || firstCell;\n lastCell = findLastedCoInMergedCell(parsedTable, lastCell) || lastCell;\n\n if (\n isNaN(firstCell.row) ||\n isNaN(firstCell.col) ||\n isNaN(lastCell.row) ||\n isNaN(lastCell.col)\n ) {\n return;\n }\n\n selection = {\n type: 'table',\n table,\n firstRow: firstCell.row,\n firstColumn: firstCell.col,\n lastRow: lastCell.row,\n lastColumn: lastCell.col,\n tableSelectionInfo: selection.tableSelectionInfo,\n };\n\n core.selection.selection = selection;\n\n setTableCellsStyle(core, table, parsedTable, firstCell, lastCell);\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n toggleCaret(core, true /* hide */);\n\n const nodeToSelect = firstCell.cell?.firstElementChild || firstCell.cell;\n\n if (nodeToSelect) {\n setRangeSelection(\n doc,\n (nodeToSelect as HTMLElement) || undefined,\n true /* collapse */\n );\n }\n\n break;\n case 'range':\n addRangeToSelection(doc, selection.range, selection.isReverted);\n\n core.selection.selection = core.domHelper.hasFocus() ? null : selection;\n break;\n\n default:\n core.selection.selection = null;\n break;\n }\n } finally {\n core.selection.skipReselectOnFocus = skipReselectOnFocus;\n }\n\n if (!skipSelectionChangedEvent) {\n const eventData: SelectionChangedEvent = {\n eventType: 'selectionChanged',\n newSelection: selection,\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n }\n};\n\nfunction setRangeSelection(doc: Document, element: HTMLElement | undefined, collapse: boolean) {\n if (element && doc.contains(element)) {\n const range = doc.createRange();\n let isReverted: boolean | undefined = undefined;\n\n range.selectNode(element);\n if (collapse) {\n range.collapse();\n } else {\n const selection = doc.defaultView?.getSelection();\n const range = selection && selection.rangeCount > 0 && selection.getRangeAt(0);\n if (selection && range) {\n isReverted =\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset;\n }\n }\n\n addRangeToSelection(doc, range, isReverted);\n }\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { EditorCore, ParsedTable, TableCellCoordinate } from 'roosterjs-content-model-types';
2
+ /**
3
+ * @internal
4
+ * Remove table cell selection styles
5
+ * @param core The EditorCore object
6
+ */
7
+ export declare function removeTableCellsStyle(core: EditorCore): void;
8
+ /**
9
+ * @internal
10
+ * Set style for table cells in the selection
11
+ * @param core The EditorCore object
12
+ * @param table The HTML table element
13
+ * @param parsedTable The parsed table structure
14
+ * @param firstCell The coordinates of the first selected cell
15
+ * @param lastCell The coordinates of the last selected cell
16
+ */
17
+ export declare function setTableCellsStyle(core: EditorCore, table: HTMLTableElement, parsedTable: ParsedTable, firstCell: TableCellCoordinate, lastCell: TableCellCoordinate): void;
@@ -0,0 +1,85 @@
1
+ define(["require", "exports", "../setEditorStyle/ensureUniqueId", "roosterjs-content-model-dom"], function (require, exports, ensureUniqueId_1, roosterjs_content_model_dom_1) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.setTableCellsStyle = exports.removeTableCellsStyle = void 0;
5
+ var DOM_SELECTION_CSS_KEY = '_DOMSelection';
6
+ var TABLE_ID = 'table';
7
+ /**
8
+ * @internal
9
+ * Remove table cell selection styles
10
+ * @param core The EditorCore object
11
+ */
12
+ function removeTableCellsStyle(core) {
13
+ core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, '');
14
+ }
15
+ exports.removeTableCellsStyle = removeTableCellsStyle;
16
+ /**
17
+ * @internal
18
+ * Set style for table cells in the selection
19
+ * @param core The EditorCore object
20
+ * @param table The HTML table element
21
+ * @param parsedTable The parsed table structure
22
+ * @param firstCell The coordinates of the first selected cell
23
+ * @param lastCell The coordinates of the last selected cell
24
+ */
25
+ function setTableCellsStyle(core, table, parsedTable, firstCell, lastCell) {
26
+ var _a, _b;
27
+ var tableId = (0, ensureUniqueId_1.ensureUniqueId)(table, TABLE_ID);
28
+ var tableSelector = (0, roosterjs_content_model_dom_1.getSafeIdSelector)(tableId);
29
+ var tableSelectionColor = core.lifecycle.isDarkMode
30
+ ? core.selection.tableCellSelectionBackgroundColorDark
31
+ : core.selection.tableCellSelectionBackgroundColor;
32
+ var tableSelectors = firstCell.row == 0 &&
33
+ firstCell.col == 0 &&
34
+ lastCell.row == parsedTable.length - 1 &&
35
+ lastCell.col == ((_b = (_a = parsedTable[lastCell.row]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1
36
+ ? [tableSelector, tableSelector + " *"]
37
+ : buildTableSelectors(parsedTable, tableSelector, table, firstCell, lastCell);
38
+ core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "background-color:" + tableSelectionColor + "!important;", tableSelectors);
39
+ }
40
+ exports.setTableCellsStyle = setTableCellsStyle;
41
+ /**
42
+ * @internal
43
+ * Build CSS selectors for table cells within the selection range
44
+ */
45
+ function buildTableSelectors(parsedTable, tableSelector, table, firstCell, lastCell) {
46
+ var selectors = [];
47
+ var cont = 0;
48
+ var indexes = (0, roosterjs_content_model_dom_1.toArray)(table.childNodes)
49
+ .filter(function (node) {
50
+ return ['THEAD', 'TBODY', 'TFOOT'].indexOf((0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE') ? node.tagName : '') > -1;
51
+ })
52
+ .map(function (node) {
53
+ var result = {
54
+ el: node.tagName,
55
+ start: cont,
56
+ end: node.childNodes.length + cont,
57
+ };
58
+ cont = result.end;
59
+ return result;
60
+ });
61
+ parsedTable.forEach(function (row, rowIndex) {
62
+ var tdCount = 0;
63
+ var midElement = indexes.filter(function (ind) { return ind.start <= rowIndex && ind.end > rowIndex; })[0];
64
+ var middleElSelector = midElement ? '>' + midElement.el + '>' : '>';
65
+ var currentRow = midElement && rowIndex + 1 >= midElement.start
66
+ ? rowIndex + 1 - midElement.start
67
+ : rowIndex + 1;
68
+ for (var cellIndex = 0; cellIndex < row.length; cellIndex++) {
69
+ var cell = row[cellIndex];
70
+ if (typeof cell == 'object') {
71
+ tdCount++;
72
+ if (rowIndex >= firstCell.row &&
73
+ rowIndex <= lastCell.row &&
74
+ cellIndex >= firstCell.col &&
75
+ cellIndex <= lastCell.col) {
76
+ var selector = "" + tableSelector + middleElSelector + " tr:nth-child(" + currentRow + ")>" + cell.tagName + ":nth-child(" + tdCount + ")";
77
+ selectors.push(selector, selector + ' *');
78
+ }
79
+ }
80
+ }
81
+ });
82
+ return selectors;
83
+ }
84
+ });
85
+ //# sourceMappingURL=setTableCellsStyle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setTableCellsStyle.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setTableCellsStyle.ts"],"names":[],"mappings":"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","sourcesContent":["import { ensureUniqueId } from '../setEditorStyle/ensureUniqueId';\nimport { getSafeIdSelector, isNodeOfType, toArray } from 'roosterjs-content-model-dom';\nimport type { EditorCore, ParsedTable, TableCellCoordinate } from 'roosterjs-content-model-types';\n\nconst DOM_SELECTION_CSS_KEY = '_DOMSelection';\nconst TABLE_ID = 'table';\n\n/**\n * @internal\n * Remove table cell selection styles\n * @param core The EditorCore object\n */\nexport function removeTableCellsStyle(core: EditorCore) {\n core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, '');\n}\n\n/**\n * @internal\n * Set style for table cells in the selection\n * @param core The EditorCore object\n * @param table The HTML table element\n * @param parsedTable The parsed table structure\n * @param firstCell The coordinates of the first selected cell\n * @param lastCell The coordinates of the last selected cell\n */\nexport function setTableCellsStyle(\n core: EditorCore,\n table: HTMLTableElement,\n parsedTable: ParsedTable,\n firstCell: TableCellCoordinate,\n lastCell: TableCellCoordinate\n) {\n const tableId = ensureUniqueId(table, TABLE_ID);\n const tableSelector = getSafeIdSelector(tableId);\n const tableSelectionColor = core.lifecycle.isDarkMode\n ? core.selection.tableCellSelectionBackgroundColorDark\n : core.selection.tableCellSelectionBackgroundColor;\n\n const tableSelectors =\n firstCell.row == 0 &&\n firstCell.col == 0 &&\n lastCell.row == parsedTable.length - 1 &&\n lastCell.col == (parsedTable[lastCell.row]?.length ?? 0) - 1\n ? [tableSelector, `${tableSelector} *`]\n : buildTableSelectors(parsedTable, tableSelector, table, firstCell, lastCell);\n\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `background-color:${tableSelectionColor}!important;`,\n tableSelectors\n );\n}\n\n/**\n * @internal\n * Build CSS selectors for table cells within the selection range\n */\nfunction buildTableSelectors(\n parsedTable: ParsedTable,\n tableSelector: string,\n table: HTMLTableElement,\n firstCell: TableCellCoordinate,\n lastCell: TableCellCoordinate\n): string[] {\n const selectors: string[] = [];\n\n let cont = 0;\n const indexes = toArray(table.childNodes)\n .filter(\n (node): node is HTMLTableSectionElement =>\n ['THEAD', 'TBODY', 'TFOOT'].indexOf(\n isNodeOfType(node, 'ELEMENT_NODE') ? node.tagName : ''\n ) > -1\n )\n .map(node => {\n const result = {\n el: node.tagName,\n start: cont,\n end: node.childNodes.length + cont,\n };\n\n cont = result.end;\n return result;\n });\n\n parsedTable.forEach((row, rowIndex) => {\n let tdCount = 0;\n\n const midElement = indexes.filter(ind => ind.start <= rowIndex && ind.end > rowIndex)[0];\n const middleElSelector = midElement ? '>' + midElement.el + '>' : '>';\n const currentRow =\n midElement && rowIndex + 1 >= midElement.start\n ? rowIndex + 1 - midElement.start\n : rowIndex + 1;\n\n for (let cellIndex = 0; cellIndex < row.length; cellIndex++) {\n const cell = row[cellIndex];\n\n if (typeof cell == 'object') {\n tdCount++;\n\n if (\n rowIndex >= firstCell.row &&\n rowIndex <= lastCell.row &&\n cellIndex >= firstCell.col &&\n cellIndex <= lastCell.col\n ) {\n const selector = `${tableSelector}${middleElSelector} tr:nth-child(${currentRow})>${cell.tagName}:nth-child(${tdCount})`;\n\n selectors.push(selector, selector + ' *');\n }\n }\n }\n });\n\n return selectors;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { EditorCore } from 'roosterjs-content-model-types';
2
+ /**
3
+ * @internal
4
+ * Toggle table selection styles on/off
5
+ * @param core The EditorCore object
6
+ * @param isHiding True to hide the table selection background, false to show it
7
+ */
8
+ export declare function toggleTableSelection(core: EditorCore, isHiding: boolean): void;
@@ -0,0 +1,34 @@
1
+ define(["require", "exports", "roosterjs-content-model-dom", "./setTableCellsStyle"], function (require, exports, roosterjs_content_model_dom_1, setTableCellsStyle_1) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.toggleTableSelection = void 0;
5
+ /**
6
+ * @internal
7
+ * Toggle table selection styles on/off
8
+ * @param core The EditorCore object
9
+ * @param isHiding True to hide the table selection background, false to show it
10
+ */
11
+ function toggleTableSelection(core, isHiding) {
12
+ var selection = core.selection.selection;
13
+ if ((selection === null || selection === void 0 ? void 0 : selection.type) === 'table') {
14
+ if (isHiding) {
15
+ (0, setTableCellsStyle_1.removeTableCellsStyle)(core);
16
+ }
17
+ else {
18
+ var table = selection.table, firstColumn = selection.firstColumn, firstRow = selection.firstRow, lastColumn = selection.lastColumn, lastRow = selection.lastRow;
19
+ var parsedTable = (0, roosterjs_content_model_dom_1.parseTableCells)(table);
20
+ var firstCell = {
21
+ row: Math.min(firstRow, lastRow),
22
+ col: Math.min(firstColumn, lastColumn),
23
+ };
24
+ var lastCell = {
25
+ row: Math.max(firstRow, lastRow),
26
+ col: Math.max(firstColumn, lastColumn),
27
+ };
28
+ (0, setTableCellsStyle_1.setTableCellsStyle)(core, table, parsedTable, firstCell, lastCell);
29
+ }
30
+ }
31
+ }
32
+ exports.toggleTableSelection = toggleTableSelection;
33
+ });
34
+ //# sourceMappingURL=toggleTableSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggleTableSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/toggleTableSelection.ts"],"names":[],"mappings":";;;;IAKA;;;;;OAKG;IACH,SAAgB,oBAAoB,CAAC,IAAgB,EAAE,QAAiB;QACpE,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAE3C,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,MAAK,OAAO,EAAE;YAC7B,IAAI,QAAQ,EAAE;gBACV,IAAA,0CAAqB,EAAC,IAAI,CAAC,CAAC;aAC/B;iBAAM;gBACK,IAAA,KAAK,GAAiD,SAAS,MAA1D,EAAE,WAAW,GAAoC,SAAS,YAA7C,EAAE,QAAQ,GAA0B,SAAS,SAAnC,EAAE,UAAU,GAAc,SAAS,WAAvB,EAAE,OAAO,GAAK,SAAS,QAAd,CAAe;gBACxE,IAAM,WAAW,GAAG,IAAA,6CAAe,EAAC,KAAK,CAAC,CAAC;gBAC3C,IAAM,SAAS,GAAwB;oBACnC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;oBAChC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC;iBACzC,CAAC;gBACF,IAAM,QAAQ,GAAwB;oBAClC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;oBAChC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC;iBACzC,CAAC;gBAEF,IAAA,uCAAkB,EAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;aACrE;SACJ;IACL,CAAC;IArBD,oDAqBC","sourcesContent":["import { parseTableCells } from 'roosterjs-content-model-dom';\nimport { removeTableCellsStyle, setTableCellsStyle } from './setTableCellsStyle';\n\nimport type { EditorCore, TableCellCoordinate } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Toggle table selection styles on/off\n * @param core The EditorCore object\n * @param isHiding True to hide the table selection background, false to show it\n */\nexport function toggleTableSelection(core: EditorCore, isHiding: boolean) {\n const selection = core.selection.selection;\n\n if (selection?.type === 'table') {\n if (isHiding) {\n removeTableCellsStyle(core);\n } else {\n const { table, firstColumn, firstRow, lastColumn, lastRow } = selection;\n const parsedTable = parseTableCells(table);\n const firstCell: TableCellCoordinate = {\n row: Math.min(firstRow, lastRow),\n col: Math.min(firstColumn, lastColumn),\n };\n const lastCell: TableCellCoordinate = {\n row: Math.max(firstRow, lastRow),\n col: Math.max(firstColumn, lastColumn),\n };\n\n setTableCellsStyle(core, table, parsedTable, firstCell, lastCell);\n }\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- define(["require", "exports", "roosterjs-content-model-dom", "../setDOMSelection/toggleCaret"], function (require, exports, roosterjs_content_model_dom_1, toggleCaret_1) {
1
+ define(["require", "exports", "roosterjs-content-model-dom", "../setDOMSelection/toggleCaret", "../setDOMSelection/toggleTableSelection"], function (require, exports, roosterjs_content_model_dom_1, toggleCaret_1, toggleTableSelection_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.switchShadowEdit = void 0;
@@ -25,11 +25,13 @@ define(["require", "exports", "roosterjs-content-model-dom", "../setDOMSelection
25
25
  core.cache.cachedModel = model;
26
26
  }
27
27
  (0, toggleCaret_1.toggleCaret)(core, true /* hide */);
28
+ (0, toggleTableSelection_1.toggleTableSelection)(core, true /* hide */);
28
29
  core.lifecycle.shadowEditFragment = fragment;
29
30
  }
30
31
  else {
31
32
  core.lifecycle.shadowEditFragment = null;
32
33
  (0, toggleCaret_1.toggleCaret)(core, false /* hide */);
34
+ (0, toggleTableSelection_1.toggleTableSelection)(core, false /* hide */);
33
35
  core.api.triggerEvent(core, {
34
36
  eventType: 'leavingShadowEdit',
35
37
  }, false /*broadcast*/);
@@ -1 +1 @@
1
- {"version":3,"file":"switchShadowEdit.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/switchShadowEdit/switchShadowEdit.ts"],"names":[],"mappings":";;;;IAIA;;;;;OAKG;IACI,IAAM,gBAAgB,GAAqB,UAAC,UAAU,EAAE,IAAI;QAC/D,IAAM,IAAI,GAAG,UAAU,CAAC;QAExB,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;YAC7C,IAAI,IAAI,EAAE;gBACN,IAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjF,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;gBACzE,IAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAE7D,IAAA,4CAAc,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAErC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;oBACI,SAAS,EAAE,mBAAmB;iBACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;gBAEF,oIAAoI;gBACpI,6DAA6D;gBAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,EAAE;oBAClC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;iBAClC;gBAED,IAAA,yBAAW,EAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBAEnC,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,QAAQ,CAAC;aAChD;iBAAM;gBACH,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAEzC,IAAA,yBAAW,EAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBAEpC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;oBACI,SAAS,EAAE,mBAAmB;iBACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;gBAEF,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBACxB,iDAAiD;oBACjD,IAAA,+CAAiB,EAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,cAAO,CAAC,CAAC,CAAC;oBAEpD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;wBACnD,eAAe,EAAE,IAAI,EAAE,qGAAqG;qBAC/H,CAAC,CAAC;iBACN;aACJ;SACJ;IACL,CAAC,CAAC;IAnDW,QAAA,gBAAgB,oBAmD3B","sourcesContent":["import { iterateSelections, moveChildNodes } from 'roosterjs-content-model-dom';\nimport { toggleCaret } from '../setDOMSelection/toggleCaret';\nimport type { SwitchShadowEdit } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Switch the Shadow Edit mode of editor On/Off\n * @param editorCore The EditorCore object\n * @param isOn True to switch On, False to switch Off\n */\nexport const switchShadowEdit: SwitchShadowEdit = (editorCore, isOn): void => {\n const core = editorCore;\n\n if (isOn != !!core.lifecycle.shadowEditFragment) {\n if (isOn) {\n const model = !core.cache.cachedModel ? core.api.createContentModel(core) : null;\n const fragment = core.logicalRoot.ownerDocument.createDocumentFragment();\n const clonedRoot = core.logicalRoot.cloneNode(true /*deep*/);\n\n moveChildNodes(fragment, clonedRoot);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'enteredShadowEdit',\n },\n false /*broadcast*/\n );\n\n // This need to be done after EnteredShadowEdit event is triggered since EnteredShadowEdit event will cause a SelectionChanged event\n // if current selection is table selection or image selection\n if (!core.cache.cachedModel && model) {\n core.cache.cachedModel = model;\n }\n\n toggleCaret(core, true /* hide */);\n\n core.lifecycle.shadowEditFragment = fragment;\n } else {\n core.lifecycle.shadowEditFragment = null;\n\n toggleCaret(core, false /* hide */);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'leavingShadowEdit',\n },\n false /*broadcast*/\n );\n\n if (core.cache.cachedModel) {\n // Force clear cached element from selected block\n iterateSelections(core.cache.cachedModel, () => {});\n\n core.api.setContentModel(core, core.cache.cachedModel, {\n ignoreSelection: true, // Do not set focus and selection when quit shadow edit, focus may remain in UI control (picker, ...)\n });\n }\n }\n }\n};\n"]}
1
+ {"version":3,"file":"switchShadowEdit.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/switchShadowEdit/switchShadowEdit.ts"],"names":[],"mappings":";;;;IAKA;;;;;OAKG;IACI,IAAM,gBAAgB,GAAqB,UAAC,UAAU,EAAE,IAAI;QAC/D,IAAM,IAAI,GAAG,UAAU,CAAC;QAExB,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;YAC7C,IAAI,IAAI,EAAE;gBACN,IAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjF,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;gBACzE,IAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAE7D,IAAA,4CAAc,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAErC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;oBACI,SAAS,EAAE,mBAAmB;iBACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;gBAEF,oIAAoI;gBACpI,6DAA6D;gBAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,EAAE;oBAClC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;iBAClC;gBAED,IAAA,yBAAW,EAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBACnC,IAAA,2CAAoB,EAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBAE5C,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,QAAQ,CAAC;aAChD;iBAAM;gBACH,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAEzC,IAAA,yBAAW,EAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBACpC,IAAA,2CAAoB,EAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBAE7C,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;oBACI,SAAS,EAAE,mBAAmB;iBACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;gBAEF,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBACxB,iDAAiD;oBACjD,IAAA,+CAAiB,EAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,cAAO,CAAC,CAAC,CAAC;oBAEpD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;wBACnD,eAAe,EAAE,IAAI,EAAE,qGAAqG;qBAC/H,CAAC,CAAC;iBACN;aACJ;SACJ;IACL,CAAC,CAAC;IArDW,QAAA,gBAAgB,oBAqD3B","sourcesContent":["import { iterateSelections, moveChildNodes } from 'roosterjs-content-model-dom';\nimport { toggleCaret } from '../setDOMSelection/toggleCaret';\nimport { toggleTableSelection } from '../setDOMSelection/toggleTableSelection';\nimport type { SwitchShadowEdit } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Switch the Shadow Edit mode of editor On/Off\n * @param editorCore The EditorCore object\n * @param isOn True to switch On, False to switch Off\n */\nexport const switchShadowEdit: SwitchShadowEdit = (editorCore, isOn): void => {\n const core = editorCore;\n\n if (isOn != !!core.lifecycle.shadowEditFragment) {\n if (isOn) {\n const model = !core.cache.cachedModel ? core.api.createContentModel(core) : null;\n const fragment = core.logicalRoot.ownerDocument.createDocumentFragment();\n const clonedRoot = core.logicalRoot.cloneNode(true /*deep*/);\n\n moveChildNodes(fragment, clonedRoot);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'enteredShadowEdit',\n },\n false /*broadcast*/\n );\n\n // This need to be done after EnteredShadowEdit event is triggered since EnteredShadowEdit event will cause a SelectionChanged event\n // if current selection is table selection or image selection\n if (!core.cache.cachedModel && model) {\n core.cache.cachedModel = model;\n }\n\n toggleCaret(core, true /* hide */);\n toggleTableSelection(core, true /* hide */);\n\n core.lifecycle.shadowEditFragment = fragment;\n } else {\n core.lifecycle.shadowEditFragment = null;\n\n toggleCaret(core, false /* hide */);\n toggleTableSelection(core, false /* hide */);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'leavingShadowEdit',\n },\n false /*broadcast*/\n );\n\n if (core.cache.cachedModel) {\n // Force clear cached element from selected block\n iterateSelections(core.cache.cachedModel, () => {});\n\n core.api.setContentModel(core, core.cache.cachedModel, {\n ignoreSelection: true, // Do not set focus and selection when quit shadow edit, focus may remain in UI control (picker, ...)\n });\n }\n }\n }\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 ((0, roosterjs_content_model_dom_1.findClosestEntityWrapper)(target, _this.domHelper) ||
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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","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 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"]}
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 () { return _this.handleSelectionInTable(key); });
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
- this.setRangeSelectionInTable(td, key == Up ? td.childNodes.length : 0, this.editor);
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 */);
@@ -452,6 +462,9 @@ define(["require", "exports", "./findCoordinate", "../../coreApi/setDOMSelection
452
462
  break;
453
463
  }
454
464
  }
465
+ if (this.editor.getSnapshotsManager().hasNewContent) {
466
+ this.editor.takeSnapshot();
467
+ }
455
468
  }
456
469
  else {
457
470
  this.state.tableSelection = null;
@@ -470,8 +483,23 @@ define(["require", "exports", "./findCoordinate", "../../coreApi/setDOMSelection
470
483
  }
471
484
  }
472
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
+ };
473
500
  SelectionPlugin.prototype.setRangeSelectionInTable = function (cell, nodeOffset, editor, selectAll) {
474
- var range = editor.getDocument().createRange();
501
+ var doc = editor.getDocument();
502
+ var range = doc.createRange();
475
503
  if (selectAll && cell.firstChild && cell.lastChild) {
476
504
  var cellStart = cell.firstChild;
477
505
  var cellEnd = cell.lastChild;