@seafile/sdoc-editor 3.0.38 → 3.0.40
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 +10 -0
- package/dist/assets/css/sdoc-editor-plugins.css +30 -0
- package/dist/context.js +6 -0
- package/dist/extension/plugins/file-view/rename/index.css +25 -0
- package/dist/extension/plugins/file-view/rename/index.js +113 -0
- package/dist/extension/plugins/file-view/render-elem/index.css +3 -6
- package/dist/extension/plugins/file-view/render-elem/index.js +16 -1
- package/dist/extension/plugins/list/render-elem.js +25 -1
- package/dist/extension/plugins/video/helpers.js +13 -2
- package/dist/extension/plugins/video/index.css +13 -7
- package/dist/extension/plugins/video/render-elem.js +109 -16
- package/package.json +2 -2
package/dist/api/seafile-api.js
CHANGED
|
@@ -331,6 +331,16 @@ var SeafileAPI = /*#__PURE__*/function () {
|
|
|
331
331
|
form.append('view_id', viewId);
|
|
332
332
|
return this.req.post(url, form);
|
|
333
333
|
}
|
|
334
|
+
}, {
|
|
335
|
+
key: "modifyView",
|
|
336
|
+
value: function modifyView(wikiId, viewId, viewData) {
|
|
337
|
+
var url = '/api/v2.1/wiki2/' + wikiId + '/views/';
|
|
338
|
+
var data = {
|
|
339
|
+
view_id: viewId,
|
|
340
|
+
view_data: viewData
|
|
341
|
+
};
|
|
342
|
+
return this.req.put(url, data);
|
|
343
|
+
}
|
|
334
344
|
}]);
|
|
335
345
|
}();
|
|
336
346
|
var _default = exports["default"] = SeafileAPI;
|
|
@@ -32,6 +32,36 @@
|
|
|
32
32
|
font-weight: bold;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
.sdoc-editor__article .list-container li {
|
|
36
|
+
position: relative;
|
|
37
|
+
padding-left: 8px !important;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.sdoc-editor__article .list-container .sdoc-li-control {
|
|
41
|
+
user-select: none;
|
|
42
|
+
cursor: pointer;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.sdoc-editor__article .list-container .sdoc-li-prefix {
|
|
46
|
+
font-size: 12px;
|
|
47
|
+
color: #666;
|
|
48
|
+
position: absolute;
|
|
49
|
+
left: -32px;
|
|
50
|
+
top: 7px;
|
|
51
|
+
cursor: pointer;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.sdoc-editor__article .list-container .sdoc-li-divider {
|
|
55
|
+
width: 1px;
|
|
56
|
+
height: calc(100% - 38px);
|
|
57
|
+
background-color: #ccc;
|
|
58
|
+
position: absolute;
|
|
59
|
+
left: -12px;
|
|
60
|
+
top: 28px;
|
|
61
|
+
user-select: none;
|
|
62
|
+
pointer-events: none;
|
|
63
|
+
}
|
|
64
|
+
|
|
35
65
|
/* check list */
|
|
36
66
|
.sdoc-editor__article .sdoc-checkbox-container {
|
|
37
67
|
padding: 0px 2px;
|
package/dist/context.js
CHANGED
|
@@ -432,6 +432,12 @@ var Context = /*#__PURE__*/function () {
|
|
|
432
432
|
var docUuid = this.getSetting('docUuid');
|
|
433
433
|
return this.api.duplicateWikiView(wikiId, docUuid, viewId);
|
|
434
434
|
}
|
|
435
|
+
}, {
|
|
436
|
+
key: "modifyView",
|
|
437
|
+
value: function modifyView(viewId, viewData) {
|
|
438
|
+
var wikiId = this.getSetting('wikiId');
|
|
439
|
+
return this.api.modifyView(wikiId, viewId, viewData);
|
|
440
|
+
}
|
|
435
441
|
}]);
|
|
436
442
|
}();
|
|
437
443
|
var context = new Context();
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
.sdoc-file-view-rename {
|
|
2
|
+
max-width: 100%;
|
|
3
|
+
width: 100%;
|
|
4
|
+
white-space: nowrap;
|
|
5
|
+
word-break: break-word;
|
|
6
|
+
caret-color: var(--c-texPri);
|
|
7
|
+
min-width: 0px;
|
|
8
|
+
flex: 1 1 0%;
|
|
9
|
+
overflow: auto;
|
|
10
|
+
font-weight: 700;
|
|
11
|
+
font-size: 22px;
|
|
12
|
+
margin-inline-end: 4px;
|
|
13
|
+
scrollbar-width: none;
|
|
14
|
+
height: 48px;
|
|
15
|
+
line-height: 48px;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.sdoc-file-view-rename input {
|
|
19
|
+
border-width: 0;
|
|
20
|
+
padding: 0;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.sdoc-file-view-rename input:focus-visible {
|
|
24
|
+
outline: none;
|
|
25
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
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 _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/classCallCheck"));
|
|
9
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createClass"));
|
|
10
|
+
var _callSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/callSuper"));
|
|
11
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/inherits"));
|
|
12
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/defineProperty"));
|
|
13
|
+
var _react = _interopRequireDefault(require("react"));
|
|
14
|
+
var _reactI18next = require("react-i18next");
|
|
15
|
+
var _toast = _interopRequireDefault(require("../../../../components/toast"));
|
|
16
|
+
var _keyCodes = _interopRequireDefault(require("../../../../constants/key-codes"));
|
|
17
|
+
require("./index.css");
|
|
18
|
+
var Rename = /*#__PURE__*/function (_React$Component) {
|
|
19
|
+
function Rename(props) {
|
|
20
|
+
var _this;
|
|
21
|
+
(0, _classCallCheck2["default"])(this, Rename);
|
|
22
|
+
_this = (0, _callSuper2["default"])(this, Rename, [props]);
|
|
23
|
+
(0, _defineProperty2["default"])(_this, "registerEventHandle", function () {
|
|
24
|
+
document.addEventListener('click', _this.onOutClick);
|
|
25
|
+
});
|
|
26
|
+
(0, _defineProperty2["default"])(_this, "onOutClick", function (event) {
|
|
27
|
+
if (!_this.inputRef.current.contains(event.target)) {
|
|
28
|
+
_this.onRenameConfirm();
|
|
29
|
+
document.removeEventListener('click', _this.onOutClick);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
(0, _defineProperty2["default"])(_this, "onClick", function (e) {
|
|
33
|
+
e.stopPropagation();
|
|
34
|
+
e.nativeEvent.stopImmediatePropagation();
|
|
35
|
+
_this.registerEventHandle();
|
|
36
|
+
});
|
|
37
|
+
(0, _defineProperty2["default"])(_this, "onChange", function (e) {
|
|
38
|
+
_this.setState({
|
|
39
|
+
name: e.target.value
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
(0, _defineProperty2["default"])(_this, "onKeyDown", function (e) {
|
|
43
|
+
if (e.keyCode === _keyCodes["default"].Enter) {
|
|
44
|
+
_this.onRenameConfirm(e);
|
|
45
|
+
} else if (e.keyCode === _keyCodes["default"].Esc) {
|
|
46
|
+
_this.onRenameCancel(e);
|
|
47
|
+
}
|
|
48
|
+
e.nativeEvent.stopImmediatePropagation();
|
|
49
|
+
});
|
|
50
|
+
(0, _defineProperty2["default"])(_this, "onRenameConfirm", function (e) {
|
|
51
|
+
e && e.nativeEvent.stopImmediatePropagation();
|
|
52
|
+
var newName = _this.state.name.trim();
|
|
53
|
+
if (newName === _this.props.name) {
|
|
54
|
+
_this.props.onRenameCancel();
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
var _this$validateInput = _this.validateInput(),
|
|
58
|
+
isValid = _this$validateInput.isValid,
|
|
59
|
+
errMessage = _this$validateInput.errMessage;
|
|
60
|
+
if (!isValid) {
|
|
61
|
+
_toast["default"].danger(errMessage);
|
|
62
|
+
_this.props.onRenameCancel();
|
|
63
|
+
} else {
|
|
64
|
+
_this.props.onRenameConfirm(newName);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
(0, _defineProperty2["default"])(_this, "onRenameCancel", function (e) {
|
|
68
|
+
document.removeEventListener('click', _this.onOutClick);
|
|
69
|
+
e.nativeEvent.stopImmediatePropagation();
|
|
70
|
+
_this.props.onRenameCancel();
|
|
71
|
+
});
|
|
72
|
+
(0, _defineProperty2["default"])(_this, "validateInput", function () {
|
|
73
|
+
var t = _this.props.t;
|
|
74
|
+
var newName = _this.state.name.trim();
|
|
75
|
+
var isValid = true;
|
|
76
|
+
var errMessage = '';
|
|
77
|
+
if (newName.indexOf('/') > -1) {
|
|
78
|
+
isValid = false;
|
|
79
|
+
// eslint-disable-next-line no-useless-concat
|
|
80
|
+
errMessage = t('Name should not include ' + '\'/\'' + '.');
|
|
81
|
+
return {
|
|
82
|
+
isValid: isValid,
|
|
83
|
+
errMessage: errMessage
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
isValid: isValid,
|
|
88
|
+
errMessage: errMessage
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
_this.state = {
|
|
92
|
+
name: props.name
|
|
93
|
+
};
|
|
94
|
+
_this.inputRef = /*#__PURE__*/_react["default"].createRef();
|
|
95
|
+
return _this;
|
|
96
|
+
}
|
|
97
|
+
(0, _inherits2["default"])(Rename, _React$Component);
|
|
98
|
+
return (0, _createClass2["default"])(Rename, [{
|
|
99
|
+
key: "render",
|
|
100
|
+
value: function render() {
|
|
101
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
102
|
+
className: "sdoc-file-view-rename"
|
|
103
|
+
}, /*#__PURE__*/_react["default"].createElement("input", {
|
|
104
|
+
ref: this.inputRef,
|
|
105
|
+
value: this.state.name,
|
|
106
|
+
onChange: this.onChange,
|
|
107
|
+
onKeyDown: this.onKeyDown,
|
|
108
|
+
onClick: this.onClick
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
}]);
|
|
112
|
+
}(_react["default"].Component);
|
|
113
|
+
var _default = exports["default"] = (0, _reactI18next.withTranslation)('sdoc-editor')(Rename);
|
|
@@ -6,15 +6,12 @@
|
|
|
6
6
|
|
|
7
7
|
.sdoc-file-view-container .sdoc-file-view-title {
|
|
8
8
|
position: absolute;
|
|
9
|
-
height:
|
|
10
|
-
line-height:
|
|
11
|
-
top:
|
|
9
|
+
height: 48px;
|
|
10
|
+
line-height: 48px;
|
|
11
|
+
top: 2px;
|
|
12
12
|
left: 0px;
|
|
13
13
|
z-index: 10;
|
|
14
|
-
height: 44px;
|
|
15
|
-
line-height: 44px;
|
|
16
14
|
margin-left: 16px;
|
|
17
|
-
cursor: pointer;
|
|
18
15
|
}
|
|
19
16
|
|
|
20
17
|
.sdoc-file-view-container .sdoc-file-view-content {
|
|
@@ -19,6 +19,7 @@ var _commonUtils = require("../../../../utils/common-utils");
|
|
|
19
19
|
var _localStorageUtils = _interopRequireDefault(require("../../../../utils/local-storage-utils"));
|
|
20
20
|
var _constants = require("../../../constants");
|
|
21
21
|
var _helpers = require("../helpers");
|
|
22
|
+
var _rename = _interopRequireDefault(require("../rename"));
|
|
22
23
|
require("./index.css");
|
|
23
24
|
var FileView = function FileView(_ref) {
|
|
24
25
|
var element = _ref.element,
|
|
@@ -154,6 +155,16 @@ var FileView = function FileView(_ref) {
|
|
|
154
155
|
}
|
|
155
156
|
return null;
|
|
156
157
|
}, [data]);
|
|
158
|
+
var onNameCancel = (0, _react.useCallback)(function () {}, []);
|
|
159
|
+
var onRename = (0, _react.useCallback)(function (newName) {
|
|
160
|
+
var newData = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, element.data), {}, {
|
|
161
|
+
view_name: newName
|
|
162
|
+
});
|
|
163
|
+
(0, _helpers.updateFileView)(newData, editor, element);
|
|
164
|
+
|
|
165
|
+
// TODO:
|
|
166
|
+
// context.modifyView(data.view_id, { view_name: newName });
|
|
167
|
+
}, [editor, element]);
|
|
157
168
|
return /*#__PURE__*/_react["default"].createElement("div", Object.assign({
|
|
158
169
|
"data-id": element.id
|
|
159
170
|
}, attributes, {
|
|
@@ -162,7 +173,11 @@ var FileView = function FileView(_ref) {
|
|
|
162
173
|
suppressContentEditableWarning: true
|
|
163
174
|
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
164
175
|
className: "sdoc-file-view-title"
|
|
165
|
-
},
|
|
176
|
+
}, /*#__PURE__*/_react["default"].createElement(_rename["default"], {
|
|
177
|
+
name: data.view_name,
|
|
178
|
+
onRenameConfirm: onRename,
|
|
179
|
+
onRenameCancel: onNameCancel
|
|
180
|
+
})), /*#__PURE__*/_react["default"].createElement("div", {
|
|
166
181
|
className: (0, _classnames["default"])('sdoc-file-view-content', {
|
|
167
182
|
'is-selected': isSelected
|
|
168
183
|
}),
|
|
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.renderListLic = exports.renderListItem = exports.renderList = void 0;
|
|
8
8
|
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _slate = require("@seafile/slate");
|
|
10
|
+
var _slateReact = require("@seafile/slate-react");
|
|
9
11
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
10
12
|
var _constants = require("../../constants");
|
|
11
13
|
var renderList = exports.renderList = function renderList(props, editor) {
|
|
@@ -22,6 +24,7 @@ var renderListItem = exports.renderListItem = function renderListItem(props, edi
|
|
|
22
24
|
var attributes = props.attributes,
|
|
23
25
|
children = props.children,
|
|
24
26
|
element = props.element;
|
|
27
|
+
var collapsed = !!element.collapsed;
|
|
25
28
|
var align = element.children[0].align;
|
|
26
29
|
var className = '';
|
|
27
30
|
switch (align) {
|
|
@@ -37,13 +40,34 @@ var renderListItem = exports.renderListItem = function renderListItem(props, edi
|
|
|
37
40
|
var isBold = element.children[0].children.every(function (item) {
|
|
38
41
|
return item.bold === true;
|
|
39
42
|
});
|
|
43
|
+
var togglePrefix = function togglePrefix(e) {
|
|
44
|
+
e.preventDefault();
|
|
45
|
+
e.stopPropagation();
|
|
46
|
+
var path = _slateReact.ReactEditor.findPath(editor, element);
|
|
47
|
+
_slate.Transforms.setNodes(editor, {
|
|
48
|
+
collapsed: !collapsed
|
|
49
|
+
}, {
|
|
50
|
+
at: path
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
var newChildren = !collapsed ? children : children[0];
|
|
40
54
|
return /*#__PURE__*/_react["default"].createElement("li", Object.assign({
|
|
41
55
|
"data-id": element.id
|
|
42
56
|
}, attributes, {
|
|
43
57
|
className: (0, _classnames["default"])(className, {
|
|
44
58
|
'sdoc-li-bold': isBold
|
|
45
59
|
})
|
|
46
|
-
}), children
|
|
60
|
+
}), element.children.length > 1 && /*#__PURE__*/_react["default"].createElement("span", {
|
|
61
|
+
className: "sdoc-li-control",
|
|
62
|
+
contentEditable: "false"
|
|
63
|
+
}, /*#__PURE__*/_react["default"].createElement("span", {
|
|
64
|
+
className: (0, _classnames["default"])('sdoc-li-prefix', 'sdocfont', !collapsed ? 'sdoc-arrow-down' : 'sdoc-next-page'),
|
|
65
|
+
onMouseDown: togglePrefix
|
|
66
|
+
}), /*#__PURE__*/_react["default"].createElement("span", {
|
|
67
|
+
className: "sdoc-li-divider"
|
|
68
|
+
})), /*#__PURE__*/_react["default"].createElement("span", {
|
|
69
|
+
className: "sdoc-li-content"
|
|
70
|
+
}, newChildren));
|
|
47
71
|
};
|
|
48
72
|
var renderListLic = exports.renderListLic = function renderListLic(props, editor) {
|
|
49
73
|
var attributes = props.attributes,
|
|
@@ -4,7 +4,7 @@ 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.onCopyVideoNode = exports.isInsertVideoMenuDisabled = exports.insertVideo = exports.getVideoURL = exports.generateVideoNode = exports.formatFileSize = void 0;
|
|
7
|
+
exports.videoFileIcon = exports.updateVideo = 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");
|
|
@@ -81,7 +81,7 @@ var parseVideoLink = exports.parseVideoLink = function parseVideoLink(url) {
|
|
|
81
81
|
// Bilibili url conversion
|
|
82
82
|
if (url.includes('bilibili.com')) {
|
|
83
83
|
var _vidMatch = url.match(/\/video\/(BV[0-9A-Za-z]+)/);
|
|
84
|
-
var _videoUrl2 = _vidMatch !== null && _vidMatch !== void 0 && _vidMatch[1] ? "https://player.bilibili.com/player.html?bvid=".concat(_vidMatch[1]) : false;
|
|
84
|
+
var _videoUrl2 = _vidMatch !== null && _vidMatch !== void 0 && _vidMatch[1] ? "https://player.bilibili.com/player.html?bvid=".concat(_vidMatch[1], "&autoplay=0") : false;
|
|
85
85
|
return _videoUrl2;
|
|
86
86
|
}
|
|
87
87
|
|
|
@@ -219,4 +219,15 @@ var onCopyVideoNode = exports.onCopyVideoNode = function onCopyVideoNode(editor,
|
|
|
219
219
|
});
|
|
220
220
|
}
|
|
221
221
|
});
|
|
222
|
+
};
|
|
223
|
+
var updateVideo = exports.updateVideo = function updateVideo(editor, data, id) {
|
|
224
|
+
_slate.Transforms.setNodes(editor, {
|
|
225
|
+
data: data
|
|
226
|
+
}, {
|
|
227
|
+
match: function match(n) {
|
|
228
|
+
return (0, _core.getNodeType)(n) === _constants.VIDEO && n.id === id;
|
|
229
|
+
},
|
|
230
|
+
at: editor.selection,
|
|
231
|
+
voids: true
|
|
232
|
+
});
|
|
222
233
|
};
|
|
@@ -35,16 +35,19 @@
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
@keyframes spin {
|
|
38
|
-
0% {
|
|
39
|
-
|
|
40
|
-
}
|
|
38
|
+
0% {
|
|
39
|
+
transform: rotate(0deg);
|
|
40
|
+
}
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
100% {
|
|
43
|
+
transform: rotate(360deg);
|
|
44
|
+
}
|
|
44
45
|
}
|
|
46
|
+
|
|
45
47
|
.sdoc-video-wrapper {
|
|
46
48
|
position: relative;
|
|
47
49
|
display: flex;
|
|
50
|
+
justify-content: center;
|
|
48
51
|
}
|
|
49
52
|
|
|
50
53
|
.sdoc-video-wrapper .sdoc-video-inner {
|
|
@@ -54,9 +57,10 @@
|
|
|
54
57
|
display: flex;
|
|
55
58
|
margin-top: 5px;
|
|
56
59
|
margin-bottom: 10px;
|
|
60
|
+
max-width: 100%;
|
|
57
61
|
}
|
|
58
62
|
|
|
59
|
-
.sdoc-video-inner .sdoc-video-element{
|
|
63
|
+
.sdoc-video-inner .sdoc-video-element {
|
|
60
64
|
width: 100%;
|
|
61
65
|
}
|
|
62
66
|
|
|
@@ -66,8 +70,10 @@
|
|
|
66
70
|
|
|
67
71
|
.sdoc-video-inner .sdoc-video-play {
|
|
68
72
|
position: absolute;
|
|
69
|
-
top:
|
|
73
|
+
top: 50%;
|
|
74
|
+
transform: translateY(-50%);
|
|
70
75
|
left: 46.3%;
|
|
71
76
|
font-size: 48px;
|
|
72
77
|
pointer-events: none;
|
|
78
|
+
color: #666666;
|
|
73
79
|
}
|
|
@@ -19,11 +19,15 @@ var _helpers = require("./helpers");
|
|
|
19
19
|
var _hoverMenu = _interopRequireDefault(require("./hover-menu"));
|
|
20
20
|
require("./index.css");
|
|
21
21
|
var Video = function Video(_ref) {
|
|
22
|
-
var _videoStates$element
|
|
22
|
+
var _videoStates$element$, _videoRef$current;
|
|
23
23
|
var element = _ref.element,
|
|
24
24
|
editor = _ref.editor;
|
|
25
25
|
var data = element.data;
|
|
26
26
|
var videoRef = (0, _react.useRef)(null);
|
|
27
|
+
var wrapperRef = (0, _react.useRef)(null);
|
|
28
|
+
var resizerRef = (0, _react.useRef)(null);
|
|
29
|
+
var resizeStartXRef = (0, _react.useRef)(0);
|
|
30
|
+
var resizeStartWidthRef = (0, _react.useRef)(0);
|
|
27
31
|
var _useState = (0, _react.useState)(false),
|
|
28
32
|
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
29
33
|
isLoaded = _useState2[0],
|
|
@@ -40,11 +44,21 @@ var Video = function Video(_ref) {
|
|
|
40
44
|
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
|
|
41
45
|
menuPosition = _useState8[0],
|
|
42
46
|
setMenuPosition = _useState8[1];
|
|
47
|
+
var _useState9 = (0, _react.useState)(false),
|
|
48
|
+
_useState0 = (0, _slicedToArray2["default"])(_useState9, 2),
|
|
49
|
+
isResizing = _useState0[0],
|
|
50
|
+
setIsResizing = _useState0[1];
|
|
51
|
+
var _useState1 = (0, _react.useState)(null),
|
|
52
|
+
_useState10 = (0, _slicedToArray2["default"])(_useState1, 2),
|
|
53
|
+
movingWidth = _useState10[0],
|
|
54
|
+
setMovingWidth = _useState10[1];
|
|
43
55
|
var scrollRef = (0, _useScrollContext.useScrollContext)();
|
|
44
56
|
var videoName = (data === null || data === void 0 ? void 0 : data.name) || (data === null || data === void 0 ? void 0 : data.src);
|
|
45
57
|
var videoSize = data === null || data === void 0 ? void 0 : data.size;
|
|
46
58
|
var isEmbeddableLink = data === null || data === void 0 ? void 0 : data.is_embeddable_link;
|
|
47
59
|
var readOnly = (0, _slateReact.useReadOnly)();
|
|
60
|
+
var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
|
|
61
|
+
t = _useTranslation.t;
|
|
48
62
|
var handlePlay = function handlePlay() {
|
|
49
63
|
setVideoStates(function (prev) {
|
|
50
64
|
return (0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, prev), {}, (0, _defineProperty2["default"])({}, element.id, false));
|
|
@@ -65,12 +79,6 @@ var Video = function Video(_ref) {
|
|
|
65
79
|
_slate.Transforms.select(editor, path);
|
|
66
80
|
setIsSelected(true);
|
|
67
81
|
}, [editor, element]);
|
|
68
|
-
var onClickOutside = (0, _react.useCallback)(function (e) {
|
|
69
|
-
e.stopPropagation();
|
|
70
|
-
if (videoRef.current && !videoRef.current.contains(e.target)) {
|
|
71
|
-
setIsSelected(false);
|
|
72
|
-
}
|
|
73
|
-
}, []);
|
|
74
82
|
var setPosition = (0, _react.useCallback)(function (elem) {
|
|
75
83
|
if (elem) {
|
|
76
84
|
var _elem$getBoundingClie = elem.getBoundingClientRect(),
|
|
@@ -90,6 +98,81 @@ var Video = function Video(_ref) {
|
|
|
90
98
|
setPosition(videoRef.current);
|
|
91
99
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
92
100
|
}, []);
|
|
101
|
+
var getIframePointerEvents = (0, _react.useCallback)(function () {
|
|
102
|
+
if (readOnly) return 'auto';
|
|
103
|
+
if (isResizing) return 'none';
|
|
104
|
+
return isSelected ? 'auto' : 'none';
|
|
105
|
+
}, [isResizing, isSelected, readOnly]);
|
|
106
|
+
var getVideoWidthStyle = (0, _react.useCallback)(function () {
|
|
107
|
+
var videoWidth = movingWidth || element.data.width || '100%';
|
|
108
|
+
return {
|
|
109
|
+
width: videoWidth
|
|
110
|
+
};
|
|
111
|
+
}, [element.data.width, movingWidth]);
|
|
112
|
+
var registerEvent = (0, _react.useCallback)(function (eventList) {
|
|
113
|
+
eventList.forEach(function (element) {
|
|
114
|
+
document.addEventListener(element.eventName, element.event);
|
|
115
|
+
});
|
|
116
|
+
}, []);
|
|
117
|
+
var unregisterEvent = (0, _react.useCallback)(function (eventList) {
|
|
118
|
+
eventList.forEach(function (element) {
|
|
119
|
+
document.removeEventListener(element.eventName, element.event);
|
|
120
|
+
});
|
|
121
|
+
}, []);
|
|
122
|
+
var onMouseMove = (0, _react.useCallback)(function (event) {
|
|
123
|
+
var deltaX = event.clientX - resizeStartXRef.current;
|
|
124
|
+
var nextWidth = resizeStartWidthRef.current + deltaX;
|
|
125
|
+
if (nextWidth < 150) return;
|
|
126
|
+
if (wrapperRef.current) {
|
|
127
|
+
wrapperRef.current.style.width = "".concat(nextWidth, "px");
|
|
128
|
+
}
|
|
129
|
+
setMovingWidth(nextWidth);
|
|
130
|
+
}, []);
|
|
131
|
+
var onResizeEnd = (0, _react.useCallback)(function (event) {
|
|
132
|
+
var _wrapperRef$current;
|
|
133
|
+
event === null || event === void 0 ? void 0 : event.preventDefault();
|
|
134
|
+
event === null || event === void 0 ? void 0 : event.stopPropagation();
|
|
135
|
+
unregisterEvent([{
|
|
136
|
+
eventName: 'mousemove',
|
|
137
|
+
event: onMouseMove
|
|
138
|
+
}, {
|
|
139
|
+
eventName: 'mouseup',
|
|
140
|
+
event: onResizeEnd
|
|
141
|
+
}]);
|
|
142
|
+
var finalWidth = movingWidth || ((_wrapperRef$current = wrapperRef.current) === null || _wrapperRef$current === void 0 ? void 0 : _wrapperRef$current.getBoundingClientRect().width);
|
|
143
|
+
var newData = (0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, element.data), {}, {
|
|
144
|
+
width: finalWidth
|
|
145
|
+
});
|
|
146
|
+
(0, _helpers.updateVideo)(editor, newData, element.id);
|
|
147
|
+
setIsResizing(false);
|
|
148
|
+
setTimeout(function () {
|
|
149
|
+
return setPosition(wrapperRef.current);
|
|
150
|
+
}, 0);
|
|
151
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
152
|
+
}, [editor, element.id, movingWidth, onMouseMove, registerEvent]);
|
|
153
|
+
var onResizeStart = (0, _react.useCallback)(function (event) {
|
|
154
|
+
var _wrapperRef$current2;
|
|
155
|
+
event.preventDefault();
|
|
156
|
+
event.stopPropagation();
|
|
157
|
+
setMenuPosition(null);
|
|
158
|
+
setIsResizing(true);
|
|
159
|
+
resizeStartXRef.current = event.clientX;
|
|
160
|
+
resizeStartWidthRef.current = ((_wrapperRef$current2 = wrapperRef.current) === null || _wrapperRef$current2 === void 0 ? void 0 : _wrapperRef$current2.getBoundingClientRect().width) || element.data.width || 0;
|
|
161
|
+
registerEvent([{
|
|
162
|
+
eventName: 'mousemove',
|
|
163
|
+
event: onMouseMove
|
|
164
|
+
}, {
|
|
165
|
+
eventName: 'mouseup',
|
|
166
|
+
event: onResizeEnd
|
|
167
|
+
}]);
|
|
168
|
+
}, [element.data.width, onMouseMove, onResizeEnd, registerEvent]);
|
|
169
|
+
var onClickOutside = (0, _react.useCallback)(function (e) {
|
|
170
|
+
e.stopPropagation();
|
|
171
|
+
if (wrapperRef.current && !wrapperRef.current.contains(e.target)) {
|
|
172
|
+
onResizeEnd();
|
|
173
|
+
setIsSelected(false);
|
|
174
|
+
}
|
|
175
|
+
}, [onResizeEnd]);
|
|
93
176
|
(0, _react.useEffect)(function () {
|
|
94
177
|
var videoElement = videoRef.current;
|
|
95
178
|
if (videoElement) {
|
|
@@ -157,26 +240,28 @@ var Video = function Video(_ref) {
|
|
|
157
240
|
"data-id": element.id,
|
|
158
241
|
className: "sdoc-video-wrapper",
|
|
159
242
|
style: {
|
|
160
|
-
display: isLoaded ? '
|
|
243
|
+
display: isLoaded ? 'flex' : 'none'
|
|
161
244
|
}
|
|
162
245
|
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
163
246
|
className: "sdoc-video-inner",
|
|
164
|
-
|
|
247
|
+
ref: wrapperRef,
|
|
248
|
+
style: (0, _objectSpread4["default"])({
|
|
165
249
|
visibility: isLoaded ? 'visible' : 'hidden'
|
|
166
|
-
}
|
|
250
|
+
}, getVideoWidthStyle()),
|
|
251
|
+
onClick: onClickVideo
|
|
167
252
|
}, !isEmbeddableLink && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("video", {
|
|
168
253
|
className: "sdoc-video-element",
|
|
169
254
|
ref: videoRef,
|
|
170
255
|
src: (0, _helpers.getVideoURL)(data, editor),
|
|
171
256
|
controls: true,
|
|
172
257
|
controlsList: readOnly ? 'nofullscreen' : undefined,
|
|
173
|
-
onClick: onClickVideo,
|
|
174
258
|
draggable: false,
|
|
175
259
|
onPlay: handlePlay,
|
|
176
260
|
onPause: handlePause,
|
|
177
261
|
onCanPlay: handleVideoLoad,
|
|
178
262
|
style: {
|
|
179
|
-
boxShadow: isSelected ? '0 0 0 2px #007bff' : 'none'
|
|
263
|
+
boxShadow: isSelected ? '0 0 0 2px #007bff' : 'none',
|
|
264
|
+
pointerEvents: getIframePointerEvents()
|
|
180
265
|
}
|
|
181
266
|
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
182
267
|
className: "sdoc-video-play sdocfont sdoc-play",
|
|
@@ -186,17 +271,25 @@ var Video = function Video(_ref) {
|
|
|
186
271
|
contentEditable: "false"
|
|
187
272
|
})), isEmbeddableLink && /*#__PURE__*/_react["default"].createElement("iframe", {
|
|
188
273
|
className: "sdoc-video-element",
|
|
274
|
+
ref: videoRef,
|
|
189
275
|
title: data.src,
|
|
190
276
|
allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
|
|
191
277
|
allowFullScreen: true,
|
|
192
278
|
src: (0, _helpers.getVideoURL)(data, editor),
|
|
193
279
|
onLoad: handleVideoLoad,
|
|
194
280
|
style: {
|
|
195
|
-
width: '100%',
|
|
196
281
|
height: '100%',
|
|
197
|
-
border: 'none'
|
|
282
|
+
border: 'none',
|
|
283
|
+
boxShadow: isSelected ? '0 0 0 2px #007bff' : 'none',
|
|
284
|
+
pointerEvents: getIframePointerEvents()
|
|
198
285
|
}
|
|
199
|
-
})
|
|
286
|
+
}), !readOnly && isSelected && /*#__PURE__*/_react["default"].createElement("span", {
|
|
287
|
+
className: "image-resizer",
|
|
288
|
+
ref: resizerRef,
|
|
289
|
+
onMouseDown: onResizeStart
|
|
290
|
+
}), isResizing && /*#__PURE__*/_react["default"].createElement("span", {
|
|
291
|
+
className: "image-size"
|
|
292
|
+
}, /*#__PURE__*/_react["default"].createElement("span", null, t('Width'), ':', parseInt(movingWidth || ((_videoRef$current = videoRef.current) === null || _videoRef$current === void 0 ? void 0 : _videoRef$current.clientWidth))), /*#__PURE__*/_react["default"].createElement("span", null, "\xA0\xA0"), /*#__PURE__*/_react["default"].createElement("span", null, t('Height'), ':', videoRef.current.clientHeight)))), isSelected && !isEmbeddableLink && !readOnly && editor.selection && _slate.Range.isCollapsed(editor.selection) && /*#__PURE__*/_react["default"].createElement(_hoverMenu["default"], {
|
|
200
293
|
editor: editor,
|
|
201
294
|
menuPosition: menuPosition,
|
|
202
295
|
element: element,
|
|
@@ -210,7 +303,7 @@ function renderVideo(props, editor) {
|
|
|
210
303
|
children = props.children,
|
|
211
304
|
attributes = props.attributes;
|
|
212
305
|
return /*#__PURE__*/_react["default"].createElement("div", Object.assign({
|
|
213
|
-
className: "sdoc-video-wrapper"
|
|
306
|
+
className: "sdoc-video-outer-wrapper"
|
|
214
307
|
}, attributes, {
|
|
215
308
|
contentEditable: "true",
|
|
216
309
|
suppressContentEditableWarning: true
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.40",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "jest",
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"publishConfig": {
|
|
73
73
|
"access": "public"
|
|
74
74
|
},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "9b616f58a19029c6a345bcbb262068993e9b31a2"
|
|
76
76
|
}
|