@seafile/sdoc-editor 0.1.174 → 0.2.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/dist/api/seafile-api.js +6 -0
- package/dist/basic-sdk/assets/css/sdoc-editor-plugins.css +5 -0
- package/dist/basic-sdk/assets/images/black-border.png +0 -0
- package/dist/basic-sdk/assets/images/grey-border.png +0 -0
- package/dist/basic-sdk/assets/images/no-border.png +0 -0
- package/dist/basic-sdk/constants/index.js +2 -1
- package/dist/basic-sdk/editor/editable-article.js +2 -1
- package/dist/basic-sdk/extension/constants/index.js +1 -0
- package/dist/basic-sdk/extension/plugins/image/constants/index.js +17 -0
- package/dist/basic-sdk/extension/plugins/image/helpers.js +64 -5
- package/dist/basic-sdk/extension/plugins/image/hover-menu/index.css +108 -0
- package/dist/basic-sdk/extension/plugins/image/hover-menu/index.js +179 -0
- package/dist/basic-sdk/extension/plugins/image/plugin.js +26 -6
- package/dist/basic-sdk/extension/plugins/image/render-elem.js +214 -184
- package/dist/basic-sdk/node-id/index.js +1 -9
- package/dist/basic-sdk/utils/document-utils.js +15 -0
- package/dist/basic-sdk/utils/event-handler.js +3 -3
- package/dist/context.js +6 -0
- package/package.json +1 -1
- package/public/locales/en/sdoc-editor.json +3 -1
- package/public/locales/zh_CN/sdoc-editor.json +3 -1
package/dist/api/seafile-api.js
CHANGED
|
@@ -133,6 +133,12 @@ var SeafileAPI = /*#__PURE__*/function () {
|
|
|
133
133
|
files_url: filesUrl
|
|
134
134
|
});
|
|
135
135
|
}
|
|
136
|
+
}, {
|
|
137
|
+
key: "getCopyMoveProgressView",
|
|
138
|
+
value: function getCopyMoveProgressView(docUuid, taskId) {
|
|
139
|
+
var url = 'api/v2.1/seadoc/query-copy-move-progress/' + docUuid + '/?&doc_uuid=' + docUuid + '&task_id=' + taskId;
|
|
140
|
+
return this.req.get(url);
|
|
141
|
+
}
|
|
136
142
|
}]);
|
|
137
143
|
return SeafileAPI;
|
|
138
144
|
}();
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -4,7 +4,8 @@ export var INTERNAL_EVENT = {
|
|
|
4
4
|
HIDDEN_CODE_BLOCK_HOVER_MENU: 'hidden_code_block_hover_menu',
|
|
5
5
|
ON_MOUSE_ENTER_BLOCK: 'on_mouse_enter_block',
|
|
6
6
|
INSERT_ELEMENT: 'insert_element',
|
|
7
|
-
OUTLINE_STATE_CHANGED: 'outline_state_changed'
|
|
7
|
+
OUTLINE_STATE_CHANGED: 'outline_state_changed',
|
|
8
|
+
RELOAD_IMAGE: 'reload_image'
|
|
8
9
|
};
|
|
9
10
|
export var PAGE_EDIT_AREA_WIDTH = 672; // 672 = 794 - 2[borderLeft + borderRight] - 120[paddingLeft + paddingRight]
|
|
10
11
|
|
|
@@ -140,7 +140,8 @@ var EditableArticle = function EditableArticle(_ref) {
|
|
|
140
140
|
onKeyDown: onKeyDown,
|
|
141
141
|
onMouseDown: onMouseDown,
|
|
142
142
|
decorate: decorate,
|
|
143
|
-
onCut: eventProxy.onCut
|
|
143
|
+
onCut: eventProxy.onCut,
|
|
144
|
+
onCopy: eventProxy.onCopy
|
|
144
145
|
})), /*#__PURE__*/React.createElement(SideToolbar, null), isShowComment && /*#__PURE__*/React.createElement(CommentContextProvider, null, /*#__PURE__*/React.createElement(CommentWrapper, null))));
|
|
145
146
|
};
|
|
146
147
|
EditableArticle.defaultProps = {
|
|
@@ -12,6 +12,7 @@ export var HEADERS = [HEADER1, HEADER2, HEADER3, HEADER4, HEADER5, HEADER6];
|
|
|
12
12
|
export var HEADER_TITLE_MAP = (_HEADER_TITLE_MAP = {}, _defineProperty(_HEADER_TITLE_MAP, TITLE, 'Title'), _defineProperty(_HEADER_TITLE_MAP, SUBTITLE, 'Subtitle'), _defineProperty(_HEADER_TITLE_MAP, HEADER1, 'Header_one'), _defineProperty(_HEADER_TITLE_MAP, HEADER2, 'Header_two'), _defineProperty(_HEADER_TITLE_MAP, HEADER3, 'Header_three'), _defineProperty(_HEADER_TITLE_MAP, HEADER4, 'Header_four'), _defineProperty(_HEADER_TITLE_MAP, HEADER5, 'Header_five'), _defineProperty(_HEADER_TITLE_MAP, HEADER6, 'Header_six'), _defineProperty(_HEADER_TITLE_MAP, PARAGRAPH, 'Paragraph'), _HEADER_TITLE_MAP);
|
|
13
13
|
export var TRANSPARENT = 'transparent';
|
|
14
14
|
export var CLIPBOARD_FORMAT_KEY = 'x-slate-fragment';
|
|
15
|
+
export var CLIPBOARD_ORIGIN_SDOC_KEY = 'origin-sdoc-uuid';
|
|
15
16
|
export var INSERT_FILE_DISPLAY_TYPE = ['text_link', 'icon_link', 'card_link'];
|
|
16
17
|
export var INSERT_POSITION = {
|
|
17
18
|
BEFORE: 'before',
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import blackBorder from '../../../../assets/images/black-border.png';
|
|
2
|
+
import greyBorder from '../../../../assets/images/grey-border.png';
|
|
3
|
+
import noBorder from '../../../../assets/images/no-border.png';
|
|
4
|
+
export var IMAGE_DISPLAY_TYPE = ['Inline', 'Block'];
|
|
5
|
+
export var IMAGE_BORDER_TYPE = [{
|
|
6
|
+
type: 'none',
|
|
7
|
+
imgUrl: noBorder,
|
|
8
|
+
value: 'none'
|
|
9
|
+
}, {
|
|
10
|
+
type: 'grey',
|
|
11
|
+
imgUrl: greyBorder,
|
|
12
|
+
value: '2px solid #E5E5E5'
|
|
13
|
+
}, {
|
|
14
|
+
type: 'black',
|
|
15
|
+
imgUrl: blackBorder,
|
|
16
|
+
value: '2px solid #41464A'
|
|
17
|
+
}];
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
1
2
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
3
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
4
|
+
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
3
5
|
import urlJoin from 'url-join';
|
|
4
6
|
import { Editor, Range, Transforms, Path } from '@seafile/slate';
|
|
5
7
|
import { ReactEditor } from '@seafile/slate-react';
|
|
6
|
-
import { CODE_BLOCK, ELEMENT_TYPE, IMAGE, INSERT_POSITION, LIST_ITEM } from '../../constants';
|
|
7
|
-
import { generateEmptyElement, getNodeType, isTextNode, getParentNode } from '../../core';
|
|
8
8
|
import context from '../../../../context';
|
|
9
|
+
import EventBus from '../../../utils/event-bus';
|
|
10
|
+
import { generateEmptyElement, getNodeType, isTextNode, getParentNode } from '../../core';
|
|
11
|
+
import { INTERNAL_EVENT } from '../../../constants';
|
|
12
|
+
import { CODE_BLOCK, ELEMENT_TYPE, IMAGE, INSERT_POSITION, LIST_ITEM } from '../../constants';
|
|
9
13
|
export var isInsertImageMenuDisabled = function isInsertImageMenuDisabled(editor, readonly) {
|
|
10
14
|
if (readonly) return true;
|
|
11
15
|
var selection = editor.selection;
|
|
@@ -32,11 +36,9 @@ export var isInsertImageMenuDisabled = function isInsertImageMenuDisabled(editor
|
|
|
32
36
|
};
|
|
33
37
|
export var generateImageNode = function generateImageNode(src) {
|
|
34
38
|
var element = generateEmptyElement(IMAGE);
|
|
35
|
-
var docUuid = context.getSetting('docUuid');
|
|
36
39
|
return _objectSpread(_objectSpread({}, element), {}, {
|
|
37
40
|
data: {
|
|
38
|
-
src: src
|
|
39
|
-
origin_doc_uuid: docUuid
|
|
41
|
+
src: src
|
|
40
42
|
}
|
|
41
43
|
});
|
|
42
44
|
};
|
|
@@ -86,4 +88,61 @@ export var getImageURL = function getImageURL(url) {
|
|
|
86
88
|
var serviceUrl = context.getSetting('serviceUrl');
|
|
87
89
|
var assetsUrl = context.getSetting('assetsUrl');
|
|
88
90
|
return urlJoin(serviceUrl, assetsUrl, url);
|
|
91
|
+
};
|
|
92
|
+
export var hasSdocImages = function hasSdocImages(originSdocUuid, fragmentData) {
|
|
93
|
+
var sdocUuid = context.getSetting('docUuid');
|
|
94
|
+
var hasImg = fragmentData.some(function (item) {
|
|
95
|
+
return item.children.some(function (child) {
|
|
96
|
+
return (child === null || child === void 0 ? void 0 : child.type) === IMAGE;
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
return originSdocUuid !== sdocUuid && hasImg;
|
|
100
|
+
};
|
|
101
|
+
export var getImageData = function getImageData(fragmentData) {
|
|
102
|
+
var imageData = new Set();
|
|
103
|
+
fragmentData.forEach(function (item) {
|
|
104
|
+
return item.children.forEach(function (child) {
|
|
105
|
+
if ((child === null || child === void 0 ? void 0 : child.type) === IMAGE && !child.data.src.startsWith('http')) {
|
|
106
|
+
imageData.add(child.data.src.slice(1));
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
return Array.from(imageData);
|
|
111
|
+
};
|
|
112
|
+
export var queryCopyMoveProgressView = function queryCopyMoveProgressView(taskId) {
|
|
113
|
+
var interval = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 300;
|
|
114
|
+
var timer;
|
|
115
|
+
var stop = function stop() {
|
|
116
|
+
clearTimeout(timer);
|
|
117
|
+
};
|
|
118
|
+
var start = /*#__PURE__*/function () {
|
|
119
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
120
|
+
var res, done, eventBus;
|
|
121
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
122
|
+
while (1) switch (_context.prev = _context.next) {
|
|
123
|
+
case 0:
|
|
124
|
+
_context.next = 2;
|
|
125
|
+
return context.getCopyMoveProgressView(taskId);
|
|
126
|
+
case 2:
|
|
127
|
+
res = _context.sent;
|
|
128
|
+
done = res.data.done;
|
|
129
|
+
if (done) {
|
|
130
|
+
stop();
|
|
131
|
+
// Reload image
|
|
132
|
+
eventBus = EventBus.getInstance();
|
|
133
|
+
eventBus.dispatch(INTERNAL_EVENT.RELOAD_IMAGE);
|
|
134
|
+
} else {
|
|
135
|
+
timer = setTimeout(start, interval);
|
|
136
|
+
}
|
|
137
|
+
case 5:
|
|
138
|
+
case "end":
|
|
139
|
+
return _context.stop();
|
|
140
|
+
}
|
|
141
|
+
}, _callee);
|
|
142
|
+
}));
|
|
143
|
+
return function start() {
|
|
144
|
+
return _ref.apply(this, arguments);
|
|
145
|
+
};
|
|
146
|
+
}();
|
|
147
|
+
start();
|
|
89
148
|
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
.sdoc-image-hover-menu-container {
|
|
2
|
+
position: absolute;
|
|
3
|
+
height: 42px;
|
|
4
|
+
z-index: 101;
|
|
5
|
+
width: auto;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.sdoc-image-hover-menu-container .hover-menu-container {
|
|
9
|
+
height: 36px;
|
|
10
|
+
padding: 7px 8px;
|
|
11
|
+
background-color: #fff;
|
|
12
|
+
display: flex;
|
|
13
|
+
justify-content: flex-start;
|
|
14
|
+
align-items: center;
|
|
15
|
+
border-radius: 3px;
|
|
16
|
+
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08);
|
|
17
|
+
border: 1px solid #e8e8e8;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.sdoc-image-hover-menu-container .hover-menu-container > span:not(:last-of-type) {
|
|
21
|
+
padding: 0 8px;
|
|
22
|
+
border-right: 1px solid #e5e5e5;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.sdoc-image-hover-menu-container .hover-menu-container .op-item {
|
|
26
|
+
position: relative;
|
|
27
|
+
font-size: 12px;
|
|
28
|
+
color: #212529;
|
|
29
|
+
padding: 0 5px;
|
|
30
|
+
border-radius: 2px;
|
|
31
|
+
min-width: 24px;
|
|
32
|
+
height: 24px;
|
|
33
|
+
display: inline-flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
justify-content: center;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.sdoc-image-hover-menu-container .hover-menu-container .op-item:hover {
|
|
39
|
+
color: #212529;
|
|
40
|
+
text-decoration: none;
|
|
41
|
+
background: #f1f1f1;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.sdoc-image-hover-menu-container .op-group-item:last-child .op-item {
|
|
45
|
+
margin-left: 8px;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.sdoc-image-hover-menu-container .hover-menu-container .active {
|
|
49
|
+
background: #f1f1f1;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.sdoc-image-hover-menu-container .hover-menu-container .op-tooltip:hover::after {
|
|
53
|
+
position: absolute;
|
|
54
|
+
color: #212529;
|
|
55
|
+
content: attr(op-item-tooltip);
|
|
56
|
+
top: -40px;
|
|
57
|
+
left: -20px;
|
|
58
|
+
width: 70px;
|
|
59
|
+
height: 30px;
|
|
60
|
+
display: flex;
|
|
61
|
+
justify-content: center;
|
|
62
|
+
align-items: center;
|
|
63
|
+
background-color: #fff;
|
|
64
|
+
border-radius: 3px;
|
|
65
|
+
border: 1px solid #e8e8e8;
|
|
66
|
+
font-size: 12px;
|
|
67
|
+
box-shadow: 0 0 5px #ccc;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.sdoc-image-hover-menu-container .hover-menu-container .icon-font {
|
|
71
|
+
font-size: 12px;
|
|
72
|
+
color: #999999;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.sdoc-image-hover-menu-container .sdoc-image-popover {
|
|
76
|
+
position: absolute;
|
|
77
|
+
top: 37px;
|
|
78
|
+
background-color: #fff;
|
|
79
|
+
border: 1px solid #e5e6e8;
|
|
80
|
+
border-radius: 2px;
|
|
81
|
+
box-shadow: 0 0 10px #ccc;
|
|
82
|
+
display: flex;
|
|
83
|
+
flex-direction: column;
|
|
84
|
+
align-items: flex-start;
|
|
85
|
+
z-index: 101;
|
|
86
|
+
white-space: nowrap;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.sdoc-image-hover-menu-container .align-popover {
|
|
90
|
+
left: 80px;
|
|
91
|
+
min-width: 6rem;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.sdoc-image-hover-menu-container .border-popover {
|
|
95
|
+
left: 115px;
|
|
96
|
+
flex-direction: row;
|
|
97
|
+
height: 80px;
|
|
98
|
+
align-items: center;
|
|
99
|
+
padding: 0 8px;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.sdoc-image-hover-menu-container .border-popover .sdoc-dropdown-menu-item .sdoc-dropdown-item-content .sdoc-check-mark {
|
|
103
|
+
transform: translateX(-24px);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.sdoc-image-hover-menu-container .border-popover .sdoc-dropdown-menu-item:hover {
|
|
107
|
+
background-color: transparent;
|
|
108
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
3
|
+
import React, { useCallback, useState } from 'react';
|
|
4
|
+
import { Transforms } from '@seafile/slate';
|
|
5
|
+
import { ReactEditor } from '@seafile/slate-react';
|
|
6
|
+
import { withTranslation } from 'react-i18next';
|
|
7
|
+
import classnames from 'classnames';
|
|
8
|
+
import { ElementPopover } from '../../../commons';
|
|
9
|
+
import ImagePreviewer from '../dialogs/image-previewer';
|
|
10
|
+
import { getImageURL } from '../helpers';
|
|
11
|
+
import { IMAGE_DISPLAY_TYPE, IMAGE_BORDER_TYPE } from '../constants';
|
|
12
|
+
import { MENUS_CONFIG_MAP, TEXT_ALIGN } from '../../../constants';
|
|
13
|
+
import './index.css';
|
|
14
|
+
var ImageHoverMenu = function ImageHoverMenu(_ref) {
|
|
15
|
+
var editor = _ref.editor,
|
|
16
|
+
menuPosition = _ref.menuPosition,
|
|
17
|
+
element = _ref.element,
|
|
18
|
+
onHideImageHoverMenu = _ref.onHideImageHoverMenu,
|
|
19
|
+
t = _ref.t;
|
|
20
|
+
var data = element.data,
|
|
21
|
+
display_type = element.display_type,
|
|
22
|
+
align = element.align,
|
|
23
|
+
border_type = element.border_type;
|
|
24
|
+
var _useState = useState({
|
|
25
|
+
displayPopover: false,
|
|
26
|
+
alignPopover: false,
|
|
27
|
+
borderPopover: false
|
|
28
|
+
}),
|
|
29
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
30
|
+
popoverState = _useState2[0],
|
|
31
|
+
setPopoverState = _useState2[1];
|
|
32
|
+
var _useState3 = useState(false),
|
|
33
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
34
|
+
isShowImagePreview = _useState4[0],
|
|
35
|
+
setIsShowImagePreview = _useState4[1];
|
|
36
|
+
var onShowProver = useCallback(function (event, showProverKey) {
|
|
37
|
+
event.stopPropagation();
|
|
38
|
+
var newPopoverState = popoverState;
|
|
39
|
+
for (var key in newPopoverState) {
|
|
40
|
+
if (key === showProverKey) {
|
|
41
|
+
newPopoverState[key] = !newPopoverState[key];
|
|
42
|
+
} else {
|
|
43
|
+
newPopoverState[key] = false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
setPopoverState(_objectSpread({}, newPopoverState));
|
|
47
|
+
}, [popoverState]);
|
|
48
|
+
var onSelect = useCallback(function (event, props) {
|
|
49
|
+
event.stopPropagation();
|
|
50
|
+
var path = ReactEditor.findPath(editor, element);
|
|
51
|
+
if (path) {
|
|
52
|
+
Transforms.setNodes(editor, props, {
|
|
53
|
+
at: path
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
onHideImageHoverMenu();
|
|
57
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
58
|
+
}, []);
|
|
59
|
+
return /*#__PURE__*/React.createElement(ElementPopover, null, /*#__PURE__*/React.createElement("div", {
|
|
60
|
+
className: "sdoc-image-hover-menu-container",
|
|
61
|
+
style: menuPosition
|
|
62
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
63
|
+
className: "hover-menu-container"
|
|
64
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
65
|
+
className: "op-group-item"
|
|
66
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
67
|
+
role: "button",
|
|
68
|
+
className: classnames('op-item', {
|
|
69
|
+
'active': popoverState.displayPopover
|
|
70
|
+
}),
|
|
71
|
+
onClick: function onClick(e) {
|
|
72
|
+
onShowProver(e, 'displayPopover');
|
|
73
|
+
}
|
|
74
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
75
|
+
className: "mr-1"
|
|
76
|
+
}, t(display_type || IMAGE_DISPLAY_TYPE[0])), /*#__PURE__*/React.createElement("i", {
|
|
77
|
+
className: "sdocfont sdoc-drop-down icon-font"
|
|
78
|
+
}))), /*#__PURE__*/React.createElement("span", {
|
|
79
|
+
className: "op-group-item"
|
|
80
|
+
}, display_type === IMAGE_DISPLAY_TYPE[1] && /*#__PURE__*/React.createElement("span", {
|
|
81
|
+
role: "button",
|
|
82
|
+
className: classnames('op-item', {
|
|
83
|
+
'active': popoverState.alignPopover
|
|
84
|
+
}),
|
|
85
|
+
onClick: function onClick(e) {
|
|
86
|
+
onShowProver(e, 'alignPopover');
|
|
87
|
+
}
|
|
88
|
+
}, /*#__PURE__*/React.createElement("i", {
|
|
89
|
+
className: classnames("sdocfont sdoc-align-".concat(align || 'left', " icon-font mr-1"))
|
|
90
|
+
}), /*#__PURE__*/React.createElement("i", {
|
|
91
|
+
className: "sdocfont sdoc-drop-down icon-font"
|
|
92
|
+
})), /*#__PURE__*/React.createElement("span", {
|
|
93
|
+
role: "button",
|
|
94
|
+
className: classnames('op-item', 'ml-1', {
|
|
95
|
+
'active': popoverState.borderPopover
|
|
96
|
+
}),
|
|
97
|
+
onClick: function onClick(e) {
|
|
98
|
+
onShowProver(e, 'borderPopover');
|
|
99
|
+
}
|
|
100
|
+
}, /*#__PURE__*/React.createElement("i", {
|
|
101
|
+
className: "sdocfont sdoc-image icon-font mr-1"
|
|
102
|
+
}), /*#__PURE__*/React.createElement("i", {
|
|
103
|
+
className: "sdocfont sdoc-drop-down icon-font"
|
|
104
|
+
}))), /*#__PURE__*/React.createElement("span", {
|
|
105
|
+
className: "op-group-item"
|
|
106
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
107
|
+
role: "button",
|
|
108
|
+
className: "op-item",
|
|
109
|
+
onClick: function onClick(e) {
|
|
110
|
+
e.stopPropagation();
|
|
111
|
+
setIsShowImagePreview(!isShowImagePreview);
|
|
112
|
+
}
|
|
113
|
+
}, /*#__PURE__*/React.createElement("i", {
|
|
114
|
+
className: "sdocfont sdoc-fullscreen icon-font"
|
|
115
|
+
})))), popoverState.displayPopover && /*#__PURE__*/React.createElement("div", {
|
|
116
|
+
className: "sdoc-image-popover sdoc-dropdown-menu"
|
|
117
|
+
}, IMAGE_DISPLAY_TYPE.map(function (item) {
|
|
118
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
119
|
+
key: item,
|
|
120
|
+
className: "sdoc-dropdown-menu-item sdoc-dropdown-item-with-left-icon pr-2",
|
|
121
|
+
onClick: function onClick(event) {
|
|
122
|
+
return onSelect(event, {
|
|
123
|
+
display_type: item
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
127
|
+
className: "sdoc-dropdown-item-content"
|
|
128
|
+
}, /*#__PURE__*/React.createElement("i", {
|
|
129
|
+
className: "sdoc-dropdown-item-content-icon"
|
|
130
|
+
}), /*#__PURE__*/React.createElement("span", null, t(item))), display_type === item && /*#__PURE__*/React.createElement("i", {
|
|
131
|
+
className: "sdocfont sdoc-check-mark sdoc-dropdown-item-right-icon"
|
|
132
|
+
}));
|
|
133
|
+
})), popoverState.alignPopover && /*#__PURE__*/React.createElement("div", {
|
|
134
|
+
className: "sdoc-image-popover align-popover sdoc-dropdown-menu"
|
|
135
|
+
}, MENUS_CONFIG_MAP[TEXT_ALIGN].map(function (item) {
|
|
136
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
137
|
+
key: item.id,
|
|
138
|
+
className: "sdoc-dropdown-menu-item sdoc-dropdown-item-with-left-icon pr-2",
|
|
139
|
+
onClick: function onClick(event) {
|
|
140
|
+
return onSelect(event, {
|
|
141
|
+
align: item.type
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
145
|
+
className: "sdoc-dropdown-item-content"
|
|
146
|
+
}, /*#__PURE__*/React.createElement("i", {
|
|
147
|
+
className: classnames(item.iconClass, 'icon-font')
|
|
148
|
+
})), align === item.type && /*#__PURE__*/React.createElement("i", {
|
|
149
|
+
className: "sdocfont sdoc-check-mark sdoc-dropdown-item-right-icon"
|
|
150
|
+
}));
|
|
151
|
+
})), popoverState.borderPopover && /*#__PURE__*/React.createElement("div", {
|
|
152
|
+
className: "sdoc-image-popover border-popover sdoc-dropdown-menu"
|
|
153
|
+
}, IMAGE_BORDER_TYPE.map(function (item) {
|
|
154
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
155
|
+
key: item.type,
|
|
156
|
+
className: "sdoc-dropdown-menu-item sdoc-dropdown-item-with-left-icon pr-2",
|
|
157
|
+
onClick: function onClick(event) {
|
|
158
|
+
return onSelect(event, {
|
|
159
|
+
border_type: item.type
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
163
|
+
className: "sdoc-dropdown-item-content"
|
|
164
|
+
}, /*#__PURE__*/React.createElement("img", {
|
|
165
|
+
src: item.imgUrl,
|
|
166
|
+
draggable: false,
|
|
167
|
+
alt: ""
|
|
168
|
+
}), border_type === item.type && /*#__PURE__*/React.createElement("i", {
|
|
169
|
+
className: "sdocfont sdoc-check-mark sdoc-dropdown-item-right-icon"
|
|
170
|
+
})));
|
|
171
|
+
})), isShowImagePreview && /*#__PURE__*/React.createElement(ImagePreviewer, {
|
|
172
|
+
imageUrl: getImageURL(data.src),
|
|
173
|
+
editor: editor,
|
|
174
|
+
toggleImagePreviewer: function toggleImagePreviewer() {
|
|
175
|
+
setIsShowImagePreview(!isShowImagePreview);
|
|
176
|
+
}
|
|
177
|
+
})));
|
|
178
|
+
};
|
|
179
|
+
export default withTranslation('sdoc-editor')(ImageHoverMenu);
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
2
|
import { Transforms, Path, Editor, Element } from '@seafile/slate';
|
|
3
|
+
import toaster from '../../../../components/toast';
|
|
3
4
|
import context from '../../../../context';
|
|
4
|
-
import { insertImage,
|
|
5
|
+
import { insertImage, hasSdocImages, getImageData, queryCopyMoveProgressView } from './helpers';
|
|
5
6
|
import { focusEditor } from '../../core';
|
|
6
|
-
import {
|
|
7
|
+
import { getErrorMsg } from '../../../../utils';
|
|
8
|
+
import { getSlateFragmentAttribute } from '../../../utils/document-utils';
|
|
9
|
+
import { INSERT_POSITION, CLIPBOARD_FORMAT_KEY, CLIPBOARD_ORIGIN_SDOC_KEY, IMAGE } from '../../constants';
|
|
7
10
|
var withImage = function withImage(editor) {
|
|
8
11
|
var isInline = editor.isInline,
|
|
9
12
|
isVoid = editor.isVoid,
|
|
@@ -14,7 +17,7 @@ var withImage = function withImage(editor) {
|
|
|
14
17
|
// rewrite isInline
|
|
15
18
|
newEditor.isInline = function (elem) {
|
|
16
19
|
var type = elem.type;
|
|
17
|
-
if (type ===
|
|
20
|
+
if (type === IMAGE) {
|
|
18
21
|
return true;
|
|
19
22
|
}
|
|
20
23
|
return isInline(elem);
|
|
@@ -23,13 +26,30 @@ var withImage = function withImage(editor) {
|
|
|
23
26
|
// rewrite isVoid
|
|
24
27
|
newEditor.isVoid = function (elem) {
|
|
25
28
|
var type = elem.type;
|
|
26
|
-
if (type ===
|
|
29
|
+
if (type === IMAGE) {
|
|
27
30
|
return true;
|
|
28
31
|
}
|
|
29
32
|
return isVoid(elem);
|
|
30
33
|
};
|
|
31
34
|
newEditor.insertData = function (data) {
|
|
32
|
-
|
|
35
|
+
var fragment = data.getData("application/".concat(CLIPBOARD_FORMAT_KEY)) || getSlateFragmentAttribute(data);
|
|
36
|
+
var originSdocUuid = data.getData("text/".concat(CLIPBOARD_ORIGIN_SDOC_KEY));
|
|
37
|
+
if (fragment && originSdocUuid) {
|
|
38
|
+
var decoded = decodeURIComponent(window.atob(fragment));
|
|
39
|
+
var fragmentData = JSON.parse(decoded);
|
|
40
|
+
if (hasSdocImages(originSdocUuid, fragmentData)) {
|
|
41
|
+
var imageData = getImageData(fragmentData);
|
|
42
|
+
context.copyImage(originSdocUuid, imageData).then(function (res) {
|
|
43
|
+
if (res.status === 200) {
|
|
44
|
+
queryCopyMoveProgressView(res.data.task_id);
|
|
45
|
+
}
|
|
46
|
+
}).catch(function (error) {
|
|
47
|
+
var errorMessage = getErrorMsg(error);
|
|
48
|
+
toaster.danger(errorMessage);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (data.types && data.types.includes('Files') && data.files[0].type.includes(IMAGE)) {
|
|
33
53
|
context.uploadLocalImage(data.files[0]).then(function (fileUrl) {
|
|
34
54
|
insertImage(newEditor, fileUrl, editor.selection, INSERT_POSITION.CURRENT);
|
|
35
55
|
});
|
|
@@ -65,7 +85,7 @@ var withImage = function withImage(editor) {
|
|
|
65
85
|
_Editor$parent2 = _slicedToArray(_Editor$parent, 2),
|
|
66
86
|
node = _Editor$parent2[0],
|
|
67
87
|
path = _Editor$parent2[1];
|
|
68
|
-
if (Element.isElement(node) && node.type ===
|
|
88
|
+
if (Element.isElement(node) && node.type === IMAGE) {
|
|
69
89
|
focusEditor(editor, Path.next(path));
|
|
70
90
|
}
|
|
71
91
|
};
|
|
@@ -1,197 +1,227 @@
|
|
|
1
1
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import _createSuper from "@babel/runtime/helpers/esm/createSuper";
|
|
6
|
-
import { ReactEditor, useSelected } from '@seafile/slate-react';
|
|
7
|
-
import { Transforms } from '@seafile/slate';
|
|
8
|
-
import React from 'react';
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
3
|
+
import React, { useState, useCallback, useRef, useEffect } from 'react';
|
|
4
|
+
import { useSelected, useReadOnly } from '@seafile/slate-react';
|
|
9
5
|
import classNames from 'classnames';
|
|
10
6
|
import { withTranslation } from 'react-i18next';
|
|
11
7
|
import { getImageURL, updateImage } from './helpers';
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import {
|
|
16
|
-
import
|
|
8
|
+
import EventBus from '../../../utils/event-bus';
|
|
9
|
+
import { INTERNAL_EVENT } from '../../../constants';
|
|
10
|
+
import ImageHoverMenu from './hover-menu';
|
|
11
|
+
import { useScrollContext } from '../../../hooks/use-scroll-context';
|
|
12
|
+
import { IMAGE_BORDER_TYPE } from './constants';
|
|
17
13
|
import { ADDED_STYLE, DELETED_STYLE } from '../../constants';
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
14
|
+
import imagePlaceholder from '../../../assets/images/image-placeholder.png';
|
|
15
|
+
var Image = function Image(_ref) {
|
|
16
|
+
var element = _ref.element,
|
|
17
|
+
editor = _ref.editor,
|
|
18
|
+
className = _ref.className,
|
|
19
|
+
attributes = _ref.attributes,
|
|
20
|
+
children = _ref.children,
|
|
21
|
+
isSelected = _ref.isSelected,
|
|
22
|
+
t = _ref.t;
|
|
23
|
+
var data = element.data,
|
|
24
|
+
display_type = element.display_type,
|
|
25
|
+
align = element.align,
|
|
26
|
+
_element$border_type = element.border_type,
|
|
27
|
+
border_type = _element$border_type === void 0 ? IMAGE_BORDER_TYPE[0].type : _element$border_type;
|
|
28
|
+
var imageWrapStyle = {
|
|
29
|
+
display: display_type === 'Block' ? 'block' : 'inline-block',
|
|
30
|
+
textAlign: display_type === 'Block' ? align : ''
|
|
31
|
+
};
|
|
32
|
+
var imageInnerStyle = {
|
|
33
|
+
border: IMAGE_BORDER_TYPE.find(function (item) {
|
|
34
|
+
return item.type === border_type;
|
|
35
|
+
}).value
|
|
36
|
+
};
|
|
37
|
+
var readOnly = useReadOnly();
|
|
38
|
+
var imageRef = useRef(null);
|
|
39
|
+
var resizerRef = useRef(null);
|
|
40
|
+
var scrollRef = useScrollContext();
|
|
41
|
+
var _useState = useState(null),
|
|
42
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
43
|
+
width = _useState2[0],
|
|
44
|
+
setWidth = _useState2[1];
|
|
45
|
+
var _useState3 = useState(false),
|
|
46
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
47
|
+
isResizing = _useState4[0],
|
|
48
|
+
setIsResizing = _useState4[1];
|
|
49
|
+
var _useState5 = useState(false),
|
|
50
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
51
|
+
isShowImagePlaceholder = _useState6[0],
|
|
52
|
+
setIsShowImagePlaceholder = _useState6[1];
|
|
53
|
+
var _useState7 = useState(false),
|
|
54
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
55
|
+
isShowImageHoverMenu = _useState8[0],
|
|
56
|
+
setIsShowImageHoverMenu = _useState8[1];
|
|
57
|
+
var _useState9 = useState({}),
|
|
58
|
+
_useState10 = _slicedToArray(_useState9, 2),
|
|
59
|
+
menuPosition = _useState10[0],
|
|
60
|
+
setMenuPosition = _useState10[1];
|
|
61
|
+
var registerEvent = useCallback(function (eventList) {
|
|
62
|
+
eventList.forEach(function (element) {
|
|
63
|
+
document.addEventListener(element.eventName, element.event);
|
|
64
|
+
});
|
|
65
|
+
}, []);
|
|
66
|
+
var unregisterEvent = useCallback(function (eventList) {
|
|
67
|
+
eventList.forEach(function (element) {
|
|
68
|
+
document.removeEventListener(element.eventName, element.event);
|
|
69
|
+
});
|
|
70
|
+
}, []);
|
|
71
|
+
var onMouseMove = useCallback(function (event) {
|
|
72
|
+
var _resizerRef$current;
|
|
73
|
+
event.preventDefault();
|
|
74
|
+
event.stopPropagation();
|
|
75
|
+
var changeX = event.clientX - ((_resizerRef$current = resizerRef.current) === null || _resizerRef$current === void 0 ? void 0 : _resizerRef$current.getBoundingClientRect().left) - 5;
|
|
76
|
+
var imageWidth = imageRef.current.width + changeX;
|
|
77
|
+
if (imageWidth < 20) return;
|
|
78
|
+
setWidth(imageWidth);
|
|
79
|
+
}, []);
|
|
80
|
+
var onResizeEnd = useCallback(function (event) {
|
|
81
|
+
event.preventDefault();
|
|
82
|
+
event.stopPropagation();
|
|
83
|
+
unregisterEvent([{
|
|
84
|
+
'eventName': 'mousemove',
|
|
85
|
+
'event': onMouseMove
|
|
86
|
+
}, {
|
|
87
|
+
'eventName': 'mouseup',
|
|
88
|
+
'event': onResizeEnd
|
|
89
|
+
}]);
|
|
90
|
+
var newData = _objectSpread(_objectSpread({}, element.data), {}, {
|
|
91
|
+
width: width
|
|
92
|
+
});
|
|
93
|
+
updateImage(editor, newData);
|
|
94
|
+
setIsResizing(false);
|
|
95
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
96
|
+
}, [editor, element.data, width]);
|
|
97
|
+
var onResizeStart = useCallback(function (event) {
|
|
98
|
+
event.preventDefault();
|
|
99
|
+
event.stopPropagation();
|
|
100
|
+
setIsResizing(true);
|
|
101
|
+
registerEvent([{
|
|
102
|
+
'eventName': 'mousemove',
|
|
103
|
+
'event': onMouseMove
|
|
104
|
+
}, {
|
|
105
|
+
'eventName': 'mouseup',
|
|
106
|
+
'event': onResizeEnd
|
|
107
|
+
}]);
|
|
108
|
+
}, [onMouseMove, onResizeEnd, registerEvent]);
|
|
109
|
+
var getImageStyle = useCallback(function () {
|
|
110
|
+
var imageWidth = element.data.width || '';
|
|
111
|
+
if (width) imageWidth = width;
|
|
112
|
+
return {
|
|
113
|
+
width: imageWidth
|
|
67
114
|
};
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
115
|
+
}, [element.data, width]);
|
|
116
|
+
var onScroll = useCallback(function () {
|
|
117
|
+
setPosition(imageRef.current);
|
|
118
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
119
|
+
}, []);
|
|
120
|
+
var onHideImageHoverMenu = useCallback(function (e) {
|
|
121
|
+
if (e.target === imageRef.current) return;
|
|
122
|
+
setIsShowImageHoverMenu(false);
|
|
123
|
+
}, []);
|
|
124
|
+
useEffect(function () {
|
|
125
|
+
var observerRefValue = null;
|
|
126
|
+
if (isShowImageHoverMenu) {
|
|
127
|
+
registerEvent([{
|
|
128
|
+
'eventName': 'click',
|
|
129
|
+
'event': onHideImageHoverMenu
|
|
130
|
+
}]);
|
|
131
|
+
scrollRef.current && scrollRef.current.addEventListener('scroll', onScroll);
|
|
132
|
+
observerRefValue = scrollRef.current;
|
|
133
|
+
} else {
|
|
134
|
+
unregisterEvent([{
|
|
135
|
+
'eventName': 'click',
|
|
136
|
+
'event': onHideImageHoverMenu
|
|
137
|
+
}]);
|
|
138
|
+
scrollRef.current && scrollRef.current.removeEventListener('scroll', onScroll);
|
|
139
|
+
}
|
|
140
|
+
return function () {
|
|
141
|
+
unregisterEvent([{
|
|
142
|
+
'eventName': 'click',
|
|
143
|
+
'event': onHideImageHoverMenu
|
|
144
|
+
}]);
|
|
145
|
+
if (observerRefValue) {
|
|
146
|
+
observerRefValue.removeEventListener('scroll', onScroll);
|
|
147
|
+
}
|
|
76
148
|
};
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
149
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
150
|
+
}, [isShowImageHoverMenu, onHideImageHoverMenu]);
|
|
151
|
+
var setPosition = useCallback(function (elem) {
|
|
152
|
+
if (elem) {
|
|
153
|
+
var _elem$getBoundingClie = elem.getBoundingClientRect(),
|
|
154
|
+
top = _elem$getBoundingClie.top,
|
|
155
|
+
left = _elem$getBoundingClie.left;
|
|
156
|
+
var menuTop = top - 42;
|
|
157
|
+
var menuLeft = left - 18;
|
|
158
|
+
setMenuPosition({
|
|
159
|
+
top: menuTop,
|
|
160
|
+
left: menuLeft
|
|
80
161
|
});
|
|
81
|
-
};
|
|
82
|
-
_this.setImageRef = function (ref) {
|
|
83
|
-
_this.image = ref;
|
|
84
|
-
};
|
|
85
|
-
_this.setResizerRef = function (ref) {
|
|
86
|
-
_this.resizer = ref;
|
|
87
|
-
};
|
|
88
|
-
_this.state = {
|
|
89
|
-
width: null,
|
|
90
|
-
isResizing: false,
|
|
91
|
-
isShowImagePreview: false,
|
|
92
|
-
isShowImagePlaceholder: false
|
|
93
|
-
};
|
|
94
|
-
return _this;
|
|
95
|
-
}
|
|
96
|
-
_createClass(Image, [{
|
|
97
|
-
key: "componentDidMount",
|
|
98
|
-
value: function componentDidMount() {
|
|
99
|
-
var _this2 = this;
|
|
100
|
-
var docUuid = context.getSetting('docUuid');
|
|
101
|
-
var _this$props2 = this.props,
|
|
102
|
-
element = _this$props2.element,
|
|
103
|
-
editor = _this$props2.editor;
|
|
104
|
-
var data = element.data;
|
|
105
|
-
var origin_doc_uuid = data.origin_doc_uuid,
|
|
106
|
-
src = data.src;
|
|
107
|
-
|
|
108
|
-
// Pictures are copied from other documents
|
|
109
|
-
if (origin_doc_uuid && origin_doc_uuid !== docUuid) {
|
|
110
|
-
this.setState({
|
|
111
|
-
isShowImagePlaceholder: true
|
|
112
|
-
});
|
|
113
|
-
var originDocUuid = origin_doc_uuid;
|
|
114
|
-
var imageList = [src.slice(1)];
|
|
115
|
-
context.copyImage(originDocUuid, imageList).then(function (res) {
|
|
116
|
-
if (res.status === 200) {
|
|
117
|
-
var path = ReactEditor.findPath(editor, element);
|
|
118
|
-
Transforms.setNodes(editor, {
|
|
119
|
-
data: _objectSpread(_objectSpread({}, data), {}, {
|
|
120
|
-
origin_doc_uuid: docUuid
|
|
121
|
-
})
|
|
122
|
-
}, {
|
|
123
|
-
at: path
|
|
124
|
-
});
|
|
125
|
-
_this2.setState({
|
|
126
|
-
isShowImagePlaceholder: false
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
}).catch(function (error) {
|
|
130
|
-
var errorMessage = getErrorMsg(error);
|
|
131
|
-
toaster.danger(errorMessage);
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
162
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
var
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
163
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
164
|
+
}, []);
|
|
165
|
+
var onClickImage = useCallback(function (e) {
|
|
166
|
+
setPosition(e.currentTarget);
|
|
167
|
+
setIsShowImageHoverMenu(true);
|
|
168
|
+
}, [setPosition]);
|
|
169
|
+
var reloadImage = useCallback(function () {
|
|
170
|
+
if (imageRef) {
|
|
171
|
+
imageRef.current = getImageURL(data.src);
|
|
172
|
+
}
|
|
173
|
+
}, [data.src]);
|
|
174
|
+
var onImageLoadError = useCallback(function () {
|
|
175
|
+
setIsShowImagePlaceholder(true);
|
|
176
|
+
// External network images do not reload after failure to load
|
|
177
|
+
if (!data.src.startsWith('http')) {
|
|
178
|
+
var eventBus = EventBus.getInstance();
|
|
179
|
+
eventBus.subscribe(INTERNAL_EVENT.RELOAD_IMAGE, reloadImage);
|
|
180
|
+
}
|
|
181
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
182
|
+
}, []);
|
|
183
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, isShowImagePlaceholder && /*#__PURE__*/React.createElement("span", Object.assign({
|
|
184
|
+
className: classNames('sdoc-image-wrapper', className)
|
|
185
|
+
}, attributes), /*#__PURE__*/React.createElement("img", {
|
|
186
|
+
ref: imageRef,
|
|
187
|
+
src: imagePlaceholder,
|
|
188
|
+
style: getImageStyle(),
|
|
189
|
+
draggable: false,
|
|
190
|
+
alt: ""
|
|
191
|
+
}), children), !isShowImagePlaceholder && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", Object.assign({
|
|
192
|
+
className: classNames('sdoc-image-wrapper', className)
|
|
193
|
+
}, attributes, {
|
|
194
|
+
style: imageWrapStyle
|
|
195
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
196
|
+
className: "sdoc-image-inner",
|
|
197
|
+
onClick: onClickImage,
|
|
198
|
+
style: imageInnerStyle
|
|
199
|
+
}, /*#__PURE__*/React.createElement("img", {
|
|
200
|
+
className: classNames({
|
|
201
|
+
'image-selected': isSelected
|
|
202
|
+
}),
|
|
203
|
+
ref: imageRef,
|
|
204
|
+
src: getImageURL(data.src),
|
|
205
|
+
style: getImageStyle(),
|
|
206
|
+
draggable: false,
|
|
207
|
+
onError: onImageLoadError,
|
|
208
|
+
alt: ""
|
|
209
|
+
}), isSelected && /*#__PURE__*/React.createElement("span", {
|
|
210
|
+
className: "image-resizer",
|
|
211
|
+
ref: resizerRef,
|
|
212
|
+
onMouseDown: onResizeStart
|
|
213
|
+
}), isResizing && /*#__PURE__*/React.createElement("span", {
|
|
214
|
+
className: "image-size",
|
|
215
|
+
contentEditable: false
|
|
216
|
+
}, /*#__PURE__*/React.createElement("span", null, t('Width'), ':', parseInt(width || imageRef.current.clientWidth)), /*#__PURE__*/React.createElement("span", null, "\xA0\xA0"), /*#__PURE__*/React.createElement("span", null, t('Height'), ':', imageRef.current.clientHeight))), children), isShowImageHoverMenu && !readOnly && /*#__PURE__*/React.createElement(ImageHoverMenu, {
|
|
217
|
+
editor: editor,
|
|
218
|
+
menuPosition: menuPosition,
|
|
219
|
+
element: element,
|
|
220
|
+
onHideImageHoverMenu: function onHideImageHoverMenu() {
|
|
221
|
+
setIsShowImageHoverMenu(false);
|
|
191
222
|
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
}(React.Component);
|
|
223
|
+
})));
|
|
224
|
+
};
|
|
195
225
|
var SdocImage = withTranslation('sdoc-editor')(Image);
|
|
196
226
|
function renderImage(props, editor) {
|
|
197
227
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
1
|
import { decorateOperation, replacePastedDataId } from './helpers';
|
|
2
|
+
import { getSlateFragmentAttribute } from '../utils/document-utils';
|
|
3
3
|
import { CLIPBOARD_FORMAT_KEY } from '../extension/constants';
|
|
4
|
-
var catchSlateFragment = /data-slate-fragment="(.+?)"/m;
|
|
5
|
-
var getSlateFragmentAttribute = function getSlateFragmentAttribute(dataTransfer) {
|
|
6
|
-
var htmlData = dataTransfer.getData('text/html');
|
|
7
|
-
var _ref = htmlData.match(catchSlateFragment) || [],
|
|
8
|
-
_ref2 = _slicedToArray(_ref, 2),
|
|
9
|
-
fragment = _ref2[1];
|
|
10
|
-
return fragment;
|
|
11
|
-
};
|
|
12
4
|
var withNodeId = function withNodeId(editor) {
|
|
13
5
|
var apply = editor.apply;
|
|
14
6
|
var newEditor = editor;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
1
2
|
import ObjectUtils from './object-utils';
|
|
3
|
+
import context from '../../context';
|
|
2
4
|
import { generateDefaultText } from '../../basic-sdk/extension/core/utils/index';
|
|
5
|
+
import { CLIPBOARD_ORIGIN_SDOC_KEY } from '../extension/constants';
|
|
3
6
|
export var normalizeChildren = function normalizeChildren(children) {
|
|
4
7
|
// text
|
|
5
8
|
if (!Array.isArray(children)) return children;
|
|
@@ -15,4 +18,16 @@ export var normalizeChildren = function normalizeChildren(children) {
|
|
|
15
18
|
child.children = normalizeChildren(child.children);
|
|
16
19
|
return child;
|
|
17
20
|
});
|
|
21
|
+
};
|
|
22
|
+
export var setOriginSdocKey = function setOriginSdocKey(event) {
|
|
23
|
+
var docUuid = context.getSetting('docUuid');
|
|
24
|
+
event.clipboardData.setData("text/".concat(CLIPBOARD_ORIGIN_SDOC_KEY), docUuid);
|
|
25
|
+
};
|
|
26
|
+
export var getSlateFragmentAttribute = function getSlateFragmentAttribute(dataTransfer) {
|
|
27
|
+
var catchSlateFragment = /data-slate-fragment="(.+?)"/m;
|
|
28
|
+
var htmlData = dataTransfer.getData('text/html');
|
|
29
|
+
var _ref = htmlData.match(catchSlateFragment) || [],
|
|
30
|
+
_ref2 = _slicedToArray(_ref, 2),
|
|
31
|
+
fragment = _ref2[1];
|
|
32
|
+
return fragment;
|
|
18
33
|
};
|
|
@@ -3,6 +3,7 @@ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
|
3
3
|
import isHotkey from 'is-hotkey';
|
|
4
4
|
import EventBus from '../utils/event-bus';
|
|
5
5
|
import { getSelectedNodeByType } from '../extension/core/queries/';
|
|
6
|
+
import { setOriginSdocKey } from './document-utils';
|
|
6
7
|
import { ELEMENT_TYPE } from '../extension/constants';
|
|
7
8
|
import { INTERNAL_EVENT } from '../constants';
|
|
8
9
|
var EventProxy = /*#__PURE__*/_createClass(function EventProxy(_editor) {
|
|
@@ -79,11 +80,10 @@ var EventProxy = /*#__PURE__*/_createClass(function EventProxy(_editor) {
|
|
|
79
80
|
}
|
|
80
81
|
};
|
|
81
82
|
this.onCopy = function (event) {
|
|
82
|
-
event
|
|
83
|
-
event.nativeEvent.stopImmediatePropagation();
|
|
84
|
-
// 处理数据
|
|
83
|
+
setOriginSdocKey(event);
|
|
85
84
|
};
|
|
86
85
|
this.onCut = function (event) {
|
|
86
|
+
setOriginSdocKey(event);
|
|
87
87
|
if (_this.editor.cut) {
|
|
88
88
|
_this.editor.cut(event);
|
|
89
89
|
}
|
package/dist/context.js
CHANGED
|
@@ -242,6 +242,12 @@ var Context = /*#__PURE__*/function () {
|
|
|
242
242
|
var docUuid = this.getSetting('docUuid');
|
|
243
243
|
return this.api.getLinkFilesInfo(docUuid, filesUrl);
|
|
244
244
|
}
|
|
245
|
+
}, {
|
|
246
|
+
key: "getCopyMoveProgressView",
|
|
247
|
+
value: function getCopyMoveProgressView(taskId) {
|
|
248
|
+
var docUuid = this.getSetting('docUuid');
|
|
249
|
+
return this.api.getCopyMoveProgressView(docUuid, taskId);
|
|
250
|
+
}
|
|
245
251
|
}]);
|
|
246
252
|
return Context;
|
|
247
253
|
}();
|
package/package.json
CHANGED
|
@@ -378,5 +378,7 @@
|
|
|
378
378
|
"Has_been_removed_tip": "Document has been removed, please view other documents.",
|
|
379
379
|
"Revision_created": "Revision {{id}} created",
|
|
380
380
|
"Checking": "Checking...",
|
|
381
|
-
"Publishing": "Publishing..."
|
|
381
|
+
"Publishing": "Publishing...",
|
|
382
|
+
"Inline": "Inline",
|
|
383
|
+
"Block": "Block"
|
|
382
384
|
}
|