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/bin/gulpfile.js +1 -1
- package/bin/index-custom.js +1 -1
- package/bin/localization-builder.js +1 -1
- package/bin/nspell-index.js +1 -1
- package/bin/nspell.webpack.config.js +1 -1
- package/bin/webpack-externals.js +1 -1
- package/bin/webpack.config.js +1 -1
- package/dist/dx.richedit.d.ts +1 -1
- package/dist/dx.richedit.js +173 -173
- package/dist/dx.richedit.min.js +2 -2
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/lib/client/client-rich-edit.js +2 -2
- package/lib/client/model-api/collections/table/table-collection.js +1 -3
- package/lib/common/commands/tables/auto-fit-commands.js +1 -3
- package/lib/common/commands/tables/insert-table-core-command.js +1 -3
- package/lib/common/event-manager.js +21 -12
- package/lib/common/formats/html/export/html-document-exporter.js +5 -3
- package/lib/common/input-controller.js +5 -3
- package/lib/common/layout/document-layout.d.ts +1 -0
- package/lib/common/layout/document-layout.js +3 -0
- package/lib/common/layout/layout-position.d.ts +1 -3
- package/lib/common/layout/layout-position.js +6 -3
- package/lib/common/rich-utils/layout/rich-layout-utils.d.ts +0 -5
- package/lib/common/rich-utils/layout/rich-layout-utils.js +0 -9
- package/package.json +3 -3
package/index.d.ts
CHANGED
package/index.js
CHANGED
@@ -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 ("
|
65
|
-
config(JSON.parse(atob("
|
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.
|
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,
|
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,
|
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
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
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
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
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.
|
18
|
-
|
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 =
|
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
|
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 (
|
698
|
+
if (this.previousText != text)
|
697
699
|
this.onTextReplace(text, text);
|
698
700
|
else if (!Browser.Edge)
|
699
701
|
this.clearInputElement();
|
@@ -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,
|
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,
|
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
|
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.
|
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.
|
18
|
-
"devextreme-dist": "24.2.
|
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",
|