Skip to content

Commit 8358b74

Browse files
authored
Merge branch 'master' into u/jisong/darkcolorimprovement
2 parents 666baa4 + 3223063 commit 8358b74

19 files changed

Lines changed: 1977 additions & 267 deletions

File tree

karma.fast.conf.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
const argv = require('minimist')(process.argv.slice(2));
22
const components = argv.components !== true && argv.components;
3+
const testPathPattern = argv.testPathPattern !== true && argv.testPathPattern;
4+
const testNamePattern = argv.testNamePattern !== true && argv.testNamePattern;
35
const runCoverage = typeof argv.coverage !== 'undefined';
46
const runFirefox = typeof argv.firefox !== 'undefined';
57
const runChrome = typeof argv.chrome !== 'undefined';
@@ -69,8 +71,13 @@ module.exports = function (config) {
6971
plugins,
7072
client: {
7173
components: components,
74+
testPathPattern: testPathPattern,
75+
testNamePattern: testNamePattern,
7276
clearContext: false,
7377
captureConsole: true,
78+
jasmine: {
79+
grep: testNamePattern || null,
80+
},
7481
},
7582
browsers: launcher,
7683
files: ['tools/karma.test.all.js'],

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
"typedoc-plugin-remove-references": "0.0.5",
8484
"typescript": "4.4.4",
8585
"url-loader": "4.1.0",
86-
"webpack": "5.94.0",
86+
"webpack": "5.104.1",
8787
"webpack-cli": "3.3.11",
8888
"webpack-dev-server": "3.10.3"
8989
},
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import {
2+
createTableCell,
3+
createTableRow,
4+
trimModelForSelection,
5+
} from 'roosterjs-content-model-dom';
6+
import type {
7+
ContentModelBlock,
8+
ContentModelTable,
9+
ContentModelTableCellFormat,
10+
IEditor,
11+
ReadonlyContentModelTable,
12+
} from 'roosterjs-content-model-types';
13+
14+
/**
15+
* @internal
16+
*/
17+
export function getSelectedContentForTable(editor: IEditor): ContentModelBlock[][] {
18+
const selectedRows: ContentModelBlock[][] = [];
19+
const selection = editor.getDOMSelection();
20+
if (selection && (selection?.type !== 'range' || !selection.range.collapsed)) {
21+
const selectedModel = editor.getContentModelCopy('disconnected');
22+
trimModelForSelection(selectedModel, selection);
23+
24+
for (const block of selectedModel.blocks) {
25+
if (block.blockType === 'Table') {
26+
extractTableCellsContent(block, selectedRows);
27+
} else {
28+
selectedRows.push([block as ContentModelBlock]);
29+
}
30+
}
31+
}
32+
33+
return selectedRows;
34+
}
35+
36+
function extractTableCellsContent(
37+
table: ReadonlyContentModelTable,
38+
selectedRows: ContentModelBlock[][]
39+
) {
40+
for (const row of table.rows) {
41+
const rowBlocks: ContentModelBlock[] = [];
42+
for (const cell of row.cells) {
43+
if (!cell.spanLeft && !cell.spanAbove) {
44+
rowBlocks.push(...(cell.blocks as ContentModelBlock[]));
45+
}
46+
}
47+
if (rowBlocks.length > 0) {
48+
selectedRows.push(rowBlocks);
49+
}
50+
}
51+
}
52+
53+
/**
54+
* @internal
55+
*/
56+
export function insertTableContent(
57+
table: ContentModelTable,
58+
contentRows: ContentModelBlock[][],
59+
colNumber: number,
60+
customCellFormat?: ContentModelTableCellFormat
61+
) {
62+
let rowIndex = 0;
63+
for (const rowBlocks of contentRows) {
64+
if (!table.rows[rowIndex]) {
65+
const row = createTableRow();
66+
for (let i = 0; i < colNumber; i++) {
67+
const cell = createTableCell(
68+
undefined /*spanLeftOrColSpan */,
69+
undefined /*spanAboveOrRowSpan */,
70+
undefined /* isHeader */,
71+
customCellFormat
72+
);
73+
row.cells.push(cell);
74+
}
75+
table.rows.push(row);
76+
}
77+
78+
let cellIndex = 0;
79+
for (const block of rowBlocks) {
80+
if (cellIndex < table.rows[rowIndex].cells.length) {
81+
table.rows[rowIndex].cells[cellIndex].blocks = [block];
82+
}
83+
cellIndex++;
84+
}
85+
rowIndex++;
86+
}
87+
}

packages/roosterjs-content-model-api/lib/publicApi/table/insertTable.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { adjustTableIndentation } from '../../modelApi/common/adjustIndentation';
22
import { createTableStructure } from '../../modelApi/table/createTableStructure';
3+
import { getSelectedContentForTable, insertTableContent } from '../../modelApi/table/tableContent';
34
import {
45
createContentModelDocument,
56
createSelectionMarker,
@@ -38,25 +39,33 @@ export function insertTable(
3839
) {
3940
editor.focus();
4041

42+
const blocks = getSelectedContentForTable(editor);
43+
4144
editor.formatContentModel(
4245
(model, context) => {
43-
const insertPosition = deleteSelection(model, [], context).insertPoint;
46+
const deleteSelectionResult = deleteSelection(model, [], context);
47+
const insertPosition = deleteSelectionResult.insertPoint;
4448

4549
if (insertPosition) {
4650
const doc = createContentModelDocument();
51+
4752
const table = createTableStructure(doc, columns, rows, customCellFormat);
53+
4854
if (format) {
4955
table.format = { ...format };
5056
}
5157

5258
normalizeTable(table, editor.getPendingFormat() || insertPosition.marker.format);
5359
initCellWidth(table);
5460

61+
insertTableContent(table, blocks, columns, customCellFormat);
62+
5563
adjustTableIndentation(insertPosition, table);
5664

5765
// Assign default vertical align
5866
tableMetadataFormat = tableMetadataFormat || { verticalAlign: 'top' };
5967
applyTableFormat(table, tableMetadataFormat);
68+
6069
mergeModel(model, doc, context, {
6170
insertPosition,
6271
mergeFormat: 'mergeAll',

0 commit comments

Comments
 (0)