@pie-lib/editable-html 11.0.10-next.0 → 11.1.0

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/CHANGELOG.json CHANGED
@@ -3323,5 +3323,20 @@
3323
3323
  "committerDate": "2021-11-12 13:23:37 +0200",
3324
3324
  "isTagged": true,
3325
3325
  "tag": "@pie-lib/editable-html@7.18.0"
3326
+ },
3327
+ {
3328
+ "type": "feat",
3329
+ "scope": null,
3330
+ "subject": "made sure editor is waiting for image and sound upload before finishes editing PD-2950 (#948)",
3331
+ "merge": null,
3332
+ "header": "feat: made sure editor is waiting for image and sound upload before finishes editing PD-2950 (#948)",
3333
+ "body": "feat: made sure editor is waiting for image and sound upload before finishes editing PD-2950",
3334
+ "footer": null,
3335
+ "notes": [],
3336
+ "hash": "bd16707f13f824dfe2c2db7f395e58fa25eb2ffb",
3337
+ "gitTags": " (origin/develop, origin/HEAD, develop)",
3338
+ "committerDate": "2023-10-16 11:14:31 +0300",
3339
+ "isTagged": true,
3340
+ "tag": "@pie-lib/editable-html@11.1.0"
3326
3341
  }
3327
3342
  ]
package/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [11.1.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/editable-html@11.0.9...@pie-lib/editable-html@11.1.0) (2023-10-16)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * made sure editor is waiting for image and sound upload before finishes editing PD-2950 ([41b9407](https://github.com/pie-framework/pie-lib/commit/41b94078da7c50ce8d36fdc67bda83a44e0bff9b))
12
+
13
+
14
+ ### Features
15
+
16
+ * made sure editor is waiting for image and sound upload before finishes editing PD-2950 ([#948](https://github.com/pie-framework/pie-lib/issues/948)) ([bd16707](https://github.com/pie-framework/pie-lib/commit/bd16707f13f824dfe2c2db7f395e58fa25eb2ffb))
17
+
18
+
19
+
20
+
21
+
6
22
  ## [11.0.9](https://github.com/pie-framework/pie-lib/compare/@pie-lib/editable-html@11.0.8...@pie-lib/editable-html@11.0.9) (2023-10-16)
7
23
 
8
24
 
package/lib/editor.js CHANGED
@@ -25,6 +25,8 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
25
25
 
26
26
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
27
27
 
28
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
29
+
28
30
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
29
31
 
30
32
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
@@ -161,15 +163,46 @@ var Editor = /*#__PURE__*/function (_React$Component) {
161
163
  done(e, _this.state.value);
162
164
  });
163
165
  },
164
- insertImageRequested: props.imageSupport && function (getHandler) {
165
- /**
166
- * The handler is the object through which the outer context
167
- * communicates file upload events like: fileChosen, cancel, progress
168
- */
169
- var handler = getHandler(function () {
170
- return _this.state.value;
171
- });
172
- props.imageSupport.add(handler);
166
+ insertImageRequested: props.imageSupport && function (addedImage, getHandler) {
167
+ var pendingImages = _this.state.pendingImages;
168
+
169
+ var onFinish = function onFinish(result) {
170
+ var cb;
171
+
172
+ if (_this.state.scheduled && result) {
173
+ // finish editing only on success
174
+ cb = _this.onEditingDone.bind((0, _assertThisInitialized2["default"])(_this));
175
+ }
176
+
177
+ var newPendingImages = _this.state.pendingImages.filter(function (img) {
178
+ return img.key !== addedImage.key;
179
+ });
180
+
181
+ var newState = {
182
+ pendingImages: newPendingImages
183
+ };
184
+
185
+ if (newPendingImages.length === 0) {
186
+ newState.scheduled = false;
187
+ }
188
+
189
+ _this.setState(newState, cb);
190
+ };
191
+
192
+ var callback = function callback() {
193
+ /**
194
+ * The handler is the object through which the outer context
195
+ * communicates file upload events like: fileChosen, cancel, progress
196
+ */
197
+ var handler = getHandler(onFinish, function () {
198
+ return _this.state.value;
199
+ });
200
+ props.imageSupport.add(handler);
201
+ };
202
+
203
+ _this.setState({
204
+ pendingImages: [].concat((0, _toConsumableArray2["default"])(pendingImages), [addedImage])
205
+ }, callback);
173
206
  },
174
207
  onFocus: _this.onPluginFocus,
175
208
  onBlur: _this.onPluginBlur,
@@ -298,9 +331,20 @@ var Editor = /*#__PURE__*/function (_React$Component) {
298
331
  return;
299
332
  }
300
333
 
334
+ var pendingImages = _this.state.pendingImages;
335
+
336
+ if (pendingImages.length) {
337
+ _this.setState({
338
+ scheduled: true
339
+ });
340
+
341
+ return;
342
+ }
343
+
301
344
  log('[onEditingDone]');
302
345
 
303
346
  _this.setState({
347
+ pendingImages: [],
304
348
  stashedValue: null,
305
349
  focusedNode: null
306
350
  });
@@ -621,7 +665,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
621
665
 
622
666
  _this.onChange(ch);
623
667
 
624
- handler = new _insertImageHandler["default"](inline, function () {
668
+ handler = new _insertImageHandler["default"](inline, function () {}, function () {
625
669
  return _this.state.value;
626
670
  }, _this.onChange, true);
627
671
  handler.fileChosen(file);
@@ -719,6 +763,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
719
763
  _this.state = {
720
764
  value: _props.value,
721
765
  toolbarOpts: createToolbarOpts(_props.toolbarOpts, _props.error),
766
+ pendingImages: [],
722
767
  isHtmlMode: false,
723
768
  isEdited: false,
724
769
  dialog: {
@@ -852,10 +897,11 @@ var Editor = /*#__PURE__*/function (_React$Component) {
852
897
  value = _this$state3.value,
853
898
  focusedNode = _this$state3.focusedNode,
854
899
  toolbarOpts = _this$state3.toolbarOpts,
855
- dialog = _this$state3.dialog;
900
+ dialog = _this$state3.dialog,
901
+ scheduled = _this$state3.scheduled;
856
902
  log('[render] value: ', value);
857
903
  var sizeStyle = this.buildSizeStyle();
858
- var names = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, classes.withBg, highlightShape), (0, _defineProperty2["default"])(_classNames, classes.toolbarOnTop, toolbarOpts.alwaysVisible && toolbarOpts.position === 'top'), _classNames), className);
904
+ var names = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, classes.withBg, highlightShape), (0, _defineProperty2["default"])(_classNames, classes.toolbarOnTop, toolbarOpts.alwaysVisible && toolbarOpts.position === 'top'), (0, _defineProperty2["default"])(_classNames, classes.scheduled, scheduled), _classNames), className);
859
905
  return /*#__PURE__*/_react["default"].createElement("div", {
860
906
  ref: function ref(_ref2) {
861
907
  return _this3.wrapperRef = _ref2;
@@ -864,7 +910,9 @@ var Editor = /*#__PURE__*/function (_React$Component) {
864
910
  width: sizeStyle.width
865
911
  },
866
912
  className: names
867
- }, /*#__PURE__*/_react["default"].createElement(_slateReact.Editor, {
913
+ }, scheduled && /*#__PURE__*/_react["default"].createElement("div", {
914
+ className: classes.uploading
915
+ }, "Uploading image and then saving..."), /*#__PURE__*/_react["default"].createElement(_slateReact.Editor, {
868
916
  plugins: this.plugins,
869
917
  innerRef: function innerRef(r) {
870
918
  if (r) {
@@ -1006,6 +1054,17 @@ var styles = {
1006
1054
  withBg: {
1007
1055
  backgroundColor: 'rgba(0,0,0,0.06)'
1008
1056
  },
1057
+ scheduled: {
1058
+ opacity: 0.5,
1059
+ pointerEvents: 'none',
1060
+ position: 'relative'
1061
+ },
1062
+ uploading: {
1063
+ position: 'absolute',
1064
+ top: '50%',
1065
+ left: '50%',
1066
+ transform: 'translate(-50%, -50%)'
1067
+ },
1009
1068
  slateEditor: {
1010
1069
  fontFamily: 'Roboto, sans-serif',
1011
1070
  '& table': {
package/lib/editor.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/editor.jsx"],"names":["log","defaultToolbarOpts","position","alignment","alwaysVisible","showDone","doneOn","defaultResponseAreaProps","options","respAreaToolbar","onHandleAreaChange","defaultLanguageCharactersProps","createToolbarOpts","toolbarOpts","error","isHtmlMode","Editor","props","open","extraDialogProps","callback","setState","dialog","isEdited","prevState","state","newToolbarOpts","normalizedResponseAreaProps","responseAreaProps","htmlPluginOpts","toggleHtmlMode","handleAlertDialog","plugins","activePlugins","math","onClick","onMathClick","onFocus","onPluginFocus","onBlur","onPluginBlur","mathMlOptions","html","image","disableImageAlignmentButtons","onDelete","imageSupport","src","done","e","value","insertImageRequested","getHandler","handler","add","maxImageWidth","maxImageHeight","toolbar","disableScrollbar","disableUnderline","autoWidth","autoWidthToolbar","onDone","nonEmpty","toolbarInFocus","focusedNode","editor","blur","startText","text","length","resetValue","then","onEditingDone","table","responseArea","type","maxResponseAreas","languageCharacters","languageCharactersProps","media","focus","createChange","change","onChange","uploadSoundSupport","mmlOutput","mmlEditing","runSerializationOnMarkup","relatedTarget","target","node","stashedValue","stashValue","c","collapseToStartOf","selectedNode","resolve","event","Promise","preBlurValue","handleBlur","bind","editorDOM","document","querySelector","key","setTimeout","stateValue","wrapperRef","editorElement","activeElement","closest","className","toolbarElement","toolbarRef","isInCurrentComponent","contains","removeEventListener","handleDomBlur","isFocused","__TEMPORARY_CHANGE_DATA","data","domEl","setNodeByKey","addEventListener","force","stopReset","reduce","s","p","toObject","newValue","Value","fromJSON","toJSON","charactersLimit","v","endsWith","undefined","parseInt","isNaN","object","last","nodes","parent","getParent","Block","pos","dropContext","transfer","file","files","fragment","inline","Inline","create","isVoid","loading","range","select","ch","insertInline","InsertImageHandler","fileChosen","insertFragment","selection","startBlock","defaultBlock","defaultMarks","getInsertMarksAtRange","frag","Plain","deserialize","placeholder","size","display","width","maxWidth","whiteSpace","opacity","pointerEvents","userSelect","onResize","handlePlugins","onRef","window","autoFocus","nextProps","differentCharacterProps","differentMathMlProps","equals","prevProps","zeroWidthEls","querySelectorAll","Array","from","forEach","el","style","minWidth","minHeight","height","maxHeight","valueToSize","disabled","spellCheck","highlightShape","classes","pluginProps","onKeyDown","sizeStyle","buildSizeStyle","names","withBg","toolbarOnTop","ref","r","slateEditor","editorRef","getFocusedValue","onDropPaste","normalize","noPadding","noBorder","renderPlaceholder","changeData","title","onClose","onConfirm","React","Component","PropTypes","bool","func","isRequired","any","SlateTypes","shape","number","oneOfType","string","oneOf","arrayOf","language","characterIcon","characters","values","allValid","every","ALL_PLUGINS","includes","Error","join","styles","backgroundColor","fontFamily","tableLayout","borderCollapse","color","background","borderTop","padding","textAlign","border","marginTop"],"mappings":"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","sourcesContent":["import { Editor as SlateEditor, findNode, getEventRange, getEventTransfer } from 'slate-react';\nimport SlateTypes from 'slate-prop-types';\n\nimport isEqual from 'lodash/isEqual';\nimport * as serialization from './serialization';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport { Value, Block, Inline } from 'slate';\nimport { buildPlugins, ALL_PLUGINS, DEFAULT_PLUGINS } from './plugins';\nimport debug from 'debug';\nimport { withStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport { color } from '@pie-lib/render-ui';\nimport Plain from 'slate-plain-serializer';\nimport { AlertDialog } from '@pie-lib/config-ui';\n\nimport { getBase64 } from './serialization';\nimport InsertImageHandler from './plugins/image/insert-image-handler';\n\nexport { ALL_PLUGINS, DEFAULT_PLUGINS, serialization };\n\nconst log = debug('editable-html:editor');\n\nconst defaultToolbarOpts = {\n position: 'bottom',\n alignment: 'left',\n alwaysVisible: false,\n showDone: true,\n doneOn: 'blur',\n};\n\nconst defaultResponseAreaProps = {\n options: {},\n respAreaToolbar: () => {},\n onHandleAreaChange: () => {},\n};\n\nconst defaultLanguageCharactersProps = [];\n\nconst createToolbarOpts = (toolbarOpts, error, isHtmlMode) => {\n return {\n ...defaultToolbarOpts,\n ...toolbarOpts,\n error,\n isHtmlMode,\n };\n};\n\nexport class Editor extends React.Component {\n static propTypes = {\n autoFocus: PropTypes.bool,\n editorRef: PropTypes.func.isRequired,\n error: PropTypes.any,\n onRef: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func,\n onKeyDown: PropTypes.func,\n focus: PropTypes.func.isRequired,\n value: SlateTypes.value.isRequired,\n imageSupport: PropTypes.object,\n mathMlOptions: PropTypes.shape({\n mmlOutput: PropTypes.bool,\n mmlEditing: PropTypes.bool,\n }),\n disableImageAlignmentButtons: PropTypes.bool,\n uploadSoundSupport: PropTypes.shape({\n add: PropTypes.func,\n delete: PropTypes.func,\n }),\n charactersLimit: PropTypes.number,\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n minHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n maxHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n classes: PropTypes.object.isRequired,\n highlightShape: PropTypes.bool,\n disabled: PropTypes.bool,\n spellCheck: PropTypes.bool,\n nonEmpty: PropTypes.bool,\n disableScrollbar: PropTypes.bool,\n disableUnderline: PropTypes.bool,\n autoWidthToolbar: PropTypes.bool,\n pluginProps: PropTypes.any,\n placeholder: PropTypes.string,\n responseAreaProps: PropTypes.shape({\n type: PropTypes.oneOf(['explicit-constructed-response', 'inline-dropdown', 'drag-in-the-blank']),\n options: PropTypes.object,\n respAreaToolbar: PropTypes.func,\n onHandleAreaChange: PropTypes.func,\n }),\n languageCharactersProps: PropTypes.arrayOf(\n PropTypes.shape({\n language: PropTypes.string,\n characterIcon: PropTypes.string,\n characters: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)),\n }),\n ),\n runSerializationOnMarkup: PropTypes.func,\n toolbarOpts: PropTypes.shape({\n position: PropTypes.oneOf(['bottom', 'top']),\n alignment: PropTypes.oneOf(['left', 'right']),\n alwaysVisible: PropTypes.bool,\n showDone: PropTypes.bool,\n doneOn: PropTypes.string,\n }),\n activePlugins: PropTypes.arrayOf((values) => {\n const allValid = values.every((v) => ALL_PLUGINS.includes(v));\n\n return !allValid && new Error(`Invalid values: ${values}, values must be one of [${ALL_PLUGINS.join(',')}]`);\n }),\n className: PropTypes.string,\n maxImageWidth: PropTypes.number,\n maxImageHeight: PropTypes.number,\n };\n\n static defaultProps = {\n disableUnderline: true,\n onFocus: () => {},\n onBlur: () => {},\n onKeyDown: () => {},\n runSerializationOnMarkup: () => {},\n mathMlOptions: {\n mmlOutput: false,\n mmlEditing: false,\n },\n toolbarOpts: defaultToolbarOpts,\n responseAreaProps: defaultResponseAreaProps,\n languageCharactersProps: defaultLanguageCharactersProps,\n };\n\n constructor(props) {\n super(props);\n this.state = {\n value: props.value,\n toolbarOpts: createToolbarOpts(props.toolbarOpts, props.error),\n isHtmlMode: false,\n isEdited: false,\n dialog: {\n open: false,\n },\n };\n\n this.toggleHtmlMode = this.toggleHtmlMode.bind(this);\n\n this.onResize = () => {\n props.onChange(this.state.value, true);\n };\n\n this.handlePlugins(this.props);\n }\n\n handleAlertDialog = (open, extraDialogProps, callback) => {\n this.setState(\n {\n dialog: {\n open,\n ...extraDialogProps,\n },\n isEdited: false,\n },\n callback,\n );\n };\n\n toggleHtmlMode = () => {\n this.setState(\n (prevState) => ({\n isHtmlMode: !prevState.isHtmlMode,\n }),\n () => {\n const { error } = this.props;\n const { toolbarOpts } = this.state;\n const newToolbarOpts = createToolbarOpts(toolbarOpts, error, this.state.isHtmlMode);\n this.setState({\n toolbarOpts: newToolbarOpts,\n });\n },\n );\n };\n\n handlePlugins = (props) => {\n const normalizedResponseAreaProps = {\n ...defaultResponseAreaProps,\n ...props.responseAreaProps,\n };\n\n const htmlPluginOpts = {\n isHtmlMode: this.state.isHtmlMode,\n isEdited: this.state.isEdited,\n toggleHtmlMode: this.toggleHtmlMode,\n handleAlertDialog: this.handleAlertDialog,\n };\n\n this.plugins = buildPlugins(props.activePlugins, {\n math: {\n onClick: this.onMathClick,\n onFocus: this.onPluginFocus,\n onBlur: this.onPluginBlur,\n ...props.mathMlOptions,\n },\n html: htmlPluginOpts,\n image: {\n disableImageAlignmentButtons: props.disableImageAlignmentButtons,\n onDelete:\n props.imageSupport &&\n props.imageSupport.delete &&\n ((src, done) => {\n props.imageSupport.delete(src, (e) => {\n done(e, this.state.value);\n });\n }),\n insertImageRequested:\n props.imageSupport &&\n ((getHandler) => {\n /**\n * The handler is the object through which the outer context\n * communicates file upload events like: fileChosen, cancel, progress\n */\n const handler = getHandler(() => this.state.value);\n props.imageSupport.add(handler);\n }),\n onFocus: this.onPluginFocus,\n onBlur: this.onPluginBlur,\n maxImageWidth: this.props.maxImageWidth,\n maxImageHeight: this.props.maxImageHeight,\n },\n toolbar: {\n /**\n * To minimize converting html -> state -> html\n * We only emit markup once 'done' is clicked.\n */\n disableScrollbar: !!props.disableScrollbar,\n disableUnderline: props.disableUnderline,\n autoWidth: props.autoWidthToolbar,\n onDone: () => {\n const { nonEmpty } = props;\n\n log('[onDone]');\n this.setState({ toolbarInFocus: false, focusedNode: null });\n this.editor.blur();\n\n if (nonEmpty && this.state.value.startText?.text?.length === 0) {\n this.resetValue(true).then(() => {\n this.onEditingDone();\n });\n } else {\n this.onEditingDone();\n }\n },\n },\n table: {\n onFocus: () => {\n log('[table:onFocus]...');\n this.onPluginFocus();\n },\n onBlur: () => {\n log('[table:onBlur]...');\n this.onPluginBlur();\n },\n },\n responseArea: {\n type: normalizedResponseAreaProps.type,\n options: normalizedResponseAreaProps.options,\n maxResponseAreas: normalizedResponseAreaProps.maxResponseAreas,\n respAreaToolbar: normalizedResponseAreaProps.respAreaToolbar,\n onHandleAreaChange: normalizedResponseAreaProps.onHandleAreaChange,\n error: normalizedResponseAreaProps.error,\n onFocus: () => {\n log('[table:onFocus]...');\n this.onPluginFocus();\n },\n onBlur: () => {\n log('[table:onBlur]...');\n this.onPluginBlur();\n },\n },\n languageCharacters: props.languageCharactersProps,\n media: {\n focus: this.focus,\n createChange: () => this.state.value.change(),\n onChange: this.onChange,\n uploadSoundSupport: props.uploadSoundSupport,\n },\n });\n\n if (props.mathMlOptions.mmlOutput || props.mathMlOptions.mmlEditing) {\n this.props.runSerializationOnMarkup();\n }\n };\n\n componentDidMount() {\n // onRef is needed to get the ref of the component because we export it using withStyles\n this.props.onRef(this);\n\n window.addEventListener('resize', this.onResize);\n\n if (this.editor && this.props.autoFocus) {\n Promise.resolve().then(() => {\n if (this.editor) {\n const editorDOM = document.querySelector(`[data-key=\"${this.editor.value.document.key}\"]`);\n\n this.editor.focus();\n\n if (editorDOM) {\n editorDOM.focus();\n }\n }\n });\n }\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n const { isHtmlMode, toolbarOpts } = this.state;\n const newToolbarOpts = createToolbarOpts(nextProps.toolbarOpts, nextProps.error, isHtmlMode);\n\n if (!isEqual(newToolbarOpts, toolbarOpts)) {\n this.setState({\n toolbarOpts: newToolbarOpts,\n });\n }\n\n const differentCharacterProps = !isEqual(nextProps.languageCharactersProps, this.props.languageCharactersProps);\n const differentMathMlProps = !isEqual(nextProps.mathMlOptions, this.props.mathMlOptions);\n\n if (differentCharacterProps || differentMathMlProps) {\n this.handlePlugins(nextProps);\n }\n\n if (!nextProps.value?.document?.equals(this.props.value?.document)) {\n this.setState({\n focus: false,\n value: nextProps.value,\n });\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // The cursor is on a zero width element and when that is placed near void elements, it is not visible\n // so we increase the width to at least 2px in order for the user to see it\n\n // Trigger plugins and finish editing if:\n // 1. The 'isHtmlMode' state has been toggled.\n // 2. We're currently in 'isHtmlMode' and the editor value has been modified.\n if (\n this.state.isHtmlMode !== prevState.isHtmlMode ||\n (this.state.isHtmlMode && !prevState.isEdited && this.state.isEdited)\n ) {\n this.handlePlugins(this.props);\n this.onEditingDone();\n }\n\n const zeroWidthEls = document.querySelectorAll('[data-slate-zero-width=\"z\"]');\n\n Array.from(zeroWidthEls).forEach((el) => {\n el.style.minWidth = '2px';\n el.style.display = 'inline-block';\n });\n }\n\n onPluginBlur = (e) => {\n log('[onPluginBlur]', e && e.relatedTarget);\n const target = e && e.relatedTarget;\n\n const node = target ? findNode(target, this.state.value) : null;\n log('[onPluginBlur] node: ', node);\n this.setState({ focusedNode: node }, () => {\n this.resetValue();\n });\n };\n\n onPluginFocus = (e) => {\n log('[onPluginFocus]', e && e.target);\n const target = e && e.target;\n if (target) {\n const node = findNode(target, this.state.value);\n log('[onPluginFocus] node: ', node);\n\n const stashedValue = this.state.stashedValue || this.state.value;\n this.setState({ focusedNode: node, stashedValue });\n } else {\n this.setState({ focusedNode: null });\n }\n this.stashValue();\n };\n\n onMathClick = (node) => {\n this.editor.change((c) => c.collapseToStartOf(node));\n this.setState({ selectedNode: node });\n };\n\n onEditingDone = () => {\n if (this.state.isHtmlMode) {\n return;\n }\n\n log('[onEditingDone]');\n this.setState({ stashedValue: null, focusedNode: null });\n log('[onEditingDone] value: ', this.state.value);\n this.props.onChange(this.state.value, true);\n };\n\n /**\n * Remove onResize event listener\n */\n componentWillUnmount() {\n window.removeEventListener('resize', this.onResize);\n }\n\n // Allowing time for onChange to take effect if it is called\n handleBlur = (resolve) => {\n const { nonEmpty } = this.props;\n const {\n toolbarOpts: { doneOn },\n } = this.state;\n\n this.setState({ toolbarInFocus: false, focusedNode: null });\n\n if (this.editor) {\n this.editor.blur();\n }\n\n if (doneOn === 'blur') {\n if (nonEmpty && this.state.value.startText?.text?.length === 0) {\n this.resetValue(true).then(() => {\n this.onEditingDone();\n resolve();\n });\n } else {\n this.onEditingDone();\n resolve();\n }\n }\n };\n\n onBlur = (event) => {\n log('[onBlur]');\n const target = event.relatedTarget;\n\n const node = target ? findNode(target, this.state.value) : null;\n\n log('[onBlur] node: ', node);\n\n return new Promise((resolve) => {\n this.setState(\n { preBlurValue: this.state.value, focusedNode: !node ? null : node },\n this.handleBlur.bind(this, resolve),\n );\n this.props.onBlur(event);\n });\n };\n\n handleDomBlur = (e) => {\n const editorDOM = document.querySelector(`[data-key=\"${this.state.value.document.key}\"]`);\n\n setTimeout(() => {\n const { value: stateValue } = this.state;\n\n if (!this.wrapperRef) {\n return;\n }\n\n const editorElement = !editorDOM || document.activeElement.closest(`[class*=\"${editorDOM.className}\"]`);\n const toolbarElement =\n !this.toolbarRef || document.activeElement.closest(`[class*=\"${this.toolbarRef.className}\"]`);\n const isInCurrentComponent = this.wrapperRef.contains(editorElement) || this.wrapperRef.contains(toolbarElement);\n\n if (!isInCurrentComponent) {\n editorDOM.removeEventListener('blur', this.handleDomBlur);\n\n if (stateValue.isFocused) {\n this.onBlur(e);\n }\n }\n }, 50);\n };\n\n /*\n * Needs to be wrapped otherwise it causes issues because of race conditions\n * Known issue for slatejs. See: https://github.com/ianstormtaylor/slate/issues/2097\n * Using timeout I wasn't able to test this\n *\n * Note: The use of promises has been causing issues with MathQuill\n * */\n onFocus = () =>\n new Promise((resolve) => {\n const editorDOM = document.querySelector(`[data-key=\"${this.state.value.document.key}\"]`);\n\n log('[onFocus]', document.activeElement);\n\n /**\n * This is a temporary hack - @see changeData below for some more information.\n */\n if (this.__TEMPORARY_CHANGE_DATA) {\n const { key, data } = this.__TEMPORARY_CHANGE_DATA;\n const domEl = document.querySelector(`[data-key=\"${key}\"]`);\n\n if (domEl) {\n let change = this.state.value.change().setNodeByKey(key, { data });\n\n this.setState({ value: change.value }, () => {\n this.__TEMPORARY_CHANGE_DATA = null;\n });\n }\n }\n\n /**\n * This is needed just in case the browser decides to make the editor\n * lose focus without triggering the onBlur event (can happen in a few cases).\n * This will also trigger onBlur if the user clicks outside of the page when the editor\n * is focused.\n */\n if (editorDOM === document.activeElement) {\n editorDOM.removeEventListener('blur', this.handleDomBlur);\n editorDOM.addEventListener('blur', this.handleDomBlur);\n }\n\n this.stashValue();\n this.props.onFocus();\n\n resolve();\n });\n\n stashValue = () => {\n log('[stashValue]');\n if (!this.state.stashedValue) {\n this.setState({ stashedValue: this.state.value });\n }\n };\n\n /**\n * Reset the value if the user didn't click done.\n */\n resetValue = (force) => {\n const { value, focusedNode } = this.state;\n\n const stopReset = this.plugins.reduce((s, p) => {\n return s || (p.stopReset && p.stopReset(this.state.value));\n }, false);\n\n log('[resetValue]', value.isFocused, focusedNode, 'stopReset: ', stopReset);\n if ((this.state.stashedValue && !value.isFocused && !focusedNode && !stopReset) || force) {\n log('[resetValue] resetting...');\n log('stashed', this.state.stashedValue.document.toObject());\n log('current', this.state.value.document.toObject());\n\n const newValue = Value.fromJSON(this.state.stashedValue.toJSON());\n\n log('newValue: ', newValue.document);\n return new Promise((resolve) => {\n setTimeout(() => {\n this.setState({ value: newValue, stashedValue: null }, () => {\n log('value now: ', this.state.value.document.toJSON());\n resolve();\n });\n }, 50);\n });\n } else {\n return Promise.resolve({});\n }\n };\n\n onChange = (change, done) => {\n log('[onChange]');\n\n const { value } = change;\n const { charactersLimit } = this.props;\n\n if (value && value.document && value.document.text && value.document.text.length > charactersLimit) {\n return;\n }\n\n if (!this.state.isHtmlMode) {\n this.setState({ isEdited: false });\n }\n\n // Mark the editor as edited when in HTML mode and its content has changed.\n // This status will later be used to decide whether to prompt a warning to the user when exiting HTML mode.\n if (\n this.state.isHtmlMode &&\n !this.state.isEdited &&\n !isEqual(this.state.value.document.text, value.document.text)\n ) {\n this.setState({ isEdited: true });\n }\n\n this.setState({ value }, () => {\n log('[onChange], call done()');\n\n if (done) {\n done();\n }\n });\n };\n\n getFocusedValue = () => {\n if (this.state.value.isFocused) {\n return this.state.value;\n }\n\n return this.state.preBlurValue;\n };\n\n valueToSize = (v) => {\n if (!v) {\n return;\n }\n\n if (typeof v === 'string') {\n if (v.endsWith('%')) {\n return undefined;\n } else if (v.endsWith('px') || v.endsWith('vh') || v.endsWith('vw')) {\n return v;\n } else {\n const value = parseInt(v, 10);\n return isNaN(value) ? value : `${value}px`;\n }\n }\n if (typeof v === 'number') {\n return `${v}px`;\n }\n\n return;\n };\n\n buildSizeStyle() {\n const { width, minHeight, height, maxHeight } = this.props;\n\n return {\n width: this.valueToSize(width),\n height: this.valueToSize(height),\n minHeight: this.valueToSize(minHeight),\n maxHeight: this.valueToSize(maxHeight),\n };\n }\n\n validateNode = (node) => {\n if (node.object !== 'block') return;\n\n const last = node.nodes.last();\n if (!last) return;\n\n if (last.type !== 'image') return;\n\n log('[validateNode] last is image..');\n\n const parent = last.getParent(last.key);\n const p = Block.getParent(last.key);\n log('[validateNode] parent:', parent, p);\n\n return undefined;\n };\n\n changeData = (key, data) => {\n log('[changeData]. .. ', key, data);\n\n /**\n * HACK ALERT: We should be calling setState here and storing the change data:\n *\n * <code>this.setState({changeData: { key, data}})</code>\n * However this is causing issues with the Mathquill instance. The 'input' event stops firing on the element and no\n * more changes get through. The issues seem to be related to the promises in onBlur/onFocus. But removing these\n * brings it's own problems. A major clean up is planned for this component so I've decided to temporarily settle\n * on this hack rather than spend more time on this.\n */\n\n // Uncomment this line to see the bug described above.\n // this.setState({changeData: {key, data}})\n\n this.__TEMPORARY_CHANGE_DATA = { key, data };\n };\n\n focus = (pos, node) => {\n const position = pos || 'end';\n\n this.props.focus(position, node);\n };\n\n onDropPaste = async (event, change, dropContext) => {\n const editor = change.editor;\n const transfer = getEventTransfer(event);\n const file = transfer.files && transfer.files[0];\n\n const type = transfer.type;\n const fragment = transfer.fragment;\n const text = transfer.text;\n\n if (file && (file.type === 'image/jpeg' || file.type === 'image/jpg' || file.type === 'image/png')) {\n if (!this.props.imageSupport) {\n return;\n }\n try {\n log('[onDropPaste]');\n const src = await getBase64(file);\n const inline = Inline.create({\n type: 'image',\n isVoid: true,\n data: {\n loading: false,\n src,\n },\n });\n\n if (dropContext) {\n this.focus();\n } else {\n const range = getEventRange(event, editor);\n if (range) {\n change.select(range);\n }\n }\n\n const ch = change.insertInline(inline);\n this.onChange(ch);\n const handler = new InsertImageHandler(inline, () => this.state.value, this.onChange, true);\n handler.fileChosen(file);\n this.props.imageSupport.add(handler);\n } catch (err) {\n log('[onDropPaste] error: ', err);\n }\n } else if (type === 'fragment') {\n change.insertFragment(fragment);\n } else if (type === 'text' || type === 'html') {\n if (!text) {\n return;\n }\n const {\n value: { document, selection, startBlock },\n } = change;\n\n if (startBlock.isVoid) {\n return;\n }\n\n const defaultBlock = startBlock;\n const defaultMarks = document.getInsertMarksAtRange(selection);\n const frag = Plain.deserialize(text, {\n defaultBlock,\n defaultMarks,\n }).document;\n change.insertFragment(frag);\n }\n };\n\n renderPlaceholder = (props) => {\n const { editor } = props;\n const { document } = editor.value;\n\n if (!editor.props.placeholder || document.text !== '' || document.nodes.size !== 1) {\n return false;\n }\n\n return (\n <span\n contentEditable={false}\n style={{\n display: 'inline-block',\n width: 'fit-content', // for centering the placeholder if text-align is set to center\n maxWidth: '100%',\n whiteSpace: 'nowrap',\n opacity: '0.33',\n pointerEvents: 'none',\n userSelect: 'none',\n }}\n >\n {editor.props.placeholder}\n </span>\n );\n };\n\n render() {\n const {\n disabled,\n spellCheck,\n highlightShape,\n classes,\n className,\n placeholder,\n pluginProps,\n onKeyDown,\n } = this.props;\n\n const { value, focusedNode, toolbarOpts, dialog } = this.state;\n\n log('[render] value: ', value);\n const sizeStyle = this.buildSizeStyle();\n const names = classNames(\n {\n [classes.withBg]: highlightShape,\n [classes.toolbarOnTop]: toolbarOpts.alwaysVisible && toolbarOpts.position === 'top',\n },\n className,\n );\n\n return (\n <div ref={(ref) => (this.wrapperRef = ref)} style={{ width: sizeStyle.width }} className={names}>\n <SlateEditor\n plugins={this.plugins}\n innerRef={(r) => {\n if (r) {\n this.slateEditor = r;\n }\n }}\n ref={(r) => (this.editor = r && this.props.editorRef(r))}\n toolbarRef={(r) => {\n if (r) {\n this.toolbarRef = r;\n }\n }}\n value={value}\n focus={this.focus}\n onKeyDown={onKeyDown}\n onChange={this.onChange}\n getFocusedValue={this.getFocusedValue}\n onBlur={this.onBlur}\n onDrop={(event, editor) => this.onDropPaste(event, editor, true)}\n onPaste={(event, editor) => this.onDropPaste(event, editor)}\n onFocus={this.onFocus}\n onEditingDone={this.onEditingDone}\n focusedNode={focusedNode}\n normalize={this.normalize}\n readOnly={disabled}\n spellCheck={spellCheck}\n autoCorrect={spellCheck}\n className={classNames(\n {\n [classes.noPadding]: toolbarOpts && toolbarOpts.noBorder,\n },\n classes.slateEditor,\n )}\n style={{\n minHeight: sizeStyle.minHeight,\n height: sizeStyle.height,\n maxHeight: sizeStyle.maxHeight,\n }}\n pluginProps={pluginProps}\n toolbarOpts={toolbarOpts}\n placeholder={placeholder}\n renderPlaceholder={this.renderPlaceholder}\n onDataChange={this.changeData}\n />\n <AlertDialog\n open={dialog.open}\n title={dialog.title}\n text={dialog.text}\n onClose={dialog.onClose}\n onConfirm={dialog.onConfirm}\n />\n </div>\n );\n }\n}\n\n// TODO color - hardcoded gray background and keypad colors will need to change too\nconst styles = {\n withBg: {\n backgroundColor: 'rgba(0,0,0,0.06)',\n },\n slateEditor: {\n fontFamily: 'Roboto, sans-serif',\n\n '& table': {\n tableLayout: 'fixed',\n width: '100%',\n borderCollapse: 'collapse',\n color: color.text(),\n backgroundColor: color.background(),\n },\n '& table:not([border=\"1\"]) tr': {\n borderTop: '1px solid #dfe2e5',\n // TODO perhaps secondary color for background, for now disable\n // '&:nth-child(2n)': {\n // backgroundColor: '#f6f8fa'\n // }\n },\n '& td, th': {\n padding: '.6em 1em',\n textAlign: 'center',\n },\n '& table:not([border=\"1\"]) td, th': {\n border: '1px solid #dfe2e5',\n },\n },\n toolbarOnTop: {\n marginTop: '45px',\n },\n noPadding: {\n padding: '0 !important',\n },\n};\n\nexport default withStyles(styles)(Editor);\n"],"file":"editor.js"}
1
+ {"version":3,"sources":["../src/editor.jsx"],"names":["log","defaultToolbarOpts","position","alignment","alwaysVisible","showDone","doneOn","defaultResponseAreaProps","options","respAreaToolbar","onHandleAreaChange","defaultLanguageCharactersProps","createToolbarOpts","toolbarOpts","error","isHtmlMode","Editor","props","open","extraDialogProps","callback","setState","dialog","isEdited","prevState","state","newToolbarOpts","normalizedResponseAreaProps","responseAreaProps","htmlPluginOpts","toggleHtmlMode","handleAlertDialog","plugins","activePlugins","math","onClick","onMathClick","onFocus","onPluginFocus","onBlur","onPluginBlur","mathMlOptions","html","image","disableImageAlignmentButtons","onDelete","imageSupport","src","done","e","value","insertImageRequested","addedImage","getHandler","pendingImages","onFinish","result","cb","scheduled","onEditingDone","bind","newPendingImages","filter","img","key","newState","length","handler","add","maxImageWidth","maxImageHeight","toolbar","disableScrollbar","disableUnderline","autoWidth","autoWidthToolbar","onDone","nonEmpty","toolbarInFocus","focusedNode","editor","blur","startText","text","resetValue","then","table","responseArea","type","maxResponseAreas","languageCharacters","languageCharactersProps","media","focus","createChange","change","onChange","uploadSoundSupport","mmlOutput","mmlEditing","runSerializationOnMarkup","relatedTarget","target","node","stashedValue","stashValue","c","collapseToStartOf","selectedNode","resolve","event","Promise","preBlurValue","handleBlur","editorDOM","document","querySelector","setTimeout","stateValue","wrapperRef","editorElement","activeElement","closest","className","toolbarElement","toolbarRef","isInCurrentComponent","contains","removeEventListener","handleDomBlur","isFocused","__TEMPORARY_CHANGE_DATA","data","domEl","setNodeByKey","addEventListener","force","stopReset","reduce","s","p","toObject","newValue","Value","fromJSON","toJSON","charactersLimit","v","endsWith","undefined","parseInt","isNaN","object","last","nodes","parent","getParent","Block","pos","dropContext","transfer","file","files","fragment","inline","Inline","create","isVoid","loading","range","select","ch","insertInline","InsertImageHandler","fileChosen","insertFragment","selection","startBlock","defaultBlock","defaultMarks","getInsertMarksAtRange","frag","Plain","deserialize","placeholder","size","display","width","maxWidth","whiteSpace","opacity","pointerEvents","userSelect","onResize","handlePlugins","onRef","window","autoFocus","nextProps","differentCharacterProps","differentMathMlProps","equals","prevProps","zeroWidthEls","querySelectorAll","Array","from","forEach","el","style","minWidth","minHeight","height","maxHeight","valueToSize","disabled","spellCheck","highlightShape","classes","pluginProps","onKeyDown","sizeStyle","buildSizeStyle","names","withBg","toolbarOnTop","ref","uploading","r","slateEditor","editorRef","getFocusedValue","onDropPaste","normalize","noPadding","noBorder","renderPlaceholder","changeData","title","onClose","onConfirm","React","Component","PropTypes","bool","func","isRequired","any","SlateTypes","shape","number","oneOfType","string","oneOf","arrayOf","language","characterIcon","characters","values","allValid","every","ALL_PLUGINS","includes","Error","join","styles","backgroundColor","top","left","transform","fontFamily","tableLayout","borderCollapse","color","background","borderTop","padding","textAlign","border","marginTop"],"mappings":"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","sourcesContent":["import { Editor as SlateEditor, findNode, getEventRange, getEventTransfer } from 'slate-react';\nimport SlateTypes from 'slate-prop-types';\n\nimport isEqual from 'lodash/isEqual';\nimport * as serialization from './serialization';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport { Value, Block, Inline } from 'slate';\nimport { buildPlugins, ALL_PLUGINS, DEFAULT_PLUGINS } from './plugins';\nimport debug from 'debug';\nimport { withStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport { color } from '@pie-lib/render-ui';\nimport Plain from 'slate-plain-serializer';\nimport { AlertDialog } from '@pie-lib/config-ui';\n\nimport { getBase64 } from './serialization';\nimport InsertImageHandler from './plugins/image/insert-image-handler';\n\nexport { ALL_PLUGINS, DEFAULT_PLUGINS, serialization };\n\nconst log = debug('editable-html:editor');\n\nconst defaultToolbarOpts = {\n position: 'bottom',\n alignment: 'left',\n alwaysVisible: false,\n showDone: true,\n doneOn: 'blur',\n};\n\nconst defaultResponseAreaProps = {\n options: {},\n respAreaToolbar: () => {},\n onHandleAreaChange: () => {},\n};\n\nconst defaultLanguageCharactersProps = [];\n\nconst createToolbarOpts = (toolbarOpts, error, isHtmlMode) => {\n return {\n ...defaultToolbarOpts,\n ...toolbarOpts,\n error,\n isHtmlMode,\n };\n};\n\nexport class Editor extends React.Component {\n static propTypes = {\n autoFocus: PropTypes.bool,\n editorRef: PropTypes.func.isRequired,\n error: PropTypes.any,\n onRef: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func,\n onKeyDown: PropTypes.func,\n focus: PropTypes.func.isRequired,\n value: SlateTypes.value.isRequired,\n imageSupport: PropTypes.object,\n mathMlOptions: PropTypes.shape({\n mmlOutput: PropTypes.bool,\n mmlEditing: PropTypes.bool,\n }),\n disableImageAlignmentButtons: PropTypes.bool,\n uploadSoundSupport: PropTypes.shape({\n add: PropTypes.func,\n delete: PropTypes.func,\n }),\n charactersLimit: PropTypes.number,\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n minHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n maxHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n classes: PropTypes.object.isRequired,\n highlightShape: PropTypes.bool,\n disabled: PropTypes.bool,\n spellCheck: PropTypes.bool,\n nonEmpty: PropTypes.bool,\n disableScrollbar: PropTypes.bool,\n disableUnderline: PropTypes.bool,\n autoWidthToolbar: PropTypes.bool,\n pluginProps: PropTypes.any,\n placeholder: PropTypes.string,\n responseAreaProps: PropTypes.shape({\n type: PropTypes.oneOf(['explicit-constructed-response', 'inline-dropdown', 'drag-in-the-blank']),\n options: PropTypes.object,\n respAreaToolbar: PropTypes.func,\n onHandleAreaChange: PropTypes.func,\n }),\n languageCharactersProps: PropTypes.arrayOf(\n PropTypes.shape({\n language: PropTypes.string,\n characterIcon: PropTypes.string,\n characters: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)),\n }),\n ),\n runSerializationOnMarkup: PropTypes.func,\n toolbarOpts: PropTypes.shape({\n position: PropTypes.oneOf(['bottom', 'top']),\n alignment: PropTypes.oneOf(['left', 'right']),\n alwaysVisible: PropTypes.bool,\n showDone: PropTypes.bool,\n doneOn: PropTypes.string,\n }),\n activePlugins: PropTypes.arrayOf((values) => {\n const allValid = values.every((v) => ALL_PLUGINS.includes(v));\n\n return !allValid && new Error(`Invalid values: ${values}, values must be one of [${ALL_PLUGINS.join(',')}]`);\n }),\n className: PropTypes.string,\n maxImageWidth: PropTypes.number,\n maxImageHeight: PropTypes.number,\n };\n\n static defaultProps = {\n disableUnderline: true,\n onFocus: () => {},\n onBlur: () => {},\n onKeyDown: () => {},\n runSerializationOnMarkup: () => {},\n mathMlOptions: {\n mmlOutput: false,\n mmlEditing: false,\n },\n toolbarOpts: defaultToolbarOpts,\n responseAreaProps: defaultResponseAreaProps,\n languageCharactersProps: defaultLanguageCharactersProps,\n };\n\n constructor(props) {\n super(props);\n this.state = {\n value: props.value,\n toolbarOpts: createToolbarOpts(props.toolbarOpts, props.error),\n pendingImages: [],\n isHtmlMode: false,\n isEdited: false,\n dialog: {\n open: false,\n },\n };\n\n this.toggleHtmlMode = this.toggleHtmlMode.bind(this);\n\n this.onResize = () => {\n props.onChange(this.state.value, true);\n };\n\n this.handlePlugins(this.props);\n }\n\n handleAlertDialog = (open, extraDialogProps, callback) => {\n this.setState(\n {\n dialog: {\n open,\n ...extraDialogProps,\n },\n isEdited: false,\n },\n callback,\n );\n };\n\n toggleHtmlMode = () => {\n this.setState(\n (prevState) => ({\n isHtmlMode: !prevState.isHtmlMode,\n }),\n () => {\n const { error } = this.props;\n const { toolbarOpts } = this.state;\n const newToolbarOpts = createToolbarOpts(toolbarOpts, error, this.state.isHtmlMode);\n this.setState({\n toolbarOpts: newToolbarOpts,\n });\n },\n );\n };\n\n handlePlugins = (props) => {\n const normalizedResponseAreaProps = {\n ...defaultResponseAreaProps,\n ...props.responseAreaProps,\n };\n\n const htmlPluginOpts = {\n isHtmlMode: this.state.isHtmlMode,\n isEdited: this.state.isEdited,\n toggleHtmlMode: this.toggleHtmlMode,\n handleAlertDialog: this.handleAlertDialog,\n };\n\n this.plugins = buildPlugins(props.activePlugins, {\n math: {\n onClick: this.onMathClick,\n onFocus: this.onPluginFocus,\n onBlur: this.onPluginBlur,\n ...props.mathMlOptions,\n },\n html: htmlPluginOpts,\n image: {\n disableImageAlignmentButtons: props.disableImageAlignmentButtons,\n onDelete:\n props.imageSupport &&\n props.imageSupport.delete &&\n ((src, done) => {\n props.imageSupport.delete(src, (e) => {\n done(e, this.state.value);\n });\n }),\n insertImageRequested:\n props.imageSupport &&\n ((addedImage, getHandler) => {\n const { pendingImages } = this.state;\n const onFinish = (result) => {\n let cb;\n\n if (this.state.scheduled && result) {\n // finish editing only on success\n cb = this.onEditingDone.bind(this);\n }\n\n const newPendingImages = this.state.pendingImages.filter((img) => img.key !== addedImage.key);\n const newState = {\n pendingImages: newPendingImages,\n };\n\n if (newPendingImages.length === 0) {\n newState.scheduled = false;\n }\n\n this.setState(newState, cb);\n };\n const callback = () => {\n /**\n * The handler is the object through which the outer context\n * communicates file upload events like: fileChosen, cancel, progress\n */\n const handler = getHandler(onFinish, () => this.state.value);\n props.imageSupport.add(handler);\n };\n\n this.setState(\n {\n pendingImages: [...pendingImages, addedImage],\n },\n callback,\n );\n }),\n onFocus: this.onPluginFocus,\n onBlur: this.onPluginBlur,\n maxImageWidth: this.props.maxImageWidth,\n maxImageHeight: this.props.maxImageHeight,\n },\n toolbar: {\n /**\n * To minimize converting html -> state -> html\n * We only emit markup once 'done' is clicked.\n */\n disableScrollbar: !!props.disableScrollbar,\n disableUnderline: props.disableUnderline,\n autoWidth: props.autoWidthToolbar,\n onDone: () => {\n const { nonEmpty } = props;\n\n log('[onDone]');\n this.setState({ toolbarInFocus: false, focusedNode: null });\n this.editor.blur();\n\n if (nonEmpty && this.state.value.startText?.text?.length === 0) {\n this.resetValue(true).then(() => {\n this.onEditingDone();\n });\n } else {\n this.onEditingDone();\n }\n },\n },\n table: {\n onFocus: () => {\n log('[table:onFocus]...');\n this.onPluginFocus();\n },\n onBlur: () => {\n log('[table:onBlur]...');\n this.onPluginBlur();\n },\n },\n responseArea: {\n type: normalizedResponseAreaProps.type,\n options: normalizedResponseAreaProps.options,\n maxResponseAreas: normalizedResponseAreaProps.maxResponseAreas,\n respAreaToolbar: normalizedResponseAreaProps.respAreaToolbar,\n onHandleAreaChange: normalizedResponseAreaProps.onHandleAreaChange,\n error: normalizedResponseAreaProps.error,\n onFocus: () => {\n log('[table:onFocus]...');\n this.onPluginFocus();\n },\n onBlur: () => {\n log('[table:onBlur]...');\n this.onPluginBlur();\n },\n },\n languageCharacters: props.languageCharactersProps,\n media: {\n focus: this.focus,\n createChange: () => this.state.value.change(),\n onChange: this.onChange,\n uploadSoundSupport: props.uploadSoundSupport,\n },\n });\n\n if (props.mathMlOptions.mmlOutput || props.mathMlOptions.mmlEditing) {\n this.props.runSerializationOnMarkup();\n }\n };\n\n componentDidMount() {\n // onRef is needed to get the ref of the component because we export it using withStyles\n this.props.onRef(this);\n\n window.addEventListener('resize', this.onResize);\n\n if (this.editor && this.props.autoFocus) {\n Promise.resolve().then(() => {\n if (this.editor) {\n const editorDOM = document.querySelector(`[data-key=\"${this.editor.value.document.key}\"]`);\n\n this.editor.focus();\n\n if (editorDOM) {\n editorDOM.focus();\n }\n }\n });\n }\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n const { isHtmlMode, toolbarOpts } = this.state;\n const newToolbarOpts = createToolbarOpts(nextProps.toolbarOpts, nextProps.error, isHtmlMode);\n\n if (!isEqual(newToolbarOpts, toolbarOpts)) {\n this.setState({\n toolbarOpts: newToolbarOpts,\n });\n }\n\n const differentCharacterProps = !isEqual(nextProps.languageCharactersProps, this.props.languageCharactersProps);\n const differentMathMlProps = !isEqual(nextProps.mathMlOptions, this.props.mathMlOptions);\n\n if (differentCharacterProps || differentMathMlProps) {\n this.handlePlugins(nextProps);\n }\n\n if (!nextProps.value?.document?.equals(this.props.value?.document)) {\n this.setState({\n focus: false,\n value: nextProps.value,\n });\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // The cursor is on a zero width element and when that is placed near void elements, it is not visible\n // so we increase the width to at least 2px in order for the user to see it\n\n // Trigger plugins and finish editing if:\n // 1. The 'isHtmlMode' state has been toggled.\n // 2. We're currently in 'isHtmlMode' and the editor value has been modified.\n if (\n this.state.isHtmlMode !== prevState.isHtmlMode ||\n (this.state.isHtmlMode && !prevState.isEdited && this.state.isEdited)\n ) {\n this.handlePlugins(this.props);\n this.onEditingDone();\n }\n\n const zeroWidthEls = document.querySelectorAll('[data-slate-zero-width=\"z\"]');\n\n Array.from(zeroWidthEls).forEach((el) => {\n el.style.minWidth = '2px';\n el.style.display = 'inline-block';\n });\n }\n\n onPluginBlur = (e) => {\n log('[onPluginBlur]', e && e.relatedTarget);\n const target = e && e.relatedTarget;\n\n const node = target ? findNode(target, this.state.value) : null;\n log('[onPluginBlur] node: ', node);\n this.setState({ focusedNode: node }, () => {\n this.resetValue();\n });\n };\n\n onPluginFocus = (e) => {\n log('[onPluginFocus]', e && e.target);\n const target = e && e.target;\n if (target) {\n const node = findNode(target, this.state.value);\n log('[onPluginFocus] node: ', node);\n\n const stashedValue = this.state.stashedValue || this.state.value;\n this.setState({ focusedNode: node, stashedValue });\n } else {\n this.setState({ focusedNode: null });\n }\n this.stashValue();\n };\n\n onMathClick = (node) => {\n this.editor.change((c) => c.collapseToStartOf(node));\n this.setState({ selectedNode: node });\n };\n\n onEditingDone = () => {\n if (this.state.isHtmlMode) {\n return;\n }\n\n const { pendingImages } = this.state;\n\n if (pendingImages.length) {\n this.setState({ scheduled: true });\n return;\n }\n\n log('[onEditingDone]');\n this.setState({ pendingImages: [], stashedValue: null, focusedNode: null });\n log('[onEditingDone] value: ', this.state.value);\n this.props.onChange(this.state.value, true);\n };\n\n /**\n * Remove onResize event listener\n */\n componentWillUnmount() {\n window.removeEventListener('resize', this.onResize);\n }\n\n // Allowing time for onChange to take effect if it is called\n handleBlur = (resolve) => {\n const { nonEmpty } = this.props;\n const {\n toolbarOpts: { doneOn },\n } = this.state;\n\n this.setState({ toolbarInFocus: false, focusedNode: null });\n\n if (this.editor) {\n this.editor.blur();\n }\n\n if (doneOn === 'blur') {\n if (nonEmpty && this.state.value.startText?.text?.length === 0) {\n this.resetValue(true).then(() => {\n this.onEditingDone();\n resolve();\n });\n } else {\n this.onEditingDone();\n resolve();\n }\n }\n };\n\n onBlur = (event) => {\n log('[onBlur]');\n const target = event.relatedTarget;\n\n const node = target ? findNode(target, this.state.value) : null;\n\n log('[onBlur] node: ', node);\n\n return new Promise((resolve) => {\n this.setState(\n { preBlurValue: this.state.value, focusedNode: !node ? null : node },\n this.handleBlur.bind(this, resolve),\n );\n this.props.onBlur(event);\n });\n };\n\n handleDomBlur = (e) => {\n const editorDOM = document.querySelector(`[data-key=\"${this.state.value.document.key}\"]`);\n\n setTimeout(() => {\n const { value: stateValue } = this.state;\n\n if (!this.wrapperRef) {\n return;\n }\n\n const editorElement = !editorDOM || document.activeElement.closest(`[class*=\"${editorDOM.className}\"]`);\n const toolbarElement =\n !this.toolbarRef || document.activeElement.closest(`[class*=\"${this.toolbarRef.className}\"]`);\n const isInCurrentComponent = this.wrapperRef.contains(editorElement) || this.wrapperRef.contains(toolbarElement);\n\n if (!isInCurrentComponent) {\n editorDOM.removeEventListener('blur', this.handleDomBlur);\n\n if (stateValue.isFocused) {\n this.onBlur(e);\n }\n }\n }, 50);\n };\n\n /*\n * Needs to be wrapped otherwise it causes issues because of race conditions\n * Known issue for slatejs. See: https://github.com/ianstormtaylor/slate/issues/2097\n * Using timeout I wasn't able to test this\n *\n * Note: The use of promises has been causing issues with MathQuill\n * */\n onFocus = () =>\n new Promise((resolve) => {\n const editorDOM = document.querySelector(`[data-key=\"${this.state.value.document.key}\"]`);\n\n log('[onFocus]', document.activeElement);\n\n /**\n * This is a temporary hack - @see changeData below for some more information.\n */\n if (this.__TEMPORARY_CHANGE_DATA) {\n const { key, data } = this.__TEMPORARY_CHANGE_DATA;\n const domEl = document.querySelector(`[data-key=\"${key}\"]`);\n\n if (domEl) {\n let change = this.state.value.change().setNodeByKey(key, { data });\n\n this.setState({ value: change.value }, () => {\n this.__TEMPORARY_CHANGE_DATA = null;\n });\n }\n }\n\n /**\n * This is needed just in case the browser decides to make the editor\n * lose focus without triggering the onBlur event (can happen in a few cases).\n * This will also trigger onBlur if the user clicks outside of the page when the editor\n * is focused.\n */\n if (editorDOM === document.activeElement) {\n editorDOM.removeEventListener('blur', this.handleDomBlur);\n editorDOM.addEventListener('blur', this.handleDomBlur);\n }\n\n this.stashValue();\n this.props.onFocus();\n\n resolve();\n });\n\n stashValue = () => {\n log('[stashValue]');\n if (!this.state.stashedValue) {\n this.setState({ stashedValue: this.state.value });\n }\n };\n\n /**\n * Reset the value if the user didn't click done.\n */\n resetValue = (force) => {\n const { value, focusedNode } = this.state;\n\n const stopReset = this.plugins.reduce((s, p) => {\n return s || (p.stopReset && p.stopReset(this.state.value));\n }, false);\n\n log('[resetValue]', value.isFocused, focusedNode, 'stopReset: ', stopReset);\n if ((this.state.stashedValue && !value.isFocused && !focusedNode && !stopReset) || force) {\n log('[resetValue] resetting...');\n log('stashed', this.state.stashedValue.document.toObject());\n log('current', this.state.value.document.toObject());\n\n const newValue = Value.fromJSON(this.state.stashedValue.toJSON());\n\n log('newValue: ', newValue.document);\n return new Promise((resolve) => {\n setTimeout(() => {\n this.setState({ value: newValue, stashedValue: null }, () => {\n log('value now: ', this.state.value.document.toJSON());\n resolve();\n });\n }, 50);\n });\n } else {\n return Promise.resolve({});\n }\n };\n\n onChange = (change, done) => {\n log('[onChange]');\n\n const { value } = change;\n const { charactersLimit } = this.props;\n\n if (value && value.document && value.document.text && value.document.text.length > charactersLimit) {\n return;\n }\n\n if (!this.state.isHtmlMode) {\n this.setState({ isEdited: false });\n }\n\n // Mark the editor as edited when in HTML mode and its content has changed.\n // This status will later be used to decide whether to prompt a warning to the user when exiting HTML mode.\n if (\n this.state.isHtmlMode &&\n !this.state.isEdited &&\n !isEqual(this.state.value.document.text, value.document.text)\n ) {\n this.setState({ isEdited: true });\n }\n\n this.setState({ value }, () => {\n log('[onChange], call done()');\n\n if (done) {\n done();\n }\n });\n };\n\n getFocusedValue = () => {\n if (this.state.value.isFocused) {\n return this.state.value;\n }\n\n return this.state.preBlurValue;\n };\n\n valueToSize = (v) => {\n if (!v) {\n return;\n }\n\n if (typeof v === 'string') {\n if (v.endsWith('%')) {\n return undefined;\n } else if (v.endsWith('px') || v.endsWith('vh') || v.endsWith('vw')) {\n return v;\n } else {\n const value = parseInt(v, 10);\n return isNaN(value) ? value : `${value}px`;\n }\n }\n if (typeof v === 'number') {\n return `${v}px`;\n }\n\n return;\n };\n\n buildSizeStyle() {\n const { width, minHeight, height, maxHeight } = this.props;\n\n return {\n width: this.valueToSize(width),\n height: this.valueToSize(height),\n minHeight: this.valueToSize(minHeight),\n maxHeight: this.valueToSize(maxHeight),\n };\n }\n\n validateNode = (node) => {\n if (node.object !== 'block') return;\n\n const last = node.nodes.last();\n if (!last) return;\n\n if (last.type !== 'image') return;\n\n log('[validateNode] last is image..');\n\n const parent = last.getParent(last.key);\n const p = Block.getParent(last.key);\n log('[validateNode] parent:', parent, p);\n\n return undefined;\n };\n\n changeData = (key, data) => {\n log('[changeData]. .. ', key, data);\n\n /**\n * HACK ALERT: We should be calling setState here and storing the change data:\n *\n * <code>this.setState({changeData: { key, data}})</code>\n * However this is causing issues with the Mathquill instance. The 'input' event stops firing on the element and no\n * more changes get through. The issues seem to be related to the promises in onBlur/onFocus. But removing these\n * brings it's own problems. A major clean up is planned for this component so I've decided to temporarily settle\n * on this hack rather than spend more time on this.\n */\n\n // Uncomment this line to see the bug described above.\n // this.setState({changeData: {key, data}})\n\n this.__TEMPORARY_CHANGE_DATA = { key, data };\n };\n\n focus = (pos, node) => {\n const position = pos || 'end';\n\n this.props.focus(position, node);\n };\n\n onDropPaste = async (event, change, dropContext) => {\n const editor = change.editor;\n const transfer = getEventTransfer(event);\n const file = transfer.files && transfer.files[0];\n\n const type = transfer.type;\n const fragment = transfer.fragment;\n const text = transfer.text;\n\n if (file && (file.type === 'image/jpeg' || file.type === 'image/jpg' || file.type === 'image/png')) {\n if (!this.props.imageSupport) {\n return;\n }\n try {\n log('[onDropPaste]');\n const src = await getBase64(file);\n const inline = Inline.create({\n type: 'image',\n isVoid: true,\n data: {\n loading: false,\n src,\n },\n });\n\n if (dropContext) {\n this.focus();\n } else {\n const range = getEventRange(event, editor);\n if (range) {\n change.select(range);\n }\n }\n\n const ch = change.insertInline(inline);\n this.onChange(ch);\n const handler = new InsertImageHandler(\n inline,\n () => {},\n () => this.state.value,\n this.onChange,\n true,\n );\n handler.fileChosen(file);\n this.props.imageSupport.add(handler);\n } catch (err) {\n log('[onDropPaste] error: ', err);\n }\n } else if (type === 'fragment') {\n change.insertFragment(fragment);\n } else if (type === 'text' || type === 'html') {\n if (!text) {\n return;\n }\n const {\n value: { document, selection, startBlock },\n } = change;\n\n if (startBlock.isVoid) {\n return;\n }\n\n const defaultBlock = startBlock;\n const defaultMarks = document.getInsertMarksAtRange(selection);\n const frag = Plain.deserialize(text, {\n defaultBlock,\n defaultMarks,\n }).document;\n change.insertFragment(frag);\n }\n };\n\n renderPlaceholder = (props) => {\n const { editor } = props;\n const { document } = editor.value;\n\n if (!editor.props.placeholder || document.text !== '' || document.nodes.size !== 1) {\n return false;\n }\n\n return (\n <span\n contentEditable={false}\n style={{\n display: 'inline-block',\n width: 'fit-content', // for centering the placeholder if text-align is set to center\n maxWidth: '100%',\n whiteSpace: 'nowrap',\n opacity: '0.33',\n pointerEvents: 'none',\n userSelect: 'none',\n }}\n >\n {editor.props.placeholder}\n </span>\n );\n };\n\n render() {\n const {\n disabled,\n spellCheck,\n highlightShape,\n classes,\n className,\n placeholder,\n pluginProps,\n onKeyDown,\n } = this.props;\n\n const { value, focusedNode, toolbarOpts, dialog, scheduled } = this.state;\n\n log('[render] value: ', value);\n const sizeStyle = this.buildSizeStyle();\n const names = classNames(\n {\n [classes.withBg]: highlightShape,\n [classes.toolbarOnTop]: toolbarOpts.alwaysVisible && toolbarOpts.position === 'top',\n [classes.scheduled]: scheduled,\n },\n className,\n );\n\n return (\n <div ref={(ref) => (this.wrapperRef = ref)} style={{ width: sizeStyle.width }} className={names}>\n {scheduled && <div className={classes.uploading}>Uploading image and then saving...</div>}\n <SlateEditor\n plugins={this.plugins}\n innerRef={(r) => {\n if (r) {\n this.slateEditor = r;\n }\n }}\n ref={(r) => (this.editor = r && this.props.editorRef(r))}\n toolbarRef={(r) => {\n if (r) {\n this.toolbarRef = r;\n }\n }}\n value={value}\n focus={this.focus}\n onKeyDown={onKeyDown}\n onChange={this.onChange}\n getFocusedValue={this.getFocusedValue}\n onBlur={this.onBlur}\n onDrop={(event, editor) => this.onDropPaste(event, editor, true)}\n onPaste={(event, editor) => this.onDropPaste(event, editor)}\n onFocus={this.onFocus}\n onEditingDone={this.onEditingDone}\n focusedNode={focusedNode}\n normalize={this.normalize}\n readOnly={disabled}\n spellCheck={spellCheck}\n autoCorrect={spellCheck}\n className={classNames(\n {\n [classes.noPadding]: toolbarOpts && toolbarOpts.noBorder,\n },\n classes.slateEditor,\n )}\n style={{\n minHeight: sizeStyle.minHeight,\n height: sizeStyle.height,\n maxHeight: sizeStyle.maxHeight,\n }}\n pluginProps={pluginProps}\n toolbarOpts={toolbarOpts}\n placeholder={placeholder}\n renderPlaceholder={this.renderPlaceholder}\n onDataChange={this.changeData}\n />\n <AlertDialog\n open={dialog.open}\n title={dialog.title}\n text={dialog.text}\n onClose={dialog.onClose}\n onConfirm={dialog.onConfirm}\n />\n </div>\n );\n }\n}\n\n// TODO color - hardcoded gray background and keypad colors will need to change too\nconst styles = {\n withBg: {\n backgroundColor: 'rgba(0,0,0,0.06)',\n },\n scheduled: {\n opacity: 0.5,\n pointerEvents: 'none',\n position: 'relative',\n },\n uploading: {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n },\n slateEditor: {\n fontFamily: 'Roboto, sans-serif',\n\n '& table': {\n tableLayout: 'fixed',\n width: '100%',\n borderCollapse: 'collapse',\n color: color.text(),\n backgroundColor: color.background(),\n },\n '& table:not([border=\"1\"]) tr': {\n borderTop: '1px solid #dfe2e5',\n // TODO perhaps secondary color for background, for now disable\n // '&:nth-child(2n)': {\n // backgroundColor: '#f6f8fa'\n // }\n },\n '& td, th': {\n padding: '.6em 1em',\n textAlign: 'center',\n },\n '& table:not([border=\"1\"]) td, th': {\n border: '1px solid #dfe2e5',\n },\n },\n toolbarOnTop: {\n marginTop: '45px',\n },\n noPadding: {\n padding: '0 !important',\n },\n};\n\nexport default withStyles(styles)(Editor);\n"],"file":"editor.js"}
@@ -47,8 +47,8 @@ function ImagePlugin(opts) {
47
47
 
48
48
  var change = value.change().insertInline(inline);
49
49
  onChange(change);
50
- opts.insertImageRequested(function (getValue) {
51
- return new _insertImageHandler["default"](inline, getValue, onChange);
50
+ opts.insertImageRequested(inline, function (onFinish, getValue) {
51
+ return new _insertImageHandler["default"](inline, onFinish, getValue, onChange);
52
52
  });
53
53
  },
54
54
  supports: function supports(node) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/plugins/image/index.jsx"],"names":["log","ImagePlugin","opts","toolbar","insertImageRequested","icon","onClick","value","onChange","inline","Inline","create","type","isVoid","data","loaded","src","undefined","change","insertInline","getValue","InsertImageHandler","supports","node","object","customToolbar","onToolbarDone","alignment","get","alt","imageLoaded","newValues","done","update","toObject","setNodeByKey","key","Tb","disableImageAlignmentButtons","showDone","name","deleteNode","e","preventDefault","onDelete","merge","Data","deleteStatus","err","v","removeNodeByKey","stopReset","imgPendingInsertion","document","findDescendant","n","renderNode","props","all","Object","assign","onFocus","onBlur","maxImageWidth","maxImageHeight","normalizeNode","textNodeMap","updateNodesArray","index","d","text","push","length","withoutNormalization","forEach","insertTextByKey","serialization","deserialize","el","tagName","toLowerCase","style","width","height","margin","justifyContent","parseInt","replace","out","getAttribute","serialize","objectFit"],"mappings":"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","sourcesContent":["import { Data, Inline } from 'slate';\n\nimport Image from '@material-ui/icons/Image';\nimport ImageComponent from './component';\nimport ImageToolbar from './image-toolbar';\nimport InsertImageHandler from './insert-image-handler';\nimport React from 'react';\nimport debug from 'debug';\n\nconst log = debug('@pie-lib:editable-html:plugins:image');\n\nexport default function ImagePlugin(opts) {\n const toolbar = opts.insertImageRequested && {\n icon: <Image />,\n onClick: (value, onChange) => {\n log('[toolbar] onClick');\n const inline = Inline.create({\n type: 'image',\n isVoid: true,\n data: {\n loaded: false,\n src: undefined,\n },\n });\n\n const change = value.change().insertInline(inline);\n onChange(change);\n opts.insertImageRequested((getValue) => new InsertImageHandler(inline, getValue, onChange));\n },\n supports: (node) => node.object === 'inline' && node.type === 'image',\n customToolbar: (node, value, onToolbarDone) => {\n const alignment = node.data.get('alignment');\n const alt = node.data.get('alt');\n const imageLoaded = node.data.get('loaded') !== false;\n const onChange = (newValues, done) => {\n const update = {\n ...node.data.toObject(),\n ...newValues,\n };\n\n const change = value.change().setNodeByKey(node.key, { data: update });\n onToolbarDone(change, done);\n };\n\n const Tb = () => (\n <ImageToolbar\n disableImageAlignmentButtons={opts.disableImageAlignmentButtons}\n alt={alt}\n imageLoaded={imageLoaded}\n alignment={alignment || 'left'}\n onChange={onChange}\n />\n );\n return Tb;\n },\n showDone: true,\n };\n\n return {\n name: 'image',\n toolbar,\n deleteNode: (e, node, value, onChange) => {\n e.preventDefault();\n if (opts.onDelete) {\n const update = node.data.merge(Data.create({ deleteStatus: 'pending' }));\n\n let change = value.change().setNodeByKey(node.key, { data: update });\n\n onChange(change);\n opts.onDelete(node.data.get('src'), (err, v) => {\n if (!err) {\n change = v.change().removeNodeByKey(node.key);\n } else {\n log('[error]: ', err);\n change = v.change().setNodeByKey(node.key, node.data.merge(Data.create({ deleteStatus: 'failed' })));\n }\n onChange(change);\n });\n } else {\n let change = value.change().removeNodeByKey(node.key);\n onChange(change);\n }\n },\n stopReset: (value) => {\n const imgPendingInsertion = value.document.findDescendant((n) => {\n if (n.type !== 'image') {\n return;\n }\n return n.data.get('loaded') === false;\n });\n /** don't reset if there is an image pending insertion */\n return imgPendingInsertion !== undefined && imgPendingInsertion !== null;\n },\n renderNode(props) {\n if (props.node.type === 'image') {\n const all = Object.assign(\n {\n onDelete: opts.onDelete,\n onFocus: opts.onFocus,\n onBlur: opts.onBlur,\n maxImageWidth: opts.maxImageWidth,\n maxImageHeight: opts.maxImageHeight,\n },\n props,\n );\n return <ImageComponent {...all} />;\n }\n },\n normalizeNode: (node) => {\n const textNodeMap = {};\n const updateNodesArray = [];\n let index = 0;\n\n if (node.object !== 'document') return;\n\n node.findDescendant((d) => {\n if (d.object === 'text') {\n textNodeMap[index] = d;\n }\n\n if (d.type === 'image') {\n if (index > 0 && textNodeMap[index - 1] && textNodeMap[index - 1].text === '') {\n updateNodesArray.push(textNodeMap[index - 1]);\n }\n }\n\n index++;\n });\n\n if (!updateNodesArray.length) return;\n\n return (change) => {\n change.withoutNormalization(() => {\n updateNodesArray.forEach((n) => change.insertTextByKey(n.key, 0, ' '));\n });\n };\n },\n };\n}\n\nexport const serialization = {\n deserialize(el /*, next*/) {\n const name = el.tagName.toLowerCase();\n if (name !== 'img') return;\n\n log('deserialize: ', name);\n const style = el.style || { width: '', height: '', margin: '', justifyContent: '' };\n const width = parseInt(style.width.replace('px', ''), 10) || null;\n const height = parseInt(style.height.replace('px', ''), 10) || null;\n\n const out = {\n object: 'inline',\n type: 'image',\n isVoid: true,\n data: {\n src: el.getAttribute('src'),\n width,\n height,\n margin: el.style.margin,\n justifyContent: el.style.justifyContent,\n alignment: el.getAttribute('alignment'),\n alt: el.getAttribute('alt'),\n },\n };\n log('return object: ', out);\n return out;\n },\n serialize(object /*, children*/) {\n if (object.type !== 'image') return;\n\n const { data } = object;\n const src = data.get('src');\n const width = data.get('width');\n const height = data.get('height');\n const alignment = data.get('alignment') || 'left';\n const margin = data.get('margin');\n const justifyContent = data.get('margin');\n const alt = data.get('alt');\n const style = {};\n if (width) {\n style.width = `${width}px`;\n }\n\n if (height) {\n style.height = `${height}px`;\n }\n\n style.margin = margin;\n style.justifyContent = justifyContent;\n\n if (alignment) {\n switch (alignment) {\n case 'left':\n style.justifyContent = 'flex-start';\n style.margin = '0';\n break;\n case 'center':\n style.justifyContent = 'center';\n style.margin = '0 auto';\n break;\n case 'right':\n style.justifyContent = 'flex-end';\n style.margin = 'auto 0 0 auto';\n break;\n default:\n style.justifyContent = 'flex-start';\n break;\n }\n }\n\n style.objectFit = 'contain';\n\n const props = {\n src,\n style,\n alignment,\n alt,\n };\n\n return <img {...props} />;\n },\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../../src/plugins/image/index.jsx"],"names":["log","ImagePlugin","opts","toolbar","insertImageRequested","icon","onClick","value","onChange","inline","Inline","create","type","isVoid","data","loaded","src","undefined","change","insertInline","onFinish","getValue","InsertImageHandler","supports","node","object","customToolbar","onToolbarDone","alignment","get","alt","imageLoaded","newValues","done","update","toObject","setNodeByKey","key","Tb","disableImageAlignmentButtons","showDone","name","deleteNode","e","preventDefault","onDelete","merge","Data","deleteStatus","err","v","removeNodeByKey","stopReset","imgPendingInsertion","document","findDescendant","n","renderNode","props","all","Object","assign","onFocus","onBlur","maxImageWidth","maxImageHeight","normalizeNode","textNodeMap","updateNodesArray","index","d","text","push","length","withoutNormalization","forEach","insertTextByKey","serialization","deserialize","el","tagName","toLowerCase","style","width","height","margin","justifyContent","parseInt","replace","out","getAttribute","serialize","objectFit"],"mappings":"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","sourcesContent":["import { Data, Inline } from 'slate';\n\nimport Image from '@material-ui/icons/Image';\nimport ImageComponent from './component';\nimport ImageToolbar from './image-toolbar';\nimport InsertImageHandler from './insert-image-handler';\nimport React from 'react';\nimport debug from 'debug';\n\nconst log = debug('@pie-lib:editable-html:plugins:image');\n\nexport default function ImagePlugin(opts) {\n const toolbar = opts.insertImageRequested && {\n icon: <Image />,\n onClick: (value, onChange) => {\n log('[toolbar] onClick');\n const inline = Inline.create({\n type: 'image',\n isVoid: true,\n data: {\n loaded: false,\n src: undefined,\n },\n });\n\n const change = value.change().insertInline(inline);\n\n onChange(change);\n opts.insertImageRequested(\n inline,\n (onFinish, getValue) => new InsertImageHandler(inline, onFinish, getValue, onChange),\n );\n },\n supports: (node) => node.object === 'inline' && node.type === 'image',\n customToolbar: (node, value, onToolbarDone) => {\n const alignment = node.data.get('alignment');\n const alt = node.data.get('alt');\n const imageLoaded = node.data.get('loaded') !== false;\n const onChange = (newValues, done) => {\n const update = {\n ...node.data.toObject(),\n ...newValues,\n };\n\n const change = value.change().setNodeByKey(node.key, { data: update });\n onToolbarDone(change, done);\n };\n\n const Tb = () => (\n <ImageToolbar\n disableImageAlignmentButtons={opts.disableImageAlignmentButtons}\n alt={alt}\n imageLoaded={imageLoaded}\n alignment={alignment || 'left'}\n onChange={onChange}\n />\n );\n return Tb;\n },\n showDone: true,\n };\n\n return {\n name: 'image',\n toolbar,\n deleteNode: (e, node, value, onChange) => {\n e.preventDefault();\n if (opts.onDelete) {\n const update = node.data.merge(Data.create({ deleteStatus: 'pending' }));\n\n let change = value.change().setNodeByKey(node.key, { data: update });\n\n onChange(change);\n opts.onDelete(node.data.get('src'), (err, v) => {\n if (!err) {\n change = v.change().removeNodeByKey(node.key);\n } else {\n log('[error]: ', err);\n change = v.change().setNodeByKey(node.key, node.data.merge(Data.create({ deleteStatus: 'failed' })));\n }\n onChange(change);\n });\n } else {\n let change = value.change().removeNodeByKey(node.key);\n onChange(change);\n }\n },\n stopReset: (value) => {\n const imgPendingInsertion = value.document.findDescendant((n) => {\n if (n.type !== 'image') {\n return;\n }\n return n.data.get('loaded') === false;\n });\n /** don't reset if there is an image pending insertion */\n return imgPendingInsertion !== undefined && imgPendingInsertion !== null;\n },\n renderNode(props) {\n if (props.node.type === 'image') {\n const all = Object.assign(\n {\n onDelete: opts.onDelete,\n onFocus: opts.onFocus,\n onBlur: opts.onBlur,\n maxImageWidth: opts.maxImageWidth,\n maxImageHeight: opts.maxImageHeight,\n },\n props,\n );\n return <ImageComponent {...all} />;\n }\n },\n normalizeNode: (node) => {\n const textNodeMap = {};\n const updateNodesArray = [];\n let index = 0;\n\n if (node.object !== 'document') return;\n\n node.findDescendant((d) => {\n if (d.object === 'text') {\n textNodeMap[index] = d;\n }\n\n if (d.type === 'image') {\n if (index > 0 && textNodeMap[index - 1] && textNodeMap[index - 1].text === '') {\n updateNodesArray.push(textNodeMap[index - 1]);\n }\n }\n\n index++;\n });\n\n if (!updateNodesArray.length) return;\n\n return (change) => {\n change.withoutNormalization(() => {\n updateNodesArray.forEach((n) => change.insertTextByKey(n.key, 0, ' '));\n });\n };\n },\n };\n}\n\nexport const serialization = {\n deserialize(el /*, next*/) {\n const name = el.tagName.toLowerCase();\n if (name !== 'img') return;\n\n log('deserialize: ', name);\n const style = el.style || { width: '', height: '', margin: '', justifyContent: '' };\n const width = parseInt(style.width.replace('px', ''), 10) || null;\n const height = parseInt(style.height.replace('px', ''), 10) || null;\n\n const out = {\n object: 'inline',\n type: 'image',\n isVoid: true,\n data: {\n src: el.getAttribute('src'),\n width,\n height,\n margin: el.style.margin,\n justifyContent: el.style.justifyContent,\n alignment: el.getAttribute('alignment'),\n alt: el.getAttribute('alt'),\n },\n };\n log('return object: ', out);\n return out;\n },\n serialize(object /*, children*/) {\n if (object.type !== 'image') return;\n\n const { data } = object;\n const src = data.get('src');\n const width = data.get('width');\n const height = data.get('height');\n const alignment = data.get('alignment') || 'left';\n const margin = data.get('margin');\n const justifyContent = data.get('margin');\n const alt = data.get('alt');\n const style = {};\n if (width) {\n style.width = `${width}px`;\n }\n\n if (height) {\n style.height = `${height}px`;\n }\n\n style.margin = margin;\n style.justifyContent = justifyContent;\n\n if (alignment) {\n switch (alignment) {\n case 'left':\n style.justifyContent = 'flex-start';\n style.margin = '0';\n break;\n case 'center':\n style.justifyContent = 'center';\n style.margin = '0 auto';\n break;\n case 'right':\n style.justifyContent = 'flex-end';\n style.margin = 'auto 0 0 auto';\n break;\n default:\n style.justifyContent = 'flex-start';\n break;\n }\n }\n\n style.objectFit = 'contain';\n\n const props = {\n src,\n style,\n alignment,\n alt,\n };\n\n return <img {...props} />;\n },\n};\n"],"file":"index.js"}
@@ -19,17 +19,19 @@ var log = (0, _debug["default"])('@pie-lib:editable-html:image:insert-image-hand
19
19
  /**
20
20
  * Handles user selection, insertion (or cancellation) of an image into the editor.
21
21
  * @param {Block} placeholderBlock - a block that has been added to the editor as a place holder for the image
22
+ * @param {Function} onFinish - a function to call if uploading fails or succeeds
22
23
  * @param {Function} getValue - a function to return the value of the editor
23
24
  * @param {Function} onChange - callback to notify changes applied by the handler
24
25
  * @param {Boolean} isPasted - a boolean that keeps track if the file is pasted
25
26
  */
26
27
 
27
28
  var InsertImageHandler = /*#__PURE__*/function () {
28
- function InsertImageHandler(placeholderBlock, getValue, onChange) {
29
- var isPasted = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
29
+ function InsertImageHandler(placeholderBlock, onFinish, getValue, onChange) {
30
+ var isPasted = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
30
31
  (0, _classCallCheck2["default"])(this, InsertImageHandler);
31
32
  this.placeholderBlock = placeholderBlock;
32
33
  this.getValue = getValue;
34
+ this.onFinish = onFinish;
33
35
  this.onChange = onChange;
34
36
  this.isPasted = isPasted;
35
37
  this.chosenFile = null;
@@ -60,6 +62,7 @@ var InsertImageHandler = /*#__PURE__*/function () {
60
62
  log('insert cancelled');
61
63
  var c = this.getValue().change().removeNodeByKey(this.placeholderBlock.key);
62
64
  this.onChange(c);
65
+ this.onFinish(false);
63
66
  }
64
67
  }, {
65
68
  key: "done",
@@ -69,6 +72,7 @@ var InsertImageHandler = /*#__PURE__*/function () {
69
72
  if (err) {
70
73
  //eslint-disable-next-line
71
74
  console.log(err);
75
+ this.onFinish(false);
72
76
  } else {
73
77
  var value = this.getValue();
74
78
  var child = this.getPlaceholderInDocument(value);
@@ -81,6 +85,7 @@ var InsertImageHandler = /*#__PURE__*/function () {
81
85
  data: data
82
86
  });
83
87
  this.onChange(change);
88
+ this.onFinish(true);
84
89
  }
85
90
  }
86
91
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/plugins/image/insert-image-handler.js"],"names":["log","InsertImageHandler","placeholderBlock","getValue","onChange","isPasted","chosenFile","value","document","directChild","getChild","key","child","getDescendant","Error","c","change","removeNodeByKey","err","src","console","getPlaceholderInDocument","data","merge","Data","create","loaded","percent","setNodeByKey","file","reader","FileReader","onload","dataURL","result","set","readAsDataURL","bytes","total"],"mappings":"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","sourcesContent":["import { Data } from 'slate';\nimport debug from 'debug';\n\nconst log = debug('@pie-lib:editable-html:image:insert-image-handler');\n\n/**\n * Handles user selection, insertion (or cancellation) of an image into the editor.\n * @param {Block} placeholderBlock - a block that has been added to the editor as a place holder for the image\n * @param {Function} getValue - a function to return the value of the editor\n * @param {Function} onChange - callback to notify changes applied by the handler\n * @param {Boolean} isPasted - a boolean that keeps track if the file is pasted\n */\nclass InsertImageHandler {\n constructor(placeholderBlock, getValue, onChange, isPasted = false) {\n this.placeholderBlock = placeholderBlock;\n this.getValue = getValue;\n this.onChange = onChange;\n this.isPasted = isPasted;\n this.chosenFile = null;\n }\n\n getPlaceholderInDocument(value) {\n const { document } = value;\n const directChild = document.getChild(this.placeholderBlock.key);\n\n if (directChild) {\n return directChild;\n }\n\n const child = document.getDescendant(this.placeholderBlock.key);\n\n if (child) {\n return child;\n } else {\n //eslint-disable-next-line\n throw new Error(\"insert-image: Can't find placeholder!\");\n }\n }\n\n cancel() {\n log('insert cancelled');\n const c = this.getValue()\n .change()\n .removeNodeByKey(this.placeholderBlock.key);\n this.onChange(c);\n }\n\n done(err, src) {\n log('done: err:', err);\n if (err) {\n //eslint-disable-next-line\n console.log(err);\n } else {\n const value = this.getValue();\n const child = this.getPlaceholderInDocument(value);\n const data = child.data.merge(Data.create({ loaded: true, src, percent: 100 }));\n\n const change = value.change().setNodeByKey(this.placeholderBlock.key, { data });\n this.onChange(change);\n }\n }\n\n /**\n * Notify handler that the user chose a file - will create a change with a preview in the editor.\n *\n * @param {File} file - the file that the user chose using a file input.\n */\n fileChosen(file) {\n if (!file) {\n return;\n }\n\n // Save the chosen file to this.chosenFile\n this.chosenFile = file;\n\n log('[fileChosen] file: ', file);\n const reader = new FileReader();\n reader.onload = () => {\n const value = this.getValue();\n const dataURL = reader.result;\n const child = this.getPlaceholderInDocument(value);\n const data = child.data.set('src', dataURL);\n const change = value.change().setNodeByKey(this.placeholderBlock.key, { data });\n this.onChange(change);\n };\n reader.readAsDataURL(file);\n }\n\n progress(percent, bytes, total) {\n log('progress: ', percent, bytes, total);\n const value = this.getValue();\n const child = this.getPlaceholderInDocument(value);\n const data = child.data.set('percent', percent);\n const change = value.change().setNodeByKey(this.placeholderBlock.key, { data });\n this.onChange(change);\n }\n\n // Add a getter method to retrieve the chosen file\n getChosenFile() {\n return this.chosenFile;\n }\n}\n\nexport default InsertImageHandler;\n"],"file":"insert-image-handler.js"}
1
+ {"version":3,"sources":["../../../src/plugins/image/insert-image-handler.js"],"names":["log","InsertImageHandler","placeholderBlock","onFinish","getValue","onChange","isPasted","chosenFile","value","document","directChild","getChild","key","child","getDescendant","Error","c","change","removeNodeByKey","err","src","console","getPlaceholderInDocument","data","merge","Data","create","loaded","percent","setNodeByKey","file","reader","FileReader","onload","dataURL","result","set","readAsDataURL","bytes","total"],"mappings":"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","sourcesContent":["import { Data } from 'slate';\nimport debug from 'debug';\n\nconst log = debug('@pie-lib:editable-html:image:insert-image-handler');\n\n/**\n * Handles user selection, insertion (or cancellation) of an image into the editor.\n * @param {Block} placeholderBlock - a block that has been added to the editor as a place holder for the image\n * @param {Function} onFinish - a function to call if uploading fails or succeeds\n * @param {Function} getValue - a function to return the value of the editor\n * @param {Function} onChange - callback to notify changes applied by the handler\n * @param {Boolean} isPasted - a boolean that keeps track if the file is pasted\n */\nclass InsertImageHandler {\n constructor(placeholderBlock, onFinish, getValue, onChange, isPasted = false) {\n this.placeholderBlock = placeholderBlock;\n this.getValue = getValue;\n this.onFinish = onFinish;\n this.onChange = onChange;\n this.isPasted = isPasted;\n this.chosenFile = null;\n }\n\n getPlaceholderInDocument(value) {\n const { document } = value;\n const directChild = document.getChild(this.placeholderBlock.key);\n\n if (directChild) {\n return directChild;\n }\n\n const child = document.getDescendant(this.placeholderBlock.key);\n\n if (child) {\n return child;\n } else {\n //eslint-disable-next-line\n throw new Error(\"insert-image: Can't find placeholder!\");\n }\n }\n\n cancel() {\n log('insert cancelled');\n const c = this.getValue()\n .change()\n .removeNodeByKey(this.placeholderBlock.key);\n this.onChange(c);\n\n this.onFinish(false);\n }\n\n done(err, src) {\n log('done: err:', err);\n if (err) {\n //eslint-disable-next-line\n console.log(err);\n this.onFinish(false);\n } else {\n const value = this.getValue();\n const child = this.getPlaceholderInDocument(value);\n const data = child.data.merge(Data.create({ loaded: true, src, percent: 100 }));\n\n const change = value.change().setNodeByKey(this.placeholderBlock.key, { data });\n this.onChange(change);\n this.onFinish(true);\n }\n }\n\n /**\n * Notify handler that the user chose a file - will create a change with a preview in the editor.\n *\n * @param {File} file - the file that the user chose using a file input.\n */\n fileChosen(file) {\n if (!file) {\n return;\n }\n\n // Save the chosen file to this.chosenFile\n this.chosenFile = file;\n\n log('[fileChosen] file: ', file);\n const reader = new FileReader();\n reader.onload = () => {\n const value = this.getValue();\n const dataURL = reader.result;\n const child = this.getPlaceholderInDocument(value);\n const data = child.data.set('src', dataURL);\n const change = value.change().setNodeByKey(this.placeholderBlock.key, { data });\n this.onChange(change);\n };\n reader.readAsDataURL(file);\n }\n\n progress(percent, bytes, total) {\n log('progress: ', percent, bytes, total);\n const value = this.getValue();\n const child = this.getPlaceholderInDocument(value);\n const data = child.data.set('percent', percent);\n const change = value.change().setNodeByKey(this.placeholderBlock.key, { data });\n this.onChange(change);\n }\n\n // Add a getter method to retrieve the chosen file\n getChosenFile() {\n return this.chosenFile;\n }\n}\n\nexport default InsertImageHandler;\n"],"file":"insert-image-handler.js"}
@@ -264,7 +264,10 @@ var MediaDialog = /*#__PURE__*/function (_React$Component) {
264
264
  }
265
265
 
266
266
  handleClose(val);
267
- } else if (isInsertURL) {
267
+ return;
268
+ }
269
+
270
+ if (isInsertURL) {
268
271
  var _this$state3 = _this.state,
269
272
  ends = _this$state3.ends,
270
273
  height = _this$state3.height,
@@ -283,12 +286,22 @@ var MediaDialog = /*#__PURE__*/function (_React$Component) {
283
286
  urlToUse: urlToUse,
284
287
  src: formattedUrl
285
288
  });
286
- } else {
289
+ return;
290
+ }
291
+
292
+ if (!fileUpload.loading) {
287
293
  handleClose(val, {
288
294
  tag: 'audio',
289
295
  src: fileUpload.url
290
296
  });
297
+ return;
291
298
  }
299
+
300
+ _this.setState({
301
+ fileUpload: _objectSpread(_objectSpread({}, fileUpload), {}, {
302
+ scheduled: true
303
+ })
304
+ });
292
305
  });
293
306
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleUploadFile", /*#__PURE__*/function () {
294
307
  var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(e) {
@@ -332,18 +345,25 @@ var MediaDialog = /*#__PURE__*/function (_React$Component) {
332
345
 
333
346
  _this.setState({
334
347
  fileUpload: _objectSpread(_objectSpread({}, _this.state.fileUpload), {}, {
348
+ scheduled: false,
335
349
  loading: false,
336
350
  error: err
337
351
  })
338
352
  });
339
- } else {
340
- _this.setState({
341
- fileUpload: _objectSpread(_objectSpread({}, _this.state.fileUpload), {}, {
342
- loading: false,
343
- url: src
344
- })
345
- });
353
+
354
+ return;
346
355
  }
356
+
357
+ var fileUpload = _this.state.fileUpload;
358
+ var callback = fileUpload && fileUpload.scheduled ? _this.handleDone.bind((0, _assertThisInitialized2["default"])(_this), true) : undefined;
359
+
360
+ _this.setState({
361
+ fileUpload: _objectSpread(_objectSpread({}, fileUpload), {}, {
362
+ scheduled: false,
363
+ loading: false,
364
+ url: src
365
+ })
366
+ }, callback);
347
367
  }
348
368
  });
349
369
 
@@ -410,9 +430,10 @@ var MediaDialog = /*#__PURE__*/function (_React$Component) {
410
430
  width: _width || 560,
411
431
  tabValue: 0,
412
432
  fileUpload: {
433
+ error: null,
413
434
  loading: false,
414
- url: '',
415
- error: null
435
+ scheduled: false,
436
+ url: ''
416
437
  }
417
438
  };
418
439
  return _this;
@@ -455,7 +476,7 @@ var MediaDialog = /*#__PURE__*/function (_React$Component) {
455
476
  var isYoutube = matchYoutubeUrl(url);
456
477
  var isInsertURL = tabValue === 0;
457
478
  var isUploadMedia = tabValue === 1;
458
- var submitIsDisabled = isInsertURL ? invalid || url === null || url === undefined : !fileUpload.url;
479
+ var submitIsDisabled = isInsertURL ? invalid || url === null || url === undefined : !fileUpload.url || fileUpload.scheduled;
459
480
  return /*#__PURE__*/_react["default"].createElement(_Dialog["default"], {
460
481
  classes: {
461
482
  paper: classes.paper
@@ -558,9 +579,11 @@ var MediaDialog = /*#__PURE__*/function (_React$Component) {
558
579
  "aria-label": "delete",
559
580
  className: classes.deleteIcon,
560
581
  onClick: this.handleRemoveFile
561
- }, /*#__PURE__*/_react["default"].createElement(_Delete["default"], null))), fileUpload.loading ? /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
582
+ }, /*#__PURE__*/_react["default"].createElement(_Delete["default"], null))), !fileUpload.scheduled && fileUpload.loading ? /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
583
+ variant: "subheading"
584
+ }, "Loading...") : null, fileUpload.scheduled ? /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
562
585
  variant: "subheading"
563
- }, "Loading...") : null) : !fileUpload.loading ? /*#__PURE__*/_react["default"].createElement("input", {
586
+ }, "Waiting for Upload to finish, then inserting item...") : null) : !fileUpload.loading ? /*#__PURE__*/_react["default"].createElement("input", {
564
587
  accept: "audio/*",
565
588
  className: classes.input,
566
589
  onChange: this.handleUploadFile,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/plugins/media/media-dialog.js"],"names":["log","matchYoutubeUrl","url","p","match","matchVimeoUrl","test","matchSoundCloudUrl","regexp","makeApiRequest","Promise","resolve","fetch","then","response","json","d","document","createElement","innerHTML","html","iframe","querySelector","src","err","typeMap","video","audio","MediaDialog","props","state","urlToUse","starts","ends","isYoutube","isVimeo","formattedUrl","params","paramName","paramStart","push","length","join","callback","setState","updating","newState","formatUrl","e","target","value","type","handleStateChange","invalid","regExp","id","replace","val","handleClose","tabValue","fileUpload","isInsertURL","handleRemoveFile","height","width","tag","preventDefault","error","loading","fileChosen","files","reader","FileReader","onload","dataURL","result","readAsDataURL","uploadSoundSupport","add","done","console","urlChange","classes","open","disablePortal","edit","isUploadMedia","submitIsDisabled","undefined","paper","handleDone","row","event","root","properties","changeHandler","uploadInput","deleteIcon","input","handleUploadFile","React","Component","PropTypes","object","isRequired","bool","func","shape","string","number","styles","theme","minWidth","padding","display","flexDirection","rowItem","marginRight","spacing","unit","cursor","active","color","primary","borderBottom","marginTop","palette","main","marginLeft"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport debug from 'debug';\nimport { color } from '@pie-lib/render-ui';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport MuiTabs from '@material-ui/core/Tabs';\nimport MuiTab from '@material-ui/core/Tab';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport IconButton from '@material-ui/core/IconButton';\nimport ActionDelete from '@material-ui/icons/Delete';\n\nconst log = debug('@pie-lib:editable-html:plugins:media:dialog');\n\nconst matchYoutubeUrl = (url) => {\n if (!url) {\n return false;\n }\n\n const p = /^(?:https?:\\/\\/)?(?:m\\.|www\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=))((\\w|-){11})(?:\\S+)?$/;\n if (url.match(p)) {\n return url.match(p)[1];\n }\n return false;\n};\n\nconst matchVimeoUrl = (url) =>\n url &&\n /(http|https)?:\\/\\/(www\\.)?(player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^/]*)\\/videos\\/|)(video\\/)?(\\d+)(?:|\\/\\?)/.test(\n url,\n );\n\nconst matchSoundCloudUrl = (url) => {\n if (!url) {\n return false;\n }\n\n const regexp = /^https?:\\/\\/(soundcloud\\.com|snd\\.sc)\\/(.*)$/;\n return url.match(regexp) && url.match(regexp)[2];\n};\n\nconst makeApiRequest = (url) => {\n return new Promise((resolve) => {\n try {\n fetch(`https://soundcloud.com/oembed?format=json&url=${url}`)\n .then((response) => response.json())\n .then((json) => {\n const d = document.createElement('div');\n\n d.innerHTML = json.html;\n\n const iframe = d.querySelector('iframe');\n\n resolve(iframe.src);\n })\n .catch((err) => {\n resolve('');\n log(err);\n });\n } catch (err) {\n resolve('');\n }\n });\n};\n\nconst typeMap = {\n video: 'Video',\n audio: 'Audio',\n};\n\nexport class MediaDialog extends React.Component {\n static propTypes = {\n classes: PropTypes.object.isRequired,\n open: PropTypes.bool,\n edit: PropTypes.bool,\n disablePortal: PropTypes.bool,\n handleClose: PropTypes.func,\n uploadSoundSupport: PropTypes.shape({\n add: PropTypes.func,\n delete: PropTypes.func,\n }),\n type: PropTypes.string,\n src: PropTypes.string,\n url: PropTypes.string,\n urlToUse: PropTypes.string,\n starts: PropTypes.number,\n ends: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n };\n\n constructor(props) {\n super(props);\n\n const { src, starts, ends, height, url, urlToUse, width } = props;\n\n this.state = {\n ends: ends || 0,\n url: url,\n urlToUse: urlToUse,\n formattedUrl: src,\n height: height || 315,\n invalid: false,\n starts: starts || 0,\n width: width || 560,\n tabValue: 0,\n fileUpload: {\n loading: false,\n url: '',\n error: null,\n },\n };\n }\n\n componentDidMount() {\n if (this.props.url) {\n this.urlChange({\n target: {\n value: this.props.url,\n },\n });\n }\n }\n\n formatUrl = () => {\n const { url, urlToUse, starts, ends } = this.state;\n const isYoutube = matchYoutubeUrl(url);\n const isVimeo = matchVimeoUrl(url);\n let formattedUrl = urlToUse;\n\n if ((isYoutube || isVimeo) && urlToUse) {\n const params = [];\n\n let paramName;\n let paramStart;\n\n switch (true) {\n case isVimeo:\n paramName = 't';\n paramStart = '#';\n break;\n case isYoutube:\n paramName = 'start';\n paramStart = '?';\n break;\n default:\n paramName = 'start';\n paramStart = '?';\n }\n\n if (starts) {\n params.push(`${paramName}=${starts}`);\n }\n\n if (ends) {\n params.push(`end=${ends}`);\n }\n\n formattedUrl = `${urlToUse}${params.length ? paramStart : ''}${params.join('&')}`;\n }\n\n const callback = () => this.setState({ formattedUrl, updating: false });\n\n this.setState({ formattedUrl: null, updating: true }, callback);\n };\n\n handleStateChange = (newState) => this.setState(newState, this.formatUrl);\n\n urlChange = (e) => {\n const { value } = e.target || {};\n const { type } = this.props;\n\n if (type && type === 'audio') {\n if (matchSoundCloudUrl(value)) {\n makeApiRequest(value)\n .then((urlToUse) => {\n this.handleStateChange({\n urlToUse,\n invalid: !urlToUse,\n url: value,\n });\n })\n .catch(log);\n\n return;\n }\n } else if (type && type === 'video') {\n if (matchYoutubeUrl(value)) {\n const regExp = /^.*(youtu\\.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n const match = value.match(regExp);\n const id = match[2];\n const urlToUse = `https://youtube.com/embed/${id}`;\n\n log('is youtube');\n\n this.handleStateChange({\n urlToUse,\n url: value,\n invalid: false,\n });\n\n return;\n }\n\n if (matchVimeoUrl(value)) {\n const id = value.replace(/.*vimeo.com\\/(.*)/g, '$1');\n const urlToUse = `https://player.vimeo.com/video/${id}`;\n\n log('is vimeo');\n\n this.handleStateChange({\n urlToUse,\n url: value,\n ends: null,\n invalid: false,\n });\n\n return;\n }\n }\n\n this.handleStateChange({\n urlToUse: null,\n url: null,\n invalid: true,\n });\n };\n\n changeHandler = (type) => (e) => this.handleStateChange({ [type]: e.target.value });\n\n handleDone = (val) => {\n const { handleClose } = this.props;\n const { tabValue, fileUpload } = this.state;\n const isInsertURL = tabValue === 0;\n\n if (!val) {\n if (fileUpload.url) {\n this.handleRemoveFile();\n }\n\n handleClose(val);\n } else if (isInsertURL) {\n const { ends, height, url, urlToUse, formattedUrl, starts, width } = this.state;\n\n handleClose(val, {\n tag: 'iframe',\n ends,\n height,\n starts,\n width,\n url,\n urlToUse,\n src: formattedUrl,\n });\n } else {\n handleClose(val, {\n tag: 'audio',\n src: fileUpload.url,\n });\n }\n };\n\n handleUploadFile = async (e) => {\n e.preventDefault();\n\n this.setState({\n fileUpload: {\n ...this.state.fileUpload,\n error: null,\n loading: true,\n },\n });\n\n const fileChosen = e.target.files[0];\n\n const reader = new FileReader();\n\n reader.onload = () => {\n const dataURL = reader.result;\n\n this.setState({\n fileUpload: {\n ...this.state.fileUpload,\n url: dataURL,\n },\n });\n };\n reader.readAsDataURL(fileChosen);\n\n this.props.uploadSoundSupport.add({\n fileChosen,\n done: (err, src) => {\n log('done: err:', err);\n if (err) {\n //eslint-disable-next-line\n console.log(err);\n this.setState({\n fileUpload: {\n ...this.state.fileUpload,\n loading: false,\n error: err,\n },\n });\n } else {\n this.setState({\n fileUpload: {\n ...this.state.fileUpload,\n loading: false,\n url: src,\n },\n });\n }\n },\n });\n };\n\n handleRemoveFile = async () => {\n this.props.uploadSoundSupport.delete(this.state.fileUpload.url, (err) => {\n if (err) {\n //eslint-disable-next-line\n console.log(err);\n this.setState({\n fileUpload: {\n ...this.state.fileUpload,\n error: err,\n },\n });\n }\n });\n\n // we should put it inside uploadSoundSupport.delete but we can leave it here for testing purposes\n this.setState({\n fileUpload: {\n ...this.state.fileUpload,\n loading: false,\n url: '',\n },\n });\n };\n\n render() {\n const { classes, open, disablePortal, type, edit, uploadSoundSupport } = this.props;\n const { ends, height, invalid, starts, width, url, formattedUrl, updating, tabValue, fileUpload } = this.state;\n const isYoutube = matchYoutubeUrl(url);\n const isInsertURL = tabValue === 0;\n const isUploadMedia = tabValue === 1;\n const submitIsDisabled = isInsertURL ? invalid || url === null || url === undefined : !fileUpload.url;\n\n return (\n <Dialog\n classes={{\n paper: classes.paper,\n }}\n disablePortal={disablePortal}\n open={open}\n onClose={() => this.handleDone(false)}\n aria-labelledby=\"form-dialog-title\"\n >\n <DialogTitle id=\"form-dialog-title\">Insert {typeMap[type]}</DialogTitle>\n <DialogContent>\n <div>\n <div className={classes.row}>\n <MuiTabs\n indicatorColor=\"primary\"\n value={tabValue}\n onChange={(event, value) => {\n this.setState({ tabValue: value });\n }}\n >\n <MuiTab label={type === 'video' ? 'Insert YouTube or Vimeo URL' : 'Insert SoundCloud URL'} />\n {uploadSoundSupport?.add && uploadSoundSupport?.delete && type !== 'video' ? (\n <MuiTab label=\"Upload file\" />\n ) : null}\n </MuiTabs>\n </div>\n {isInsertURL && (\n <div>\n <TextField\n autoFocus\n error={invalid}\n helperText={invalid ? 'Invalid URL' : ''}\n margin=\"dense\"\n id=\"name\"\n label=\"URL\"\n placeholder={`Paste URL of ${type}...`}\n type=\"text\"\n onChange={this.urlChange}\n value={url}\n fullWidth\n />\n {type === 'video' && (\n <DialogContent\n classes={{\n root: classes.properties,\n }}\n >\n <DialogContentText>Video Properties</DialogContentText>\n <TextField\n autoFocus\n margin=\"dense\"\n id=\"width\"\n label=\"Width\"\n type=\"number\"\n placeholder=\"Width\"\n value={width}\n onChange={this.changeHandler('width')}\n />\n <TextField\n autoFocus\n margin=\"dense\"\n id=\"height\"\n label=\"Height\"\n type=\"number\"\n placeholder=\"Height\"\n value={height}\n onChange={this.changeHandler('height')}\n />\n </DialogContent>\n )}\n {formattedUrl && (\n <iframe\n width={width}\n height={height}\n src={formattedUrl}\n frameBorder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n />\n )}\n {type === 'video' && (formattedUrl || updating) && !invalid && (\n <React.Fragment>\n <DialogContent\n classes={{\n root: classes.properties,\n }}\n >\n <TextField\n autoFocus\n margin=\"dense\"\n id=\"starts\"\n label=\"Starts\"\n type=\"number\"\n placeholder=\"Starts\"\n value={starts}\n onChange={this.changeHandler('starts')}\n />\n {isYoutube && (\n <TextField\n autoFocus\n margin=\"dense\"\n id=\"ends\"\n label=\"Ends\"\n type=\"number\"\n placeholder=\"Ends\"\n value={ends}\n onChange={this.changeHandler('ends')}\n />\n )}\n </DialogContent>\n </React.Fragment>\n )}\n </div>\n )}\n {isUploadMedia && (\n <div className={classes.uploadInput}>\n <div>\n {fileUpload.url ? (\n <>\n <div className={classes.row}>\n <audio controls=\"controls\">\n <source type=\"audio/mp3\" src={fileUpload.url} />\n </audio>\n <IconButton aria-label=\"delete\" className={classes.deleteIcon} onClick={this.handleRemoveFile}>\n <ActionDelete />\n </IconButton>\n </div>\n {fileUpload.loading ? <Typography variant=\"subheading\">Loading...</Typography> : null}\n </>\n ) : !fileUpload.loading ? (\n <input accept=\"audio/*\" className={classes.input} onChange={this.handleUploadFile} type=\"file\" />\n ) : null}\n {!!fileUpload.error && (\n <Typography className={classes.error} variant=\"caption\">\n {fileUpload.error}\n </Typography>\n )}\n </div>\n </div>\n )}\n </div>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => this.handleDone(false)} color=\"primary\">\n Cancel\n </Button>\n <Button disabled={submitIsDisabled} onClick={() => this.handleDone(true)} color=\"primary\">\n {edit ? 'Update' : 'Insert'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nconst styles = (theme) => ({\n paper: {\n minWidth: '500px',\n },\n properties: {\n padding: 0,\n },\n row: {\n display: 'flex',\n flexDirection: 'space-between',\n },\n rowItem: {\n marginRight: theme.spacing.unit * 1.5,\n cursor: 'pointer',\n },\n active: {\n color: color.primary(),\n borderBottom: `2px solid ${color.primary()}`,\n },\n uploadInput: {\n marginTop: theme.spacing.unit * 1.5,\n },\n error: {\n marginTop: theme.spacing.unit * 1.5,\n color: theme.palette.error.main,\n },\n deleteIcon: {\n marginLeft: theme.spacing.unit * 1.5,\n },\n});\n\nexport default withStyles(styles)(MediaDialog);\n"],"file":"media-dialog.js"}
1
+ {"version":3,"sources":["../../../src/plugins/media/media-dialog.js"],"names":["log","matchYoutubeUrl","url","p","match","matchVimeoUrl","test","matchSoundCloudUrl","regexp","makeApiRequest","Promise","resolve","fetch","then","response","json","d","document","createElement","innerHTML","html","iframe","querySelector","src","err","typeMap","video","audio","MediaDialog","props","state","urlToUse","starts","ends","isYoutube","isVimeo","formattedUrl","params","paramName","paramStart","push","length","join","callback","setState","updating","newState","formatUrl","e","target","value","type","handleStateChange","invalid","regExp","id","replace","val","handleClose","tabValue","fileUpload","isInsertURL","handleRemoveFile","height","width","tag","loading","scheduled","preventDefault","error","fileChosen","files","reader","FileReader","onload","dataURL","result","readAsDataURL","uploadSoundSupport","add","done","console","handleDone","bind","undefined","urlChange","classes","open","disablePortal","edit","isUploadMedia","submitIsDisabled","paper","row","event","root","properties","changeHandler","uploadInput","deleteIcon","input","handleUploadFile","React","Component","PropTypes","object","isRequired","bool","func","shape","string","number","styles","theme","minWidth","padding","display","flexDirection","rowItem","marginRight","spacing","unit","cursor","active","color","primary","borderBottom","marginTop","palette","main","marginLeft"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport debug from 'debug';\nimport { color } from '@pie-lib/render-ui';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport MuiTabs from '@material-ui/core/Tabs';\nimport MuiTab from '@material-ui/core/Tab';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport IconButton from '@material-ui/core/IconButton';\nimport ActionDelete from '@material-ui/icons/Delete';\n\nconst log = debug('@pie-lib:editable-html:plugins:media:dialog');\n\nconst matchYoutubeUrl = (url) => {\n if (!url) {\n return false;\n }\n\n const p = /^(?:https?:\\/\\/)?(?:m\\.|www\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=))((\\w|-){11})(?:\\S+)?$/;\n if (url.match(p)) {\n return url.match(p)[1];\n }\n return false;\n};\n\nconst matchVimeoUrl = (url) =>\n url &&\n /(http|https)?:\\/\\/(www\\.)?(player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^/]*)\\/videos\\/|)(video\\/)?(\\d+)(?:|\\/\\?)/.test(\n url,\n );\n\nconst matchSoundCloudUrl = (url) => {\n if (!url) {\n return false;\n }\n\n const regexp = /^https?:\\/\\/(soundcloud\\.com|snd\\.sc)\\/(.*)$/;\n return url.match(regexp) && url.match(regexp)[2];\n};\n\nconst makeApiRequest = (url) => {\n return new Promise((resolve) => {\n try {\n fetch(`https://soundcloud.com/oembed?format=json&url=${url}`)\n .then((response) => response.json())\n .then((json) => {\n const d = document.createElement('div');\n\n d.innerHTML = json.html;\n\n const iframe = d.querySelector('iframe');\n\n resolve(iframe.src);\n })\n .catch((err) => {\n resolve('');\n log(err);\n });\n } catch (err) {\n resolve('');\n }\n });\n};\n\nconst typeMap = {\n video: 'Video',\n audio: 'Audio',\n};\n\nexport class MediaDialog extends React.Component {\n static propTypes = {\n classes: PropTypes.object.isRequired,\n open: PropTypes.bool,\n edit: PropTypes.bool,\n disablePortal: PropTypes.bool,\n handleClose: PropTypes.func,\n uploadSoundSupport: PropTypes.shape({\n add: PropTypes.func,\n delete: PropTypes.func,\n }),\n type: PropTypes.string,\n src: PropTypes.string,\n url: PropTypes.string,\n urlToUse: PropTypes.string,\n starts: PropTypes.number,\n ends: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n };\n\n constructor(props) {\n super(props);\n\n const { src, starts, ends, height, url, urlToUse, width } = props;\n\n this.state = {\n ends: ends || 0,\n url: url,\n urlToUse: urlToUse,\n formattedUrl: src,\n height: height || 315,\n invalid: false,\n starts: starts || 0,\n width: width || 560,\n tabValue: 0,\n fileUpload: {\n error: null,\n loading: false,\n scheduled: false,\n url: '',\n },\n };\n }\n\n componentDidMount() {\n if (this.props.url) {\n this.urlChange({\n target: {\n value: this.props.url,\n },\n });\n }\n }\n\n formatUrl = () => {\n const { url, urlToUse, starts, ends } = this.state;\n const isYoutube = matchYoutubeUrl(url);\n const isVimeo = matchVimeoUrl(url);\n let formattedUrl = urlToUse;\n\n if ((isYoutube || isVimeo) && urlToUse) {\n const params = [];\n\n let paramName;\n let paramStart;\n\n switch (true) {\n case isVimeo:\n paramName = 't';\n paramStart = '#';\n break;\n case isYoutube:\n paramName = 'start';\n paramStart = '?';\n break;\n default:\n paramName = 'start';\n paramStart = '?';\n }\n\n if (starts) {\n params.push(`${paramName}=${starts}`);\n }\n\n if (ends) {\n params.push(`end=${ends}`);\n }\n\n formattedUrl = `${urlToUse}${params.length ? paramStart : ''}${params.join('&')}`;\n }\n\n const callback = () => this.setState({ formattedUrl, updating: false });\n\n this.setState({ formattedUrl: null, updating: true }, callback);\n };\n\n handleStateChange = (newState) => this.setState(newState, this.formatUrl);\n\n urlChange = (e) => {\n const { value } = e.target || {};\n const { type } = this.props;\n\n if (type && type === 'audio') {\n if (matchSoundCloudUrl(value)) {\n makeApiRequest(value)\n .then((urlToUse) => {\n this.handleStateChange({\n urlToUse,\n invalid: !urlToUse,\n url: value,\n });\n })\n .catch(log);\n\n return;\n }\n } else if (type && type === 'video') {\n if (matchYoutubeUrl(value)) {\n const regExp = /^.*(youtu\\.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n const match = value.match(regExp);\n const id = match[2];\n const urlToUse = `https://youtube.com/embed/${id}`;\n\n log('is youtube');\n\n this.handleStateChange({\n urlToUse,\n url: value,\n invalid: false,\n });\n\n return;\n }\n\n if (matchVimeoUrl(value)) {\n const id = value.replace(/.*vimeo.com\\/(.*)/g, '$1');\n const urlToUse = `https://player.vimeo.com/video/${id}`;\n\n log('is vimeo');\n\n this.handleStateChange({\n urlToUse,\n url: value,\n ends: null,\n invalid: false,\n });\n\n return;\n }\n }\n\n this.handleStateChange({\n urlToUse: null,\n url: null,\n invalid: true,\n });\n };\n\n changeHandler = (type) => (e) => this.handleStateChange({ [type]: e.target.value });\n\n handleDone = (val) => {\n const { handleClose } = this.props;\n const { tabValue, fileUpload } = this.state;\n const isInsertURL = tabValue === 0;\n\n if (!val) {\n if (fileUpload.url) {\n this.handleRemoveFile();\n }\n\n handleClose(val);\n return;\n }\n\n if (isInsertURL) {\n const { ends, height, url, urlToUse, formattedUrl, starts, width } = this.state;\n\n handleClose(val, {\n tag: 'iframe',\n ends,\n height,\n starts,\n width,\n url,\n urlToUse,\n src: formattedUrl,\n });\n return;\n }\n\n if (!fileUpload.loading) {\n handleClose(val, {\n tag: 'audio',\n src: fileUpload.url,\n });\n return;\n }\n\n this.setState({\n fileUpload: {\n ...fileUpload,\n scheduled: true,\n },\n });\n };\n\n handleUploadFile = async (e) => {\n e.preventDefault();\n\n this.setState({\n fileUpload: {\n ...this.state.fileUpload,\n error: null,\n loading: true,\n },\n });\n\n const fileChosen = e.target.files[0];\n\n const reader = new FileReader();\n\n reader.onload = () => {\n const dataURL = reader.result;\n\n this.setState({\n fileUpload: {\n ...this.state.fileUpload,\n url: dataURL,\n },\n });\n };\n reader.readAsDataURL(fileChosen);\n\n this.props.uploadSoundSupport.add({\n fileChosen,\n done: (err, src) => {\n log('done: err:', err);\n if (err) {\n //eslint-disable-next-line\n console.log(err);\n this.setState({\n fileUpload: {\n ...this.state.fileUpload,\n scheduled: false,\n loading: false,\n error: err,\n },\n });\n return;\n }\n\n const { fileUpload } = this.state;\n const callback = fileUpload && fileUpload.scheduled ? this.handleDone.bind(this, true) : undefined;\n\n this.setState(\n {\n fileUpload: {\n ...fileUpload,\n scheduled: false,\n loading: false,\n url: src,\n },\n },\n callback,\n );\n },\n });\n };\n\n handleRemoveFile = async () => {\n this.props.uploadSoundSupport.delete(this.state.fileUpload.url, (err) => {\n if (err) {\n //eslint-disable-next-line\n console.log(err);\n this.setState({\n fileUpload: {\n ...this.state.fileUpload,\n error: err,\n },\n });\n }\n });\n\n // we should put it inside uploadSoundSupport.delete but we can leave it here for testing purposes\n this.setState({\n fileUpload: {\n ...this.state.fileUpload,\n loading: false,\n url: '',\n },\n });\n };\n\n render() {\n const { classes, open, disablePortal, type, edit, uploadSoundSupport } = this.props;\n const { ends, height, invalid, starts, width, url, formattedUrl, updating, tabValue, fileUpload } = this.state;\n const isYoutube = matchYoutubeUrl(url);\n const isInsertURL = tabValue === 0;\n const isUploadMedia = tabValue === 1;\n const submitIsDisabled = isInsertURL\n ? invalid || url === null || url === undefined\n : !fileUpload.url || fileUpload.scheduled;\n\n return (\n <Dialog\n classes={{\n paper: classes.paper,\n }}\n disablePortal={disablePortal}\n open={open}\n onClose={() => this.handleDone(false)}\n aria-labelledby=\"form-dialog-title\"\n >\n <DialogTitle id=\"form-dialog-title\">Insert {typeMap[type]}</DialogTitle>\n <DialogContent>\n <div>\n <div className={classes.row}>\n <MuiTabs\n indicatorColor=\"primary\"\n value={tabValue}\n onChange={(event, value) => {\n this.setState({ tabValue: value });\n }}\n >\n <MuiTab label={type === 'video' ? 'Insert YouTube or Vimeo URL' : 'Insert SoundCloud URL'} />\n {uploadSoundSupport?.add && uploadSoundSupport?.delete && type !== 'video' ? (\n <MuiTab label=\"Upload file\" />\n ) : null}\n </MuiTabs>\n </div>\n {isInsertURL && (\n <div>\n <TextField\n autoFocus\n error={invalid}\n helperText={invalid ? 'Invalid URL' : ''}\n margin=\"dense\"\n id=\"name\"\n label=\"URL\"\n placeholder={`Paste URL of ${type}...`}\n type=\"text\"\n onChange={this.urlChange}\n value={url}\n fullWidth\n />\n {type === 'video' && (\n <DialogContent\n classes={{\n root: classes.properties,\n }}\n >\n <DialogContentText>Video Properties</DialogContentText>\n <TextField\n autoFocus\n margin=\"dense\"\n id=\"width\"\n label=\"Width\"\n type=\"number\"\n placeholder=\"Width\"\n value={width}\n onChange={this.changeHandler('width')}\n />\n <TextField\n autoFocus\n margin=\"dense\"\n id=\"height\"\n label=\"Height\"\n type=\"number\"\n placeholder=\"Height\"\n value={height}\n onChange={this.changeHandler('height')}\n />\n </DialogContent>\n )}\n {formattedUrl && (\n <iframe\n width={width}\n height={height}\n src={formattedUrl}\n frameBorder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n />\n )}\n {type === 'video' && (formattedUrl || updating) && !invalid && (\n <React.Fragment>\n <DialogContent\n classes={{\n root: classes.properties,\n }}\n >\n <TextField\n autoFocus\n margin=\"dense\"\n id=\"starts\"\n label=\"Starts\"\n type=\"number\"\n placeholder=\"Starts\"\n value={starts}\n onChange={this.changeHandler('starts')}\n />\n {isYoutube && (\n <TextField\n autoFocus\n margin=\"dense\"\n id=\"ends\"\n label=\"Ends\"\n type=\"number\"\n placeholder=\"Ends\"\n value={ends}\n onChange={this.changeHandler('ends')}\n />\n )}\n </DialogContent>\n </React.Fragment>\n )}\n </div>\n )}\n {isUploadMedia && (\n <div className={classes.uploadInput}>\n <div>\n {fileUpload.url ? (\n <>\n <div className={classes.row}>\n <audio controls=\"controls\">\n <source type=\"audio/mp3\" src={fileUpload.url} />\n </audio>\n <IconButton aria-label=\"delete\" className={classes.deleteIcon} onClick={this.handleRemoveFile}>\n <ActionDelete />\n </IconButton>\n </div>\n {!fileUpload.scheduled && fileUpload.loading ? (\n <Typography variant=\"subheading\">Loading...</Typography>\n ) : null}\n {fileUpload.scheduled ? (\n <Typography variant=\"subheading\">\n Waiting for Upload to finish, then inserting item...\n </Typography>\n ) : null}\n </>\n ) : !fileUpload.loading ? (\n <input accept=\"audio/*\" className={classes.input} onChange={this.handleUploadFile} type=\"file\" />\n ) : null}\n {!!fileUpload.error && (\n <Typography className={classes.error} variant=\"caption\">\n {fileUpload.error}\n </Typography>\n )}\n </div>\n </div>\n )}\n </div>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => this.handleDone(false)} color=\"primary\">\n Cancel\n </Button>\n <Button disabled={submitIsDisabled} onClick={() => this.handleDone(true)} color=\"primary\">\n {edit ? 'Update' : 'Insert'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nconst styles = (theme) => ({\n paper: {\n minWidth: '500px',\n },\n properties: {\n padding: 0,\n },\n row: {\n display: 'flex',\n flexDirection: 'space-between',\n },\n rowItem: {\n marginRight: theme.spacing.unit * 1.5,\n cursor: 'pointer',\n },\n active: {\n color: color.primary(),\n borderBottom: `2px solid ${color.primary()}`,\n },\n uploadInput: {\n marginTop: theme.spacing.unit * 1.5,\n },\n error: {\n marginTop: theme.spacing.unit * 1.5,\n color: theme.palette.error.main,\n },\n deleteIcon: {\n marginLeft: theme.spacing.unit * 1.5,\n },\n});\n\nexport default withStyles(styles)(MediaDialog);\n"],"file":"media-dialog.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-lib/editable-html",
3
- "version": "11.0.10-next.0+2ed4add0",
3
+ "version": "11.1.0",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "main": "lib/index.js",
@@ -47,6 +47,6 @@
47
47
  "publishConfig": {
48
48
  "access": "public"
49
49
  },
50
- "gitHead": "2ed4add0b4f7b2bd7e906b715a2b86c442e41d69",
50
+ "gitHead": "11b96e3988cea4272cd2282b56d34e6cce8eeb64",
51
51
  "scripts": {}
52
52
  }
package/src/editor.jsx CHANGED
@@ -134,6 +134,7 @@ export class Editor extends React.Component {
134
134
  this.state = {
135
135
  value: props.value,
136
136
  toolbarOpts: createToolbarOpts(props.toolbarOpts, props.error),
137
+ pendingImages: [],
137
138
  isHtmlMode: false,
138
139
  isEdited: false,
139
140
  dialog: {
@@ -212,13 +213,42 @@ export class Editor extends React.Component {
212
213
  }),
213
214
  insertImageRequested:
214
215
  props.imageSupport &&
215
- ((getHandler) => {
216
- /**
217
- * The handler is the object through which the outer context
218
- * communicates file upload events like: fileChosen, cancel, progress
219
- */
220
- const handler = getHandler(() => this.state.value);
221
- props.imageSupport.add(handler);
216
+ ((addedImage, getHandler) => {
217
+ const { pendingImages } = this.state;
218
+ const onFinish = (result) => {
219
+ let cb;
220
+
221
+ if (this.state.scheduled && result) {
222
+ // finish editing only on success
223
+ cb = this.onEditingDone.bind(this);
224
+ }
225
+
226
+ const newPendingImages = this.state.pendingImages.filter((img) => img.key !== addedImage.key);
227
+ const newState = {
228
+ pendingImages: newPendingImages,
229
+ };
230
+
231
+ if (newPendingImages.length === 0) {
232
+ newState.scheduled = false;
233
+ }
234
+
235
+ this.setState(newState, cb);
236
+ };
237
+ const callback = () => {
238
+ /**
239
+ * The handler is the object through which the outer context
240
+ * communicates file upload events like: fileChosen, cancel, progress
241
+ */
242
+ const handler = getHandler(onFinish, () => this.state.value);
243
+ props.imageSupport.add(handler);
244
+ };
245
+
246
+ this.setState(
247
+ {
248
+ pendingImages: [...pendingImages, addedImage],
249
+ },
250
+ callback,
251
+ );
222
252
  }),
223
253
  onFocus: this.onPluginFocus,
224
254
  onBlur: this.onPluginBlur,
@@ -394,8 +424,15 @@ export class Editor extends React.Component {
394
424
  return;
395
425
  }
396
426
 
427
+ const { pendingImages } = this.state;
428
+
429
+ if (pendingImages.length) {
430
+ this.setState({ scheduled: true });
431
+ return;
432
+ }
433
+
397
434
  log('[onEditingDone]');
398
- this.setState({ stashedValue: null, focusedNode: null });
435
+ this.setState({ pendingImages: [], stashedValue: null, focusedNode: null });
399
436
  log('[onEditingDone] value: ', this.state.value);
400
437
  this.props.onChange(this.state.value, true);
401
438
  };
@@ -712,7 +749,13 @@ export class Editor extends React.Component {
712
749
 
713
750
  const ch = change.insertInline(inline);
714
751
  this.onChange(ch);
715
- const handler = new InsertImageHandler(inline, () => this.state.value, this.onChange, true);
752
+ const handler = new InsertImageHandler(
753
+ inline,
754
+ () => {},
755
+ () => this.state.value,
756
+ this.onChange,
757
+ true,
758
+ );
716
759
  handler.fileChosen(file);
717
760
  this.props.imageSupport.add(handler);
718
761
  } catch (err) {
@@ -780,7 +823,7 @@ export class Editor extends React.Component {
780
823
  onKeyDown,
781
824
  } = this.props;
782
825
 
783
- const { value, focusedNode, toolbarOpts, dialog } = this.state;
826
+ const { value, focusedNode, toolbarOpts, dialog, scheduled } = this.state;
784
827
 
785
828
  log('[render] value: ', value);
786
829
  const sizeStyle = this.buildSizeStyle();
@@ -788,12 +831,14 @@ export class Editor extends React.Component {
788
831
  {
789
832
  [classes.withBg]: highlightShape,
790
833
  [classes.toolbarOnTop]: toolbarOpts.alwaysVisible && toolbarOpts.position === 'top',
834
+ [classes.scheduled]: scheduled,
791
835
  },
792
836
  className,
793
837
  );
794
838
 
795
839
  return (
796
840
  <div ref={(ref) => (this.wrapperRef = ref)} style={{ width: sizeStyle.width }} className={names}>
841
+ {scheduled && <div className={classes.uploading}>Uploading image and then saving...</div>}
797
842
  <SlateEditor
798
843
  plugins={this.plugins}
799
844
  innerRef={(r) => {
@@ -856,6 +901,17 @@ const styles = {
856
901
  withBg: {
857
902
  backgroundColor: 'rgba(0,0,0,0.06)',
858
903
  },
904
+ scheduled: {
905
+ opacity: 0.5,
906
+ pointerEvents: 'none',
907
+ position: 'relative',
908
+ },
909
+ uploading: {
910
+ position: 'absolute',
911
+ top: '50%',
912
+ left: '50%',
913
+ transform: 'translate(-50%, -50%)',
914
+ },
859
915
  slateEditor: {
860
916
  fontFamily: 'Roboto, sans-serif',
861
917
 
@@ -24,8 +24,12 @@ export default function ImagePlugin(opts) {
24
24
  });
25
25
 
26
26
  const change = value.change().insertInline(inline);
27
+
27
28
  onChange(change);
28
- opts.insertImageRequested((getValue) => new InsertImageHandler(inline, getValue, onChange));
29
+ opts.insertImageRequested(
30
+ inline,
31
+ (onFinish, getValue) => new InsertImageHandler(inline, onFinish, getValue, onChange),
32
+ );
29
33
  },
30
34
  supports: (node) => node.object === 'inline' && node.type === 'image',
31
35
  customToolbar: (node, value, onToolbarDone) => {
@@ -6,14 +6,16 @@ const log = debug('@pie-lib:editable-html:image:insert-image-handler');
6
6
  /**
7
7
  * Handles user selection, insertion (or cancellation) of an image into the editor.
8
8
  * @param {Block} placeholderBlock - a block that has been added to the editor as a place holder for the image
9
+ * @param {Function} onFinish - a function to call if uploading fails or succeeds
9
10
  * @param {Function} getValue - a function to return the value of the editor
10
11
  * @param {Function} onChange - callback to notify changes applied by the handler
11
12
  * @param {Boolean} isPasted - a boolean that keeps track if the file is pasted
12
13
  */
13
14
  class InsertImageHandler {
14
- constructor(placeholderBlock, getValue, onChange, isPasted = false) {
15
+ constructor(placeholderBlock, onFinish, getValue, onChange, isPasted = false) {
15
16
  this.placeholderBlock = placeholderBlock;
16
17
  this.getValue = getValue;
18
+ this.onFinish = onFinish;
17
19
  this.onChange = onChange;
18
20
  this.isPasted = isPasted;
19
21
  this.chosenFile = null;
@@ -43,6 +45,8 @@ class InsertImageHandler {
43
45
  .change()
44
46
  .removeNodeByKey(this.placeholderBlock.key);
45
47
  this.onChange(c);
48
+
49
+ this.onFinish(false);
46
50
  }
47
51
 
48
52
  done(err, src) {
@@ -50,6 +54,7 @@ class InsertImageHandler {
50
54
  if (err) {
51
55
  //eslint-disable-next-line
52
56
  console.log(err);
57
+ this.onFinish(false);
53
58
  } else {
54
59
  const value = this.getValue();
55
60
  const child = this.getPlaceholderInDocument(value);
@@ -57,6 +62,7 @@ class InsertImageHandler {
57
62
 
58
63
  const change = value.change().setNodeByKey(this.placeholderBlock.key, { data });
59
64
  this.onChange(change);
65
+ this.onFinish(true);
60
66
  }
61
67
  }
62
68
 
@@ -111,9 +111,10 @@ export class MediaDialog extends React.Component {
111
111
  width: width || 560,
112
112
  tabValue: 0,
113
113
  fileUpload: {
114
+ error: null,
114
115
  loading: false,
116
+ scheduled: false,
115
117
  url: '',
116
- error: null,
117
118
  },
118
119
  };
119
120
  }
@@ -245,7 +246,10 @@ export class MediaDialog extends React.Component {
245
246
  }
246
247
 
247
248
  handleClose(val);
248
- } else if (isInsertURL) {
249
+ return;
250
+ }
251
+
252
+ if (isInsertURL) {
249
253
  const { ends, height, url, urlToUse, formattedUrl, starts, width } = this.state;
250
254
 
251
255
  handleClose(val, {
@@ -258,12 +262,23 @@ export class MediaDialog extends React.Component {
258
262
  urlToUse,
259
263
  src: formattedUrl,
260
264
  });
261
- } else {
265
+ return;
266
+ }
267
+
268
+ if (!fileUpload.loading) {
262
269
  handleClose(val, {
263
270
  tag: 'audio',
264
271
  src: fileUpload.url,
265
272
  });
273
+ return;
266
274
  }
275
+
276
+ this.setState({
277
+ fileUpload: {
278
+ ...fileUpload,
279
+ scheduled: true,
280
+ },
281
+ });
267
282
  };
268
283
 
269
284
  handleUploadFile = async (e) => {
@@ -303,19 +318,28 @@ export class MediaDialog extends React.Component {
303
318
  this.setState({
304
319
  fileUpload: {
305
320
  ...this.state.fileUpload,
321
+ scheduled: false,
306
322
  loading: false,
307
323
  error: err,
308
324
  },
309
325
  });
310
- } else {
311
- this.setState({
326
+ return;
327
+ }
328
+
329
+ const { fileUpload } = this.state;
330
+ const callback = fileUpload && fileUpload.scheduled ? this.handleDone.bind(this, true) : undefined;
331
+
332
+ this.setState(
333
+ {
312
334
  fileUpload: {
313
- ...this.state.fileUpload,
335
+ ...fileUpload,
336
+ scheduled: false,
314
337
  loading: false,
315
338
  url: src,
316
339
  },
317
- });
318
- }
340
+ },
341
+ callback,
342
+ );
319
343
  },
320
344
  });
321
345
  };
@@ -350,7 +374,9 @@ export class MediaDialog extends React.Component {
350
374
  const isYoutube = matchYoutubeUrl(url);
351
375
  const isInsertURL = tabValue === 0;
352
376
  const isUploadMedia = tabValue === 1;
353
- const submitIsDisabled = isInsertURL ? invalid || url === null || url === undefined : !fileUpload.url;
377
+ const submitIsDisabled = isInsertURL
378
+ ? invalid || url === null || url === undefined
379
+ : !fileUpload.url || fileUpload.scheduled;
354
380
 
355
381
  return (
356
382
  <Dialog
@@ -480,7 +506,14 @@ export class MediaDialog extends React.Component {
480
506
  <ActionDelete />
481
507
  </IconButton>
482
508
  </div>
483
- {fileUpload.loading ? <Typography variant="subheading">Loading...</Typography> : null}
509
+ {!fileUpload.scheduled && fileUpload.loading ? (
510
+ <Typography variant="subheading">Loading...</Typography>
511
+ ) : null}
512
+ {fileUpload.scheduled ? (
513
+ <Typography variant="subheading">
514
+ Waiting for Upload to finish, then inserting item...
515
+ </Typography>
516
+ ) : null}
484
517
  </>
485
518
  ) : !fileUpload.loading ? (
486
519
  <input accept="audio/*" className={classes.input} onChange={this.handleUploadFile} type="file" />