@seafile/sdoc-editor 2.0.123 → 2.0.124-test-0.0.4

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.
@@ -186,6 +186,7 @@
186
186
  padding: 8px 0;
187
187
  }
188
188
 
189
+ .sdoc-insert-whiteboard-menu-popover-container,
189
190
  .sdoc-insert-video-menu-popover-container {
190
191
  padding: 8px 0;
191
192
  }
@@ -74,7 +74,9 @@ var INTERNAL_EVENT = exports.INTERNAL_EVENT = {
74
74
  TOGGLE_PRESENTATION_MODE: 'toggle_presentation_mode',
75
75
  CREATE_SDOC_FILE: 'create_sdoc_file',
76
76
  CREATE_WIKI_PAGE: 'create_wiki_page',
77
- IMAGE_COLUMN_TOGGLE: 'Image_column_toggle'
77
+ IMAGE_COLUMN_TOGGLE: 'Image_column_toggle',
78
+ CREATE_WHITEBOARD_FILE: 'create_whiteboard_file',
79
+ TLDRAW_EDITOR: 'tldraw_editor'
78
80
  };
79
81
  var PAGE_EDIT_AREA_WIDTH = exports.PAGE_EDIT_AREA_WIDTH = 672; // 672 = 794 - 2[borderLeft + borderRight] - 120[paddingLeft + paddingRight]
80
82
  var COMMENT_EDITOR_EDIT_AREA_WIDTH = exports.COMMENT_EDITOR_EDIT_AREA_WIDTH = 364;
@@ -8,13 +8,18 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports["default"] = void 0;
9
9
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
10
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
11
+ var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/regeneratorRuntime"));
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/asyncToGenerator"));
11
13
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
12
14
  var _react = _interopRequireWildcard(require("react"));
15
+ var _reactI18next = require("react-i18next");
13
16
  var _slate = require("@seafile/slate");
14
17
  var _deepCopy = _interopRequireDefault(require("deep-copy"));
18
+ var _notificationHooks = require("../comment/hooks/notification-hooks");
15
19
  var _fileLoading = _interopRequireDefault(require("../components/file-loading"));
20
+ var _toast = _interopRequireDefault(require("../components/toast"));
16
21
  var _constants = require("../constants");
17
- var _context = _interopRequireDefault(require("../context"));
22
+ var _context2 = _interopRequireDefault(require("../context"));
18
23
  var _extension = require("../extension");
19
24
  var _core = require("../extension/core");
20
25
  var _commentEditorToolbar = _interopRequireDefault(require("../extension/toolbar/comment-editor-toolbar"));
@@ -23,6 +28,8 @@ var _useScrollContext = require("../hooks/use-scroll-context");
23
28
  var _layout = require("../layout");
24
29
  var _nodeId = _interopRequireDefault(require("../node-id"));
25
30
  var _socket = require("../socket");
31
+ var _commonUtils = require("../utils/common-utils");
32
+ var _eventBus = _interopRequireDefault(require("../utils/event-bus"));
26
33
  var _commentArticle = _interopRequireDefault(require("./comment-article"));
27
34
  var SdocCommentEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
28
35
  var propsEditor = _ref.editor,
@@ -37,10 +44,15 @@ var SdocCommentEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref)
37
44
  slateValue = _useState2[0],
38
45
  _setSlateValue = _useState2[1];
39
46
  var commentEditorContainerRef = (0, _react.useRef)(null);
47
+ var commentTimeoutRef = (0, _react.useRef)(null);
48
+ var _useNotificationConte = (0, _notificationHooks.useNotificationContext)(),
49
+ notificationsInfo = _useNotificationConte.notificationsInfo;
50
+ var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
51
+ t = _useTranslation.t;
40
52
  var validEditor = (0, _react.useMemo)(function () {
41
53
  if (propsEditor) return propsEditor;
42
54
  var defaultEditor = (0, _extension.createCommentEditor)();
43
- var editorConfig = _context["default"].getEditorConfig();
55
+ var editorConfig = _context2["default"].getEditorConfig();
44
56
  var newEditor = (0, _nodeId["default"])((0, _socket.withSocketIO)(defaultEditor, {
45
57
  document: document,
46
58
  config: editorConfig
@@ -52,6 +64,70 @@ var SdocCommentEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref)
52
64
  return newEditor;
53
65
  // eslint-disable-next-line react-hooks/exhaustive-deps
54
66
  }, []);
67
+ (0, _react.useEffect)(function () {
68
+ if (!(commentEditorContainerRef !== null && commentEditorContainerRef !== void 0 && commentEditorContainerRef.current)) return;
69
+ if (Object.keys(notificationsInfo.notifications_map || {}).length === 0) return;
70
+ if (!commentEditorContainerRef.current.closest('.global-comment-input-wrapper')) return;
71
+ var clearAllNotification = /*#__PURE__*/function () {
72
+ var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regeneratorRuntime2["default"])().mark(function _callee() {
73
+ var res, notifications, eventBus, errorMessage;
74
+ return (0, _regeneratorRuntime2["default"])().wrap(function _callee$(_context) {
75
+ while (1) switch (_context.prev = _context.next) {
76
+ case 0:
77
+ _context.prev = 0;
78
+ _context.next = 3;
79
+ return _context2["default"].readAllNotifications();
80
+ case 3:
81
+ _context.next = 5;
82
+ return _context2["default"].listUnseenNotifications();
83
+ case 5:
84
+ res = _context.sent;
85
+ notifications = res.data.notifications;
86
+ eventBus = _eventBus["default"].getInstance();
87
+ eventBus.dispatch(_constants.INTERNAL_EVENT.UNSEEN_NOTIFICATIONS_COUNT, notifications === null || notifications === void 0 ? void 0 : notifications.length);
88
+ eventBus.dispatch(_constants.INTERNAL_EVENT.NEW_NOTIFICATION);
89
+ eventBus.dispatch(_constants.INTERNAL_EVENT.CLEAR_NOTIFICATION);
90
+ _context.next = 17;
91
+ break;
92
+ case 13:
93
+ _context.prev = 13;
94
+ _context.t0 = _context["catch"](0);
95
+ errorMessage = (0, _commonUtils.getErrorMsg)(_context.t0);
96
+ _toast["default"].danger(t(errorMessage));
97
+ case 17:
98
+ case "end":
99
+ return _context.stop();
100
+ }
101
+ }, _callee, null, [[0, 13]]);
102
+ }));
103
+ return function clearAllNotification() {
104
+ return _ref2.apply(this, arguments);
105
+ };
106
+ }();
107
+ var el = commentEditorContainerRef && commentEditorContainerRef.current;
108
+
109
+ // Mark comment as read if focusing commentEditorContainerRef over 3s
110
+ var handleFocusIn = function handleFocusIn(e) {
111
+ commentTimeoutRef.current = setTimeout(function () {
112
+ clearAllNotification();
113
+ commentTimeoutRef.current = null;
114
+ }, 3000);
115
+ };
116
+ var handleBlur = function handleBlur() {
117
+ clearTimeout(commentTimeoutRef.current);
118
+ commentTimeoutRef.current = null;
119
+ };
120
+ el.addEventListener('focusin', handleFocusIn);
121
+ el.addEventListener('focusout', handleBlur);
122
+ return function () {
123
+ el.removeEventListener('focusin', handleFocusIn);
124
+ el.removeEventListener('focusout', handleBlur);
125
+ if (commentTimeoutRef.current) {
126
+ clearTimeout(commentTimeoutRef.current);
127
+ commentTimeoutRef.current = null;
128
+ }
129
+ };
130
+ }, [notificationsInfo]);
55
131
 
56
132
  // useMount: focus editor
57
133
  (0, _react.useEffect)(function () {
@@ -64,10 +64,14 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
64
64
  _useState16 = (0, _slicedToArray2["default"])(_useState15, 2),
65
65
  handleSubmit = _useState16[0],
66
66
  setHandleSubmit = _useState16[1];
67
- var _useState17 = (0, _react.useState)({}),
67
+ var _useState17 = (0, _react.useState)(null),
68
68
  _useState18 = (0, _slicedToArray2["default"])(_useState17, 2),
69
- data = _useState18[0],
70
- setData = _useState18[1];
69
+ insertWhiteboardFile = _useState18[0],
70
+ setInsertWhiteboardFile = _useState18[1];
71
+ var _useState19 = (0, _react.useState)({}),
72
+ _useState20 = (0, _slicedToArray2["default"])(_useState19, 2),
73
+ data = _useState20[0],
74
+ setData = _useState20[1];
71
75
  var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
72
76
  t = _useTranslation.t;
73
77
  var uploadLocalImageInputRef = (0, _react.useRef)();
@@ -121,6 +125,7 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
121
125
  insertFileLinkCallback = _ref2.insertFileLinkCallback,
122
126
  insertSdocFileLinkCallback = _ref2.insertSdocFileLinkCallback,
123
127
  insertVideo = _ref2.insertVideo,
128
+ insertWhiteboard = _ref2.insertWhiteboard,
124
129
  paramEditor = _ref2.editor,
125
130
  linkTitle = _ref2.linkTitle,
126
131
  handleSubmit = _ref2.handleSubmit,
@@ -133,6 +138,9 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
133
138
  insertSdocFileLinkCallback: insertSdocFileLinkCallback,
134
139
  insertFileLinkCallback: insertFileLinkCallback
135
140
  });
141
+ setInsertWhiteboardFile({
142
+ insertWhiteboard: insertWhiteboard
143
+ });
136
144
  setInsertVideoCallback({
137
145
  insertVideo: insertVideo
138
146
  });
@@ -159,6 +167,7 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
159
167
  setDialogType('');
160
168
  setInsertLinkCallback(null);
161
169
  setInsertVideoCallback(null);
170
+ setInsertWhiteboardFile(null);
162
171
  setValidEditor(null);
163
172
  setLinkTitle('');
164
173
  setData('');
@@ -206,6 +215,16 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
206
215
  };
207
216
  return /*#__PURE__*/_react["default"].createElement(_index5["default"], fileLinkProps);
208
217
  }
218
+ case _constants2.ELEMENT_TYPE.WHITEBOARD:
219
+ {
220
+ var whiteboardProps = {
221
+ editor: validEditor,
222
+ dialogType: dialogType,
223
+ insertWhiteboardFile: insertWhiteboardFile,
224
+ closeDialog: closeDialog
225
+ };
226
+ return /*#__PURE__*/_react["default"].createElement(_index5["default"], whiteboardProps);
227
+ }
209
228
  case _constants2.ELEMENT_TYPE.VIDEO:
210
229
  {
211
230
  var videoProps = {
@@ -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.parcelFileTypeIcon = exports.getSdocFileIcon = exports.getFileTypeIcon = exports.addDataToTree = void 0;
7
+ exports.whiteboardFileIcon = exports.parcelFileTypeIcon = exports.getSdocFileIcon = exports.getFileTypeIcon = exports.addDataToTree = void 0;
8
8
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
9
9
  var _context = _interopRequireDefault(require("../../../context"));
10
10
  var _constants = require("../../constants");
@@ -29,6 +29,10 @@ var getSdocFileIcon = exports.getSdocFileIcon = function getSdocFileIcon() {
29
29
  var server = _context["default"].getSetting('serviceUrl');
30
30
  return "".concat(server, "/media/img/file/256/sdoc.png");
31
31
  };
32
+ var whiteboardFileIcon = exports.whiteboardFileIcon = function whiteboardFileIcon() {
33
+ var server = _context["default"].getSetting('serviceUrl');
34
+ return "".concat(server, "/media/img/file/256/draw.png");
35
+ };
32
36
  var getFileTypeIcon = exports.getFileTypeIcon = function getFileTypeIcon(fileType) {
33
37
  var imgResource = ['css', 'draw', 'excel', 'md', 'music', 'pdf', 'pic', 'ppt', 'psd', 'sdoc', 'txt', 'video', 'zip', 'word'];
34
38
  if (imgResource.includes(fileType)) {
@@ -23,7 +23,8 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
23
23
  dialogType = _ref.dialogType,
24
24
  closeDialog = _ref.closeDialog,
25
25
  insertLinkCallback = _ref.insertLinkCallback,
26
- insertVideoCallback = _ref.insertVideoCallback;
26
+ insertVideoCallback = _ref.insertVideoCallback,
27
+ insertWhiteboardFile = _ref.insertWhiteboardFile;
27
28
  var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
28
29
  t = _useTranslation.t;
29
30
  var _useState = (0, _react.useState)(null),
@@ -53,6 +54,9 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
53
54
  case _constants.ELEMENT_TYPE.VIDEO:
54
55
  modalTitle = 'Select_video_file';
55
56
  break;
57
+ case _constants.ELEMENT_TYPE.WHITEBOARD:
58
+ modalTitle = 'Select_whiteboard_document';
59
+ break;
56
60
  default:
57
61
  break;
58
62
  }
@@ -60,11 +64,14 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
60
64
  setCurrentSelectedFile(fileInfo);
61
65
  }, []);
62
66
  var insertFile = (0, _react.useCallback)(function (fileInfo) {
67
+ console.log(1, fileInfo);
63
68
  var _ref2 = insertLinkCallback || {},
64
69
  insertFileLinkCallback = _ref2.insertFileLinkCallback,
65
70
  insertSdocFileLinkCallback = _ref2.insertSdocFileLinkCallback;
66
71
  var _ref3 = insertVideoCallback || {},
67
72
  insertVideo = _ref3.insertVideo;
73
+ var _ref4 = insertWhiteboardFile || {},
74
+ insertWhiteboard = _ref4.insertWhiteboard;
68
75
  switch (dialogType) {
69
76
  case _constants.ELEMENT_TYPE.FILE_LINK:
70
77
  insertFileLinkCallback && insertFileLinkCallback(editor, fileInfo.name, fileInfo.file_uuid);
@@ -82,10 +89,13 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
82
89
  name: fileInfo.name
83
90
  }], [encodedUrl]);
84
91
  break;
92
+ case _constants.ELEMENT_TYPE.WHITEBOARD:
93
+ insertWhiteboard && insertWhiteboard(editor, fileInfo.name, fileInfo.path);
94
+ break;
85
95
  default:
86
96
  break;
87
97
  }
88
- }, [insertLinkCallback, insertVideoCallback, dialogType, editor]);
98
+ }, [insertLinkCallback, insertVideoCallback, insertWhiteboardFile, dialogType, editor]);
89
99
  var onSubmit = (0, _react.useCallback)(function () {
90
100
  if (!currentSelectedFile) return;
91
101
  var file_uuid = currentSelectedFile.file_uuid;
@@ -98,6 +108,13 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
98
108
  return;
99
109
  }
100
110
 
111
+ // Insert whiteboard file in sdoc
112
+ if (dialogType === _constants.ELEMENT_TYPE.WHITEBOARD) {
113
+ insertFile(fileInfo);
114
+ closeDialog();
115
+ return;
116
+ }
117
+
101
118
  // File has no id
102
119
  if (!file_uuid || file_uuid === '') {
103
120
  _context["default"].getSdocLocalFileId(currentSelectedFile.path).then(function (res) {
@@ -36,6 +36,7 @@
36
36
  left: 0;
37
37
  }
38
38
 
39
+ .sdoc-file-icon-container .whiteboard-file-img,
39
40
  .sdoc-file-icon-container .video-file-img,
40
41
  .sdoc-file-icon-container .sdoc-file-img {
41
42
  position: absolute;
@@ -96,6 +97,7 @@
96
97
  white-space: nowrap;
97
98
  }
98
99
 
100
+ .sdoc-folder-container.sdoc-folder-search-results .sdoc-file-info .sdoc-file-icon-container .whiteboard-file-img,
99
101
  .sdoc-folder-container.sdoc-folder-search-results .sdoc-file-info .sdoc-file-icon-container .sdoc-file-img {
100
102
  width: 36px;
101
103
  height: 36px;
@@ -47,6 +47,7 @@ var LocalFiles = function LocalFiles(_ref) {
47
47
  _useState0 = (0, _slicedToArray2["default"])(_useState9, 2),
48
48
  isCurrentLibrary = _useState0[0],
49
49
  setIsCurrentLibrary = _useState0[1];
50
+ console.log(1, fileType);
50
51
  var collapsedFolder = (0, _react.useCallback)(function (data, indexId) {
51
52
  for (var i = 0; i < data.length; i++) {
52
53
  var _data$i;
@@ -160,6 +161,7 @@ var LocalFiles = function LocalFiles(_ref) {
160
161
  var type = item.type,
161
162
  indexId = item.indexId,
162
163
  name = item.name;
164
+ console.log(1, type, indexId, name, item);
163
165
  // Get file type icon
164
166
  var fileTypeIcon = (0, _helpers.parcelFileTypeIcon)(name);
165
167
  var result = (_item$fullpath = item.fullpath) === null || _item$fullpath === void 0 ? void 0 : _item$fullpath.split('/').filter(Boolean);
@@ -194,7 +196,7 @@ var LocalFiles = function LocalFiles(_ref) {
194
196
  className: "sdoc-folder-children"
195
197
  }, ((_item$children = item.children) === null || _item$children === void 0 ? void 0 : _item$children.length) === 0 && /*#__PURE__*/_react["default"].createElement("div", {
196
198
  className: "sdoc-folder-children-empty"
197
- }, "(".concat(t('Empty'), ")")), ((_item$children2 = item.children) === null || _item$children2 === void 0 ? void 0 : _item$children2.length) > 0 && renderFileTree(item.children))), ['file', 'video'].includes(type) && /*#__PURE__*/_react["default"].createElement("div", {
199
+ }, "(".concat(t('Empty'), ")")), ((_item$children2 = item.children) === null || _item$children2 === void 0 ? void 0 : _item$children2.length) > 0 && renderFileTree(item.children))), ['file', 'video', 'exdraw'].includes(type) && /*#__PURE__*/_react["default"].createElement("div", {
198
200
  className: (0, _classnames["default"])('sdoc-file-info', {
199
201
  'active': selected
200
202
  }),
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WIKI_LINK = exports.VIDEO_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.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.GROUP = 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 = exports.ASK_AI = void 0;
6
+ exports.WIKI_LINK = exports.WHITEBOARD = exports.VIDEO_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.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.GROUP = 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 = exports.ASK_AI = void 0;
7
7
  var BLOCKQUOTE = exports.BLOCKQUOTE = 'blockquote';
8
8
  var TITLE = exports.TITLE = 'title';
9
9
  var SUBTITLE = exports.SUBTITLE = 'subtitle';
@@ -43,6 +43,7 @@ var MENTION_TEMP = exports.MENTION_TEMP = 'mention_temp';
43
43
  var FILE_LINK_INSET_INPUT_TEMP = exports.FILE_LINK_INSET_INPUT_TEMP = 'file_link_insert_input_temp';
44
44
  var QUICK_INSERT = exports.QUICK_INSERT = 'quick_insert';
45
45
  var VIDEO_LINK = exports.VIDEO_LINK = 'video_link';
46
+ var WHITEBOARD = exports.WHITEBOARD = 'whiteboard';
46
47
  var ASK_AI = exports.ASK_AI = 'ask_ai';
47
48
 
48
49
  // font
@@ -474,6 +474,12 @@ Object.defineProperty(exports, "VIDEO", {
474
474
  return _elementType.VIDEO;
475
475
  }
476
476
  });
477
+ Object.defineProperty(exports, "WHITEBOARD", {
478
+ enumerable: true,
479
+ get: function get() {
480
+ return _elementType.WHITEBOARD;
481
+ }
482
+ });
477
483
  Object.defineProperty(exports, "WIN_HOTKEYS", {
478
484
  enumerable: true,
479
485
  get: function get() {
@@ -510,7 +516,7 @@ var LIST_TYPE_ARRAY = exports.LIST_TYPE_ARRAY = [_elementType.UNORDERED_LIST, _e
510
516
  var LIST_ITEM_CORRELATION_TYPE = exports.LIST_ITEM_CORRELATION_TYPE = [_elementType.UNORDERED_LIST, _elementType.ORDERED_LIST, _elementType.LIST_ITEM];
511
517
  var LIST_ITEM_SUPPORTED_TRANSFORMATION = exports.LIST_ITEM_SUPPORTED_TRANSFORMATION = [_elementType.UNORDERED_LIST, _elementType.ORDERED_LIST, 'left', 'center', 'right', _elementType.BLOCKQUOTE];
512
518
  var ADD_POSITION_OFFSET_TYPE = exports.ADD_POSITION_OFFSET_TYPE = [_elementType.PARAGRAPH, _elementType.SUBTITLE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CHECK_LIST_ITEM, _elementType.IMAGE_BLOCK];
513
- var FILE_TYPE = exports.FILE_TYPE = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _elementType.FILE_LINK, 'file'), _elementType.SDOC_LINK, 'sdoc'), _elementType.VIDEO, 'video');
519
+ var FILE_TYPE = exports.FILE_TYPE = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _elementType.FILE_LINK, 'file'), _elementType.SDOC_LINK, 'sdoc'), _elementType.VIDEO, 'video'), _elementType.WHITEBOARD, 'exdraw');
514
520
  var FILEEXT_TYPE = exports.FILEEXT_TYPE = {
515
521
  VIDEO: ['mp4', 'ogv', 'webm', 'mov'],
516
522
  MUSIC: ['mp3', 'oga', 'ogg', 'wav', 'flac', 'opus'],
@@ -527,6 +533,6 @@ var FILEEXT_TYPE_MAP = exports.FILEEXT_TYPE_MAP = {
527
533
  EXCALIDRAW: 'draw',
528
534
  DOCUMENT: 'word'
529
535
  };
530
- var 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];
536
+ var 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.WHITEBOARD];
531
537
  var MOUSE_ENTER_EVENT_DISABLED_MAP = exports.MOUSE_ENTER_EVENT_DISABLED_MAP = (_MOUSE_ENTER_EVENT_DI = {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_MOUSE_ENTER_EVENT_DI, _elementType.PARAGRAPH, [_elementType.CALL_OUT]), _elementType.TITLE, [_elementType.CALL_OUT]), _elementType.SUBTITLE, [_elementType.CALL_OUT]), _elementType.CHECK_LIST_ITEM, [_elementType.CALL_OUT]), _elementType.ORDERED_LIST, [_elementType.CALL_OUT]), _elementType.UNORDERED_LIST, [_elementType.CALL_OUT]), _elementType.LIST_ITEM, [_elementType.CALL_OUT]), _elementType.BLOCKQUOTE, [_elementType.CALL_OUT]), _elementType.HEADER1, [_elementType.CALL_OUT]), _elementType.HEADER2, [_elementType.CALL_OUT]), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_MOUSE_ENTER_EVENT_DI, _elementType.HEADER3, [_elementType.CALL_OUT]), _elementType.HEADER4, [_elementType.CALL_OUT]), _elementType.HEADER5, [_elementType.CALL_OUT]), _elementType.HEADER6, [_elementType.CALL_OUT]), _elementType.CALL_OUT, [_elementType.CALL_OUT]));
532
- var 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];
538
+ var 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, _elementType.WHITEBOARD];
@@ -89,11 +89,15 @@ var MENUS_CONFIG_MAP = exports.MENUS_CONFIG_MAP = (_MENUS_CONFIG_MAP = {}, (0, _
89
89
  id: "sdoc_".concat(_elementType.VIDEO),
90
90
  iconClass: 'sdocfont sdoc-video',
91
91
  text: 'Video'
92
+ }), _elementType.WHITEBOARD, {
93
+ id: "sdoc_".concat(_elementType.WHITEBOARD),
94
+ iconClass: 'sdocfont sdoc-document',
95
+ text: 'Whiteboard'
92
96
  }), _elementType.TABLE, {
93
97
  id: "sdoc_".concat(_elementType.TABLE),
94
98
  iconClass: 'sdocfont sdoc-table',
95
99
  text: 'Table'
96
- }), TEXT_STYLE, [{
100
+ }), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_MENUS_CONFIG_MAP, TEXT_STYLE, [{
97
101
  id: ITALIC,
98
102
  iconClass: 'sdocfont sdoc-italic',
99
103
  text: 'Italic',
@@ -142,7 +146,7 @@ var MENUS_CONFIG_MAP = exports.MENUS_CONFIG_MAP = (_MENUS_CONFIG_MAP = {}, (0, _
142
146
  isColor: true,
143
147
  recentUsedColorsKey: _color.RECENT_USED_FONT_COLORS_KEY,
144
148
  defaultLastUsedColor: _color.DEFAULT_LAST_USED_FONT_COLOR
145
- }]), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_MENUS_CONFIG_MAP, TEXT_STYLE_MORE, [
149
+ }]), TEXT_STYLE_MORE, [
146
150
  //
147
151
  {
148
152
  id: STRIKETHROUGH,
@@ -16,6 +16,7 @@ var _slugid = _interopRequireDefault(require("slugid"));
16
16
  var _urlJoin = _interopRequireDefault(require("url-join"));
17
17
  var _constants = require("../../../constants");
18
18
  var _context2 = _interopRequireDefault(require("../../../context"));
19
+ var _socketManager = _interopRequireDefault(require("../../../socket/socket-manager"));
19
20
  var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
20
21
  var _constants2 = require("../../constants");
21
22
  var _core = require("../../core");
@@ -209,7 +210,7 @@ var queryCopyMoveProgressView = exports.queryCopyMoveProgressView = function que
209
210
  };
210
211
  var _start = /*#__PURE__*/function () {
211
212
  var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regeneratorRuntime2["default"])().mark(function _callee() {
212
- var res, successful, eventBus;
213
+ var res, successful, eventBus, socketManager;
213
214
  return (0, _regeneratorRuntime2["default"])().wrap(function _callee$(_context) {
214
215
  while (1) switch (_context.prev = _context.next) {
215
216
  case 0:
@@ -223,6 +224,8 @@ var queryCopyMoveProgressView = exports.queryCopyMoveProgressView = function que
223
224
  // Reload image
224
225
  eventBus = _eventBus["default"].getInstance();
225
226
  eventBus.dispatch(_constants.INTERNAL_EVENT.RELOAD_IMAGE);
227
+ socketManager = _socketManager["default"].getInstance();
228
+ socketManager.sendReloadImage();
226
229
  } else {
227
230
  timer = setTimeout(_start, interval);
228
231
  }
@@ -143,6 +143,12 @@ Object.defineProperty(exports, "VideoPlugin", {
143
143
  return _video["default"];
144
144
  }
145
145
  });
146
+ Object.defineProperty(exports, "WhiteboardPlugin", {
147
+ enumerable: true,
148
+ get: function get() {
149
+ return _whiteboard["default"];
150
+ }
151
+ });
146
152
  Object.defineProperty(exports, "WikiLinkPlugin", {
147
153
  enumerable: true,
148
154
  get: function get() {
@@ -173,8 +179,9 @@ var _table = _interopRequireDefault(require("./table"));
173
179
  var _textAlign = _interopRequireDefault(require("./text-align"));
174
180
  var _textStyle = _interopRequireDefault(require("./text-style"));
175
181
  var _video = _interopRequireDefault(require("./video"));
182
+ var _whiteboard = _interopRequireDefault(require("./whiteboard"));
176
183
  var _wikiLink = _interopRequireDefault(require("./wiki-link"));
177
- var 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"], _group["default"]];
184
+ var 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"], _group["default"], _whiteboard["default"]];
178
185
  var WikiPlugins = exports.WikiPlugins = [].concat(Plugins, [_wikiLink["default"]]);
179
186
  var 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,98 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.onCreateWhiteboardFile = exports.isInsertWhiteboardMenuDisabled = exports.insertWhiteboard = exports.generateWhiteboardNode = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
10
+ var _slate = require("@seafile/slate");
11
+ var _slugid = _interopRequireDefault(require("slugid"));
12
+ var _constants = require("../../../constants");
13
+ var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
14
+ var _constants2 = require("../../constants");
15
+ var _core = require("../../core");
16
+ var isInsertWhiteboardMenuDisabled = exports.isInsertWhiteboardMenuDisabled = function isInsertWhiteboardMenuDisabled(editor, readonly) {
17
+ if (readonly) return true;
18
+ var selection = editor.selection;
19
+ if (selection === null) return true;
20
+ if (!_slate.Range.isCollapsed(selection)) return true;
21
+ var _Editor$nodes = _slate.Editor.nodes(editor, {
22
+ match: function match(n) {
23
+ var type = (0, _core.getNodeType)(n);
24
+ if (!type && (0, _core.isTextNode)(n) && n.id) {
25
+ var parentNode = (0, _core.getParentNode)(editor.children, n.id);
26
+ type = (0, _core.getNodeType)(parentNode);
27
+ }
28
+ if (type === _constants2.CODE_BLOCK) return true;
29
+ if (type.startsWith('header')) return true;
30
+ if (type === _constants2.TITLE) return true;
31
+ if (type === _constants2.SUBTITLE) return true;
32
+ if (type === _constants2.LIST_ITEM) return true;
33
+ if (type === _constants2.CHECK_LIST_ITEM) return true;
34
+ if (type === _constants2.MULTI_COLUMN) return true;
35
+ if (type === _constants2.BLOCKQUOTE) return true;
36
+ if (type === _constants2.CALL_OUT) return true;
37
+ if (_slate.Editor.isVoid(editor, n)) return true;
38
+ return false;
39
+ },
40
+ universal: true
41
+ }),
42
+ _Editor$nodes2 = (0, _slicedToArray2["default"])(_Editor$nodes, 1),
43
+ match = _Editor$nodes2[0];
44
+ if (match) return true;
45
+ return false;
46
+ };
47
+ var generateWhiteboardNode = exports.generateWhiteboardNode = function generateWhiteboardNode(repoID) {
48
+ var filename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
49
+ var filePath = arguments.length > 2 ? arguments[2] : undefined;
50
+ var whiteboardNode = {
51
+ id: _slugid["default"].nice(),
52
+ type: _constants2.WHITEBOARD,
53
+ repoID: repoID,
54
+ title: filename,
55
+ filePath: filePath,
56
+ children: [{
57
+ id: _slugid["default"].nice(),
58
+ text: ''
59
+ }]
60
+ };
61
+ return whiteboardNode;
62
+ };
63
+ var insertWhiteboard = exports.insertWhiteboard = function insertWhiteboard(editor, filename, filePath) {
64
+ var _editor$selection;
65
+ if (isInsertWhiteboardMenuDisabled(editor)) return;
66
+ if (editor.selection == null) return;
67
+ var repoID = window.app.pageOptions.repoID;
68
+ var whiteboardNode = generateWhiteboardNode(repoID, filename, filePath);
69
+ var path = (_editor$selection = editor.selection) === null || _editor$selection === void 0 ? void 0 : _editor$selection.anchor.path;
70
+ var position = 'after';
71
+ if (position === _constants2.INSERT_POSITION.AFTER) {
72
+ _slate.Transforms.insertNodes(editor, whiteboardNode, {
73
+ at: [path[0] + 1]
74
+ });
75
+ var nextPath = _slate.Path.next([path[0] + 1]);
76
+ if (!(0, _core.getNode)(editor, nextPath)) {
77
+ _slate.Transforms.insertNodes(editor, (0, _core.generateDefaultParagraph)(), {
78
+ at: nextPath
79
+ });
80
+ }
81
+ var endOfFirstNode = _slate.Editor.start(editor, nextPath);
82
+ var range = {
83
+ anchor: endOfFirstNode,
84
+ focus: endOfFirstNode
85
+ };
86
+ (0, _core.focusEditor)(editor, range);
87
+ return;
88
+ }
89
+ };
90
+ var onCreateWhiteboardFile = exports.onCreateWhiteboardFile = function onCreateWhiteboardFile(editor) {
91
+ var eventBus = _eventBus["default"].getInstance();
92
+ var external_props = {
93
+ insertWhiteboard: insertWhiteboard,
94
+ fileType: 'exdraw',
95
+ editor: editor
96
+ };
97
+ eventBus.dispatch(_constants.INTERNAL_EVENT.CREATE_WHITEBOARD_FILE, (0, _objectSpread2["default"])({}, external_props));
98
+ };
@@ -0,0 +1,31 @@
1
+ .sdoc-whiteboard-container {
2
+ position: relative;
3
+ width: 670px;
4
+ height: 300px;
5
+ border: 1px solid #ccc;
6
+ margin: 5px 0;
7
+ }
8
+
9
+ .sdoc-whiteboard-container.isSelected {
10
+ border: 1px solid rgb(0, 123, 255);
11
+ }
12
+
13
+ .sdoc-whiteboard-title {
14
+ font-size: 14px;
15
+ color: #333;
16
+ text-align: center;
17
+ margin: 5px;
18
+ width: 670px;
19
+ position: absolute;
20
+ top: 0;
21
+ left: 0%;
22
+ z-index: 2;
23
+ }
24
+
25
+ .sdoc-whiteboard-wrapper * {
26
+ pointer-events: none !important;
27
+ }
28
+
29
+ .sdoc-whiteboard-wrapper .tldraw-editor-container {
30
+ position: absolute !important;
31
+ }
@@ -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 _menu = _interopRequireDefault(require("./menu"));
10
+ var _plugin = _interopRequireDefault(require("./plugin"));
11
+ var _renderElem = require("./render-elem");
12
+ require("./index.css");
13
+ var WhiteboardPlugin = {
14
+ type: _constants.WHITEBOARD,
15
+ nodeType: 'element',
16
+ editorMenus: [_menu["default"]],
17
+ editorPlugin: _plugin["default"],
18
+ renderElements: [_renderElem.renderWhiteboard]
19
+ };
20
+ var _default = exports["default"] = WhiteboardPlugin;
@@ -0,0 +1,61 @@
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 _constants = require("../../../../constants");
13
+ var _dropdownMenuItem = _interopRequireDefault(require("../../../commons/dropdown-menu-item"));
14
+ var _constants2 = require("../../../constants");
15
+ var _helper = require("../helper");
16
+ var WhiteboardMenu = function WhiteboardMenu(_ref) {
17
+ var editor = _ref.editor,
18
+ readonly = _ref.readonly,
19
+ toggle = _ref.toggle,
20
+ eventBus = _ref.eventBus;
21
+ var disabled = (0, _helper.isInsertWhiteboardMenuDisabled)(editor, readonly);
22
+ var menuConfig = _constants2.MENUS_CONFIG_MAP[_constants2.WHITEBOARD];
23
+ var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
24
+ t = _useTranslation.t;
25
+ var onCreateFile = function onCreateFile() {
26
+ console.log('create');
27
+ (0, _helper.onCreateWhiteboardFile)(editor);
28
+ };
29
+ var openSelectWhiteboardFileDialog = (0, _react.useCallback)(function () {
30
+ console.log('insert');
31
+ eventBus.dispatch(_constants.INTERNAL_EVENT.INSERT_ELEMENT, {
32
+ type: _constants2.ELEMENT_TYPE.WHITEBOARD,
33
+ insertWhiteboard: _helper.insertWhiteboard
34
+ });
35
+ toggle && toggle();
36
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37
+ }, [toggle, eventBus]);
38
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
39
+ disabled: disabled,
40
+ menuConfig: menuConfig,
41
+ className: "pr-2"
42
+ }, !disabled && /*#__PURE__*/_react["default"].createElement("i", {
43
+ className: "sdocfont sdoc-right-slide sdoc-dropdown-item-right-icon"
44
+ })), !disabled && /*#__PURE__*/_react["default"].createElement(_reactstrap.UncontrolledPopover, {
45
+ target: menuConfig.id,
46
+ trigger: "hover",
47
+ className: "sdoc-menu-popover sdoc-dropdown-menu sdoc-sub-dropdown-menu sdoc-insert-whiteboard-menu-popover",
48
+ placement: "right-start",
49
+ hideArrow: true,
50
+ fade: false
51
+ }, /*#__PURE__*/_react["default"].createElement("div", {
52
+ className: "sdoc-insert-whiteboard-menu-popover-container sdoc-dropdown-menu-container"
53
+ }, /*#__PURE__*/_react["default"].createElement("div", {
54
+ className: "sdoc-dropdown-menu-item",
55
+ onClick: openSelectWhiteboardFileDialog
56
+ }, t('Upload_local_whiteboard')), /*#__PURE__*/_react["default"].createElement("div", {
57
+ className: "sdoc-dropdown-menu-item",
58
+ onClick: onCreateFile
59
+ }, t('Create_new_whiteboard')))));
60
+ };
61
+ var _default = exports["default"] = WhiteboardMenu;
@@ -0,0 +1,53 @@
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 _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
9
+ var _react = _interopRequireDefault(require("react"));
10
+ var _slate = require("@seafile/slate");
11
+ var _isHotkey = _interopRequireDefault(require("is-hotkey"));
12
+ var _constants = require("../../constants");
13
+ var _core = require("../../core");
14
+ var _helpers = require("../../toolbar/side-toolbar/helpers");
15
+ var withWhiteboard = function withWhiteboard(editor) {
16
+ var isVoid = editor.isVoid,
17
+ onHotKeyDown = editor.onHotKeyDown;
18
+ var newEditor = editor;
19
+
20
+ // Make whiteboard as void node
21
+ newEditor.isVoid = function (elem) {
22
+ var type = elem.type;
23
+ if (type === _constants.WHITEBOARD) {
24
+ return true;
25
+ }
26
+ return isVoid(elem);
27
+ };
28
+ newEditor.onHotKeyDown = function (event) {
29
+ var _ref = (0, _core.getSelectedNodeEntryByType)(editor, _constants.WHITEBOARD) || [],
30
+ _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
31
+ whiteboardNode = _ref2[0],
32
+ path = _ref2[1];
33
+ if (path) {
34
+ // Insert empty paragraph node after whiteboard when clicking 'enter' on selected whiteboard
35
+ if ((0, _isHotkey["default"])('enter', event)) {
36
+ event.preventDefault();
37
+ var emptyParagraph = (0, _core.generateEmptyElement)(_constants.PARAGRAPH);
38
+ _slate.Transforms.insertNodes(editor, emptyParagraph, {
39
+ at: _slate.Path.next(path)
40
+ });
41
+ var focusPoint = _slate.Editor.end(editor, _slate.Path.next(path));
42
+ (0, _core.focusEditor)(newEditor, focusPoint);
43
+ }
44
+ if ((0, _isHotkey["default"])('mod+c', event)) {
45
+ (0, _helpers.onCopyNode)(editor, whiteboardNode);
46
+ }
47
+ return true;
48
+ }
49
+ return onHotKeyDown && onHotKeyDown(event);
50
+ };
51
+ return newEditor;
52
+ };
53
+ var _default = exports["default"] = withWhiteboard;
@@ -0,0 +1,70 @@
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.renderWhiteboard = renderWhiteboard;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _slateReact = require("@seafile/slate-react");
11
+ var _classnames = _interopRequireDefault(require("classnames"));
12
+ var _constants = require("../../../constants");
13
+ var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
14
+ require("./index.css");
15
+ var Whiteboard = function Whiteboard(_ref) {
16
+ var editor = _ref.editor,
17
+ element = _ref.element;
18
+ var filePath = element.filePath,
19
+ repoID = element.repoID,
20
+ title = element.title;
21
+ var whiteboardRef = (0, _react.useRef)();
22
+ var isSelected = (0, _slateReact.useSelected)();
23
+ var containerId = "whiteboard-".concat(title);
24
+ // Set default whiteboard readonly as true
25
+ var readOnly = true;
26
+ var handleDoubleClick = function handleDoubleClick(event) {
27
+ event.preventDefault();
28
+ var siteRoot = window.app.config.siteRoot;
29
+ var url = "".concat(siteRoot, "lib/").concat(repoID, "/file").concat(filePath);
30
+ window.open(url, '_blank');
31
+ return;
32
+ };
33
+ (0, _react.useEffect)(function () {
34
+ var eventBus = _eventBus["default"].getInstance();
35
+ eventBus.dispatch(_constants.INTERNAL_EVENT.TLDRAW_EDITOR, {
36
+ containerId: containerId,
37
+ props: {
38
+ filePath: filePath,
39
+ repoID: repoID,
40
+ readOnly: readOnly
41
+ }
42
+ });
43
+ }, [filePath, repoID, readOnly, containerId]);
44
+ return /*#__PURE__*/_react["default"].createElement("div", {
45
+ className: (0, _classnames["default"])('sdoc-whiteboard-container', {
46
+ 'isSelected': isSelected
47
+ }),
48
+ ref: whiteboardRef,
49
+ onDoubleClick: handleDoubleClick,
50
+ scrolling: "no"
51
+ }, /*#__PURE__*/_react["default"].createElement("div", {
52
+ className: "sdoc-whiteboard-title"
53
+ }, title), /*#__PURE__*/_react["default"].createElement("div", {
54
+ id: containerId,
55
+ className: "sdoc-whiteboard-wrapper"
56
+ }));
57
+ };
58
+ function renderWhiteboard(props, editor) {
59
+ var element = props.element,
60
+ children = props.children,
61
+ attributes = props.attributes;
62
+ return /*#__PURE__*/_react["default"].createElement("div", Object.assign({}, attributes, {
63
+ contentEditable: "false",
64
+ suppressContentEditableWarning: true
65
+ }), children, /*#__PURE__*/_react["default"].createElement(Whiteboard, {
66
+ editor: editor,
67
+ element: element,
68
+ contentEditable: "false"
69
+ }));
70
+ }
@@ -229,6 +229,12 @@ var CustomRenderElement = function CustomRenderElement(props) {
229
229
  renderGroup = _GroupPlugin$renderEl[0];
230
230
  return renderGroup(props);
231
231
  }
232
+ case _elementType.WHITEBOARD:
233
+ {
234
+ var _WhiteboardPlugin$ren = (0, _slicedToArray2["default"])(_plugins.WhiteboardPlugin.renderElements, 1),
235
+ renderWhiteboard = _WhiteboardPlugin$ren[0];
236
+ return renderWhiteboard((0, _objectSpread2["default"])({}, props), editor);
237
+ }
232
238
  default:
233
239
  {
234
240
  var _ParagraphPlugin$rend3 = (0, _slicedToArray2["default"])(_plugins.ParagraphPlugin.renderElements, 1),
@@ -21,6 +21,7 @@ var _menu5 = _interopRequireDefault(require("../../../plugins/sdoc-link/menu"));
21
21
  var _tableMenu = _interopRequireDefault(require("../../../plugins/table/menu/table-menu"));
22
22
  var _menu6 = _interopRequireDefault(require("../../../plugins/video/menu"));
23
23
  require("./index.css");
24
+ var _menu7 = _interopRequireDefault(require("../../../plugins/whiteboard/menu"));
24
25
  var InsertToolbar = function InsertToolbar(_ref) {
25
26
  var _ref$isRichEditor = _ref.isRichEditor,
26
27
  isRichEditor = _ref$isRichEditor === void 0 ? true : _ref$isRichEditor,
@@ -101,7 +102,7 @@ var InsertToolbar = function InsertToolbar(_ref) {
101
102
  style: {
102
103
  maxHeight: window.innerHeight - bottom - 100
103
104
  }
104
- }, /*#__PURE__*/_react["default"].createElement(_menu3["default"], props), /*#__PURE__*/_react["default"].createElement(_tableMenu["default"], props), /*#__PURE__*/_react["default"].createElement(_menu6["default"], props), /*#__PURE__*/_react["default"].createElement(_menu4["default"], props), /*#__PURE__*/_react["default"].createElement(_menu["default"], props), /*#__PURE__*/_react["default"].createElement("div", {
105
+ }, /*#__PURE__*/_react["default"].createElement(_menu3["default"], props), /*#__PURE__*/_react["default"].createElement(_tableMenu["default"], props), /*#__PURE__*/_react["default"].createElement(_menu6["default"], props), /*#__PURE__*/_react["default"].createElement(_menu7["default"], props), /*#__PURE__*/_react["default"].createElement(_menu4["default"], props), /*#__PURE__*/_react["default"].createElement(_menu["default"], props), /*#__PURE__*/_react["default"].createElement("div", {
105
106
  className: "sdoc-dropdown-menu-divider"
106
107
  }), /*#__PURE__*/_react["default"].createElement(_menu5["default"], props), /*#__PURE__*/_react["default"].createElement(_menu2["default"], props))));
107
108
  };
@@ -249,7 +249,7 @@ var getTopValue = exports.getTopValue = function getTopValue(editor, dom, contai
249
249
  return top + offsetY - headerHeight;
250
250
  };
251
251
  var isNotSupportTransform = exports.isNotSupportTransform = function isNotSupportTransform(node) {
252
- if (node.type && [_constants2.CODE_BLOCK, _constants2.TABLE, _constants2.VIDEO].includes(node.type)) {
252
+ if (node.type && [_constants2.CODE_BLOCK, _constants2.TABLE, _constants2.VIDEO, _constants2.WHITEBOARD].includes(node.type)) {
253
253
  return true;
254
254
  }
255
255
  return false;
@@ -93,6 +93,12 @@ var SocketClient = /*#__PURE__*/(0, _createClass2["default"])(function SocketCli
93
93
  doc_uuid: docUuid
94
94
  });
95
95
  });
96
+ (0, _defineProperty2["default"])(this, "sendReloadImage", function () {
97
+ var docUuid = _this.config.docUuid;
98
+ _this.socket.emit('reload-image', {
99
+ doc_uuid: docUuid
100
+ });
101
+ });
96
102
  (0, _defineProperty2["default"])(this, "onJoinRoom", function (userInfo) {
97
103
  (0, _debug.serverDebug)('%s joined room success.', userInfo.username);
98
104
  var socketManager = _socketManager["default"].getInstance();
@@ -108,6 +114,11 @@ var SocketClient = /*#__PURE__*/(0, _createClass2["default"])(function SocketCli
108
114
  var socketManager = _socketManager["default"].getInstance();
109
115
  socketManager.dispatchConnectState('user-updated', userInfo);
110
116
  });
117
+ (0, _defineProperty2["default"])(this, "onReloadImage", function () {
118
+ (0, _debug.serverDebug)('Reload image by other people copy images from different repos');
119
+ var socketManager = _socketManager["default"].getInstance();
120
+ socketManager.dispatchConnectState('reload_image');
121
+ });
111
122
  /**
112
123
  * receive remote broadcast operations
113
124
  * @param {*} params {operations, version}
@@ -197,6 +208,7 @@ var SocketClient = /*#__PURE__*/(0, _createClass2["default"])(function SocketCli
197
208
  this.socket.on('join-room', this.onJoinRoom);
198
209
  this.socket.on('leave-room', this.onLeaveRoom);
199
210
  this.socket.on('user-updated', this.onUserUpdated);
211
+ this.socket.on('reload-image', this.onReloadImage);
200
212
  this.socket.on('update-document', this.onReceiveRemoteOperations);
201
213
 
202
214
  // doc replaced
@@ -61,6 +61,9 @@ var SocketManager = /*#__PURE__*/(0, _createClass2["default"])(function SocketMa
61
61
  (0, _defineProperty2["default"])(this, "sendUserUpdated", function (name) {
62
62
  _this.socketClient.sendUserUpdated(name);
63
63
  });
64
+ (0, _defineProperty2["default"])(this, "sendReloadImage", function () {
65
+ _this.socketClient.sendReloadImage();
66
+ });
64
67
  (0, _defineProperty2["default"])(this, "onReceiveLocalOperations", function (operations) {
65
68
  if (_this.editor.readonly) return;
66
69
  _this.pendingOperationList.push(operations);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "2.0.123",
3
+ "version": "2.0.124-test-0.0.4",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "test": "jest",
@@ -69,6 +69,5 @@
69
69
  },
70
70
  "publishConfig": {
71
71
  "access": "public"
72
- },
73
- "gitHead": "6381a83479253e6fbdc0955a14c0ded4ca799d53"
72
+ }
74
73
  }
package/LICENSE.txt DELETED
@@ -1,13 +0,0 @@
1
- Copyright (c) 2025 Seafile Ltd.
2
-
3
- Licensed under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License.
5
- You may obtain a copy of the License at
6
-
7
- http://www.apache.org/licenses/LICENSE-2.0
8
-
9
- Unless required by applicable law or agreed to in writing, software
10
- distributed under the License is distributed on an "AS IS" BASIS,
11
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- See the License for the specific language governing permissions and
13
- limitations under the License.