@seafile/sdoc-editor 3.0.38 → 3.0.39

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.
@@ -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;
@@ -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% { transform: rotate(0deg); }
39
- 100% { transform: rotate(360deg); }
40
- }
38
+ 0% {
39
+ transform: rotate(0deg);
40
+ }
41
41
 
42
- .sdoc-video-wrapper{
43
- display: flex;
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: 36.75%;
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 ? 'block' : 'none'
243
+ display: isLoaded ? 'flex' : 'none'
161
244
  }
162
245
  }, /*#__PURE__*/_react["default"].createElement("div", {
163
246
  className: "sdoc-video-inner",
164
- style: {
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
- }))), isSelected && !isEmbeddableLink && !readOnly && editor.selection && _slate.Range.isCollapsed(editor.selection) && /*#__PURE__*/_react["default"].createElement(_hoverMenu["default"], {
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.38",
3
+ "version": "3.0.39",
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": "c89a3c31a2f1885ca2f237d98f70affbd8981102"
75
+ "gitHead": "8d184c224586d5b7a253f40d2fa2c680f8c46d53"
76
76
  }