@seafile/sdoc-editor 1.0.140 → 1.0.141-alpha3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/api/seafile-api.js +24 -0
  2. package/dist/basic-sdk/assets/css/sdoc-editor-plugins.css +4 -0
  3. package/dist/basic-sdk/comment/components/comment-item-collapse-wrapper.js +4 -4
  4. package/dist/basic-sdk/comment/components/comment-list.css +29 -23
  5. package/dist/basic-sdk/comment/components/global-comment/index.css +6 -6
  6. package/dist/basic-sdk/constants/index.js +2 -1
  7. package/dist/basic-sdk/editor/wiki-editor.js +3 -1
  8. package/dist/basic-sdk/extension/commons/insert-element-dialog/index.js +53 -0
  9. package/dist/basic-sdk/extension/constants/element-type.js +3 -1
  10. package/dist/basic-sdk/extension/constants/index.js +16 -3
  11. package/dist/basic-sdk/extension/constants/menus-config.js +12 -0
  12. package/dist/basic-sdk/extension/plugins/image/plugin.js +6 -0
  13. package/dist/basic-sdk/extension/plugins/image/render-elem.js +5 -0
  14. package/dist/basic-sdk/extension/plugins/index.js +8 -1
  15. package/dist/basic-sdk/extension/plugins/sdoc-link/helpers.js +2 -0
  16. package/dist/basic-sdk/extension/plugins/table/plugin.js +3 -0
  17. package/dist/basic-sdk/extension/plugins/video/helpers.js +144 -0
  18. package/dist/basic-sdk/extension/plugins/video/hover-menu/index.css +89 -0
  19. package/dist/basic-sdk/extension/plugins/video/hover-menu/index.js +84 -0
  20. package/dist/basic-sdk/extension/plugins/video/index.css +73 -0
  21. package/dist/basic-sdk/extension/plugins/video/index.js +20 -0
  22. package/dist/basic-sdk/extension/plugins/video/menu/index.js +55 -0
  23. package/dist/basic-sdk/extension/plugins/video/plugin.js +47 -0
  24. package/dist/basic-sdk/extension/plugins/video/render-elem.js +303 -0
  25. package/dist/basic-sdk/extension/render/custom-element.js +7 -0
  26. package/dist/basic-sdk/extension/render/render-comment-editor-element.js +7 -0
  27. package/dist/basic-sdk/extension/toolbar/header-toolbar/insert-toolbar/index.js +9 -8
  28. package/dist/basic-sdk/extension/toolbar/insert-element-toolbar/index.js +28 -1
  29. package/dist/basic-sdk/extension/toolbar/side-toolbar/helpers.js +2 -1
  30. package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-block-menu.js +19 -0
  31. package/dist/components/toast/toast.js +4 -0
  32. package/dist/components/toast/toaster.js +1 -0
  33. package/dist/context.js +9 -0
  34. package/package.json +1 -1
  35. package/public/media/sdoc-editor-font/iconfont.eot +0 -0
  36. package/public/media/sdoc-editor-font/iconfont.svg +4 -0
  37. package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
  38. package/public/media/sdoc-editor-font/iconfont.woff +0 -0
  39. package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
  40. package/public/media/sdoc-editor-font.css +15 -10
@@ -0,0 +1,303 @@
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("../../../../context"));
16
+ var _core = require("../../core");
17
+ var _useScrollContext = require("../../../hooks/use-scroll-context");
18
+ require("./index.css");
19
+ const Video = _ref => {
20
+ var _videoStates$element$, _data$videoFiles$, _data$videoFiles$2;
21
+ let {
22
+ element,
23
+ editor,
24
+ style,
25
+ className,
26
+ attributes,
27
+ children,
28
+ t
29
+ } = _ref;
30
+ const {
31
+ data
32
+ } = element;
33
+ // const readOnly = useReadOnly();
34
+ const videoRef = (0, _react.useRef)(null);
35
+ const [isLoaded, setIsLoaded] = (0, _react.useState)(false);
36
+ const [isShowVideoHoverMenu, setIsShowVideoHoverMenu] = (0, _react.useState)(false);
37
+ const [menuPosition, setMenuPosition] = (0, _react.useState)({});
38
+ const scrollRef = (0, _useScrollContext.useScrollContext)();
39
+ const [isSelected, setIsSelected] = (0, _react.useState)(false);
40
+ const [videoStates, setVideoStates] = (0, _react.useState)({});
41
+ // const [isPaused, setIsPaused] = useState(true);
42
+
43
+ const handlePlay = () => {
44
+ // setIsPaused(false);
45
+ setVideoStates(prev => ({
46
+ ...prev,
47
+ [element.id]: false
48
+ }));
49
+ };
50
+ const handlePause = () => {
51
+ // setIsPaused(true);
52
+ setVideoStates(prev => ({
53
+ ...prev,
54
+ [element.id]: true
55
+ }));
56
+ };
57
+ const isPaused = (_videoStates$element$ = videoStates[element.id]) !== null && _videoStates$element$ !== void 0 ? _videoStates$element$ : true;
58
+ const handleVideoLoad = () => {
59
+ // console.log(33);
60
+ setIsLoaded(true);
61
+ // setProgress(100);
62
+ };
63
+ const setPosition = (0, _react.useCallback)(() => {
64
+ if (videoRef.current) {
65
+ const {
66
+ top,
67
+ left
68
+ } = videoRef.current.getBoundingClientRect();
69
+ setMenuPosition({
70
+ top: top - 40,
71
+ left: left
72
+ });
73
+ }
74
+ }, []);
75
+ const onClickVideo = (0, _react.useCallback)(e => {
76
+ e.stopPropagation();
77
+ const path = _slateReact.ReactEditor.findPath(editor, element);
78
+ console.log(1, 2, (0, _core.getAboveBlockNode)(editor));
79
+ _slate.Transforms.select(editor, path);
80
+ setIsSelected(true);
81
+ console.log(4, isSelected, path);
82
+ setPosition();
83
+ setIsShowVideoHoverMenu(true);
84
+ const selection = editor.selection;
85
+ console.log(9, selection);
86
+ }, [element, setPosition]);
87
+ const onClickOutside = (0, _react.useCallback)(e => {
88
+ e.stopPropagation();
89
+ if (videoRef.current && !videoRef.current.contains(e.target)) {
90
+ setIsSelected(false);
91
+ console.log(3);
92
+ }
93
+ }, []);
94
+
95
+ // useEffect(() => {
96
+ // const { selection } = editor;
97
+ // if (selection) {
98
+ // const aboveNodeEntry = getAboveBlockNode(editor);
99
+ // if (aboveNodeEntry && aboveNodeEntry[0].type === VIDEO_BLOCK) {
100
+ // console.log(2 )
101
+ // setIsSelected(true);
102
+ // } else {
103
+ // console.log(4);
104
+ // setIsSelected(false);
105
+ // }
106
+ // }
107
+ // }, [editor.selection, element]);
108
+ // useEffect(() => {
109
+ // console.log('Backspace key pressed');
110
+ // const handleKeyDown = (e) => {
111
+ // if (e.key === 'Backspace') {
112
+ // console.log('22, Backspace key pressed');
113
+ // e.preventDefault();
114
+ // }
115
+ // };
116
+
117
+ // window.addEventListener('keydown', handleKeyDown);
118
+
119
+ // return () => {
120
+ // window.removeEventListener('keydown', handleKeyDown);
121
+ // };
122
+ // }, []);
123
+
124
+ const onHideVideoHoverMenu = (0, _react.useCallback)(e => {
125
+ if (e.target === videoRef.current) return;
126
+ setIsShowVideoHoverMenu(false);
127
+ }, []);
128
+ const registerEvent = (0, _react.useCallback)(eventList => {
129
+ eventList.forEach(element => {
130
+ document.addEventListener(element.eventName, element.event);
131
+ });
132
+ }, []);
133
+ const unregisterEvent = (0, _react.useCallback)(eventList => {
134
+ eventList.forEach(element => {
135
+ document.removeEventListener(element.eventName, element.event);
136
+ });
137
+ }, []);
138
+ const onScroll = (0, _react.useCallback)(() => {
139
+ setPosition();
140
+ // eslint-disable-next-line react-hooks/exhaustive-deps
141
+ }, []);
142
+ (0, _react.useEffect)(() => {
143
+ let observerRefValue = null;
144
+ if (isShowVideoHoverMenu) {
145
+ registerEvent([{
146
+ 'eventName': 'click',
147
+ 'event': onHideVideoHoverMenu
148
+ }]);
149
+ scrollRef.current && scrollRef.current.addEventListener('scroll', onScroll);
150
+ observerRefValue = scrollRef.current;
151
+ } else {
152
+ unregisterEvent([{
153
+ 'eventName': 'click',
154
+ 'event': onHideVideoHoverMenu
155
+ }]);
156
+ scrollRef.current && scrollRef.current.removeEventListener('scroll', onScroll);
157
+ }
158
+ return () => {
159
+ unregisterEvent([{
160
+ 'eventName': 'click',
161
+ 'event': onHideVideoHoverMenu
162
+ }]);
163
+ if (observerRefValue) {
164
+ observerRefValue.removeEventListener('scroll', onScroll);
165
+ }
166
+ };
167
+ // eslint-disable-next-line react-hooks/exhaustive-deps
168
+ }, [isShowVideoHoverMenu, onHideVideoHoverMenu]);
169
+ // console.log(0, data);
170
+ const videoFileName = data.videoFiles && ((_data$videoFiles$ = data.videoFiles[0]) === null || _data$videoFiles$ === void 0 ? void 0 : _data$videoFiles$.name) || null;
171
+ const videoFileSize = data.videoFiles && ((_data$videoFiles$2 = data.videoFiles[0]) === null || _data$videoFiles$2 === void 0 ? void 0 : _data$videoFiles$2.size) || null;
172
+ (0, _react.useEffect)(() => {
173
+ const videoElement = videoRef.current;
174
+ if (videoElement) {
175
+ // videoElement.addEventListener('timeupdate', handleProgress);
176
+ videoElement.addEventListener('onCanPlay', handleVideoLoad);
177
+ // console.log(99, videoElement);
178
+ }
179
+ document.addEventListener('click', onClickOutside);
180
+ return () => {
181
+ if (videoElement) {
182
+ // videoElement.removeEventListener('timeupdate', handleProgress);
183
+ videoElement.removeEventListener('onCanPlay', handleVideoLoad);
184
+ }
185
+ document.removeEventListener('click', onClickOutside);
186
+ };
187
+ }, []);
188
+ const formatFileSize = size => {
189
+ if (typeof size !== 'number') {
190
+ return '';
191
+ }
192
+ if (size >= 1000 * 1000 * 1000) {
193
+ return (size / (1000 * 1000 * 1000)).toFixed(1) + ' G';
194
+ }
195
+ if (size >= 1000 * 1000) {
196
+ return (size / (1000 * 1000)).toFixed(1) + ' M';
197
+ }
198
+ if (size >= 1000) {
199
+ return (size / 1000).toFixed(1) + ' K';
200
+ }
201
+ return size.toFixed(1) + ' B';
202
+ };
203
+ const videoFileIcon = () => {
204
+ const server = _context.default.getSetting('serviceUrl');
205
+ return `${server}/media/img/file/256/video.png`;
206
+ };
207
+ // console.log(100, isLoaded);
208
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !isLoaded && /*#__PURE__*/_react.default.createElement("div", {
209
+ className: "video-loading-placeholder"
210
+ }, /*#__PURE__*/_react.default.createElement("img", {
211
+ className: "video-file-icon",
212
+ src: videoFileIcon(),
213
+ alt: ""
214
+ }), /*#__PURE__*/_react.default.createElement("div", {
215
+ className: "video-file-info"
216
+ }, /*#__PURE__*/_react.default.createElement("div", null, videoFileName), /*#__PURE__*/_react.default.createElement("div", {
217
+ className: "file-size"
218
+ }, /*#__PURE__*/_react.default.createElement("span", null, formatFileSize(videoFileSize), " \u2014 "), /*#__PURE__*/_react.default.createElement("div", {
219
+ className: "loading-spinner"
220
+ }, /*#__PURE__*/_react.default.createElement("div", {
221
+ className: "spinner"
222
+ }))))), true && /*#__PURE__*/_react.default.createElement("div", Object.assign({
223
+ "data-id": element.id,
224
+ className: (0, _classnames.default)('sdoc-video-wrapper', className)
225
+ }, attributes, {
226
+ style: {
227
+ ...style,
228
+ display: isLoaded ? 'block' : 'none'
229
+ }
230
+ // contentEditable='false'
231
+ // suppressContentEditableWarning
232
+ }), /*#__PURE__*/_react.default.createElement("div", {
233
+ className: "sdoc-video-inner",
234
+ style: {
235
+ visibility: isLoaded ? 'visible' : 'hidden'
236
+ },
237
+ tabIndex: "-1"
238
+ // contentEditable='false'
239
+ // suppressContentEditableWarning
240
+ }, /*#__PURE__*/_react.default.createElement("video", {
241
+ className: "sdoc-video-element",
242
+ ref: videoRef,
243
+ src: (0, _helpers.getVideoURL)(data, editor),
244
+ controls: true
245
+ // style={getVideoStyle()}
246
+ ,
247
+ onClick: onClickVideo,
248
+ draggable: false,
249
+ onPlay: handlePlay,
250
+ onPause: handlePause
251
+ // width= '200px'
252
+ ,
253
+ onCanPlay: handleVideoLoad,
254
+ style: {
255
+ boxShadow: isSelected ? '0 0 0 2px #007bff' : 'none'
256
+ }
257
+ // contentEditable='false'
258
+ }), /*#__PURE__*/_react.default.createElement("div", {
259
+ className: "sdoc-video-play sdocfont sdoc-play icon-font",
260
+ style: {
261
+ visibility: isPaused ? 'visible' : 'hidden'
262
+ },
263
+ contentEditable: "false"
264
+ }))));
265
+ };
266
+ const SdocVideo = (0, _reactI18next.withTranslation)('sdoc-editor')(Video);
267
+ function renderVideoBlock(props, editor) {
268
+ const {
269
+ element,
270
+ children,
271
+ attributes
272
+ } = props;
273
+ console.log('children', element.type);
274
+ return /*#__PURE__*/_react.default.createElement("div", Object.assign({
275
+ className: "sdoc-video-block-wrapper"
276
+ }, attributes, {
277
+ contentEditable: "true",
278
+ suppressContentEditableWarning: true
279
+ }), /*#__PURE__*/_react.default.createElement("div", {
280
+ className: "sdoc-video-children-wrapper",
281
+ contentEditable: "false",
282
+ suppressContentEditableWarning: true,
283
+ style: {
284
+ userSelect: 'none',
285
+ pointerEvents: 'none'
286
+ }
287
+ }, children), /*#__PURE__*/_react.default.createElement(SdocVideo
288
+ // children={children}
289
+ , {
290
+ element: element,
291
+ editor: editor
292
+ // onSelect={(e) => {
293
+ // const selection = window.getSelection();
294
+ // if (selection && selection.anchorNode) {
295
+ // const isInsideVideo = videoRef.current?.contains(selection.anchorNode);
296
+ // if (isInsideVideo) {
297
+ // e.preventDefault();
298
+ // }
299
+ // }
300
+ // }}
301
+ // style={{ pointerEvents: 'none' }}
302
+ }));
303
+ }
@@ -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 _menu2 = _interopRequireDefault(require("../../../plugins/link/menu"));
16
- var _menu3 = _interopRequireDefault(require("../../../plugins/code-block/menu"));
17
- var _menu4 = _interopRequireDefault(require("../../../plugins/sdoc-link/menu"));
18
- var _menu5 = _interopRequireDefault(require("../../../plugins/file-link/menu"));
19
- var _menu6 = _interopRequireDefault(require("../../../plugins/seatable-column/menu"));
20
- var _menu7 = _interopRequireDefault(require("../../../plugins/seatable-tables/menu"));
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(_menu6.default, props), editor.tables && /*#__PURE__*/_react.default.createElement(_menu7.default, props), !editor.tables && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_menu4.default, props), /*#__PURE__*/_react.default.createElement(_menu5.default, props)))));
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: {
@@ -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.140",
3
+ "version": "1.0.141-alpha3",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",
@@ -14,6 +14,10 @@
14
14
  />
15
15
  <missing-glyph />
16
16
 
17
+ <glyph glyph-name="sdoc-play" unicode="&#59004;" 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="&#59003;" 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="&#59002;" 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="&#59001;" 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" />
@@ -1,14 +1,11 @@
1
1
  @font-face {
2
- font-family: "sdocfont";
3
- /* Project id 4097705 */
4
- src: url('./sdoc-editor-font/iconfont.eot?t=1729735524150');
5
- /* IE9 */
6
- src: url('./sdoc-editor-font/iconfont.eot?t=1729735524150#iefix') format('embedded-opentype'),
7
- /* IE6-IE8 */
8
- url('./sdoc-editor-font/iconfont.woff2?t=1729735524150') format('woff2'),
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
  }