devexpress-richedit
Version:
DevExpress Rich Text Editor is an advanced word-processing tool designed for working with rich text documents.
95 lines (94 loc) • 6.49 kB
JavaScript
import { ApiParametersChecker } from '../api-utils/parameter-checker';
import { CreateRangePermissionHistoryItem } from '../../../common/model/history/items/range-permission-history-item';
import { ConstRangePermission, RangePermission } from '../../../common/model/range-permissions';
import { Constants } from '@devexpress/utils/lib/constants';
import { IntervalAlgorithms } from '@devexpress/utils/lib/intervals/algorithms';
import { FixedInterval } from '@devexpress/utils/lib/intervals/fixed';
import { isDefined } from '@devexpress/utils/lib/utils/common';
import { ListUtils } from '@devexpress/utils/lib/utils/list';
import { ModelParametersChecker } from '../api-utils/model-parameter-checker';
import { findRangePermission, findRangePermissions, findRangePermissionsByIntervals } from '../api-utils/range-permission-finder';
import { RangePermissionApi } from '../range-permission';
import { Collection } from './collection';
import { Comparers } from '@devexpress/utils/lib/utils/comparers';
export class RangePermissionCollection extends Collection {
constructor(processor, subDocument) {
super(processor);
this._subDocument = subDocument;
}
protectRange(intervals, userName = '', group = RangePermission.Everyone_GROUP_NAME) {
const modelManager = this._processor.modelManager;
modelManager.history.beginTransaction();
const modelIntervals = ListUtils.map(intervals, (interval) => new FixedInterval(interval.start, interval.length));
const mergedIntervals = IntervalAlgorithms.getMergedIntervals(modelIntervals, true);
let startPosition = 0;
let endPosition = 0;
const result = [];
ListUtils.forEach(mergedIntervals, (interval) => {
endPosition = interval.start + 1;
const length = endPosition - startPosition;
if (length)
result.push(this.create({ start: startPosition, length: length }, userName, group));
startPosition = interval.end;
});
endPosition = this._subDocument.interval.end;
const length = endPosition - startPosition;
if (length)
result.push(this.create({ start: startPosition, length: length }, userName, group));
modelManager.history.endTransaction();
return result;
}
find(options) {
const sd = this._subDocument;
ApiParametersChecker.objectDescriptor('options', 'DevExpress.RichEdit.IRangePermissionSearchOptions', (opt) => opt);
const permissions = isDefined(options.position) ?
findByPosition(options.position, true, sd.rangePermissions) : sd.rangePermissions;
const permissionCurentUser = isDefined(options.userName) ?
findByUserName(options.userName, permissions) : permissions;
const result = isDefined(options.group) ?
findByGroup(options.group, permissions) : permissionCurentUser;
return ListUtils.map(result, (permission) => this._getItem(permission));
}
isAllowEdit(position) {
const coreIntervals = ApiParametersChecker.check(position, 1, false, [
ApiParametersChecker.numberDescriptor("position", (pos) => [new FixedInterval(pos, 0)], 0, Constants.MAX_SAFE_INTEGER),
ModelParametersChecker.intervalDescriptor("interval", (interval) => [new FixedInterval(interval.start, interval.length)], 0, Constants.MAX_SAFE_INTEGER),
ModelParametersChecker.intervalsDescriptor("intervals", (apiIntervals) => ListUtils.map(apiIntervals, (interval) => new FixedInterval(interval.start, interval.length)), 0, Constants.MAX_SAFE_INTEGER)
]);
return this._subDocument.isEditable(coreIntervals);
}
create(interval, userName = '', group = RangePermission.Everyone_GROUP_NAME) {
const coreInterval = ApiParametersChecker.check(interval, 1, false, [
ModelParametersChecker.intervalDescriptor("interval", (interval) => new FixedInterval(interval.start, interval.length)),
]);
const modelManager = this._processor.modelManager;
modelManager.history.addAndRedo(new CreateRangePermissionHistoryItem(modelManager.modelManipulator, this._subDocument, new ConstRangePermission(coreInterval, userName, group)));
const rangePermission = findRangePermission(this._subDocument.rangePermissions, coreInterval, userName, group);
return this._getItem(rangePermission);
}
_getItem(coreItem) {
return new RangePermissionApi(this._processor, this._subDocument, coreItem);
}
_getCoreItems() {
return this._subDocument.rangePermissions;
}
}
function findByPosition(position, canBeUndefined, sourceCollection) {
return ListUtils.map(ApiParametersChecker.check(position, 1, canBeUndefined, [
ApiParametersChecker.numberDescriptor("position", (pos) => findRangePermissionsByIntervals(sourceCollection, [new FixedInterval(pos, 0)]), 0, Constants.MAX_SAFE_INTEGER),
ModelParametersChecker.intervalDescriptor("interval", (interval) => findRangePermissionsByIntervals(sourceCollection, [new FixedInterval(interval.start, interval.length)]), 0, Constants.MAX_SAFE_INTEGER),
ModelParametersChecker.intervalsDescriptor("intervals", (apiIntervals) => findRangePermissionsByIntervals(sourceCollection, ListUtils.map(apiIntervals, (interval) => new FixedInterval(interval.start, interval.length))), 0, Constants.MAX_SAFE_INTEGER)
]), (b) => b);
}
function findByUserName(value, permissions) {
return ListUtils.map(ApiParametersChecker.check(value, 1, true, [
ApiParametersChecker.stringDescriptor("userName", (userName) => findRangePermissions(permissions, permission => Comparers.stringIgnoreCase(permission.userName, userName) == 0), false),
ApiParametersChecker.regExpDescriptor('regexp', (regexp) => findRangePermissions(permissions, permission => regexp.test(permission.userName)))
]), (b) => b);
}
function findByGroup(value, permissions) {
return ListUtils.map(ApiParametersChecker.check(value, 1, true, [
ApiParametersChecker.stringDescriptor("group", (group) => findRangePermissions(permissions, permission => Comparers.stringIgnoreCase(permission.group, group) == 0), false),
ApiParametersChecker.regExpDescriptor('regexp', (regexp) => findRangePermissions(permissions, permission => regexp.test(permission.group)))
]), (b) => b);
}