@seafile/sdoc-editor 1.0.146 → 1.0.148
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/seafile-api.js +17 -0
- package/dist/basic-sdk/assets/css/sdoc-editor-plugins.css +4 -0
- package/dist/basic-sdk/constants/index.js +2 -1
- package/dist/basic-sdk/extension/commons/insert-element-dialog/index.js +49 -0
- package/dist/basic-sdk/extension/constants/element-type.js +2 -1
- package/dist/basic-sdk/extension/constants/index.js +10 -3
- package/dist/basic-sdk/extension/constants/menus-config.js +12 -0
- package/dist/basic-sdk/extension/plugins/index.js +8 -1
- package/dist/basic-sdk/extension/plugins/video/constants/index.js +10 -0
- package/dist/basic-sdk/extension/plugins/video/helpers.js +152 -0
- package/dist/basic-sdk/extension/plugins/video/index.css +72 -0
- package/dist/basic-sdk/extension/plugins/video/index.js +20 -0
- package/dist/basic-sdk/extension/plugins/video/menu/index.js +53 -0
- package/dist/basic-sdk/extension/plugins/video/plugin.js +28 -0
- package/dist/basic-sdk/extension/plugins/video/render-elem.js +140 -0
- package/dist/basic-sdk/extension/render/custom-element.js +7 -0
- package/dist/basic-sdk/extension/render/render-comment-editor-element.js +7 -0
- package/dist/basic-sdk/extension/toolbar/header-toolbar/insert-toolbar/index.js +9 -8
- package/dist/basic-sdk/extension/toolbar/insert-element-toolbar/index.js +28 -1
- package/dist/basic-sdk/extension/toolbar/side-toolbar/helpers.js +2 -1
- package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-block-menu.js +18 -0
- package/dist/basic-sdk/socket/socket-manager.js +1 -1
- package/dist/components/tip-message/index.js +11 -0
- package/dist/context.js +9 -0
- package/package.json +1 -1
- package/public/locales/cs/sdoc-editor.json +5 -1
- package/public/locales/de/sdoc-editor.json +6 -2
- package/public/locales/en/sdoc-editor.json +5 -1
- package/public/locales/es/sdoc-editor.json +5 -1
- package/public/locales/es_AR/sdoc-editor.json +5 -1
- package/public/locales/es_MX/sdoc-editor.json +5 -1
- package/public/locales/fr/sdoc-editor.json +5 -1
- package/public/locales/it/sdoc-editor.json +5 -1
- package/public/locales/ru/sdoc-editor.json +5 -1
- package/public/locales/zh_CN/sdoc-editor.json +5 -1
- package/public/media/sdoc-editor-font/iconfont.eot +0 -0
- package/public/media/sdoc-editor-font/iconfont.svg +4 -0
- package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
- package/public/media/sdoc-editor-font/iconfont.woff +0 -0
- package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
- package/public/media/sdoc-editor-font.css +15 -10
package/dist/api/seafile-api.js
CHANGED
|
@@ -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) {
|
|
@@ -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;
|
|
@@ -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
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
var
|
|
16
|
+
var _menu3 = _interopRequireDefault(require("../../../plugins/link/menu"));
|
|
17
|
+
var _menu4 = _interopRequireDefault(require("../../../plugins/code-block/menu"));
|
|
18
|
+
var _menu5 = _interopRequireDefault(require("../../../plugins/sdoc-link/menu"));
|
|
19
|
+
var _menu6 = _interopRequireDefault(require("../../../plugins/file-link/menu"));
|
|
20
|
+
var _menu7 = _interopRequireDefault(require("../../../plugins/seatable-column/menu"));
|
|
21
|
+
var _menu8 = _interopRequireDefault(require("../../../plugins/seatable-tables/menu"));
|
|
21
22
|
var _eventBus = _interopRequireDefault(require("../../../../utils/event-bus"));
|
|
22
23
|
require("./index.css");
|
|
23
24
|
const InsertToolbar = _ref => {
|
|
@@ -93,9 +94,9 @@ const InsertToolbar = _ref => {
|
|
|
93
94
|
style: {
|
|
94
95
|
maxHeight: window.innerHeight - bottom - 100
|
|
95
96
|
}
|
|
96
|
-
}, /*#__PURE__*/_react.default.createElement(_menu.default, props), /*#__PURE__*/_react.default.createElement(_tableMenu.default, props), /*#__PURE__*/_react.default.createElement(_menu2.default, props), /*#__PURE__*/_react.default.createElement(_menu3.default, props), /*#__PURE__*/_react.default.createElement("div", {
|
|
97
|
+
}, /*#__PURE__*/_react.default.createElement(_menu.default, props), /*#__PURE__*/_react.default.createElement(_tableMenu.default, props), /*#__PURE__*/_react.default.createElement(_menu2.default, props), /*#__PURE__*/_react.default.createElement(_menu3.default, props), /*#__PURE__*/_react.default.createElement(_menu4.default, props), /*#__PURE__*/_react.default.createElement("div", {
|
|
97
98
|
className: "sdoc-dropdown-menu-divider"
|
|
98
|
-
}), editor.columns && /*#__PURE__*/_react.default.createElement(
|
|
99
|
+
}), editor.columns && /*#__PURE__*/_react.default.createElement(_menu7.default, props), editor.tables && /*#__PURE__*/_react.default.createElement(_menu8.default, props), !editor.tables && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_menu5.default, props), /*#__PURE__*/_react.default.createElement(_menu6.default, props)))));
|
|
99
100
|
};
|
|
100
101
|
InsertToolbar.defaultProps = {
|
|
101
102
|
isRichEditor: true,
|
|
@@ -51,6 +51,19 @@ const QuickInsertBlockMenu = _ref => {
|
|
|
51
51
|
});
|
|
52
52
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
53
53
|
}, [editor, insertPosition]);
|
|
54
|
+
const onInsertVideoToggle = (0, _react.useCallback)(() => {
|
|
55
|
+
callback && callback();
|
|
56
|
+
const eventBus = _eventBus.default.getInstance();
|
|
57
|
+
if (insertPosition === _constants.INSERT_POSITION.CURRENT) {
|
|
58
|
+
_slate.Transforms.select(editor, editor.selection.focus);
|
|
59
|
+
}
|
|
60
|
+
eventBus.dispatch(_constants2.INTERNAL_EVENT.INSERT_ELEMENT, {
|
|
61
|
+
type: _constants.LOCAL_VIDEO,
|
|
62
|
+
insertPosition,
|
|
63
|
+
slateNode
|
|
64
|
+
});
|
|
65
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
66
|
+
}, [editor, insertPosition]);
|
|
54
67
|
const createTable = (0, _react.useCallback)(size => {
|
|
55
68
|
callback && callback();
|
|
56
69
|
const newInsertPosition = slateNode.type === _constants.ELEMENT_TYPE.LIST_ITEM ? _constants.INSERT_POSITION.AFTER : insertPosition;
|
|
@@ -114,6 +127,12 @@ const QuickInsertBlockMenu = _ref => {
|
|
|
114
127
|
});
|
|
115
128
|
return !!callout;
|
|
116
129
|
}, [editor]);
|
|
130
|
+
const isDisableVideo = (0, _react.useMemo)(() => {
|
|
131
|
+
const callout = (0, _core.getAboveBlockNode)(editor, {
|
|
132
|
+
match: n => [_constants.ELEMENT_TYPE.ORDERED_LIST, _constants.ELEMENT_TYPE.UNORDERED_LIST, _constants.ELEMENT_TYPE.CHECK_LIST_ITEM].includes(n.type)
|
|
133
|
+
});
|
|
134
|
+
return !!callout;
|
|
135
|
+
}, [editor]);
|
|
117
136
|
const onInsertBlockQuote = (0, _react.useCallback)(() => {
|
|
118
137
|
callback && callback();
|
|
119
138
|
(0, _helpers5.insertBlockQuote)(editor, false);
|
|
@@ -133,6 +152,14 @@ const QuickInsertBlockMenu = _ref => {
|
|
|
133
152
|
},
|
|
134
153
|
onClick: onInsertImageToggle
|
|
135
154
|
}),
|
|
155
|
+
[_constants.VIDEO]: /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
|
|
156
|
+
disabled: isDisableVideo,
|
|
157
|
+
key: "sdoc-insert-menu-video",
|
|
158
|
+
menuConfig: {
|
|
159
|
+
..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.VIDEO]
|
|
160
|
+
},
|
|
161
|
+
onClick: onInsertVideoToggle
|
|
162
|
+
}),
|
|
136
163
|
[_constants.TABLE]:
|
|
137
164
|
/*#__PURE__*/
|
|
138
165
|
// eslint-disable-next-line react/jsx-indent
|
|
@@ -231,7 +258,7 @@ const QuickInsertBlockMenu = _ref => {
|
|
|
231
258
|
});
|
|
232
259
|
});
|
|
233
260
|
return items;
|
|
234
|
-
}, [isDisableImage, onInsertImageToggle, editor, createTable, openLinkDialog, onInsertBlockQuote, onInsertCodeBlock, isDisableCallout, onInsertCheckList, isEmptyNode, onInsertCallout, onInsertList, onInsert, createMultiColumn]);
|
|
261
|
+
}, [isDisableImage, isDisableVideo, onInsertImageToggle, editor, createTable, openLinkDialog, onInsertBlockQuote, onInsertCodeBlock, isDisableCallout, onInsertCheckList, isEmptyNode, onInsertCallout, onInsertList, onInsert, createMultiColumn]);
|
|
235
262
|
const getSelectItemDom = selectIndex => {
|
|
236
263
|
const dropDownItemWrapper = downDownWrapperRef.current;
|
|
237
264
|
const currentSelectItem = dropDownItemWrapper.children[selectIndex];
|
|
@@ -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: {
|
|
@@ -109,7 +109,7 @@ class SocketManager {
|
|
|
109
109
|
const {
|
|
110
110
|
error_type
|
|
111
111
|
} = result;
|
|
112
|
-
if (error_type === 'load_document_content_error' || error_type === 'save_operations_to_database_error') {
|
|
112
|
+
if (error_type === 'load_document_content_error' || error_type === 'save_operations_to_database_error' || error_type === 'token_expired') {
|
|
113
113
|
// load_document_content_error: After a short-term reconnection, the content of the document fails to load
|
|
114
114
|
// save_operation_to_database_error: Save operation to database error
|
|
115
115
|
this.dispatchConnectState(error_type);
|
|
@@ -44,6 +44,16 @@ class TipMessage extends _react.default.Component {
|
|
|
44
44
|
duration: null
|
|
45
45
|
});
|
|
46
46
|
});
|
|
47
|
+
(0, _defineProperty2.default)(this, "onTokenExpiredError", msg => {
|
|
48
|
+
const {
|
|
49
|
+
t
|
|
50
|
+
} = this.props;
|
|
51
|
+
const message = t('Token_expired_Please_refresh_the_page');
|
|
52
|
+
_toast.default.closeAll();
|
|
53
|
+
_toast.default.danger(message, {
|
|
54
|
+
duration: null
|
|
55
|
+
});
|
|
56
|
+
});
|
|
47
57
|
(0, _defineProperty2.default)(this, "onPendingOpExceedLimit", () => {
|
|
48
58
|
const {
|
|
49
59
|
t
|
|
@@ -163,6 +173,7 @@ class TipMessage extends _react.default.Component {
|
|
|
163
173
|
this.unsubscribeSyncServerOpError = eventBus.subscribe('sync_server_operations_error', this.onSyncServerOperationError);
|
|
164
174
|
this.unsubscribeDocumentLoadError = eventBus.subscribe('load_document_content_error', this.onInternalServerExecError);
|
|
165
175
|
this.unsubscribeOperationsSaveError = eventBus.subscribe('save_operations_to_database_error', this.onInternalServerExecError);
|
|
176
|
+
this.unsubscribeOperationsSaveError = eventBus.subscribe('token_expired', this.onTokenExpiredError);
|
|
166
177
|
|
|
167
178
|
// local error
|
|
168
179
|
this.unsubscribePendingOpExceedLimit = eventBus.subscribe('pending_operations_exceed_limit', this.onPendingOpExceedLimit);
|
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
|
@@ -571,5 +571,9 @@
|
|
|
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",
|
|
578
|
+
"Token_expired_Please_refresh_the_page": "Token expired. Please refresh the page."
|
|
575
579
|
}
|
|
@@ -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": "
|
|
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,9 @@
|
|
|
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",
|
|
578
|
+
"Token_expired_Please_refresh_the_page": "Token expired. Please refresh the page."
|
|
575
579
|
}
|
|
@@ -571,5 +571,9 @@
|
|
|
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",
|
|
578
|
+
"Token_expired_Please_refresh_the_page": "Token expired. Please refresh the page."
|
|
575
579
|
}
|
|
@@ -571,5 +571,9 @@
|
|
|
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",
|
|
578
|
+
"Token_expired_Please_refresh_the_page": "Token expired. Please refresh the page."
|
|
575
579
|
}
|
|
@@ -571,5 +571,9 @@
|
|
|
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",
|
|
578
|
+
"Token_expired_Please_refresh_the_page": "Token expired. Please refresh the page."
|
|
575
579
|
}
|
|
@@ -571,5 +571,9 @@
|
|
|
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",
|
|
578
|
+
"Token_expired_Please_refresh_the_page": "Token expired. Please refresh the page."
|
|
575
579
|
}
|
|
@@ -571,5 +571,9 @@
|
|
|
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",
|
|
578
|
+
"Token_expired_Please_refresh_the_page": "Token expired. Please refresh the page."
|
|
575
579
|
}
|
|
@@ -571,5 +571,9 @@
|
|
|
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",
|
|
578
|
+
"Token_expired_Please_refresh_the_page": "Token expired. Please refresh the page."
|
|
575
579
|
}
|
|
@@ -571,5 +571,9 @@
|
|
|
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": "Текущая_версия_не_поддерживает_видео_файл_>5_МБ",
|
|
578
|
+
"Token_expired_Please_refresh_the_page": "Token expired. Please refresh the page."
|
|
575
579
|
}
|
|
@@ -571,5 +571,9 @@
|
|
|
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 的视频文件",
|
|
578
|
+
"Token_expired_Please_refresh_the_page": "Token已过期。请刷新页面。"
|
|
575
579
|
}
|
|
Binary file
|
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
/>
|
|
15
15
|
<missing-glyph />
|
|
16
16
|
|
|
17
|
+
<glyph glyph-name="sdoc-play" unicode="" d="M512 896C230.4 896 0 665.6 0 384s230.4-512 512-512 512 230.4 512 512c0 134.4-54.4 265.6-150.4 361.6S646.4 896 512 896z m0-944c-236.8 0-432 192-432 432S275.2 816 512 816s432-192 432-432c0-115.2-44.8-224-124.8-304s-192-128-307.2-128z m185.6 457.6l-134.4 76.8-140.8 83.2c-9.6 3.2-19.2 3.2-25.6-3.2-6.4-6.4-12.8-16-9.6-25.6v-320c0-9.6 3.2-19.2 9.6-25.6s16-6.4 25.6-3.2l140.8 83.2 134.4 76.8c9.6 6.4 12.8 16 12.8 25.6s-6.4 28.8-12.8 32z" horiz-adv-x="1024" />
|
|
18
|
+
|
|
19
|
+
<glyph glyph-name="sdoc-video" unicode="" d="M969.6 832c28.8 0 54.4-25.6 54.4-57.6v-784c0-32-25.6-57.6-54.4-57.6H54.4C25.6-64 0-38.4 0-6.4V774.4C0 806.4 25.6 832 54.4 832h915.2zM928 736H96v-704h832V736zM348.8 608l380.8-227.2-380.8-227.2V608z" horiz-adv-x="1024" />
|
|
20
|
+
|
|
17
21
|
<glyph glyph-name="sdoc-mark-as-resolved" unicode="" d="M512 896c281.6 0 512-230.4 512-512s-230.4-512-512-512S0 102.4 0 384 230.4 896 512 896z m0-96C281.6 800 96 614.4 96 384s185.6-416 416-416 416 185.6 416 416S742.4 800 512 800z m272-243.2c19.2-22.4 16-54.4 0-70.4-6.4-6.4-64-70.4-124.8-134.4l-22.4-25.6c-57.6-64-115.2-121.6-124.8-134.4-22.4-25.6-44.8-35.2-70.4-35.2-25.6 0-44.8 9.6-64 28.8s-121.6 140.8-140.8 160-12.8 54.4 6.4 70.4 51.2 16 70.4-3.2c12.8-12.8 54.4-60.8 131.2-144 169.6 182.4 259.2 281.6 268.8 291.2 16 19.2 51.2 19.2 70.4-3.2z" horiz-adv-x="1024" />
|
|
18
22
|
|
|
19
23
|
<glyph glyph-name="sdoc-multi-column" unicode="" d="M236.8 864l160-416h-73.6l-38.4 105.6H112L73.6 448H0L160 864h76.8zM198.4 790.4L131.2 608h134.4L198.4 790.4zM0 352h448v-64H0v64z m0-128h448v-64H0v64z m0-128h448v-64H0v64z m0-128h320v-64H0v64zM768 864c41.6 0 73.6-9.6 96-28.8 22.4-19.2 32-44.8 32-73.6 0-22.4-6.4-41.6-16-60.8-12.8-16-28.8-28.8-48-35.2 28.8-6.4 48-16 60.8-32 12.8-16 19.2-38.4 19.2-67.2 0-41.6-16-73.6-41.6-92.8-25.6-16-57.6-25.6-102.4-25.6h-192V864h192z m-9.6-230.4h-115.2v-128h112c25.6 0 44.8 3.2 60.8 12.8 19.2 9.6 28.8 25.6 28.8 51.2 0 22.4-6.4 41.6-19.2 51.2-12.8 6.4-35.2 12.8-67.2 12.8z m-9.6 176h-105.6v-118.4h105.6c28.8 0 48 6.4 60.8 16 12.8 9.6 19.2 25.6 19.2 48 0 19.2-6.4 35.2-19.2 41.6-12.8 6.4-32 12.8-60.8 12.8zM576 352h448v-64H576v64z m0-128h448v-64H576v64z m0-128h448v-64H576v64z m0-128h320v-64H576v64z" horiz-adv-x="1024" />
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
@font-face {
|
|
2
|
-
font-family: "sdocfont";
|
|
3
|
-
|
|
4
|
-
src: url('./sdoc-editor-font/iconfont.eot?t=
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
url('./sdoc-editor-font/iconfont.woff?t=1729735524150') format('woff'),
|
|
10
|
-
url('./sdoc-editor-font/iconfont.ttf?t=1729735524150') format('truetype'),
|
|
11
|
-
url('./sdoc-editor-font/iconfont.svg?t=1729735524150#sdocfont') format('svg');
|
|
2
|
+
font-family: "sdocfont"; /* Project id 4097705 */
|
|
3
|
+
src: url('./sdoc-editor-font/iconfont.eot?t=1732000106128'); /* IE9 */
|
|
4
|
+
src: url('./sdoc-editor-font/iconfont.eot?t=1732000106128#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
|
5
|
+
url('./sdoc-editor-font/iconfont.woff2?t=1732000106128') format('woff2'),
|
|
6
|
+
url('./sdoc-editor-font/iconfont.woff?t=1732000106128') format('woff'),
|
|
7
|
+
url('./sdoc-editor-font/iconfont.ttf?t=1732000106128') format('truetype'),
|
|
8
|
+
url('./sdoc-editor-font/iconfont.svg?t=1732000106128#sdocfont') format('svg');
|
|
12
9
|
}
|
|
13
10
|
|
|
14
11
|
.sdocfont {
|
|
@@ -19,6 +16,14 @@
|
|
|
19
16
|
-moz-osx-font-smoothing: grayscale;
|
|
20
17
|
}
|
|
21
18
|
|
|
19
|
+
.sdoc-play:before {
|
|
20
|
+
content: "\e67c";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.sdoc-video:before {
|
|
24
|
+
content: "\e67b";
|
|
25
|
+
}
|
|
26
|
+
|
|
22
27
|
.sdoc-mark-as-resolved:before {
|
|
23
28
|
content: "\e67a";
|
|
24
29
|
}
|