@seafile/sdoc-editor 1.0.146-alpha.1 → 1.0.147

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 +17 -0
  2. package/dist/basic-sdk/assets/css/sdoc-editor-plugins.css +4 -0
  3. package/dist/basic-sdk/constants/index.js +2 -1
  4. package/dist/basic-sdk/extension/commons/insert-element-dialog/index.js +49 -0
  5. package/dist/basic-sdk/extension/constants/element-type.js +2 -1
  6. package/dist/basic-sdk/extension/constants/index.js +10 -3
  7. package/dist/basic-sdk/extension/constants/menus-config.js +12 -0
  8. package/dist/basic-sdk/extension/plugins/index.js +8 -1
  9. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/filters-list.css +0 -1
  10. package/dist/basic-sdk/extension/plugins/video/constants/index.js +10 -0
  11. package/dist/basic-sdk/extension/plugins/video/helpers.js +152 -0
  12. package/dist/basic-sdk/extension/plugins/video/index.css +72 -0
  13. package/dist/basic-sdk/extension/plugins/video/index.js +20 -0
  14. package/dist/basic-sdk/extension/plugins/video/menu/index.js +53 -0
  15. package/dist/basic-sdk/extension/plugins/video/plugin.js +28 -0
  16. package/dist/basic-sdk/extension/plugins/video/render-elem.js +140 -0
  17. package/dist/basic-sdk/extension/render/custom-element.js +7 -0
  18. package/dist/basic-sdk/extension/render/render-comment-editor-element.js +7 -0
  19. package/dist/basic-sdk/extension/toolbar/header-toolbar/insert-toolbar/index.js +9 -8
  20. package/dist/basic-sdk/extension/toolbar/insert-element-toolbar/index.js +28 -1
  21. package/dist/basic-sdk/extension/toolbar/side-toolbar/helpers.js +2 -1
  22. package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-block-menu.js +18 -0
  23. package/dist/context.js +9 -0
  24. package/package.json +1 -1
  25. package/public/locales/cs/sdoc-editor.json +4 -1
  26. package/public/locales/de/sdoc-editor.json +5 -2
  27. package/public/locales/en/sdoc-editor.json +4 -1
  28. package/public/locales/es/sdoc-editor.json +4 -1
  29. package/public/locales/es_AR/sdoc-editor.json +4 -1
  30. package/public/locales/es_MX/sdoc-editor.json +4 -1
  31. package/public/locales/fr/sdoc-editor.json +4 -1
  32. package/public/locales/it/sdoc-editor.json +4 -1
  33. package/public/locales/ru/sdoc-editor.json +4 -1
  34. package/public/locales/zh_CN/sdoc-editor.json +4 -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
@@ -55,6 +55,23 @@ class SeafileAPI {
55
55
  const url = '/api/v2.1/seadoc/download-image/' + docUuid + '/' + encodeURIComponent(imageName);
56
56
  return this.req.get(url);
57
57
  }
58
+ getVideoFileNameWithUuid(file) {
59
+ return 'video-' + _slugid.default.nice() + file.name.slice(file.name.lastIndexOf('.'));
60
+ }
61
+ uploadSdocVideo(docUuid, videoFiles) {
62
+ const url = '/api/v2.1/seadoc/upload-video/' + docUuid + '/';
63
+ const form = new FormData();
64
+ for (const fileItem of videoFiles) {
65
+ if (fileItem.type.startsWith('video/')) {
66
+ const fileName = this.getVideoFileNameWithUuid(fileItem);
67
+ const file = new File([fileItem], fileName, {
68
+ type: fileItem.type
69
+ });
70
+ form.append('file', file);
71
+ }
72
+ }
73
+ return this.req.post(url, form);
74
+ }
58
75
 
59
76
  // revision
60
77
  startRevise(repoID, fileUuid, path) {
@@ -154,6 +154,10 @@
154
154
  padding: 8px 0;
155
155
  }
156
156
 
157
+ .sdoc-insert-video-menu-popover-container {
158
+ padding: 8px 0;
159
+ }
160
+
157
161
  /* caret */
158
162
  .sdoc-editor__article .caret-item .caret-name::before {
159
163
  content: attr(name);
@@ -46,7 +46,8 @@ const INTERNAL_EVENT = exports.INTERNAL_EVENT = {
46
46
  ON_PRINT: 'on_print',
47
47
  COMMENT_EDITOR_POST_COMMENT: 'comment_editor_post_comment',
48
48
  CLOSE_FILE_INSET_DIALOG: 'close_file_insert_dialog',
49
- RESIZE_ARTICLE: 'resize_article'
49
+ RESIZE_ARTICLE: 'resize_article',
50
+ ON_VIDEO_FILES_UPLOADED: 'on_video_files_uploaded'
50
51
  };
51
52
  const REVISION_DIFF_KEY = exports.REVISION_DIFF_KEY = 'diff';
52
53
  const REVISION_DIFF_VALUE = exports.REVISION_DIFF_VALUE = '1';
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
+ var _reactI18next = require("react-i18next");
10
11
  var _dialogs = require("../../plugins/table/dialogs");
11
12
  var _addLinkDialog = _interopRequireDefault(require("../../plugins/link/dialog/add-link-dialog"));
12
13
  var _index = _interopRequireDefault(require("../select-file-dialog/index.js"));
@@ -14,8 +15,11 @@ var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
14
15
  var _constants = require("../../../constants");
15
16
  var _constants2 = require("../../constants");
16
17
  var _helpers = require("../../plugins/image/helpers");
18
+ var _helpers2 = require("../../plugins/video/helpers");
17
19
  var _context = _interopRequireDefault(require("../../../../context.js"));
18
20
  var _index2 = _interopRequireDefault(require("../file-insert-dialog/index.js"));
21
+ var _index3 = _interopRequireDefault(require("../../../../components/toast/index.js"));
22
+ var _index4 = require("../../plugins/video/constants/index.js");
19
23
  const InsertElementDialog = _ref => {
20
24
  let {
21
25
  editor
@@ -28,7 +32,11 @@ const InsertElementDialog = _ref => {
28
32
  const [validEditor, setValidEditor] = (0, _react.useState)(editor);
29
33
  const [linkTitle, setLinkTitle] = (0, _react.useState)('');
30
34
  const [handleSubmit, setHandleSubmit] = (0, _react.useState)(() => void 0);
35
+ const {
36
+ t
37
+ } = (0, _reactI18next.useTranslation)();
31
38
  const uploadLocalImageInputRef = (0, _react.useRef)();
39
+ const uploadLocalVideoInputRef = (0, _react.useRef)();
32
40
  const onFileChanged = (0, _react.useCallback)(event => {
33
41
  const files = event.target.files;
34
42
  _context.default.uploadLocalImage(files).then(fileUrl => {
@@ -39,6 +47,29 @@ const InsertElementDialog = _ref => {
39
47
  });
40
48
  // eslint-disable-next-line react-hooks/exhaustive-deps
41
49
  }, [validEditor, uploadLocalImageInputRef, insertPosition, slateNode]);
50
+ const handleDisplayAlert = (0, _react.useCallback)(() => {
51
+ setTimeout(() => {
52
+ _index3.default.warning(`${t('The_current_version_does_not_support_>5MB_video_file')}`, {
53
+ duration: 3
54
+ });
55
+ }, 0);
56
+ }, []);
57
+ const onVideoFileChanged = (0, _react.useCallback)(event => {
58
+ const files = event.target.files;
59
+ // Show warning for 3s and no further insertion if video file is more than 5MB
60
+ if (files[0].size > _index4.VIDEO_MAX_SIZE_5MB) {
61
+ handleDisplayAlert();
62
+ event.target.value = null;
63
+ return;
64
+ }
65
+ _context.default.uploadLocalVideo(files).then(fileUrl => {
66
+ (0, _helpers2.insertVideo)(validEditor, files, fileUrl, validEditor.selection, insertPosition);
67
+ if (uploadLocalVideoInputRef.current) {
68
+ uploadLocalVideoInputRef.current.value = '';
69
+ }
70
+ });
71
+ // eslint-disable-next-line react-hooks/exhaustive-deps
72
+ }, [validEditor, uploadLocalImageInputRef, insertPosition, slateNode]);
42
73
  (0, _react.useEffect)(() => {
43
74
  const eventBus = _eventBus.default.getInstance();
44
75
  const toggleDialogSubscribe = eventBus.subscribe(_constants.INTERNAL_EVENT.INSERT_ELEMENT, toggleDialog);
@@ -77,6 +108,11 @@ const InsertElementDialog = _ref => {
77
108
  uploadLocalImageInputRef.current && uploadLocalImageInputRef.current.click();
78
109
  }, 0);
79
110
  }
111
+ if (type === _constants2.LOCAL_VIDEO) {
112
+ setTimeout(() => {
113
+ uploadLocalVideoInputRef.current && uploadLocalVideoInputRef.current.click();
114
+ }, 0);
115
+ }
80
116
  }, [editor]);
81
117
  const closeDialog = (0, _react.useCallback)(() => {
82
118
  setInsertPosition(_constants2.INSERT_POSITION.CURRENT);
@@ -143,6 +179,19 @@ const InsertElementDialog = _ref => {
143
179
  onChange: onFileChanged
144
180
  });
145
181
  }
182
+ case _constants2.LOCAL_VIDEO:
183
+ {
184
+ return /*#__PURE__*/_react.default.createElement("input", {
185
+ onClick: e => e.stopPropagation(),
186
+ ref: uploadLocalVideoInputRef,
187
+ type: "file",
188
+ accept: "video/*",
189
+ style: {
190
+ display: 'none'
191
+ },
192
+ onChange: onVideoFileChanged
193
+ });
194
+ }
146
195
  case _constants2.ELEMENT_TYPE.FILE_LINK_INSET_INPUT_TEMP:
147
196
  {
148
197
  return /*#__PURE__*/_react.default.createElement(_index2.default, {
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WIKI_LINK = exports.UNORDERED_LIST = exports.TWO_COLUMN = exports.TOP_LEVEL_TYPES = exports.TITLE = exports.THREE_COLUMN = exports.TABLE_ROW = exports.TABLE_CELL = exports.TABLE = exports.SUBTITLE = exports.SEATABLE_TABLE = exports.SEATABLE_COLUMN = exports.SDOC_LINK = exports.QUICK_INSERT = exports.PARAGRAPH = exports.ORDERED_LIST = exports.MULTI_COLUMN = exports.MENTION_TEMP = exports.MENTION = exports.LIST_ITEM = exports.LINK = exports.INLINE_LEVEL_TYPES = exports.IMAGE_BLOCK = exports.IMAGE = exports.HEADER6 = exports.HEADER5 = exports.HEADER4 = exports.HEADER3 = exports.HEADER2 = exports.HEADER1 = exports.HEADER = exports.FOUR_COLUMN = exports.FONT_SIZE_REDUCE = exports.FONT_SIZE_INCREASE = exports.FONT_SIZE = exports.FIVE_COLUMN = exports.FILE_LINK_INSET_INPUT_TEMP = exports.FILE_LINK = exports.COLUMN = exports.CODE_LINE = exports.CODE_BLOCK = exports.CHECK_LIST_ITEM = exports.CALL_OUT = exports.BLOCKQUOTE = void 0;
6
+ exports.WIKI_LINK = exports.VIDEO = exports.UNORDERED_LIST = exports.TWO_COLUMN = exports.TOP_LEVEL_TYPES = exports.TITLE = exports.THREE_COLUMN = exports.TABLE_ROW = exports.TABLE_CELL = exports.TABLE = exports.SUBTITLE = exports.SEATABLE_TABLE = exports.SEATABLE_COLUMN = exports.SDOC_LINK = exports.QUICK_INSERT = exports.PARAGRAPH = exports.ORDERED_LIST = exports.MULTI_COLUMN = exports.MENTION_TEMP = exports.MENTION = exports.LIST_ITEM = exports.LINK = exports.INLINE_LEVEL_TYPES = exports.IMAGE_BLOCK = exports.IMAGE = exports.HEADER6 = exports.HEADER5 = exports.HEADER4 = exports.HEADER3 = exports.HEADER2 = exports.HEADER1 = exports.HEADER = exports.FOUR_COLUMN = exports.FONT_SIZE_REDUCE = exports.FONT_SIZE_INCREASE = exports.FONT_SIZE = exports.FIVE_COLUMN = exports.FILE_LINK_INSET_INPUT_TEMP = exports.FILE_LINK = exports.COLUMN = exports.CODE_LINE = exports.CODE_BLOCK = exports.CHECK_LIST_ITEM = exports.CALL_OUT = exports.BLOCKQUOTE = void 0;
7
7
  const BLOCKQUOTE = exports.BLOCKQUOTE = 'blockquote';
8
8
  const TITLE = exports.TITLE = 'title';
9
9
  const SUBTITLE = exports.SUBTITLE = 'subtitle';
@@ -36,6 +36,7 @@ const WIKI_LINK = exports.WIKI_LINK = 'wiki_link';
36
36
  const FILE_LINK = exports.FILE_LINK = 'file_link';
37
37
  const IMAGE = exports.IMAGE = 'image';
38
38
  const IMAGE_BLOCK = exports.IMAGE_BLOCK = 'image_block';
39
+ const VIDEO = exports.VIDEO = 'video';
39
40
  const CALL_OUT = exports.CALL_OUT = 'callout';
40
41
  const MENTION = exports.MENTION = 'mention';
41
42
  const MENTION_TEMP = exports.MENTION_TEMP = 'mention_temp';
@@ -238,7 +238,7 @@ Object.defineProperty(exports, "LIST_ITEM", {
238
238
  return _elementType.LIST_ITEM;
239
239
  }
240
240
  });
241
- exports.LOCAL_IMAGE = exports.LIST_TYPE_ARRAY = exports.LIST_ITEM_SUPPORTED_TRANSFORMATION = exports.LIST_ITEM_CORRELATION_TYPE = void 0;
241
+ exports.LOCAL_VIDEO = exports.LOCAL_IMAGE = exports.LIST_TYPE_ARRAY = exports.LIST_ITEM_SUPPORTED_TRANSFORMATION = exports.LIST_ITEM_CORRELATION_TYPE = void 0;
242
242
  Object.defineProperty(exports, "MAC_HOTKEYS", {
243
243
  enumerable: true,
244
244
  get: function () {
@@ -466,6 +466,12 @@ Object.defineProperty(exports, "UNORDERED_LIST", {
466
466
  return _elementType.UNORDERED_LIST;
467
467
  }
468
468
  });
469
+ Object.defineProperty(exports, "VIDEO", {
470
+ enumerable: true,
471
+ get: function () {
472
+ return _elementType.VIDEO;
473
+ }
474
+ });
469
475
  Object.defineProperty(exports, "WIN_HOTKEYS", {
470
476
  enumerable: true,
471
477
  get: function () {
@@ -507,6 +513,7 @@ const INSERT_POSITION = exports.INSERT_POSITION = {
507
513
  AFTER: 'after'
508
514
  };
509
515
  const LOCAL_IMAGE = exports.LOCAL_IMAGE = 'local-image';
516
+ const LOCAL_VIDEO = exports.LOCAL_VIDEO = 'local-video';
510
517
  const LIST_TYPE_ARRAY = exports.LIST_TYPE_ARRAY = [_elementType.UNORDERED_LIST, _elementType.ORDERED_LIST];
511
518
  const LIST_ITEM_CORRELATION_TYPE = exports.LIST_ITEM_CORRELATION_TYPE = [_elementType.UNORDERED_LIST, _elementType.ORDERED_LIST, _elementType.LIST_ITEM];
512
519
  const LIST_ITEM_SUPPORTED_TRANSFORMATION = exports.LIST_ITEM_SUPPORTED_TRANSFORMATION = [_elementType.UNORDERED_LIST, _elementType.ORDERED_LIST, 'left', 'center', 'right', _elementType.BLOCKQUOTE];
@@ -515,7 +522,7 @@ const FILE_TYPE = exports.FILE_TYPE = {
515
522
  [_elementType.FILE_LINK]: 'file',
516
523
  [_elementType.SDOC_LINK]: 'sdoc'
517
524
  };
518
- const SUPPORTED_SIDE_OPERATION_TYPE = exports.SUPPORTED_SIDE_OPERATION_TYPE = [_elementType.PARAGRAPH, _elementType.SUBTITLE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CHECK_LIST_ITEM, _elementType.CODE_BLOCK, _elementType.TABLE, _elementType.BLOCKQUOTE, _elementType.CALL_OUT, _elementType.IMAGE_BLOCK, _elementType.SEATABLE_COLUMN];
525
+ const SUPPORTED_SIDE_OPERATION_TYPE = exports.SUPPORTED_SIDE_OPERATION_TYPE = [_elementType.PARAGRAPH, _elementType.SUBTITLE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CHECK_LIST_ITEM, _elementType.CODE_BLOCK, _elementType.TABLE, _elementType.BLOCKQUOTE, _elementType.CALL_OUT, _elementType.IMAGE_BLOCK, _elementType.VIDEO, _elementType.SEATABLE_COLUMN];
519
526
  const MOUSE_ENTER_EVENT_DISABLED_MAP = exports.MOUSE_ENTER_EVENT_DISABLED_MAP = {
520
527
  [_elementType.PARAGRAPH]: [_elementType.CALL_OUT],
521
528
  [_elementType.TITLE]: [_elementType.CALL_OUT],
@@ -533,4 +540,4 @@ const MOUSE_ENTER_EVENT_DISABLED_MAP = exports.MOUSE_ENTER_EVENT_DISABLED_MAP =
533
540
  [_elementType.HEADER6]: [_elementType.CALL_OUT],
534
541
  [_elementType.CALL_OUT]: [_elementType.CALL_OUT]
535
542
  };
536
- const ROOT_ELEMENT_TYPES = exports.ROOT_ELEMENT_TYPES = [_elementType.PARAGRAPH, _elementType.TITLE, _elementType.SUBTITLE, _elementType.CHECK_LIST_ITEM, _elementType.ORDERED_LIST, _elementType.UNORDERED_LIST, _elementType.BLOCKQUOTE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CALL_OUT, _elementType.TABLE, _elementType.CODE_BLOCK, _elementType.IMAGE_BLOCK];
543
+ const ROOT_ELEMENT_TYPES = exports.ROOT_ELEMENT_TYPES = [_elementType.PARAGRAPH, _elementType.TITLE, _elementType.SUBTITLE, _elementType.CHECK_LIST_ITEM, _elementType.ORDERED_LIST, _elementType.UNORDERED_LIST, _elementType.BLOCKQUOTE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CALL_OUT, _elementType.TABLE, _elementType.CODE_BLOCK, _elementType.IMAGE_BLOCK, _elementType.VIDEO];
@@ -88,6 +88,11 @@ const MENUS_CONFIG_MAP = exports.MENUS_CONFIG_MAP = {
88
88
  iconClass: 'sdocfont sdoc-image',
89
89
  text: 'Image'
90
90
  },
91
+ [_elementType.VIDEO]: {
92
+ id: `sdoc_${_elementType.VIDEO}`,
93
+ iconClass: 'sdocfont sdoc-video',
94
+ text: 'Video'
95
+ },
91
96
  [_elementType.TABLE]: {
92
97
  id: `sdoc_${_elementType.TABLE}`,
93
98
  iconClass: 'sdocfont sdoc-table',
@@ -308,6 +313,12 @@ const SIDE_INSERT_MENUS_CONFIG = exports.SIDE_INSERT_MENUS_CONFIG = {
308
313
  type: _elementType.IMAGE,
309
314
  text: 'Image'
310
315
  },
316
+ [_elementType.VIDEO]: {
317
+ id: '',
318
+ iconClass: 'sdocfont sdoc-video',
319
+ type: _elementType.VIDEO,
320
+ text: 'Video'
321
+ },
311
322
  [_elementType.TABLE]: {
312
323
  id: 'sdoc-side-menu-item-table',
313
324
  iconClass: 'sdocfont sdoc-table',
@@ -401,6 +412,7 @@ const SIDE_INSERT_MENUS_CONFIG = exports.SIDE_INSERT_MENUS_CONFIG = {
401
412
  };
402
413
  const SIDE_INSERT_MENUS_SEARCH_MAP = exports.SIDE_INSERT_MENUS_SEARCH_MAP = {
403
414
  [_elementType.IMAGE]: 'Image',
415
+ [_elementType.VIDEO]: 'Video',
404
416
  [_elementType.TABLE]: 'Table',
405
417
  [_elementType.MULTI_COLUMN]: 'Multi_column',
406
418
  [_elementType.COLUMN]: 'Column',
@@ -143,6 +143,12 @@ Object.defineProperty(exports, "TextPlugin", {
143
143
  return _textStyle.default;
144
144
  }
145
145
  });
146
+ Object.defineProperty(exports, "VideoPlugin", {
147
+ enumerable: true,
148
+ get: function () {
149
+ return _video.default;
150
+ }
151
+ });
146
152
  Object.defineProperty(exports, "WikiLinkPlugin", {
147
153
  enumerable: true,
148
154
  get: function () {
@@ -159,6 +165,7 @@ var _checkList = _interopRequireDefault(require("./check-list"));
159
165
  var _textStyle = _interopRequireDefault(require("./text-style"));
160
166
  var _codeBlock = _interopRequireDefault(require("./code-block"));
161
167
  var _image = _interopRequireDefault(require("./image"));
168
+ var _video = _interopRequireDefault(require("./video"));
162
169
  var _table = _interopRequireDefault(require("./table"));
163
170
  var _multiColumn = _interopRequireDefault(require("./multi-column"));
164
171
  var _html = _interopRequireDefault(require("./html"));
@@ -174,7 +181,7 @@ var _quickInsert = _interopRequireDefault(require("./quick-insert"));
174
181
  var _wikiLink = _interopRequireDefault(require("./wiki-link"));
175
182
  var _seatableColumn = _interopRequireDefault(require("./seatable-column"));
176
183
  var _seatableTables = _interopRequireDefault(require("./seatable-tables"));
177
- const Plugins = [_markdown.default, _html.default, _header.default, _link.default, _blockquote.default, _list.default, _checkList.default, _codeBlock.default, _image.default, _table.default, _multiColumn.default, _textStyle.default, _textAlign.default, _font.default, _sdocLink.default, _paragraph.default, _fileLink.default, _callout.default, _searchReplace.default, _quickInsert.default];
184
+ const Plugins = [_markdown.default, _html.default, _header.default, _link.default, _blockquote.default, _list.default, _checkList.default, _codeBlock.default, _image.default, _video.default, _table.default, _multiColumn.default, _textStyle.default, _textAlign.default, _font.default, _sdocLink.default, _paragraph.default, _fileLink.default, _callout.default, _searchReplace.default, _quickInsert.default];
178
185
  const WikiPlugins = exports.WikiPlugins = [...Plugins, _wikiLink.default];
179
186
  const CommentPlugins = exports.CommentPlugins = [_markdown.default, _html.default, _paragraph.default, _textStyle.default, _list.default, _image.default, _link.default, _mention.default, _blockquote.default];
180
187
  var _default = exports.default = Plugins;
@@ -2,7 +2,6 @@
2
2
  min-height: 120px;
3
3
  max-height: 100%;
4
4
  padding: 15px;
5
- overflow: unset !important;
6
5
  }
7
6
 
8
7
  .filters-list.empty-filters-container {
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.VIDEO_MAX_SIZE_5MB = exports.ONE_MB = exports.ONE_KB = exports.ONE_GB = void 0;
7
+ const VIDEO_MAX_SIZE_5MB = exports.VIDEO_MAX_SIZE_5MB = 5 * 1024 * 1024;
8
+ const ONE_GB = exports.ONE_GB = 1000 * 1000 * 1000;
9
+ const ONE_MB = exports.ONE_MB = 1000 * 1000;
10
+ const ONE_KB = exports.ONE_KB = 1000;
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.videoFileIcon = exports.isInsertVideoMenuDisabled = exports.insertVideo = exports.getVideoURL = exports.generateVideoNode = exports.formatFileSize = void 0;
8
+ var _urlJoin = _interopRequireDefault(require("url-join"));
9
+ var _slate = require("@seafile/slate");
10
+ var _core = require("../../core");
11
+ var _constants = require("../../constants");
12
+ var _context = _interopRequireDefault(require("../../../../context"));
13
+ var _constants2 = require("./constants");
14
+ const isInsertVideoMenuDisabled = (editor, readonly) => {
15
+ if (readonly) return true;
16
+ const {
17
+ selection
18
+ } = editor;
19
+ if (selection === null) return true;
20
+ if (!_slate.Range.isCollapsed(selection)) return true;
21
+ const [match] = _slate.Editor.nodes(editor, {
22
+ match: n => {
23
+ let type = (0, _core.getNodeType)(n);
24
+ if (!type && (0, _core.isTextNode)(n) && n.id) {
25
+ const parentNode = (0, _core.getParentNode)(editor.children, n.id);
26
+ type = (0, _core.getNodeType)(parentNode);
27
+ }
28
+ if (type === _constants.CODE_BLOCK) return true;
29
+ if (type.startsWith('header')) return true;
30
+ if (type === _constants.TITLE) return true;
31
+ if (type === _constants.SUBTITLE) return true;
32
+ if (type === _constants.LIST_ITEM) return true;
33
+ if (type === _constants.CHECK_LIST_ITEM) return true;
34
+ if (_slate.Editor.isVoid(editor, n)) return true;
35
+ return false;
36
+ },
37
+ universal: true
38
+ });
39
+ if (match) return true;
40
+ return false;
41
+ };
42
+ exports.isInsertVideoMenuDisabled = isInsertVideoMenuDisabled;
43
+ const generateVideoNode = (src, videoFiles) => {
44
+ const element = (0, _core.generateEmptyElement)(_constants.VIDEO);
45
+ return {
46
+ ...element,
47
+ data: {
48
+ src,
49
+ videoFiles
50
+ }
51
+ };
52
+ };
53
+ exports.generateVideoNode = generateVideoNode;
54
+ const insertVideo = function (editor, videoFiles, srcList, selection) {
55
+ let position = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _constants.INSERT_POSITION.CURRENT;
56
+ if (!srcList) return;
57
+ if (position !== _constants.INSERT_POSITION.AFTER) {
58
+ if (isInsertVideoMenuDisabled(editor)) return;
59
+ }
60
+ const videoNodes = srcList.map(src => {
61
+ return generateVideoNode(src, videoFiles);
62
+ });
63
+ const validSelection = selection || editor.selection;
64
+ let path = _slate.Editor.path(editor, validSelection);
65
+ if (position === _constants.INSERT_POSITION.AFTER) {
66
+ const p = (0, _core.generateEmptyElement)(_constants.ELEMENT_TYPE.PARAGRAPH);
67
+ videoNodes.forEach((item, index) => {
68
+ p.children[index] = item;
69
+ });
70
+ _slate.Transforms.insertNodes(editor, p, {
71
+ at: [path[0] + 1]
72
+ });
73
+ (0, _core.focusEditor)(editor, [path[0] + 1, 2]);
74
+ return;
75
+ }
76
+ const aboveNodeEntry = (0, _core.getAboveBlockNode)(editor);
77
+ const nodePath = [aboveNodeEntry[1][0]];
78
+ const nextPath = _slate.Path.next(nodePath);
79
+ const isEmptyParagraph = aboveNodeEntry[0].type === _constants.PARAGRAPH && _slate.Node.string(aboveNodeEntry[0]).length === 0;
80
+ if (videoNodes.length === 1 && isEmptyParagraph) {
81
+ _slate.Transforms.setNodes(editor, videoNodes[0], {
82
+ at: validSelection
83
+ });
84
+ _slate.Transforms.insertNodes(editor, (0, _core.generateDefaultParagraph)(), {
85
+ at: nextPath
86
+ });
87
+ const endOfFirstNode = _slate.Editor.start(editor, nextPath);
88
+ const range = {
89
+ anchor: endOfFirstNode,
90
+ focus: endOfFirstNode
91
+ };
92
+ (0, _core.focusEditor)(editor, range);
93
+ return;
94
+ }
95
+ let videoEndSelection;
96
+ if ((0, _core.isLastNode)(editor, aboveNodeEntry[0]) && _slate.Editor.isEnd(editor, validSelection.anchor, [validSelection.anchor.path[0]])) {
97
+ // Insert video into empty paragraph node at the end if in the last position
98
+ _slate.Transforms.splitNodes(editor, {
99
+ at: selection,
100
+ always: true
101
+ });
102
+ _slate.Transforms.insertNodes(editor, videoNodes[0], {
103
+ at: validSelection
104
+ });
105
+ _slate.Transforms.insertNodes(editor, (0, _core.generateDefaultParagraph)(), {
106
+ at: [nextPath[0] + 1]
107
+ });
108
+ videoEndSelection = [nextPath[0] + 1];
109
+ } else {
110
+ _slate.Transforms.splitNodes(editor, {
111
+ at: selection,
112
+ always: true
113
+ });
114
+ _slate.Transforms.insertNodes(editor, videoNodes[0], {
115
+ at: validSelection
116
+ });
117
+ videoEndSelection = _slate.Editor.start(editor, _slate.Path.next(nextPath));
118
+ }
119
+ (0, _core.focusEditor)(editor, videoEndSelection);
120
+ };
121
+ exports.insertVideo = insertVideo;
122
+ const getVideoURL = data => {
123
+ const {
124
+ src: url
125
+ } = data;
126
+ if (url && url.startsWith('http')) return url;
127
+ const serviceUrl = _context.default.getSetting('serviceUrl');
128
+ const assetsUrl = _context.default.getSetting('assetsUrl');
129
+ return (0, _urlJoin.default)(serviceUrl, assetsUrl, url);
130
+ };
131
+ exports.getVideoURL = getVideoURL;
132
+ const formatFileSize = size => {
133
+ if (typeof size !== 'number') {
134
+ return '';
135
+ }
136
+ if (size >= _constants2.ONE_GB) {
137
+ return (size / _constants2.ONE_GB).toFixed(1) + ' G';
138
+ }
139
+ if (size >= _constants2.ONE_MB) {
140
+ return (size / _constants2.ONE_MB).toFixed(1) + ' M';
141
+ }
142
+ if (size >= _constants2.ONE_KB) {
143
+ return (size / _constants2.ONE_KB).toFixed(1) + ' K';
144
+ }
145
+ return size.toFixed(1) + ' B';
146
+ };
147
+ exports.formatFileSize = formatFileSize;
148
+ const videoFileIcon = () => {
149
+ const server = _context.default.getSetting('serviceUrl');
150
+ return `${server}/media/img/file/256/video.png`;
151
+ };
152
+ exports.videoFileIcon = videoFileIcon;
@@ -0,0 +1,72 @@
1
+ .video-loading-placeholder {
2
+ background-color: #F2F2F2;
3
+ width: 100%;
4
+ height: 45px;
5
+ display: flex;
6
+ align-items: center;
7
+ }
8
+
9
+ .video-loading-placeholder .video-file-icon {
10
+ width: 35px;
11
+ height: auto;
12
+ }
13
+
14
+ .video-loading-placeholder .video-file-info {
15
+ display: flex;
16
+ flex-direction: column;
17
+ justify-content: center;
18
+ align-items: flex-start;
19
+ font-size: small;
20
+ }
21
+
22
+ .video-loading-placeholder .file-size {
23
+ display: flex;
24
+ align-items: center;
25
+ color: #939393;
26
+ }
27
+
28
+ .video-loading-placeholder .loading-spinner {
29
+ border: 3px solid #d8d8d8;
30
+ border-top: 3px solid #939393;
31
+ border-radius: 50%;
32
+ width: 15px;
33
+ height: 15px;
34
+ animation: spin 1s linear infinite;
35
+ }
36
+
37
+ @keyframes spin {
38
+ 0% { transform: rotate(0deg); }
39
+ 100% { transform: rotate(360deg); }
40
+ }
41
+
42
+ .sdoc-video-wrapper{
43
+ display: flex;
44
+ }
45
+ .sdoc-video-wrapper {
46
+ position: relative;
47
+ display: flex;
48
+ }
49
+
50
+ .sdoc-video-wrapper .sdoc-video-inner {
51
+ position: relative;
52
+ width: 670px;
53
+ display: flex;
54
+ margin-top: 5px;
55
+ margin-bottom: 10px;
56
+ }
57
+
58
+ .sdoc-video-inner .sdoc-video-element{
59
+ width: 670px;
60
+ }
61
+
62
+ .sdoc-video-inner .sdoc-video-element:focus-visible {
63
+ outline: none;
64
+ }
65
+
66
+ .sdoc-video-inner .sdoc-video-play {
67
+ position: absolute;
68
+ top: 36.75%;
69
+ left: 46.3%;
70
+ font-size: 48px;
71
+ pointer-events: none;
72
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _constants = require("../../constants");
9
+ var _plugin = _interopRequireDefault(require("./plugin"));
10
+ var _menu = _interopRequireDefault(require("./menu"));
11
+ var _renderElem = require("./render-elem");
12
+ require("./index.css");
13
+ const VideoPlugin = {
14
+ type: _constants.VIDEO,
15
+ nodeType: 'element',
16
+ editorMenus: [_menu.default],
17
+ editorPlugin: _plugin.default,
18
+ renderElements: [_renderElem.renderVideo]
19
+ };
20
+ var _default = exports.default = VideoPlugin;
@@ -0,0 +1,53 @@
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.default = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _reactI18next = require("react-i18next");
11
+ var _reactstrap = require("reactstrap");
12
+ var _helpers = require("../helpers");
13
+ var _constants = require("../../../constants");
14
+ var _constants2 = require("../../../../constants");
15
+ var _dropdownMenuItem = _interopRequireDefault(require("../../../commons/dropdown-menu-item"));
16
+ const VideoMenu = _ref => {
17
+ let {
18
+ editor,
19
+ readonly,
20
+ eventBus
21
+ } = _ref;
22
+ const disabled = (0, _helpers.isInsertVideoMenuDisabled)(editor, readonly);
23
+ const menuConfig = _constants.MENUS_CONFIG_MAP[_constants.VIDEO];
24
+ const {
25
+ t
26
+ } = (0, _reactI18next.useTranslation)();
27
+ const openLocalVideoDialog = (0, _react.useCallback)(() => {
28
+ eventBus.dispatch(_constants2.INTERNAL_EVENT.INSERT_ELEMENT, {
29
+ type: _constants.LOCAL_VIDEO,
30
+ editor
31
+ });
32
+ }, [editor, eventBus]);
33
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
34
+ disabled: disabled,
35
+ menuConfig: menuConfig,
36
+ className: "pr-2"
37
+ }, !disabled && /*#__PURE__*/_react.default.createElement("i", {
38
+ className: "sdocfont sdoc-right-slide sdoc-dropdown-item-right-icon"
39
+ })), !disabled && /*#__PURE__*/_react.default.createElement(_reactstrap.UncontrolledPopover, {
40
+ target: menuConfig.id,
41
+ trigger: "hover",
42
+ className: "sdoc-menu-popover sdoc-dropdown-menu sdoc-sub-dropdown-menu sdoc-insert-video-menu-popover",
43
+ placement: "right-start",
44
+ hideArrow: true,
45
+ fade: false
46
+ }, /*#__PURE__*/_react.default.createElement("div", {
47
+ className: "sdoc-insert-video-menu-popover-container sdoc-dropdown-menu-container 333"
48
+ }, /*#__PURE__*/_react.default.createElement("div", {
49
+ className: "sdoc-dropdown-menu-item",
50
+ onClick: openLocalVideoDialog
51
+ }, t('Upload_local_video')))));
52
+ };
53
+ var _default = exports.default = VideoMenu;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _constants = require("../../constants");
10
+ const withVideo = editor => {
11
+ const {
12
+ isVoid
13
+ } = editor;
14
+ const newEditor = editor;
15
+
16
+ // Make video as void node
17
+ newEditor.isVoid = elem => {
18
+ const {
19
+ type
20
+ } = elem;
21
+ if (type === _constants.VIDEO) {
22
+ return true;
23
+ }
24
+ return isVoid(elem);
25
+ };
26
+ return newEditor;
27
+ };
28
+ var _default = exports.default = withVideo;
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.renderVideo = renderVideo;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _slateReact = require("@seafile/slate-react");
10
+ var _slate = require("@seafile/slate");
11
+ var _reactI18next = require("react-i18next");
12
+ var _helpers = require("./helpers");
13
+ require("./index.css");
14
+ const Video = _ref => {
15
+ var _data$videoFiles$, _data$videoFiles$2, _videoStates$element$;
16
+ let {
17
+ element,
18
+ editor
19
+ } = _ref;
20
+ const {
21
+ data
22
+ } = element;
23
+ const videoRef = (0, _react.useRef)(null);
24
+ const [isLoaded, setIsLoaded] = (0, _react.useState)(false);
25
+ const [isSelected, setIsSelected] = (0, _react.useState)(false);
26
+ const [videoStates, setVideoStates] = (0, _react.useState)({});
27
+ const videoFileName = data.videoFiles && ((_data$videoFiles$ = data.videoFiles[0]) === null || _data$videoFiles$ === void 0 ? void 0 : _data$videoFiles$.name) || null;
28
+ const videoFileSize = data.videoFiles && ((_data$videoFiles$2 = data.videoFiles[0]) === null || _data$videoFiles$2 === void 0 ? void 0 : _data$videoFiles$2.size) || null;
29
+ const handlePlay = () => {
30
+ setVideoStates(prev => ({
31
+ ...prev,
32
+ [element.id]: false
33
+ }));
34
+ };
35
+ const handlePause = () => {
36
+ setVideoStates(prev => ({
37
+ ...prev,
38
+ [element.id]: true
39
+ }));
40
+ };
41
+ const isPaused = (_videoStates$element$ = videoStates[element.id]) !== null && _videoStates$element$ !== void 0 ? _videoStates$element$ : true;
42
+ const handleVideoLoad = () => {
43
+ setIsLoaded(true);
44
+ };
45
+ const onClickVideo = (0, _react.useCallback)(e => {
46
+ e.stopPropagation();
47
+ const path = _slateReact.ReactEditor.findPath(editor, element);
48
+ _slate.Transforms.select(editor, path);
49
+ setIsSelected(true);
50
+ }, [editor, element]);
51
+ const onClickOutside = (0, _react.useCallback)(e => {
52
+ e.stopPropagation();
53
+ if (videoRef.current && !videoRef.current.contains(e.target)) {
54
+ setIsSelected(false);
55
+ }
56
+ }, []);
57
+ (0, _react.useEffect)(() => {
58
+ const videoElement = videoRef.current;
59
+ if (videoElement) {
60
+ videoElement.addEventListener('loadeddata', handleVideoLoad);
61
+ }
62
+ document.addEventListener('click', onClickOutside);
63
+ return () => {
64
+ if (videoElement) {
65
+ videoElement.removeEventListener('loadeddata', handleVideoLoad);
66
+ }
67
+ document.removeEventListener('click', onClickOutside);
68
+ };
69
+ }, [onClickOutside]);
70
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !isLoaded && /*#__PURE__*/_react.default.createElement("div", {
71
+ className: "video-loading-placeholder"
72
+ }, /*#__PURE__*/_react.default.createElement("img", {
73
+ className: "video-file-icon",
74
+ src: (0, _helpers.videoFileIcon)(),
75
+ alt: ""
76
+ }), /*#__PURE__*/_react.default.createElement("div", {
77
+ className: "video-file-info"
78
+ }, /*#__PURE__*/_react.default.createElement("div", null, videoFileName), /*#__PURE__*/_react.default.createElement("div", {
79
+ className: "file-size"
80
+ }, /*#__PURE__*/_react.default.createElement("span", null, (0, _helpers.formatFileSize)(videoFileSize), " \u2014 "), /*#__PURE__*/_react.default.createElement("div", {
81
+ className: "loading-spinner"
82
+ }, /*#__PURE__*/_react.default.createElement("div", {
83
+ className: "spinner"
84
+ }))))), /*#__PURE__*/_react.default.createElement("div", {
85
+ "data-id": element.id,
86
+ className: "sdoc-video-wrapper",
87
+ style: {
88
+ display: isLoaded ? 'block' : 'none'
89
+ }
90
+ }, /*#__PURE__*/_react.default.createElement("div", {
91
+ className: "sdoc-video-inner",
92
+ style: {
93
+ visibility: isLoaded ? 'visible' : 'hidden'
94
+ }
95
+ }, /*#__PURE__*/_react.default.createElement("video", {
96
+ className: "sdoc-video-element",
97
+ ref: videoRef,
98
+ src: (0, _helpers.getVideoURL)(data, editor),
99
+ controls: true,
100
+ onClick: onClickVideo,
101
+ draggable: false,
102
+ onPlay: handlePlay,
103
+ onPause: handlePause,
104
+ onCanPlay: handleVideoLoad,
105
+ style: {
106
+ boxShadow: isSelected ? '0 0 0 2px #007bff' : 'none'
107
+ }
108
+ }), /*#__PURE__*/_react.default.createElement("div", {
109
+ className: "sdoc-video-play sdocfont sdoc-play icon-font",
110
+ style: {
111
+ visibility: isPaused ? 'visible' : 'hidden'
112
+ },
113
+ contentEditable: "false"
114
+ }))));
115
+ };
116
+ const SdocVideo = (0, _reactI18next.withTranslation)('sdoc-editor')(Video);
117
+ function renderVideo(props, editor) {
118
+ const {
119
+ element,
120
+ children,
121
+ attributes
122
+ } = props;
123
+ return /*#__PURE__*/_react.default.createElement("div", Object.assign({
124
+ className: "sdoc-video-wrapper"
125
+ }, attributes, {
126
+ contentEditable: "true",
127
+ suppressContentEditableWarning: true
128
+ }), /*#__PURE__*/_react.default.createElement("div", {
129
+ className: "sdoc-video-children-wrapper",
130
+ contentEditable: "false",
131
+ suppressContentEditableWarning: true,
132
+ style: {
133
+ userSelect: 'none',
134
+ pointerEvents: 'none'
135
+ }
136
+ }, children), /*#__PURE__*/_react.default.createElement(SdocVideo, {
137
+ element: element,
138
+ editor: editor
139
+ }));
140
+ }
@@ -128,6 +128,13 @@ const CustomRenderElement = props => {
128
128
  ...props
129
129
  }, editor);
130
130
  }
131
+ case _constants.VIDEO:
132
+ {
133
+ const [renderVideo] = _plugins.VideoPlugin.renderElements;
134
+ return renderVideo({
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:
77
+ {
78
+ const [renderVideo] = _plugins.VideoPlugin.renderElements;
79
+ return renderVideo({
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];
@@ -127,10 +127,11 @@ exports.getTopValue = getTopValue;
127
127
  const isVoidNode = node => {
128
128
  if (!node) return true;
129
129
  const hasImage = node.children.find(n => n.type === _constants.IMAGE);
130
+ const isVideo = node.type === _constants.VIDEO;
130
131
  const isTable = node.type === _constants.TABLE;
131
132
  const isCodeBlock = node.type === _constants.CODE_BLOCK;
132
133
  const isCallout = node.type === _constants.CALL_OUT;
133
- return _slate.Node.string(node) === '' && !hasImage && !isTable && !isCodeBlock && !isCallout;
134
+ return _slate.Node.string(node) === '' && !hasImage && !isVideo && !isTable && !isCodeBlock && !isCallout;
134
135
  };
135
136
  exports.isVoidNode = isVoidNode;
136
137
  const isNotSupportTransform = node => {
@@ -48,6 +48,18 @@ 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
+ // eslint-disable-next-line react-hooks/exhaustive-deps
62
+ }, [editor, insertPosition]);
51
63
  const createTable = (0, _react.useCallback)(size => {
52
64
  const newInsertPosition = slateNode.type === _constants.ELEMENT_TYPE.LIST_ITEM ? _constants.INSERT_POSITION.AFTER : insertPosition;
53
65
  (0, _helpers2.insertTable)(editor, size, editor.selection, newInsertPosition);
@@ -100,6 +112,12 @@ const InsertBlockMenu = _ref => {
100
112
  ..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.IMAGE]
101
113
  },
102
114
  onClick: onInsertImageToggle
115
+ }), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
116
+ isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.VIDEO],
117
+ menuConfig: {
118
+ ..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.VIDEO]
119
+ },
120
+ onClick: onInsertVideoToggle
103
121
  }), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
104
122
  isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.TABLE],
105
123
  menuConfig: {
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.146-alpha.1",
3
+ "version": "1.0.147",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",
@@ -571,5 +571,8 @@
571
571
  "Three_column": "3 columns",
572
572
  "Four_column": "4 columns",
573
573
  "Five_column": "5 columns",
574
- "Full_width_mode": "Full width mode"
574
+ "Full_width_mode": "Full width mode",
575
+ "Video": "Video",
576
+ "Upload_local_video": "Upload_local_video",
577
+ "The_current_version_does_not_support_>5MB_video_file": "The_current_version_does_not_support_>5MB_video_file"
575
578
  }
@@ -530,7 +530,7 @@
530
530
  "has_all_of": "has all of",
531
531
  "has_none_of": "has none of",
532
532
  "is_exactly": "is exactly",
533
- "is_current_user_ID": "is current user's ID",
533
+ "is_current_user_ID": "ist die aktuelle Benutzer-ID",
534
534
  "Current_date": "Current date",
535
535
  "Specific_date": "Specific date",
536
536
  "x_days_before_current_date": "x days before current date",
@@ -571,5 +571,8 @@
571
571
  "Three_column": "3 columns",
572
572
  "Four_column": "4 columns",
573
573
  "Five_column": "5 columns",
574
- "Full_width_mode": "Full width mode"
574
+ "Full_width_mode": "Full width mode",
575
+ "Video": "Video",
576
+ "Upload_local_video": "Upload_local_video",
577
+ "The_current_version_does_not_support_>5MB_video_file": "The_current_version_does_not_support_>5MB_video_file"
575
578
  }
@@ -571,5 +571,8 @@
571
571
  "Three_column": "3 columns",
572
572
  "Four_column": "4 columns",
573
573
  "Five_column": "5 columns",
574
- "Full_width_mode": "Full width mode"
574
+ "Full_width_mode": "Full width mode",
575
+ "Video": "Video",
576
+ "Upload_local_video": "Upload_local_video",
577
+ "The_current_version_does_not_support_>5MB_video_file": "The_current_version_does_not_support_>5MB_video_file"
575
578
  }
@@ -571,5 +571,8 @@
571
571
  "Three_column": "3 columns",
572
572
  "Four_column": "4 columns",
573
573
  "Five_column": "5 columns",
574
- "Full_width_mode": "Full width mode"
574
+ "Full_width_mode": "Full width mode",
575
+ "Video": "Video",
576
+ "Upload_local_video": "Upload_local_video",
577
+ "The_current_version_does_not_support_>5MB_video_file": "The_current_version_does_not_support_>5MB_video_file"
575
578
  }
@@ -571,5 +571,8 @@
571
571
  "Three_column": "3 columns",
572
572
  "Four_column": "4 columns",
573
573
  "Five_column": "5 columns",
574
- "Full_width_mode": "Full width mode"
574
+ "Full_width_mode": "Full width mode",
575
+ "Video": "Video",
576
+ "Upload_local_video": "Upload_local_video",
577
+ "The_current_version_does_not_support_>5MB_video_file": "The_current_version_does_not_support_>5MB_video_file"
575
578
  }
@@ -571,5 +571,8 @@
571
571
  "Three_column": "3 columns",
572
572
  "Four_column": "4 columns",
573
573
  "Five_column": "5 columns",
574
- "Full_width_mode": "Full width mode"
574
+ "Full_width_mode": "Full width mode",
575
+ "Video": "Video",
576
+ "Upload_local_video": "Upload_local_video",
577
+ "The_current_version_does_not_support_>5MB_video_file": "The_current_version_does_not_support_>5MB_video_file"
575
578
  }
@@ -571,5 +571,8 @@
571
571
  "Three_column": "3 columns",
572
572
  "Four_column": "4 columns",
573
573
  "Five_column": "5 columns",
574
- "Full_width_mode": "Full width mode"
574
+ "Full_width_mode": "Full width mode",
575
+ "Video": "Vidéo",
576
+ "Upload_local_video": "Upload_local_video",
577
+ "The_current_version_does_not_support_>5MB_video_file": "The_current_version_does_not_support_>5MB_video_file"
575
578
  }
@@ -571,5 +571,8 @@
571
571
  "Three_column": "3 columns",
572
572
  "Four_column": "4 columns",
573
573
  "Five_column": "5 columns",
574
- "Full_width_mode": "Full width mode"
574
+ "Full_width_mode": "Full width mode",
575
+ "Video": "Video",
576
+ "Upload_local_video": "Upload_local_video",
577
+ "The_current_version_does_not_support_>5MB_video_file": "The_current_version_does_not_support_>5MB_video_file"
575
578
  }
@@ -571,5 +571,8 @@
571
571
  "Three_column": "3 столбца",
572
572
  "Four_column": "4 столбца",
573
573
  "Five_column": "5 столбцов",
574
- "Full_width_mode": "Full width mode"
574
+ "Full_width_mode": "Режим полной ширины",
575
+ "Video": "Видео",
576
+ "Upload_local_video": "Upload_local_video",
577
+ "The_current_version_does_not_support_>5MB_video_file": "The_current_version_does_not_support_>5MB_video_file"
575
578
  }
@@ -571,5 +571,8 @@
571
571
  "Three_column": "3 列",
572
572
  "Four_column": "4 列",
573
573
  "Five_column": "5 列",
574
- "Full_width_mode": "全宽模式"
574
+ "Full_width_mode": "全宽模式",
575
+ "Video": "视频",
576
+ "Upload_local_video": "上传本地视频",
577
+ "The_current_version_does_not_support_>5MB_video_file": "当前版本不支持大于 5MB 的视频文件"
575
578
  }
@@ -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
  }