devexpress-richedit 24.2.2-beta → 24.2.3
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 +5388 -188
- 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/commands/mail-merge-command.d.ts +4 -1
- package/lib/client/commands/mail-merge-command.js +51 -18
- package/lib/client/formats/docx/export/exporters/styles.d.ts +5 -0
- package/lib/client/formats/docx/export/exporters/styles.js +30 -1
- package/lib/client/formatters-options.js +2 -2
- package/lib/client/model-api/api-utils/range-permission-finder.js +3 -1
- package/lib/client/model-api/collections/range-permission-collection.js +3 -2
- package/lib/common/formats/rtf/export/helpers/rtf-export-helper.js +3 -2
- package/lib/common/model/fields/parsers/field-code-parser-if.d.ts +1 -0
- package/lib/common/model/fields/parsers/field-code-parser-if.js +5 -2
- package/lib/common/model/range-permissions.js +6 -4
- 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 ("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaWFIaHFVV1ZWV0RGWFJVZFJTM1ZrTFU1bVQxbE5aeUlLZlE9PS5VMEV0VjZRMUNKaDR1WDIzbXZzcEl1d1prYVhDbzZKQittWFJqQTNZZ3pHOWxIL3dCQ2hNeDJ3RFdxdG1BQnpzYXdJc3hqME0yN2FDaFRCMTlJamR2L2ozRzE2Rk9zQTdJampEOTZjcGpWS29VZnkvS1I4K2dVcDFHSTEybnF3czZDWGNFdz09In0=")
|
65
|
+
config(JSON.parse(atob("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaWFIaHFVV1ZWV0RGWFJVZFJTM1ZrTFU1bVQxbE5aeUlLZlE9PS5VMEV0VjZRMUNKaDR1WDIzbXZzcEl1d1prYVhDbzZKQittWFJqQTNZZ3pHOWxIL3dCQ2hNeDJ3RFdxdG1BQnpzYXdJc3hqME0yN2FDaFRCMTlJamR2L2ozRzE2Rk9zQTdJampEOTZjcGpWS29VZnkvS1I4K2dVcDFHSTEybnF3czZDWGNFdz09In0=")));
|
66
66
|
this.prepareElement(element, settings);
|
67
67
|
this.initDefaultFontsAndStyles();
|
68
68
|
this.initBars(settings.ribbon, settings.fonts);
|
@@ -11,8 +11,11 @@ export declare class MailMergeCommand extends CommandBase<SimpleCommandState> {
|
|
11
11
|
executeCore(_state: SimpleCommandState, options: CommandSimpleOptions<MailMergeCommandParameters>): boolean;
|
12
12
|
prepareMergedDocument(modelManager: IModelManager, param: MailMergeCommandParameters): void;
|
13
13
|
private getDataSource;
|
14
|
-
private
|
14
|
+
private replaceFieldsInModel;
|
15
|
+
private processFieldsInSubDocument;
|
15
16
|
private replaceMergeFieldsInSubDocument;
|
17
|
+
private replaceIfFieldsInSubDocument;
|
18
|
+
private replaceFieldWithText;
|
16
19
|
private getResultByFieldName;
|
17
20
|
private insertSeparator;
|
18
21
|
private createModelManager;
|
@@ -24,6 +24,7 @@ import { DocxExporter } from '../formats/docx/export/exporter';
|
|
24
24
|
import { Importer } from '../formats/docx/import/importer';
|
25
25
|
import { ImporterOptions } from '../formats/docx/import/importer-options';
|
26
26
|
import { exportModelToBlob } from '../model-api/formats/exporter';
|
27
|
+
import { FieldCodeParserIf } from '../../common/model/fields/parsers/field-code-parser-if';
|
27
28
|
export class MailMergeCommand extends CommandBase {
|
28
29
|
getState() {
|
29
30
|
var state = new SimpleCommandState(this.isEnabled());
|
@@ -34,8 +35,10 @@ export class MailMergeCommand extends CommandBase {
|
|
34
35
|
return true;
|
35
36
|
}
|
36
37
|
isEnabled() {
|
37
|
-
return super.isEnabled() &&
|
38
|
-
this.control.modelManager.
|
38
|
+
return (super.isEnabled() &&
|
39
|
+
ControlOptions.isEnabled(this.control.modelManager.richOptions.control.fields) &&
|
40
|
+
this.control.modelManager.model.mainSubDocument.getDocumentEndPosition() > 1 &&
|
41
|
+
!!this.getDataSource());
|
39
42
|
}
|
40
43
|
canModify() {
|
41
44
|
return true;
|
@@ -58,7 +61,7 @@ export class MailMergeCommand extends CommandBase {
|
|
58
61
|
throw new Error(Errors.InternalException);
|
59
62
|
const param = options.param;
|
60
63
|
this.prepareMergedDocument(exportModelOptions.modelManager, param);
|
61
|
-
exportModelToBlob(exportModelOptions, blob => param.callback(blob));
|
64
|
+
exportModelToBlob(exportModelOptions, (blob) => param.callback(blob));
|
62
65
|
}, 3000);
|
63
66
|
formatImagesImporter.import(exportModelOptions.modelManager.modelManipulator);
|
64
67
|
}, () => { });
|
@@ -79,7 +82,7 @@ export class MailMergeCommand extends CommandBase {
|
|
79
82
|
if (index > param.exportFrom)
|
80
83
|
rangeCopy.insertTo(modelManager.modelManipulator, new SubDocumentPosition(subDoc, subDoc.getDocumentEndPosition() - 1));
|
81
84
|
const record = dataSource.items()[index];
|
82
|
-
this.
|
85
|
+
this.replaceFieldsInModel(modelManager, record, lastProcessedPositionInMainSubDocument, processedSubDocIds);
|
83
86
|
if (index < exportToIndex)
|
84
87
|
this.insertSeparator(modelManager, param.mergeMode);
|
85
88
|
lastProcessedPositionInMainSubDocument = subDoc.getDocumentEndPosition() - 1;
|
@@ -88,41 +91,71 @@ export class MailMergeCommand extends CommandBase {
|
|
88
91
|
getDataSource() {
|
89
92
|
return this.control.owner.dataSource;
|
90
93
|
}
|
91
|
-
|
94
|
+
replaceFieldsInModel(modelManager, record, lastProcessedPositionInMainSubDocument, processedSubDocIds) {
|
92
95
|
NumberMapUtils.forEach(modelManager.model.subDocuments, (subDoc) => {
|
93
|
-
if (!ListUtils.anyOf(processedSubDocIds, id => id === subDoc.id)) {
|
96
|
+
if (!ListUtils.anyOf(processedSubDocIds, (id) => id === subDoc.id)) {
|
94
97
|
this.replaceMergeFieldsInSubDocument(modelManager, record, lastProcessedPositionInMainSubDocument, subDoc);
|
98
|
+
this.replaceIfFieldsInSubDocument(modelManager, lastProcessedPositionInMainSubDocument, subDoc);
|
95
99
|
if (!subDoc.isMain())
|
96
100
|
processedSubDocIds.push(subDoc.id);
|
97
101
|
}
|
98
102
|
});
|
99
103
|
}
|
100
|
-
|
104
|
+
processFieldsInSubDocument(modelManager, lastProcessedPositionInMainSubDocument, subDoc, processField) {
|
101
105
|
for (let i = subDoc.fields.length - 1; i >= 0; i--) {
|
102
106
|
const field = subDoc.fields[i];
|
103
|
-
if (subDoc.isMain() && field.getFieldStartPosition() < lastProcessedPositionInMainSubDocument)
|
107
|
+
if (subDoc.isMain() && field.getFieldStartPosition() < lastProcessedPositionInMainSubDocument) {
|
104
108
|
return;
|
109
|
+
}
|
105
110
|
const parser = FieldsWaitingForUpdate.getParser(modelManager, null, null, subDoc, field);
|
106
111
|
if (parser) {
|
107
|
-
|
108
|
-
const
|
109
|
-
|
110
|
-
|
111
|
-
if (!StringUtils.isNullOrEmpty(text)) {
|
112
|
-
const insertParams = new InsertTextManipulatorParams(new SubDocumentPosition(subDoc, pos), subDoc.getRunByPosition(pos).getCharPropsBundle(modelManager.model), RunType.TextRun, text);
|
113
|
-
modelManager.modelManipulator.text.insertTextInner(insertParams);
|
112
|
+
try {
|
113
|
+
const text = processField(parser);
|
114
|
+
if (text !== null) {
|
115
|
+
this.replaceFieldWithText(modelManager, subDoc, field, text);
|
114
116
|
}
|
115
|
-
modelManager.modelManipulator.range.removeIntervalWithoutHistory(subDoc, field.getAllFieldInterval(), false);
|
116
117
|
}
|
117
|
-
|
118
|
+
finally {
|
119
|
+
parser.destructor();
|
120
|
+
}
|
118
121
|
}
|
119
122
|
}
|
120
123
|
}
|
124
|
+
replaceMergeFieldsInSubDocument(modelManager, record, lastProcessedPositionInMainSubDocument, subDoc) {
|
125
|
+
const processField = (parser) => {
|
126
|
+
if (parser instanceof FieldCodeParserMailMerge) {
|
127
|
+
const fieldName = parser.getMergeFieldName();
|
128
|
+
return RichUtils.replaceParagraphEndCharsWithLineBreak(this.getResultByFieldName(record, fieldName));
|
129
|
+
}
|
130
|
+
return null;
|
131
|
+
};
|
132
|
+
this.processFieldsInSubDocument(modelManager, lastProcessedPositionInMainSubDocument, subDoc, processField);
|
133
|
+
}
|
134
|
+
replaceIfFieldsInSubDocument(modelManager, lastProcessedPositionInMainSubDocument, subDoc) {
|
135
|
+
const processField = (parser) => {
|
136
|
+
if (parser instanceof FieldCodeParserIf) {
|
137
|
+
parser.parseSwitchesAndArgs();
|
138
|
+
return parser.getResult();
|
139
|
+
}
|
140
|
+
return null;
|
141
|
+
};
|
142
|
+
this.processFieldsInSubDocument(modelManager, lastProcessedPositionInMainSubDocument, subDoc, processField);
|
143
|
+
}
|
144
|
+
replaceFieldWithText(modelManager, subDoc, field, text) {
|
145
|
+
if (!StringUtils.isNullOrEmpty(text)) {
|
146
|
+
const pos = field.getFieldStartPosition();
|
147
|
+
const runProps = subDoc.getRunByPosition(pos).getCharPropsBundle(modelManager.model);
|
148
|
+
const insertParams = new InsertTextManipulatorParams(new SubDocumentPosition(subDoc, pos), runProps, RunType.TextRun, text);
|
149
|
+
modelManager.modelManipulator.text.insertTextInner(insertParams);
|
150
|
+
}
|
151
|
+
modelManager.modelManipulator.range.removeIntervalWithoutHistory(subDoc, field.getAllFieldInterval(), false);
|
152
|
+
}
|
121
153
|
getResultByFieldName(record, fieldName) {
|
122
154
|
const keys = Object.keys(record);
|
123
|
-
for (let i = 0, key; key = keys[i]; i++)
|
155
|
+
for (let i = 0, key; (key = keys[i]); i++) {
|
124
156
|
if (key.toLowerCase() == fieldName.toLowerCase())
|
125
157
|
return record[key] + '';
|
158
|
+
}
|
126
159
|
return '';
|
127
160
|
}
|
128
161
|
insertSeparator(modelManager, mergeMode) {
|
@@ -4,8 +4,13 @@ export declare class StylesExporter extends ExporterBaseWithRootElement {
|
|
4
4
|
get rootElement(): string;
|
5
5
|
get rootNSPrefix(): string;
|
6
6
|
get rootNSValue(): string;
|
7
|
+
private styleNameToIndex;
|
8
|
+
private sortedStyleIndexes;
|
9
|
+
private processedStyleNames;
|
7
10
|
protected fillWriter(): void;
|
8
11
|
private exportDocumentDefaults;
|
9
12
|
private exportDocumentCharacterDefaults;
|
10
13
|
private exportDocumentParagraphDefaults;
|
14
|
+
private getSortedStyleIndexes;
|
15
|
+
private sortStyleIndexRecursive;
|
11
16
|
}
|
@@ -3,13 +3,20 @@ import { ListUtils } from '@devexpress/utils/lib/utils/list';
|
|
3
3
|
import { DocxNsType } from '../../utils/constants';
|
4
4
|
import { ExporterBaseWithRootElement } from './base';
|
5
5
|
export class StylesExporter extends ExporterBaseWithRootElement {
|
6
|
+
constructor() {
|
7
|
+
super(...arguments);
|
8
|
+
this.styleNameToIndex = new Map();
|
9
|
+
this.sortedStyleIndexes = [];
|
10
|
+
this.processedStyleNames = new Set();
|
11
|
+
}
|
6
12
|
get filePath() { return 'word/styles.xml'; }
|
7
13
|
get rootElement() { return 'styles'; }
|
8
14
|
get rootNSPrefix() { return this.data.constants.namespaces[DocxNsType.WordProcessing].prefix; }
|
9
15
|
get rootNSValue() { return this.data.constants.namespaces[DocxNsType.WordProcessing].namespace; }
|
10
16
|
fillWriter() {
|
11
17
|
this.exportDocumentDefaults();
|
12
|
-
|
18
|
+
const paragraphStyleIndexes = this.getSortedStyleIndexes();
|
19
|
+
ListUtils.forEach(paragraphStyleIndexes, (index) => this.data.parStyleExporter.export(this.data.model.paragraphStyles[index], index));
|
13
20
|
ListUtils.forEach(this.data.model.characterStyles, (style, index) => this.data.charStyleExporter.export(style, index));
|
14
21
|
ListUtils.forEach(this.data.model.tableStyles, (style, index) => this.data.tblStyleExporter.export(style, index));
|
15
22
|
}
|
@@ -33,4 +40,26 @@ export class StylesExporter extends ExporterBaseWithRootElement {
|
|
33
40
|
this.writer.endElement();
|
34
41
|
this.writer.endElement();
|
35
42
|
}
|
43
|
+
getSortedStyleIndexes() {
|
44
|
+
this.styleNameToIndex = new Map();
|
45
|
+
this.sortedStyleIndexes = [];
|
46
|
+
this.processedStyleNames = new Set();
|
47
|
+
const styles = this.data.model.paragraphStyles;
|
48
|
+
styles.forEach((style, index) => this.styleNameToIndex.set(style.styleName, index));
|
49
|
+
for (let index = 0; index < styles.length; index++)
|
50
|
+
this.sortStyleIndexRecursive(index);
|
51
|
+
return this.sortedStyleIndexes;
|
52
|
+
}
|
53
|
+
sortStyleIndexRecursive(index) {
|
54
|
+
const styles = this.data.model.paragraphStyles;
|
55
|
+
const style = styles[index];
|
56
|
+
if (this.processedStyleNames.has(style.styleName))
|
57
|
+
return;
|
58
|
+
this.processedStyleNames.add(style.styleName);
|
59
|
+
if (style.parent) {
|
60
|
+
const parentIndex = this.styleNameToIndex.get(style.parent.styleName);
|
61
|
+
this.sortStyleIndexRecursive(parentIndex);
|
62
|
+
}
|
63
|
+
this.sortedStyleIndexes.push(index);
|
64
|
+
}
|
36
65
|
}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import * as DxLocDate from 'devextreme/localization/date';
|
2
|
-
import * as DxLocNumber from 'devextreme/localization/number';
|
1
|
+
import * as DxLocDate from 'devextreme/common/core/localization/date';
|
2
|
+
import * as DxLocNumber from 'devextreme/common/core/localization/number';
|
3
3
|
export class ClientFormattersOptions {
|
4
4
|
get locDate() { var _a; return (_a = DxLocDate.default) !== null && _a !== void 0 ? _a : DxLocDate; }
|
5
5
|
get locNumber() { var _a; return (_a = DxLocNumber.default) !== null && _a !== void 0 ? _a : DxLocNumber; }
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import { IntervalAlgorithms } from '@devexpress/utils/lib/intervals/algorithms';
|
2
|
+
import { Comparers } from '@devexpress/utils/lib/utils/comparers';
|
2
3
|
import { ListUtils } from '@devexpress/utils/lib/utils/list';
|
3
4
|
export function findRangePermissionsByIntervals(sourceCollection, intervals) {
|
4
5
|
const permissions = [];
|
@@ -19,5 +20,6 @@ export function findRangePermissions(sourceCollection, check) {
|
|
19
20
|
}
|
20
21
|
export function findRangePermission(sourceCollection, coreInterval, userName, group) {
|
21
22
|
const intervals = findRangePermissionsByIntervals(sourceCollection, [coreInterval]);
|
22
|
-
return ListUtils.elementBy(intervals, (permission) => permission.userName ==
|
23
|
+
return ListUtils.elementBy(intervals, (permission) => Comparers.stringIgnoreCase(permission.userName, userName) == 0 &&
|
24
|
+
Comparers.stringIgnoreCase(permission.group, group) == 0);
|
23
25
|
}
|
@@ -10,6 +10,7 @@ import { ModelParametersChecker } from '../api-utils/model-parameter-checker';
|
|
10
10
|
import { findRangePermission, findRangePermissions, findRangePermissionsByIntervals } from '../api-utils/range-permission-finder';
|
11
11
|
import { RangePermissionApi } from '../range-permission';
|
12
12
|
import { Collection } from './collection';
|
13
|
+
import { Comparers } from '@devexpress/utils/lib/utils/comparers';
|
13
14
|
export class RangePermissionCollection extends Collection {
|
14
15
|
constructor(processor, subDocument) {
|
15
16
|
super(processor);
|
@@ -81,13 +82,13 @@ function findByPosition(position, canBeUndefined, sourceCollection) {
|
|
81
82
|
}
|
82
83
|
function findByUserName(value, permissions) {
|
83
84
|
return ListUtils.map(ApiParametersChecker.check(value, 1, true, [
|
84
|
-
ApiParametersChecker.stringDescriptor("userName", (userName) => findRangePermissions(permissions, permission => permission.userName ==
|
85
|
+
ApiParametersChecker.stringDescriptor("userName", (userName) => findRangePermissions(permissions, permission => Comparers.stringIgnoreCase(permission.userName, userName) == 0), false),
|
85
86
|
ApiParametersChecker.regExpDescriptor('regexp', (regexp) => findRangePermissions(permissions, permission => regexp.test(permission.userName)))
|
86
87
|
]), (b) => b);
|
87
88
|
}
|
88
89
|
function findByGroup(value, permissions) {
|
89
90
|
return ListUtils.map(ApiParametersChecker.check(value, 1, true, [
|
90
|
-
ApiParametersChecker.stringDescriptor("group", (group) => findRangePermissions(permissions, permission => permission.group ==
|
91
|
+
ApiParametersChecker.stringDescriptor("group", (group) => findRangePermissions(permissions, permission => Comparers.stringIgnoreCase(permission.group, group) == 0), false),
|
91
92
|
ApiParametersChecker.regExpDescriptor('regexp', (regexp) => findRangePermissions(permissions, permission => regexp.test(permission.group)))
|
92
93
|
]), (b) => b);
|
93
94
|
}
|
@@ -4,6 +4,7 @@ import { DXColor } from '../../../../model/color/dx-color';
|
|
4
4
|
import { ListUtils } from '@devexpress/utils/lib/utils/list';
|
5
5
|
import { NumberMapUtils } from '@devexpress/utils/lib/utils/map/number';
|
6
6
|
import { RtfContentExporter } from '../exporters/rtf-content-exporter';
|
7
|
+
import { Comparers } from '@devexpress/utils/lib/utils/comparers';
|
7
8
|
export class RtfExportHelper {
|
8
9
|
constructor() {
|
9
10
|
this.colorCollection = [];
|
@@ -39,11 +40,11 @@ export class RtfExportHelper {
|
|
39
40
|
return DXColor.blend(color, DXColor.white);
|
40
41
|
}
|
41
42
|
getUserIndex(rangePermission) {
|
42
|
-
let index = this.userCollection.
|
43
|
+
let index = this.userCollection.findIndex((userName) => Comparers.stringIgnoreCase(userName, rangePermission.userName) == 0);
|
43
44
|
if (index >= 0)
|
44
45
|
return index + 1;
|
45
46
|
const predefinedUserGroups = RtfContentExporter.predefinedUserGroups;
|
46
|
-
const id = NumberMapUtils.keyBy(predefinedUserGroups, (g) => g
|
47
|
+
const id = NumberMapUtils.keyBy(predefinedUserGroups, (g) => Comparers.stringIgnoreCase(g, rangePermission.group) == 0);
|
47
48
|
return id != null ? id : 0;
|
48
49
|
}
|
49
50
|
}
|
@@ -3,6 +3,7 @@ import { FieldCodeParserClientUpdatingBase } from './field-code-parser-client-up
|
|
3
3
|
export declare class FieldCodeParserIf extends FieldCodeParserClientUpdatingBase {
|
4
4
|
get name(): FieldName;
|
5
5
|
protected fillResult(): boolean;
|
6
|
+
getResult(): string;
|
6
7
|
private parseParameters;
|
7
8
|
}
|
8
9
|
export declare class IfExpression {
|
@@ -6,8 +6,7 @@ export class FieldCodeParserIf extends FieldCodeParserClientUpdatingBase {
|
|
6
6
|
this.setInputPositionState();
|
7
7
|
let result = null;
|
8
8
|
try {
|
9
|
-
|
10
|
-
result = expression.evaluate();
|
9
|
+
result = this.getResult();
|
11
10
|
}
|
12
11
|
catch (err) {
|
13
12
|
if (err instanceof IfExpressionError) {
|
@@ -21,6 +20,10 @@ export class FieldCodeParserIf extends FieldCodeParserClientUpdatingBase {
|
|
21
20
|
return true;
|
22
21
|
}
|
23
22
|
}
|
23
|
+
getResult() {
|
24
|
+
const expression = this.parseParameters(this.parameterInfoList);
|
25
|
+
return expression.evaluate();
|
26
|
+
}
|
24
27
|
parseParameters(parameters) {
|
25
28
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
26
29
|
if (parameters.length > 5)
|
@@ -7,8 +7,8 @@ import { BookmarkBase } from './bookmarks';
|
|
7
7
|
export class RangePermission extends BookmarkBase {
|
8
8
|
constructor(positionManager, interval, userName, group) {
|
9
9
|
super(positionManager, interval);
|
10
|
-
this.userName = userName
|
11
|
-
this.group = group
|
10
|
+
this.userName = userName;
|
11
|
+
this.group = group;
|
12
12
|
}
|
13
13
|
isGranted(settings) {
|
14
14
|
return RangePermission.allow(this.group, RangePermission.Everyone_GROUP_NAME) ||
|
@@ -17,7 +17,7 @@ export class RangePermission extends BookmarkBase {
|
|
17
17
|
RangePermission.allow(this.group, settings.authenticationGroup);
|
18
18
|
}
|
19
19
|
static allow(permissionValue, settingsValue) {
|
20
|
-
return settingsValue != "" && permissionValue ==
|
20
|
+
return settingsValue != "" && Comparers.stringIgnoreCase(permissionValue, settingsValue) == 0;
|
21
21
|
}
|
22
22
|
get end() { return this._interval.end - 1; }
|
23
23
|
get length() { return this.end - this.start; }
|
@@ -42,7 +42,9 @@ export class RangePermission extends BookmarkBase {
|
|
42
42
|
return new RangePermission(positionManager, this.interval, this.userName, this.group);
|
43
43
|
}
|
44
44
|
equals(obj) {
|
45
|
-
return super.equals(obj) && (StringUtils.isNullOrEmpty(this.userName) ?
|
45
|
+
return super.equals(obj) && (StringUtils.isNullOrEmpty(this.userName) ?
|
46
|
+
Comparers.stringIgnoreCase(obj.group, this.group) == 0 :
|
47
|
+
Comparers.stringIgnoreCase(obj.userName, this.userName) == 0);
|
46
48
|
}
|
47
49
|
}
|
48
50
|
RangePermission.Everyone_GROUP_NAME = "Everyone".toLowerCase();
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "devexpress-richedit",
|
3
|
-
"version": "24.2.
|
3
|
+
"version": "24.2.3",
|
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.3",
|
18
|
+
"devextreme-dist": "24.2.3"
|
19
19
|
},
|
20
20
|
"dependencies": {
|
21
21
|
"jszip": "~3.10.1",
|