roosterjs 9.25.0 → 9.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/rooster.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- // Type definitions for roosterjs (Version 9.25.0)
1
+ // Type definitions for roosterjs (Version 9.26.0)
2
2
  // Generated by dts tool from roosterjs
3
3
  // Project: https://github.com/Microsoft/roosterjs
4
4
 
@@ -2828,7 +2828,7 @@ interface EditorContext {
2828
2828
  /**
2829
2829
  * When set to true, size of table will be recalculated when converting from DOM to Content Model.
2830
2830
  */
2831
- recalculateTableSize?: boolean;
2831
+ recalculateTableSize?: boolean | 'all' | 'selected' | 'none';
2832
2832
  }
2833
2833
 
2834
2834
  /**
@@ -3087,7 +3087,16 @@ interface DomToModelOptionForCreateModel extends DomToModelOption {
3087
3087
  /**
3088
3088
  * When set to true, it will try to reuse cached content model if any
3089
3089
  */
3090
- tryGetFromCache: boolean;
3090
+ tryGetFromCache?: boolean;
3091
+ /**
3092
+ * Whether recalculate table size when parse table
3093
+ * 'all' or true means recalculate all tables in the model
3094
+ * 'selected' means recalculate only selected tables in the model
3095
+ * 'none' or false means do not recalculate any table in the model
3096
+ *
3097
+ * When this option is passed, "tryGetFromCache" will be ignored.
3098
+ */
3099
+ recalculateTableSize?: boolean | 'all' | 'selected' | 'none';
3091
3100
  }
3092
3101
 
3093
3102
  /**
package/dist/rooster.js CHANGED
@@ -4302,16 +4302,18 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
4302
4302
  function clearSelectedCells(table, sel) {
4303
4303
  if (sel.firstColumn >= 0 &&
4304
4304
  sel.firstRow >= 0 &&
4305
- sel.lastColumn < table.widths.length &&
4306
- sel.lastRow < table.rows.length) {
4305
+ sel.lastRow < table.rows.length &&
4306
+ sel.lastColumn < table.rows[sel.lastRow].cells.length) {
4307
4307
  for (var i = sel.firstRow; i <= sel.lastRow; i++) {
4308
4308
  var row = table.rows[i];
4309
4309
  for (var j = sel.firstColumn; j <= sel.lastColumn; j++) {
4310
4310
  var cell = row.cells[j];
4311
- if (cell.isSelected) {
4312
- (0, roosterjs_content_model_dom_1.mutateBlock)(cell).isSelected = false;
4311
+ if (cell) {
4312
+ if (cell.isSelected) {
4313
+ (0, roosterjs_content_model_dom_1.mutateBlock)(cell).isSelected = false;
4314
+ }
4315
+ (0, roosterjs_content_model_dom_1.setSelection)(cell);
4313
4316
  }
4314
- (0, roosterjs_content_model_dom_1.setSelection)(cell);
4315
4317
  }
4316
4318
  }
4317
4319
  }
@@ -4753,7 +4755,9 @@ function splitTableCellHorizontally(table) {
4753
4755
  table.rows.forEach(function (row, rowIndex) {
4754
4756
  var cell = row.cells[colIndex];
4755
4757
  if (cell) {
4756
- var newCell = (0, roosterjs_content_model_dom_1.createTableCell)(cell.spanLeft, cell.spanAbove, cell.isHeader, cell.format);
4758
+ var mutableCell = (0, roosterjs_content_model_dom_1.mutateBlock)(cell);
4759
+ delete mutableCell.format.width;
4760
+ var newCell = (0, roosterjs_content_model_dom_1.createTableCell)(cell.spanLeft, cell.spanAbove, cell.isHeader, mutableCell.format);
4757
4761
  newCell.dataset = (0, tslib_1.__assign)({}, cell.dataset);
4758
4762
  if (rowIndex < sel.firstRow || rowIndex > sel.lastRow) {
4759
4763
  newCell.spanLeft = true;
@@ -4819,7 +4823,9 @@ function splitTableCellVertically(table) {
4819
4823
  format: (0, tslib_1.__assign)({}, row.format),
4820
4824
  height: newHeight,
4821
4825
  cells: row.cells.map(function (cell, colIndex) {
4822
- var newCell = (0, roosterjs_content_model_dom_1.createTableCell)(cell.spanLeft, cell.spanAbove, cell.isHeader, cell.format);
4826
+ var mutableCell = (0, roosterjs_content_model_dom_1.mutateBlock)(cell);
4827
+ delete mutableCell.format.height;
4828
+ var newCell = (0, roosterjs_content_model_dom_1.createTableCell)(cell.spanLeft, cell.spanAbove, cell.isHeader, mutableCell.format);
4823
4829
  newCell.dataset = (0, tslib_1.__assign)({}, cell.dataset);
4824
4830
  if (colIndex < sel.firstColumn || colIndex > sel.lastColumn) {
4825
4831
  newCell.spanAbove = true;
@@ -7384,6 +7390,8 @@ function formatTableWithContentModel(editor, apiName, callback, selectionOverrid
7384
7390
  }, {
7385
7391
  apiName: apiName,
7386
7392
  selectionOverride: selectionOverride,
7393
+ }, {
7394
+ recalculateTableSize: 'selected',
7387
7395
  });
7388
7396
  }
7389
7397
  exports.formatTableWithContentModel = formatTableWithContentModel;
@@ -8892,7 +8900,8 @@ var createContentModel = function (core, option, selectionOverride) {
8892
8900
  var _a;
8893
8901
  // Flush all mutations if any, so that we can get an up-to-date Content Model
8894
8902
  (_a = core.cache.textMutationObserver) === null || _a === void 0 ? void 0 : _a.flushMutations();
8895
- if (!selectionOverride && (!option || option.tryGetFromCache)) {
8903
+ var tryGetFromCache = !option || (option.tryGetFromCache && typeof option.recalculateTableSize === 'undefined');
8904
+ if (!selectionOverride && tryGetFromCache) {
8896
8905
  var cachedModel = core.cache.cachedModel;
8897
8906
  if (cachedModel) {
8898
8907
  // When in shadow edit, use a cloned model so we won't pollute the cached one
@@ -8906,6 +8915,7 @@ var createContentModel = function (core, option, selectionOverride) {
8906
8915
  : selectionOverride || core.api.getDOMSelection(core) || undefined;
8907
8916
  var saveIndex = !option && !selectionOverride;
8908
8917
  var editorContext = core.api.createEditorContext(core, saveIndex);
8918
+ editorContext.recalculateTableSize = option === null || option === void 0 ? void 0 : option.recalculateTableSize;
8909
8919
  var settings = core.environment.domToModelSettings;
8910
8920
  var domToModelContext = option
8911
8921
  ? (0, roosterjs_content_model_dom_1.createDomToModelContext)(editorContext, settings.builtIn, settings.customized, option)
@@ -17256,6 +17266,7 @@ var addBlock_1 = __webpack_require__(/*! ../../modelApi/common/addBlock */ "./pa
17256
17266
  var createTable_1 = __webpack_require__(/*! ../../modelApi/creators/createTable */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createTable.ts");
17257
17267
  var createTableCell_1 = __webpack_require__(/*! ../../modelApi/creators/createTableCell */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createTableCell.ts");
17258
17268
  var getBoundingClientRect_1 = __webpack_require__(/*! ../utils/getBoundingClientRect */ "./packages/roosterjs-content-model-dom/lib/domToModel/utils/getBoundingClientRect.ts");
17269
+ var getSelectionRootNode_1 = __webpack_require__(/*! ../../domUtils/selection/getSelectionRootNode */ "./packages/roosterjs-content-model-dom/lib/domUtils/selection/getSelectionRootNode.ts");
17259
17270
  var isElementOfType_1 = __webpack_require__(/*! ../../domUtils/isElementOfType */ "./packages/roosterjs-content-model-dom/lib/domUtils/isElementOfType.ts");
17260
17271
  var isNodeOfType_1 = __webpack_require__(/*! ../../domUtils/isNodeOfType */ "./packages/roosterjs-content-model-dom/lib/domUtils/isNodeOfType.ts");
17261
17272
  var parseFormat_1 = __webpack_require__(/*! ../utils/parseFormat */ "./packages/roosterjs-content-model-dom/lib/domToModel/utils/parseFormat.ts");
@@ -17286,6 +17297,7 @@ var tableProcessor = function (group, tableElement, context) {
17286
17297
  var tableSelection = ((_a = context.selection) === null || _a === void 0 ? void 0 : _a.type) == 'table' ? context.selection : null;
17287
17298
  var selectedTable = tableSelection === null || tableSelection === void 0 ? void 0 : tableSelection.table;
17288
17299
  var hasTableSelection = selectedTable == tableElement;
17300
+ var recalculateTableSize = shouldRecalculateTableSize(tableElement, context);
17289
17301
  if (context.allowCacheElement) {
17290
17302
  table.cachedElement = tableElement;
17291
17303
  }
@@ -17328,7 +17340,7 @@ var tableProcessor = function (group, tableElement, context) {
17328
17340
  for (; tableRow.cells[targetCol]; targetCol++) { }
17329
17341
  var td = tr.cells[sourceCol];
17330
17342
  var hasSelectionBeforeCell = context.isInSelection;
17331
- if (context.recalculateTableSize) {
17343
+ if (recalculateTableSize) {
17332
17344
  var colEnd = targetCol + td.colSpan;
17333
17345
  var rowEnd = row + td.rowSpan;
17334
17346
  var needCalcWidth = columnPositions[colEnd] === undefined;
@@ -17472,6 +17484,21 @@ function processColGroup(table, context, result) {
17472
17484
  }
17473
17485
  return hasColGroup;
17474
17486
  }
17487
+ function shouldRecalculateTableSize(table, context) {
17488
+ switch (context.recalculateTableSize) {
17489
+ case true:
17490
+ case 'all':
17491
+ return true;
17492
+ case 'selected':
17493
+ var selectionRoot = (0, getSelectionRootNode_1.getSelectionRootNode)(context.selection);
17494
+ return (!!selectionRoot &&
17495
+ (selectionRoot == table ||
17496
+ table.contains(selectionRoot) ||
17497
+ selectionRoot.contains(table)));
17498
+ default:
17499
+ return false;
17500
+ }
17501
+ }
17475
17502
 
17476
17503
 
17477
17504
  /***/ }),
@@ -31486,9 +31513,10 @@ function handleTabOnTable(model, rawEvent) {
31486
31513
  }
31487
31514
  exports.handleTabOnTable = handleTabOnTable;
31488
31515
  function isWholeTableSelected(tableModel) {
31489
- var _a, _b, _c, _d;
31490
- return (((_b = (_a = tableModel.rows[0]) === null || _a === void 0 ? void 0 : _a.cells[0]) === null || _b === void 0 ? void 0 : _b.isSelected) &&
31491
- ((_d = (_c = tableModel.rows[tableModel.rows.length - 1]) === null || _c === void 0 ? void 0 : _c.cells[tableModel.widths.length - 1]) === null || _d === void 0 ? void 0 : _d.isSelected));
31516
+ var _a, _b;
31517
+ var lastRow = tableModel.rows[tableModel.rows.length - 1];
31518
+ var lastCell = lastRow === null || lastRow === void 0 ? void 0 : lastRow.cells[lastRow.cells.length - 1];
31519
+ return ((_b = (_a = tableModel.rows[0]) === null || _a === void 0 ? void 0 : _a.cells[0]) === null || _b === void 0 ? void 0 : _b.isSelected) && (lastCell === null || lastCell === void 0 ? void 0 : lastCell.isSelected);
31492
31520
  }
31493
31521
 
31494
31522
 
@@ -31511,32 +31539,35 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
31511
31539
  * @internal
31512
31540
  */
31513
31541
  function handleTabOnTableCell(model, cell, rawEvent) {
31514
- var _a, _b, _c;
31542
+ var _a, _b;
31515
31543
  var readonlyTableModel = (0, roosterjs_content_model_dom_1.getFirstSelectedTable)(model)[0];
31516
- // Check if cursor is on last cell of the table
31517
- if (!rawEvent.shiftKey &&
31518
- readonlyTableModel &&
31519
- ((_a = readonlyTableModel.rows[readonlyTableModel.rows.length - 1]) === null || _a === void 0 ? void 0 : _a.cells[readonlyTableModel.widths.length - 1]) === cell) {
31520
- var tableModel = (0, roosterjs_content_model_dom_1.mutateBlock)(readonlyTableModel);
31521
- (0, roosterjs_content_model_api_1.insertTableRow)(tableModel, 'insertBelow');
31522
- // Clear Table selection
31523
- (0, roosterjs_content_model_api_1.clearSelectedCells)(tableModel, {
31524
- firstRow: tableModel.rows.length - 1,
31525
- firstColumn: 0,
31526
- lastRow: tableModel.rows.length - 1,
31527
- lastColumn: tableModel.widths.length - 1,
31528
- });
31529
- (0, roosterjs_content_model_dom_1.normalizeTable)(tableModel, model.format);
31530
- // Add selection marker to the first cell of the new row
31531
- var markerParagraph = (_c = (_b = tableModel.rows[tableModel.rows.length - 1]) === null || _b === void 0 ? void 0 : _b.cells[0]) === null || _c === void 0 ? void 0 : _c.blocks[0];
31532
- if (markerParagraph.blockType == 'Paragraph') {
31533
- var marker = (0, roosterjs_content_model_dom_1.createSelectionMarker)(model.format);
31534
- (0, roosterjs_content_model_dom_1.mutateBlock)(markerParagraph).segments.unshift(marker);
31535
- (0, roosterjs_content_model_dom_1.setParagraphNotImplicit)(markerParagraph);
31536
- (0, roosterjs_content_model_dom_1.setSelection)(tableModel.rows[tableModel.rows.length - 1].cells[0], marker);
31544
+ if (readonlyTableModel) {
31545
+ // Check if cursor is on last cell of the table
31546
+ var lastRow = readonlyTableModel.rows[readonlyTableModel.rows.length - 1];
31547
+ var lastColumn = lastRow ? lastRow.cells.length - 1 : -1;
31548
+ var lastCell = lastRow === null || lastRow === void 0 ? void 0 : lastRow.cells[lastColumn];
31549
+ if (!rawEvent.shiftKey && lastCell && lastCell === cell) {
31550
+ var tableModel = (0, roosterjs_content_model_dom_1.mutateBlock)(readonlyTableModel);
31551
+ (0, roosterjs_content_model_api_1.insertTableRow)(tableModel, 'insertBelow');
31552
+ // Clear Table selection
31553
+ (0, roosterjs_content_model_api_1.clearSelectedCells)(tableModel, {
31554
+ firstRow: tableModel.rows.length - 1,
31555
+ firstColumn: 0,
31556
+ lastRow: tableModel.rows.length - 1,
31557
+ lastColumn: lastColumn,
31558
+ });
31559
+ (0, roosterjs_content_model_dom_1.normalizeTable)(tableModel, model.format);
31560
+ // Add selection marker to the first cell of the new row
31561
+ var markerParagraph = (_b = (_a = tableModel.rows[tableModel.rows.length - 1]) === null || _a === void 0 ? void 0 : _a.cells[0]) === null || _b === void 0 ? void 0 : _b.blocks[0];
31562
+ if (markerParagraph.blockType == 'Paragraph') {
31563
+ var marker = (0, roosterjs_content_model_dom_1.createSelectionMarker)(model.format);
31564
+ (0, roosterjs_content_model_dom_1.mutateBlock)(markerParagraph).segments.unshift(marker);
31565
+ (0, roosterjs_content_model_dom_1.setParagraphNotImplicit)(markerParagraph);
31566
+ (0, roosterjs_content_model_dom_1.setSelection)(tableModel.rows[tableModel.rows.length - 1].cells[0], marker);
31567
+ }
31568
+ rawEvent.preventDefault();
31569
+ return true;
31537
31570
  }
31538
- rawEvent.preventDefault();
31539
- return true;
31540
31571
  }
31541
31572
  return false;
31542
31573
  }