@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.
- package/dist/api/sdoc-server-api.js +0 -10
- package/dist/api/seafile-api.js +18 -17
- package/dist/basic-sdk/assets/images/image-placeholder.png +0 -0
- package/dist/basic-sdk/constants/index.js +3 -21
- package/dist/basic-sdk/editor.js +105 -0
- package/dist/basic-sdk/extension/commons/insert-element-dialog/index.js +3 -8
- package/dist/basic-sdk/extension/constants/index.js +1 -4
- package/dist/basic-sdk/extension/core/queries/index.js +21 -0
- package/dist/basic-sdk/extension/core/transforms/replace-node-children.js +0 -26
- package/dist/basic-sdk/extension/plugins/image/helpers.js +3 -1
- package/dist/basic-sdk/extension/plugins/image/menu/index.js +2 -12
- package/dist/basic-sdk/extension/plugins/image/plugin.js +2 -2
- package/dist/basic-sdk/extension/plugins/image/render-elem.js +67 -10
- package/dist/basic-sdk/extension/render/render-element.js +1 -213
- package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-block-menu.js +2 -2
- package/dist/basic-sdk/layout/article-container.js +12 -3
- package/dist/basic-sdk/outline/index.js +14 -8
- package/dist/basic-sdk/{editor/slate-editor.js → slate-editor.js} +16 -21
- package/dist/basic-sdk/socket/helpers.js +0 -2
- package/dist/basic-sdk/socket/socket-client.js +0 -45
- package/dist/basic-sdk/socket/socket-manager.js +2 -28
- package/dist/basic-sdk/socket/with-socket-io.js +12 -35
- package/dist/basic-sdk/utils/diff.js +2 -2
- package/dist/basic-sdk/views/diff-viewer.js +1 -3
- package/dist/basic-sdk/views/viewer.js +12 -9
- package/dist/components/doc-operations/index.js +2 -4
- package/dist/components/doc-operations/revision-operations/index.js +2 -5
- package/dist/components/doc-operations/revision-operations/publish-button.js +13 -6
- package/dist/constants/index.js +2 -23
- package/dist/context.js +15 -27
- package/dist/pages/simple-editor.js +83 -255
- package/package.json +1 -1
- package/public/locales/en/sdoc-editor.json +1 -11
- package/public/locales/zh_CN/sdoc-editor.json +1 -10
- package/dist/basic-sdk/editor/common-editor.js +0 -50
- package/dist/basic-sdk/editor/index.css +0 -29
- package/dist/basic-sdk/editor/index.js +0 -129
- package/dist/basic-sdk/extension/plugins/image/dialogs/insert-web-image-dialog.js +0 -58
- package/dist/basic-sdk/utils/rebase.js +0 -181
- package/dist/components/tip-dialog/index.js +0 -48
- 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() {
|
package/dist/api/seafile-api.js
CHANGED
|
@@ -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: "
|
|
61
|
-
value: function
|
|
62
|
-
var url = '/api/v2.1/seadoc/
|
|
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
|
}();
|
|
Binary file
|
|
@@ -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,
|
|
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 ===
|
|
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
|
|
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
|
|
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,
|
|
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:
|
|
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: "
|
|
91
|
-
value: function
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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", {
|