devexpress-richedit 24.2.4-build-25009-0102 → 24.2.5-build-25037-0102

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/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * DevExpress WebRichEdit (index.d.ts)
3
- * Version: 24.2.4
3
+ * Version: 24.2.5
4
4
  * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
5
5
  * License: https://www.devexpress.com/Support/EULAs
6
6
  */
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * DevExpress WebRichEdit (index.js)
3
- * Version: 24.2.4
3
+ * Version: 24.2.5
4
4
  * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
5
5
  * License: https://www.devexpress.com/Support/EULAs
6
6
  */
@@ -61,8 +61,8 @@ export class ClientRichEdit {
61
61
  this.rawDataSource = settings.rawDataSource;
62
62
  this.contextMenuSettings = settings.contextMenuSettings;
63
63
  this.fullScreenHelper = new FullScreenHelper(element);
64
- if ("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaWFIaHFVV1ZWV0RGWFJVZFJTM1ZrTFU1bVQxbE5aeUlLZlE9PS5VMEV0VjZRMUNKaDR1WDIzbXZzcEl1d1prYVhDbzZKQittWFJqQTNZZ3pHOWxIL3dCQ2hNeDJ3RFdxdG1BQnpzYXdJc3hqME0yN2FDaFRCMTlJamR2L2ozRzE2Rk9zQTdJampEOTZjcGpWS29VZnkvS1I4K2dVcDFHSTEybnF3czZDWGNFdz09In0=")
65
- config(JSON.parse(atob("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaWFIaHFVV1ZWV0RGWFJVZFJTM1ZrTFU1bVQxbE5aeUlLZlE9PS5VMEV0VjZRMUNKaDR1WDIzbXZzcEl1d1prYVhDbzZKQittWFJqQTNZZ3pHOWxIL3dCQ2hNeDJ3RFdxdG1BQnpzYXdJc3hqME0yN2FDaFRCMTlJamR2L2ozRzE2Rk9zQTdJampEOTZjcGpWS29VZnkvS1I4K2dVcDFHSTEybnF3czZDWGNFdz09In0=")));
64
+ if ("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaVZITk1NM3AyT1dkeE1EWk5lVlEyYXpCT1NIazNaeUlLZlE9PS52MHVNYVVSVFFNRWg3SEFEV1dZUnBXY2tsSTZiZC82Uis3VGpHa0lESDZ2aVY2Q2pieFI5L2ZZOERxQmdPQ0tVVld4Wnh0Z0p0blhxSXBqNnhnZFVRaEJQbHFHbm9WYUhWdTYxb0FjRnVWRUJlR0lDMERQN0pnaXBYZkgrd3VReFZZdGxrQT09In0=")
65
+ config(JSON.parse(atob("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaVZITk1NM3AyT1dkeE1EWk5lVlEyYXpCT1NIazNaeUlLZlE9PS52MHVNYVVSVFFNRWg3SEFEV1dZUnBXY2tsSTZiZC82Uis3VGpHa0lESDZ2aVY2Q2pieFI5L2ZZOERxQmdPQ0tVVld4Wnh0Z0p0blhxSXBqNnhnZFVRaEJQbHFHbm9WYUhWdTYxb0FjRnVWRUJlR0lDMERQN0pnaXBYZkgrd3VReFZZdGxrQT09In0=")));
66
66
  this.prepareElement(element, settings);
67
67
  this.initDefaultFontsAndStyles();
68
68
  this.initBars(settings.ribbon, settings.fonts);
@@ -1,6 +1,4 @@
1
1
  import { ApiParametersChecker } from '../../api-utils/parameter-checker';
2
- import { LayoutPositionCreatorConflictFlags } from '../../../../common/layout-engine/layout-position-creator';
3
- import { DocumentLayoutDetailsLevel } from '../../../../common/layout/document-layout-details-level';
4
2
  import { LayoutPosition } from '../../../../common/layout/layout-position';
5
3
  import { LayoutColumn } from '../../../../common/layout/main-structures/layout-column';
6
4
  import { Table } from '../../../../common/model/tables/main-structures/table';
@@ -26,7 +24,7 @@ export class TableCollection extends TableBaseCollection {
26
24
  rowCount = ApiParametersChecker.check(rowCount, 3, false, [
27
25
  ApiParametersChecker.numberDescriptor("rowCount", (n) => n, 1)
28
26
  ]);
29
- const lp = LayoutPosition.ensure(this._processor.layoutFormatterManager, this._processor.selection, this._subDocument, position, DocumentLayoutDetailsLevel.Row, new LayoutPositionCreatorConflictFlags().setDefault(false), new LayoutPositionCreatorConflictFlags().setDefault(false));
27
+ const lp = LayoutPosition.ensure(this._processor.layoutFormatterManager, this._subDocument, position);
30
28
  const currentTable = Table.getTableByPosition(this._subDocument.tables, position, true);
31
29
  const availableWidth = currentTable ? lp.row.tableCellInfo.avaliableContentWidth :
32
30
  LayoutColumn.findSectionColumnWithMinimumWidth(lp.pageArea.columns);
@@ -1,5 +1,3 @@
1
- import { LayoutPositionCreatorConflictFlags } from '../../layout-engine/layout-position-creator';
2
- import { DocumentLayoutDetailsLevel } from '../../layout/document-layout-details-level';
3
1
  import { LayoutPosition } from '../../layout/layout-position';
4
2
  import { LayoutColumn } from '../../layout/main-structures/layout-column';
5
3
  import { TableCellPreferredWidthHistoryItem } from '../../model/history/items/tables/table-cell-properties-history-items';
@@ -60,7 +58,7 @@ export class FixedColumnWidthCommand extends AutoFitCommandBase {
60
58
  const table = state.value;
61
59
  const history = this.history;
62
60
  const subDocument = parameter.subDocument;
63
- const lp = LayoutPosition.ensure(this.control.layoutFormatterManager, this.selection, subDocument, table.getStartPosition(), DocumentLayoutDetailsLevel.Row, new LayoutPositionCreatorConflictFlags().setDefault(false), new LayoutPositionCreatorConflictFlags().setDefault(false));
61
+ const lp = LayoutPosition.ensure(this.control.layoutFormatterManager, subDocument, table.getStartPosition());
64
62
  const grid = this.getGrid(table, lp);
65
63
  history.beginTransaction();
66
64
  history.addAndRedo(new TableLayoutTypeHistoryItem(this.modelManipulator, subDocument, table.index, TableLayoutType.Fixed, true));
@@ -1,5 +1,3 @@
1
- import { LayoutPositionCreatorConflictFlags } from '../../layout-engine/layout-position-creator';
2
- import { DocumentLayoutDetailsLevel } from '../../layout/document-layout-details-level';
3
1
  import { LayoutPosition } from '../../layout/layout-position';
4
2
  import { LayoutColumn } from '../../layout/main-structures/layout-column';
5
3
  import { ControlOptions } from '../../model/options/control';
@@ -20,7 +18,7 @@ export class InsertTableCoreCommand extends CommandBase {
20
18
  const parameter = options.param;
21
19
  const subDocument = this.selection.activeSubDocument;
22
20
  const position = this.selection.intervals[0].start;
23
- const lp = LayoutPosition.ensure(this.control.layoutFormatterManager, this.control.selection, subDocument, position, DocumentLayoutDetailsLevel.Row, new LayoutPositionCreatorConflictFlags().setDefault(false), new LayoutPositionCreatorConflictFlags().setDefault(false));
21
+ const lp = LayoutPosition.ensure(this.control.layoutFormatterManager, subDocument, position);
24
22
  let currentTable = Table.getTableByPosition(subDocument.tables, position, true);
25
23
  let availableWidth = currentTable ? lp.row.tableCellInfo.avaliableContentWidth :
26
24
  LayoutColumn.findSectionColumnWithMinimumWidth(lp.pageArea.columns);
@@ -23,6 +23,7 @@ import { MouseHandler } from './mouse-handler/mouse-handler/mouse-handler';
23
23
  import { TouchHandler } from './mouse-handler/touch-handler/touch-handler';
24
24
  import { LogObjToStrCanvas } from './rich-utils/debug/logger/canvas-logger/log-obj-to-str-canvas';
25
25
  import { RichLayoutUtils } from './rich-utils/layout/rich-layout-utils';
26
+ import { StringUtils } from '@devexpress/utils/lib/utils/string';
26
27
  export var MouseButton;
27
28
  (function (MouseButton) {
28
29
  MouseButton[MouseButton["None"] = 0] = "None";
@@ -145,10 +146,12 @@ export class EventManager {
145
146
  }
146
147
  modifyLastText(text, length) {
147
148
  if (length === 0) {
148
- this.control.beginUpdate();
149
- this.control.commandManager.getCommand(RichEditClientCommand.InsertText).execute(this.control.commandManager.isPublicApiCall, new CommandSimpleOptions(this.control, text));
150
- this.control.endUpdate();
151
- return;
149
+ if (!StringUtils.isNullOrEmpty(text)) {
150
+ this.control.beginUpdate();
151
+ this.control.commandManager.getCommand(RichEditClientCommand.InsertText).execute(this.control.commandManager.isPublicApiCall, new CommandSimpleOptions(this.control, text));
152
+ this.control.endUpdate();
153
+ }
154
+ return true;
152
155
  }
153
156
  let endInterval = this.control.selection.lastSelectedInterval.start;
154
157
  let startInterval = endInterval - length;
@@ -156,14 +159,19 @@ export class EventManager {
156
159
  const insertTextHistoryItem = this.control.modelManager.modelManipulator.text.getLastModifiableHistoryItem((hi) => hi instanceof InsertTextHistoryItem);
157
160
  if (!insertTextHistoryItem)
158
161
  return false;
159
- const setSelectionHistoryItem = this.control.modelManager.modelManipulator.text.getLastModifiableHistoryItem((hi) => hi instanceof SelectionHistoryItem);
160
- this.control.modelManager.modelManipulator.range.removeIntervalWithoutHistory(insertTextHistoryItem.params.subDocPos.subDocument, intervalForModify, false);
161
- this.control.modelManager.modelManipulator.text.insertTextInner(new InsertTextManipulatorParams(new SubDocumentPosition(insertTextHistoryItem.params.subDocPos.subDocument, intervalForModify.start), insertTextHistoryItem.params.charPropsBundle, RunType.TextRun, text));
162
- setSelectionHistoryItem.newState.intervalsInfo.intervals[0].start = startInterval + text.length;
163
- insertTextHistoryItem.params.text = text;
164
- var newPositionSelection = setSelectionHistoryItem.newState.intervalsInfo.intervals[0].start;
165
- this.control.selection.changeState((newState) => newState.setPosition(newPositionSelection));
166
- this.control.commandManager.lastTextInsertDate = new Date(0);
162
+ if (!StringUtils.isNullOrEmpty(text)) {
163
+ const setSelectionHistoryItem = this.control.modelManager.modelManipulator.text.getLastModifiableHistoryItem((hi) => hi instanceof SelectionHistoryItem);
164
+ this.control.modelManager.modelManipulator.range.removeIntervalWithoutHistory(insertTextHistoryItem.params.subDocPos.subDocument, intervalForModify, false);
165
+ this.control.modelManager.modelManipulator.text.insertTextInner(new InsertTextManipulatorParams(new SubDocumentPosition(insertTextHistoryItem.params.subDocPos.subDocument, intervalForModify.start), insertTextHistoryItem.params.charPropsBundle, RunType.TextRun, text));
166
+ setSelectionHistoryItem.newState.intervalsInfo.intervals[0].start = startInterval + text.length;
167
+ insertTextHistoryItem.params.text = text;
168
+ var newPositionSelection = setSelectionHistoryItem.newState.intervalsInfo.intervals[0].start;
169
+ this.control.selection.changeState((newState) => newState.setPosition(newPositionSelection));
170
+ this.control.commandManager.lastTextInsertDate = new Date(0);
171
+ }
172
+ else
173
+ this.control.modelManager.modelManipulator.range.removeIntervalInner(insertTextHistoryItem.params.subDocPos.subDocument, intervalForModify, false);
174
+ return true;
167
175
  }
168
176
  modifyLastInsertedSymbol(symbol) {
169
177
  if (symbol.length !== 1)
@@ -224,6 +232,7 @@ export class EventManager {
224
232
  createInputTypeHandlers() {
225
233
  const result = {};
226
234
  result["insertParagraph"] = RichEditClientCommand.InsertParagraph;
235
+ result["deleteContentBackward"] = RichEditClientCommand.ToggleBackspaceKey;
227
236
  return result;
228
237
  }
229
238
  }
@@ -2,6 +2,7 @@ import { FixedInterval } from "@devexpress/utils/lib/intervals/fixed";
2
2
  import { HtmlMimeType } from "@devexpress/utils/lib/utils/mime-type";
3
3
  import { RichUtils } from "../../../model/rich-utils";
4
4
  import { HtmlExporter } from "./html-export";
5
+ import { Base64Utils } from "@devexpress/utils/lib/utils/base64";
5
6
  export class HtmlDocumentExporter {
6
7
  get modelManipulator() { return this.exportModelOptions.modelManager.modelManipulator; }
7
8
  constructor(exportModelOptions, options) {
@@ -14,9 +15,10 @@ export class HtmlDocumentExporter {
14
15
  });
15
16
  }
16
17
  exportToBase64(callback) {
17
- this.modelManipulator.picture.loader.ensureAllPicturesLoaded(this.options.ensurePictureLoadedTimeout, (_loaded) => {
18
- callback(btoa(this.exportAsString()));
19
- });
18
+ this.exportToBlob(blob => Base64Utils.fromBlobAsDataUrl(blob, base64 => {
19
+ const splitted = base64.split(',');
20
+ callback(splitted.length === 2 ? splitted[1] : '');
21
+ }));
20
22
  }
21
23
  exportAsString() {
22
24
  const model = this.modelManipulator.model;
@@ -315,7 +315,7 @@ export class DivInputEditor extends InputEditorBase {
315
315
  this.selectEditableDocumentContent();
316
316
  }
317
317
  super.onKeyDown(evt);
318
- this.canSkipInputEvent = true;
318
+ this.canSkipInputEvent = KeyUtils.getEventKeyCode(evt) != EMPTY_KEYCODE;
319
319
  }
320
320
  onKeyUp(evt) {
321
321
  super.onKeyUp(evt);
@@ -685,7 +685,9 @@ export class IFrameInputEditor extends InputEditorBase {
685
685
  }
686
686
  onCompositionUpdate(_evt) {
687
687
  const text = this.getEditableDocumentText();
688
- if (this.IMEState !== IMEState.None && text.length && this.previousText != text) {
688
+ if (this.IMEState === IMEState.None)
689
+ return;
690
+ if (text.length && this.previousText != text) {
689
691
  this.onTextReplace(text, text);
690
692
  this.updateInputIME();
691
693
  }
@@ -693,7 +695,7 @@ export class IFrameInputEditor extends InputEditorBase {
693
695
  }
694
696
  onCompositionEnd(_evt) {
695
697
  const text = this.getEditableDocumentText();
696
- if (text.length && this.previousText != text)
698
+ if (this.previousText != text)
697
699
  this.onTextReplace(text, text);
698
700
  else if (!Browser.Edge)
699
701
  this.clearInputElement();
@@ -29,4 +29,5 @@ export declare class DocumentLayout {
29
29
  setEmptyLayout(pageColor: number): void;
30
30
  getLastValidPage(): LayoutPage;
31
31
  isPageValid(pageIndex: number): boolean;
32
+ getPageBySubDocumentId(subDocumentId: number): LayoutPage;
32
33
  }
@@ -55,4 +55,7 @@ export class DocumentLayout {
55
55
  isPageValid(pageIndex) {
56
56
  return pageIndex < this.validPageCount && this.pages[pageIndex].isValid;
57
57
  }
58
+ getPageBySubDocumentId(subDocumentId) {
59
+ return this.pages.find((page) => !!page.mainSubDocumentPageAreas[subDocumentId] || !!page.otherPageAreas[subDocumentId]);
60
+ }
58
61
  }
@@ -1,10 +1,8 @@
1
1
  import { Offset } from '@devexpress/utils/lib/geometry/point';
2
2
  import { ICloneable, IEquatable } from '@devexpress/utils/lib/types';
3
- import { LayoutPositionCreatorConflictFlags } from '../layout-engine/layout-position-creator';
4
3
  import { FormatterManager } from '../layout-formatter/managers/formatter-manager';
5
4
  import { IMeasurer } from '../measurer/measurer';
6
5
  import { SubDocument } from '../model/sub-document';
7
- import { ISelectionBase } from '../selection/selection-base';
8
6
  import { DocumentLayout } from './document-layout';
9
7
  import { DocumentLayoutDetailsLevel } from './document-layout-details-level';
10
8
  import { LayoutPoint } from './layout-point';
@@ -49,7 +47,7 @@ export declare class LayoutPositionBase extends LayoutRowPosition implements IEq
49
47
  }
50
48
  export declare class LayoutPosition extends LayoutPositionBase implements ICloneable<LayoutPosition> {
51
49
  constructor(detailsLevel: DocumentLayoutDetailsLevel);
52
- static ensure(formatterController: FormatterManager, selection: ISelectionBase, subDocument: SubDocument, logPosition: number, detailsLevel: DocumentLayoutDetailsLevel, endRowConflictFlags: LayoutPositionCreatorConflictFlags, middleRowConflictFlags: LayoutPositionCreatorConflictFlags): LayoutPosition;
50
+ static ensure(formatterController: FormatterManager, subDocument: SubDocument, logPosition: number, detailsLevel?: DocumentLayoutDetailsLevel): LayoutPosition;
53
51
  getLogPosition(detailsLevel?: DocumentLayoutDetailsLevel): number;
54
52
  isPositionBoxEnd(): boolean;
55
53
  isLastBoxInRow(): boolean;
@@ -1,5 +1,5 @@
1
1
  import { Point } from '@devexpress/utils/lib/geometry/point';
2
- import { LayoutPositionMainSubDocumentCreator, LayoutPositionOtherSubDocumentCreator } from '../layout-engine/layout-position-creator';
2
+ import { LayoutPositionCreatorConflictFlags, LayoutPositionMainSubDocumentCreator, LayoutPositionOtherSubDocumentCreator } from '../layout-engine/layout-position-creator';
3
3
  import { DocumentLayoutDetailsLevel } from './document-layout-details-level';
4
4
  import { LayoutPoint } from './layout-point';
5
5
  export class LayoutAndModelPositions {
@@ -188,12 +188,15 @@ export class LayoutPosition extends LayoutPositionBase {
188
188
  super();
189
189
  this.detailsLevel = detailsLevel;
190
190
  }
191
- static ensure(formatterController, selection, subDocument, logPosition, detailsLevel, endRowConflictFlags, middleRowConflictFlags) {
191
+ static ensure(formatterController, subDocument, logPosition, detailsLevel = DocumentLayoutDetailsLevel.Row) {
192
192
  const layout = formatterController.layout;
193
+ const endRowConflictFlags = new LayoutPositionCreatorConflictFlags().setDefault(false);
194
+ const middleRowConflictFlags = new LayoutPositionCreatorConflictFlags().setDefault(false);
193
195
  if (subDocument.isMain())
194
196
  return LayoutPositionMainSubDocumentCreator.ensureLayoutPosition(formatterController, subDocument, logPosition, detailsLevel, endRowConflictFlags, middleRowConflictFlags);
195
197
  while (true) {
196
- const lp = new LayoutPositionOtherSubDocumentCreator(layout, subDocument, logPosition, selection.pageIndex, detailsLevel)
198
+ const pageIndex = layout.getPageBySubDocumentId(subDocument.id).index;
199
+ const lp = new LayoutPositionOtherSubDocumentCreator(layout, subDocument, logPosition, pageIndex, detailsLevel)
197
200
  .create(endRowConflictFlags, middleRowConflictFlags);
198
201
  if (lp)
199
202
  return lp;
@@ -1,9 +1,4 @@
1
- import { FormatterManager } from '../../layout-formatter/managers/formatter-manager';
2
- import { SubDocument } from '../../model/sub-document';
3
- import { ISelectionBase } from '../../selection/selection-base';
4
- import { Size } from '@devexpress/utils/lib/geometry/size';
5
1
  import { IRichEditControl } from '../../interfaces/i-rich-edit-core';
6
2
  export declare class RichLayoutUtils {
7
- static getAllowedSizeForImage(subDocument: SubDocument, layoutFormatterManager: FormatterManager, selection: ISelectionBase, logPosition: number): Size;
8
3
  static modifyTextUnderCursor(control: IRichEditControl, text: string): void;
9
4
  }
@@ -1,21 +1,12 @@
1
1
  import { LayoutPositionCreatorConflictFlags, LayoutPositionMainSubDocumentCreator, LayoutPositionOtherSubDocumentCreator } from '../../layout-engine/layout-position-creator';
2
2
  import { DocumentLayoutDetailsLevel } from '../../layout/document-layout-details-level';
3
- import { LayoutPosition } from '../../layout/layout-position';
4
3
  import { InsertTextManipulatorParams } from '../../model/manipulators/text-manipulator/insert-text-manipulator-params';
5
4
  import { RunType } from '../../model/runs/run-type';
6
5
  import { SubDocumentInterval, SubDocumentPosition } from '../../model/sub-document';
7
6
  import { LayoutWordBounds } from '../../word-bounds-engine/layout-word-bounds';
8
- import { UnitConverter } from '@devexpress/utils/lib/class/unit-converter';
9
7
  import { FixedInterval } from '@devexpress/utils/lib/intervals/fixed';
10
8
  import { SelectionHistoryItem } from '../../model/history/selection/selection-history-item';
11
9
  export class RichLayoutUtils {
12
- static getAllowedSizeForImage(subDocument, layoutFormatterManager, selection, logPosition) {
13
- const layoutPosition = LayoutPosition.ensure(layoutFormatterManager, selection, subDocument, logPosition, DocumentLayoutDetailsLevel.Row, new LayoutPositionCreatorConflictFlags().setDefault(false), new LayoutPositionCreatorConflictFlags().setDefault(true));
14
- const allowedSize = layoutPosition.column.createSize().applyConverter(UnitConverter.pixelsToTwips);
15
- if (layoutPosition.row.tableCellInfo)
16
- allowedSize.width = Math.min(UnitConverter.pixelsToTwips(layoutPosition.row.tableCellInfo.avaliableContentWidth), allowedSize.width);
17
- return allowedSize;
18
- }
19
10
  static modifyTextUnderCursor(control, text) {
20
11
  const subDocument = control.selection.activeSubDocument;
21
12
  let position = control.selection.lastSelectedInterval.start;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devexpress-richedit",
3
- "version": "24.2.4-build-25009-0102",
3
+ "version": "24.2.5-build-25037-0102",
4
4
  "homepage": "https://www.devexpress.com/",
5
5
  "bugs": "https://www.devexpress.com/support/",
6
6
  "author": "Developer Express Inc.",
@@ -14,8 +14,8 @@
14
14
  "build-nspell": "webpack --mode production --config=bin/nspell.webpack.config.js"
15
15
  },
16
16
  "peerDependencies": {
17
- "devextreme": "24.2.4-build-25008-1340",
18
- "devextreme-dist": "24.2.4-build-25008-1340"
17
+ "devextreme": "24.2.5-build-25035-1935",
18
+ "devextreme-dist": "24.2.5-build-25035-1935"
19
19
  },
20
20
  "dependencies": {
21
21
  "jszip": "~3.10.1",