@seafile/sdoc-editor 0.1.149-beta4 → 0.1.150

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.
Files changed (41) hide show
  1. package/dist/api/sdoc-server-api.js +0 -10
  2. package/dist/api/seafile-api.js +18 -17
  3. package/dist/basic-sdk/assets/images/image-placeholder.png +0 -0
  4. package/dist/basic-sdk/constants/index.js +3 -21
  5. package/dist/basic-sdk/editor.js +105 -0
  6. package/dist/basic-sdk/extension/commons/insert-element-dialog/index.js +3 -8
  7. package/dist/basic-sdk/extension/constants/index.js +1 -4
  8. package/dist/basic-sdk/extension/core/queries/index.js +21 -0
  9. package/dist/basic-sdk/extension/core/transforms/replace-node-children.js +0 -26
  10. package/dist/basic-sdk/extension/plugins/image/helpers.js +3 -1
  11. package/dist/basic-sdk/extension/plugins/image/menu/index.js +2 -12
  12. package/dist/basic-sdk/extension/plugins/image/plugin.js +2 -2
  13. package/dist/basic-sdk/extension/plugins/image/render-elem.js +67 -10
  14. package/dist/basic-sdk/extension/render/render-element.js +1 -213
  15. package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-block-menu.js +2 -2
  16. package/dist/basic-sdk/layout/article-container.js +12 -3
  17. package/dist/basic-sdk/outline/index.js +14 -8
  18. package/dist/basic-sdk/{editor/slate-editor.js → slate-editor.js} +16 -21
  19. package/dist/basic-sdk/socket/helpers.js +0 -2
  20. package/dist/basic-sdk/socket/socket-client.js +0 -45
  21. package/dist/basic-sdk/socket/socket-manager.js +2 -28
  22. package/dist/basic-sdk/socket/with-socket-io.js +12 -35
  23. package/dist/basic-sdk/utils/diff.js +2 -2
  24. package/dist/basic-sdk/views/diff-viewer.js +1 -3
  25. package/dist/basic-sdk/views/viewer.js +12 -9
  26. package/dist/components/doc-operations/index.js +2 -4
  27. package/dist/components/doc-operations/revision-operations/index.js +2 -5
  28. package/dist/components/doc-operations/revision-operations/publish-button.js +13 -6
  29. package/dist/constants/index.js +2 -23
  30. package/dist/context.js +15 -27
  31. package/dist/pages/simple-editor.js +83 -255
  32. package/package.json +1 -1
  33. package/public/locales/en/sdoc-editor.json +1 -11
  34. package/public/locales/zh_CN/sdoc-editor.json +1 -10
  35. package/dist/basic-sdk/editor/common-editor.js +0 -50
  36. package/dist/basic-sdk/editor/index.css +0 -29
  37. package/dist/basic-sdk/editor/index.js +0 -129
  38. package/dist/basic-sdk/extension/plugins/image/dialogs/insert-web-image-dialog.js +0 -58
  39. package/dist/basic-sdk/utils/rebase.js +0 -181
  40. package/dist/components/tip-dialog/index.js +0 -48
  41. package/dist/components/tip-dialog/tip-content.js +0 -50
@@ -58,16 +58,6 @@ var SDocServerApi = /*#__PURE__*/function () {
58
58
  }
59
59
  });
60
60
  }
61
-
62
- // saveDocContentByRebase(content) {
63
- // const { server, docUuid, accessToken } = this;
64
- // const url = `${server}/api/v1/docs/${docUuid}/rebase/`;
65
-
66
- // const formData = new FormData();
67
- // formData.append('doc_content', JSON.stringify(content));
68
-
69
- // return axios.post(url, formData, {headers: {Authorization: `Token ${accessToken}`}});
70
- // }
71
61
  }, {
72
62
  key: "getCollaborators",
73
63
  value: function getCollaborators() {
@@ -46,6 +46,12 @@ var SeafileAPI = /*#__PURE__*/function () {
46
46
  var url = '/api/v2.1/seadoc/download-image/' + docUuid + '/' + encodeURIComponent(imageName);
47
47
  return this.req.get(url);
48
48
  }
49
+ }, {
50
+ key: "sdocPublishRevision",
51
+ value: function sdocPublishRevision(docUuid) {
52
+ var url = '/api/v2.1/seadoc/publish-revision/' + docUuid + '/';
53
+ return this.req.post(url);
54
+ }
49
55
  }, {
50
56
  key: "startRevise",
51
57
  value: function startRevise(repoID, fileUuid, path) {
@@ -57,9 +63,9 @@ var SeafileAPI = /*#__PURE__*/function () {
57
63
  return this._sendPostRequest(url, form);
58
64
  }
59
65
  }, {
60
- key: "getSeadocOriginFileDownloadLink",
61
- value: function getSeadocOriginFileDownloadLink(docUuid) {
62
- var url = '/api/v2.1/seadoc/origin-file-download-link/' + docUuid + '/';
66
+ key: "getSeadocRevisionDownloadLinks",
67
+ value: function getSeadocRevisionDownloadLinks(docUuid) {
68
+ var url = '/api/v2.1/seadoc/revision/download-links/' + docUuid + '/';
63
69
  return this.req.get(url);
64
70
  }
65
71
  }, {
@@ -75,26 +81,21 @@ var SeafileAPI = /*#__PURE__*/function () {
75
81
  var url = 'api/v2.1/seadoc/revisions/' + docUuid + '/?page=' + page + '&per_page=' + perPage;
76
82
  return this.req.get(url);
77
83
  }
78
- }, {
79
- key: "updateSdocRevision",
80
- value: function updateSdocRevision(docUuid) {
81
- var url = 'api/v2.1/seadoc/revision/' + docUuid + '/';
82
- return this.req.put(url);
83
- }
84
- }, {
85
- key: "getFileHistoryVersion",
86
- value: function getFileHistoryVersion(docUuid, fileVersion, docPath) {
87
- var url = 'api/v2.1/seadoc/history-content/' + docUuid + '/?p=' + encodeURIComponent(docPath) + '&file_version=' + fileVersion;
88
- return this.req.get(url);
89
- }
90
-
91
- // local files
92
84
  }, {
93
85
  key: "getSdocFiles",
94
86
  value: function getSdocFiles(docUuid, p) {
95
87
  var url = 'api/v2.1/seadoc/dir/' + docUuid + '/?p=' + p + '&doc_uuid=' + docUuid;
96
88
  return this.req.get(url);
97
89
  }
90
+ }, {
91
+ key: "asyncCopyImages",
92
+ value: function asyncCopyImages(docUuid, originDocUuid, imageList) {
93
+ var url = '/api/v2.1/seadoc/async-copy-images/' + docUuid + '/';
94
+ return this.req.post(url, {
95
+ origin_doc_uuid: originDocUuid,
96
+ image_list: imageList
97
+ });
98
+ }
98
99
  }]);
99
100
  return SeafileAPI;
100
101
  }();
@@ -3,25 +3,7 @@ export var INTERNAL_EVENT = {
3
3
  SET_TABLE_SELECT_RANGE: 'set_table_select_range',
4
4
  HIDDEN_CODE_BLOCK_HOVER_MENU: 'hidden_code_block_hover_menu',
5
5
  ON_MOUSE_ENTER_BLOCK: 'on_mouse_enter_block',
6
- INSERT_ELEMENT: 'insert_element'
6
+ INSERT_ELEMENT: 'insert_element',
7
+ OUTLINE_STATE_CHANGED: 'outline_state_changed'
7
8
  };
8
- export var PAGE_EDIT_AREA_WIDTH = 672; // 672 = 794 - 2[borderLeft + borderRight] - 120[paddingLeft + paddingRight]
9
-
10
- export var MODIFY_TYPE = {
11
- ADD: 'add',
12
- DELETE: 'delete',
13
- MODIFY: 'modify',
14
- CHILDREN_MODIFY: 'children_modify'
15
- };
16
- export var REBASE_TYPE = {
17
- MODIFY_MODIFY: 'modify_modify',
18
- DELETE_MODIFY: 'delete_modify',
19
- CHILDREN_MODIFY: 'children_modify'
20
- };
21
- export var REBASE_MARK_KEY = {
22
- ORIGIN: 'origin',
23
- REBASE_TYPE: 'rebase_type',
24
- MODIFY_TYPE: 'modify_type',
25
- OLD_ELEMENT: 'old_element'
26
- };
27
- export var REBASE_MARKS = [REBASE_MARK_KEY.ORIGIN, REBASE_MARK_KEY.REBASE_TYPE, REBASE_MARK_KEY.MODIFY_TYPE, REBASE_MARK_KEY.OLD_ELEMENT];
9
+ export var PAGE_EDIT_AREA_WIDTH = 672; // 672 = 794 - 2[borderLeft + borderRight] - 120[paddingLeft + paddingRight]
@@ -0,0 +1,105 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React, { useEffect, useMemo, useState, forwardRef, useImperativeHandle } from 'react';
3
+ import { Editor } from '@seafile/slate';
4
+ import { useTranslation } from 'react-i18next';
5
+ import { createDefaultEditor } from './extension';
6
+ import { focusEditor } from './extension/core';
7
+ import { withSocketIO } from './socket';
8
+ import withNodeId from './node-id';
9
+ import { PAGE_EDIT_AREA_WIDTH } from './constants';
10
+ import context from '../context';
11
+ import { EditorContainer, EditorContent } from './layout';
12
+ import SlateEditor from './slate-editor';
13
+ import InsertElementDialog from './extension/commons/insert-element-dialog';
14
+ var SDocEditor = forwardRef(function (_ref, ref) {
15
+ var document = _ref.document,
16
+ config = _ref.config;
17
+ var _useTranslation = useTranslation(),
18
+ t = _useTranslation.t;
19
+
20
+ // init editor
21
+ var editor = useMemo(function () {
22
+ var defaultEditor = createDefaultEditor();
23
+ var newEditor = withNodeId(withSocketIO(defaultEditor, {
24
+ document: document,
25
+ config: config
26
+ }));
27
+ var cursors = document.cursors;
28
+ newEditor.cursors = cursors || {};
29
+ newEditor.width = PAGE_EDIT_AREA_WIDTH; // default width
30
+ newEditor.readonly = false;
31
+ return newEditor;
32
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33
+ }, []);
34
+ var _useState = useState(document.children),
35
+ _useState2 = _slicedToArray(_useState, 2),
36
+ slateValue = _useState2[0],
37
+ setSlateValue = _useState2[1];
38
+
39
+ // The parent component can call the method of this component through ref
40
+ useImperativeHandle(ref, function () {
41
+ return {
42
+ // get latest value
43
+ getValue: function getValue() {
44
+ return slateValue;
45
+ }
46
+ };
47
+ }, [slateValue]);
48
+
49
+ // useMount: init socket connection
50
+ useEffect(function () {
51
+ editor.openConnection();
52
+ return function () {
53
+ editor.closeConnection();
54
+ };
55
+ // eslint-disable-next-line react-hooks/exhaustive-deps
56
+ }, []);
57
+
58
+ // useMount: focus editor
59
+ useEffect(function () {
60
+ var timer = setTimeout(function () {
61
+ var _editor$children = _slicedToArray(editor.children, 1),
62
+ firstNode = _editor$children[0];
63
+ if (firstNode) {
64
+ var _firstNode$children = _slicedToArray(firstNode.children, 1),
65
+ firstNodeFirstChild = _firstNode$children[0];
66
+ if (firstNodeFirstChild) {
67
+ var endOfFirstNode = Editor.end(editor, [0, 0]);
68
+ var range = {
69
+ anchor: endOfFirstNode,
70
+ focus: endOfFirstNode
71
+ };
72
+ focusEditor(editor, range);
73
+ }
74
+ }
75
+ }, 300);
76
+ return function () {
77
+ clearTimeout(timer);
78
+ };
79
+ // eslint-disable-next-line react-hooks/exhaustive-deps
80
+ }, []);
81
+
82
+ // useMount: reset title
83
+ useEffect(function () {
84
+ var isSdocRevision = context.getSetting('isSdocRevision');
85
+ var originFilename = context.getSetting('originFilename');
86
+ if (isSdocRevision) {
87
+ window.document.getElementsByTagName('title')[0].innerText = "".concat(t('Revision'), " - ").concat(originFilename);
88
+ }
89
+
90
+ // eslint-disable-next-line react-hooks/exhaustive-deps
91
+ }, []);
92
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(EditorContainer, {
93
+ editor: editor
94
+ }, /*#__PURE__*/React.createElement(EditorContent, {
95
+ docValue: slateValue,
96
+ showOutline: true
97
+ }, /*#__PURE__*/React.createElement(SlateEditor, {
98
+ editor: editor,
99
+ slateValue: slateValue,
100
+ setSlateValue: setSlateValue
101
+ }))), /*#__PURE__*/React.createElement(InsertElementDialog, {
102
+ editor: editor
103
+ }));
104
+ });
105
+ export default SDocEditor;
@@ -1,12 +1,11 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
2
  import React, { useCallback, useEffect, useState, useRef } from 'react';
3
- import InsertWebImageDialog from '../../plugins/image/dialogs/insert-web-image-dialog';
4
3
  import CustomTableSizeDialog from '../../plugins/table/dialog/custom-table-size-dialog';
5
4
  import AddLinkDialog from '../../plugins/link/dialog/add-link-dialog';
6
5
  import SelectSdocFileDialog from '../../plugins/sdoc-link/dialog/select-sdoc-file-dialog';
7
6
  import EventBus from '../../../utils/event-bus';
8
7
  import { INTERNAL_EVENT } from '../../../constants';
9
- import { ELEMENT_TYPE, INSERT_POSITION, INSERT_IMAGE_TYPE } from '../../constants';
8
+ import { ELEMENT_TYPE, INSERT_POSITION, LOCAL_IMAGE } from '../../constants';
10
9
  import context from '../../../../context';
11
10
  import { insertImage } from '../../plugins/image/helpers';
12
11
  var InsertElementDialog = function InsertElementDialog(_ref) {
@@ -57,7 +56,7 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
57
56
  setSlateNode(slateNode);
58
57
  setElement(element);
59
58
  setDialogType(type);
60
- if (type === INSERT_IMAGE_TYPE.LOCAL_IMAGE) {
59
+ if (type === LOCAL_IMAGE) {
61
60
  setTimeout(function () {
62
61
  uploadLocalImageInputRef.current && uploadLocalImageInputRef.current.click();
63
62
  }, 0);
@@ -89,11 +88,7 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
89
88
  {
90
89
  return /*#__PURE__*/React.createElement(SelectSdocFileDialog, props);
91
90
  }
92
- case INSERT_IMAGE_TYPE.WEB_IMAGE:
93
- {
94
- return /*#__PURE__*/React.createElement(InsertWebImageDialog, props);
95
- }
96
- case INSERT_IMAGE_TYPE.LOCAL_IMAGE:
91
+ case LOCAL_IMAGE:
97
92
  {
98
93
  return /*#__PURE__*/React.createElement("input", {
99
94
  ref: uploadLocalImageInputRef,
@@ -236,10 +236,7 @@ export var INSERT_POSITION = {
236
236
  CURRENT: 'current',
237
237
  AFTER: 'after'
238
238
  };
239
- export var INSERT_IMAGE_TYPE = {
240
- LOCAL_IMAGE: 'local-image',
241
- WEB_IMAGE: 'web-image'
242
- };
239
+ export var LOCAL_IMAGE = 'local-image';
243
240
  export var LIST_ITEM_CORRELATION_TYPE = ['unordered_list', 'ordered_list', 'list-item'];
244
241
  export var LIST_ITEM_SUPPORTED_TRANSFORMATION = ['unordered_list', 'ordered_list', 'left', 'center', 'right', 'blockquote'];
245
242
  export { BLOCKQUOTE, HEADER, TITLE, SUBTITLE, HEADER1, HEADER2, HEADER3, HEADER4, HEADER5, HEADER6, PARAGRAPH, BOLD, ITALIC, UNDERLINE, STRIKETHROUGH, SUPERSCRIPT, SUBSCRIPT, ORDERED_LIST, UNORDERED_LIST, LIST_ITEM, LIST_LIC, CHECK_LIST, CHECK_LIST_ITEM, LINK, HTML, CODE_BLOCK, CODE_LINE, IMAGE, TABLE, TABLE_CELL, TABLE_ROW, FORMULA, COLUMN, TEXT_STYLE, TEXT_STYLE_MORE, BOLD_ITALIC, TEXT_ALIGN, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ELEMENT_TYPE, KEYBOARD, MAC_HOTKEYS, WIN_HOTKEYS, DEFAULT_COLORS, STANDARD_COLORS, DEFAULT_RECENT_USED_LIST, CLEAR_FORMAT, DEFAULT_FONT_COLOR, RECENT_USED_HIGHLIGHT_COLORS_KEY, RECENT_USED_FONT_COLORS_KEY, RECENT_USED_TABLE_CELL_BG_COLORS_KEY, DEFAULT_LAST_USED_FONT_COLOR, DEFAULT_LAST_USED_HIGHLIGHT_COLOR, DEFAULT_LAST_USED_TABLE_CELL_BG_COLOR, FONT_SIZE, DEFAULT_FONT, FONT, GOOGLE_FONT_CLASS, RECENT_USED_FONTS_KEY, SDOC_FONT_SIZE, SDOC_LINK };
@@ -471,4 +471,25 @@ export var isLastNode = function isLastNode(editor, node) {
471
471
  var editorChildren = editor.children || [];
472
472
  var editorChildrenLength = editorChildren.length;
473
473
  return editorChildren[editorChildrenLength - 1] === node;
474
+ };
475
+ export var isHasImg = function isHasImg(editor) {
476
+ var hasImg = false;
477
+ var _iterator5 = _createForOfIteratorHelper(Editor.nodes(editor, {
478
+ at: editor.selection
479
+ })),
480
+ _step5;
481
+ try {
482
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
483
+ var _step5$value = _slicedToArray(_step5.value, 1),
484
+ node = _step5$value[0];
485
+ if ((node === null || node === void 0 ? void 0 : node.type) === 'image') {
486
+ hasImg = true;
487
+ }
488
+ }
489
+ } catch (err) {
490
+ _iterator5.e(err);
491
+ } finally {
492
+ _iterator5.f();
493
+ }
494
+ return hasImg;
474
495
  };
@@ -12,30 +12,4 @@ export var replaceNodeChildren = function replaceNodeChildren(editor, _ref) {
12
12
  at: at.concat([0])
13
13
  }));
14
14
  });
15
- };
16
- export var replaceNode = function replaceNode(editor) {
17
- var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
18
- at = _ref2.at,
19
- nodes = _ref2.nodes,
20
- insertOptions = _ref2.insertOptions,
21
- removeOptions = _ref2.removeOptions;
22
- Editor.withoutNormalizing(editor, function () {
23
- Transforms.removeNodes(editor, _objectSpread({
24
- at: at
25
- }, removeOptions));
26
- Transforms.insertNodes(editor, nodes, _objectSpread(_objectSpread({}, insertOptions), {}, {
27
- at: at
28
- }));
29
- });
30
- };
31
- export var deleteNodeMark = function deleteNodeMark(editor, path, element) {
32
- var marks = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
33
- var newElement = _objectSpread({}, element);
34
- marks.forEach(function (markItem) {
35
- newElement[markItem] && delete newElement[markItem];
36
- });
37
- replaceNode(editor, {
38
- at: path,
39
- nodes: newElement
40
- });
41
15
  };
@@ -32,9 +32,11 @@ export var isInsertImageMenuDisabled = function isInsertImageMenuDisabled(editor
32
32
  };
33
33
  export var generateImageNode = function generateImageNode(src) {
34
34
  var element = generateEmptyElement(IMAGE);
35
+ var docUuid = context.getSetting('docUuid');
35
36
  return _objectSpread(_objectSpread({}, element), {}, {
36
37
  data: {
37
- src: src
38
+ src: src,
39
+ origin_doc_uuid: docUuid
38
40
  }
39
41
  });
40
42
  };
@@ -2,7 +2,7 @@ import React, { useCallback } from 'react';
2
2
  import { useTranslation } from 'react-i18next';
3
3
  import { UncontrolledPopover } from 'reactstrap';
4
4
  import { isInsertImageMenuDisabled } from '../helpers';
5
- import { IMAGE, MENUS_CONFIG_MAP, INSERT_IMAGE_TYPE } from '../../../constants';
5
+ import { IMAGE, MENUS_CONFIG_MAP, LOCAL_IMAGE } from '../../../constants';
6
6
  import DropdownMenuItem from '../../../commons/dropdown-menu-item';
7
7
  import { INTERNAL_EVENT } from '../../../../constants';
8
8
  var ImageMenu = function ImageMenu(_ref) {
@@ -15,16 +15,9 @@ var ImageMenu = function ImageMenu(_ref) {
15
15
  t = _useTranslation.t;
16
16
  var openInsertLocalImage = useCallback(function () {
17
17
  eventBus.dispatch(INTERNAL_EVENT.INSERT_ELEMENT, {
18
- type: INSERT_IMAGE_TYPE.LOCAL_IMAGE
18
+ type: LOCAL_IMAGE
19
19
  });
20
20
  }, [eventBus]);
21
- var openInsertWebImageDialog = useCallback(function () {
22
- eventBus.dispatch(INTERNAL_EVENT.INSERT_ELEMENT, {
23
- type: INSERT_IMAGE_TYPE.WEB_IMAGE
24
- });
25
-
26
- // eslint-disable-next-line react-hooks/exhaustive-deps
27
- }, [eventBus]);
28
21
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DropdownMenuItem, {
29
22
  disabled: disabled,
30
23
  menuConfig: menuConfig,
@@ -41,9 +34,6 @@ var ImageMenu = function ImageMenu(_ref) {
41
34
  }, /*#__PURE__*/React.createElement("div", {
42
35
  className: "sdoc-insert-image-menu-popover-container sdoc-dropdown-menu-container"
43
36
  }, /*#__PURE__*/React.createElement("div", {
44
- className: "sdoc-dropdown-menu-item",
45
- onClick: openInsertWebImageDialog
46
- }, t('Insert_network_image')), /*#__PURE__*/React.createElement("div", {
47
37
  className: "sdoc-dropdown-menu-item",
48
38
  onClick: openInsertLocalImage
49
39
  }, t('Upload_local_image')))));
@@ -1,9 +1,9 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
2
  import { Transforms, Path, Editor, Element } from '@seafile/slate';
3
3
  import context from '../../../../context';
4
- import { insertImage } from './helpers';
4
+ import { insertImage, copyImage } from './helpers';
5
5
  import { focusEditor } from '../../core';
6
- import { INSERT_POSITION } from '../../constants';
6
+ import { INSERT_POSITION, CLIPBOARD_FORMAT_KEY } from '../../constants';
7
7
  var withImage = function withImage(editor) {
8
8
  var isInline = editor.isInline,
9
9
  isVoid = editor.isVoid,
@@ -3,12 +3,17 @@ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
3
3
  import _createClass from "@babel/runtime/helpers/esm/createClass";
4
4
  import _inherits from "@babel/runtime/helpers/esm/inherits";
5
5
  import _createSuper from "@babel/runtime/helpers/esm/createSuper";
6
- import { useSelected } from '@seafile/slate-react';
6
+ import { ReactEditor, useSelected } from '@seafile/slate-react';
7
+ import { Transforms } from '@seafile/slate';
7
8
  import React from 'react';
8
9
  import classNames from 'classnames';
9
10
  import { withTranslation } from 'react-i18next';
10
11
  import { getImageURL, updateImage } from './helpers';
11
12
  import ImagePreviewer from './dialogs/image-previewer';
13
+ import toaster from '../../../../components/toast';
14
+ import context from '../../../../context';
15
+ import { getErrorMsg } from '../../../../utils';
16
+ import imagePlaceholder from '../../../assets/images/image-placeholder.png';
12
17
  var Image = /*#__PURE__*/function (_React$Component) {
13
18
  _inherits(Image, _React$Component);
14
19
  var _super = _createSuper(Image);
@@ -82,26 +87,78 @@ var Image = /*#__PURE__*/function (_React$Component) {
82
87
  _this.state = {
83
88
  width: null,
84
89
  isResizing: false,
85
- isShowImagePreview: false
90
+ isShowImagePreview: false,
91
+ isShowImagePlaceholder: false
86
92
  };
87
93
  return _this;
88
94
  }
89
95
  _createClass(Image, [{
90
- key: "render",
91
- value: function render() {
96
+ key: "componentDidMount",
97
+ value: function componentDidMount() {
98
+ var _this2 = this;
99
+ var docUuid = context.getSetting('docUuid');
92
100
  var _this$props2 = this.props,
93
- className = _this$props2.className,
94
- attributes = _this$props2.attributes,
95
101
  element = _this$props2.element,
96
- children = _this$props2.children,
97
- isSelected = _this$props2.isSelected,
98
- t = _this$props2.t;
102
+ editor = _this$props2.editor;
103
+ var data = element.data;
104
+ var origin_doc_uuid = data.origin_doc_uuid,
105
+ src = data.src;
106
+
107
+ // Pictures are copied from other documents
108
+ if (origin_doc_uuid && origin_doc_uuid !== docUuid) {
109
+ this.setState({
110
+ isShowImagePlaceholder: true
111
+ });
112
+ var originDocUuid = origin_doc_uuid;
113
+ var imageList = [src.slice(1)];
114
+ context.copyImage(originDocUuid, imageList).then(function (res) {
115
+ if (res.status === 200) {
116
+ var path = ReactEditor.findPath(editor, element);
117
+ Transforms.setNodes(editor, {
118
+ data: _objectSpread(_objectSpread({}, data), {}, {
119
+ origin_doc_uuid: docUuid
120
+ })
121
+ }, {
122
+ at: path
123
+ });
124
+ _this2.setState({
125
+ isShowImagePlaceholder: false
126
+ });
127
+ }
128
+ }).catch(function (error) {
129
+ var errorMessage = getErrorMsg(error);
130
+ toaster.danger(errorMessage);
131
+ });
132
+ }
133
+ }
134
+ }, {
135
+ key: "render",
136
+ value: function render() {
137
+ var _this$props3 = this.props,
138
+ className = _this$props3.className,
139
+ attributes = _this$props3.attributes,
140
+ element = _this$props3.element,
141
+ children = _this$props3.children,
142
+ isSelected = _this$props3.isSelected,
143
+ t = _this$props3.t;
99
144
  var _this$state = this.state,
100
145
  isResizing = _this$state.isResizing,
101
- isShowImagePreview = _this$state.isShowImagePreview;
146
+ isShowImagePreview = _this$state.isShowImagePreview,
147
+ isShowImagePlaceholder = _this$state.isShowImagePlaceholder;
102
148
  var data = element.data;
103
149
  var imageClassName = isSelected ? 'image-selected' : '';
104
150
  var imageStyle = this.getImageStyle();
151
+ if (isShowImagePlaceholder) {
152
+ return /*#__PURE__*/React.createElement("span", Object.assign({
153
+ className: classNames('sdoc-image-wrapper', className)
154
+ }, attributes), /*#__PURE__*/React.createElement("img", {
155
+ ref: this.setImageRef,
156
+ src: imagePlaceholder,
157
+ style: imageStyle,
158
+ draggable: false,
159
+ alt: ""
160
+ }), children);
161
+ }
105
162
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", Object.assign({
106
163
  className: classNames('sdoc-image-wrapper', className)
107
164
  }, attributes), /*#__PURE__*/React.createElement("img", {