@seafile/sdoc-editor 2.0.191 → 2.0.193

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.
@@ -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.includes(newFileType);
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 readonly = (0, _slateReact.useReadOnly)();
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: readonly && 'nofullscreen',
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) {
@@ -167,6 +167,7 @@ var SideToolbar = function SideToolbar() {
167
167
  }, [editor, isShowSideMenu, scrollRef, sidePosition.top]);
168
168
  var onMouseDown = (0, _react.useCallback)(function (e) {
169
169
  e.stopPropagation();
170
+ if (!editor.selection) (0, _helpers2.setSelection)(editor, slateNode);
170
171
  var domSelection = window.getSelection();
171
172
  if (domSelection.type !== 'Range' || !editor.selection || _slate.Path.equals(editor.selection.focus.path, editor.selection.anchor.path)) {
172
173
  draggedPreviewContainer.current = null;
@@ -238,7 +239,7 @@ var SideToolbar = function SideToolbar() {
238
239
  draggedSourcePaths.current = null;
239
240
  }
240
241
  }
241
- }, [editor]);
242
+ }, [editor, slateNode]);
242
243
  var onShowSideMenuToggle = (0, _react.useCallback)(function () {
243
244
  (0, _helpers2.setSelection)(editor, slateNode);
244
245
  var _menuRef$current$getB = menuRef.current.getBoundingClientRect(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "2.0.191",
3
+ "version": "2.0.193",
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": "c558ebae65cc4325ebc6ad0d4989ae889d4f420d"
74
+ "gitHead": "ee833b5b8307c8dfa1f669faf7bd1385f60fc7c7"
75
75
  }