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.
- package/lib/edit/deleteSteps/deleteList.js +1 -1
- package/lib/edit/deleteSteps/deleteList.js.map +1 -1
- package/lib/tableEdit/editors/features/TableInserter.js +30 -23
- package/lib/tableEdit/editors/features/TableInserter.js.map +1 -1
- package/lib-amd/edit/deleteSteps/deleteList.js +1 -1
- package/lib-amd/edit/deleteSteps/deleteList.js.map +1 -1
- package/lib-amd/tableEdit/editors/features/TableInserter.js +30 -23
- package/lib-amd/tableEdit/editors/features/TableInserter.js.map +1 -1
- package/lib-mjs/edit/deleteSteps/deleteList.js +1 -1
- package/lib-mjs/edit/deleteSteps/deleteList.js.map +1 -1
- package/lib-mjs/tableEdit/editors/features/TableInserter.js +30 -23
- package/lib-mjs/tableEdit/editors/features/TableInserter.js.map +1 -1
- package/package.json +6 -6
|
@@ -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":";;;;AAAA,2EAIqC;AAOrC;;GAEG;AACI,IAAM,UAAU,GAAwB,UAAA,OAAO;;IAClD,IAAI,OAAO,CAAC,YAAY,IAAI,YAAY,EAAE;QACtC,OAAO;KACV;IAEK,IAAA,KAA8B,OAAO,CAAC,WAAW,EAA/C,SAAS,eAAA,EAAE,MAAM,YAAA,EAAE,IAAI,UAAwB,CAAC;IACxD,IAAM,KAAK,GAAG,IAAA,+DAAiC,EAC3C,IAAI,EACJ,CAAC,UAAU,CAAC,EACZ,CAAC,WAAW,EAAE,iBAAiB,CAAC,CACnC,CAAC;IACF,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,IAAM,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAE/B,IACI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,cAAc,KAAI,UAAU;QAClC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QACtB,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM;QAC/B,MAAM,EACR;QACE,IAAM,WAAW,GAAG,IAAA,yCAAW,EAAC,IAAI,CAAC,CAAC;QACtC,IAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpE,IAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClD,IAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;QAEtD,kEAAkE;QAClE,4GAA4G;QAC5G,+CAA+C;QAC/C,oGAAoG;QACpG,+GAA+G;QAC/G,IAAI,SAAS,CAAC,MAAM,CAAC,mBAAmB,IAAI,OAAO,EAAE;YACjD,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAEzB,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;SAClC;aAAM,IACH,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS;YAC3B,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,SAAS,KAAI,YAAY;YACvC,YAAY,CAAC,cAAc,IAAI,UAAU;YACzC,YAAY,CAAC,MAAM,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,EACzD;YACE,IAAM,mBAAmB,GAAG,IAAA,yCAAW,EAAC,YAAY,CAAC,CAAC;YAEtD,CAAA,KAAA,mBAAmB,CAAC,MAAM,CAAA,CAAC,IAAI,8DAAI,WAAW,CAAC,MAAM,WAAE;YACvD,IAAA,yCAAW,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YAEpD,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;SAClC;aAAM;YACH,IAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAC3C,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EACrC,WAAW,CAAC,MAAM,CAAC,MAAM,CAC5B,CAAC;YAEF,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/B,IAAM,WAAW,GAAG,IAAA,4CAAc,EAC9B,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAC/B,WAAW,CAAC,MAAM,
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
div
|
|
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":";;;;IAWA;;OAEG;IACI,IAAM,UAAU,GAAwB,UAAA,OAAO;;QAClD,IAAI,OAAO,CAAC,YAAY,IAAI,YAAY,EAAE;YACtC,OAAO;SACV;QAEK,IAAA,KAA8B,OAAO,CAAC,WAAW,EAA/C,SAAS,eAAA,EAAE,MAAM,YAAA,EAAE,IAAI,UAAwB,CAAC;QACxD,IAAM,KAAK,GAAG,IAAA,+DAAiC,EAC3C,IAAI,EACJ,CAAC,UAAU,CAAC,EACZ,CAAC,WAAW,EAAE,iBAAiB,CAAC,CACnC,CAAC;QACF,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAM,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAE/B,IACI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,cAAc,KAAI,UAAU;YAClC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YACtB,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM;YAC/B,MAAM,EACR;YACE,IAAM,WAAW,GAAG,IAAA,yCAAW,EAAC,IAAI,CAAC,CAAC;YACtC,IAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpE,IAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClD,IAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YAEtD,kEAAkE;YAClE,4GAA4G;YAC5G,+CAA+C;YAC/C,oGAAoG;YACpG,+GAA+G;YAC/G,IAAI,SAAS,CAAC,MAAM,CAAC,mBAAmB,IAAI,OAAO,EAAE;gBACjD,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAEzB,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;aAClC;iBAAM,IACH,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS;gBAC3B,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,SAAS,KAAI,YAAY;gBACvC,YAAY,CAAC,cAAc,IAAI,UAAU;gBACzC,YAAY,CAAC,MAAM,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,EACzD;gBACE,IAAM,mBAAmB,GAAG,IAAA,yCAAW,EAAC,YAAY,CAAC,CAAC;gBAEtD,CAAA,KAAA,mBAAmB,CAAC,MAAM,CAAA,CAAC,IAAI,8DAAI,WAAW,CAAC,MAAM,WAAE;gBACvD,IAAA,yCAAW,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;gBAEpD,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;aAClC;iBAAM;gBACH,IAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAC3C,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EACrC,WAAW,CAAC,MAAM,CAAC,MAAM,CAC5B,CAAC;gBAEF,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC/B,IAAM,WAAW,GAAG,IAAA,4CAAc,EAC9B,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAC/B,WAAW,CAAC,MAAM,
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
div
|
|
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":";AAAA,OAAO,EACH,cAAc,EACd,iCAAiC,EACjC,WAAW,GACd,MAAM,6BAA6B,CAAC;AAOrC;;GAEG;AACH,MAAM,CAAC,IAAM,UAAU,GAAwB,UAAA,OAAO;;IAClD,IAAI,OAAO,CAAC,YAAY,IAAI,YAAY,EAAE;QACtC,OAAO;KACV;IAEK,IAAA,KAA8B,OAAO,CAAC,WAAW,EAA/C,SAAS,eAAA,EAAE,MAAM,YAAA,EAAE,IAAI,UAAwB,CAAC;IACxD,IAAM,KAAK,GAAG,iCAAiC,CAC3C,IAAI,EACJ,CAAC,UAAU,CAAC,EACZ,CAAC,WAAW,EAAE,iBAAiB,CAAC,CACnC,CAAC;IACF,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,IAAM,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAE/B,IACI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,cAAc,KAAI,UAAU;QAClC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QACtB,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM;QAC/B,MAAM,EACR;QACE,IAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,IAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpE,IAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClD,IAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;QAEtD,kEAAkE;QAClE,4GAA4G;QAC5G,+CAA+C;QAC/C,oGAAoG;QACpG,+GAA+G;QAC/G,IAAI,SAAS,CAAC,MAAM,CAAC,mBAAmB,IAAI,OAAO,EAAE;YACjD,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAEzB,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;SAClC;aAAM,IACH,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS;YAC3B,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,SAAS,KAAI,YAAY;YACvC,YAAY,CAAC,cAAc,IAAI,UAAU;YACzC,YAAY,CAAC,MAAM,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,EACzD;YACE,IAAM,mBAAmB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YAEtD,CAAA,KAAA,mBAAmB,CAAC,MAAM,CAAA,CAAC,IAAI,oCAAI,WAAW,CAAC,MAAM,WAAE;YACvD,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YAEpD,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;SAClC;aAAM;YACH,IAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAC3C,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EACrC,WAAW,CAAC,MAAM,CAAC,MAAM,CAC5B,CAAC;YAEF,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/B,IAAM,WAAW,GAAG,cAAc,CAC9B,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAC/B,WAAW,CAAC,MAAM,
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
div
|
|
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.
|
|
7
|
-
"roosterjs-content-model-dom": "^9.45.
|
|
8
|
-
"roosterjs-content-model-types": "^9.45.
|
|
9
|
-
"roosterjs-content-model-api": "^9.45.
|
|
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.
|
|
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": "
|
|
18
|
+
"url": "https://github.com/Microsoft/roosterjs"
|
|
19
19
|
}
|
|
20
20
|
}
|