@prisma-cms/editor
Version:
Editor for @prisma-cms
172 lines • 6.78 kB
JavaScript
;
/* eslint-disable @typescript-eslint/no-unused-vars */
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = __importStar(require("react"));
const prop_types_1 = __importDefault(require("prop-types"));
const draft_js_android_fix_1 = require("draft-js-android-fix");
const IconButton_1 = __importDefault(require("material-ui/IconButton"));
class ToggleBlockType extends react_1.Component {
constructor() {
super(...arguments);
this.toggleBlockType = () => {
const { onChange, editorState, blockType } = this.props;
const newState = draft_js_android_fix_1.RichUtils.toggleBlockType(editorState, blockType);
if (newState) {
onChange(newState);
}
};
}
getSelectionEntity(editorState) {
let entity;
const selection = editorState.getSelection();
let start = selection.getStartOffset();
let end = selection.getEndOffset();
if (start === end && start === 0) {
end = 1;
}
else if (start === end) {
start -= 1;
}
const block = this.getSelectedBlock(editorState);
for (let i = start; i < end; i += 1) {
const currentEntity = block.getEntityAt(i);
if (!currentEntity) {
entity = undefined;
break;
}
if (i === start) {
entity = currentEntity;
}
else if (entity !== currentEntity) {
entity = undefined;
break;
}
}
return entity;
}
getEntityRange(editorState, entityKey) {
const block = this.getSelectedBlock(editorState);
let entityRange;
block.findEntityRanges((value) => value.get('entity') === entityKey, (start, end) => {
entityRange = {
start,
end,
text: block.get('text').slice(start, end),
};
});
return entityRange;
}
getSelectedBlocksList(editorState) {
return this.getSelectedBlocksMap(editorState).toList();
}
/**
* Function returns the first selected block.
*/
getSelectedBlock(editorState) {
if (editorState) {
return this.getSelectedBlocksList(editorState).get(0);
}
return undefined;
}
getSelectedBlocksMap(editorState) {
const selectionState = editorState.getSelection();
const contentState = editorState.getCurrentContent();
const startKey = selectionState.getStartKey();
const endKey = selectionState.getEndKey();
const blockMap = contentState.getBlockMap();
return blockMap
.toSeq()
.skipUntil((_, k) => k === startKey)
.takeUntil((_, k) => k === endKey)
.concat([[endKey, blockMap.get(endKey)]]);
}
renderIcon() {
const { icon: Icon } = this.props;
return react_1.default.createElement(Icon, null);
}
isDisabled() {
const { disabled } = this.props;
return disabled || false;
}
isTextSelected() {
const { editorState } = this.props;
const selectionState = editorState.getSelection();
const textSelected = selectionState &&
selectionState.getEndOffset() - selectionState.getStartOffset() !== 0;
return textSelected;
}
getSelectionText(editorState) {
let selectedText = '';
const currentSelection = editorState.getSelection();
let start = currentSelection.getAnchorOffset();
let end = currentSelection.getFocusOffset();
const selectedBlocks = this.getSelectedBlocksList(editorState);
if (selectedBlocks.size > 0) {
if (currentSelection.getIsBackward()) {
const temp = start;
start = end;
end = temp;
}
for (let i = 0; i < selectedBlocks.size; i += 1) {
const blockStart = i === 0 ? start : 0;
const blockEnd = i === selectedBlocks.size - 1
? end
: selectedBlocks.get(i).getText().length;
selectedText += selectedBlocks
.get(i)
.getText()
.slice(blockStart, blockEnd);
}
}
return selectedText;
}
render() {
const _a = this.props, { editorState, onChange, blockType, icon, disabled } = _a, other = __rest(_a, ["editorState", "onChange", "blockType", "icon", "disabled"]);
return (react_1.default.createElement(IconButton_1.default, Object.assign({ onClick: this.toggleBlockType, disabled: this.isDisabled() }, other), this.renderIcon()));
}
}
ToggleBlockType.propTypes = {
onChange: prop_types_1.default.func.isRequired,
editorState: prop_types_1.default.object.isRequired,
blockType: prop_types_1.default.string.isRequired,
icon: prop_types_1.default.func.isRequired,
};
exports.default = ToggleBlockType;
//# sourceMappingURL=index.js.map