@kids-reporter/draft-editor 0.4.9 → 0.4.11

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.
@@ -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
  };
@@ -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; }
@@ -25,6 +25,7 @@ var _default = {
25
25
  image: 'image',
26
26
  infoBox: 'info-box',
27
27
  link: 'link',
28
- slideshow: 'slideshow'
28
+ slideshow: 'slideshow',
29
+ newsReading: 'news-reading'
29
30
  };
30
31
  exports.default = _default;
@@ -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 TypeSelectBlock = _styledComponents.default.div`
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(TypeSelectBlock, null, /*#__PURE__*/_react.default.createElement(Label, {
26
- htmlFor: "infoBoxType"
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,
@@ -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
+ }
@@ -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.9",
3
+ "version": "0.4.11",
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.7",
26
+ "@kids-reporter/draft-renderer": "^0.4.9",
27
+ "@twreporter/errors": "^1.1.2",
27
28
  "draft-js": "^0.11.7"
28
29
  },
29
30
  "peerDependencies": {