@kids-reporter/draft-editor 1.0.5 → 1.0.6
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/lib/buttons/anchor.js +29 -18
- package/lib/draft-editor.js +1 -1
- package/lib/entity-decorators/anchor.js +26 -11
- package/package.json +1 -1
package/lib/buttons/anchor.js
CHANGED
|
@@ -4,10 +4,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.AnchorButton = void 0;
|
|
7
|
-
var _react =
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _draftJs = require("draft-js");
|
|
9
9
|
var _draftRenderer = require("@kids-reporter/draft-renderer");
|
|
10
|
-
|
|
10
|
+
var _anchor = require("../entity-decorators/anchor");
|
|
11
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
12
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
11
13
|
const AnchorButton = props => {
|
|
12
14
|
const toggleEntity = _draftJs.RichUtils.toggleLink;
|
|
13
15
|
const {
|
|
@@ -15,36 +17,45 @@ const AnchorButton = props => {
|
|
|
15
17
|
editorState,
|
|
16
18
|
onChange
|
|
17
19
|
} = props;
|
|
20
|
+
const [isEditorOpen, setIsEditorOpen] = (0, _react.useState)(false);
|
|
18
21
|
const promptForAnchor = e => {
|
|
19
22
|
e.preventDefault();
|
|
20
23
|
const selection = editorState.getSelection();
|
|
21
24
|
if (!selection.isCollapsed()) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const block = contentState.getBlockForKey(startKey);
|
|
25
|
-
const start = selection.getStartOffset();
|
|
26
|
-
const end = selection.getEndOffset();
|
|
27
|
-
const selectedText = block.getText().slice(start, end);
|
|
28
|
-
const contentStateWithEntity = contentState.createEntity(_draftRenderer.ENTITY.Anchor, 'MUTABLE', {
|
|
29
|
-
anchorID: selectedText
|
|
30
|
-
});
|
|
31
|
-
const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
|
|
32
|
-
const newEditorState = _draftJs.EditorState.set(editorState, {
|
|
33
|
-
currentContent: contentStateWithEntity
|
|
34
|
-
});
|
|
35
|
-
onChange(toggleEntity(newEditorState, newEditorState.getSelection(), entityKey));
|
|
25
|
+
props.onEditStart();
|
|
26
|
+
setIsEditorOpen(true);
|
|
36
27
|
}
|
|
37
28
|
};
|
|
29
|
+
const confirmAnchor = anchorID => {
|
|
30
|
+
const contentState = editorState.getCurrentContent();
|
|
31
|
+
const contentStateWithEntity = contentState.createEntity(_draftRenderer.ENTITY.Anchor, 'MUTABLE', {
|
|
32
|
+
anchorID: anchorID
|
|
33
|
+
});
|
|
34
|
+
const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
|
|
35
|
+
const newEditorState = _draftJs.EditorState.set(editorState, {
|
|
36
|
+
currentContent: contentStateWithEntity
|
|
37
|
+
});
|
|
38
|
+
onChange(toggleEntity(newEditorState, newEditorState.getSelection(), entityKey));
|
|
39
|
+
setIsEditorOpen(false);
|
|
40
|
+
props.onEditFinish();
|
|
41
|
+
};
|
|
38
42
|
const removeAnchor = () => {
|
|
39
43
|
const selection = editorState.getSelection();
|
|
40
44
|
if (!selection.isCollapsed()) {
|
|
41
45
|
onChange(toggleEntity(editorState, selection, null));
|
|
42
46
|
}
|
|
47
|
+
setIsEditorOpen(false);
|
|
48
|
+
props.onEditFinish();
|
|
43
49
|
};
|
|
44
|
-
return /*#__PURE__*/_react.default.createElement(
|
|
50
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isEditorOpen && /*#__PURE__*/_react.default.createElement(_anchor.AnchorIDEditor, {
|
|
51
|
+
isOpen: isEditorOpen,
|
|
52
|
+
anchorIDValue: '',
|
|
53
|
+
onConfirm: confirmAnchor,
|
|
54
|
+
onCancel: removeAnchor
|
|
55
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
45
56
|
className: props.className,
|
|
46
57
|
onMouseDown: isActive ? removeAnchor : promptForAnchor,
|
|
47
58
|
title: "\u9328\u9EDE"
|
|
48
|
-
}, /*#__PURE__*/_react.default.createElement("span", null, "\u9328"));
|
|
59
|
+
}, /*#__PURE__*/_react.default.createElement("span", null, "\u9328")));
|
|
49
60
|
};
|
|
50
61
|
exports.AnchorButton = AnchorButton;
|
package/lib/draft-editor.js
CHANGED
|
@@ -210,7 +210,7 @@ class RichTextEditor extends _react.default.Component {
|
|
|
210
210
|
}, commonProps)), /*#__PURE__*/_react.default.createElement(_buttons.CustomAnchorButton, _extends({
|
|
211
211
|
isDisabled: disabledButtons.includes(_btNames.default.anchor),
|
|
212
212
|
isActive: entityType === _draftRenderer.ENTITY.Anchor
|
|
213
|
-
}, commonProps)), /*#__PURE__*/_react.default.createElement(_buttons.CustomLinkButton, _extends({
|
|
213
|
+
}, commonProps, this.commonEditProps)), /*#__PURE__*/_react.default.createElement(_buttons.CustomLinkButton, _extends({
|
|
214
214
|
isDisabled: disabledButtons.includes(_btNames.default.link),
|
|
215
215
|
isActive: entityType === _draftRenderer.ENTITY.Link
|
|
216
216
|
}, commonProps, this.commonEditProps)), /*#__PURE__*/_react.default.createElement(_buttons.CustomBackgroundColorButton, _extends({
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.editableAnchorDecorator = void 0;
|
|
6
|
+
exports.editableAnchorDecorator = exports.AnchorIDEditor = void 0;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
9
9
|
var _modals = require("@keystone-ui/modals");
|
|
@@ -35,14 +35,22 @@ const Warning = _styledComponents.default.p`
|
|
|
35
35
|
const StyledTextInput = (0, _styledComponents.default)(_fields.TextInput)`
|
|
36
36
|
margin: 10px;
|
|
37
37
|
`;
|
|
38
|
-
const
|
|
38
|
+
const AnchorIDEditor = props => {
|
|
39
39
|
const {
|
|
40
40
|
isOpen,
|
|
41
|
-
|
|
41
|
+
anchorIDValue,
|
|
42
42
|
onConfirm,
|
|
43
43
|
onCancel
|
|
44
44
|
} = props;
|
|
45
|
-
const [
|
|
45
|
+
const [anchorID, setAnchorID] = (0, _react.useState)(anchorIDValue);
|
|
46
|
+
const [msg, setMsg] = (0, _react.useState)('');
|
|
47
|
+
|
|
48
|
+
// Restrict id format
|
|
49
|
+
// ref: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id
|
|
50
|
+
const isValidID = id => {
|
|
51
|
+
const idRex = /^[A-Za-z][\w-]*$/;
|
|
52
|
+
return idRex.test(id);
|
|
53
|
+
};
|
|
46
54
|
return /*#__PURE__*/_react.default.createElement(_modals.AlertDialog, {
|
|
47
55
|
title: "\u7DE8\u8F2F\u9328\u9EDE\u6587\u5B57(ID)",
|
|
48
56
|
isOpen: isOpen,
|
|
@@ -53,16 +61,23 @@ const AnchorLabelEditor = props => {
|
|
|
53
61
|
},
|
|
54
62
|
confirm: {
|
|
55
63
|
label: 'Confirm',
|
|
56
|
-
action: () =>
|
|
64
|
+
action: () => {
|
|
65
|
+
if (isValidID(anchorID)) {
|
|
66
|
+
onConfirm(anchorID);
|
|
67
|
+
} else {
|
|
68
|
+
setMsg('ID格式錯誤!');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
57
71
|
}
|
|
58
72
|
}
|
|
59
|
-
}, /*#__PURE__*/_react.default.createElement(Warning, null, "\u6CE8\u610F\uFF01\u540C\u7BC7\u6587\u7AE0ID\u4E0D\u53EF\u91CD\u8907\
|
|
73
|
+
}, /*#__PURE__*/_react.default.createElement(Warning, null, "\u6CE8\u610F\uFF01\u540C\u7BC7\u6587\u7AE0ID\u4E0D\u53EF\u91CD\u8907\uFF01ID\u9700\u4F7F\u7528\u534A\u578B\u82F1\u6587\u5B57\u6BCD(\u5927/\u5C0F\u5BEB)\u958B\u982D\uFF0C\u63A5\u7E8C \u82F1\u6587\u5B57\u6BCD/\u6578\u5B57/-/_"), /*#__PURE__*/_react.default.createElement("p", null, "\u7BC4\u4F8B: part1, Section-234, table_5"), /*#__PURE__*/_react.default.createElement(StyledTextInput, {
|
|
60
74
|
placeholder: "\u9328\u9EDE\u6587\u5B57(ID)",
|
|
61
75
|
type: "text",
|
|
62
|
-
value:
|
|
63
|
-
onChange: e =>
|
|
64
|
-
}));
|
|
76
|
+
value: anchorID,
|
|
77
|
+
onChange: e => setAnchorID(e.target.value)
|
|
78
|
+
}), msg && /*#__PURE__*/_react.default.createElement(Warning, null, msg));
|
|
65
79
|
};
|
|
80
|
+
exports.AnchorIDEditor = AnchorIDEditor;
|
|
66
81
|
const EditableAnchor = props => {
|
|
67
82
|
var _contentState$getEnti;
|
|
68
83
|
const {
|
|
@@ -87,9 +102,9 @@ const EditableAnchor = props => {
|
|
|
87
102
|
}
|
|
88
103
|
});
|
|
89
104
|
};
|
|
90
|
-
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isModalOpen && /*#__PURE__*/_react.default.createElement(
|
|
105
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isModalOpen && /*#__PURE__*/_react.default.createElement(AnchorIDEditor, {
|
|
91
106
|
isOpen: isModalOpen,
|
|
92
|
-
|
|
107
|
+
anchorIDValue: anchorID,
|
|
93
108
|
onConfirm: onAnchorIDChange,
|
|
94
109
|
onCancel: () => {
|
|
95
110
|
setIsModalOpen(false);
|