@seafile/sdoc-editor 1.0.139 → 1.0.141-alpha2
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 +24 -0
- package/dist/basic-sdk/assets/css/sdoc-editor-plugins.css +4 -0
- package/dist/basic-sdk/comment/components/comment-item-collapse-wrapper.js +4 -4
- package/dist/basic-sdk/comment/components/comment-list.css +29 -23
- package/dist/basic-sdk/comment/components/global-comment/index.css +6 -6
- package/dist/basic-sdk/constants/index.js +2 -1
- package/dist/basic-sdk/editor/wiki-editor.js +3 -1
- package/dist/basic-sdk/extension/commons/insert-element-dialog/index.js +53 -0
- package/dist/basic-sdk/extension/constants/element-type.js +3 -1
- package/dist/basic-sdk/extension/constants/index.js +16 -3
- package/dist/basic-sdk/extension/constants/menus-config.js +12 -0
- package/dist/basic-sdk/extension/plugins/image/plugin.js +6 -0
- package/dist/basic-sdk/extension/plugins/image/render-elem.js +5 -0
- package/dist/basic-sdk/extension/plugins/index.js +8 -1
- package/dist/basic-sdk/extension/plugins/paragraph/render-elem.js +3 -3
- package/dist/basic-sdk/extension/plugins/sdoc-link/helpers.js +2 -0
- package/dist/basic-sdk/extension/plugins/table/plugin.js +3 -0
- package/dist/basic-sdk/extension/plugins/video/helpers.js +144 -0
- package/dist/basic-sdk/extension/plugins/video/hover-menu/index.css +89 -0
- package/dist/basic-sdk/extension/plugins/video/hover-menu/index.js +84 -0
- package/dist/basic-sdk/extension/plugins/video/index.css +73 -0
- package/dist/basic-sdk/extension/plugins/video/index.js +20 -0
- package/dist/basic-sdk/extension/plugins/video/menu/index.js +55 -0
- package/dist/basic-sdk/extension/plugins/video/plugin.js +47 -0
- package/dist/basic-sdk/extension/plugins/video/render-elem.js +305 -0
- package/dist/basic-sdk/extension/render/custom-element.js +8 -1
- package/dist/basic-sdk/extension/render/render-comment-editor-element.js +7 -0
- package/dist/basic-sdk/extension/toolbar/header-toolbar/insert-toolbar/index.js +9 -8
- package/dist/basic-sdk/extension/toolbar/insert-element-toolbar/index.js +28 -1
- package/dist/basic-sdk/extension/toolbar/side-toolbar/helpers.js +2 -1
- package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-block-menu.js +19 -0
- package/dist/basic-sdk/utils/event-handler.js +1 -1
- package/dist/components/toast/toast.js +4 -0
- package/dist/components/toast/toaster.js +1 -0
- package/dist/context.js +9 -0
- package/package.json +2 -2
- package/public/media/sdoc-editor-font/iconfont.eot +0 -0
- package/public/media/sdoc-editor-font/iconfont.svg +4 -0
- package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
- package/public/media/sdoc-editor-font/iconfont.woff +0 -0
- package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
- package/public/media/sdoc-editor-font.css +15 -10
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.renderVideoBlock = renderVideoBlock;
|
|
9
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _slateReact = require("@seafile/slate-react");
|
|
11
|
+
var _slate = require("@seafile/slate");
|
|
12
|
+
var _reactI18next = require("react-i18next");
|
|
13
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
14
|
+
var _helpers = require("./helpers");
|
|
15
|
+
var _context = _interopRequireDefault(require("../../../../../src/context"));
|
|
16
|
+
var _core = require("../../core");
|
|
17
|
+
var _useScrollContext = require("../../../hooks/use-scroll-context");
|
|
18
|
+
require("./index.css");
|
|
19
|
+
// import VideoHoverMenu from './hover-menu';
|
|
20
|
+
|
|
21
|
+
const Video = _ref => {
|
|
22
|
+
var _videoStates$element$, _data$videoFiles$, _data$videoFiles$2;
|
|
23
|
+
let {
|
|
24
|
+
element,
|
|
25
|
+
editor,
|
|
26
|
+
style,
|
|
27
|
+
className,
|
|
28
|
+
attributes,
|
|
29
|
+
children,
|
|
30
|
+
t
|
|
31
|
+
} = _ref;
|
|
32
|
+
const {
|
|
33
|
+
data
|
|
34
|
+
} = element;
|
|
35
|
+
// const readOnly = useReadOnly();
|
|
36
|
+
const videoRef = (0, _react.useRef)(null);
|
|
37
|
+
const [isLoaded, setIsLoaded] = (0, _react.useState)(false);
|
|
38
|
+
const [isShowVideoHoverMenu, setIsShowVideoHoverMenu] = (0, _react.useState)(false);
|
|
39
|
+
const [menuPosition, setMenuPosition] = (0, _react.useState)({});
|
|
40
|
+
const scrollRef = (0, _useScrollContext.useScrollContext)();
|
|
41
|
+
const [isSelected, setIsSelected] = (0, _react.useState)(false);
|
|
42
|
+
const [videoStates, setVideoStates] = (0, _react.useState)({});
|
|
43
|
+
// const [isPaused, setIsPaused] = useState(true);
|
|
44
|
+
|
|
45
|
+
const handlePlay = () => {
|
|
46
|
+
// setIsPaused(false);
|
|
47
|
+
setVideoStates(prev => ({
|
|
48
|
+
...prev,
|
|
49
|
+
[element.id]: false
|
|
50
|
+
}));
|
|
51
|
+
};
|
|
52
|
+
const handlePause = () => {
|
|
53
|
+
// setIsPaused(true);
|
|
54
|
+
setVideoStates(prev => ({
|
|
55
|
+
...prev,
|
|
56
|
+
[element.id]: true
|
|
57
|
+
}));
|
|
58
|
+
};
|
|
59
|
+
const isPaused = (_videoStates$element$ = videoStates[element.id]) !== null && _videoStates$element$ !== void 0 ? _videoStates$element$ : true;
|
|
60
|
+
const handleVideoLoad = () => {
|
|
61
|
+
// console.log(33);
|
|
62
|
+
setIsLoaded(true);
|
|
63
|
+
// setProgress(100);
|
|
64
|
+
};
|
|
65
|
+
const setPosition = (0, _react.useCallback)(() => {
|
|
66
|
+
if (videoRef.current) {
|
|
67
|
+
const {
|
|
68
|
+
top,
|
|
69
|
+
left
|
|
70
|
+
} = videoRef.current.getBoundingClientRect();
|
|
71
|
+
setMenuPosition({
|
|
72
|
+
top: top - 40,
|
|
73
|
+
left: left
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}, []);
|
|
77
|
+
const onClickVideo = (0, _react.useCallback)(e => {
|
|
78
|
+
e.stopPropagation();
|
|
79
|
+
const path = _slateReact.ReactEditor.findPath(editor, element);
|
|
80
|
+
console.log(1, 2, (0, _core.getAboveBlockNode)(editor));
|
|
81
|
+
_slate.Transforms.select(editor, path);
|
|
82
|
+
setIsSelected(true);
|
|
83
|
+
console.log(4, isSelected, path);
|
|
84
|
+
setPosition();
|
|
85
|
+
setIsShowVideoHoverMenu(true);
|
|
86
|
+
const selection = editor.selection;
|
|
87
|
+
console.log(9, selection);
|
|
88
|
+
}, [element, setPosition]);
|
|
89
|
+
const onClickOutside = (0, _react.useCallback)(e => {
|
|
90
|
+
e.stopPropagation();
|
|
91
|
+
if (videoRef.current && !videoRef.current.contains(e.target)) {
|
|
92
|
+
setIsSelected(false);
|
|
93
|
+
console.log(3);
|
|
94
|
+
}
|
|
95
|
+
}, []);
|
|
96
|
+
|
|
97
|
+
// useEffect(() => {
|
|
98
|
+
// const { selection } = editor;
|
|
99
|
+
// if (selection) {
|
|
100
|
+
// const aboveNodeEntry = getAboveBlockNode(editor);
|
|
101
|
+
// if (aboveNodeEntry && aboveNodeEntry[0].type === VIDEO_BLOCK) {
|
|
102
|
+
// console.log(2 )
|
|
103
|
+
// setIsSelected(true);
|
|
104
|
+
// } else {
|
|
105
|
+
// console.log(4);
|
|
106
|
+
// setIsSelected(false);
|
|
107
|
+
// }
|
|
108
|
+
// }
|
|
109
|
+
// }, [editor.selection, element]);
|
|
110
|
+
// useEffect(() => {
|
|
111
|
+
// console.log('Backspace key pressed');
|
|
112
|
+
// const handleKeyDown = (e) => {
|
|
113
|
+
// if (e.key === 'Backspace') {
|
|
114
|
+
// console.log('22, Backspace key pressed');
|
|
115
|
+
// e.preventDefault();
|
|
116
|
+
// }
|
|
117
|
+
// };
|
|
118
|
+
|
|
119
|
+
// window.addEventListener('keydown', handleKeyDown);
|
|
120
|
+
|
|
121
|
+
// return () => {
|
|
122
|
+
// window.removeEventListener('keydown', handleKeyDown);
|
|
123
|
+
// };
|
|
124
|
+
// }, []);
|
|
125
|
+
|
|
126
|
+
const onHideVideoHoverMenu = (0, _react.useCallback)(e => {
|
|
127
|
+
if (e.target === videoRef.current) return;
|
|
128
|
+
setIsShowVideoHoverMenu(false);
|
|
129
|
+
}, []);
|
|
130
|
+
const registerEvent = (0, _react.useCallback)(eventList => {
|
|
131
|
+
eventList.forEach(element => {
|
|
132
|
+
document.addEventListener(element.eventName, element.event);
|
|
133
|
+
});
|
|
134
|
+
}, []);
|
|
135
|
+
const unregisterEvent = (0, _react.useCallback)(eventList => {
|
|
136
|
+
eventList.forEach(element => {
|
|
137
|
+
document.removeEventListener(element.eventName, element.event);
|
|
138
|
+
});
|
|
139
|
+
}, []);
|
|
140
|
+
const onScroll = (0, _react.useCallback)(() => {
|
|
141
|
+
setPosition();
|
|
142
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
143
|
+
}, []);
|
|
144
|
+
(0, _react.useEffect)(() => {
|
|
145
|
+
let observerRefValue = null;
|
|
146
|
+
if (isShowVideoHoverMenu) {
|
|
147
|
+
registerEvent([{
|
|
148
|
+
'eventName': 'click',
|
|
149
|
+
'event': onHideVideoHoverMenu
|
|
150
|
+
}]);
|
|
151
|
+
scrollRef.current && scrollRef.current.addEventListener('scroll', onScroll);
|
|
152
|
+
observerRefValue = scrollRef.current;
|
|
153
|
+
} else {
|
|
154
|
+
unregisterEvent([{
|
|
155
|
+
'eventName': 'click',
|
|
156
|
+
'event': onHideVideoHoverMenu
|
|
157
|
+
}]);
|
|
158
|
+
scrollRef.current && scrollRef.current.removeEventListener('scroll', onScroll);
|
|
159
|
+
}
|
|
160
|
+
return () => {
|
|
161
|
+
unregisterEvent([{
|
|
162
|
+
'eventName': 'click',
|
|
163
|
+
'event': onHideVideoHoverMenu
|
|
164
|
+
}]);
|
|
165
|
+
if (observerRefValue) {
|
|
166
|
+
observerRefValue.removeEventListener('scroll', onScroll);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
170
|
+
}, [isShowVideoHoverMenu, onHideVideoHoverMenu]);
|
|
171
|
+
// console.log(0, data);
|
|
172
|
+
const videoFileName = data.videoFiles && ((_data$videoFiles$ = data.videoFiles[0]) === null || _data$videoFiles$ === void 0 ? void 0 : _data$videoFiles$.name) || null;
|
|
173
|
+
const videoFileSize = data.videoFiles && ((_data$videoFiles$2 = data.videoFiles[0]) === null || _data$videoFiles$2 === void 0 ? void 0 : _data$videoFiles$2.size) || null;
|
|
174
|
+
(0, _react.useEffect)(() => {
|
|
175
|
+
const videoElement = videoRef.current;
|
|
176
|
+
if (videoElement) {
|
|
177
|
+
// videoElement.addEventListener('timeupdate', handleProgress);
|
|
178
|
+
videoElement.addEventListener('onCanPlay', handleVideoLoad);
|
|
179
|
+
// console.log(99, videoElement);
|
|
180
|
+
}
|
|
181
|
+
document.addEventListener('click', onClickOutside);
|
|
182
|
+
return () => {
|
|
183
|
+
if (videoElement) {
|
|
184
|
+
// videoElement.removeEventListener('timeupdate', handleProgress);
|
|
185
|
+
videoElement.removeEventListener('onCanPlay', handleVideoLoad);
|
|
186
|
+
}
|
|
187
|
+
document.removeEventListener('click', onClickOutside);
|
|
188
|
+
};
|
|
189
|
+
}, []);
|
|
190
|
+
const formatFileSize = size => {
|
|
191
|
+
if (typeof size !== 'number') {
|
|
192
|
+
return '';
|
|
193
|
+
}
|
|
194
|
+
if (size >= 1000 * 1000 * 1000) {
|
|
195
|
+
return (size / (1000 * 1000 * 1000)).toFixed(1) + ' G';
|
|
196
|
+
}
|
|
197
|
+
if (size >= 1000 * 1000) {
|
|
198
|
+
return (size / (1000 * 1000)).toFixed(1) + ' M';
|
|
199
|
+
}
|
|
200
|
+
if (size >= 1000) {
|
|
201
|
+
return (size / 1000).toFixed(1) + ' K';
|
|
202
|
+
}
|
|
203
|
+
return size.toFixed(1) + ' B';
|
|
204
|
+
};
|
|
205
|
+
const videoFileIcon = () => {
|
|
206
|
+
const server = _context.default.getSetting('serviceUrl');
|
|
207
|
+
return `${server}/media/img/file/256/video.png`;
|
|
208
|
+
};
|
|
209
|
+
// console.log(100, isLoaded);
|
|
210
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !isLoaded && /*#__PURE__*/_react.default.createElement("div", {
|
|
211
|
+
className: "video-loading-placeholder"
|
|
212
|
+
}, /*#__PURE__*/_react.default.createElement("img", {
|
|
213
|
+
className: "video-file-icon",
|
|
214
|
+
src: videoFileIcon(),
|
|
215
|
+
alt: ""
|
|
216
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
217
|
+
className: "video-file-info"
|
|
218
|
+
}, /*#__PURE__*/_react.default.createElement("div", null, videoFileName), /*#__PURE__*/_react.default.createElement("div", {
|
|
219
|
+
className: "file-size"
|
|
220
|
+
}, /*#__PURE__*/_react.default.createElement("span", null, formatFileSize(videoFileSize), " \u2014 "), /*#__PURE__*/_react.default.createElement("div", {
|
|
221
|
+
className: "loading-spinner"
|
|
222
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
223
|
+
className: "spinner"
|
|
224
|
+
}))))), true && /*#__PURE__*/_react.default.createElement("div", Object.assign({
|
|
225
|
+
"data-id": element.id,
|
|
226
|
+
className: (0, _classnames.default)('sdoc-video-wrapper', className)
|
|
227
|
+
}, attributes, {
|
|
228
|
+
style: {
|
|
229
|
+
...style,
|
|
230
|
+
display: isLoaded ? 'block' : 'none'
|
|
231
|
+
}
|
|
232
|
+
// contentEditable='false'
|
|
233
|
+
// suppressContentEditableWarning
|
|
234
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
235
|
+
className: "sdoc-video-inner",
|
|
236
|
+
style: {
|
|
237
|
+
visibility: isLoaded ? 'visible' : 'hidden'
|
|
238
|
+
},
|
|
239
|
+
tabIndex: "-1"
|
|
240
|
+
// contentEditable='false'
|
|
241
|
+
// suppressContentEditableWarning
|
|
242
|
+
}, /*#__PURE__*/_react.default.createElement("video", {
|
|
243
|
+
className: "sdoc-video-element",
|
|
244
|
+
ref: videoRef,
|
|
245
|
+
src: (0, _helpers.getVideoURL)(data, editor),
|
|
246
|
+
controls: true
|
|
247
|
+
// style={getVideoStyle()}
|
|
248
|
+
,
|
|
249
|
+
onClick: onClickVideo,
|
|
250
|
+
draggable: false,
|
|
251
|
+
onPlay: handlePlay,
|
|
252
|
+
onPause: handlePause
|
|
253
|
+
// width= '200px'
|
|
254
|
+
,
|
|
255
|
+
onCanPlay: handleVideoLoad,
|
|
256
|
+
style: {
|
|
257
|
+
boxShadow: isSelected ? '0 0 0 2px #007bff' : 'none'
|
|
258
|
+
}
|
|
259
|
+
// contentEditable='false'
|
|
260
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
261
|
+
className: "sdoc-video-play sdocfont sdoc-play icon-font",
|
|
262
|
+
style: {
|
|
263
|
+
visibility: isPaused ? 'visible' : 'hidden'
|
|
264
|
+
},
|
|
265
|
+
contentEditable: "false"
|
|
266
|
+
}))));
|
|
267
|
+
};
|
|
268
|
+
const SdocVideo = (0, _reactI18next.withTranslation)('sdoc-editor')(Video);
|
|
269
|
+
function renderVideoBlock(props, editor) {
|
|
270
|
+
const {
|
|
271
|
+
element,
|
|
272
|
+
children,
|
|
273
|
+
attributes
|
|
274
|
+
} = props;
|
|
275
|
+
console.log('children', element.type);
|
|
276
|
+
return /*#__PURE__*/_react.default.createElement("div", Object.assign({
|
|
277
|
+
className: "sdoc-video-block-wrapper"
|
|
278
|
+
}, attributes, {
|
|
279
|
+
contentEditable: "true",
|
|
280
|
+
suppressContentEditableWarning: true
|
|
281
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
282
|
+
className: "sdoc-video-children-wrapper",
|
|
283
|
+
contentEditable: "false",
|
|
284
|
+
suppressContentEditableWarning: true,
|
|
285
|
+
style: {
|
|
286
|
+
userSelect: 'none',
|
|
287
|
+
pointerEvents: 'none'
|
|
288
|
+
}
|
|
289
|
+
}, children), /*#__PURE__*/_react.default.createElement(SdocVideo
|
|
290
|
+
// children={children}
|
|
291
|
+
, {
|
|
292
|
+
element: element,
|
|
293
|
+
editor: editor
|
|
294
|
+
// onSelect={(e) => {
|
|
295
|
+
// const selection = window.getSelection();
|
|
296
|
+
// if (selection && selection.anchorNode) {
|
|
297
|
+
// const isInsideVideo = videoRef.current?.contains(selection.anchorNode);
|
|
298
|
+
// if (isInsideVideo) {
|
|
299
|
+
// e.preventDefault();
|
|
300
|
+
// }
|
|
301
|
+
// }
|
|
302
|
+
// }}
|
|
303
|
+
// style={{ pointerEvents: 'none' }}
|
|
304
|
+
}));
|
|
305
|
+
}
|
|
@@ -32,9 +32,9 @@ const CustomRenderElement = props => {
|
|
|
32
32
|
switch (element.type) {
|
|
33
33
|
case _constants.PARAGRAPH:
|
|
34
34
|
{
|
|
35
|
-
const parentNode = (0, _core.getParentNode)(editor.children, element.id);
|
|
36
35
|
let placeholder = undefined;
|
|
37
36
|
if (editor.editorType === _constants2.DIFF_VIEWER) placeholder = '';
|
|
37
|
+
const parentNode = (0, _core.getParentNode)(editor.children, element.id);
|
|
38
38
|
if (parentNode && parentNode.type === _constants.LIST_ITEM) {
|
|
39
39
|
const [renderParagraph] = _plugins.ParagraphPlugin.renderElements;
|
|
40
40
|
return renderParagraph({
|
|
@@ -128,6 +128,13 @@ const CustomRenderElement = props => {
|
|
|
128
128
|
...props
|
|
129
129
|
}, editor);
|
|
130
130
|
}
|
|
131
|
+
case _constants.VIDEO_BLOCK:
|
|
132
|
+
{
|
|
133
|
+
const [renderVideoBlock] = _plugins.VideoPlugin.renderElements;
|
|
134
|
+
return renderVideoBlock({
|
|
135
|
+
...props
|
|
136
|
+
}, editor);
|
|
137
|
+
}
|
|
131
138
|
case _constants.ELEMENT_TYPE.MULTI_COLUMN:
|
|
132
139
|
{
|
|
133
140
|
const [renderMultiColumn] = _plugins.MultiColumnPlugin.renderElements;
|
|
@@ -73,6 +73,13 @@ const RenderCommentEditorCustomRenderElement = props => {
|
|
|
73
73
|
...props
|
|
74
74
|
}, editor);
|
|
75
75
|
}
|
|
76
|
+
case _constants.VIDEO_BLOCK:
|
|
77
|
+
{
|
|
78
|
+
const [renderVideoBlock] = _plugins.VideoPlugin.renderElements;
|
|
79
|
+
return renderVideoBlock({
|
|
80
|
+
...props
|
|
81
|
+
}, editor);
|
|
82
|
+
}
|
|
76
83
|
case _constants.MENTION:
|
|
77
84
|
{
|
|
78
85
|
const [renderMention] = _plugins.MentionPlugin.renderElements;
|
|
@@ -11,13 +11,14 @@ var _reactI18next = require("react-i18next");
|
|
|
11
11
|
var _reactstrap = require("reactstrap");
|
|
12
12
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
13
13
|
var _menu = _interopRequireDefault(require("../../../plugins/image/menu"));
|
|
14
|
+
var _menu2 = _interopRequireDefault(require("../../../plugins/video/menu"));
|
|
14
15
|
var _tableMenu = _interopRequireDefault(require("../../../plugins/table/menu/table-menu"));
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
var
|
|
16
|
+
var _menu3 = _interopRequireDefault(require("../../../plugins/link/menu"));
|
|
17
|
+
var _menu4 = _interopRequireDefault(require("../../../plugins/code-block/menu"));
|
|
18
|
+
var _menu5 = _interopRequireDefault(require("../../../plugins/sdoc-link/menu"));
|
|
19
|
+
var _menu6 = _interopRequireDefault(require("../../../plugins/file-link/menu"));
|
|
20
|
+
var _menu7 = _interopRequireDefault(require("../../../plugins/seatable-column/menu"));
|
|
21
|
+
var _menu8 = _interopRequireDefault(require("../../../plugins/seatable-tables/menu"));
|
|
21
22
|
var _eventBus = _interopRequireDefault(require("../../../../utils/event-bus"));
|
|
22
23
|
require("./index.css");
|
|
23
24
|
const InsertToolbar = _ref => {
|
|
@@ -93,9 +94,9 @@ const InsertToolbar = _ref => {
|
|
|
93
94
|
style: {
|
|
94
95
|
maxHeight: window.innerHeight - bottom - 100
|
|
95
96
|
}
|
|
96
|
-
}, /*#__PURE__*/_react.default.createElement(_menu.default, props), /*#__PURE__*/_react.default.createElement(_tableMenu.default, props), /*#__PURE__*/_react.default.createElement(_menu2.default, props), /*#__PURE__*/_react.default.createElement(_menu3.default, props), /*#__PURE__*/_react.default.createElement("div", {
|
|
97
|
+
}, /*#__PURE__*/_react.default.createElement(_menu.default, props), /*#__PURE__*/_react.default.createElement(_tableMenu.default, props), /*#__PURE__*/_react.default.createElement(_menu2.default, props), /*#__PURE__*/_react.default.createElement(_menu3.default, props), /*#__PURE__*/_react.default.createElement(_menu4.default, props), /*#__PURE__*/_react.default.createElement("div", {
|
|
97
98
|
className: "sdoc-dropdown-menu-divider"
|
|
98
|
-
}), editor.columns && /*#__PURE__*/_react.default.createElement(
|
|
99
|
+
}), editor.columns && /*#__PURE__*/_react.default.createElement(_menu7.default, props), editor.tables && /*#__PURE__*/_react.default.createElement(_menu8.default, props), !editor.tables && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_menu5.default, props), /*#__PURE__*/_react.default.createElement(_menu6.default, props)))));
|
|
99
100
|
};
|
|
100
101
|
InsertToolbar.defaultProps = {
|
|
101
102
|
isRichEditor: true,
|
|
@@ -51,6 +51,19 @@ const QuickInsertBlockMenu = _ref => {
|
|
|
51
51
|
});
|
|
52
52
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
53
53
|
}, [editor, insertPosition]);
|
|
54
|
+
const onInsertVideoToggle = (0, _react.useCallback)(() => {
|
|
55
|
+
callback && callback();
|
|
56
|
+
const eventBus = _eventBus.default.getInstance();
|
|
57
|
+
if (insertPosition === _constants.INSERT_POSITION.CURRENT) {
|
|
58
|
+
_slate.Transforms.select(editor, editor.selection.focus);
|
|
59
|
+
}
|
|
60
|
+
eventBus.dispatch(_constants2.INTERNAL_EVENT.INSERT_ELEMENT, {
|
|
61
|
+
type: _constants.LOCAL_VIDEO,
|
|
62
|
+
insertPosition,
|
|
63
|
+
slateNode
|
|
64
|
+
});
|
|
65
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
66
|
+
}, [editor, insertPosition]);
|
|
54
67
|
const createTable = (0, _react.useCallback)(size => {
|
|
55
68
|
callback && callback();
|
|
56
69
|
const newInsertPosition = slateNode.type === _constants.ELEMENT_TYPE.LIST_ITEM ? _constants.INSERT_POSITION.AFTER : insertPosition;
|
|
@@ -114,6 +127,12 @@ const QuickInsertBlockMenu = _ref => {
|
|
|
114
127
|
});
|
|
115
128
|
return !!callout;
|
|
116
129
|
}, [editor]);
|
|
130
|
+
const isDisableVideo = (0, _react.useMemo)(() => {
|
|
131
|
+
const callout = (0, _core.getAboveBlockNode)(editor, {
|
|
132
|
+
match: n => [_constants.ELEMENT_TYPE.ORDERED_LIST, _constants.ELEMENT_TYPE.UNORDERED_LIST, _constants.ELEMENT_TYPE.CHECK_LIST_ITEM].includes(n.type)
|
|
133
|
+
});
|
|
134
|
+
return !!callout;
|
|
135
|
+
}, [editor]);
|
|
117
136
|
const onInsertBlockQuote = (0, _react.useCallback)(() => {
|
|
118
137
|
callback && callback();
|
|
119
138
|
(0, _helpers5.insertBlockQuote)(editor, false);
|
|
@@ -133,6 +152,14 @@ const QuickInsertBlockMenu = _ref => {
|
|
|
133
152
|
},
|
|
134
153
|
onClick: onInsertImageToggle
|
|
135
154
|
}),
|
|
155
|
+
[_constants.VIDEO]: /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
|
|
156
|
+
disabled: isDisableVideo,
|
|
157
|
+
key: "sdoc-insert-menu-video",
|
|
158
|
+
menuConfig: {
|
|
159
|
+
..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.VIDEO]
|
|
160
|
+
},
|
|
161
|
+
onClick: onInsertVideoToggle
|
|
162
|
+
}),
|
|
136
163
|
[_constants.TABLE]:
|
|
137
164
|
/*#__PURE__*/
|
|
138
165
|
// eslint-disable-next-line react/jsx-indent
|
|
@@ -231,7 +258,7 @@ const QuickInsertBlockMenu = _ref => {
|
|
|
231
258
|
});
|
|
232
259
|
});
|
|
233
260
|
return items;
|
|
234
|
-
}, [isDisableImage, onInsertImageToggle, editor, createTable, openLinkDialog, onInsertBlockQuote, onInsertCodeBlock, isDisableCallout, onInsertCheckList, isEmptyNode, onInsertCallout, onInsertList, onInsert, createMultiColumn]);
|
|
261
|
+
}, [isDisableImage, isDisableVideo, onInsertImageToggle, editor, createTable, openLinkDialog, onInsertBlockQuote, onInsertCodeBlock, isDisableCallout, onInsertCheckList, isEmptyNode, onInsertCallout, onInsertList, onInsert, createMultiColumn]);
|
|
235
262
|
const getSelectItemDom = selectIndex => {
|
|
236
263
|
const dropDownItemWrapper = downDownWrapperRef.current;
|
|
237
264
|
const currentSelectItem = dropDownItemWrapper.children[selectIndex];
|
|
@@ -131,10 +131,11 @@ exports.getTopValue = getTopValue;
|
|
|
131
131
|
const isVoidNode = node => {
|
|
132
132
|
if (!node) return true;
|
|
133
133
|
const hasImage = node.children.find(n => n.type === _constants.IMAGE);
|
|
134
|
+
const isVideoBlock = node.type === _constants.VIDEO_BLOCK;
|
|
134
135
|
const isTable = node.type === _constants.TABLE;
|
|
135
136
|
const isCodeBlock = node.type === _constants.CODE_BLOCK;
|
|
136
137
|
const isCallout = node.type === _constants.CALL_OUT;
|
|
137
|
-
return _slate.Node.string(node) === '' && !hasImage && !isTable && !isCodeBlock && !isCallout;
|
|
138
|
+
return _slate.Node.string(node) === '' && !hasImage && !isVideoBlock && !isTable && !isCodeBlock && !isCallout;
|
|
138
139
|
};
|
|
139
140
|
exports.isVoidNode = isVoidNode;
|
|
140
141
|
const isNotSupportTransform = node => {
|
|
@@ -48,6 +48,19 @@ const InsertBlockMenu = _ref => {
|
|
|
48
48
|
|
|
49
49
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
50
50
|
}, [editor, insertPosition]);
|
|
51
|
+
const onInsertVideoToggle = (0, _react.useCallback)(() => {
|
|
52
|
+
const eventBus = _eventBus.default.getInstance();
|
|
53
|
+
if (insertPosition === _constants.INSERT_POSITION.CURRENT) {
|
|
54
|
+
_slate.Transforms.select(editor, editor.selection.focus);
|
|
55
|
+
}
|
|
56
|
+
eventBus.dispatch(_constants2.INTERNAL_EVENT.INSERT_ELEMENT, {
|
|
57
|
+
type: _constants.LOCAL_VIDEO,
|
|
58
|
+
insertPosition,
|
|
59
|
+
slateNode
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
63
|
+
}, [editor, insertPosition]);
|
|
51
64
|
const createTable = (0, _react.useCallback)(size => {
|
|
52
65
|
const newInsertPosition = slateNode.type === _constants.ELEMENT_TYPE.LIST_ITEM ? _constants.INSERT_POSITION.AFTER : insertPosition;
|
|
53
66
|
(0, _helpers2.insertTable)(editor, size, editor.selection, newInsertPosition);
|
|
@@ -100,6 +113,12 @@ const InsertBlockMenu = _ref => {
|
|
|
100
113
|
..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.IMAGE]
|
|
101
114
|
},
|
|
102
115
|
onClick: onInsertImageToggle
|
|
116
|
+
}), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
|
|
117
|
+
isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.VIDEO],
|
|
118
|
+
menuConfig: {
|
|
119
|
+
..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.VIDEO]
|
|
120
|
+
},
|
|
121
|
+
onClick: onInsertVideoToggle
|
|
103
122
|
}), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
|
|
104
123
|
isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.TABLE],
|
|
105
124
|
menuConfig: {
|
|
@@ -120,7 +120,7 @@ class EventProxy {
|
|
|
120
120
|
});
|
|
121
121
|
(0, _defineProperty2.default)(this, "onCompositionEnd", event => {
|
|
122
122
|
const editor = this.editor;
|
|
123
|
-
if (editor.
|
|
123
|
+
if (editor.onCompositionEnd) {
|
|
124
124
|
const isHandled = editor.onCompositionEnd(event);
|
|
125
125
|
if (isHandled) return;
|
|
126
126
|
}
|
|
@@ -22,6 +22,7 @@ class Toast extends _react.default.PureComponent {
|
|
|
22
22
|
event.nativeEvent.stopImmediatePropagation();
|
|
23
23
|
event.stopPropagation();
|
|
24
24
|
}
|
|
25
|
+
console.log('close');
|
|
25
26
|
this.clearCloseTimer();
|
|
26
27
|
this.setState({
|
|
27
28
|
isShown: false
|
|
@@ -35,6 +36,7 @@ class Toast extends _react.default.PureComponent {
|
|
|
35
36
|
}
|
|
36
37
|
});
|
|
37
38
|
(0, _defineProperty2.default)(this, "clearCloseTimer", () => {
|
|
39
|
+
console.log('clearCloseTimer', this.closeTimer);
|
|
38
40
|
if (this.closeTimer) {
|
|
39
41
|
clearTimeout(this.closeTimer);
|
|
40
42
|
this.closeTimer = null;
|
|
@@ -65,9 +67,11 @@ class Toast extends _react.default.PureComponent {
|
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
69
|
componentDidMount() {
|
|
70
|
+
console.log('componentDidMount');
|
|
68
71
|
this.startCloseTimer();
|
|
69
72
|
}
|
|
70
73
|
componentWillUnmount() {
|
|
74
|
+
console.log('componentWillUnmount');
|
|
71
75
|
this.clearCloseTimer();
|
|
72
76
|
}
|
|
73
77
|
render() {
|
|
@@ -65,6 +65,7 @@ class Toaster {
|
|
|
65
65
|
if (!isBrowser) return;
|
|
66
66
|
const container = document.createElement('div');
|
|
67
67
|
container.setAttribute('data-evergreen-toaster-container', '');
|
|
68
|
+
console.log('src');
|
|
68
69
|
document.body.appendChild(container);
|
|
69
70
|
_reactDom.default.render( /*#__PURE__*/_react.default.createElement(_toastManager.default, {
|
|
70
71
|
bindNotify: this._bindNotify,
|
package/dist/context.js
CHANGED
|
@@ -42,6 +42,15 @@ class Context {
|
|
|
42
42
|
return relative_path;
|
|
43
43
|
});
|
|
44
44
|
});
|
|
45
|
+
(0, _defineProperty2.default)(this, "uploadLocalVideo", videoFiles => {
|
|
46
|
+
const docUuid = this.getSetting('docUuid');
|
|
47
|
+
return this.api.uploadSdocVideo(docUuid, videoFiles).then(res => {
|
|
48
|
+
const {
|
|
49
|
+
relative_path
|
|
50
|
+
} = res.data;
|
|
51
|
+
return relative_path;
|
|
52
|
+
});
|
|
53
|
+
});
|
|
45
54
|
this.settings = null;
|
|
46
55
|
this.sdocServerApi = null;
|
|
47
56
|
this.api = null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.141-alpha2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "This is a sdoc editor",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"@seafile/slate": "0.91.8",
|
|
11
11
|
"@seafile/slate-history": "0.86.2",
|
|
12
12
|
"@seafile/slate-hyperscript": "0.81.7",
|
|
13
|
-
"@seafile/slate-react": "0.92.
|
|
13
|
+
"@seafile/slate-react": "0.92.7",
|
|
14
14
|
"axios": "^1.7.4",
|
|
15
15
|
"classnames": "2.3.2",
|
|
16
16
|
"copy-to-clipboard": "^3.3.3",
|
|
Binary file
|
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
/>
|
|
15
15
|
<missing-glyph />
|
|
16
16
|
|
|
17
|
+
<glyph glyph-name="sdoc-play" unicode="" d="M512 896C230.4 896 0 665.6 0 384s230.4-512 512-512 512 230.4 512 512c0 134.4-54.4 265.6-150.4 361.6S646.4 896 512 896z m0-944c-236.8 0-432 192-432 432S275.2 816 512 816s432-192 432-432c0-115.2-44.8-224-124.8-304s-192-128-307.2-128z m185.6 457.6l-134.4 76.8-140.8 83.2c-9.6 3.2-19.2 3.2-25.6-3.2-6.4-6.4-12.8-16-9.6-25.6v-320c0-9.6 3.2-19.2 9.6-25.6s16-6.4 25.6-3.2l140.8 83.2 134.4 76.8c9.6 6.4 12.8 16 12.8 25.6s-6.4 28.8-12.8 32z" horiz-adv-x="1024" />
|
|
18
|
+
|
|
19
|
+
<glyph glyph-name="sdoc-video" unicode="" d="M969.6 832c28.8 0 54.4-25.6 54.4-57.6v-784c0-32-25.6-57.6-54.4-57.6H54.4C25.6-64 0-38.4 0-6.4V774.4C0 806.4 25.6 832 54.4 832h915.2zM928 736H96v-704h832V736zM348.8 608l380.8-227.2-380.8-227.2V608z" horiz-adv-x="1024" />
|
|
20
|
+
|
|
17
21
|
<glyph glyph-name="sdoc-mark-as-resolved" unicode="" d="M512 896c281.6 0 512-230.4 512-512s-230.4-512-512-512S0 102.4 0 384 230.4 896 512 896z m0-96C281.6 800 96 614.4 96 384s185.6-416 416-416 416 185.6 416 416S742.4 800 512 800z m272-243.2c19.2-22.4 16-54.4 0-70.4-6.4-6.4-64-70.4-124.8-134.4l-22.4-25.6c-57.6-64-115.2-121.6-124.8-134.4-22.4-25.6-44.8-35.2-70.4-35.2-25.6 0-44.8 9.6-64 28.8s-121.6 140.8-140.8 160-12.8 54.4 6.4 70.4 51.2 16 70.4-3.2c12.8-12.8 54.4-60.8 131.2-144 169.6 182.4 259.2 281.6 268.8 291.2 16 19.2 51.2 19.2 70.4-3.2z" horiz-adv-x="1024" />
|
|
18
22
|
|
|
19
23
|
<glyph glyph-name="sdoc-multi-column" unicode="" d="M236.8 864l160-416h-73.6l-38.4 105.6H112L73.6 448H0L160 864h76.8zM198.4 790.4L131.2 608h134.4L198.4 790.4zM0 352h448v-64H0v64z m0-128h448v-64H0v64z m0-128h448v-64H0v64z m0-128h320v-64H0v64zM768 864c41.6 0 73.6-9.6 96-28.8 22.4-19.2 32-44.8 32-73.6 0-22.4-6.4-41.6-16-60.8-12.8-16-28.8-28.8-48-35.2 28.8-6.4 48-16 60.8-32 12.8-16 19.2-38.4 19.2-67.2 0-41.6-16-73.6-41.6-92.8-25.6-16-57.6-25.6-102.4-25.6h-192V864h192z m-9.6-230.4h-115.2v-128h112c25.6 0 44.8 3.2 60.8 12.8 19.2 9.6 28.8 25.6 28.8 51.2 0 22.4-6.4 41.6-19.2 51.2-12.8 6.4-35.2 12.8-67.2 12.8z m-9.6 176h-105.6v-118.4h105.6c28.8 0 48 6.4 60.8 16 12.8 9.6 19.2 25.6 19.2 48 0 19.2-6.4 35.2-19.2 41.6-12.8 6.4-32 12.8-60.8 12.8zM576 352h448v-64H576v64z m0-128h448v-64H576v64z m0-128h448v-64H576v64z m0-128h320v-64H576v64z" horiz-adv-x="1024" />
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
@font-face {
|
|
2
|
-
font-family: "sdocfont";
|
|
3
|
-
|
|
4
|
-
src: url('./sdoc-editor-font/iconfont.eot?t=
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
url('./sdoc-editor-font/iconfont.woff?t=1729735524150') format('woff'),
|
|
10
|
-
url('./sdoc-editor-font/iconfont.ttf?t=1729735524150') format('truetype'),
|
|
11
|
-
url('./sdoc-editor-font/iconfont.svg?t=1729735524150#sdocfont') format('svg');
|
|
2
|
+
font-family: "sdocfont"; /* Project id 4097705 */
|
|
3
|
+
src: url('./sdoc-editor-font/iconfont.eot?t=1732000106128'); /* IE9 */
|
|
4
|
+
src: url('./sdoc-editor-font/iconfont.eot?t=1732000106128#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
|
5
|
+
url('./sdoc-editor-font/iconfont.woff2?t=1732000106128') format('woff2'),
|
|
6
|
+
url('./sdoc-editor-font/iconfont.woff?t=1732000106128') format('woff'),
|
|
7
|
+
url('./sdoc-editor-font/iconfont.ttf?t=1732000106128') format('truetype'),
|
|
8
|
+
url('./sdoc-editor-font/iconfont.svg?t=1732000106128#sdocfont') format('svg');
|
|
12
9
|
}
|
|
13
10
|
|
|
14
11
|
.sdocfont {
|
|
@@ -19,6 +16,14 @@
|
|
|
19
16
|
-moz-osx-font-smoothing: grayscale;
|
|
20
17
|
}
|
|
21
18
|
|
|
19
|
+
.sdoc-play:before {
|
|
20
|
+
content: "\e67c";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.sdoc-video:before {
|
|
24
|
+
content: "\e67b";
|
|
25
|
+
}
|
|
26
|
+
|
|
22
27
|
.sdoc-mark-as-resolved:before {
|
|
23
28
|
content: "\e67a";
|
|
24
29
|
}
|