@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.
Files changed (42) 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/paragraph/render-elem.js +3 -3
  16. package/dist/basic-sdk/extension/plugins/sdoc-link/helpers.js +2 -0
  17. package/dist/basic-sdk/extension/plugins/table/plugin.js +3 -0
  18. package/dist/basic-sdk/extension/plugins/video/helpers.js +144 -0
  19. package/dist/basic-sdk/extension/plugins/video/hover-menu/index.css +89 -0
  20. package/dist/basic-sdk/extension/plugins/video/hover-menu/index.js +84 -0
  21. package/dist/basic-sdk/extension/plugins/video/index.css +73 -0
  22. package/dist/basic-sdk/extension/plugins/video/index.js +20 -0
  23. package/dist/basic-sdk/extension/plugins/video/menu/index.js +55 -0
  24. package/dist/basic-sdk/extension/plugins/video/plugin.js +47 -0
  25. package/dist/basic-sdk/extension/plugins/video/render-elem.js +305 -0
  26. package/dist/basic-sdk/extension/render/custom-element.js +8 -1
  27. package/dist/basic-sdk/extension/render/render-comment-editor-element.js +7 -0
  28. package/dist/basic-sdk/extension/toolbar/header-toolbar/insert-toolbar/index.js +9 -8
  29. package/dist/basic-sdk/extension/toolbar/insert-element-toolbar/index.js +28 -1
  30. package/dist/basic-sdk/extension/toolbar/side-toolbar/helpers.js +2 -1
  31. package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-block-menu.js +19 -0
  32. package/dist/basic-sdk/utils/event-handler.js +1 -1
  33. package/dist/components/toast/toast.js +4 -0
  34. package/dist/components/toast/toaster.js +1 -0
  35. package/dist/context.js +9 -0
  36. package/package.json +2 -2
  37. package/public/media/sdoc-editor-font/iconfont.eot +0 -0
  38. package/public/media/sdoc-editor-font/iconfont.svg +4 -0
  39. package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
  40. package/public/media/sdoc-editor-font/iconfont.woff +0 -0
  41. package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
  42. 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 _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: {
@@ -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.onCompositionUpdate) {
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.139",
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.6",
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",
@@ -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
  }