roosterjs-content-model-plugins 9.45.1 → 9.45.2

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.
@@ -44,7 +44,7 @@ var deleteList = function (context) {
44
44
  else {
45
45
  var removedBlocks = mutableList.blocks.splice(mutableList.blocks.indexOf(paragraph), mutableList.blocks.length);
46
46
  if (mutableList.levels.length > 1) {
47
- var newListItem = (0, roosterjs_content_model_dom_1.createListItem)(mutableList.levels.slice(0, -1), mutableList.format);
47
+ var newListItem = (0, roosterjs_content_model_dom_1.createListItem)(mutableList.levels.slice(0, -1), mutableList.formatHolder.format);
48
48
  newListItem.blocks = removedBlocks.map(function (block) { return (0, roosterjs_content_model_dom_1.mutateBlock)(block); });
49
49
  (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(listItemIndex + 1, 0, newListItem);
50
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deleteList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteList.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createListItem,\n getClosestAncestorBlockGroupIndex,\n mutateBlock,\n} from 'roosterjs-content-model-dom';\nimport type {\n DeleteSelectionStep,\n ContentModelListItem,\n ContentModelBlock,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const deleteList: DeleteSelectionStep = context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const { paragraph, marker, path } = context.insertPoint;\n const index = getClosestAncestorBlockGroupIndex<ContentModelListItem>(\n path,\n ['ListItem'],\n ['TableCell', 'FormatContainer']\n );\n const item = path[index];\n const parent = path[index + 1];\n\n if (\n item?.blockGroupType == 'ListItem' &&\n item.levels.length > 0 &&\n paragraph.segments[0] == marker &&\n parent\n ) {\n const mutableList = mutateBlock(item);\n const lastLevel = mutableList.levels[mutableList.levels.length - 1];\n const listItemIndex = parent.blocks.indexOf(item);\n const previousItem = parent.blocks[listItemIndex - 1];\n\n // 1. If the last level is dummy, just remove it (legacy behavior)\n // 2. If focus is at the beginning of list item and previous block is a list item with the same level count,\n // merge current list item into previous one\n // 3. Otherwise, split the list item. Keep the blocks before the paragraph in the current list item,\n // move the rest to a new list item (if there are multiple levels) or directly to parent (if only one level)\n if (lastLevel.format.displayForDummyItem == 'block') {\n mutableList.levels.pop();\n\n context.deleteResult = 'range';\n } else if (\n item.blocks[0] == paragraph &&\n previousItem?.blockType == 'BlockGroup' &&\n previousItem.blockGroupType == 'ListItem' &&\n previousItem.levels.length == mutableList.levels.length\n ) {\n const mutablePreviousItem = mutateBlock(previousItem);\n\n mutablePreviousItem.blocks.push(...mutableList.blocks);\n mutateBlock(parent).blocks.splice(listItemIndex, 1);\n\n context.deleteResult = 'range';\n } else {\n const removedBlocks = mutableList.blocks.splice(\n mutableList.blocks.indexOf(paragraph),\n mutableList.blocks.length\n );\n\n if (mutableList.levels.length > 1) {\n const newListItem = createListItem(\n mutableList.levels.slice(0, -1),\n mutableList.format\n );\n\n newListItem.blocks = removedBlocks.map(\n block => mutateBlock(block) as ContentModelBlock\n );\n\n mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, newListItem);\n } else {\n mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, ...removedBlocks);\n }\n\n context.deleteResult = 'range';\n }\n }\n};\n"]}
1
+ {"version":3,"file":"deleteList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteList.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createListItem,\n getClosestAncestorBlockGroupIndex,\n mutateBlock,\n} from 'roosterjs-content-model-dom';\nimport type {\n DeleteSelectionStep,\n ContentModelListItem,\n ContentModelBlock,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const deleteList: DeleteSelectionStep = context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const { paragraph, marker, path } = context.insertPoint;\n const index = getClosestAncestorBlockGroupIndex<ContentModelListItem>(\n path,\n ['ListItem'],\n ['TableCell', 'FormatContainer']\n );\n const item = path[index];\n const parent = path[index + 1];\n\n if (\n item?.blockGroupType == 'ListItem' &&\n item.levels.length > 0 &&\n paragraph.segments[0] == marker &&\n parent\n ) {\n const mutableList = mutateBlock(item);\n const lastLevel = mutableList.levels[mutableList.levels.length - 1];\n const listItemIndex = parent.blocks.indexOf(item);\n const previousItem = parent.blocks[listItemIndex - 1];\n\n // 1. If the last level is dummy, just remove it (legacy behavior)\n // 2. If focus is at the beginning of list item and previous block is a list item with the same level count,\n // merge current list item into previous one\n // 3. Otherwise, split the list item. Keep the blocks before the paragraph in the current list item,\n // move the rest to a new list item (if there are multiple levels) or directly to parent (if only one level)\n if (lastLevel.format.displayForDummyItem == 'block') {\n mutableList.levels.pop();\n\n context.deleteResult = 'range';\n } else if (\n item.blocks[0] == paragraph &&\n previousItem?.blockType == 'BlockGroup' &&\n previousItem.blockGroupType == 'ListItem' &&\n previousItem.levels.length == mutableList.levels.length\n ) {\n const mutablePreviousItem = mutateBlock(previousItem);\n\n mutablePreviousItem.blocks.push(...mutableList.blocks);\n mutateBlock(parent).blocks.splice(listItemIndex, 1);\n\n context.deleteResult = 'range';\n } else {\n const removedBlocks = mutableList.blocks.splice(\n mutableList.blocks.indexOf(paragraph),\n mutableList.blocks.length\n );\n\n if (mutableList.levels.length > 1) {\n const newListItem = createListItem(\n mutableList.levels.slice(0, -1),\n mutableList.formatHolder.format\n );\n\n newListItem.blocks = removedBlocks.map(\n block => mutateBlock(block) as ContentModelBlock\n );\n\n mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, newListItem);\n } else {\n mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, ...removedBlocks);\n }\n\n context.deleteResult = 'range';\n }\n }\n};\n"]}
@@ -23,31 +23,38 @@ exports.VERTICAL_INSERTER_ID = 'verticalInserter';
23
23
  function createTableInserter(editor, td, table, isRTL, isHorizontal, onBeforeInsert, onAfterInserted, anchorContainer, onTableEditorCreated) {
24
24
  var tdRect = (0, roosterjs_content_model_dom_1.normalizeRect)(td.getBoundingClientRect());
25
25
  var viewPort = editor.getVisibleViewport();
26
- var tableRect = table && viewPort ? (0, getIntersectedRect_1.getIntersectedRect)([table], [viewPort]) : null;
27
- // set inserter position
28
- if (tdRect && tableRect) {
29
- var document_1 = td.ownerDocument;
30
- var createElementData = getInsertElementData(isHorizontal, editor.isDarkMode(), isRTL, editor.getDOMHelper().getDomStyle('backgroundColor') || 'white');
31
- var div = (0, createElement_1.createElement)(createElementData, document_1);
32
- if (isHorizontal) {
33
- // tableRect.left/right is used because the Inserter is always intended to be on the side
34
- div.id = exports.HORIZONTAL_INSERTER_ID;
35
- div.style.left = (isRTL
36
- ? tableRect.right
37
- : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)) + "px";
38
- div.style.top = tdRect.bottom - 8 + "px";
39
- div.firstChild.style.width = tableRect.right - tableRect.left + "px";
26
+ if (tdRect && viewPort) {
27
+ var isOutsideTop = tdRect.top <= viewPort.top;
28
+ var isOutsideBottom = tdRect.bottom >= viewPort.bottom;
29
+ if (isOutsideBottom || isOutsideTop) {
30
+ return null;
40
31
  }
41
- else {
42
- div.id = exports.VERTICAL_INSERTER_ID;
43
- div.style.left = (isRTL ? tdRect.left - 8 : tdRect.right - 8) + "px";
44
- // tableRect.top is used because the Inserter is always intended to be on top
45
- div.style.top = tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE) + "px";
46
- div.firstChild.style.height = tableRect.bottom - tableRect.top + "px";
32
+ var tableRect = table ? (0, getIntersectedRect_1.getIntersectedRect)([table], [viewPort]) : null;
33
+ // set inserter position
34
+ if (tableRect) {
35
+ var document_1 = td.ownerDocument;
36
+ var createElementData = getInsertElementData(isHorizontal, editor.isDarkMode(), isRTL, editor.getDOMHelper().getDomStyle('backgroundColor') || 'white');
37
+ var div = (0, createElement_1.createElement)(createElementData, document_1);
38
+ if (isHorizontal) {
39
+ // tableRect.left/right is used because the Inserter is always intended to be on the side
40
+ div.id = exports.HORIZONTAL_INSERTER_ID;
41
+ div.style.left = (isRTL
42
+ ? tableRect.right
43
+ : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)) + "px";
44
+ div.style.top = tdRect.bottom - 8 + "px";
45
+ div.firstChild.style.width = tableRect.right - tableRect.left + "px";
46
+ }
47
+ else {
48
+ div.id = exports.VERTICAL_INSERTER_ID;
49
+ div.style.left = (isRTL ? tdRect.left - 8 : tdRect.right - 8) + "px";
50
+ // tableRect.top is used because the Inserter is always intended to be on top
51
+ div.style.top = tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE) + "px";
52
+ div.firstChild.style.height = tableRect.bottom - tableRect.top + "px";
53
+ }
54
+ (anchorContainer || document_1.body).appendChild(div);
55
+ var handler = new TableInsertHandler(div, td, table, isHorizontal, editor, onBeforeInsert, onAfterInserted, onTableEditorCreated);
56
+ return { div: div, featureHandler: handler, node: td };
47
57
  }
48
- (anchorContainer || document_1.body).appendChild(div);
49
- var handler = new TableInsertHandler(div, td, table, isHorizontal, editor, onBeforeInsert, onAfterInserted, onTableEditorCreated);
50
- return { div: div, featureHandler: handler, node: td };
51
58
  }
52
59
  return null;
53
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TableInserter.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableInserter.ts"],"names":[],"mappings":"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","sourcesContent":["import { createElement } from '../../../pluginUtils/CreateElement/createElement';\nimport { getIntersectedRect } from '../../../pluginUtils/Rect/getIntersectedRect';\nimport { isElementOfType, normalizeRect } from 'roosterjs-content-model-dom';\nimport type { TableEditFeature } from './TableEditFeature';\nimport type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';\nimport {\n formatTableWithContentModel,\n insertTableColumn,\n insertTableRow,\n} from 'roosterjs-content-model-api';\nimport type { CreateElementData } from '../../../pluginUtils/CreateElement/CreateElementData';\nimport type { Disposable } from '../../../pluginUtils/Disposable';\nimport type { IEditor } from 'roosterjs-content-model-types';\n\nconst INSERTER_COLOR = '#4A4A4A';\nconst INSERTER_COLOR_DARK_MODE = 'white';\nconst INSERTER_SIDE_LENGTH = 12;\nconst INSERTER_BORDER_SIZE = 1;\n/**\n * @internal\n */\nexport const HORIZONTAL_INSERTER_ID = 'horizontalInserter';\n/**\n * @internal\n */\nexport const VERTICAL_INSERTER_ID = 'verticalInserter';\n\n/**\n * @internal\n */\nexport function createTableInserter(\n editor: IEditor,\n td: HTMLTableCellElement,\n table: HTMLTableElement,\n isRTL: boolean,\n isHorizontal: boolean,\n onBeforeInsert: () => void,\n onAfterInserted: () => void,\n anchorContainer?: HTMLElement,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n): TableEditFeature | null {\n const tdRect = normalizeRect(td.getBoundingClientRect());\n const viewPort = editor.getVisibleViewport();\n const tableRect = table && viewPort ? getIntersectedRect([table], [viewPort]) : null;\n\n // set inserter position\n if (tdRect && tableRect) {\n const document = td.ownerDocument;\n const createElementData = getInsertElementData(\n isHorizontal,\n editor.isDarkMode(),\n isRTL,\n editor.getDOMHelper().getDomStyle('backgroundColor') || 'white'\n );\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n if (isHorizontal) {\n // tableRect.left/right is used because the Inserter is always intended to be on the side\n div.id = HORIZONTAL_INSERTER_ID;\n div.style.left = `${\n isRTL\n ? tableRect.right\n : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n div.style.top = `${tdRect.bottom - 8}px`;\n (div.firstChild as HTMLElement).style.width = `${tableRect.right - tableRect.left}px`;\n } else {\n div.id = VERTICAL_INSERTER_ID;\n div.style.left = `${isRTL ? tdRect.left - 8 : tdRect.right - 8}px`;\n // tableRect.top is used because the Inserter is always intended to be on top\n div.style.top = `${\n tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n (div.firstChild as HTMLElement).style.height = `${tableRect.bottom - tableRect.top}px`;\n }\n\n (anchorContainer || document.body).appendChild(div);\n\n const handler = new TableInsertHandler(\n div,\n td,\n table,\n isHorizontal,\n editor,\n onBeforeInsert,\n onAfterInserted,\n onTableEditorCreated\n );\n\n return { div, featureHandler: handler, node: td };\n }\n\n return null;\n}\n\n/**\n * @internal\n * Exported for test only\n */\nexport class TableInsertHandler implements Disposable {\n private disposer: undefined | (() => void);\n constructor(\n private div: HTMLDivElement,\n private td: HTMLTableCellElement,\n private table: HTMLTableElement,\n private isHorizontal: boolean,\n private editor: IEditor,\n private onBeforeInsert: () => void,\n private onAfterInsert: () => void,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n ) {\n this.div.addEventListener('click', this.insertTd);\n this.disposer = onTableEditorCreated?.(\n isHorizontal ? 'HorizontalTableInserter' : 'VerticalTableInserter',\n div\n );\n }\n\n dispose() {\n this.div.removeEventListener('click', this.insertTd);\n this.disposer?.();\n this.disposer = undefined;\n }\n\n private insertTd = () => {\n // Get cell coordinates\n const columnIndex = this.td.cellIndex;\n const row =\n this.td.parentElement && isElementOfType(this.td.parentElement, 'tr')\n ? this.td.parentElement\n : undefined;\n const rowIndex = row && row.rowIndex;\n\n if (row?.cells == undefined || rowIndex == undefined) {\n return;\n }\n\n this.onBeforeInsert();\n\n // Insert row or column\n formatTableWithContentModel(\n this.editor,\n 'editTablePlugin',\n tableModel => {\n this.isHorizontal\n ? insertTableRow(tableModel, 'insertBelow')\n : insertTableColumn(tableModel, 'insertRight');\n }, // Select cell to make insertion\n {\n type: 'table',\n firstColumn: columnIndex,\n firstRow: rowIndex,\n lastColumn: columnIndex,\n lastRow: rowIndex,\n table: this.table,\n }\n );\n\n this.onAfterInsert();\n };\n}\n\nfunction getInsertElementData(\n isHorizontal: boolean,\n isDark: boolean,\n isRTL: boolean,\n backgroundColor: string\n): CreateElementData {\n const inserterColor = isDark ? INSERTER_COLOR_DARK_MODE : INSERTER_COLOR;\n const outerDivStyle = `position: fixed; width: ${INSERTER_SIDE_LENGTH}px; height: ${INSERTER_SIDE_LENGTH}px; font-size: 16px; color: black; line-height: 8px; vertical-align: middle; text-align: center; cursor: pointer; border: solid ${INSERTER_BORDER_SIZE}px ${inserterColor}; border-radius: 50%; background-color: ${backgroundColor}`;\n const leftOrRight = isRTL ? 'right' : 'left';\n const childBaseStyles = `position: absolute; box-sizing: border-box; background-color: ${backgroundColor};`;\n const childInfo: CreateElementData = {\n tag: 'div',\n style:\n childBaseStyles +\n (isHorizontal\n ? `${leftOrRight}: 12px; top: 5px; height: 3px; border-top: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-left: 0px;`\n : `left: 5px; top: 12px; width: 3px; border-left: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-top: 0px;`),\n };\n\n return {\n tag: 'div',\n style: outerDivStyle,\n children: [childInfo, '+'],\n };\n}\n"]}
1
+ {"version":3,"file":"TableInserter.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableInserter.ts"],"names":[],"mappings":"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","sourcesContent":["import { createElement } from '../../../pluginUtils/CreateElement/createElement';\nimport { getIntersectedRect } from '../../../pluginUtils/Rect/getIntersectedRect';\nimport { isElementOfType, normalizeRect } from 'roosterjs-content-model-dom';\nimport type { TableEditFeature } from './TableEditFeature';\nimport type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';\nimport {\n formatTableWithContentModel,\n insertTableColumn,\n insertTableRow,\n} from 'roosterjs-content-model-api';\nimport type { CreateElementData } from '../../../pluginUtils/CreateElement/CreateElementData';\nimport type { Disposable } from '../../../pluginUtils/Disposable';\nimport type { IEditor } from 'roosterjs-content-model-types';\n\nconst INSERTER_COLOR = '#4A4A4A';\nconst INSERTER_COLOR_DARK_MODE = 'white';\nconst INSERTER_SIDE_LENGTH = 12;\nconst INSERTER_BORDER_SIZE = 1;\n/**\n * @internal\n */\nexport const HORIZONTAL_INSERTER_ID = 'horizontalInserter';\n/**\n * @internal\n */\nexport const VERTICAL_INSERTER_ID = 'verticalInserter';\n\n/**\n * @internal\n */\nexport function createTableInserter(\n editor: IEditor,\n td: HTMLTableCellElement,\n table: HTMLTableElement,\n isRTL: boolean,\n isHorizontal: boolean,\n onBeforeInsert: () => void,\n onAfterInserted: () => void,\n anchorContainer?: HTMLElement,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n): TableEditFeature | null {\n const tdRect = normalizeRect(td.getBoundingClientRect());\n const viewPort = editor.getVisibleViewport();\n if (tdRect && viewPort) {\n const isOutsideTop = tdRect.top <= viewPort.top;\n const isOutsideBottom = tdRect.bottom >= viewPort.bottom;\n\n if (isOutsideBottom || isOutsideTop) {\n return null;\n }\n const tableRect = table ? getIntersectedRect([table], [viewPort]) : null;\n // set inserter position\n if (tableRect) {\n const document = td.ownerDocument;\n const createElementData = getInsertElementData(\n isHorizontal,\n editor.isDarkMode(),\n isRTL,\n editor.getDOMHelper().getDomStyle('backgroundColor') || 'white'\n );\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n if (isHorizontal) {\n // tableRect.left/right is used because the Inserter is always intended to be on the side\n div.id = HORIZONTAL_INSERTER_ID;\n div.style.left = `${\n isRTL\n ? tableRect.right\n : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n div.style.top = `${tdRect.bottom - 8}px`;\n (div.firstChild as HTMLElement).style.width = `${\n tableRect.right - tableRect.left\n }px`;\n } else {\n div.id = VERTICAL_INSERTER_ID;\n div.style.left = `${isRTL ? tdRect.left - 8 : tdRect.right - 8}px`;\n // tableRect.top is used because the Inserter is always intended to be on top\n div.style.top = `${\n tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n (div.firstChild as HTMLElement).style.height = `${\n tableRect.bottom - tableRect.top\n }px`;\n }\n\n (anchorContainer || document.body).appendChild(div);\n\n const handler = new TableInsertHandler(\n div,\n td,\n table,\n isHorizontal,\n editor,\n onBeforeInsert,\n onAfterInserted,\n onTableEditorCreated\n );\n\n return { div, featureHandler: handler, node: td };\n }\n }\n\n return null;\n}\n\n/**\n * @internal\n * Exported for test only\n */\nexport class TableInsertHandler implements Disposable {\n private disposer: undefined | (() => void);\n constructor(\n private div: HTMLDivElement,\n private td: HTMLTableCellElement,\n private table: HTMLTableElement,\n private isHorizontal: boolean,\n private editor: IEditor,\n private onBeforeInsert: () => void,\n private onAfterInsert: () => void,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n ) {\n this.div.addEventListener('click', this.insertTd);\n this.disposer = onTableEditorCreated?.(\n isHorizontal ? 'HorizontalTableInserter' : 'VerticalTableInserter',\n div\n );\n }\n\n dispose() {\n this.div.removeEventListener('click', this.insertTd);\n this.disposer?.();\n this.disposer = undefined;\n }\n\n private insertTd = () => {\n // Get cell coordinates\n const columnIndex = this.td.cellIndex;\n const row =\n this.td.parentElement && isElementOfType(this.td.parentElement, 'tr')\n ? this.td.parentElement\n : undefined;\n const rowIndex = row && row.rowIndex;\n\n if (row?.cells == undefined || rowIndex == undefined) {\n return;\n }\n\n this.onBeforeInsert();\n\n // Insert row or column\n formatTableWithContentModel(\n this.editor,\n 'editTablePlugin',\n tableModel => {\n this.isHorizontal\n ? insertTableRow(tableModel, 'insertBelow')\n : insertTableColumn(tableModel, 'insertRight');\n }, // Select cell to make insertion\n {\n type: 'table',\n firstColumn: columnIndex,\n firstRow: rowIndex,\n lastColumn: columnIndex,\n lastRow: rowIndex,\n table: this.table,\n }\n );\n\n this.onAfterInsert();\n };\n}\n\nfunction getInsertElementData(\n isHorizontal: boolean,\n isDark: boolean,\n isRTL: boolean,\n backgroundColor: string\n): CreateElementData {\n const inserterColor = isDark ? INSERTER_COLOR_DARK_MODE : INSERTER_COLOR;\n const outerDivStyle = `position: fixed; width: ${INSERTER_SIDE_LENGTH}px; height: ${INSERTER_SIDE_LENGTH}px; font-size: 16px; color: black; line-height: 8px; vertical-align: middle; text-align: center; cursor: pointer; border: solid ${INSERTER_BORDER_SIZE}px ${inserterColor}; border-radius: 50%; background-color: ${backgroundColor}`;\n const leftOrRight = isRTL ? 'right' : 'left';\n const childBaseStyles = `position: absolute; box-sizing: border-box; background-color: ${backgroundColor};`;\n const childInfo: CreateElementData = {\n tag: 'div',\n style:\n childBaseStyles +\n (isHorizontal\n ? `${leftOrRight}: 12px; top: 5px; height: 3px; border-top: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-left: 0px;`\n : `left: 5px; top: 12px; width: 3px; border-left: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-top: 0px;`),\n };\n\n return {\n tag: 'div',\n style: outerDivStyle,\n children: [childInfo, '+'],\n };\n}\n"]}
@@ -43,7 +43,7 @@ define(["require", "exports", "tslib", "roosterjs-content-model-dom"], function
43
43
  else {
44
44
  var removedBlocks = mutableList.blocks.splice(mutableList.blocks.indexOf(paragraph), mutableList.blocks.length);
45
45
  if (mutableList.levels.length > 1) {
46
- var newListItem = (0, roosterjs_content_model_dom_1.createListItem)(mutableList.levels.slice(0, -1), mutableList.format);
46
+ var newListItem = (0, roosterjs_content_model_dom_1.createListItem)(mutableList.levels.slice(0, -1), mutableList.formatHolder.format);
47
47
  newListItem.blocks = removedBlocks.map(function (block) { return (0, roosterjs_content_model_dom_1.mutateBlock)(block); });
48
48
  (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(listItemIndex + 1, 0, newListItem);
49
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deleteList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteList.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createListItem,\n getClosestAncestorBlockGroupIndex,\n mutateBlock,\n} from 'roosterjs-content-model-dom';\nimport type {\n DeleteSelectionStep,\n ContentModelListItem,\n ContentModelBlock,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const deleteList: DeleteSelectionStep = context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const { paragraph, marker, path } = context.insertPoint;\n const index = getClosestAncestorBlockGroupIndex<ContentModelListItem>(\n path,\n ['ListItem'],\n ['TableCell', 'FormatContainer']\n );\n const item = path[index];\n const parent = path[index + 1];\n\n if (\n item?.blockGroupType == 'ListItem' &&\n item.levels.length > 0 &&\n paragraph.segments[0] == marker &&\n parent\n ) {\n const mutableList = mutateBlock(item);\n const lastLevel = mutableList.levels[mutableList.levels.length - 1];\n const listItemIndex = parent.blocks.indexOf(item);\n const previousItem = parent.blocks[listItemIndex - 1];\n\n // 1. If the last level is dummy, just remove it (legacy behavior)\n // 2. If focus is at the beginning of list item and previous block is a list item with the same level count,\n // merge current list item into previous one\n // 3. Otherwise, split the list item. Keep the blocks before the paragraph in the current list item,\n // move the rest to a new list item (if there are multiple levels) or directly to parent (if only one level)\n if (lastLevel.format.displayForDummyItem == 'block') {\n mutableList.levels.pop();\n\n context.deleteResult = 'range';\n } else if (\n item.blocks[0] == paragraph &&\n previousItem?.blockType == 'BlockGroup' &&\n previousItem.blockGroupType == 'ListItem' &&\n previousItem.levels.length == mutableList.levels.length\n ) {\n const mutablePreviousItem = mutateBlock(previousItem);\n\n mutablePreviousItem.blocks.push(...mutableList.blocks);\n mutateBlock(parent).blocks.splice(listItemIndex, 1);\n\n context.deleteResult = 'range';\n } else {\n const removedBlocks = mutableList.blocks.splice(\n mutableList.blocks.indexOf(paragraph),\n mutableList.blocks.length\n );\n\n if (mutableList.levels.length > 1) {\n const newListItem = createListItem(\n mutableList.levels.slice(0, -1),\n mutableList.format\n );\n\n newListItem.blocks = removedBlocks.map(\n block => mutateBlock(block) as ContentModelBlock\n );\n\n mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, newListItem);\n } else {\n mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, ...removedBlocks);\n }\n\n context.deleteResult = 'range';\n }\n }\n};\n"]}
1
+ {"version":3,"file":"deleteList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteList.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createListItem,\n getClosestAncestorBlockGroupIndex,\n mutateBlock,\n} from 'roosterjs-content-model-dom';\nimport type {\n DeleteSelectionStep,\n ContentModelListItem,\n ContentModelBlock,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const deleteList: DeleteSelectionStep = context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const { paragraph, marker, path } = context.insertPoint;\n const index = getClosestAncestorBlockGroupIndex<ContentModelListItem>(\n path,\n ['ListItem'],\n ['TableCell', 'FormatContainer']\n );\n const item = path[index];\n const parent = path[index + 1];\n\n if (\n item?.blockGroupType == 'ListItem' &&\n item.levels.length > 0 &&\n paragraph.segments[0] == marker &&\n parent\n ) {\n const mutableList = mutateBlock(item);\n const lastLevel = mutableList.levels[mutableList.levels.length - 1];\n const listItemIndex = parent.blocks.indexOf(item);\n const previousItem = parent.blocks[listItemIndex - 1];\n\n // 1. If the last level is dummy, just remove it (legacy behavior)\n // 2. If focus is at the beginning of list item and previous block is a list item with the same level count,\n // merge current list item into previous one\n // 3. Otherwise, split the list item. Keep the blocks before the paragraph in the current list item,\n // move the rest to a new list item (if there are multiple levels) or directly to parent (if only one level)\n if (lastLevel.format.displayForDummyItem == 'block') {\n mutableList.levels.pop();\n\n context.deleteResult = 'range';\n } else if (\n item.blocks[0] == paragraph &&\n previousItem?.blockType == 'BlockGroup' &&\n previousItem.blockGroupType == 'ListItem' &&\n previousItem.levels.length == mutableList.levels.length\n ) {\n const mutablePreviousItem = mutateBlock(previousItem);\n\n mutablePreviousItem.blocks.push(...mutableList.blocks);\n mutateBlock(parent).blocks.splice(listItemIndex, 1);\n\n context.deleteResult = 'range';\n } else {\n const removedBlocks = mutableList.blocks.splice(\n mutableList.blocks.indexOf(paragraph),\n mutableList.blocks.length\n );\n\n if (mutableList.levels.length > 1) {\n const newListItem = createListItem(\n mutableList.levels.slice(0, -1),\n mutableList.formatHolder.format\n );\n\n newListItem.blocks = removedBlocks.map(\n block => mutateBlock(block) as ContentModelBlock\n );\n\n mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, newListItem);\n } else {\n mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, ...removedBlocks);\n }\n\n context.deleteResult = 'range';\n }\n }\n};\n"]}
@@ -20,31 +20,38 @@ define(["require", "exports", "../../../pluginUtils/CreateElement/createElement"
20
20
  function createTableInserter(editor, td, table, isRTL, isHorizontal, onBeforeInsert, onAfterInserted, anchorContainer, onTableEditorCreated) {
21
21
  var tdRect = (0, roosterjs_content_model_dom_1.normalizeRect)(td.getBoundingClientRect());
22
22
  var viewPort = editor.getVisibleViewport();
23
- var tableRect = table && viewPort ? (0, getIntersectedRect_1.getIntersectedRect)([table], [viewPort]) : null;
24
- // set inserter position
25
- if (tdRect && tableRect) {
26
- var document_1 = td.ownerDocument;
27
- var createElementData = getInsertElementData(isHorizontal, editor.isDarkMode(), isRTL, editor.getDOMHelper().getDomStyle('backgroundColor') || 'white');
28
- var div = (0, createElement_1.createElement)(createElementData, document_1);
29
- if (isHorizontal) {
30
- // tableRect.left/right is used because the Inserter is always intended to be on the side
31
- div.id = exports.HORIZONTAL_INSERTER_ID;
32
- div.style.left = (isRTL
33
- ? tableRect.right
34
- : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)) + "px";
35
- div.style.top = tdRect.bottom - 8 + "px";
36
- div.firstChild.style.width = tableRect.right - tableRect.left + "px";
23
+ if (tdRect && viewPort) {
24
+ var isOutsideTop = tdRect.top <= viewPort.top;
25
+ var isOutsideBottom = tdRect.bottom >= viewPort.bottom;
26
+ if (isOutsideBottom || isOutsideTop) {
27
+ return null;
37
28
  }
38
- else {
39
- div.id = exports.VERTICAL_INSERTER_ID;
40
- div.style.left = (isRTL ? tdRect.left - 8 : tdRect.right - 8) + "px";
41
- // tableRect.top is used because the Inserter is always intended to be on top
42
- div.style.top = tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE) + "px";
43
- div.firstChild.style.height = tableRect.bottom - tableRect.top + "px";
29
+ var tableRect = table ? (0, getIntersectedRect_1.getIntersectedRect)([table], [viewPort]) : null;
30
+ // set inserter position
31
+ if (tableRect) {
32
+ var document_1 = td.ownerDocument;
33
+ var createElementData = getInsertElementData(isHorizontal, editor.isDarkMode(), isRTL, editor.getDOMHelper().getDomStyle('backgroundColor') || 'white');
34
+ var div = (0, createElement_1.createElement)(createElementData, document_1);
35
+ if (isHorizontal) {
36
+ // tableRect.left/right is used because the Inserter is always intended to be on the side
37
+ div.id = exports.HORIZONTAL_INSERTER_ID;
38
+ div.style.left = (isRTL
39
+ ? tableRect.right
40
+ : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)) + "px";
41
+ div.style.top = tdRect.bottom - 8 + "px";
42
+ div.firstChild.style.width = tableRect.right - tableRect.left + "px";
43
+ }
44
+ else {
45
+ div.id = exports.VERTICAL_INSERTER_ID;
46
+ div.style.left = (isRTL ? tdRect.left - 8 : tdRect.right - 8) + "px";
47
+ // tableRect.top is used because the Inserter is always intended to be on top
48
+ div.style.top = tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE) + "px";
49
+ div.firstChild.style.height = tableRect.bottom - tableRect.top + "px";
50
+ }
51
+ (anchorContainer || document_1.body).appendChild(div);
52
+ var handler = new TableInsertHandler(div, td, table, isHorizontal, editor, onBeforeInsert, onAfterInserted, onTableEditorCreated);
53
+ return { div: div, featureHandler: handler, node: td };
44
54
  }
45
- (anchorContainer || document_1.body).appendChild(div);
46
- var handler = new TableInsertHandler(div, td, table, isHorizontal, editor, onBeforeInsert, onAfterInserted, onTableEditorCreated);
47
- return { div: div, featureHandler: handler, node: td };
48
55
  }
49
56
  return null;
50
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TableInserter.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableInserter.ts"],"names":[],"mappings":"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","sourcesContent":["import { createElement } from '../../../pluginUtils/CreateElement/createElement';\nimport { getIntersectedRect } from '../../../pluginUtils/Rect/getIntersectedRect';\nimport { isElementOfType, normalizeRect } from 'roosterjs-content-model-dom';\nimport type { TableEditFeature } from './TableEditFeature';\nimport type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';\nimport {\n formatTableWithContentModel,\n insertTableColumn,\n insertTableRow,\n} from 'roosterjs-content-model-api';\nimport type { CreateElementData } from '../../../pluginUtils/CreateElement/CreateElementData';\nimport type { Disposable } from '../../../pluginUtils/Disposable';\nimport type { IEditor } from 'roosterjs-content-model-types';\n\nconst INSERTER_COLOR = '#4A4A4A';\nconst INSERTER_COLOR_DARK_MODE = 'white';\nconst INSERTER_SIDE_LENGTH = 12;\nconst INSERTER_BORDER_SIZE = 1;\n/**\n * @internal\n */\nexport const HORIZONTAL_INSERTER_ID = 'horizontalInserter';\n/**\n * @internal\n */\nexport const VERTICAL_INSERTER_ID = 'verticalInserter';\n\n/**\n * @internal\n */\nexport function createTableInserter(\n editor: IEditor,\n td: HTMLTableCellElement,\n table: HTMLTableElement,\n isRTL: boolean,\n isHorizontal: boolean,\n onBeforeInsert: () => void,\n onAfterInserted: () => void,\n anchorContainer?: HTMLElement,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n): TableEditFeature | null {\n const tdRect = normalizeRect(td.getBoundingClientRect());\n const viewPort = editor.getVisibleViewport();\n const tableRect = table && viewPort ? getIntersectedRect([table], [viewPort]) : null;\n\n // set inserter position\n if (tdRect && tableRect) {\n const document = td.ownerDocument;\n const createElementData = getInsertElementData(\n isHorizontal,\n editor.isDarkMode(),\n isRTL,\n editor.getDOMHelper().getDomStyle('backgroundColor') || 'white'\n );\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n if (isHorizontal) {\n // tableRect.left/right is used because the Inserter is always intended to be on the side\n div.id = HORIZONTAL_INSERTER_ID;\n div.style.left = `${\n isRTL\n ? tableRect.right\n : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n div.style.top = `${tdRect.bottom - 8}px`;\n (div.firstChild as HTMLElement).style.width = `${tableRect.right - tableRect.left}px`;\n } else {\n div.id = VERTICAL_INSERTER_ID;\n div.style.left = `${isRTL ? tdRect.left - 8 : tdRect.right - 8}px`;\n // tableRect.top is used because the Inserter is always intended to be on top\n div.style.top = `${\n tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n (div.firstChild as HTMLElement).style.height = `${tableRect.bottom - tableRect.top}px`;\n }\n\n (anchorContainer || document.body).appendChild(div);\n\n const handler = new TableInsertHandler(\n div,\n td,\n table,\n isHorizontal,\n editor,\n onBeforeInsert,\n onAfterInserted,\n onTableEditorCreated\n );\n\n return { div, featureHandler: handler, node: td };\n }\n\n return null;\n}\n\n/**\n * @internal\n * Exported for test only\n */\nexport class TableInsertHandler implements Disposable {\n private disposer: undefined | (() => void);\n constructor(\n private div: HTMLDivElement,\n private td: HTMLTableCellElement,\n private table: HTMLTableElement,\n private isHorizontal: boolean,\n private editor: IEditor,\n private onBeforeInsert: () => void,\n private onAfterInsert: () => void,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n ) {\n this.div.addEventListener('click', this.insertTd);\n this.disposer = onTableEditorCreated?.(\n isHorizontal ? 'HorizontalTableInserter' : 'VerticalTableInserter',\n div\n );\n }\n\n dispose() {\n this.div.removeEventListener('click', this.insertTd);\n this.disposer?.();\n this.disposer = undefined;\n }\n\n private insertTd = () => {\n // Get cell coordinates\n const columnIndex = this.td.cellIndex;\n const row =\n this.td.parentElement && isElementOfType(this.td.parentElement, 'tr')\n ? this.td.parentElement\n : undefined;\n const rowIndex = row && row.rowIndex;\n\n if (row?.cells == undefined || rowIndex == undefined) {\n return;\n }\n\n this.onBeforeInsert();\n\n // Insert row or column\n formatTableWithContentModel(\n this.editor,\n 'editTablePlugin',\n tableModel => {\n this.isHorizontal\n ? insertTableRow(tableModel, 'insertBelow')\n : insertTableColumn(tableModel, 'insertRight');\n }, // Select cell to make insertion\n {\n type: 'table',\n firstColumn: columnIndex,\n firstRow: rowIndex,\n lastColumn: columnIndex,\n lastRow: rowIndex,\n table: this.table,\n }\n );\n\n this.onAfterInsert();\n };\n}\n\nfunction getInsertElementData(\n isHorizontal: boolean,\n isDark: boolean,\n isRTL: boolean,\n backgroundColor: string\n): CreateElementData {\n const inserterColor = isDark ? INSERTER_COLOR_DARK_MODE : INSERTER_COLOR;\n const outerDivStyle = `position: fixed; width: ${INSERTER_SIDE_LENGTH}px; height: ${INSERTER_SIDE_LENGTH}px; font-size: 16px; color: black; line-height: 8px; vertical-align: middle; text-align: center; cursor: pointer; border: solid ${INSERTER_BORDER_SIZE}px ${inserterColor}; border-radius: 50%; background-color: ${backgroundColor}`;\n const leftOrRight = isRTL ? 'right' : 'left';\n const childBaseStyles = `position: absolute; box-sizing: border-box; background-color: ${backgroundColor};`;\n const childInfo: CreateElementData = {\n tag: 'div',\n style:\n childBaseStyles +\n (isHorizontal\n ? `${leftOrRight}: 12px; top: 5px; height: 3px; border-top: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-left: 0px;`\n : `left: 5px; top: 12px; width: 3px; border-left: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-top: 0px;`),\n };\n\n return {\n tag: 'div',\n style: outerDivStyle,\n children: [childInfo, '+'],\n };\n}\n"]}
1
+ {"version":3,"file":"TableInserter.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableInserter.ts"],"names":[],"mappings":"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","sourcesContent":["import { createElement } from '../../../pluginUtils/CreateElement/createElement';\nimport { getIntersectedRect } from '../../../pluginUtils/Rect/getIntersectedRect';\nimport { isElementOfType, normalizeRect } from 'roosterjs-content-model-dom';\nimport type { TableEditFeature } from './TableEditFeature';\nimport type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';\nimport {\n formatTableWithContentModel,\n insertTableColumn,\n insertTableRow,\n} from 'roosterjs-content-model-api';\nimport type { CreateElementData } from '../../../pluginUtils/CreateElement/CreateElementData';\nimport type { Disposable } from '../../../pluginUtils/Disposable';\nimport type { IEditor } from 'roosterjs-content-model-types';\n\nconst INSERTER_COLOR = '#4A4A4A';\nconst INSERTER_COLOR_DARK_MODE = 'white';\nconst INSERTER_SIDE_LENGTH = 12;\nconst INSERTER_BORDER_SIZE = 1;\n/**\n * @internal\n */\nexport const HORIZONTAL_INSERTER_ID = 'horizontalInserter';\n/**\n * @internal\n */\nexport const VERTICAL_INSERTER_ID = 'verticalInserter';\n\n/**\n * @internal\n */\nexport function createTableInserter(\n editor: IEditor,\n td: HTMLTableCellElement,\n table: HTMLTableElement,\n isRTL: boolean,\n isHorizontal: boolean,\n onBeforeInsert: () => void,\n onAfterInserted: () => void,\n anchorContainer?: HTMLElement,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n): TableEditFeature | null {\n const tdRect = normalizeRect(td.getBoundingClientRect());\n const viewPort = editor.getVisibleViewport();\n if (tdRect && viewPort) {\n const isOutsideTop = tdRect.top <= viewPort.top;\n const isOutsideBottom = tdRect.bottom >= viewPort.bottom;\n\n if (isOutsideBottom || isOutsideTop) {\n return null;\n }\n const tableRect = table ? getIntersectedRect([table], [viewPort]) : null;\n // set inserter position\n if (tableRect) {\n const document = td.ownerDocument;\n const createElementData = getInsertElementData(\n isHorizontal,\n editor.isDarkMode(),\n isRTL,\n editor.getDOMHelper().getDomStyle('backgroundColor') || 'white'\n );\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n if (isHorizontal) {\n // tableRect.left/right is used because the Inserter is always intended to be on the side\n div.id = HORIZONTAL_INSERTER_ID;\n div.style.left = `${\n isRTL\n ? tableRect.right\n : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n div.style.top = `${tdRect.bottom - 8}px`;\n (div.firstChild as HTMLElement).style.width = `${\n tableRect.right - tableRect.left\n }px`;\n } else {\n div.id = VERTICAL_INSERTER_ID;\n div.style.left = `${isRTL ? tdRect.left - 8 : tdRect.right - 8}px`;\n // tableRect.top is used because the Inserter is always intended to be on top\n div.style.top = `${\n tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n (div.firstChild as HTMLElement).style.height = `${\n tableRect.bottom - tableRect.top\n }px`;\n }\n\n (anchorContainer || document.body).appendChild(div);\n\n const handler = new TableInsertHandler(\n div,\n td,\n table,\n isHorizontal,\n editor,\n onBeforeInsert,\n onAfterInserted,\n onTableEditorCreated\n );\n\n return { div, featureHandler: handler, node: td };\n }\n }\n\n return null;\n}\n\n/**\n * @internal\n * Exported for test only\n */\nexport class TableInsertHandler implements Disposable {\n private disposer: undefined | (() => void);\n constructor(\n private div: HTMLDivElement,\n private td: HTMLTableCellElement,\n private table: HTMLTableElement,\n private isHorizontal: boolean,\n private editor: IEditor,\n private onBeforeInsert: () => void,\n private onAfterInsert: () => void,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n ) {\n this.div.addEventListener('click', this.insertTd);\n this.disposer = onTableEditorCreated?.(\n isHorizontal ? 'HorizontalTableInserter' : 'VerticalTableInserter',\n div\n );\n }\n\n dispose() {\n this.div.removeEventListener('click', this.insertTd);\n this.disposer?.();\n this.disposer = undefined;\n }\n\n private insertTd = () => {\n // Get cell coordinates\n const columnIndex = this.td.cellIndex;\n const row =\n this.td.parentElement && isElementOfType(this.td.parentElement, 'tr')\n ? this.td.parentElement\n : undefined;\n const rowIndex = row && row.rowIndex;\n\n if (row?.cells == undefined || rowIndex == undefined) {\n return;\n }\n\n this.onBeforeInsert();\n\n // Insert row or column\n formatTableWithContentModel(\n this.editor,\n 'editTablePlugin',\n tableModel => {\n this.isHorizontal\n ? insertTableRow(tableModel, 'insertBelow')\n : insertTableColumn(tableModel, 'insertRight');\n }, // Select cell to make insertion\n {\n type: 'table',\n firstColumn: columnIndex,\n firstRow: rowIndex,\n lastColumn: columnIndex,\n lastRow: rowIndex,\n table: this.table,\n }\n );\n\n this.onAfterInsert();\n };\n}\n\nfunction getInsertElementData(\n isHorizontal: boolean,\n isDark: boolean,\n isRTL: boolean,\n backgroundColor: string\n): CreateElementData {\n const inserterColor = isDark ? INSERTER_COLOR_DARK_MODE : INSERTER_COLOR;\n const outerDivStyle = `position: fixed; width: ${INSERTER_SIDE_LENGTH}px; height: ${INSERTER_SIDE_LENGTH}px; font-size: 16px; color: black; line-height: 8px; vertical-align: middle; text-align: center; cursor: pointer; border: solid ${INSERTER_BORDER_SIZE}px ${inserterColor}; border-radius: 50%; background-color: ${backgroundColor}`;\n const leftOrRight = isRTL ? 'right' : 'left';\n const childBaseStyles = `position: absolute; box-sizing: border-box; background-color: ${backgroundColor};`;\n const childInfo: CreateElementData = {\n tag: 'div',\n style:\n childBaseStyles +\n (isHorizontal\n ? `${leftOrRight}: 12px; top: 5px; height: 3px; border-top: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-left: 0px;`\n : `left: 5px; top: 12px; width: 3px; border-left: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-top: 0px;`),\n };\n\n return {\n tag: 'div',\n style: outerDivStyle,\n children: [childInfo, '+'],\n };\n}\n"]}
@@ -41,7 +41,7 @@ export var deleteList = function (context) {
41
41
  else {
42
42
  var removedBlocks = mutableList.blocks.splice(mutableList.blocks.indexOf(paragraph), mutableList.blocks.length);
43
43
  if (mutableList.levels.length > 1) {
44
- var newListItem = createListItem(mutableList.levels.slice(0, -1), mutableList.format);
44
+ var newListItem = createListItem(mutableList.levels.slice(0, -1), mutableList.formatHolder.format);
45
45
  newListItem.blocks = removedBlocks.map(function (block) { return mutateBlock(block); });
46
46
  mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, newListItem);
47
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deleteList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteList.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createListItem,\n getClosestAncestorBlockGroupIndex,\n mutateBlock,\n} from 'roosterjs-content-model-dom';\nimport type {\n DeleteSelectionStep,\n ContentModelListItem,\n ContentModelBlock,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const deleteList: DeleteSelectionStep = context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const { paragraph, marker, path } = context.insertPoint;\n const index = getClosestAncestorBlockGroupIndex<ContentModelListItem>(\n path,\n ['ListItem'],\n ['TableCell', 'FormatContainer']\n );\n const item = path[index];\n const parent = path[index + 1];\n\n if (\n item?.blockGroupType == 'ListItem' &&\n item.levels.length > 0 &&\n paragraph.segments[0] == marker &&\n parent\n ) {\n const mutableList = mutateBlock(item);\n const lastLevel = mutableList.levels[mutableList.levels.length - 1];\n const listItemIndex = parent.blocks.indexOf(item);\n const previousItem = parent.blocks[listItemIndex - 1];\n\n // 1. If the last level is dummy, just remove it (legacy behavior)\n // 2. If focus is at the beginning of list item and previous block is a list item with the same level count,\n // merge current list item into previous one\n // 3. Otherwise, split the list item. Keep the blocks before the paragraph in the current list item,\n // move the rest to a new list item (if there are multiple levels) or directly to parent (if only one level)\n if (lastLevel.format.displayForDummyItem == 'block') {\n mutableList.levels.pop();\n\n context.deleteResult = 'range';\n } else if (\n item.blocks[0] == paragraph &&\n previousItem?.blockType == 'BlockGroup' &&\n previousItem.blockGroupType == 'ListItem' &&\n previousItem.levels.length == mutableList.levels.length\n ) {\n const mutablePreviousItem = mutateBlock(previousItem);\n\n mutablePreviousItem.blocks.push(...mutableList.blocks);\n mutateBlock(parent).blocks.splice(listItemIndex, 1);\n\n context.deleteResult = 'range';\n } else {\n const removedBlocks = mutableList.blocks.splice(\n mutableList.blocks.indexOf(paragraph),\n mutableList.blocks.length\n );\n\n if (mutableList.levels.length > 1) {\n const newListItem = createListItem(\n mutableList.levels.slice(0, -1),\n mutableList.format\n );\n\n newListItem.blocks = removedBlocks.map(\n block => mutateBlock(block) as ContentModelBlock\n );\n\n mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, newListItem);\n } else {\n mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, ...removedBlocks);\n }\n\n context.deleteResult = 'range';\n }\n }\n};\n"]}
1
+ {"version":3,"file":"deleteList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteList.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createListItem,\n getClosestAncestorBlockGroupIndex,\n mutateBlock,\n} from 'roosterjs-content-model-dom';\nimport type {\n DeleteSelectionStep,\n ContentModelListItem,\n ContentModelBlock,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const deleteList: DeleteSelectionStep = context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const { paragraph, marker, path } = context.insertPoint;\n const index = getClosestAncestorBlockGroupIndex<ContentModelListItem>(\n path,\n ['ListItem'],\n ['TableCell', 'FormatContainer']\n );\n const item = path[index];\n const parent = path[index + 1];\n\n if (\n item?.blockGroupType == 'ListItem' &&\n item.levels.length > 0 &&\n paragraph.segments[0] == marker &&\n parent\n ) {\n const mutableList = mutateBlock(item);\n const lastLevel = mutableList.levels[mutableList.levels.length - 1];\n const listItemIndex = parent.blocks.indexOf(item);\n const previousItem = parent.blocks[listItemIndex - 1];\n\n // 1. If the last level is dummy, just remove it (legacy behavior)\n // 2. If focus is at the beginning of list item and previous block is a list item with the same level count,\n // merge current list item into previous one\n // 3. Otherwise, split the list item. Keep the blocks before the paragraph in the current list item,\n // move the rest to a new list item (if there are multiple levels) or directly to parent (if only one level)\n if (lastLevel.format.displayForDummyItem == 'block') {\n mutableList.levels.pop();\n\n context.deleteResult = 'range';\n } else if (\n item.blocks[0] == paragraph &&\n previousItem?.blockType == 'BlockGroup' &&\n previousItem.blockGroupType == 'ListItem' &&\n previousItem.levels.length == mutableList.levels.length\n ) {\n const mutablePreviousItem = mutateBlock(previousItem);\n\n mutablePreviousItem.blocks.push(...mutableList.blocks);\n mutateBlock(parent).blocks.splice(listItemIndex, 1);\n\n context.deleteResult = 'range';\n } else {\n const removedBlocks = mutableList.blocks.splice(\n mutableList.blocks.indexOf(paragraph),\n mutableList.blocks.length\n );\n\n if (mutableList.levels.length > 1) {\n const newListItem = createListItem(\n mutableList.levels.slice(0, -1),\n mutableList.formatHolder.format\n );\n\n newListItem.blocks = removedBlocks.map(\n block => mutateBlock(block) as ContentModelBlock\n );\n\n mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, newListItem);\n } else {\n mutateBlock(parent).blocks.splice(listItemIndex + 1, 0, ...removedBlocks);\n }\n\n context.deleteResult = 'range';\n }\n }\n};\n"]}
@@ -20,31 +20,38 @@ export var VERTICAL_INSERTER_ID = 'verticalInserter';
20
20
  export function createTableInserter(editor, td, table, isRTL, isHorizontal, onBeforeInsert, onAfterInserted, anchorContainer, onTableEditorCreated) {
21
21
  var tdRect = normalizeRect(td.getBoundingClientRect());
22
22
  var viewPort = editor.getVisibleViewport();
23
- var tableRect = table && viewPort ? getIntersectedRect([table], [viewPort]) : null;
24
- // set inserter position
25
- if (tdRect && tableRect) {
26
- var document_1 = td.ownerDocument;
27
- var createElementData = getInsertElementData(isHorizontal, editor.isDarkMode(), isRTL, editor.getDOMHelper().getDomStyle('backgroundColor') || 'white');
28
- var div = createElement(createElementData, document_1);
29
- if (isHorizontal) {
30
- // tableRect.left/right is used because the Inserter is always intended to be on the side
31
- div.id = HORIZONTAL_INSERTER_ID;
32
- div.style.left = (isRTL
33
- ? tableRect.right
34
- : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)) + "px";
35
- div.style.top = tdRect.bottom - 8 + "px";
36
- div.firstChild.style.width = tableRect.right - tableRect.left + "px";
23
+ if (tdRect && viewPort) {
24
+ var isOutsideTop = tdRect.top <= viewPort.top;
25
+ var isOutsideBottom = tdRect.bottom >= viewPort.bottom;
26
+ if (isOutsideBottom || isOutsideTop) {
27
+ return null;
37
28
  }
38
- else {
39
- div.id = VERTICAL_INSERTER_ID;
40
- div.style.left = (isRTL ? tdRect.left - 8 : tdRect.right - 8) + "px";
41
- // tableRect.top is used because the Inserter is always intended to be on top
42
- div.style.top = tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE) + "px";
43
- div.firstChild.style.height = tableRect.bottom - tableRect.top + "px";
29
+ var tableRect = table ? getIntersectedRect([table], [viewPort]) : null;
30
+ // set inserter position
31
+ if (tableRect) {
32
+ var document_1 = td.ownerDocument;
33
+ var createElementData = getInsertElementData(isHorizontal, editor.isDarkMode(), isRTL, editor.getDOMHelper().getDomStyle('backgroundColor') || 'white');
34
+ var div = createElement(createElementData, document_1);
35
+ if (isHorizontal) {
36
+ // tableRect.left/right is used because the Inserter is always intended to be on the side
37
+ div.id = HORIZONTAL_INSERTER_ID;
38
+ div.style.left = (isRTL
39
+ ? tableRect.right
40
+ : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)) + "px";
41
+ div.style.top = tdRect.bottom - 8 + "px";
42
+ div.firstChild.style.width = tableRect.right - tableRect.left + "px";
43
+ }
44
+ else {
45
+ div.id = VERTICAL_INSERTER_ID;
46
+ div.style.left = (isRTL ? tdRect.left - 8 : tdRect.right - 8) + "px";
47
+ // tableRect.top is used because the Inserter is always intended to be on top
48
+ div.style.top = tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE) + "px";
49
+ div.firstChild.style.height = tableRect.bottom - tableRect.top + "px";
50
+ }
51
+ (anchorContainer || document_1.body).appendChild(div);
52
+ var handler = new TableInsertHandler(div, td, table, isHorizontal, editor, onBeforeInsert, onAfterInserted, onTableEditorCreated);
53
+ return { div: div, featureHandler: handler, node: td };
44
54
  }
45
- (anchorContainer || document_1.body).appendChild(div);
46
- var handler = new TableInsertHandler(div, td, table, isHorizontal, editor, onBeforeInsert, onAfterInserted, onTableEditorCreated);
47
- return { div: div, featureHandler: handler, node: td };
48
55
  }
49
56
  return null;
50
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TableInserter.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableInserter.ts"],"names":[],"mappings":"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","sourcesContent":["import { createElement } from '../../../pluginUtils/CreateElement/createElement';\nimport { getIntersectedRect } from '../../../pluginUtils/Rect/getIntersectedRect';\nimport { isElementOfType, normalizeRect } from 'roosterjs-content-model-dom';\nimport type { TableEditFeature } from './TableEditFeature';\nimport type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';\nimport {\n formatTableWithContentModel,\n insertTableColumn,\n insertTableRow,\n} from 'roosterjs-content-model-api';\nimport type { CreateElementData } from '../../../pluginUtils/CreateElement/CreateElementData';\nimport type { Disposable } from '../../../pluginUtils/Disposable';\nimport type { IEditor } from 'roosterjs-content-model-types';\n\nconst INSERTER_COLOR = '#4A4A4A';\nconst INSERTER_COLOR_DARK_MODE = 'white';\nconst INSERTER_SIDE_LENGTH = 12;\nconst INSERTER_BORDER_SIZE = 1;\n/**\n * @internal\n */\nexport const HORIZONTAL_INSERTER_ID = 'horizontalInserter';\n/**\n * @internal\n */\nexport const VERTICAL_INSERTER_ID = 'verticalInserter';\n\n/**\n * @internal\n */\nexport function createTableInserter(\n editor: IEditor,\n td: HTMLTableCellElement,\n table: HTMLTableElement,\n isRTL: boolean,\n isHorizontal: boolean,\n onBeforeInsert: () => void,\n onAfterInserted: () => void,\n anchorContainer?: HTMLElement,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n): TableEditFeature | null {\n const tdRect = normalizeRect(td.getBoundingClientRect());\n const viewPort = editor.getVisibleViewport();\n const tableRect = table && viewPort ? getIntersectedRect([table], [viewPort]) : null;\n\n // set inserter position\n if (tdRect && tableRect) {\n const document = td.ownerDocument;\n const createElementData = getInsertElementData(\n isHorizontal,\n editor.isDarkMode(),\n isRTL,\n editor.getDOMHelper().getDomStyle('backgroundColor') || 'white'\n );\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n if (isHorizontal) {\n // tableRect.left/right is used because the Inserter is always intended to be on the side\n div.id = HORIZONTAL_INSERTER_ID;\n div.style.left = `${\n isRTL\n ? tableRect.right\n : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n div.style.top = `${tdRect.bottom - 8}px`;\n (div.firstChild as HTMLElement).style.width = `${tableRect.right - tableRect.left}px`;\n } else {\n div.id = VERTICAL_INSERTER_ID;\n div.style.left = `${isRTL ? tdRect.left - 8 : tdRect.right - 8}px`;\n // tableRect.top is used because the Inserter is always intended to be on top\n div.style.top = `${\n tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n (div.firstChild as HTMLElement).style.height = `${tableRect.bottom - tableRect.top}px`;\n }\n\n (anchorContainer || document.body).appendChild(div);\n\n const handler = new TableInsertHandler(\n div,\n td,\n table,\n isHorizontal,\n editor,\n onBeforeInsert,\n onAfterInserted,\n onTableEditorCreated\n );\n\n return { div, featureHandler: handler, node: td };\n }\n\n return null;\n}\n\n/**\n * @internal\n * Exported for test only\n */\nexport class TableInsertHandler implements Disposable {\n private disposer: undefined | (() => void);\n constructor(\n private div: HTMLDivElement,\n private td: HTMLTableCellElement,\n private table: HTMLTableElement,\n private isHorizontal: boolean,\n private editor: IEditor,\n private onBeforeInsert: () => void,\n private onAfterInsert: () => void,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n ) {\n this.div.addEventListener('click', this.insertTd);\n this.disposer = onTableEditorCreated?.(\n isHorizontal ? 'HorizontalTableInserter' : 'VerticalTableInserter',\n div\n );\n }\n\n dispose() {\n this.div.removeEventListener('click', this.insertTd);\n this.disposer?.();\n this.disposer = undefined;\n }\n\n private insertTd = () => {\n // Get cell coordinates\n const columnIndex = this.td.cellIndex;\n const row =\n this.td.parentElement && isElementOfType(this.td.parentElement, 'tr')\n ? this.td.parentElement\n : undefined;\n const rowIndex = row && row.rowIndex;\n\n if (row?.cells == undefined || rowIndex == undefined) {\n return;\n }\n\n this.onBeforeInsert();\n\n // Insert row or column\n formatTableWithContentModel(\n this.editor,\n 'editTablePlugin',\n tableModel => {\n this.isHorizontal\n ? insertTableRow(tableModel, 'insertBelow')\n : insertTableColumn(tableModel, 'insertRight');\n }, // Select cell to make insertion\n {\n type: 'table',\n firstColumn: columnIndex,\n firstRow: rowIndex,\n lastColumn: columnIndex,\n lastRow: rowIndex,\n table: this.table,\n }\n );\n\n this.onAfterInsert();\n };\n}\n\nfunction getInsertElementData(\n isHorizontal: boolean,\n isDark: boolean,\n isRTL: boolean,\n backgroundColor: string\n): CreateElementData {\n const inserterColor = isDark ? INSERTER_COLOR_DARK_MODE : INSERTER_COLOR;\n const outerDivStyle = `position: fixed; width: ${INSERTER_SIDE_LENGTH}px; height: ${INSERTER_SIDE_LENGTH}px; font-size: 16px; color: black; line-height: 8px; vertical-align: middle; text-align: center; cursor: pointer; border: solid ${INSERTER_BORDER_SIZE}px ${inserterColor}; border-radius: 50%; background-color: ${backgroundColor}`;\n const leftOrRight = isRTL ? 'right' : 'left';\n const childBaseStyles = `position: absolute; box-sizing: border-box; background-color: ${backgroundColor};`;\n const childInfo: CreateElementData = {\n tag: 'div',\n style:\n childBaseStyles +\n (isHorizontal\n ? `${leftOrRight}: 12px; top: 5px; height: 3px; border-top: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-left: 0px;`\n : `left: 5px; top: 12px; width: 3px; border-left: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-top: 0px;`),\n };\n\n return {\n tag: 'div',\n style: outerDivStyle,\n children: [childInfo, '+'],\n };\n}\n"]}
1
+ {"version":3,"file":"TableInserter.js","sourceRoot":"","sources":["../../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableInserter.ts"],"names":[],"mappings":"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","sourcesContent":["import { createElement } from '../../../pluginUtils/CreateElement/createElement';\nimport { getIntersectedRect } from '../../../pluginUtils/Rect/getIntersectedRect';\nimport { isElementOfType, normalizeRect } from 'roosterjs-content-model-dom';\nimport type { TableEditFeature } from './TableEditFeature';\nimport type { OnTableEditorCreatedCallback } from '../../OnTableEditorCreatedCallback';\nimport {\n formatTableWithContentModel,\n insertTableColumn,\n insertTableRow,\n} from 'roosterjs-content-model-api';\nimport type { CreateElementData } from '../../../pluginUtils/CreateElement/CreateElementData';\nimport type { Disposable } from '../../../pluginUtils/Disposable';\nimport type { IEditor } from 'roosterjs-content-model-types';\n\nconst INSERTER_COLOR = '#4A4A4A';\nconst INSERTER_COLOR_DARK_MODE = 'white';\nconst INSERTER_SIDE_LENGTH = 12;\nconst INSERTER_BORDER_SIZE = 1;\n/**\n * @internal\n */\nexport const HORIZONTAL_INSERTER_ID = 'horizontalInserter';\n/**\n * @internal\n */\nexport const VERTICAL_INSERTER_ID = 'verticalInserter';\n\n/**\n * @internal\n */\nexport function createTableInserter(\n editor: IEditor,\n td: HTMLTableCellElement,\n table: HTMLTableElement,\n isRTL: boolean,\n isHorizontal: boolean,\n onBeforeInsert: () => void,\n onAfterInserted: () => void,\n anchorContainer?: HTMLElement,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n): TableEditFeature | null {\n const tdRect = normalizeRect(td.getBoundingClientRect());\n const viewPort = editor.getVisibleViewport();\n if (tdRect && viewPort) {\n const isOutsideTop = tdRect.top <= viewPort.top;\n const isOutsideBottom = tdRect.bottom >= viewPort.bottom;\n\n if (isOutsideBottom || isOutsideTop) {\n return null;\n }\n const tableRect = table ? getIntersectedRect([table], [viewPort]) : null;\n // set inserter position\n if (tableRect) {\n const document = td.ownerDocument;\n const createElementData = getInsertElementData(\n isHorizontal,\n editor.isDarkMode(),\n isRTL,\n editor.getDOMHelper().getDomStyle('backgroundColor') || 'white'\n );\n\n const div = createElement(createElementData, document) as HTMLDivElement;\n\n if (isHorizontal) {\n // tableRect.left/right is used because the Inserter is always intended to be on the side\n div.id = HORIZONTAL_INSERTER_ID;\n div.style.left = `${\n isRTL\n ? tableRect.right\n : tableRect.left - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n div.style.top = `${tdRect.bottom - 8}px`;\n (div.firstChild as HTMLElement).style.width = `${\n tableRect.right - tableRect.left\n }px`;\n } else {\n div.id = VERTICAL_INSERTER_ID;\n div.style.left = `${isRTL ? tdRect.left - 8 : tdRect.right - 8}px`;\n // tableRect.top is used because the Inserter is always intended to be on top\n div.style.top = `${\n tableRect.top - (INSERTER_SIDE_LENGTH - 1 + 2 * INSERTER_BORDER_SIZE)\n }px`;\n (div.firstChild as HTMLElement).style.height = `${\n tableRect.bottom - tableRect.top\n }px`;\n }\n\n (anchorContainer || document.body).appendChild(div);\n\n const handler = new TableInsertHandler(\n div,\n td,\n table,\n isHorizontal,\n editor,\n onBeforeInsert,\n onAfterInserted,\n onTableEditorCreated\n );\n\n return { div, featureHandler: handler, node: td };\n }\n }\n\n return null;\n}\n\n/**\n * @internal\n * Exported for test only\n */\nexport class TableInsertHandler implements Disposable {\n private disposer: undefined | (() => void);\n constructor(\n private div: HTMLDivElement,\n private td: HTMLTableCellElement,\n private table: HTMLTableElement,\n private isHorizontal: boolean,\n private editor: IEditor,\n private onBeforeInsert: () => void,\n private onAfterInsert: () => void,\n onTableEditorCreated?: OnTableEditorCreatedCallback\n ) {\n this.div.addEventListener('click', this.insertTd);\n this.disposer = onTableEditorCreated?.(\n isHorizontal ? 'HorizontalTableInserter' : 'VerticalTableInserter',\n div\n );\n }\n\n dispose() {\n this.div.removeEventListener('click', this.insertTd);\n this.disposer?.();\n this.disposer = undefined;\n }\n\n private insertTd = () => {\n // Get cell coordinates\n const columnIndex = this.td.cellIndex;\n const row =\n this.td.parentElement && isElementOfType(this.td.parentElement, 'tr')\n ? this.td.parentElement\n : undefined;\n const rowIndex = row && row.rowIndex;\n\n if (row?.cells == undefined || rowIndex == undefined) {\n return;\n }\n\n this.onBeforeInsert();\n\n // Insert row or column\n formatTableWithContentModel(\n this.editor,\n 'editTablePlugin',\n tableModel => {\n this.isHorizontal\n ? insertTableRow(tableModel, 'insertBelow')\n : insertTableColumn(tableModel, 'insertRight');\n }, // Select cell to make insertion\n {\n type: 'table',\n firstColumn: columnIndex,\n firstRow: rowIndex,\n lastColumn: columnIndex,\n lastRow: rowIndex,\n table: this.table,\n }\n );\n\n this.onAfterInsert();\n };\n}\n\nfunction getInsertElementData(\n isHorizontal: boolean,\n isDark: boolean,\n isRTL: boolean,\n backgroundColor: string\n): CreateElementData {\n const inserterColor = isDark ? INSERTER_COLOR_DARK_MODE : INSERTER_COLOR;\n const outerDivStyle = `position: fixed; width: ${INSERTER_SIDE_LENGTH}px; height: ${INSERTER_SIDE_LENGTH}px; font-size: 16px; color: black; line-height: 8px; vertical-align: middle; text-align: center; cursor: pointer; border: solid ${INSERTER_BORDER_SIZE}px ${inserterColor}; border-radius: 50%; background-color: ${backgroundColor}`;\n const leftOrRight = isRTL ? 'right' : 'left';\n const childBaseStyles = `position: absolute; box-sizing: border-box; background-color: ${backgroundColor};`;\n const childInfo: CreateElementData = {\n tag: 'div',\n style:\n childBaseStyles +\n (isHorizontal\n ? `${leftOrRight}: 12px; top: 5px; height: 3px; border-top: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-left: 0px;`\n : `left: 5px; top: 12px; width: 3px; border-left: 1px solid ${inserterColor}; border-right: 1px solid ${inserterColor}; border-bottom: 1px solid ${inserterColor}; border-top: 0px;`),\n };\n\n return {\n tag: 'div',\n style: outerDivStyle,\n children: [childInfo, '+'],\n };\n}\n"]}
package/package.json CHANGED
@@ -3,18 +3,18 @@
3
3
  "description": "Plugins for roosterjs",
4
4
  "dependencies": {
5
5
  "tslib": "^2.3.1",
6
- "roosterjs-content-model-core": "^9.45.1",
7
- "roosterjs-content-model-dom": "^9.45.1",
8
- "roosterjs-content-model-types": "^9.45.1",
9
- "roosterjs-content-model-api": "^9.45.1"
6
+ "roosterjs-content-model-core": "^9.45.2",
7
+ "roosterjs-content-model-dom": "^9.45.2",
8
+ "roosterjs-content-model-types": "^9.45.2",
9
+ "roosterjs-content-model-api": "^9.45.2"
10
10
  },
11
- "version": "9.45.1",
11
+ "version": "9.45.2",
12
12
  "main": "./lib/index.js",
13
13
  "typings": "./lib/index.d.ts",
14
14
  "module": "./lib-mjs/index.js",
15
15
  "license": "MIT",
16
16
  "repository": {
17
17
  "type": "git",
18
- "url": "git+https://github.com/Microsoft/roosterjs.git"
18
+ "url": "https://github.com/Microsoft/roosterjs"
19
19
  }
20
20
  }