roosterjs-content-model-plugins 9.3.1 → 9.4.1

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 (85) hide show
  1. package/lib/autoFormat/link/createLink.js +10 -0
  2. package/lib/autoFormat/link/createLink.js.map +1 -1
  3. package/lib/autoFormat/list/getListTypeStyle.d.ts +2 -2
  4. package/lib/autoFormat/list/getListTypeStyle.js.map +1 -1
  5. package/lib/edit/EditPlugin.d.ts +1 -0
  6. package/lib/edit/EditPlugin.js +9 -10
  7. package/lib/edit/EditPlugin.js.map +1 -1
  8. package/lib/edit/deleteSteps/deleteCollapsedSelection.js +4 -4
  9. package/lib/edit/deleteSteps/deleteCollapsedSelection.js.map +1 -1
  10. package/lib/edit/deleteSteps/deleteEmptyQuote.js +1 -1
  11. package/lib/edit/deleteSteps/deleteEmptyQuote.js.map +1 -1
  12. package/lib/edit/deleteSteps/deleteWordSelection.js.map +1 -1
  13. package/lib/edit/inputSteps/handleEnterOnList.js +3 -3
  14. package/lib/edit/inputSteps/handleEnterOnList.js.map +1 -1
  15. package/lib/edit/utils/getLeafSiblingBlock.d.ts +23 -1
  16. package/lib/edit/utils/getLeafSiblingBlock.js +0 -3
  17. package/lib/edit/utils/getLeafSiblingBlock.js.map +1 -1
  18. package/lib/tableEdit/editors/features/CellResizer.js +3 -15
  19. package/lib/tableEdit/editors/features/CellResizer.js.map +1 -1
  20. package/lib/tableEdit/editors/features/TableMover.js +4 -14
  21. package/lib/tableEdit/editors/features/TableMover.js.map +1 -1
  22. package/lib/tableEdit/editors/features/TableResizer.js +3 -15
  23. package/lib/tableEdit/editors/features/TableResizer.js.map +1 -1
  24. package/lib/tableEdit/editors/utils/getTableFromContentModel.d.ts +6 -0
  25. package/lib/tableEdit/editors/utils/getTableFromContentModel.js +29 -0
  26. package/lib/tableEdit/editors/utils/getTableFromContentModel.js.map +1 -0
  27. package/lib/watermark/isModelEmptyFast.d.ts +2 -2
  28. package/lib/watermark/isModelEmptyFast.js.map +1 -1
  29. package/lib-amd/autoFormat/link/createLink.js +10 -0
  30. package/lib-amd/autoFormat/link/createLink.js.map +1 -1
  31. package/lib-amd/autoFormat/list/getListTypeStyle.d.ts +2 -2
  32. package/lib-amd/autoFormat/list/getListTypeStyle.js.map +1 -1
  33. package/lib-amd/edit/EditPlugin.d.ts +1 -0
  34. package/lib-amd/edit/EditPlugin.js +9 -10
  35. package/lib-amd/edit/EditPlugin.js.map +1 -1
  36. package/lib-amd/edit/deleteSteps/deleteCollapsedSelection.js +4 -4
  37. package/lib-amd/edit/deleteSteps/deleteCollapsedSelection.js.map +1 -1
  38. package/lib-amd/edit/deleteSteps/deleteEmptyQuote.js +1 -1
  39. package/lib-amd/edit/deleteSteps/deleteEmptyQuote.js.map +1 -1
  40. package/lib-amd/edit/deleteSteps/deleteWordSelection.js.map +1 -1
  41. package/lib-amd/edit/inputSteps/handleEnterOnList.js +3 -3
  42. package/lib-amd/edit/inputSteps/handleEnterOnList.js.map +1 -1
  43. package/lib-amd/edit/utils/getLeafSiblingBlock.d.ts +23 -1
  44. package/lib-amd/edit/utils/getLeafSiblingBlock.js +0 -3
  45. package/lib-amd/edit/utils/getLeafSiblingBlock.js.map +1 -1
  46. package/lib-amd/tableEdit/editors/features/CellResizer.js +3 -16
  47. package/lib-amd/tableEdit/editors/features/CellResizer.js.map +1 -1
  48. package/lib-amd/tableEdit/editors/features/TableMover.js +4 -15
  49. package/lib-amd/tableEdit/editors/features/TableMover.js.map +1 -1
  50. package/lib-amd/tableEdit/editors/features/TableResizer.js +3 -16
  51. package/lib-amd/tableEdit/editors/features/TableResizer.js.map +1 -1
  52. package/lib-amd/tableEdit/editors/utils/getTableFromContentModel.d.ts +6 -0
  53. package/lib-amd/tableEdit/editors/utils/getTableFromContentModel.js +29 -0
  54. package/lib-amd/tableEdit/editors/utils/getTableFromContentModel.js.map +1 -0
  55. package/lib-amd/watermark/isModelEmptyFast.d.ts +2 -2
  56. package/lib-amd/watermark/isModelEmptyFast.js.map +1 -1
  57. package/lib-mjs/autoFormat/link/createLink.js +10 -0
  58. package/lib-mjs/autoFormat/link/createLink.js.map +1 -1
  59. package/lib-mjs/autoFormat/list/getListTypeStyle.d.ts +2 -2
  60. package/lib-mjs/autoFormat/list/getListTypeStyle.js.map +1 -1
  61. package/lib-mjs/edit/EditPlugin.d.ts +1 -0
  62. package/lib-mjs/edit/EditPlugin.js +9 -10
  63. package/lib-mjs/edit/EditPlugin.js.map +1 -1
  64. package/lib-mjs/edit/deleteSteps/deleteCollapsedSelection.js +5 -5
  65. package/lib-mjs/edit/deleteSteps/deleteCollapsedSelection.js.map +1 -1
  66. package/lib-mjs/edit/deleteSteps/deleteEmptyQuote.js +2 -2
  67. package/lib-mjs/edit/deleteSteps/deleteEmptyQuote.js.map +1 -1
  68. package/lib-mjs/edit/deleteSteps/deleteWordSelection.js.map +1 -1
  69. package/lib-mjs/edit/inputSteps/handleEnterOnList.js +4 -4
  70. package/lib-mjs/edit/inputSteps/handleEnterOnList.js.map +1 -1
  71. package/lib-mjs/edit/utils/getLeafSiblingBlock.d.ts +23 -1
  72. package/lib-mjs/edit/utils/getLeafSiblingBlock.js +0 -3
  73. package/lib-mjs/edit/utils/getLeafSiblingBlock.js.map +1 -1
  74. package/lib-mjs/tableEdit/editors/features/CellResizer.js +4 -16
  75. package/lib-mjs/tableEdit/editors/features/CellResizer.js.map +1 -1
  76. package/lib-mjs/tableEdit/editors/features/TableMover.js +4 -14
  77. package/lib-mjs/tableEdit/editors/features/TableMover.js.map +1 -1
  78. package/lib-mjs/tableEdit/editors/features/TableResizer.js +4 -16
  79. package/lib-mjs/tableEdit/editors/features/TableResizer.js.map +1 -1
  80. package/lib-mjs/tableEdit/editors/utils/getTableFromContentModel.d.ts +6 -0
  81. package/lib-mjs/tableEdit/editors/utils/getTableFromContentModel.js +25 -0
  82. package/lib-mjs/tableEdit/editors/utils/getTableFromContentModel.js.map +1 -0
  83. package/lib-mjs/watermark/isModelEmptyFast.d.ts +2 -2
  84. package/lib-mjs/watermark/isModelEmptyFast.js.map +1 -1
  85. package/package.json +5 -5
@@ -30,8 +30,9 @@ define(["require", "exports", "../utils/getLeafSiblingBlock", "roosterjs-content
30
30
  context.deleteResult = 'range';
31
31
  }
32
32
  else if ((blockToDelete = (0, getLeafSiblingBlock_1.getLeafSiblingBlock)(path, paragraph, isForward))) {
33
- var block = blockToDelete.block, path_1 = blockToDelete.path, siblingSegment = blockToDelete.siblingSegment;
34
- if (block.blockType == 'Paragraph') {
33
+ var readonlyBlock = blockToDelete.block, path_1 = blockToDelete.path, siblingSegment = blockToDelete.siblingSegment;
34
+ if (readonlyBlock.blockType == 'Paragraph') {
35
+ var block = (0, roosterjs_content_model_dom_1.mutateBlock)(readonlyBlock);
35
36
  if (siblingSegment) {
36
37
  // When selection is under general segment, need to check if it has a sibling sibling, and delete from it
37
38
  if ((0, roosterjs_content_model_dom_1.deleteSegment)(block, siblingSegment, context.formatContext, direction)) {
@@ -53,7 +54,6 @@ define(["require", "exports", "../utils/getLeafSiblingBlock", "roosterjs-content
53
54
  tableContext: tableContext,
54
55
  };
55
56
  context.lastParagraph = paragraph;
56
- delete block.cachedElement;
57
57
  }
58
58
  context.deleteResult = 'range';
59
59
  }
@@ -61,7 +61,7 @@ define(["require", "exports", "../utils/getLeafSiblingBlock", "roosterjs-content
61
61
  context.lastTableContext = tableContext;
62
62
  }
63
63
  else {
64
- if ((0, roosterjs_content_model_dom_1.deleteBlock)(path_1[0].blocks, block, undefined /*replacement*/, context.formatContext, direction)) {
64
+ if ((0, roosterjs_content_model_dom_1.deleteBlock)((0, roosterjs_content_model_dom_1.mutateBlock)(path_1[0]).blocks, readonlyBlock, undefined /*replacement*/, context.formatContext, direction)) {
65
65
  context.deleteResult = 'range';
66
66
  }
67
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deleteCollapsedSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteCollapsedSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLeafSiblingBlock } from '../utils/getLeafSiblingBlock';\nimport { setModelIndentation } from 'roosterjs-content-model-api';\nimport {\n deleteBlock,\n deleteSegment,\n getClosestAncestorBlockGroupIndex,\n setParagraphNotImplicit,\n} from 'roosterjs-content-model-dom';\nimport type { BlockAndPath } from '../utils/getLeafSiblingBlock';\nimport type {\n ContentModelBlockGroup,\n ContentModelDocument,\n ContentModelParagraph,\n ContentModelSegment,\n DeleteSelectionStep,\n} from 'roosterjs-content-model-types';\n\nfunction getDeleteCollapsedSelection(direction: 'forward' | 'backward'): DeleteSelectionStep {\n return context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const isForward = direction == 'forward';\n const { paragraph, marker, path, tableContext } = context.insertPoint;\n const segments = paragraph.segments;\n\n fixupBr(segments);\n\n const index = segments.indexOf(marker) + (isForward ? 1 : -1);\n const segmentToDelete = segments[index];\n let blockToDelete: BlockAndPath | null;\n let root: ContentModelDocument | null;\n\n if (segmentToDelete) {\n if (deleteSegment(paragraph, segmentToDelete, context.formatContext, direction)) {\n context.deleteResult = 'singleChar';\n\n // It is possible that we have deleted everything from this paragraph, so we need to mark it as not implicit\n // to avoid losing its format. See https://github.com/microsoft/roosterjs/issues/1953\n setParagraphNotImplicit(paragraph);\n }\n } else if (\n shouldOutdentParagraph(isForward, segments, paragraph, path) &&\n (root = getRoot(path))\n ) {\n setModelIndentation(root, 'outdent');\n context.deleteResult = 'range';\n } else if ((blockToDelete = getLeafSiblingBlock(path, paragraph, isForward))) {\n const { block, path, siblingSegment } = blockToDelete;\n\n if (block.blockType == 'Paragraph') {\n if (siblingSegment) {\n // When selection is under general segment, need to check if it has a sibling sibling, and delete from it\n if (deleteSegment(block, siblingSegment, context.formatContext, direction)) {\n context.deleteResult = 'range';\n }\n } else {\n if (isForward) {\n context.lastParagraph = block;\n } else {\n if (block.segments[block.segments.length - 1]?.segmentType == 'Br') {\n block.segments.pop();\n }\n\n context.insertPoint = {\n marker,\n paragraph: block,\n path,\n tableContext,\n };\n context.lastParagraph = paragraph;\n delete block.cachedElement;\n }\n\n context.deleteResult = 'range';\n }\n\n // When go across table, getLeafSiblingBlock will return null, when we are here, we must be in the same table context\n context.lastTableContext = tableContext;\n } else {\n if (\n deleteBlock(\n path[0].blocks,\n block,\n undefined /*replacement*/,\n context.formatContext,\n direction\n )\n ) {\n context.deleteResult = 'range';\n }\n }\n } else {\n // We have nothing to delete, in this case we don't want browser handle it as well.\n // Because when Backspace on an empty document, it will also delete the only DIV and SPAN element, causes\n // editor is really empty. We don't want that happen. So the handling should stop here.\n context.deleteResult = 'nothingToDelete';\n }\n };\n}\n\nfunction getRoot(path: ContentModelBlockGroup[]): ContentModelDocument | null {\n const lastInPath = path[path.length - 1];\n return lastInPath.blockGroupType == 'Document' ? lastInPath : null;\n}\n\nfunction shouldOutdentParagraph(\n isForward: boolean,\n segments: ContentModelSegment[],\n paragraph: ContentModelParagraph,\n path: ContentModelBlockGroup[]\n) {\n return (\n !isForward &&\n segments.length == 1 &&\n segments[0].segmentType == 'SelectionMarker' &&\n paragraph.format.marginLeft &&\n parseInt(paragraph.format.marginLeft) &&\n getClosestAncestorBlockGroupIndex(path, ['Document', 'TableCell'], ['ListItem']) > -1\n );\n}\n\n/**\n * If the last segment is BR, remove it for now. We may add it back later when normalize model.\n * So that if this is an empty paragraph, it will start to delete next block\n */\nfunction fixupBr(segments: ContentModelSegment[]) {\n if (segments[segments.length - 1]?.segmentType == 'Br') {\n const segmentsWithoutBr = segments.filter(x => x.segmentType != 'SelectionMarker');\n\n if (segmentsWithoutBr[segmentsWithoutBr.length - 2]?.segmentType != 'Br') {\n segments.pop();\n }\n }\n}\n\n/**\n * @internal if we didn't delete anything, and we want to delete forward, now perform it\n */\nexport const forwardDeleteCollapsedSelection = getDeleteCollapsedSelection('forward');\n\n/**\n * @internal if we didn't delete anything, and we want to delete backward, now perform it\n */\nexport const backwardDeleteCollapsedSelection = getDeleteCollapsedSelection('backward');\n"]}
1
+ {"version":3,"file":"deleteCollapsedSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteCollapsedSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLeafSiblingBlock } from '../utils/getLeafSiblingBlock';\nimport { setModelIndentation } from 'roosterjs-content-model-api';\nimport {\n deleteBlock,\n deleteSegment,\n getClosestAncestorBlockGroupIndex,\n mutateBlock,\n setParagraphNotImplicit,\n} from 'roosterjs-content-model-dom';\nimport type { ReadonlyBlockAndPath } from '../utils/getLeafSiblingBlock';\nimport type {\n DeleteSelectionStep,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ShallowMutableContentModelParagraph,\n ShallowMutableContentModelSegment,\n} from 'roosterjs-content-model-types';\n\nfunction getDeleteCollapsedSelection(direction: 'forward' | 'backward'): DeleteSelectionStep {\n return context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const isForward = direction == 'forward';\n const { paragraph, marker, path, tableContext } = context.insertPoint;\n const segments = paragraph.segments;\n\n fixupBr(segments);\n\n const index = segments.indexOf(marker) + (isForward ? 1 : -1);\n const segmentToDelete = segments[index];\n let blockToDelete: ReadonlyBlockAndPath | null;\n let root: ReadonlyContentModelDocument | null;\n\n if (segmentToDelete) {\n if (deleteSegment(paragraph, segmentToDelete, context.formatContext, direction)) {\n context.deleteResult = 'singleChar';\n\n // It is possible that we have deleted everything from this paragraph, so we need to mark it as not implicit\n // to avoid losing its format. See https://github.com/microsoft/roosterjs/issues/1953\n setParagraphNotImplicit(paragraph);\n }\n } else if (\n shouldOutdentParagraph(isForward, segments, paragraph, path) &&\n (root = getRoot(path))\n ) {\n setModelIndentation(root, 'outdent');\n context.deleteResult = 'range';\n } else if ((blockToDelete = getLeafSiblingBlock(path, paragraph, isForward))) {\n const { block: readonlyBlock, path, siblingSegment } = blockToDelete;\n\n if (readonlyBlock.blockType == 'Paragraph') {\n const block = mutateBlock(readonlyBlock);\n\n if (siblingSegment) {\n // When selection is under general segment, need to check if it has a sibling sibling, and delete from it\n if (deleteSegment(block, siblingSegment, context.formatContext, direction)) {\n context.deleteResult = 'range';\n }\n } else {\n if (isForward) {\n context.lastParagraph = block;\n } else {\n if (block.segments[block.segments.length - 1]?.segmentType == 'Br') {\n block.segments.pop();\n }\n\n context.insertPoint = {\n marker,\n paragraph: block,\n path,\n tableContext,\n };\n context.lastParagraph = paragraph;\n }\n\n context.deleteResult = 'range';\n }\n\n // When go across table, getLeafSiblingBlock will return null, when we are here, we must be in the same table context\n context.lastTableContext = tableContext;\n } else {\n if (\n deleteBlock(\n mutateBlock(path[0]).blocks,\n readonlyBlock,\n undefined /*replacement*/,\n context.formatContext,\n direction\n )\n ) {\n context.deleteResult = 'range';\n }\n }\n } else {\n // We have nothing to delete, in this case we don't want browser handle it as well.\n // Because when Backspace on an empty document, it will also delete the only DIV and SPAN element, causes\n // editor is really empty. We don't want that happen. So the handling should stop here.\n context.deleteResult = 'nothingToDelete';\n }\n };\n}\n\nfunction getRoot(path: ReadonlyContentModelBlockGroup[]): ReadonlyContentModelDocument | null {\n const lastInPath = path[path.length - 1];\n return lastInPath.blockGroupType == 'Document' ? lastInPath : null;\n}\n\nfunction shouldOutdentParagraph(\n isForward: boolean,\n segments: ShallowMutableContentModelSegment[],\n paragraph: ShallowMutableContentModelParagraph,\n path: ReadonlyContentModelBlockGroup[]\n) {\n return (\n !isForward &&\n segments.length == 1 &&\n segments[0].segmentType == 'SelectionMarker' &&\n paragraph.format.marginLeft &&\n parseInt(paragraph.format.marginLeft) &&\n getClosestAncestorBlockGroupIndex(path, ['Document', 'TableCell'], ['ListItem']) > -1\n );\n}\n\n/**\n * If the last segment is BR, remove it for now. We may add it back later when normalize model.\n * So that if this is an empty paragraph, it will start to delete next block\n */\nfunction fixupBr(segments: ShallowMutableContentModelSegment[]) {\n if (segments[segments.length - 1]?.segmentType == 'Br') {\n const segmentsWithoutBr = segments.filter(x => x.segmentType != 'SelectionMarker');\n\n if (segmentsWithoutBr[segmentsWithoutBr.length - 2]?.segmentType != 'Br') {\n segments.pop();\n }\n }\n}\n\n/**\n * @internal if we didn't delete anything, and we want to delete forward, now perform it\n */\nexport const forwardDeleteCollapsedSelection = getDeleteCollapsedSelection('forward');\n\n/**\n * @internal if we didn't delete anything, and we want to delete backward, now perform it\n */\nexport const backwardDeleteCollapsedSelection = getDeleteCollapsedSelection('backward');\n"]}
@@ -54,7 +54,7 @@ define(["require", "exports", "roosterjs-content-model-dom"], function (require,
54
54
  var marker = (0, roosterjs_content_model_dom_1.createSelectionMarker)();
55
55
  var newParagraph = (0, roosterjs_content_model_dom_1.createParagraph)(false /* isImplicit */);
56
56
  newParagraph.segments.push(marker);
57
- parent.blocks.splice(index + 1, 0, newParagraph);
57
+ (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(index + 1, 0, newParagraph);
58
58
  };
59
59
  });
60
60
  //# sourceMappingURL=deleteEmptyQuote.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deleteEmptyQuote.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteEmptyQuote.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createParagraph,\n createSelectionMarker,\n unwrapBlock,\n getClosestAncestorBlockGroupIndex,\n isBlockGroupOfType,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelBlockGroup,\n ContentModelFormatContainer,\n DeleteSelectionStep,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const deleteEmptyQuote: DeleteSelectionStep = context => {\n const { deleteResult } = context;\n if (\n deleteResult == 'nothingToDelete' ||\n deleteResult == 'notDeleted' ||\n deleteResult == 'range'\n ) {\n const { insertPoint, formatContext } = context;\n const { path } = insertPoint;\n const rawEvent = formatContext?.rawEvent as KeyboardEvent;\n const index = getClosestAncestorBlockGroupIndex(\n path,\n ['FormatContainer', 'ListItem'],\n ['TableCell']\n );\n const quote = path[index];\n\n if (quote && quote.blockGroupType === 'FormatContainer' && quote.tagName == 'blockquote') {\n const parent = path[index + 1];\n const quoteBlockIndex = parent.blocks.indexOf(quote);\n const blockQuote = parent.blocks[quoteBlockIndex];\n if (\n isBlockGroupOfType<ContentModelFormatContainer>(blockQuote, 'FormatContainer') &&\n blockQuote.tagName === 'blockquote'\n ) {\n if (isEmptyQuote(blockQuote)) {\n unwrapBlock(parent, blockQuote);\n rawEvent?.preventDefault();\n context.deleteResult = 'range';\n } else if (isSelectionOnEmptyLine(blockQuote) && rawEvent?.key === 'Enter') {\n insertNewLine(blockQuote, parent, quoteBlockIndex);\n rawEvent?.preventDefault();\n context.deleteResult = 'range';\n }\n }\n }\n }\n};\n\nconst isEmptyQuote = (quote: ContentModelFormatContainer) => {\n return (\n quote.blocks.length === 1 &&\n quote.blocks[0].blockType === 'Paragraph' &&\n quote.blocks[0].segments.every(\n s => s.segmentType === 'SelectionMarker' || s.segmentType === 'Br'\n )\n );\n};\n\nconst isSelectionOnEmptyLine = (quote: ContentModelFormatContainer) => {\n const quoteLength = quote.blocks.length;\n const lastParagraph = quote.blocks[quoteLength - 1];\n if (lastParagraph && lastParagraph.blockType === 'Paragraph') {\n return lastParagraph.segments.every(\n s => s.segmentType === 'SelectionMarker' || s.segmentType === 'Br'\n );\n }\n};\n\nconst insertNewLine = (\n quote: ContentModelFormatContainer,\n parent: ContentModelBlockGroup,\n index: number\n) => {\n const quoteLength = quote.blocks.length;\n quote.blocks.splice(quoteLength - 1, 1);\n const marker = createSelectionMarker();\n const newParagraph = createParagraph(false /* isImplicit */);\n newParagraph.segments.push(marker);\n parent.blocks.splice(index + 1, 0, newParagraph);\n};\n"]}
1
+ {"version":3,"file":"deleteEmptyQuote.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteEmptyQuote.ts"],"names":[],"mappings":";;;;IAcA;;OAEG;IACI,IAAM,gBAAgB,GAAwB,UAAA,OAAO;QAChD,IAAA,YAAY,GAAK,OAAO,aAAZ,CAAa;QACjC,IACI,YAAY,IAAI,iBAAiB;YACjC,YAAY,IAAI,YAAY;YAC5B,YAAY,IAAI,OAAO,EACzB;YACU,IAAA,WAAW,GAAoB,OAAO,YAA3B,EAAE,aAAa,GAAK,OAAO,cAAZ,CAAa;YACvC,IAAA,IAAI,GAAK,WAAW,KAAhB,CAAiB;YAC7B,IAAM,QAAQ,GAAG,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,QAAyB,CAAC;YAC1D,IAAM,KAAK,GAAG,IAAA,+DAAiC,EAC3C,IAAI,EACJ,CAAC,iBAAiB,EAAE,UAAU,CAAC,EAC/B,CAAC,WAAW,CAAC,CAChB,CAAC;YACF,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAE1B,IAAI,KAAK,IAAI,KAAK,CAAC,cAAc,KAAK,iBAAiB,IAAI,KAAK,CAAC,OAAO,IAAI,YAAY,EAAE;gBACtF,IAAM,QAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC/B,IAAM,eAAe,GAAG,QAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACrD,IAAM,UAAU,GAAG,QAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBAClD,IACI,IAAA,gDAAkB,EAA8B,UAAU,EAAE,iBAAiB,CAAC;oBAC9E,UAAU,CAAC,OAAO,KAAK,YAAY,EACrC;oBACE,IAAI,YAAY,CAAC,UAAU,CAAC,EAAE;wBAC1B,IAAA,yCAAW,EAAC,QAAM,EAAE,UAAU,CAAC,CAAC;wBAChC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,cAAc,EAAE,CAAC;wBAC3B,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;qBAClC;yBAAM,IAAI,sBAAsB,CAAC,UAAU,CAAC,IAAI,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,GAAG,MAAK,OAAO,EAAE;wBACxE,aAAa,CAAC,UAAU,EAAE,QAAM,EAAE,eAAe,CAAC,CAAC;wBACnD,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,cAAc,EAAE,CAAC;wBAC3B,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;qBAClC;iBACJ;aACJ;SACJ;IACL,CAAC,CAAC;IArCW,QAAA,gBAAgB,oBAqC3B;IAEF,IAAM,YAAY,GAAG,UAAC,KAAkC;QACpD,OAAO,CACH,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YACzB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,WAAW;YACzC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAC1B,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,WAAW,KAAK,iBAAiB,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,EAA7D,CAA6D,CACrE,CACJ,CAAC;IACN,CAAC,CAAC;IAEF,IAAM,sBAAsB,GAAG,UAAC,KAAkC;QAC9D,IAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QACxC,IAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,aAAa,IAAI,aAAa,CAAC,SAAS,KAAK,WAAW,EAAE;YAC1D,OAAO,aAAa,CAAC,QAAQ,CAAC,KAAK,CAC/B,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,WAAW,KAAK,iBAAiB,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,EAA7D,CAA6D,CACrE,CAAC;SACL;IACL,CAAC,CAAC;IAEF,IAAM,aAAa,GAAG,UAClB,KAAkC,EAClC,MAAsC,EACtC,KAAa;QAEb,IAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QACxC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,IAAM,MAAM,GAAG,IAAA,mDAAqB,GAAE,CAAC;QACvC,IAAM,YAAY,GAAG,IAAA,6CAAe,EAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC7D,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,IAAA,yCAAW,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;IAClE,CAAC,CAAC","sourcesContent":["import {\n createParagraph,\n createSelectionMarker,\n unwrapBlock,\n getClosestAncestorBlockGroupIndex,\n isBlockGroupOfType,\n mutateBlock,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelFormatContainer,\n DeleteSelectionStep,\n ReadonlyContentModelBlockGroup,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const deleteEmptyQuote: DeleteSelectionStep = context => {\n const { deleteResult } = context;\n if (\n deleteResult == 'nothingToDelete' ||\n deleteResult == 'notDeleted' ||\n deleteResult == 'range'\n ) {\n const { insertPoint, formatContext } = context;\n const { path } = insertPoint;\n const rawEvent = formatContext?.rawEvent as KeyboardEvent;\n const index = getClosestAncestorBlockGroupIndex(\n path,\n ['FormatContainer', 'ListItem'],\n ['TableCell']\n );\n const quote = path[index];\n\n if (quote && quote.blockGroupType === 'FormatContainer' && quote.tagName == 'blockquote') {\n const parent = path[index + 1];\n const quoteBlockIndex = parent.blocks.indexOf(quote);\n const blockQuote = parent.blocks[quoteBlockIndex];\n if (\n isBlockGroupOfType<ContentModelFormatContainer>(blockQuote, 'FormatContainer') &&\n blockQuote.tagName === 'blockquote'\n ) {\n if (isEmptyQuote(blockQuote)) {\n unwrapBlock(parent, blockQuote);\n rawEvent?.preventDefault();\n context.deleteResult = 'range';\n } else if (isSelectionOnEmptyLine(blockQuote) && rawEvent?.key === 'Enter') {\n insertNewLine(blockQuote, parent, quoteBlockIndex);\n rawEvent?.preventDefault();\n context.deleteResult = 'range';\n }\n }\n }\n }\n};\n\nconst isEmptyQuote = (quote: ContentModelFormatContainer) => {\n return (\n quote.blocks.length === 1 &&\n quote.blocks[0].blockType === 'Paragraph' &&\n quote.blocks[0].segments.every(\n s => s.segmentType === 'SelectionMarker' || s.segmentType === 'Br'\n )\n );\n};\n\nconst isSelectionOnEmptyLine = (quote: ContentModelFormatContainer) => {\n const quoteLength = quote.blocks.length;\n const lastParagraph = quote.blocks[quoteLength - 1];\n if (lastParagraph && lastParagraph.blockType === 'Paragraph') {\n return lastParagraph.segments.every(\n s => s.segmentType === 'SelectionMarker' || s.segmentType === 'Br'\n );\n }\n};\n\nconst insertNewLine = (\n quote: ContentModelFormatContainer,\n parent: ReadonlyContentModelBlockGroup,\n index: number\n) => {\n const quoteLength = quote.blocks.length;\n quote.blocks.splice(quoteLength - 1, 1);\n const marker = createSelectionMarker();\n const newParagraph = createParagraph(false /* isImplicit */);\n newParagraph.segments.push(marker);\n mutateBlock(parent).blocks.splice(index + 1, 0, newParagraph);\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"deleteWordSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteWordSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n isPunctuation,\n isSpace,\n isWhiteSpacePreserved,\n normalizeText,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelParagraph,\n DeleteSelectionContext,\n DeleteSelectionStep,\n} from 'roosterjs-content-model-types';\n\nconst enum DeleteWordState {\n Start,\n Punctuation,\n Text,\n NonText,\n Space,\n End,\n}\n\ninterface CharInfo {\n text: boolean;\n space: boolean;\n punctuation: boolean;\n}\n\nfunction getDeleteWordSelection(direction: 'forward' | 'backward'): DeleteSelectionStep {\n return context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const { marker, paragraph } = context.insertPoint;\n const startIndex = paragraph.segments.indexOf(marker);\n const deleteNext = direction == 'forward';\n\n const iterator = iterateSegments(paragraph, startIndex, deleteNext, context);\n let curr = iterator.next();\n\n for (let state = DeleteWordState.Start; state != DeleteWordState.End && !curr.done; ) {\n const { punctuation, space, text } = curr.value;\n\n // This is a state machine of how to delete a whole word together with space and punctuations.\n // For a full state machine chart, see\n // Forward delete: https://github.com/microsoft/roosterjs/blob/master/assets/design-charts/ForwardDeleteWord.png\n // Backward delete: https://github.com/microsoft/roosterjs/blob/master/assets/design-charts/BackwardDeleteWord.png\n switch (state) {\n case DeleteWordState.Start:\n state = space\n ? DeleteWordState.Space\n : punctuation\n ? DeleteWordState.Punctuation\n : DeleteWordState.Text;\n curr = iterator.next(true /*delete*/);\n break;\n\n case DeleteWordState.Punctuation:\n if (deleteNext && space) {\n state = DeleteWordState.NonText;\n curr = iterator.next(true /*delete*/);\n } else if (punctuation) {\n curr = iterator.next(true /*delete*/);\n } else {\n state = DeleteWordState.End;\n }\n break;\n\n case DeleteWordState.Text:\n if (deleteNext && space) {\n state = DeleteWordState.NonText;\n curr = iterator.next(true /*delete*/);\n } else if (text) {\n curr = iterator.next(true /*delete*/);\n } else {\n state = DeleteWordState.End;\n }\n break;\n\n case DeleteWordState.NonText:\n if (punctuation || !space) {\n state = DeleteWordState.End;\n } else {\n curr = iterator.next(true /*delete*/);\n }\n break;\n\n case DeleteWordState.Space:\n if (space) {\n curr = iterator.next(true /*delete*/);\n } else if (punctuation) {\n state = deleteNext ? DeleteWordState.NonText : DeleteWordState.Punctuation;\n curr = iterator.next(true /*delete*/);\n } else {\n state = deleteNext ? DeleteWordState.End : DeleteWordState.Text;\n }\n break;\n }\n }\n };\n}\n\nfunction* iterateSegments(\n paragraph: ContentModelParagraph,\n markerIndex: number,\n forward: boolean,\n context: DeleteSelectionContext\n): Generator<CharInfo, null, boolean> {\n const step = forward ? 1 : -1;\n const segments = paragraph.segments;\n const preserveWhiteSpace = isWhiteSpacePreserved(paragraph.format.whiteSpace);\n\n for (let i = markerIndex + step; i >= 0 && i < segments.length; i += step) {\n const segment = segments[i];\n\n switch (segment.segmentType) {\n case 'Text':\n for (\n let j = forward ? 0 : segment.text.length - 1;\n j >= 0 && j < segment.text.length;\n j += step\n ) {\n const c = segment.text[j];\n const punctuation = isPunctuation(c);\n const space = isSpace(c);\n const text = !punctuation && !space;\n\n if (yield { punctuation, space, text }) {\n let newText = segment.text;\n\n newText = newText.substring(0, j) + newText.substring(j + 1);\n\n if (!preserveWhiteSpace) {\n newText = normalizeText(newText, forward);\n }\n\n context.deleteResult = 'range';\n\n if (newText) {\n segment.text = newText;\n\n if (step > 0) {\n j -= step;\n }\n } else {\n segments.splice(i, 1);\n\n if (step > 0) {\n i -= step;\n }\n\n break;\n }\n }\n }\n break;\n\n case 'Image':\n if (\n yield { punctuation: true, space: false, text: false } // Treat image as punctuation since they have the same behavior.\n ) {\n segments.splice(i, 1);\n\n if (step > 0) {\n i -= step;\n }\n\n context.deleteResult = 'range';\n }\n break;\n\n case 'SelectionMarker':\n break;\n\n default:\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * @internal\n */\nexport const forwardDeleteWordSelection = getDeleteWordSelection('forward');\n\n/**\n * @internal\n */\nexport const backwardDeleteWordSelection = getDeleteWordSelection('backward');\n"]}
1
+ {"version":3,"file":"deleteWordSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteWordSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n isPunctuation,\n isSpace,\n isWhiteSpacePreserved,\n normalizeText,\n} from 'roosterjs-content-model-dom';\nimport type {\n DeleteSelectionContext,\n DeleteSelectionStep,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst enum DeleteWordState {\n Start,\n Punctuation,\n Text,\n NonText,\n Space,\n End,\n}\n\ninterface CharInfo {\n text: boolean;\n space: boolean;\n punctuation: boolean;\n}\n\nfunction getDeleteWordSelection(direction: 'forward' | 'backward'): DeleteSelectionStep {\n return context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const { marker, paragraph } = context.insertPoint;\n const startIndex = paragraph.segments.indexOf(marker);\n const deleteNext = direction == 'forward';\n\n const iterator = iterateSegments(paragraph, startIndex, deleteNext, context);\n let curr = iterator.next();\n\n for (let state = DeleteWordState.Start; state != DeleteWordState.End && !curr.done; ) {\n const { punctuation, space, text } = curr.value;\n\n // This is a state machine of how to delete a whole word together with space and punctuations.\n // For a full state machine chart, see\n // Forward delete: https://github.com/microsoft/roosterjs/blob/master/assets/design-charts/ForwardDeleteWord.png\n // Backward delete: https://github.com/microsoft/roosterjs/blob/master/assets/design-charts/BackwardDeleteWord.png\n switch (state) {\n case DeleteWordState.Start:\n state = space\n ? DeleteWordState.Space\n : punctuation\n ? DeleteWordState.Punctuation\n : DeleteWordState.Text;\n curr = iterator.next(true /*delete*/);\n break;\n\n case DeleteWordState.Punctuation:\n if (deleteNext && space) {\n state = DeleteWordState.NonText;\n curr = iterator.next(true /*delete*/);\n } else if (punctuation) {\n curr = iterator.next(true /*delete*/);\n } else {\n state = DeleteWordState.End;\n }\n break;\n\n case DeleteWordState.Text:\n if (deleteNext && space) {\n state = DeleteWordState.NonText;\n curr = iterator.next(true /*delete*/);\n } else if (text) {\n curr = iterator.next(true /*delete*/);\n } else {\n state = DeleteWordState.End;\n }\n break;\n\n case DeleteWordState.NonText:\n if (punctuation || !space) {\n state = DeleteWordState.End;\n } else {\n curr = iterator.next(true /*delete*/);\n }\n break;\n\n case DeleteWordState.Space:\n if (space) {\n curr = iterator.next(true /*delete*/);\n } else if (punctuation) {\n state = deleteNext ? DeleteWordState.NonText : DeleteWordState.Punctuation;\n curr = iterator.next(true /*delete*/);\n } else {\n state = deleteNext ? DeleteWordState.End : DeleteWordState.Text;\n }\n break;\n }\n }\n };\n}\n\nfunction* iterateSegments(\n paragraph: ShallowMutableContentModelParagraph,\n markerIndex: number,\n forward: boolean,\n context: DeleteSelectionContext\n): Generator<CharInfo, null, boolean> {\n const step = forward ? 1 : -1;\n const segments = paragraph.segments;\n const preserveWhiteSpace = isWhiteSpacePreserved(paragraph.format.whiteSpace);\n\n for (let i = markerIndex + step; i >= 0 && i < segments.length; i += step) {\n const segment = segments[i];\n\n switch (segment.segmentType) {\n case 'Text':\n for (\n let j = forward ? 0 : segment.text.length - 1;\n j >= 0 && j < segment.text.length;\n j += step\n ) {\n const c = segment.text[j];\n const punctuation = isPunctuation(c);\n const space = isSpace(c);\n const text = !punctuation && !space;\n\n if (yield { punctuation, space, text }) {\n let newText = segment.text;\n\n newText = newText.substring(0, j) + newText.substring(j + 1);\n\n if (!preserveWhiteSpace) {\n newText = normalizeText(newText, forward);\n }\n\n context.deleteResult = 'range';\n\n if (newText) {\n segment.text = newText;\n\n if (step > 0) {\n j -= step;\n }\n } else {\n segments.splice(i, 1);\n\n if (step > 0) {\n i -= step;\n }\n\n break;\n }\n }\n }\n break;\n\n case 'Image':\n if (\n yield { punctuation: true, space: false, text: false } // Treat image as punctuation since they have the same behavior.\n ) {\n segments.splice(i, 1);\n\n if (step > 0) {\n i -= step;\n }\n\n context.deleteResult = 'range';\n }\n break;\n\n case 'SelectionMarker':\n break;\n\n default:\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * @internal\n */\nexport const forwardDeleteWordSelection = getDeleteWordSelection('forward');\n\n/**\n * @internal\n */\nexport const backwardDeleteWordSelection = getDeleteWordSelection('backward');\n"]}
@@ -36,7 +36,7 @@ define(["require", "exports", "tslib", "roosterjs-content-model-api", "roosterjs
36
36
  lastParagraph.blockType === 'Paragraph' &&
37
37
  lastParagraph.segments[lastParagraph.segments.length - 1].segmentType ===
38
38
  'SelectionMarker') {
39
- lastParagraph.segments.pop();
39
+ (0, roosterjs_content_model_dom_1.mutateBlock)(lastParagraph).segments.pop();
40
40
  nextParagraph.segments.unshift((0, roosterjs_content_model_dom_1.createSelectionMarker)(insertPoint.marker.format));
41
41
  }
42
42
  context.lastParagraph = undefined;
@@ -44,7 +44,7 @@ define(["require", "exports", "tslib", "roosterjs-content-model-api", "roosterjs
44
44
  }
45
45
  else if (deleteResult !== 'range') {
46
46
  if (isEmptyListItem(listItem_1)) {
47
- listItem_1.levels.pop();
47
+ (0, roosterjs_content_model_dom_1.mutateBlock)(listItem_1).levels.pop();
48
48
  }
49
49
  else {
50
50
  var newListItem = createNewListItem(context, listItem_1, listParent);
@@ -77,7 +77,7 @@ define(["require", "exports", "tslib", "roosterjs-content-model-api", "roosterjs
77
77
  newListItem.blocks.push(newParagraph);
78
78
  insertPoint.paragraph = newParagraph;
79
79
  context.lastParagraph = newParagraph;
80
- listParent.blocks.splice(listIndex + 1, 0, newListItem);
80
+ (0, roosterjs_content_model_dom_1.mutateBlock)(listParent).blocks.splice(listIndex + 1, 0, newListItem);
81
81
  return newListItem;
82
82
  };
83
83
  var createNewListLevel = function (listItem) {
@@ -1 +1 @@
1
- {"version":3,"file":"handleEnterOnList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleEnterOnList.ts"],"names":[],"mappings":"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","sourcesContent":["import { getListAnnounceData } from 'roosterjs-content-model-api';\nimport {\n createBr,\n createListItem,\n createListLevel,\n createParagraph,\n createSelectionMarker,\n normalizeContentModel,\n normalizeParagraph,\n setParagraphNotImplicit,\n getClosestAncestorBlockGroupIndex,\n isBlockGroupOfType,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelBlockGroup,\n ContentModelListItem,\n DeleteSelectionStep,\n InsertPoint,\n ValidDeleteSelectionContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleEnterOnList: DeleteSelectionStep = context => {\n const { deleteResult } = context;\n if (\n deleteResult == 'nothingToDelete' ||\n deleteResult == 'notDeleted' ||\n deleteResult == 'range'\n ) {\n const { insertPoint, formatContext } = context;\n const { path } = insertPoint;\n const rawEvent = formatContext?.rawEvent;\n const index = getClosestAncestorBlockGroupIndex(path, ['ListItem'], ['TableCell']);\n\n const listItem = path[index];\n const listParent = path[index + 1];\n\n if (listItem && listItem.blockGroupType === 'ListItem' && listParent) {\n const listIndex = listParent.blocks.indexOf(listItem);\n const nextBlock = listParent.blocks[listIndex + 1];\n\n if (deleteResult == 'range' && nextBlock) {\n normalizeContentModel(listParent);\n\n const nextListItem = listParent.blocks[listIndex + 1];\n\n if (\n isBlockGroupOfType<ContentModelListItem>(nextListItem, 'ListItem') &&\n nextListItem.levels[0]\n ) {\n nextListItem.levels.forEach((level, index) => {\n level.format.startNumberOverride = undefined;\n level.dataset = listItem.levels[index]\n ? listItem.levels[index].dataset\n : {};\n });\n\n const lastParagraph = listItem.blocks[listItem.blocks.length - 1];\n const nextParagraph = nextListItem.blocks[0];\n\n if (\n nextParagraph.blockType === 'Paragraph' &&\n lastParagraph.blockType === 'Paragraph' &&\n lastParagraph.segments[lastParagraph.segments.length - 1].segmentType ===\n 'SelectionMarker'\n ) {\n lastParagraph.segments.pop();\n\n nextParagraph.segments.unshift(\n createSelectionMarker(insertPoint.marker.format)\n );\n }\n\n context.lastParagraph = undefined;\n }\n } else if (deleteResult !== 'range') {\n if (isEmptyListItem(listItem)) {\n listItem.levels.pop();\n } else {\n const newListItem = createNewListItem(context, listItem, listParent);\n\n if (context.formatContext) {\n context.formatContext.announceData = getListAnnounceData([\n newListItem,\n ...path.slice(index + 1),\n ]);\n }\n }\n }\n\n rawEvent?.preventDefault();\n context.deleteResult = 'range';\n }\n }\n};\n\nconst isEmptyListItem = (listItem: ContentModelListItem) => {\n return (\n listItem.blocks.length === 1 &&\n listItem.blocks[0].blockType === 'Paragraph' &&\n listItem.blocks[0].segments.length === 2 &&\n listItem.blocks[0].segments[0].segmentType === 'SelectionMarker' &&\n listItem.blocks[0].segments[1].segmentType === 'Br'\n );\n};\n\nconst createNewListItem = (\n context: ValidDeleteSelectionContext,\n listItem: ContentModelListItem,\n listParent: ContentModelBlockGroup\n) => {\n const { insertPoint } = context;\n const listIndex = listParent.blocks.indexOf(listItem);\n const newParagraph = createNewParagraph(insertPoint);\n\n const levels = createNewListLevel(listItem);\n const newListItem = createListItem(levels, insertPoint.marker.format);\n newListItem.blocks.push(newParagraph);\n insertPoint.paragraph = newParagraph;\n context.lastParagraph = newParagraph;\n listParent.blocks.splice(listIndex + 1, 0, newListItem);\n\n return newListItem;\n};\n\nconst createNewListLevel = (listItem: ContentModelListItem) => {\n return listItem.levels.map(level => {\n return createListLevel(\n level.listType,\n {\n ...level.format,\n startNumberOverride: undefined,\n displayForDummyItem: undefined, // When ENTER, we should create a new regular list item, so force its dummy item display to undefined\n },\n level.dataset\n );\n });\n};\n\nconst createNewParagraph = (insertPoint: InsertPoint) => {\n const { paragraph, marker } = insertPoint;\n const newParagraph = createParagraph(\n false /*isImplicit*/,\n paragraph.format,\n paragraph.segmentFormat\n );\n\n const markerIndex = paragraph.segments.indexOf(marker);\n const segments = paragraph.segments.splice(\n markerIndex,\n paragraph.segments.length - markerIndex\n );\n\n newParagraph.segments.push(...segments);\n\n setParagraphNotImplicit(paragraph);\n\n if (paragraph.segments.every(x => x.segmentType == 'SelectionMarker')) {\n paragraph.segments.push(createBr(marker.format));\n }\n\n normalizeParagraph(newParagraph);\n\n return newParagraph;\n};\n"]}
1
+ {"version":3,"file":"handleEnterOnList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleEnterOnList.ts"],"names":[],"mappings":"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","sourcesContent":["import { getListAnnounceData } from 'roosterjs-content-model-api';\nimport {\n createBr,\n createListItem,\n createListLevel,\n createParagraph,\n createSelectionMarker,\n normalizeContentModel,\n normalizeParagraph,\n setParagraphNotImplicit,\n getClosestAncestorBlockGroupIndex,\n isBlockGroupOfType,\n mutateBlock,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelListItem,\n DeleteSelectionStep,\n InsertPoint,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelListItem,\n ShallowMutableContentModelListItem,\n ShallowMutableContentModelParagraph,\n ValidDeleteSelectionContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleEnterOnList: DeleteSelectionStep = context => {\n const { deleteResult } = context;\n if (\n deleteResult == 'nothingToDelete' ||\n deleteResult == 'notDeleted' ||\n deleteResult == 'range'\n ) {\n const { insertPoint, formatContext } = context;\n const { path } = insertPoint;\n const rawEvent = formatContext?.rawEvent;\n const index = getClosestAncestorBlockGroupIndex(path, ['ListItem'], ['TableCell']);\n\n const listItem = path[index];\n const listParent = path[index + 1];\n\n if (listItem && listItem.blockGroupType === 'ListItem' && listParent) {\n const listIndex = listParent.blocks.indexOf(listItem);\n const nextBlock = listParent.blocks[listIndex + 1];\n\n if (deleteResult == 'range' && nextBlock) {\n normalizeContentModel(listParent);\n\n const nextListItem = listParent.blocks[listIndex + 1];\n\n if (\n isBlockGroupOfType<ContentModelListItem>(nextListItem, 'ListItem') &&\n nextListItem.levels[0]\n ) {\n nextListItem.levels.forEach((level, index) => {\n level.format.startNumberOverride = undefined;\n level.dataset = listItem.levels[index]\n ? listItem.levels[index].dataset\n : {};\n });\n\n const lastParagraph = listItem.blocks[listItem.blocks.length - 1];\n const nextParagraph = nextListItem.blocks[0];\n\n if (\n nextParagraph.blockType === 'Paragraph' &&\n lastParagraph.blockType === 'Paragraph' &&\n lastParagraph.segments[lastParagraph.segments.length - 1].segmentType ===\n 'SelectionMarker'\n ) {\n mutateBlock(lastParagraph).segments.pop();\n\n nextParagraph.segments.unshift(\n createSelectionMarker(insertPoint.marker.format)\n );\n }\n\n context.lastParagraph = undefined;\n }\n } else if (deleteResult !== 'range') {\n if (isEmptyListItem(listItem)) {\n mutateBlock(listItem).levels.pop();\n } else {\n const newListItem = createNewListItem(context, listItem, listParent);\n\n if (context.formatContext) {\n context.formatContext.announceData = getListAnnounceData([\n newListItem,\n ...path.slice(index + 1),\n ]);\n }\n }\n }\n\n rawEvent?.preventDefault();\n context.deleteResult = 'range';\n }\n }\n};\n\nconst isEmptyListItem = (listItem: ReadonlyContentModelListItem) => {\n return (\n listItem.blocks.length === 1 &&\n listItem.blocks[0].blockType === 'Paragraph' &&\n listItem.blocks[0].segments.length === 2 &&\n listItem.blocks[0].segments[0].segmentType === 'SelectionMarker' &&\n listItem.blocks[0].segments[1].segmentType === 'Br'\n );\n};\n\nconst createNewListItem = (\n context: ValidDeleteSelectionContext,\n listItem: ReadonlyContentModelListItem,\n listParent: ReadonlyContentModelBlockGroup\n) => {\n const { insertPoint } = context;\n const listIndex = listParent.blocks.indexOf(listItem);\n const newParagraph = createNewParagraph(insertPoint);\n\n const levels = createNewListLevel(listItem);\n const newListItem: ShallowMutableContentModelListItem = createListItem(\n levels,\n insertPoint.marker.format\n );\n newListItem.blocks.push(newParagraph);\n insertPoint.paragraph = newParagraph;\n context.lastParagraph = newParagraph;\n mutateBlock(listParent).blocks.splice(listIndex + 1, 0, newListItem);\n\n return newListItem;\n};\n\nconst createNewListLevel = (listItem: ReadonlyContentModelListItem) => {\n return listItem.levels.map(level => {\n return createListLevel(\n level.listType,\n {\n ...level.format,\n startNumberOverride: undefined,\n displayForDummyItem: undefined, // When ENTER, we should create a new regular list item, so force its dummy item display to undefined\n },\n level.dataset\n );\n });\n};\n\nconst createNewParagraph = (insertPoint: InsertPoint) => {\n const { paragraph, marker } = insertPoint;\n const newParagraph: ShallowMutableContentModelParagraph = createParagraph(\n false /*isImplicit*/,\n paragraph.format,\n paragraph.segmentFormat\n );\n\n const markerIndex = paragraph.segments.indexOf(marker);\n const segments = paragraph.segments.splice(\n markerIndex,\n paragraph.segments.length - markerIndex\n );\n\n newParagraph.segments.push(...segments);\n\n setParagraphNotImplicit(paragraph);\n\n if (paragraph.segments.every(x => x.segmentType == 'SelectionMarker')) {\n paragraph.segments.push(createBr(marker.format));\n }\n\n normalizeParagraph(newParagraph);\n\n return newParagraph;\n};\n"]}
@@ -1,4 +1,4 @@
1
- import type { ContentModelBlock, ContentModelBlockGroup, ContentModelSegment } from 'roosterjs-content-model-types';
1
+ import type { ContentModelBlock, ContentModelBlockGroup, ContentModelSegment, ReadonlyContentModelBlock, ReadonlyContentModelBlockGroup, ReadonlyContentModelSegment } from 'roosterjs-content-model-types';
2
2
  /**
3
3
  * @internal
4
4
  */
@@ -17,7 +17,29 @@ export declare type BlockAndPath = {
17
17
  */
18
18
  siblingSegment?: ContentModelSegment;
19
19
  };
20
+ /**
21
+ * @internal
22
+ */
23
+ export declare type ReadonlyBlockAndPath = {
24
+ /**
25
+ * The sibling block
26
+ */
27
+ block: ReadonlyContentModelBlock;
28
+ /**
29
+ * Path of this sibling block
30
+ */
31
+ path: ReadonlyContentModelBlockGroup[];
32
+ /**
33
+ * If the input block is under a general segment, it is possible there are sibling segments under the same paragraph.
34
+ * Use this property to return the sibling sibling under the same paragraph
35
+ */
36
+ siblingSegment?: ReadonlyContentModelSegment;
37
+ };
20
38
  /**
21
39
  * @internal
22
40
  */
23
41
  export declare function getLeafSiblingBlock(path: ContentModelBlockGroup[], block: ContentModelBlock, isNext: boolean): BlockAndPath | null;
42
+ /**
43
+ * @internal (Readonly)
44
+ */
45
+ export declare function getLeafSiblingBlock(path: ReadonlyContentModelBlockGroup[], block: ReadonlyContentModelBlock, isNext: boolean): ReadonlyBlockAndPath | null;
@@ -2,9 +2,6 @@ define(["require", "exports", "tslib", "roosterjs-content-model-dom"], function
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.getLeafSiblingBlock = void 0;
5
- /**
6
- * @internal
7
- */
8
5
  function getLeafSiblingBlock(path, block, isNext) {
9
6
  var _a;
10
7
  var newPath = (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(path), false);
@@ -1 +1 @@
1
- {"version":3,"file":"getLeafSiblingBlock.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/utils/getLeafSiblingBlock.ts"],"names":[],"mappings":";;;;IA6BA;;OAEG;IACH,SAAgB,mBAAmB,CAC/B,IAA8B,EAC9B,KAAwB,EACxB,MAAe;;QAEf,IAAM,OAAO,sDAAO,IAAI,SAAC,CAAC;;YAGtB,IAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,IAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAE1C,IAAI,KAAK,GAAG,CAAC,EAAE;;aAEd;YAED,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAExD,IAAI,SAAS,EAAE;gBACX,OAAO,SAAS,CAAC,SAAS,IAAI,YAAY,EAAE;oBACxC,IAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAEzE,IAAI,CAAC,KAAK,EAAE;wCACD,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;qBAC7C;yBAAM,IAAI,KAAK,CAAC,SAAS,IAAI,YAAY,EAAE;wBACxC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;wCACpB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE;qBACzC;yBAAM;wBACH,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;wBAC3B,SAAS,GAAG,KAAK,CAAC;qBACrB;iBACJ;gCAEM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;aAC7C;iBAAM,IAAI,IAAA,8CAAgB,EAAC,KAAK,CAAC,EAAE;gBAChC,6FAA6F;gBAC7F,wDAAwD;gBACxD,OAAO,CAAC,KAAK,EAAE,CAAC;gBAEhB,IAAI,cAAY,GAAG,CAAC,CAAC,CAAC;gBACtB,IAAM,SAAO,GAAG,KAAK,CAAC;gBACtB,IAAM,IAAI,GAAG,MAAA,OAAO,CAAC,CAAC,CAAC,0CAAE,MAAM,CAAC,IAAI,CAChC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,SAAS,IAAI,WAAW,IAAI,CAAC,cAAY,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAO,CAAC,CAAC,IAAI,CAAC,EAA/E,CAA+E,CAC9D,CAAC;gBAE3B,IAAI,IAAI,EAAE;oBACN,qFAAqF;oBACrF,IAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAY,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAEvE,IAAI,cAAc,EAAE;wCAET,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,gBAAA,EAAE;qBACxD;yBAAM;wBACH,gDAAgD;wBAChD,KAAK,GAAG,IAAI,CAAC;qBAChB;iBACJ;qBAAM;;iBAGN;aACJ;iBAAM,IAAI,KAAK,CAAC,cAAc,IAAI,UAAU,IAAI,KAAK,CAAC,cAAc,IAAI,WAAW,EAAE;gBAClF,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,KAAK,GAAG,KAAK,CAAC;aACjB;iBAAM;;aAEN;;QAzDL,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC;;;;;;SA0DxB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IApED,kDAoEC","sourcesContent":["import { isGeneralSegment } from 'roosterjs-content-model-dom';\nimport type {\n ContentModelBlock,\n ContentModelBlockGroup,\n ContentModelParagraph,\n ContentModelSegment,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport type BlockAndPath = {\n /**\n * The sibling block\n */\n block: ContentModelBlock;\n\n /**\n * Path of this sibling block\n */\n path: ContentModelBlockGroup[];\n\n /**\n * If the input block is under a general segment, it is possible there are sibling segments under the same paragraph.\n * Use this property to return the sibling sibling under the same paragraph\n */\n siblingSegment?: ContentModelSegment;\n};\n\n/**\n * @internal\n */\nexport function getLeafSiblingBlock(\n path: ContentModelBlockGroup[],\n block: ContentModelBlock,\n isNext: boolean\n): BlockAndPath | null {\n const newPath = [...path];\n\n while (newPath.length > 0) {\n const group = newPath[0];\n const index = group.blocks.indexOf(block);\n\n if (index < 0) {\n break;\n }\n\n let nextBlock = group.blocks[index + (isNext ? 1 : -1)];\n\n if (nextBlock) {\n while (nextBlock.blockType == 'BlockGroup') {\n const child = nextBlock.blocks[isNext ? 0 : nextBlock.blocks.length - 1];\n\n if (!child) {\n return { block: nextBlock, path: newPath };\n } else if (child.blockType != 'BlockGroup') {\n newPath.unshift(nextBlock);\n return { block: child, path: newPath };\n } else {\n newPath.unshift(nextBlock);\n nextBlock = child;\n }\n }\n\n return { block: nextBlock, path: newPath };\n } else if (isGeneralSegment(group)) {\n // For general segment, we need to check if there is sibling segment under the same paragraph\n // First let's find the parent paragraph of this segment\n newPath.shift();\n\n let segmentIndex = -1;\n const segment = group;\n const para = newPath[0]?.blocks.find(\n x => x.blockType == 'Paragraph' && (segmentIndex = x.segments.indexOf(segment)) >= 0\n ) as ContentModelParagraph;\n\n if (para) {\n // Now we have found the parent paragraph, so let's check if it has a sibling segment\n const siblingSegment = para.segments[segmentIndex + (isNext ? 1 : -1)];\n\n if (siblingSegment) {\n // Return this block, path and segment since we have found it\n return { block: para, path: newPath, siblingSegment };\n } else {\n // No sibling segment, let's keep go upper level\n block = para;\n }\n } else {\n // Parent sibling is not found (in theory this should never happen), just return null\n break;\n }\n } else if (group.blockGroupType != 'Document' && group.blockGroupType != 'TableCell') {\n newPath.shift();\n block = group;\n } else {\n break;\n }\n }\n\n return null;\n}\n"]}
1
+ {"version":3,"file":"getLeafSiblingBlock.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/utils/getLeafSiblingBlock.ts"],"names":[],"mappings":";;;;IAuEA,SAAgB,mBAAmB,CAC/B,IAAsC,EACtC,KAAgC,EAChC,MAAe;;QAEf,IAAM,OAAO,sDAAO,IAAI,SAAC,CAAC;;YAGtB,IAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,IAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAE1C,IAAI,KAAK,GAAG,CAAC,EAAE;;aAEd;YAED,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAExD,IAAI,SAAS,EAAE;gBACX,OAAO,SAAS,CAAC,SAAS,IAAI,YAAY,EAAE;oBACxC,IAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAEzE,IAAI,CAAC,KAAK,EAAE;wCACD,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;qBAC7C;yBAAM,IAAI,KAAK,CAAC,SAAS,IAAI,YAAY,EAAE;wBACxC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;wCACpB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE;qBACzC;yBAAM;wBACH,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;wBAC3B,SAAS,GAAG,KAAK,CAAC;qBACrB;iBACJ;gCAEM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;aAC7C;iBAAM,IAAI,IAAA,8CAAgB,EAAC,KAAK,CAAC,EAAE;gBAChC,6FAA6F;gBAC7F,wDAAwD;gBACxD,OAAO,CAAC,KAAK,EAAE,CAAC;gBAEhB,IAAI,cAAY,GAAG,CAAC,CAAC,CAAC;gBACtB,IAAM,SAAO,GAAG,KAAK,CAAC;gBACtB,IAAM,IAAI,GAAG,MAAA,OAAO,CAAC,CAAC,CAAC,0CAAE,MAAM,CAAC,IAAI,CAChC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,SAAS,IAAI,WAAW,IAAI,CAAC,cAAY,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAO,CAAC,CAAC,IAAI,CAAC,EAA/E,CAA+E,CAC9D,CAAC;gBAE3B,IAAI,IAAI,EAAE;oBACN,qFAAqF;oBACrF,IAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAY,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAEvE,IAAI,cAAc,EAAE;wCAET,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,gBAAA,EAAE;qBACxD;yBAAM;wBACH,gDAAgD;wBAChD,KAAK,GAAG,IAAI,CAAC;qBAChB;iBACJ;qBAAM;;iBAGN;aACJ;iBAAM,IAAI,KAAK,CAAC,cAAc,IAAI,UAAU,IAAI,KAAK,CAAC,cAAc,IAAI,WAAW,EAAE;gBAClF,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,KAAK,GAAG,KAAK,CAAC;aACjB;iBAAM;;aAEN;;QAzDL,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC;;;;;;SA0DxB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IApED,kDAoEC","sourcesContent":["import { isGeneralSegment } from 'roosterjs-content-model-dom';\nimport type {\n ContentModelBlock,\n ContentModelBlockGroup,\n ContentModelParagraph,\n ContentModelSegment,\n ReadonlyContentModelBlock,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelSegment,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport type BlockAndPath = {\n /**\n * The sibling block\n */\n block: ContentModelBlock;\n\n /**\n * Path of this sibling block\n */\n path: ContentModelBlockGroup[];\n\n /**\n * If the input block is under a general segment, it is possible there are sibling segments under the same paragraph.\n * Use this property to return the sibling sibling under the same paragraph\n */\n siblingSegment?: ContentModelSegment;\n};\n\n/**\n * @internal\n */\nexport type ReadonlyBlockAndPath = {\n /**\n * The sibling block\n */\n block: ReadonlyContentModelBlock;\n\n /**\n * Path of this sibling block\n */\n path: ReadonlyContentModelBlockGroup[];\n\n /**\n * If the input block is under a general segment, it is possible there are sibling segments under the same paragraph.\n * Use this property to return the sibling sibling under the same paragraph\n */\n siblingSegment?: ReadonlyContentModelSegment;\n};\n\n/**\n * @internal\n */\nexport function getLeafSiblingBlock(\n path: ContentModelBlockGroup[],\n block: ContentModelBlock,\n isNext: boolean\n): BlockAndPath | null;\n\n/**\n * @internal (Readonly)\n */\nexport function getLeafSiblingBlock(\n path: ReadonlyContentModelBlockGroup[],\n block: ReadonlyContentModelBlock,\n isNext: boolean\n): ReadonlyBlockAndPath | null;\n\nexport function getLeafSiblingBlock(\n path: ReadonlyContentModelBlockGroup[],\n block: ReadonlyContentModelBlock,\n isNext: boolean\n): ReadonlyBlockAndPath | null {\n const newPath = [...path];\n\n while (newPath.length > 0) {\n const group = newPath[0];\n const index = group.blocks.indexOf(block);\n\n if (index < 0) {\n break;\n }\n\n let nextBlock = group.blocks[index + (isNext ? 1 : -1)];\n\n if (nextBlock) {\n while (nextBlock.blockType == 'BlockGroup') {\n const child = nextBlock.blocks[isNext ? 0 : nextBlock.blocks.length - 1];\n\n if (!child) {\n return { block: nextBlock, path: newPath };\n } else if (child.blockType != 'BlockGroup') {\n newPath.unshift(nextBlock);\n return { block: child, path: newPath };\n } else {\n newPath.unshift(nextBlock);\n nextBlock = child;\n }\n }\n\n return { block: nextBlock, path: newPath };\n } else if (isGeneralSegment(group)) {\n // For general segment, we need to check if there is sibling segment under the same paragraph\n // First let's find the parent paragraph of this segment\n newPath.shift();\n\n let segmentIndex = -1;\n const segment = group;\n const para = newPath[0]?.blocks.find(\n x => x.blockType == 'Paragraph' && (segmentIndex = x.segments.indexOf(segment)) >= 0\n ) as ContentModelParagraph;\n\n if (para) {\n // Now we have found the parent paragraph, so let's check if it has a sibling segment\n const siblingSegment = para.segments[segmentIndex + (isNext ? 1 : -1)];\n\n if (siblingSegment) {\n // Return this block, path and segment since we have found it\n return { block: para, path: newPath, siblingSegment };\n } else {\n // No sibling segment, let's keep go upper level\n block = para;\n }\n } else {\n // Parent sibling is not found (in theory this should never happen), just return null\n break;\n }\n } else if (group.blockGroupType != 'Document' && group.blockGroupType != 'TableCell') {\n newPath.shift();\n block = group;\n } else {\n break;\n }\n }\n\n return null;\n}\n"]}
@@ -1,4 +1,4 @@
1
- define(["require", "exports", "tslib", "../../../pluginUtils/CreateElement/createElement", "../../../pluginUtils/DragAndDrop/DragAndDropHelper", "roosterjs-content-model-dom"], function (require, exports, tslib_1, createElement_1, DragAndDropHelper_1, roosterjs_content_model_dom_1) {
1
+ define(["require", "exports", "tslib", "../../../pluginUtils/CreateElement/createElement", "../../../pluginUtils/DragAndDrop/DragAndDropHelper", "../utils/getTableFromContentModel", "roosterjs-content-model-dom"], function (require, exports, tslib_1, createElement_1, DragAndDropHelper_1, getTableFromContentModel_1, roosterjs_content_model_dom_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.createCellResizer = exports.VERTICAL_RESIZER_ID = exports.HORIZONTAL_RESIZER_ID = void 0;
@@ -53,21 +53,8 @@ define(["require", "exports", "tslib", "../../../pluginUtils/CreateElement/creat
53
53
  }; // Just a fallback
54
54
  }
55
55
  var editor = context.editor, table = context.table;
56
- // Get current selection
57
- var selection = editor.getDOMSelection();
58
- // Select first cell of the table
59
- editor.setDOMSelection({
60
- type: 'table',
61
- firstColumn: 0,
62
- firstRow: 0,
63
- lastColumn: 0,
64
- lastRow: 0,
65
- table: table,
66
- });
67
- // Get the table content model
68
- var cmTable = (0, roosterjs_content_model_dom_1.getFirstSelectedTable)(editor.getContentModelCopy('disconnected'))[0];
69
- // Restore selection
70
- editor.setDOMSelection(selection);
56
+ // Get Table block in content model
57
+ var cmTable = (0, getTableFromContentModel_1.getCMTableFromTable)(editor, table);
71
58
  if (rect && cmTable) {
72
59
  onStart();
73
60
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"CellResizer.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/CellResizer.ts"],"names":[],"mappings":";;;;IAaA,IAAM,kBAAkB,GAAG,CAAC,CAAC;IAC7B;;OAEG;IACU,QAAA,qBAAqB,GAAG,mBAAmB,CAAC;IACzD;;OAEG;IACU,QAAA,mBAAmB,GAAG,iBAAiB,CAAC;IAErD;;OAEG;IACH,SAAgB,iBAAiB,CAC7B,MAAe,EACf,EAAwB,EACxB,KAAuB,EACvB,KAAc,EACd,YAAqB,EACrB,OAAmB,EACnB,KAAkB,EAClB,eAA6B;QAE7B,IAAM,QAAQ,GAAG,EAAE,CAAC,aAAa,CAAC;QAClC,IAAM,iBAAiB,GAAG;YACtB,GAAG,EAAE,KAAK;YACV,KAAK,EAAE,+BAA4B,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,gCAA4B;SAC9F,CAAC;QACF,IAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAE7D,IAAM,GAAG,GAAG,IAAA,6BAAa,EAAC,iBAAiB,EAAE,QAAQ,CAAmB,CAAC;QAEzE,CAAC,eAAe,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEpD,IAAM,OAAO,GAAuB,EAAE,MAAM,QAAA,EAAE,EAAE,IAAA,EAAE,KAAK,OAAA,EAAE,KAAK,OAAA,EAAE,SAAS,WAAA,EAAE,OAAO,SAAA,EAAE,CAAC;QACrF,IAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAC/E,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE1B,IAAM,OAAO,GAAiE;YAC1E,WAAW,aAAA;YACX,iEAAiE;YACjE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,kBAAkB;YACpE,SAAS,EAAE,KAAK;SACnB,CAAC;QAEF,IAAM,cAAc,GAAG,IAAI,qCAAiB,CACxC,GAAG,EACH,OAAO,EACP,WAAW,EACX,OAAO,EACP,SAAS,EACT,MAAM,CAAC,cAAc,EAAE,CAAC,gBAAgB,CAC3C,CAAC;QAEF,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,KAAA,EAAE,cAAc,gBAAA,EAAE,CAAC;IAC7C,CAAC;IA1CD,8CA0CC;IAmBD,SAAS,WAAW,CAAC,OAA2B,EAAE,KAAiB;QACvD,IAAA,EAAE,GAAc,OAAO,GAArB,EAAE,OAAO,GAAK,OAAO,QAAZ,CAAa;QAChC,IAAM,IAAI,GAAG,IAAA,2CAAa,EAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAEvD,uBAAuB;QACvB,IAAM,WAAW,GAAG,EAAE,CAAC,SAAS,CAAC;QACjC,IAAM,GAAG,GACL,EAAE,CAAC,aAAa,IAAI,IAAA,6CAAe,EAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,IAAM,QAAQ,GAAG,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,QAAQ,CAAC;QAE/B,IAAI,QAAQ,IAAI,SAAS,EAAE;YACvB,OAAO;gBACH,OAAO,EAAE,SAAS;gBAClB,YAAY,EAAE,SAAS;gBACvB,SAAS,EAAE,SAAS;gBACpB,eAAe,EAAE,CAAC,CAAC;gBACnB,SAAS,EAAE,EAAE;aAChB,CAAC,CAAC,kBAAkB;SACxB;QAEO,IAAA,MAAM,GAAY,OAAO,OAAnB,EAAE,KAAK,GAAK,OAAO,MAAZ,CAAa;QAElC,wBAAwB;QACxB,IAAM,SAAS,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAE3C,iCAAiC;QACjC,MAAM,CAAC,eAAe,CAAC;YACnB,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,8BAA8B;QAC9B,IAAM,OAAO,GAAG,IAAA,mDAAqB,EAAC,MAAM,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAErF,oBAAoB;QACpB,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAElC,IAAI,IAAI,IAAI,OAAO,EAAE;YACjB,OAAO,EAAE,CAAC;YAEV,OAAO;gBACH,OAAO,SAAA;gBACP,YAAY,EAAE,WAAW;gBACzB,SAAS,EAAE,QAAQ;gBACnB,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM;gBAC9C,SAAS,qDAAM,OAAO,CAAC,MAAM,SAAC;aACjC,CAAC;SACL;aAAM;YACH,OAAO;gBACH,OAAO,SAAA;gBACP,YAAY,EAAE,SAAS;gBACvB,SAAS,EAAE,SAAS;gBACpB,eAAe,EAAE,CAAC,CAAC;gBACnB,SAAS,EAAE,EAAE;aAChB,CAAC,CAAC,kBAAkB;SACxB;IACL,CAAC;IAED,SAAS,oBAAoB,CACzB,OAA2B,EAC3B,KAAiB,EACjB,SAA+B,EAC/B,MAAc,EACd,MAAc;QAEN,IAAA,KAAK,GAAK,OAAO,MAAZ,CAAa;QAClB,IAAA,OAAO,GAAiC,SAAS,QAA1C,EAAE,SAAS,GAAsB,SAAS,UAA/B,EAAE,eAAe,GAAK,SAAS,gBAAd,CAAe;QAE1D,gDAAgD;QAChD,IAAI,OAAO,IAAI,SAAS,IAAI,SAAS,EAAE;YACnC,2BAA2B;YAC3B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,eAAe,aAAf,eAAe,cAAf,eAAe,GAAI,CAAC,CAAC,GAAG,MAAM,CAAC;YAEjE,sBAAsB;YACtB,IAAA,4CAAc,EAAC,OAAO,CAAC,CAAC;YAExB,+CAA+C;YAC/C,IAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;gBAClD,IAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;aAC3D;YAED,OAAO,IAAI,CAAC;SACf;aAAM;YACH,OAAO,KAAK,CAAC;SAChB;IACL,CAAC;IAED,SAAS,kBAAkB,CACvB,OAA2B,EAC3B,KAAiB,EACjB,SAA+B,EAC/B,MAAc;QAEN,IAAA,KAAK,GAAY,OAAO,MAAnB,EAAE,KAAK,GAAK,OAAO,MAAZ,CAAa;QACzB,IAAA,OAAO,GAA8B,SAAS,QAAvC,EAAE,YAAY,GAAgB,SAAS,aAAzB,EAAE,SAAS,GAAK,SAAS,UAAd,CAAe;QAEvD,gDAAgD;QAChD,IAAI,OAAO,IAAI,YAAY,IAAI,SAAS,EAAE;YACtC,2BAA2B;YAC3B,IAAM,UAAU,GAAG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7D,IAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,0BAA0B;YAC1B,IAAI,UAAU,EAAE;gBACZ,+BAA+B;gBAC/B,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;aACnE;iBAAM;gBACH,wBAAwB;gBACxB,IAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;gBACtD,IAAM,gBAAgB,GAAG,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;gBAC9D,IACI,YAAY,GAAG,0DAA4B;oBAC3C,gBAAgB,GAAG,0DAA4B,EACjD;oBACE,OAAO,KAAK,CAAC;iBAChB;gBACD,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;gBAC5C,OAAO,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC;aACvD;YAED,sBAAsB;YACtB,IAAA,4CAAc,EAAC,OAAO,CAAC,CAAC;YAExB,+CAA+C;YAC/C,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;gBAC9C,IAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;oBAClD,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;iBAChE;aACJ;YAED,OAAO,IAAI,CAAC;SACf;aAAM;YACH,OAAO,KAAK,CAAC;SAChB;IACL,CAAC;IAED,SAAS,qBAAqB,CAAC,OAA2B,EAAE,OAAoB;QACpE,IAAA,EAAE,GAAK,OAAO,GAAZ,CAAa;QACvB,IAAM,IAAI,GAAG,IAAA,2CAAa,EAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACvD,IAAI,IAAI,EAAE;YACN,OAAO,CAAC,EAAE,GAAG,6BAAqB,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAAC;YAC5D,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACpD,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAAC;SACpD;IACL,CAAC;IAED,SAAS,mBAAmB,CAAC,OAA2B,EAAE,OAAoB;QAClE,IAAA,EAAE,GAAY,OAAO,GAAnB,EAAE,KAAK,GAAK,OAAO,MAAZ,CAAa;QAC9B,IAAM,IAAI,GAAG,IAAA,2CAAa,EAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACvD,IAAI,IAAI,EAAE;YACN,OAAO,CAAC,EAAE,GAAG,2BAAmB,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC;YACtF,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,GAAG,IAAI,CAAC;YAChD,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;SACxD;IACL,CAAC","sourcesContent":["import { createElement } from '../../../pluginUtils/CreateElement/createElement';\nimport { DragAndDropHelper } from '../../../pluginUtils/DragAndDrop/DragAndDropHelper';\nimport type { TableEditFeature } from './TableEditFeature';\nimport {\n isElementOfType,\n normalizeRect,\n getFirstSelectedTable,\n MIN_ALLOWED_TABLE_CELL_WIDTH,\n normalizeTable,\n} from 'roosterjs-content-model-dom';\nimport type { DragAndDropHandler } from '../../../pluginUtils/DragAndDrop/DragAndDropHandler';\nimport type { ContentModelTable, IEditor } from 'roosterjs-content-model-types';\n\nconst CELL_RESIZER_WIDTH = 4;\n/**\n * @internal\n */\nexport const HORIZONTAL_RESIZER_ID = 'horizontalResizer';\n/**\n * @internal\n */\nexport const VERTICAL_RESIZER_ID = 'verticalResizer';\n\n/**\n * @internal\n */\nexport function createCellResizer(\n editor: IEditor,\n td: HTMLTableCellElement,\n table: HTMLTableElement,\n isRTL: boolean,\n isHorizontal: boolean,\n onStart: () => void,\n onEnd: () => false,\n anchorContainer?: HTMLElement\n): TableEditFeature | null {\n const document = td.ownerDocument;\n const createElementData = {\n tag: 'div',\n style: `position: fixed; cursor: ${isHorizontal ? 'row' : 'col'}-resize; user-select: none`,\n };\n const zoomScale = editor.getDOMHelper().calculateZoomScale();\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n (anchorContainer || document.body).appendChild(div);\n\n const context: DragAndDropContext = { editor, td, table, isRTL, zoomScale, onStart };\n const setPosition = isHorizontal ? setHorizontalPosition : setVerticalPosition;\n setPosition(context, div);\n\n const handler: DragAndDropHandler<DragAndDropContext, DragAndDropInitValue> = {\n onDragStart,\n // Horizontal modifies row height, vertical modifies column width\n onDragging: isHorizontal ? onDraggingHorizontal : onDraggingVertical,\n onDragEnd: onEnd,\n };\n\n const featureHandler = new DragAndDropHelper<DragAndDropContext, DragAndDropInitValue>(\n div,\n context,\n setPosition,\n handler,\n zoomScale,\n editor.getEnvironment().isMobileOrTablet\n );\n\n return { node: td, div, featureHandler };\n}\n\ninterface DragAndDropContext {\n editor: IEditor;\n td: HTMLTableCellElement;\n table: HTMLTableElement;\n isRTL: boolean;\n zoomScale: number;\n onStart: () => void;\n}\n\ninterface DragAndDropInitValue {\n cmTable: ContentModelTable | undefined;\n anchorColumn: number | undefined;\n anchorRow: number | undefined;\n anchorRowHeight: number;\n allWidths: number[];\n}\n\nfunction onDragStart(context: DragAndDropContext, event: MouseEvent): DragAndDropInitValue {\n const { td, onStart } = context;\n const rect = normalizeRect(td.getBoundingClientRect());\n\n // Get cell coordinates\n const columnIndex = td.cellIndex;\n const row =\n td.parentElement && isElementOfType(td.parentElement, 'tr') ? td.parentElement : undefined;\n const rowIndex = row?.rowIndex;\n\n if (rowIndex == undefined) {\n return {\n cmTable: undefined,\n anchorColumn: undefined,\n anchorRow: undefined,\n anchorRowHeight: -1,\n allWidths: [],\n }; // Just a fallback\n }\n\n const { editor, table } = context;\n\n // Get current selection\n const selection = editor.getDOMSelection();\n\n // Select first cell of the table\n editor.setDOMSelection({\n type: 'table',\n firstColumn: 0,\n firstRow: 0,\n lastColumn: 0,\n lastRow: 0,\n table: table,\n });\n\n // Get the table content model\n const cmTable = getFirstSelectedTable(editor.getContentModelCopy('disconnected'))[0];\n\n // Restore selection\n editor.setDOMSelection(selection);\n\n if (rect && cmTable) {\n onStart();\n\n return {\n cmTable,\n anchorColumn: columnIndex,\n anchorRow: rowIndex,\n anchorRowHeight: cmTable.rows[rowIndex].height,\n allWidths: [...cmTable.widths],\n };\n } else {\n return {\n cmTable,\n anchorColumn: undefined,\n anchorRow: undefined,\n anchorRowHeight: -1,\n allWidths: [],\n }; // Just a fallback\n }\n}\n\nfunction onDraggingHorizontal(\n context: DragAndDropContext,\n event: MouseEvent,\n initValue: DragAndDropInitValue,\n deltaX: number,\n deltaY: number\n) {\n const { table } = context;\n const { cmTable, anchorRow, anchorRowHeight } = initValue;\n\n // Assign new widths and heights to the CM table\n if (cmTable && anchorRow != undefined) {\n // Modify the CM Table size\n cmTable.rows[anchorRow].height = (anchorRowHeight ?? 0) + deltaY;\n\n // Normalize the table\n normalizeTable(cmTable);\n\n // Writeback CM Table size changes to DOM Table\n const tableRow = table.rows[anchorRow];\n for (let col = 0; col < tableRow.cells.length; col++) {\n const td = tableRow.cells[col];\n td.style.height = cmTable.rows[anchorRow].height + 'px';\n }\n\n return true;\n } else {\n return false;\n }\n}\n\nfunction onDraggingVertical(\n context: DragAndDropContext,\n event: MouseEvent,\n initValue: DragAndDropInitValue,\n deltaX: number\n) {\n const { table, isRTL } = context;\n const { cmTable, anchorColumn, allWidths } = initValue;\n\n // Assign new widths and heights to the CM table\n if (cmTable && anchorColumn != undefined) {\n // Modify the CM Table size\n const lastColumn = anchorColumn == cmTable.widths.length - 1;\n const change = deltaX * (isRTL ? -1 : 1);\n // This is the last column\n if (lastColumn) {\n // Only the last column changes\n cmTable.widths[anchorColumn] = allWidths[anchorColumn] + change;\n } else {\n // Any other two columns\n const anchorChange = allWidths[anchorColumn] + change;\n const nextAnchorChange = allWidths[anchorColumn + 1] - change;\n if (\n anchorChange < MIN_ALLOWED_TABLE_CELL_WIDTH ||\n nextAnchorChange < MIN_ALLOWED_TABLE_CELL_WIDTH\n ) {\n return false;\n }\n cmTable.widths[anchorColumn] = anchorChange;\n cmTable.widths[anchorColumn + 1] = nextAnchorChange;\n }\n\n // Normalize the table\n normalizeTable(cmTable);\n\n // Writeback CM Table size changes to DOM Table\n for (let row = 0; row < table.rows.length; row++) {\n const tableRow = table.rows[row];\n for (let col = 0; col < tableRow.cells.length; col++) {\n tableRow.cells[col].style.width = cmTable.widths[col] + 'px';\n }\n }\n\n return true;\n } else {\n return false;\n }\n}\n\nfunction setHorizontalPosition(context: DragAndDropContext, trigger: HTMLElement) {\n const { td } = context;\n const rect = normalizeRect(td.getBoundingClientRect());\n if (rect) {\n trigger.id = HORIZONTAL_RESIZER_ID;\n trigger.style.top = rect.bottom - CELL_RESIZER_WIDTH + 'px';\n trigger.style.left = rect.left + 'px';\n trigger.style.width = rect.right - rect.left + 'px';\n trigger.style.height = CELL_RESIZER_WIDTH + 'px';\n }\n}\n\nfunction setVerticalPosition(context: DragAndDropContext, trigger: HTMLElement) {\n const { td, isRTL } = context;\n const rect = normalizeRect(td.getBoundingClientRect());\n if (rect) {\n trigger.id = VERTICAL_RESIZER_ID;\n trigger.style.top = rect.top + 'px';\n trigger.style.left = (isRTL ? rect.left : rect.right) - CELL_RESIZER_WIDTH + 1 + 'px';\n trigger.style.width = CELL_RESIZER_WIDTH + 'px';\n trigger.style.height = rect.bottom - rect.top + 'px';\n }\n}\n"]}
1
+ {"version":3,"file":"CellResizer.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/CellResizer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createElement } from '../../../pluginUtils/CreateElement/createElement';\nimport { DragAndDropHelper } from '../../../pluginUtils/DragAndDrop/DragAndDropHelper';\nimport { getCMTableFromTable } from '../utils/getTableFromContentModel';\nimport type { TableEditFeature } from './TableEditFeature';\nimport {\n isElementOfType,\n normalizeRect,\n MIN_ALLOWED_TABLE_CELL_WIDTH,\n normalizeTable,\n} from 'roosterjs-content-model-dom';\nimport type { DragAndDropHandler } from '../../../pluginUtils/DragAndDrop/DragAndDropHandler';\nimport type { ContentModelTable, IEditor } from 'roosterjs-content-model-types';\n\nconst CELL_RESIZER_WIDTH = 4;\n/**\n * @internal\n */\nexport const HORIZONTAL_RESIZER_ID = 'horizontalResizer';\n/**\n * @internal\n */\nexport const VERTICAL_RESIZER_ID = 'verticalResizer';\n\n/**\n * @internal\n */\nexport function createCellResizer(\n editor: IEditor,\n td: HTMLTableCellElement,\n table: HTMLTableElement,\n isRTL: boolean,\n isHorizontal: boolean,\n onStart: () => void,\n onEnd: () => false,\n anchorContainer?: HTMLElement\n): TableEditFeature | null {\n const document = td.ownerDocument;\n const createElementData = {\n tag: 'div',\n style: `position: fixed; cursor: ${isHorizontal ? 'row' : 'col'}-resize; user-select: none`,\n };\n const zoomScale = editor.getDOMHelper().calculateZoomScale();\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n (anchorContainer || document.body).appendChild(div);\n\n const context: DragAndDropContext = { editor, td, table, isRTL, zoomScale, onStart };\n const setPosition = isHorizontal ? setHorizontalPosition : setVerticalPosition;\n setPosition(context, div);\n\n const handler: DragAndDropHandler<DragAndDropContext, DragAndDropInitValue> = {\n onDragStart,\n // Horizontal modifies row height, vertical modifies column width\n onDragging: isHorizontal ? onDraggingHorizontal : onDraggingVertical,\n onDragEnd: onEnd,\n };\n\n const featureHandler = new DragAndDropHelper<DragAndDropContext, DragAndDropInitValue>(\n div,\n context,\n setPosition,\n handler,\n zoomScale,\n editor.getEnvironment().isMobileOrTablet\n );\n\n return { node: td, div, featureHandler };\n}\n\ninterface DragAndDropContext {\n editor: IEditor;\n td: HTMLTableCellElement;\n table: HTMLTableElement;\n isRTL: boolean;\n zoomScale: number;\n onStart: () => void;\n}\n\ninterface DragAndDropInitValue {\n cmTable: ContentModelTable | undefined;\n anchorColumn: number | undefined;\n anchorRow: number | undefined;\n anchorRowHeight: number;\n allWidths: number[];\n}\n\nfunction onDragStart(context: DragAndDropContext, event: MouseEvent): DragAndDropInitValue {\n const { td, onStart } = context;\n const rect = normalizeRect(td.getBoundingClientRect());\n\n // Get cell coordinates\n const columnIndex = td.cellIndex;\n const row =\n td.parentElement && isElementOfType(td.parentElement, 'tr') ? td.parentElement : undefined;\n const rowIndex = row?.rowIndex;\n\n if (rowIndex == undefined) {\n return {\n cmTable: undefined,\n anchorColumn: undefined,\n anchorRow: undefined,\n anchorRowHeight: -1,\n allWidths: [],\n }; // Just a fallback\n }\n\n const { editor, table } = context;\n\n // Get Table block in content model\n const cmTable = getCMTableFromTable(editor, table);\n\n if (rect && cmTable) {\n onStart();\n\n return {\n cmTable,\n anchorColumn: columnIndex,\n anchorRow: rowIndex,\n anchorRowHeight: cmTable.rows[rowIndex].height,\n allWidths: [...cmTable.widths],\n };\n } else {\n return {\n cmTable,\n anchorColumn: undefined,\n anchorRow: undefined,\n anchorRowHeight: -1,\n allWidths: [],\n }; // Just a fallback\n }\n}\n\nfunction onDraggingHorizontal(\n context: DragAndDropContext,\n event: MouseEvent,\n initValue: DragAndDropInitValue,\n deltaX: number,\n deltaY: number\n) {\n const { table } = context;\n const { cmTable, anchorRow, anchorRowHeight } = initValue;\n\n // Assign new widths and heights to the CM table\n if (cmTable && anchorRow != undefined) {\n // Modify the CM Table size\n cmTable.rows[anchorRow].height = (anchorRowHeight ?? 0) + deltaY;\n\n // Normalize the table\n normalizeTable(cmTable);\n\n // Writeback CM Table size changes to DOM Table\n const tableRow = table.rows[anchorRow];\n for (let col = 0; col < tableRow.cells.length; col++) {\n const td = tableRow.cells[col];\n td.style.height = cmTable.rows[anchorRow].height + 'px';\n }\n\n return true;\n } else {\n return false;\n }\n}\n\nfunction onDraggingVertical(\n context: DragAndDropContext,\n event: MouseEvent,\n initValue: DragAndDropInitValue,\n deltaX: number\n) {\n const { table, isRTL } = context;\n const { cmTable, anchorColumn, allWidths } = initValue;\n\n // Assign new widths and heights to the CM table\n if (cmTable && anchorColumn != undefined) {\n // Modify the CM Table size\n const lastColumn = anchorColumn == cmTable.widths.length - 1;\n const change = deltaX * (isRTL ? -1 : 1);\n // This is the last column\n if (lastColumn) {\n // Only the last column changes\n cmTable.widths[anchorColumn] = allWidths[anchorColumn] + change;\n } else {\n // Any other two columns\n const anchorChange = allWidths[anchorColumn] + change;\n const nextAnchorChange = allWidths[anchorColumn + 1] - change;\n if (\n anchorChange < MIN_ALLOWED_TABLE_CELL_WIDTH ||\n nextAnchorChange < MIN_ALLOWED_TABLE_CELL_WIDTH\n ) {\n return false;\n }\n cmTable.widths[anchorColumn] = anchorChange;\n cmTable.widths[anchorColumn + 1] = nextAnchorChange;\n }\n\n // Normalize the table\n normalizeTable(cmTable);\n\n // Writeback CM Table size changes to DOM Table\n for (let row = 0; row < table.rows.length; row++) {\n const tableRow = table.rows[row];\n for (let col = 0; col < tableRow.cells.length; col++) {\n tableRow.cells[col].style.width = cmTable.widths[col] + 'px';\n }\n }\n\n return true;\n } else {\n return false;\n }\n}\n\nfunction setHorizontalPosition(context: DragAndDropContext, trigger: HTMLElement) {\n const { td } = context;\n const rect = normalizeRect(td.getBoundingClientRect());\n if (rect) {\n trigger.id = HORIZONTAL_RESIZER_ID;\n trigger.style.top = rect.bottom - CELL_RESIZER_WIDTH + 'px';\n trigger.style.left = rect.left + 'px';\n trigger.style.width = rect.right - rect.left + 'px';\n trigger.style.height = CELL_RESIZER_WIDTH + 'px';\n }\n}\n\nfunction setVerticalPosition(context: DragAndDropContext, trigger: HTMLElement) {\n const { td, isRTL } = context;\n const rect = normalizeRect(td.getBoundingClientRect());\n if (rect) {\n trigger.id = VERTICAL_RESIZER_ID;\n trigger.style.top = rect.top + 'px';\n trigger.style.left = (isRTL ? rect.left : rect.right) - CELL_RESIZER_WIDTH + 1 + 'px';\n trigger.style.width = CELL_RESIZER_WIDTH + 'px';\n trigger.style.height = rect.bottom - rect.top + 'px';\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- define(["require", "exports", "tslib", "../../../pluginUtils/CreateElement/createElement", "../../../pluginUtils/DragAndDrop/DragAndDropHelper", "roosterjs-content-model-api", "roosterjs-content-model-dom"], function (require, exports, tslib_1, createElement_1, DragAndDropHelper_1, roosterjs_content_model_api_1, roosterjs_content_model_dom_1) {
1
+ define(["require", "exports", "tslib", "../../../pluginUtils/CreateElement/createElement", "../../../pluginUtils/DragAndDrop/DragAndDropHelper", "roosterjs-content-model-api", "../utils/getTableFromContentModel", "roosterjs-content-model-dom"], function (require, exports, tslib_1, createElement_1, DragAndDropHelper_1, roosterjs_content_model_api_1, getTableFromContentModel_1, roosterjs_content_model_dom_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.onDragEnd = exports.onDragging = exports.onDragStart = exports.createTableMover = exports.TABLE_MOVER_ID = void 0;
@@ -134,21 +134,10 @@ define(["require", "exports", "tslib", "../../../pluginUtils/CreateElement/creat
134
134
  tableRect.style.top = trect.top + "px";
135
135
  tableRect.style.left = trect.left + "px";
136
136
  (_a = div.parentNode) === null || _a === void 0 ? void 0 : _a.appendChild(tableRect);
137
- // Get current selection
137
+ // Get drag start selection
138
138
  var initialSelection = editor.getDOMSelection();
139
- // Select first cell of the table
140
- editor.setDOMSelection({
141
- type: 'table',
142
- firstColumn: 0,
143
- firstRow: 0,
144
- lastColumn: 0,
145
- lastRow: 0,
146
- table: table,
147
- });
148
- // Get the table content model
149
- var _b = (0, tslib_1.__read)((0, roosterjs_content_model_dom_1.getFirstSelectedTable)(editor.getContentModelCopy('disconnected')), 1), cmTable = _b[0];
150
- // Restore selection
151
- editor.setDOMSelection(initialSelection);
139
+ // Get Table block in content model
140
+ var cmTable = (0, getTableFromContentModel_1.getCMTableFromTable)(editor, table);
152
141
  return {
153
142
  cmTable: cmTable,
154
143
  initialSelection: initialSelection,
@@ -1 +1 @@
1
- {"version":3,"file":"TableMover.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableMover.ts"],"names":[],"mappings":"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","sourcesContent":["import { createElement } from '../../../pluginUtils/CreateElement/createElement';\nimport { DragAndDropHelper } from '../../../pluginUtils/DragAndDrop/DragAndDropHelper';\nimport { formatInsertPointWithContentModel } from 'roosterjs-content-model-api';\nimport type { TableEditFeature } from './TableEditFeature';\nimport type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';\nimport type { DragAndDropHandler } from '../../../pluginUtils/DragAndDrop/DragAndDropHandler';\nimport {\n createContentModelDocument,\n createSelectionMarker,\n getFirstSelectedTable,\n isNodeOfType,\n mergeModel,\n normalizeRect,\n setParagraphNotImplicit,\n setSelection,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelTable,\n DOMInsertPoint,\n DOMSelection,\n IEditor,\n Rect,\n} from 'roosterjs-content-model-types';\n\nconst TABLE_MOVER_LENGTH = 12;\n/**\n * @internal\n */\nexport const TABLE_MOVER_ID = '_Table_Mover';\nconst TABLE_MOVER_STYLE_KEY = '_TableMoverCursorStyle';\n\n/**\n * @internal\n * Allows user to move table to another position\n * Contains the function to select whole table\n */\nexport function createTableMover(\n table: HTMLTableElement,\n editor: IEditor,\n isRTL: boolean,\n onFinishDragging: (table: HTMLTableElement) => void,\n onStart: () => void,\n onEnd: () => void,\n contentDiv?: EventTarget | null,\n anchorContainer?: HTMLElement,\n onTableEditorCreated?: OnTableEditorCreatedCallback,\n disableMovement?: boolean\n): TableEditFeature | null {\n const rect = normalizeRect(table.getBoundingClientRect());\n\n if (!isTableTopVisible(editor, rect, contentDiv as Node)) {\n return null;\n }\n\n const zoomScale = editor.getDOMHelper().calculateZoomScale();\n const document = table.ownerDocument;\n const createElementData = {\n tag: 'div',\n style: 'position: fixed; cursor: move; user-select: none; border: 1px solid #808080',\n };\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n div.id = TABLE_MOVER_ID;\n div.style.width = `${TABLE_MOVER_LENGTH}px`;\n div.style.height = `${TABLE_MOVER_LENGTH}px`;\n\n (anchorContainer || document.body).appendChild(div);\n\n const context: TableMoverContext = {\n table,\n zoomScale,\n rect,\n isRTL,\n editor,\n div,\n onFinishDragging,\n onStart,\n onEnd,\n disableMovement,\n };\n\n setDivPosition(context, div);\n\n const featureHandler = new TableMoverFeature(\n div,\n context,\n () => {},\n disableMovement\n ? { onDragEnd }\n : {\n onDragStart,\n onDragging,\n onDragEnd,\n },\n context.zoomScale,\n onTableEditorCreated,\n editor.getEnvironment().isMobileOrTablet\n );\n\n return { node: table, div, featureHandler };\n}\n\n/**\n * @internal\n * Exported for testing\n */\nexport interface TableMoverContext {\n table: HTMLTableElement;\n zoomScale: number;\n rect: Rect | null;\n isRTL: boolean;\n editor: IEditor;\n div: HTMLElement;\n onFinishDragging: (table: HTMLTableElement) => void;\n onStart: () => void;\n onEnd: () => void;\n disableMovement?: boolean;\n}\n\n/**\n * @internal\n * Exported for testing\n */\nexport interface TableMoverInitValue {\n cmTable: ContentModelTable | undefined;\n initialSelection: DOMSelection | null;\n tableRect: HTMLDivElement;\n}\n\nclass TableMoverFeature extends DragAndDropHelper<TableMoverContext, TableMoverInitValue> {\n private disposer: undefined | (() => void);\n\n constructor(\n div: HTMLElement,\n context: TableMoverContext,\n onSubmit: (\n context: TableMoverContext,\n trigger: HTMLElement,\n container?: HTMLElement\n ) => void,\n handler: DragAndDropHandler<TableMoverContext, TableMoverInitValue>,\n zoomScale: number,\n onTableEditorCreated?: OnTableEditorCreatedCallback,\n forceMobile?: boolean | undefined\n ) {\n super(div, context, onSubmit, handler, zoomScale, forceMobile);\n this.disposer = onTableEditorCreated?.('TableMover', div);\n }\n\n dispose(): void {\n this.disposer?.();\n this.disposer = undefined;\n super.dispose();\n }\n}\n\nfunction setDivPosition(context: TableMoverContext, trigger: HTMLElement) {\n const { rect } = context;\n if (rect) {\n trigger.style.top = `${rect.top - TABLE_MOVER_LENGTH}px`;\n trigger.style.left = `${rect.left - TABLE_MOVER_LENGTH - 2}px`;\n }\n}\n\nfunction isTableTopVisible(editor: IEditor, rect: Rect | null, contentDiv?: Node | null): boolean {\n const visibleViewport = editor.getVisibleViewport();\n if (isNodeOfType(contentDiv, 'ELEMENT_NODE') && visibleViewport && rect) {\n const containerRect = normalizeRect(contentDiv.getBoundingClientRect());\n\n return !!containerRect && containerRect.top <= rect.top && visibleViewport.top <= rect.top;\n }\n\n return true;\n}\n\nfunction setTableMoverCursor(editor: IEditor, state: boolean, type?: 'move' | 'copy') {\n editor?.setEditorStyle(TABLE_MOVER_STYLE_KEY, state ? 'cursor: ' + type ?? 'move' : null);\n}\n\n// Get insertion point from coordinate.\nfunction getNodePositionFromEvent(editor: IEditor, x: number, y: number): DOMInsertPoint | null {\n const doc = editor.getDocument();\n const domHelper = editor.getDOMHelper();\n\n if (doc.caretRangeFromPoint) {\n // Chrome, Edge, Safari, Opera\n const range = doc.caretRangeFromPoint(x, y);\n if (range && domHelper.isNodeInEditor(range.startContainer)) {\n return { node: range.startContainer, offset: range.startOffset };\n }\n }\n\n if ('caretPositionFromPoint' in doc) {\n // Firefox\n const pos = (doc as any).caretPositionFromPoint(x, y);\n if (pos && domHelper.isNodeInEditor(pos.offsetNode)) {\n return { node: pos.offsetNode, offset: pos.offset };\n }\n }\n\n if (doc.elementFromPoint) {\n // Fallback\n const element = doc.elementFromPoint(x, y);\n if (element && domHelper.isNodeInEditor(element)) {\n return { node: element, offset: 0 };\n }\n }\n\n return null;\n}\n\n/**\n * @internal\n * Exported for testing\n */\nexport function onDragStart(context: TableMoverContext): TableMoverInitValue {\n context.onStart();\n\n const { editor, table, div } = context;\n\n setTableMoverCursor(editor, true, 'move');\n\n // Create table outline rectangle\n const trect = table.getBoundingClientRect();\n const createElementData = {\n tag: 'div',\n style: 'position: fixed; user-select: none; border: 1px solid #808080',\n };\n const tableRect = createElement(createElementData, document) as HTMLDivElement;\n tableRect.style.width = `${trect.width}px`;\n tableRect.style.height = `${trect.height}px`;\n tableRect.style.top = `${trect.top}px`;\n tableRect.style.left = `${trect.left}px`;\n div.parentNode?.appendChild(tableRect);\n\n // Get current selection\n const initialSelection = editor.getDOMSelection();\n\n // Select first cell of the table\n editor.setDOMSelection({\n type: 'table',\n firstColumn: 0,\n firstRow: 0,\n lastColumn: 0,\n lastRow: 0,\n table: table,\n });\n\n // Get the table content model\n const [cmTable] = getFirstSelectedTable(editor.getContentModelCopy('disconnected'));\n\n // Restore selection\n editor.setDOMSelection(initialSelection);\n\n return {\n cmTable,\n initialSelection,\n tableRect,\n };\n}\n\n/**\n * @internal\n * Exported for testing\n */\nexport function onDragging(\n context: TableMoverContext,\n event: MouseEvent,\n initValue: TableMoverInitValue\n) {\n const { tableRect } = initValue;\n const { editor } = context;\n\n // Move table outline rectangle\n tableRect.style.top = `${event.clientY + TABLE_MOVER_LENGTH}px`;\n tableRect.style.left = `${event.clientX + TABLE_MOVER_LENGTH}px`;\n\n const pos = getNodePositionFromEvent(editor, event.clientX, event.clientY);\n if (pos) {\n const range = editor.getDocument().createRange();\n range.setStart(pos.node, pos.offset);\n range.collapse(true);\n\n editor.setDOMSelection({ type: 'range', range, isReverted: false });\n return true;\n }\n return false;\n}\n\n/**\n * @internal\n * Exported for testing\n */\nexport function onDragEnd(\n context: TableMoverContext,\n event: MouseEvent,\n initValue: TableMoverInitValue | undefined\n) {\n const { editor, table, onFinishDragging: selectWholeTable, disableMovement } = context;\n const element = event.target;\n\n // Remove table outline rectangle\n initValue?.tableRect.remove();\n\n // Reset cursor\n setTableMoverCursor(editor, false);\n\n if (element == context.div) {\n // Table mover was only clicked, select whole table\n selectWholeTable(table);\n context.onEnd();\n return true;\n } else {\n // Check if table was dragged on itself, element is not in editor, or movement is disabled\n if (\n table.contains(element as Node) ||\n !editor.getDOMHelper().isNodeInEditor(element as Node) ||\n disableMovement\n ) {\n editor.setDOMSelection(initValue?.initialSelection ?? null);\n context.onEnd();\n return false;\n }\n\n let insertionSuccess: boolean = false;\n\n // Get position to insert table\n const insertPosition = getNodePositionFromEvent(editor, event.clientX, event.clientY);\n if (insertPosition) {\n // Move table to new position\n formatInsertPointWithContentModel(\n editor,\n insertPosition,\n (model, context, ip) => {\n // Remove old table\n const [oldTable, path] = getFirstSelectedTable(model);\n if (oldTable) {\n const index = path[0].blocks.indexOf(oldTable);\n path[0].blocks.splice(index, 1);\n }\n\n if (ip && initValue?.cmTable) {\n // Insert new table\n const doc = createContentModelDocument();\n doc.blocks.push(initValue.cmTable);\n insertionSuccess = !!mergeModel(model, doc, context, {\n mergeFormat: 'none',\n insertPosition: ip,\n });\n\n if (insertionSuccess) {\n // After mergeModel, the new table should be selected\n const finalTable = getFirstSelectedTable(model)[0] ?? initValue.cmTable;\n if (finalTable) {\n // Add selection marker to the first cell of the table\n const FirstCell = finalTable.rows[0].cells[0];\n const markerParagraph = FirstCell?.blocks[0];\n if (markerParagraph?.blockType == 'Paragraph') {\n const marker = createSelectionMarker(model.format);\n\n markerParagraph.segments.unshift(marker);\n setParagraphNotImplicit(markerParagraph);\n setSelection(FirstCell, marker);\n }\n }\n }\n return insertionSuccess;\n }\n },\n {\n // Select first cell of the old table\n selectionOverride: {\n type: 'table',\n firstColumn: 0,\n firstRow: 0,\n lastColumn: 0,\n lastRow: 0,\n table: table,\n },\n apiName: 'TableMover',\n }\n );\n } else {\n // No movement, restore initial selection\n editor.setDOMSelection(initValue?.initialSelection ?? null);\n }\n context.onEnd();\n return insertionSuccess;\n }\n}\n"]}
1
+ {"version":3,"file":"TableMover.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableMover.ts"],"names":[],"mappings":"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","sourcesContent":["import { createElement } from '../../../pluginUtils/CreateElement/createElement';\nimport { DragAndDropHelper } from '../../../pluginUtils/DragAndDrop/DragAndDropHelper';\nimport { formatInsertPointWithContentModel } from 'roosterjs-content-model-api';\nimport { getCMTableFromTable } from '../utils/getTableFromContentModel';\nimport type { TableEditFeature } from './TableEditFeature';\nimport type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';\nimport type { DragAndDropHandler } from '../../../pluginUtils/DragAndDrop/DragAndDropHandler';\nimport {\n createContentModelDocument,\n createSelectionMarker,\n getFirstSelectedTable,\n isNodeOfType,\n mergeModel,\n normalizeRect,\n setParagraphNotImplicit,\n setSelection,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelTable,\n DOMInsertPoint,\n DOMSelection,\n IEditor,\n Rect,\n} from 'roosterjs-content-model-types';\n\nconst TABLE_MOVER_LENGTH = 12;\n/**\n * @internal\n */\nexport const TABLE_MOVER_ID = '_Table_Mover';\nconst TABLE_MOVER_STYLE_KEY = '_TableMoverCursorStyle';\n\n/**\n * @internal\n * Allows user to move table to another position\n * Contains the function to select whole table\n */\nexport function createTableMover(\n table: HTMLTableElement,\n editor: IEditor,\n isRTL: boolean,\n onFinishDragging: (table: HTMLTableElement) => void,\n onStart: () => void,\n onEnd: () => void,\n contentDiv?: EventTarget | null,\n anchorContainer?: HTMLElement,\n onTableEditorCreated?: OnTableEditorCreatedCallback,\n disableMovement?: boolean\n): TableEditFeature | null {\n const rect = normalizeRect(table.getBoundingClientRect());\n\n if (!isTableTopVisible(editor, rect, contentDiv as Node)) {\n return null;\n }\n\n const zoomScale = editor.getDOMHelper().calculateZoomScale();\n const document = table.ownerDocument;\n const createElementData = {\n tag: 'div',\n style: 'position: fixed; cursor: move; user-select: none; border: 1px solid #808080',\n };\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n div.id = TABLE_MOVER_ID;\n div.style.width = `${TABLE_MOVER_LENGTH}px`;\n div.style.height = `${TABLE_MOVER_LENGTH}px`;\n\n (anchorContainer || document.body).appendChild(div);\n\n const context: TableMoverContext = {\n table,\n zoomScale,\n rect,\n isRTL,\n editor,\n div,\n onFinishDragging,\n onStart,\n onEnd,\n disableMovement,\n };\n\n setDivPosition(context, div);\n\n const featureHandler = new TableMoverFeature(\n div,\n context,\n () => {},\n disableMovement\n ? { onDragEnd }\n : {\n onDragStart,\n onDragging,\n onDragEnd,\n },\n context.zoomScale,\n onTableEditorCreated,\n editor.getEnvironment().isMobileOrTablet\n );\n\n return { node: table, div, featureHandler };\n}\n\n/**\n * @internal\n * Exported for testing\n */\nexport interface TableMoverContext {\n table: HTMLTableElement;\n zoomScale: number;\n rect: Rect | null;\n isRTL: boolean;\n editor: IEditor;\n div: HTMLElement;\n onFinishDragging: (table: HTMLTableElement) => void;\n onStart: () => void;\n onEnd: () => void;\n disableMovement?: boolean;\n}\n\n/**\n * @internal\n * Exported for testing\n */\nexport interface TableMoverInitValue {\n cmTable: ContentModelTable | undefined;\n initialSelection: DOMSelection | null;\n tableRect: HTMLDivElement;\n}\n\nclass TableMoverFeature extends DragAndDropHelper<TableMoverContext, TableMoverInitValue> {\n private disposer: undefined | (() => void);\n\n constructor(\n div: HTMLElement,\n context: TableMoverContext,\n onSubmit: (\n context: TableMoverContext,\n trigger: HTMLElement,\n container?: HTMLElement\n ) => void,\n handler: DragAndDropHandler<TableMoverContext, TableMoverInitValue>,\n zoomScale: number,\n onTableEditorCreated?: OnTableEditorCreatedCallback,\n forceMobile?: boolean | undefined\n ) {\n super(div, context, onSubmit, handler, zoomScale, forceMobile);\n this.disposer = onTableEditorCreated?.('TableMover', div);\n }\n\n dispose(): void {\n this.disposer?.();\n this.disposer = undefined;\n super.dispose();\n }\n}\n\nfunction setDivPosition(context: TableMoverContext, trigger: HTMLElement) {\n const { rect } = context;\n if (rect) {\n trigger.style.top = `${rect.top - TABLE_MOVER_LENGTH}px`;\n trigger.style.left = `${rect.left - TABLE_MOVER_LENGTH - 2}px`;\n }\n}\n\nfunction isTableTopVisible(editor: IEditor, rect: Rect | null, contentDiv?: Node | null): boolean {\n const visibleViewport = editor.getVisibleViewport();\n if (isNodeOfType(contentDiv, 'ELEMENT_NODE') && visibleViewport && rect) {\n const containerRect = normalizeRect(contentDiv.getBoundingClientRect());\n\n return !!containerRect && containerRect.top <= rect.top && visibleViewport.top <= rect.top;\n }\n\n return true;\n}\n\nfunction setTableMoverCursor(editor: IEditor, state: boolean, type?: 'move' | 'copy') {\n editor?.setEditorStyle(TABLE_MOVER_STYLE_KEY, state ? 'cursor: ' + type ?? 'move' : null);\n}\n\n// Get insertion point from coordinate.\nfunction getNodePositionFromEvent(editor: IEditor, x: number, y: number): DOMInsertPoint | null {\n const doc = editor.getDocument();\n const domHelper = editor.getDOMHelper();\n\n if (doc.caretRangeFromPoint) {\n // Chrome, Edge, Safari, Opera\n const range = doc.caretRangeFromPoint(x, y);\n if (range && domHelper.isNodeInEditor(range.startContainer)) {\n return { node: range.startContainer, offset: range.startOffset };\n }\n }\n\n if ('caretPositionFromPoint' in doc) {\n // Firefox\n const pos = (doc as any).caretPositionFromPoint(x, y);\n if (pos && domHelper.isNodeInEditor(pos.offsetNode)) {\n return { node: pos.offsetNode, offset: pos.offset };\n }\n }\n\n if (doc.elementFromPoint) {\n // Fallback\n const element = doc.elementFromPoint(x, y);\n if (element && domHelper.isNodeInEditor(element)) {\n return { node: element, offset: 0 };\n }\n }\n\n return null;\n}\n\n/**\n * @internal\n * Exported for testing\n */\nexport function onDragStart(context: TableMoverContext): TableMoverInitValue {\n context.onStart();\n\n const { editor, table, div } = context;\n\n setTableMoverCursor(editor, true, 'move');\n\n // Create table outline rectangle\n const trect = table.getBoundingClientRect();\n const createElementData = {\n tag: 'div',\n style: 'position: fixed; user-select: none; border: 1px solid #808080',\n };\n const tableRect = createElement(createElementData, document) as HTMLDivElement;\n tableRect.style.width = `${trect.width}px`;\n tableRect.style.height = `${trect.height}px`;\n tableRect.style.top = `${trect.top}px`;\n tableRect.style.left = `${trect.left}px`;\n div.parentNode?.appendChild(tableRect);\n\n // Get drag start selection\n const initialSelection = editor.getDOMSelection();\n\n // Get Table block in content model\n const cmTable = getCMTableFromTable(editor, table);\n\n return {\n cmTable,\n initialSelection,\n tableRect,\n };\n}\n\n/**\n * @internal\n * Exported for testing\n */\nexport function onDragging(\n context: TableMoverContext,\n event: MouseEvent,\n initValue: TableMoverInitValue\n) {\n const { tableRect } = initValue;\n const { editor } = context;\n\n // Move table outline rectangle\n tableRect.style.top = `${event.clientY + TABLE_MOVER_LENGTH}px`;\n tableRect.style.left = `${event.clientX + TABLE_MOVER_LENGTH}px`;\n\n const pos = getNodePositionFromEvent(editor, event.clientX, event.clientY);\n if (pos) {\n const range = editor.getDocument().createRange();\n range.setStart(pos.node, pos.offset);\n range.collapse(true);\n\n editor.setDOMSelection({ type: 'range', range, isReverted: false });\n return true;\n }\n return false;\n}\n\n/**\n * @internal\n * Exported for testing\n */\nexport function onDragEnd(\n context: TableMoverContext,\n event: MouseEvent,\n initValue: TableMoverInitValue | undefined\n) {\n const { editor, table, onFinishDragging: selectWholeTable, disableMovement } = context;\n const element = event.target;\n\n // Remove table outline rectangle\n initValue?.tableRect.remove();\n\n // Reset cursor\n setTableMoverCursor(editor, false);\n\n if (element == context.div) {\n // Table mover was only clicked, select whole table\n selectWholeTable(table);\n context.onEnd();\n return true;\n } else {\n // Check if table was dragged on itself, element is not in editor, or movement is disabled\n if (\n table.contains(element as Node) ||\n !editor.getDOMHelper().isNodeInEditor(element as Node) ||\n disableMovement\n ) {\n editor.setDOMSelection(initValue?.initialSelection ?? null);\n context.onEnd();\n return false;\n }\n\n let insertionSuccess: boolean = false;\n\n // Get position to insert table\n const insertPosition = getNodePositionFromEvent(editor, event.clientX, event.clientY);\n if (insertPosition) {\n // Move table to new position\n formatInsertPointWithContentModel(\n editor,\n insertPosition,\n (model, context, ip) => {\n // Remove old table\n const [oldTable, path] = getFirstSelectedTable(model);\n if (oldTable) {\n const index = path[0].blocks.indexOf(oldTable);\n path[0].blocks.splice(index, 1);\n }\n\n if (ip && initValue?.cmTable) {\n // Insert new table\n const doc = createContentModelDocument();\n doc.blocks.push(initValue.cmTable);\n insertionSuccess = !!mergeModel(model, doc, context, {\n mergeFormat: 'none',\n insertPosition: ip,\n });\n\n if (insertionSuccess) {\n // After mergeModel, the new table should be selected\n const finalTable = getFirstSelectedTable(model)[0] ?? initValue.cmTable;\n if (finalTable) {\n // Add selection marker to the first cell of the table\n const FirstCell = finalTable.rows[0].cells[0];\n const markerParagraph = FirstCell?.blocks[0];\n if (markerParagraph?.blockType == 'Paragraph') {\n const marker = createSelectionMarker(model.format);\n\n markerParagraph.segments.unshift(marker);\n setParagraphNotImplicit(markerParagraph);\n setSelection(FirstCell, marker);\n }\n }\n }\n return insertionSuccess;\n }\n },\n {\n // Select first cell of the old table\n selectionOverride: {\n type: 'table',\n firstColumn: 0,\n firstRow: 0,\n lastColumn: 0,\n lastRow: 0,\n table: table,\n },\n apiName: 'TableMover',\n }\n );\n } else {\n // No movement, restore initial selection\n editor.setDOMSelection(initValue?.initialSelection ?? null);\n }\n context.onEnd();\n return insertionSuccess;\n }\n}\n"]}