@kids-reporter/draft-editor 0.4.8 → 0.4.10
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/block-renderer-fn.js +8 -1
- package/lib/block-renderers/embed-code.js +1 -0
- package/lib/buttons/blockquote.js +1 -1
- package/lib/buttons/bt-names.js +2 -1
- package/lib/buttons/form/array-field.js +30 -0
- package/lib/buttons/{select.js → form/select.js} +3 -3
- package/lib/buttons/image.js +1 -1
- package/lib/buttons/info-box.js +1 -1
- package/lib/buttons/news-reading.js +157 -0
- package/lib/buttons/slideshow.js +1 -1
- package/lib/draft-editor.js +13 -0
- package/package.json +3 -2
package/lib/block-renderer-fn.js
CHANGED
|
@@ -10,7 +10,8 @@ var _draftRenderer = require("@kids-reporter/draft-renderer");
|
|
|
10
10
|
const {
|
|
11
11
|
EmbeddedCodeInArticleBody,
|
|
12
12
|
ImageInArticleBody,
|
|
13
|
-
SlideshowInArticleBody
|
|
13
|
+
SlideshowInArticleBody,
|
|
14
|
+
NewsReading
|
|
14
15
|
} = _draftRenderer.blockRenderers;
|
|
15
16
|
const AtomicBlock = props => {
|
|
16
17
|
const entity = props.contentState.getEntity(props.block.getEntityAt(0));
|
|
@@ -43,6 +44,12 @@ const AtomicBlock = props => {
|
|
|
43
44
|
{
|
|
44
45
|
return (0, _infoBox.EditableInfoBox)(props);
|
|
45
46
|
}
|
|
47
|
+
case 'NEWS_READING':
|
|
48
|
+
{
|
|
49
|
+
return NewsReading({
|
|
50
|
+
data: entityData
|
|
51
|
+
});
|
|
52
|
+
}
|
|
46
53
|
}
|
|
47
54
|
return null;
|
|
48
55
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -8,7 +8,7 @@ exports.BlockquoteInput = BlockquoteInput;
|
|
|
8
8
|
var _react = _interopRequireWildcard(require("react"));
|
|
9
9
|
var _draftJs = require("draft-js");
|
|
10
10
|
var _modals = require("@keystone-ui/modals");
|
|
11
|
-
var _select = require("./select");
|
|
11
|
+
var _select = require("./form/select");
|
|
12
12
|
var _fields = require("@keystone-ui/fields");
|
|
13
13
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
14
14
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
package/lib/buttons/bt-names.js
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ArrayField = void 0;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _button = require("@keystone-ui/button");
|
|
9
|
+
var _fields = require("@keystone-ui/fields");
|
|
10
|
+
var _PlusCircleIcon = require("@keystone-ui/icons/icons/PlusCircleIcon");
|
|
11
|
+
var _core = require("@keystone-ui/core");
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
const ArrayField = function ({
|
|
14
|
+
label
|
|
15
|
+
}) {
|
|
16
|
+
return /*#__PURE__*/_react.default.createElement(_core.Stack, {
|
|
17
|
+
gap: "medium"
|
|
18
|
+
}, label && /*#__PURE__*/_react.default.createElement(_fields.FieldLabel, null, label), /*#__PURE__*/_react.default.createElement(_fields.TextInput, null), /*#__PURE__*/_react.default.createElement(_fields.TextInput, null), /*#__PURE__*/_react.default.createElement(_button.Button, {
|
|
19
|
+
onClick: () => {
|
|
20
|
+
//props.onChange([...props.elements.map(x => ({ key: x.key })), { key: undefined }]);
|
|
21
|
+
},
|
|
22
|
+
tone: "active"
|
|
23
|
+
}, /*#__PURE__*/_react.default.createElement(_core.Stack, {
|
|
24
|
+
gap: "small",
|
|
25
|
+
across: true
|
|
26
|
+
}, /*#__PURE__*/_react.default.createElement(_PlusCircleIcon.PlusCircleIcon, {
|
|
27
|
+
size: "smallish"
|
|
28
|
+
}), " ", /*#__PURE__*/_react.default.createElement("span", null, "Add"))));
|
|
29
|
+
};
|
|
30
|
+
exports.ArrayField = ArrayField;
|
|
@@ -8,7 +8,7 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
8
8
|
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
9
9
|
var _fields = require("@keystone-ui/fields");
|
|
10
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
const
|
|
11
|
+
const SelectBlock = _styledComponents.default.div`
|
|
12
12
|
margin: 10px 0;
|
|
13
13
|
`;
|
|
14
14
|
const Label = _styledComponents.default.label`
|
|
@@ -22,8 +22,8 @@ function Select({
|
|
|
22
22
|
options,
|
|
23
23
|
onChange
|
|
24
24
|
}) {
|
|
25
|
-
return /*#__PURE__*/_react.default.createElement(
|
|
26
|
-
htmlFor:
|
|
25
|
+
return /*#__PURE__*/_react.default.createElement(SelectBlock, null, /*#__PURE__*/_react.default.createElement(Label, {
|
|
26
|
+
htmlFor: title
|
|
27
27
|
}, title), /*#__PURE__*/_react.default.createElement(_fields.Select, {
|
|
28
28
|
value: options.find(option => option.value === value) || null,
|
|
29
29
|
options: options,
|
package/lib/buttons/image.js
CHANGED
|
@@ -45,7 +45,7 @@ function ImageButton(props) {
|
|
|
45
45
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, toShowImageSelector && /*#__PURE__*/_react.default.createElement(ImageSelector, {
|
|
46
46
|
onChange: onImageSelectorChange,
|
|
47
47
|
enableCaption: true,
|
|
48
|
-
enableUrl:
|
|
48
|
+
enableUrl: false,
|
|
49
49
|
enableAlignment: true
|
|
50
50
|
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
51
51
|
className: className,
|
package/lib/buttons/info-box.js
CHANGED
|
@@ -9,7 +9,7 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
9
9
|
var _btNames = _interopRequireDefault(require("./bt-names"));
|
|
10
10
|
var _draftJs = require("draft-js");
|
|
11
11
|
var _modals = require("@keystone-ui/modals");
|
|
12
|
-
var _select = require("./select");
|
|
12
|
+
var _select = require("./form/select");
|
|
13
13
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
14
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
15
15
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.NewsReadingButton = NewsReadingButton;
|
|
7
|
+
exports.NewsReadingInput = NewsReadingInput;
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _axios = _interopRequireDefault(require("axios"));
|
|
10
|
+
var _errors = _interopRequireDefault(require("@twreporter/errors"));
|
|
11
|
+
var _draftJs = require("draft-js");
|
|
12
|
+
var _modals = require("@keystone-ui/modals");
|
|
13
|
+
var _fields = require("@keystone-ui/fields");
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
16
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
17
|
+
// @ts-ignore pkg does not have definition
|
|
18
|
+
|
|
19
|
+
async function fetchNewsReadingGroup(itemId) {
|
|
20
|
+
var _res$data, _res$data2;
|
|
21
|
+
const query = `
|
|
22
|
+
query GetNewsReadingGroup($itemId: ID!){
|
|
23
|
+
newsReadingGroup(where: {id: $itemId}) {
|
|
24
|
+
items {
|
|
25
|
+
name
|
|
26
|
+
embedCode
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
`;
|
|
31
|
+
let res;
|
|
32
|
+
try {
|
|
33
|
+
res = await _axios.default.post('/api/graphql', {
|
|
34
|
+
query,
|
|
35
|
+
variables: {
|
|
36
|
+
itemId
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
} catch (err) {
|
|
40
|
+
const annotatedErr = _errors.default.helpers.annotateAxiosError(err);
|
|
41
|
+
throw annotatedErr;
|
|
42
|
+
}
|
|
43
|
+
if ((_res$data = res.data) !== null && _res$data !== void 0 && _res$data.errors) {
|
|
44
|
+
const annotatingError = _errors.default.helpers.wrap(new Error('Errors occured while executing `GetNewsReadingGroup` query'), 'GraphQLError', '`errors` returned in the GQL query response', {
|
|
45
|
+
errors: res.data.errors
|
|
46
|
+
});
|
|
47
|
+
throw annotatingError;
|
|
48
|
+
}
|
|
49
|
+
return (_res$data2 = res.data) === null || _res$data2 === void 0 || (_res$data2 = _res$data2.data) === null || _res$data2 === void 0 ? void 0 : _res$data2.newsReadingGroup;
|
|
50
|
+
}
|
|
51
|
+
function NewsReadingInput({
|
|
52
|
+
isOpen,
|
|
53
|
+
onConfirm,
|
|
54
|
+
onCancel,
|
|
55
|
+
inputValue
|
|
56
|
+
}) {
|
|
57
|
+
const [inputValueState, setInputValueState] = (0, _react.useState)(inputValue);
|
|
58
|
+
const [warning, setWarning] = (0, _react.useState)('');
|
|
59
|
+
const confirmInput = async () => {
|
|
60
|
+
try {
|
|
61
|
+
const newsReadingGroup = await fetchNewsReadingGroup(inputValueState);
|
|
62
|
+
onConfirm({
|
|
63
|
+
newsReadingGroupId: inputValueState,
|
|
64
|
+
newsReadingGroup
|
|
65
|
+
});
|
|
66
|
+
} catch (err) {
|
|
67
|
+
if (err instanceof Error) {
|
|
68
|
+
setWarning(_errors.default.helpers.printAll(err));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
setWarning(err);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
let warningJsx = null;
|
|
75
|
+
if (warning) {
|
|
76
|
+
warningJsx = /*#__PURE__*/_react.default.createElement(_modals.AlertDialog, {
|
|
77
|
+
isOpen: warning !== '',
|
|
78
|
+
title: `Something went wrong`,
|
|
79
|
+
actions: {
|
|
80
|
+
confirm: {
|
|
81
|
+
action: () => {
|
|
82
|
+
setWarning('');
|
|
83
|
+
},
|
|
84
|
+
label: 'Done'
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}, /*#__PURE__*/_react.default.createElement(_fields.TextArea, {
|
|
88
|
+
readOnly: true
|
|
89
|
+
}, warning));
|
|
90
|
+
}
|
|
91
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, warningJsx, /*#__PURE__*/_react.default.createElement(_modals.DrawerController, {
|
|
92
|
+
isOpen: isOpen
|
|
93
|
+
}, /*#__PURE__*/_react.default.createElement(_modals.Drawer, {
|
|
94
|
+
title: "\u8B80\u5831\u4E3B\u984C",
|
|
95
|
+
actions: {
|
|
96
|
+
cancel: {
|
|
97
|
+
label: 'Cancel',
|
|
98
|
+
action: onCancel
|
|
99
|
+
},
|
|
100
|
+
confirm: {
|
|
101
|
+
label: 'Confirm',
|
|
102
|
+
action: confirmInput
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}, /*#__PURE__*/_react.default.createElement(_fields.TextInput, {
|
|
106
|
+
onChange: e => {
|
|
107
|
+
setInputValueState(e.target.value);
|
|
108
|
+
},
|
|
109
|
+
placeholder: "News-readings-groups Item ID",
|
|
110
|
+
type: "text",
|
|
111
|
+
value: inputValueState
|
|
112
|
+
}))));
|
|
113
|
+
}
|
|
114
|
+
function NewsReadingButton(props) {
|
|
115
|
+
const {
|
|
116
|
+
onChange,
|
|
117
|
+
className,
|
|
118
|
+
editorState
|
|
119
|
+
} = props;
|
|
120
|
+
const [isInputOpen, setIsInputOpen] = (0, _react.useState)(false);
|
|
121
|
+
const promptForInput = () => {
|
|
122
|
+
setIsInputOpen(true);
|
|
123
|
+
};
|
|
124
|
+
const onInputChange = inputValue => {
|
|
125
|
+
var _inputValue$newsReadi;
|
|
126
|
+
const contentState = editorState.getCurrentContent();
|
|
127
|
+
const contentStateWithEntity = contentState.createEntity('NEWS_READING', 'IMMUTABLE', {
|
|
128
|
+
newsReadingGroupId: inputValue.newsReadingGroupId,
|
|
129
|
+
readings: (inputValue === null || inputValue === void 0 || (_inputValue$newsReadi = inputValue.newsReadingGroup) === null || _inputValue$newsReadi === void 0 ? void 0 : _inputValue$newsReadi.items) || []
|
|
130
|
+
});
|
|
131
|
+
const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
|
|
132
|
+
const newEditorState = _draftJs.EditorState.set(editorState, {
|
|
133
|
+
currentContent: contentStateWithEntity
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// The third parameter here is a space string, not an empty string
|
|
137
|
+
// If you set an empty string, you will get an error: Unknown DraftEntity key: null
|
|
138
|
+
onChange(_draftJs.AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' '));
|
|
139
|
+
setIsInputOpen(false);
|
|
140
|
+
};
|
|
141
|
+
const onInputCancel = () => {
|
|
142
|
+
setIsInputOpen(false);
|
|
143
|
+
};
|
|
144
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isInputOpen && /*#__PURE__*/_react.default.createElement(NewsReadingInput, {
|
|
145
|
+
isOpen: isInputOpen,
|
|
146
|
+
onConfirm: onInputChange,
|
|
147
|
+
onCancel: onInputCancel,
|
|
148
|
+
inputValue: ""
|
|
149
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
150
|
+
onClick: () => {
|
|
151
|
+
promptForInput();
|
|
152
|
+
},
|
|
153
|
+
className: className
|
|
154
|
+
}, /*#__PURE__*/_react.default.createElement("i", {
|
|
155
|
+
className: "far"
|
|
156
|
+
}), /*#__PURE__*/_react.default.createElement("span", null, "\u8B80\u5831")));
|
|
157
|
+
}
|
package/lib/buttons/slideshow.js
CHANGED
|
@@ -49,7 +49,7 @@ function SlideshowButton(props) {
|
|
|
49
49
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, toShowImageSelector && /*#__PURE__*/_react.default.createElement(ImageSelector, {
|
|
50
50
|
onChange: onImageSelectorChange,
|
|
51
51
|
enableCaption: true,
|
|
52
|
-
enableDelay:
|
|
52
|
+
enableDelay: false,
|
|
53
53
|
enableMultiSelect: true
|
|
54
54
|
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
55
55
|
className: className,
|
package/lib/draft-editor.js
CHANGED
|
@@ -22,6 +22,7 @@ var _image = require("./buttons/image");
|
|
|
22
22
|
var _link = require("./buttons/link");
|
|
23
23
|
var _slideshow = require("./buttons/slideshow");
|
|
24
24
|
var _imageSelector = require("./buttons/selector/image-selector");
|
|
25
|
+
var _newsReading = require("./buttons/news-reading");
|
|
25
26
|
var _blockRendererFn = require("./block-renderer-fn");
|
|
26
27
|
var _draftRenderer = require("@kids-reporter/draft-renderer");
|
|
27
28
|
var _annotation = require("./buttons/annotation");
|
|
@@ -79,6 +80,10 @@ const buttonStyle = (0, _styledComponents.css)`
|
|
|
79
80
|
return 'inline-flex';
|
|
80
81
|
}};
|
|
81
82
|
`;
|
|
83
|
+
|
|
84
|
+
// TODO: refactor custom button
|
|
85
|
+
// Refactoring goal is to avoid `styled()` on every button,
|
|
86
|
+
// which is tedious and duplicate.
|
|
82
87
|
const CustomButton = _styledComponents.default.div`
|
|
83
88
|
${buttonStyle}
|
|
84
89
|
`;
|
|
@@ -101,6 +106,9 @@ const CustomSlideshowButton = (0, _styledComponents.default)(_slideshow.Slidesho
|
|
|
101
106
|
const CustomEmbeddedCodeButton = (0, _styledComponents.default)(_embeddedCode.EmbeddedCodeButton)`
|
|
102
107
|
${buttonStyle}
|
|
103
108
|
`;
|
|
109
|
+
const CustomNewsReadingButton = (0, _styledComponents.default)(_newsReading.NewsReadingButton)`
|
|
110
|
+
${buttonStyle}
|
|
111
|
+
`;
|
|
104
112
|
const DraftEditorWrapper = _styledComponents.default.div`
|
|
105
113
|
/* Rich-editor default setting (.RichEditor-root)*/
|
|
106
114
|
background: #fff;
|
|
@@ -396,6 +404,11 @@ class RichTextEditor extends _react.default.Component {
|
|
|
396
404
|
editorState: editorState,
|
|
397
405
|
onChange: this.onChange,
|
|
398
406
|
readOnly: this.state.readOnly
|
|
407
|
+
}), /*#__PURE__*/_react.default.createElement(CustomNewsReadingButton, {
|
|
408
|
+
isDisabled: disabledButtons.includes(_btNames.default.newsReading),
|
|
409
|
+
editorState: editorState,
|
|
410
|
+
onChange: this.onChange,
|
|
411
|
+
readOnly: this.state.readOnly
|
|
399
412
|
}))), /*#__PURE__*/_react.default.createElement(TextEditorWrapper, {
|
|
400
413
|
onClick: () => {
|
|
401
414
|
if (this.editorRef) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kids-reporter/draft-editor",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.10",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
],
|
|
24
24
|
"license": "MIT",
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@kids-reporter/draft-renderer": "^0.4.
|
|
26
|
+
"@kids-reporter/draft-renderer": "^0.4.8",
|
|
27
|
+
"@twreporter/errors": "^1.1.2",
|
|
27
28
|
"draft-js": "^0.11.7"
|
|
28
29
|
},
|
|
29
30
|
"peerDependencies": {
|