@seafile/sdoc-editor 2.0.191 → 2.0.192
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/extension/commons/select-file-dialog/helpers.js +3 -1
- package/dist/extension/plugins/video/helpers.js +17 -1
- package/dist/extension/plugins/video/hover-menu/index.css +52 -0
- package/dist/extension/plugins/video/hover-menu/index.js +102 -0
- package/dist/extension/plugins/video/render-elem.js +72 -3
- package/package.json +2 -2
|
@@ -48,7 +48,9 @@ var parcelFileTypeIcon = exports.parcelFileTypeIcon = function parcelFileTypeIco
|
|
|
48
48
|
var fileExtType = (_Object$entries$find = Object.entries(_constants.FILEEXT_TYPE).find(function (_ref) {
|
|
49
49
|
var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
|
|
50
50
|
extensions = _ref2[1];
|
|
51
|
-
return extensions.
|
|
51
|
+
return extensions.some(function (ext) {
|
|
52
|
+
return ext.toLowerCase() === newFileType.toLowerCase();
|
|
53
|
+
});
|
|
52
54
|
})) === null || _Object$entries$find === void 0 ? void 0 : _Object$entries$find[0];
|
|
53
55
|
var fileTypeResult = fileExtType ? _constants.FILEEXT_TYPE_MAP[fileExtType] : newFileType;
|
|
54
56
|
var fileTypeIcon = getFileTypeIcon(fileTypeResult);
|
|
@@ -4,10 +4,12 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.videoFileIcon = exports.parseVideoLink = exports.isInsertVideoMenuDisabled = exports.insertVideo = exports.getVideoURL = exports.generateVideoNode = exports.formatFileSize = void 0;
|
|
7
|
+
exports.videoFileIcon = exports.parseVideoLink = exports.onCopyVideoNode = exports.isInsertVideoMenuDisabled = exports.insertVideo = exports.getVideoURL = exports.generateVideoNode = exports.formatFileSize = void 0;
|
|
8
8
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
|
|
9
9
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
10
10
|
var _slate = require("@seafile/slate");
|
|
11
|
+
var _slateReact = require("@seafile/slate-react");
|
|
12
|
+
var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
|
|
11
13
|
var _urlJoin = _interopRequireDefault(require("url-join"));
|
|
12
14
|
var _context = _interopRequireDefault(require("../../../context"));
|
|
13
15
|
var _constants = require("../../constants");
|
|
@@ -204,4 +206,18 @@ var formatFileSize = exports.formatFileSize = function formatFileSize(size) {
|
|
|
204
206
|
var videoFileIcon = exports.videoFileIcon = function videoFileIcon() {
|
|
205
207
|
var server = _context["default"].getSetting('serviceUrl');
|
|
206
208
|
return "".concat(server, "/media/img/file/256/video.png");
|
|
209
|
+
};
|
|
210
|
+
var onCopyVideoNode = exports.onCopyVideoNode = function onCopyVideoNode(editor, element) {
|
|
211
|
+
if (editor.selection == null || _slate.Range.isExpanded(editor.selection)) return;
|
|
212
|
+
var p = _slateReact.ReactEditor.findPath(editor, element);
|
|
213
|
+
_slate.Transforms.select(editor, p);
|
|
214
|
+
var newData = editor.setFragmentData(new DataTransfer());
|
|
215
|
+
(0, _copyToClipboard["default"])('copy', {
|
|
216
|
+
onCopy: function onCopy(clipboardData) {
|
|
217
|
+
newData.types.forEach(function (type) {
|
|
218
|
+
var data = newData.getData(type);
|
|
219
|
+
clipboardData.setData(type, data);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
});
|
|
207
223
|
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
.video-hover-menu-container {
|
|
2
|
+
position: absolute;
|
|
3
|
+
height: 42px;
|
|
4
|
+
z-index: 101;
|
|
5
|
+
width: auto;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.video-hover-menu-container .hover-menu-container {
|
|
9
|
+
height: 36px;
|
|
10
|
+
padding: 7px 8px;
|
|
11
|
+
background-color: #fff;
|
|
12
|
+
display: flex;
|
|
13
|
+
justify-content: flex-start;
|
|
14
|
+
align-items: center;
|
|
15
|
+
border-radius: 3px;
|
|
16
|
+
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08);
|
|
17
|
+
border: 1px solid #e8e8e8;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.video-hover-menu-container .hover-menu-container>span:not(:last-of-type) {
|
|
21
|
+
padding-right: 8px;
|
|
22
|
+
border-right: 1px solid #e5e5e5;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.video-hover-menu-container .hover-menu-container .op-item {
|
|
26
|
+
position: relative;
|
|
27
|
+
font-size: 12px;
|
|
28
|
+
color: #212529;
|
|
29
|
+
padding: 0 5px;
|
|
30
|
+
border-radius: 2px;
|
|
31
|
+
min-width: 24px;
|
|
32
|
+
height: 24px;
|
|
33
|
+
display: inline-flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
justify-content: center;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.video-hover-menu-container .hover-menu-container .op-item:hover {
|
|
39
|
+
color: #212529;
|
|
40
|
+
text-decoration: none;
|
|
41
|
+
background: #f1f1f1;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.video-hover-menu-container .op-group-item:first-child .op-item:last-child,
|
|
45
|
+
.video-hover-menu-container .op-group-item:not(:first-child) .op-item {
|
|
46
|
+
margin-left: 8px;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.video-hover-menu-container .hover-menu-container .icon-font {
|
|
50
|
+
font-size: 12px;
|
|
51
|
+
color: #444;
|
|
52
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _reactI18next = require("react-i18next");
|
|
12
|
+
var _slate = require("@seafile/slate");
|
|
13
|
+
var _slateReact = require("@seafile/slate-react");
|
|
14
|
+
var _toast = _interopRequireDefault(require("../../../../components/toast"));
|
|
15
|
+
var _tooltip = _interopRequireDefault(require("../../../../components/tooltip"));
|
|
16
|
+
var _commons = require("../../../commons");
|
|
17
|
+
var _core = require("../../../core");
|
|
18
|
+
var _helpers = require("../helpers");
|
|
19
|
+
require("./index.css");
|
|
20
|
+
var VideoHoverMenu = function VideoHoverMenu(_ref) {
|
|
21
|
+
var editor = _ref.editor,
|
|
22
|
+
menuPosition = _ref.menuPosition,
|
|
23
|
+
element = _ref.element,
|
|
24
|
+
videoRef = _ref.videoRef,
|
|
25
|
+
setIsSelected = _ref.setIsSelected,
|
|
26
|
+
t = _ref.t;
|
|
27
|
+
var readOnly = (0, _slateReact.useReadOnly)();
|
|
28
|
+
var _useState = (0, _react.useState)(false),
|
|
29
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
30
|
+
isShowTooltip = _useState2[0],
|
|
31
|
+
setIsShowTooltip = _useState2[1];
|
|
32
|
+
(0, _react.useEffect)(function () {
|
|
33
|
+
setIsShowTooltip(true);
|
|
34
|
+
}, []);
|
|
35
|
+
var onCopy = (0, _react.useCallback)(function (e) {
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
(0, _helpers.onCopyVideoNode)(editor, element);
|
|
38
|
+
_toast["default"].success(t('Copied'), {
|
|
39
|
+
hasCloseButton: false,
|
|
40
|
+
duration: 2
|
|
41
|
+
});
|
|
42
|
+
setIsSelected(false);
|
|
43
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
44
|
+
}, []);
|
|
45
|
+
var onDeleteVideo = (0, _react.useCallback)(function () {
|
|
46
|
+
var path = _slateReact.ReactEditor.findPath(editor, element);
|
|
47
|
+
_slate.Transforms.removeNodes(editor, {
|
|
48
|
+
at: path
|
|
49
|
+
});
|
|
50
|
+
(0, _core.focusEditor)(editor);
|
|
51
|
+
_slate.Transforms.select(editor, editor.selection);
|
|
52
|
+
}, [editor, element]);
|
|
53
|
+
var handleFullScreen = function handleFullScreen() {
|
|
54
|
+
var _videoRef$current;
|
|
55
|
+
setIsSelected(false);
|
|
56
|
+
(_videoRef$current = videoRef.current) === null || _videoRef$current === void 0 ? void 0 : _videoRef$current.requestFullscreen();
|
|
57
|
+
};
|
|
58
|
+
return /*#__PURE__*/_react["default"].createElement(_commons.ElementPopover, null, /*#__PURE__*/_react["default"].createElement("div", {
|
|
59
|
+
className: "video-hover-menu-container",
|
|
60
|
+
style: menuPosition
|
|
61
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
62
|
+
className: "hover-menu-container"
|
|
63
|
+
}, !readOnly && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("span", {
|
|
64
|
+
className: "op-group-item"
|
|
65
|
+
}, /*#__PURE__*/_react["default"].createElement("span", {
|
|
66
|
+
id: "sdoc_video_copy",
|
|
67
|
+
role: "button",
|
|
68
|
+
className: "op-item",
|
|
69
|
+
onClick: onCopy
|
|
70
|
+
}, /*#__PURE__*/_react["default"].createElement("i", {
|
|
71
|
+
className: "sdocfont sdoc-copy icon-font"
|
|
72
|
+
})), isShowTooltip && /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
|
|
73
|
+
target: "sdoc_video_copy",
|
|
74
|
+
placement: "top",
|
|
75
|
+
fade: true
|
|
76
|
+
}, t('Copy')), /*#__PURE__*/_react["default"].createElement("span", {
|
|
77
|
+
id: "sdoc_video_delete",
|
|
78
|
+
role: "button",
|
|
79
|
+
className: "op-item",
|
|
80
|
+
onClick: onDeleteVideo
|
|
81
|
+
}, /*#__PURE__*/_react["default"].createElement("i", {
|
|
82
|
+
className: "sdocfont sdoc-delete icon-font"
|
|
83
|
+
}), isShowTooltip && /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
|
|
84
|
+
target: "sdoc_video_delete",
|
|
85
|
+
placement: "top",
|
|
86
|
+
fade: true
|
|
87
|
+
}, t('Delete')))), /*#__PURE__*/_react["default"].createElement("span", {
|
|
88
|
+
className: "op-group-item"
|
|
89
|
+
}, /*#__PURE__*/_react["default"].createElement("span", {
|
|
90
|
+
id: "sdoc_video_full_screen_mode",
|
|
91
|
+
role: "button",
|
|
92
|
+
className: "op-item",
|
|
93
|
+
onClick: handleFullScreen
|
|
94
|
+
}, /*#__PURE__*/_react["default"].createElement("i", {
|
|
95
|
+
className: "sdocfont sdoc-fullscreen icon-font"
|
|
96
|
+
}), isShowTooltip && /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
|
|
97
|
+
target: "sdoc_video_full_screen_mode",
|
|
98
|
+
placement: "top",
|
|
99
|
+
fade: true
|
|
100
|
+
}, t('Full_screen_mode'))))))));
|
|
101
|
+
};
|
|
102
|
+
var _default = exports["default"] = (0, _reactI18next.withTranslation)('sdoc-editor')(VideoHoverMenu);
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports.renderVideo = renderVideo;
|
|
9
|
+
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createForOfIteratorHelper"));
|
|
9
10
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/defineProperty"));
|
|
10
11
|
var _objectSpread4 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
|
|
11
12
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
@@ -13,7 +14,9 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
13
14
|
var _reactI18next = require("react-i18next");
|
|
14
15
|
var _slate = require("@seafile/slate");
|
|
15
16
|
var _slateReact = require("@seafile/slate-react");
|
|
17
|
+
var _useScrollContext = require("../../../hooks/use-scroll-context");
|
|
16
18
|
var _helpers = require("./helpers");
|
|
19
|
+
var _hoverMenu = _interopRequireDefault(require("./hover-menu"));
|
|
17
20
|
require("./index.css");
|
|
18
21
|
var Video = function Video(_ref) {
|
|
19
22
|
var _videoStates$element$;
|
|
@@ -33,10 +36,15 @@ var Video = function Video(_ref) {
|
|
|
33
36
|
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
|
|
34
37
|
videoStates = _useState6[0],
|
|
35
38
|
setVideoStates = _useState6[1];
|
|
39
|
+
var _useState7 = (0, _react.useState)({}),
|
|
40
|
+
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
|
|
41
|
+
menuPosition = _useState8[0],
|
|
42
|
+
setMenuPosition = _useState8[1];
|
|
43
|
+
var scrollRef = (0, _useScrollContext.useScrollContext)();
|
|
36
44
|
var videoName = (data === null || data === void 0 ? void 0 : data.name) || (data === null || data === void 0 ? void 0 : data.src);
|
|
37
45
|
var videoSize = data === null || data === void 0 ? void 0 : data.size;
|
|
38
46
|
var isEmbeddableLink = data === null || data === void 0 ? void 0 : data.is_embeddable_link;
|
|
39
|
-
var
|
|
47
|
+
var readOnly = (0, _slateReact.useReadOnly)();
|
|
40
48
|
var handlePlay = function handlePlay() {
|
|
41
49
|
setVideoStates(function (prev) {
|
|
42
50
|
return (0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, prev), {}, (0, _defineProperty2["default"])({}, element.id, false));
|
|
@@ -63,6 +71,25 @@ var Video = function Video(_ref) {
|
|
|
63
71
|
setIsSelected(false);
|
|
64
72
|
}
|
|
65
73
|
}, []);
|
|
74
|
+
var setPosition = (0, _react.useCallback)(function (elem) {
|
|
75
|
+
if (elem) {
|
|
76
|
+
var _elem$getBoundingClie = elem.getBoundingClientRect(),
|
|
77
|
+
top = _elem$getBoundingClie.top,
|
|
78
|
+
left = _elem$getBoundingClie.left;
|
|
79
|
+
var menuTop = top - 42; // top = top distance - menu height
|
|
80
|
+
var menuLeft = left - 18; // left = left distance - (menu width / 2)
|
|
81
|
+
var newMenuPosition = {
|
|
82
|
+
top: menuTop,
|
|
83
|
+
left: menuLeft
|
|
84
|
+
};
|
|
85
|
+
setMenuPosition(newMenuPosition);
|
|
86
|
+
}
|
|
87
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
88
|
+
}, []);
|
|
89
|
+
var onScroll = (0, _react.useCallback)(function (e) {
|
|
90
|
+
setPosition(videoRef.current);
|
|
91
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
92
|
+
}, []);
|
|
66
93
|
(0, _react.useEffect)(function () {
|
|
67
94
|
var videoElement = videoRef.current;
|
|
68
95
|
if (videoElement) {
|
|
@@ -76,6 +103,42 @@ var Video = function Video(_ref) {
|
|
|
76
103
|
document.removeEventListener('click', onClickOutside);
|
|
77
104
|
};
|
|
78
105
|
}, [onClickOutside]);
|
|
106
|
+
(0, _react.useEffect)(function () {
|
|
107
|
+
var observerRefValue = null;
|
|
108
|
+
var resizeObserver = null;
|
|
109
|
+
if (isSelected) {
|
|
110
|
+
scrollRef.current && scrollRef.current.addEventListener('scroll', onScroll);
|
|
111
|
+
observerRefValue = scrollRef.current;
|
|
112
|
+
resizeObserver = new ResizeObserver(function (entries) {
|
|
113
|
+
var _iterator = (0, _createForOfIteratorHelper2["default"])(entries),
|
|
114
|
+
_step;
|
|
115
|
+
try {
|
|
116
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
117
|
+
var entry = _step.value;
|
|
118
|
+
if (resizeObserver) {
|
|
119
|
+
onScroll();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
} catch (err) {
|
|
123
|
+
_iterator.e(err);
|
|
124
|
+
} finally {
|
|
125
|
+
_iterator.f();
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
resizeObserver.observe(scrollRef.current);
|
|
129
|
+
} else {
|
|
130
|
+
scrollRef.current && scrollRef.current.removeEventListener('scroll', onScroll);
|
|
131
|
+
}
|
|
132
|
+
return function () {
|
|
133
|
+
if (observerRefValue) {
|
|
134
|
+
observerRefValue.removeEventListener('scroll', onScroll);
|
|
135
|
+
}
|
|
136
|
+
if (resizeObserver) {
|
|
137
|
+
resizeObserver.disconnect();
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
141
|
+
}, [isSelected]);
|
|
79
142
|
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !isLoaded && /*#__PURE__*/_react["default"].createElement("div", {
|
|
80
143
|
className: "video-loading-placeholder"
|
|
81
144
|
}, /*#__PURE__*/_react["default"].createElement("img", {
|
|
@@ -106,7 +169,7 @@ var Video = function Video(_ref) {
|
|
|
106
169
|
ref: videoRef,
|
|
107
170
|
src: (0, _helpers.getVideoURL)(data, editor),
|
|
108
171
|
controls: true,
|
|
109
|
-
controlsList:
|
|
172
|
+
controlsList: readOnly ? 'nofullscreen' : undefined,
|
|
110
173
|
onClick: onClickVideo,
|
|
111
174
|
draggable: false,
|
|
112
175
|
onPlay: handlePlay,
|
|
@@ -133,7 +196,13 @@ var Video = function Video(_ref) {
|
|
|
133
196
|
height: '100%',
|
|
134
197
|
border: 'none'
|
|
135
198
|
}
|
|
136
|
-
}))))
|
|
199
|
+
}))), isSelected && !isEmbeddableLink && !readOnly && editor.selection && _slate.Range.isCollapsed(editor.selection) && /*#__PURE__*/_react["default"].createElement(_hoverMenu["default"], {
|
|
200
|
+
editor: editor,
|
|
201
|
+
menuPosition: menuPosition,
|
|
202
|
+
element: element,
|
|
203
|
+
videoRef: videoRef,
|
|
204
|
+
setIsSelected: setIsSelected
|
|
205
|
+
}));
|
|
137
206
|
};
|
|
138
207
|
var SdocVideo = (0, _reactI18next.withTranslation)('sdoc-editor')(Video);
|
|
139
208
|
function renderVideo(props, editor) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.192",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "jest",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"publishConfig": {
|
|
72
72
|
"access": "public"
|
|
73
73
|
},
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "f693ae4b928675528ce40a396618c458f9316a45"
|
|
75
75
|
}
|