@seafile/sdoc-editor 2.0.126 → 2.0.127-test-0.0.2

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.
Files changed (28) hide show
  1. package/dist/assets/css/link-cursor.css +48 -0
  2. package/dist/assets/css/sdoc-editor-plugins.css +1 -0
  3. package/dist/comment/reducer/notification-reducer.js +1 -1
  4. package/dist/constants/index.js +3 -1
  5. package/dist/editor/editable-article.js +125 -1
  6. package/dist/extension/commons/insert-element-dialog/index.js +22 -3
  7. package/dist/extension/commons/select-file-dialog/helpers.js +5 -1
  8. package/dist/extension/commons/select-file-dialog/index.js +18 -2
  9. package/dist/extension/commons/select-file-dialog/local-files/index.css +2 -0
  10. package/dist/extension/commons/select-file-dialog/local-files/index.js +1 -1
  11. package/dist/extension/constants/element-type.js +2 -1
  12. package/dist/extension/constants/index.js +9 -3
  13. package/dist/extension/constants/menus-config.js +6 -2
  14. package/dist/extension/plugins/ai/ai-module/index.js +12 -2
  15. package/dist/extension/plugins/ai/ai-module/style.css +2 -2
  16. package/dist/extension/plugins/index.js +8 -1
  17. package/dist/extension/plugins/whiteboard/helper.js +142 -0
  18. package/dist/extension/plugins/whiteboard/index.css +36 -0
  19. package/dist/extension/plugins/whiteboard/index.js +20 -0
  20. package/dist/extension/plugins/whiteboard/menu/index.js +59 -0
  21. package/dist/extension/plugins/whiteboard/plugin.js +53 -0
  22. package/dist/extension/plugins/whiteboard/render-elem.js +62 -0
  23. package/dist/extension/render/custom-element.js +6 -0
  24. package/dist/extension/toolbar/header-toolbar/insert-toolbar/index.js +2 -1
  25. package/dist/extension/toolbar/insert-element-toolbar/index.js +2 -2
  26. package/dist/extension/toolbar/side-toolbar/helpers.js +1 -1
  27. package/package.json +2 -3
  28. package/LICENSE.txt +0 -13
@@ -0,0 +1,48 @@
1
+ .sdoc-editor__article {
2
+ position: relative;
3
+ overflow: auto;
4
+ }
5
+
6
+ .slate-content.hide-native-cursor {
7
+ caret-color: transparent;
8
+ }
9
+
10
+ .custom-cursor {
11
+ position: absolute;
12
+ width: 1px;
13
+ height: 1.2em;
14
+ background-color: blue;
15
+ animation: blink 1s infinite;
16
+ }
17
+
18
+ .custom-cursor.link-start::after,
19
+ .custom-cursor.next-start::after {
20
+ content: '';
21
+ position: absolute;
22
+ bottom: 0;
23
+ left: 0;
24
+ width: 4px;
25
+ height: 1px;
26
+ background-color: blue;
27
+ }
28
+
29
+ .custom-cursor.link-end::after,
30
+ .custom-cursor.prev-end::after {
31
+ content: '';
32
+ position: absolute;
33
+ bottom: 0;
34
+ right: 0;
35
+ width: 4px;
36
+ height: 1px;
37
+ background-color: blue;
38
+ }
39
+
40
+ @keyframes blink {
41
+ 0%, 100% {
42
+ opacity: 1;
43
+ }
44
+
45
+ 50% {
46
+ opacity: 0;
47
+ }
48
+ }
@@ -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
  }
@@ -26,7 +26,7 @@ var notificationReducer = exports.notificationReducer = function notificationRed
26
26
  {
27
27
  var notifications = action.payload;
28
28
  var notificationsMap = {};
29
- notifications.forEach(function (n) {
29
+ notifications === null || notifications === void 0 ? void 0 : notifications.forEach(function (n) {
30
30
  var newNotification = new _model.Notification(n);
31
31
  notificationsMap[newNotification.key] = newNotification;
32
32
  });
@@ -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
+ GENERATE_EXDRAW_READ_ONLY_LINK: 'generate_exdraw_read_only_link'
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;
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports["default"] = void 0;
9
9
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
10
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createForOfIteratorHelper"));
10
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
11
12
  var _react = _interopRequireWildcard(require("react"));
12
13
  var _slate = require("@seafile/slate");
@@ -28,6 +29,7 @@ var _commonUtils = require("../utils/common-utils");
28
29
  var _domUtils = require("../utils/dom-utils");
29
30
  var _eventBus = _interopRequireDefault(require("../utils/event-bus"));
30
31
  var _eventHandler = _interopRequireDefault(require("../utils/event-handler"));
32
+ require("../assets/css/link-cursor.css");
31
33
  var EditableArticle = function EditableArticle(_ref) {
32
34
  var _ref$showComment = _ref.showComment,
33
35
  showComment = _ref$showComment === void 0 ? true : _ref$showComment,
@@ -38,6 +40,14 @@ var EditableArticle = function EditableArticle(_ref) {
38
40
  cursors = _useCursors.cursors;
39
41
  var decorate = (0, _decorates.usePipDecorate)(editor);
40
42
  var forceUpdate = (0, _useForceUpdate["default"])();
43
+ var _useState = (0, _react.useState)({
44
+ top: 0,
45
+ left: 0,
46
+ type: null // 'link-start' | 'link-end' | 'next-start' | 'prev-end'
47
+ }),
48
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
49
+ cursorState = _useState2[0],
50
+ setCursorState = _useState2[1];
41
51
 
42
52
  // init eventHandler
43
53
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -67,6 +77,113 @@ var EditableArticle = function EditableArticle(_ref) {
67
77
  };
68
78
  // eslint-disable-next-line react-hooks/exhaustive-deps
69
79
  }, []);
80
+ (0, _react.useEffect)(function () {
81
+ var selection = editor.selection;
82
+ if (!selection || !_slate.Range.isCollapsed(selection)) {
83
+ setCursorState({
84
+ top: 0,
85
+ left: 0,
86
+ type: null
87
+ });
88
+ return;
89
+ }
90
+ var domSelection = window.getSelection();
91
+ if (!domSelection || domSelection.rangeCount === 0) {
92
+ setCursorState({
93
+ top: 0,
94
+ left: 0,
95
+ type: null
96
+ });
97
+ return;
98
+ }
99
+ var range = domSelection.getRangeAt(0);
100
+ var rect = range.getBoundingClientRect();
101
+ var editorEl = document.querySelector('.sdoc-editor__article');
102
+ if (!editorEl) {
103
+ setCursorState({
104
+ top: 0,
105
+ left: 0,
106
+ type: null
107
+ });
108
+ return;
109
+ }
110
+ var editorRect = editorEl.getBoundingClientRect();
111
+ var top = rect.top - editorRect.top + editorEl.scrollTop;
112
+ var left = rect.left - editorRect.left + editorEl.scrollLeft;
113
+ var _Editor$node = _slate.Editor.node(editor, selection.anchor.path),
114
+ _Editor$node2 = (0, _slicedToArray2["default"])(_Editor$node, 2),
115
+ node = _Editor$node2[0],
116
+ path = _Editor$node2[1];
117
+ if (!_slate.Text.isText(node)) {
118
+ setCursorState({
119
+ top: 0,
120
+ left: 0,
121
+ type: null
122
+ });
123
+ return;
124
+ }
125
+ var isInLink = false;
126
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(_slate.Node.ancestors(editor, path)),
127
+ _step;
128
+ try {
129
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
130
+ var _step$value = (0, _slicedToArray2["default"])(_step.value, 1),
131
+ ancestor = _step$value[0];
132
+ if (ancestor.type === 'link') {
133
+ isInLink = true;
134
+ break;
135
+ }
136
+ }
137
+ } catch (err) {
138
+ _iterator.e(err);
139
+ } finally {
140
+ _iterator.f();
141
+ }
142
+ if (isInLink) {
143
+ var offset = selection.anchor.offset;
144
+ var isStart = offset === 0;
145
+ var isEnd = offset === node.text.length;
146
+ if (!isStart && !isEnd) {
147
+ setCursorState({
148
+ top: 0,
149
+ left: 0,
150
+ type: null
151
+ });
152
+ return;
153
+ }
154
+ setCursorState({
155
+ top: top,
156
+ left: left,
157
+ type: isStart ? 'link-start' : 'link-end'
158
+ });
159
+ } else {
160
+ var parent = _slate.Node.parent(editor, path);
161
+ var index = path[path.length - 1];
162
+ var nextSibling = index < parent.children.length - 1 ? parent.children[index + 1] : null;
163
+ var prevSibling = index > 0 ? parent.children[index - 1] : null;
164
+ var isLeftNeighborEnd = nextSibling && _slate.Element.isElement(nextSibling) && nextSibling.type === 'link' && selection.anchor.offset === node.text.length;
165
+ var isRightNeighborStart = prevSibling && _slate.Element.isElement(prevSibling) && prevSibling.type === 'link' && selection.anchor.offset === 0;
166
+ if (isLeftNeighborEnd) {
167
+ setCursorState({
168
+ top: top,
169
+ left: left,
170
+ type: 'prev-end'
171
+ });
172
+ } else if (isRightNeighborStart) {
173
+ setCursorState({
174
+ top: top,
175
+ left: left,
176
+ type: 'next-start'
177
+ });
178
+ } else {
179
+ setCursorState({
180
+ top: 0,
181
+ left: 0,
182
+ type: null
183
+ });
184
+ }
185
+ }
186
+ }, [editor.selection]);
70
187
  var onKeyDown = (0, _react.useCallback)(function (event) {
71
188
  var _scrollRef$current = scrollRef.current,
72
189
  scrollTop = _scrollRef$current.scrollTop,
@@ -254,7 +371,14 @@ var EditableArticle = function EditableArticle(_ref) {
254
371
  onCopy: eventProxy.onCopy,
255
372
  onCompositionStart: eventProxy.onCompositionStart,
256
373
  id: "sdoc-editor",
257
- "aria-label": "textbox"
374
+ "aria-label": "textbox",
375
+ className: "slate-content ".concat(cursorState.type ? 'hide-native-cursor' : '')
376
+ }), cursorState.type && /*#__PURE__*/_react["default"].createElement("div", {
377
+ className: "custom-cursor ".concat(cursorState.type),
378
+ style: {
379
+ top: cursorState.top,
380
+ left: cursorState.left
381
+ }
258
382
  })), /*#__PURE__*/_react["default"].createElement(_extension.SideToolbar, null), showComment && /*#__PURE__*/_react["default"].createElement(_comment["default"], {
259
383
  editor: editor,
260
384
  type: "editor"
@@ -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
  }
@@ -65,6 +69,8 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
65
69
  insertSdocFileLinkCallback = _ref2.insertSdocFileLinkCallback;
66
70
  var _ref3 = insertVideoCallback || {},
67
71
  insertVideo = _ref3.insertVideo;
72
+ var _ref4 = insertWhiteboardFile || {},
73
+ insertWhiteboard = _ref4.insertWhiteboard;
68
74
  switch (dialogType) {
69
75
  case _constants.ELEMENT_TYPE.FILE_LINK:
70
76
  insertFileLinkCallback && insertFileLinkCallback(editor, fileInfo.name, fileInfo.file_uuid);
@@ -82,10 +88,13 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
82
88
  name: fileInfo.name
83
89
  }], [encodedUrl]);
84
90
  break;
91
+ case _constants.ELEMENT_TYPE.WHITEBOARD:
92
+ insertWhiteboard && insertWhiteboard(editor, fileInfo.name, fileInfo.path);
93
+ break;
85
94
  default:
86
95
  break;
87
96
  }
88
- }, [insertLinkCallback, insertVideoCallback, dialogType, editor]);
97
+ }, [insertLinkCallback, insertVideoCallback, insertWhiteboardFile, dialogType, editor]);
89
98
  var onSubmit = (0, _react.useCallback)(function () {
90
99
  if (!currentSelectedFile) return;
91
100
  var file_uuid = currentSelectedFile.file_uuid;
@@ -98,6 +107,13 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
98
107
  return;
99
108
  }
100
109
 
110
+ // Insert whiteboard file in sdoc
111
+ if (dialogType === _constants.ELEMENT_TYPE.WHITEBOARD) {
112
+ insertFile(fileInfo);
113
+ closeDialog();
114
+ return;
115
+ }
116
+
101
117
  // File has no id
102
118
  if (!file_uuid || file_uuid === '') {
103
119
  _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;
@@ -194,7 +194,7 @@ var LocalFiles = function LocalFiles(_ref) {
194
194
  className: "sdoc-folder-children"
195
195
  }, ((_item$children = item.children) === null || _item$children === void 0 ? void 0 : _item$children.length) === 0 && /*#__PURE__*/_react["default"].createElement("div", {
196
196
  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", {
197
+ }, "(".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
198
  className: (0, _classnames["default"])('sdoc-file-info', {
199
199
  'active': selected
200
200
  }),
@@ -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,
@@ -95,7 +95,13 @@ function AIModule(_ref) {
95
95
  _content += (0, _slateToMd["default"])(item);
96
96
  });
97
97
  }
98
- setSelectedValue(_content);
98
+
99
+ // Add paragraph symbol for selected content
100
+ var newContent = _content;
101
+ if (_content.includes('\n')) {
102
+ newContent = _content.replace(/\n/g, '\n\n');
103
+ }
104
+ setSelectedValue(newContent);
99
105
  }
100
106
  var domSelection = window.getSelection();
101
107
  var domRange = domSelection.getRangeAt(0);
@@ -144,7 +150,11 @@ function AIModule(_ref) {
144
150
  var slateRect = slateDom.getBoundingClientRect();
145
151
  var content = _slate.Node.string(element);
146
152
  if (content) {
147
- setSelectedValue(content);
153
+ var _newContent = content;
154
+ if (content.includes('\n')) {
155
+ _newContent = content.replace(/\n/g, '\n\n');
156
+ }
157
+ setSelectedValue(_newContent);
148
158
  }
149
159
  var needPaddingBottomHeight = scrollTop + slateRect.bottom + _constants2.AI_MIN_HEIGHT - scrollHeight;
150
160
  if (needPaddingBottomHeight > 0) {
@@ -142,7 +142,7 @@
142
142
  }
143
143
 
144
144
  .md-rendered-html p {
145
- padding-bottom: 5px;
146
- line-height: 1.6;
145
+ padding: 5px 0;
146
+ line-height: 1.5;
147
147
  margin-bottom: 0 !important;
148
148
  }
@@ -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,142 @@
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 _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/regeneratorRuntime"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/asyncToGenerator"));
11
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
12
+ var _slate = require("@seafile/slate");
13
+ var _slugid = _interopRequireDefault(require("slugid"));
14
+ var _constants = require("../../../constants");
15
+ var _context2 = _interopRequireDefault(require("../../../context"));
16
+ var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
17
+ var _constants2 = require("../../constants");
18
+ var _core = require("../../core");
19
+ var isInsertWhiteboardMenuDisabled = exports.isInsertWhiteboardMenuDisabled = function isInsertWhiteboardMenuDisabled(editor, readonly) {
20
+ if (readonly) return true;
21
+ var selection = editor.selection;
22
+ if (selection === null) return true;
23
+ if (!_slate.Range.isCollapsed(selection)) return true;
24
+ var _Editor$nodes = _slate.Editor.nodes(editor, {
25
+ match: function match(n) {
26
+ var type = (0, _core.getNodeType)(n);
27
+ if (!type && (0, _core.isTextNode)(n) && n.id) {
28
+ var parentNode = (0, _core.getParentNode)(editor.children, n.id);
29
+ type = (0, _core.getNodeType)(parentNode);
30
+ }
31
+ if (type === _constants2.CODE_BLOCK) return true;
32
+ if (type.startsWith('header')) return true;
33
+ if (type === _constants2.TITLE) return true;
34
+ if (type === _constants2.SUBTITLE) return true;
35
+ if (type === _constants2.LIST_ITEM) return true;
36
+ if (type === _constants2.CHECK_LIST_ITEM) return true;
37
+ if (type === _constants2.MULTI_COLUMN) return true;
38
+ if (type === _constants2.BLOCKQUOTE) return true;
39
+ if (type === _constants2.CALL_OUT) return true;
40
+ if (_slate.Editor.isVoid(editor, n)) return true;
41
+ return false;
42
+ },
43
+ universal: true
44
+ }),
45
+ _Editor$nodes2 = (0, _slicedToArray2["default"])(_Editor$nodes, 1),
46
+ match = _Editor$nodes2[0];
47
+ if (match) return true;
48
+ return false;
49
+ };
50
+ var generateWhiteboardNode = exports.generateWhiteboardNode = function generateWhiteboardNode(repoID) {
51
+ var filename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
52
+ var filePath = arguments.length > 2 ? arguments[2] : undefined;
53
+ var exdrawReadOnlyLink = arguments.length > 3 ? arguments[3] : undefined;
54
+ var whiteboardNode = {
55
+ id: _slugid["default"].nice(),
56
+ type: _constants2.WHITEBOARD,
57
+ repoID: repoID,
58
+ title: filename,
59
+ filePath: filePath,
60
+ link: exdrawReadOnlyLink,
61
+ children: [{
62
+ id: _slugid["default"].nice(),
63
+ text: ''
64
+ }]
65
+ };
66
+ return whiteboardNode;
67
+ };
68
+ var insertWhiteboard = exports.insertWhiteboard = /*#__PURE__*/function () {
69
+ var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regeneratorRuntime2["default"])().mark(function _callee(editor, filename, filePath) {
70
+ var _editor$selection;
71
+ var repoID, eventBus, exdrawReadOnlyLink, whiteboardNode, path, position, nextPath, endOfFirstNode, range;
72
+ return (0, _regeneratorRuntime2["default"])().wrap(function _callee$(_context) {
73
+ while (1) switch (_context.prev = _context.next) {
74
+ case 0:
75
+ if (!isInsertWhiteboardMenuDisabled(editor)) {
76
+ _context.next = 2;
77
+ break;
78
+ }
79
+ return _context.abrupt("return");
80
+ case 2:
81
+ if (!(editor.selection == null)) {
82
+ _context.next = 4;
83
+ break;
84
+ }
85
+ return _context.abrupt("return");
86
+ case 4:
87
+ repoID = _context2["default"].getSetting('repoID');
88
+ eventBus = _eventBus["default"].getInstance();
89
+ _context.next = 8;
90
+ return new Promise(function (resolve) {
91
+ eventBus.dispatch(_constants.INTERNAL_EVENT.GENERATE_EXDRAW_READ_ONLY_LINK, {
92
+ repoID: repoID,
93
+ filePath: filePath,
94
+ onSuccess: function onSuccess(link) {
95
+ resolve(link);
96
+ }
97
+ });
98
+ });
99
+ case 8:
100
+ exdrawReadOnlyLink = _context.sent;
101
+ whiteboardNode = generateWhiteboardNode(repoID, filename, filePath, exdrawReadOnlyLink);
102
+ path = (_editor$selection = editor.selection) === null || _editor$selection === void 0 ? void 0 : _editor$selection.anchor.path;
103
+ position = 'after';
104
+ if (!(position === _constants2.INSERT_POSITION.AFTER)) {
105
+ _context.next = 20;
106
+ break;
107
+ }
108
+ _slate.Transforms.insertNodes(editor, whiteboardNode, {
109
+ at: [path[0] + 1]
110
+ });
111
+ nextPath = _slate.Path.next([path[0] + 1]);
112
+ if (!(0, _core.getNode)(editor, nextPath)) {
113
+ _slate.Transforms.insertNodes(editor, (0, _core.generateDefaultParagraph)(), {
114
+ at: nextPath
115
+ });
116
+ }
117
+ endOfFirstNode = _slate.Editor.start(editor, nextPath);
118
+ range = {
119
+ anchor: endOfFirstNode,
120
+ focus: endOfFirstNode
121
+ };
122
+ (0, _core.focusEditor)(editor, range);
123
+ return _context.abrupt("return");
124
+ case 20:
125
+ case "end":
126
+ return _context.stop();
127
+ }
128
+ }, _callee);
129
+ }));
130
+ return function insertWhiteboard(_x, _x2, _x3) {
131
+ return _ref.apply(this, arguments);
132
+ };
133
+ }();
134
+ var onCreateWhiteboardFile = exports.onCreateWhiteboardFile = function onCreateWhiteboardFile(editor) {
135
+ var eventBus = _eventBus["default"].getInstance();
136
+ var external_props = {
137
+ insertWhiteboard: insertWhiteboard,
138
+ fileType: 'exdraw',
139
+ editor: editor
140
+ };
141
+ eventBus.dispatch(_constants.INTERNAL_EVENT.CREATE_WHITEBOARD_FILE, (0, _objectSpread2["default"])({}, external_props));
142
+ };
@@ -0,0 +1,36 @@
1
+ .sdoc-whiteboard-container {
2
+ position: relative;
3
+ width: 100%;
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: 100%;
19
+ position: absolute;
20
+ top: 0;
21
+ left: 0%;
22
+ z-index: 2;
23
+ }
24
+
25
+ .sdoc-whiteboard-element .wrapper {
26
+ height: 100%;
27
+ }
28
+
29
+ .sdoc-whiteboard-element .excali-container {
30
+ width: 100% !important;
31
+ height: 100% !important;
32
+ }
33
+
34
+ .sdoc-whiteboard-element .excali-container .App-boottom-bar {
35
+ display: none;
36
+ }
@@ -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,59 @@
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
+ (0, _helper.onCreateWhiteboardFile)(editor);
27
+ };
28
+ var openSelectWhiteboardFileDialog = (0, _react.useCallback)(function () {
29
+ eventBus.dispatch(_constants.INTERNAL_EVENT.INSERT_ELEMENT, {
30
+ type: _constants2.ELEMENT_TYPE.WHITEBOARD,
31
+ insertWhiteboard: _helper.insertWhiteboard
32
+ });
33
+ toggle && toggle();
34
+ // eslint-disable-next-line react-hooks/exhaustive-deps
35
+ }, [toggle, eventBus]);
36
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
37
+ disabled: disabled,
38
+ menuConfig: menuConfig,
39
+ className: "pr-2"
40
+ }, !disabled && /*#__PURE__*/_react["default"].createElement("i", {
41
+ className: "sdocfont sdoc-right-slide sdoc-dropdown-item-right-icon"
42
+ })), !disabled && /*#__PURE__*/_react["default"].createElement(_reactstrap.UncontrolledPopover, {
43
+ target: menuConfig.id,
44
+ trigger: "hover",
45
+ className: "sdoc-menu-popover sdoc-dropdown-menu sdoc-sub-dropdown-menu sdoc-insert-whiteboard-menu-popover",
46
+ placement: "right-start",
47
+ hideArrow: true,
48
+ fade: false
49
+ }, /*#__PURE__*/_react["default"].createElement("div", {
50
+ className: "sdoc-insert-whiteboard-menu-popover-container sdoc-dropdown-menu-container"
51
+ }, /*#__PURE__*/_react["default"].createElement("div", {
52
+ className: "sdoc-dropdown-menu-item",
53
+ onClick: openSelectWhiteboardFileDialog
54
+ }, t('Upload_local_whiteboard')), /*#__PURE__*/_react["default"].createElement("div", {
55
+ className: "sdoc-dropdown-menu-item",
56
+ onClick: onCreateFile
57
+ }, t('Create_new_whiteboard')))));
58
+ };
59
+ 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,62 @@
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 _context = _interopRequireDefault(require("../../../context"));
13
+ require("./index.css");
14
+ var Whiteboard = function Whiteboard(_ref) {
15
+ var editor = _ref.editor,
16
+ element = _ref.element;
17
+ var filePath = element.filePath,
18
+ repoID = element.repoID,
19
+ title = element.title,
20
+ link = element.link;
21
+ var whiteboardRef = (0, _react.useRef)();
22
+ var isSelected = (0, _slateReact.useSelected)();
23
+ var handleDoubleClick = function handleDoubleClick(event) {
24
+ event.preventDefault();
25
+ var siteRoot = _context["default"].getSetting('siteRoot');
26
+ var url = "".concat(siteRoot, "lib/").concat(repoID, "/file").concat(filePath);
27
+ window.open(url, '_blank');
28
+ return;
29
+ };
30
+ return /*#__PURE__*/_react["default"].createElement("div", {
31
+ className: (0, _classnames["default"])('sdoc-whiteboard-container', {
32
+ 'isSelected': isSelected
33
+ }),
34
+ ref: whiteboardRef,
35
+ onDoubleClick: handleDoubleClick,
36
+ scrolling: "no"
37
+ }, /*#__PURE__*/_react["default"].createElement("div", {
38
+ className: "sdoc-whiteboard-title"
39
+ }, title), /*#__PURE__*/_react["default"].createElement("iframe", {
40
+ className: "sdoc-whiteboard-element",
41
+ title: title,
42
+ src: link,
43
+ style: {
44
+ width: '100%',
45
+ height: '100%',
46
+ border: 'none'
47
+ }
48
+ }));
49
+ };
50
+ function renderWhiteboard(props, editor) {
51
+ var element = props.element,
52
+ children = props.children,
53
+ attributes = props.attributes;
54
+ return /*#__PURE__*/_react["default"].createElement("div", Object.assign({}, attributes, {
55
+ contentEditable: "false",
56
+ suppressContentEditableWarning: true
57
+ }), children, /*#__PURE__*/_react["default"].createElement(Whiteboard, {
58
+ editor: editor,
59
+ element: element,
60
+ contentEditable: "false"
61
+ }));
62
+ }
@@ -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),
@@ -20,6 +20,7 @@ var _menu4 = _interopRequireDefault(require("../../../plugins/link/menu"));
20
20
  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
+ var _menu7 = _interopRequireDefault(require("../../../plugins/whiteboard/menu"));
23
24
  require("./index.css");
24
25
  var InsertToolbar = function InsertToolbar(_ref) {
25
26
  var _ref$isRichEditor = _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
  };
@@ -396,9 +396,9 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
396
396
  }, []);
397
397
  var onHandleInputFocus = (0, _react.useCallback)(function (isFocus) {
398
398
  if (inputWrapperRef.current) {
399
- queueMicrotask(function () {
399
+ setTimeout(function () {
400
400
  isFocus ? inputWrapperRef.current.focus() : inputWrapperRef.current.blur();
401
- });
401
+ }, 50);
402
402
  }
403
403
  }, []);
404
404
  (0, _react.useEffect)(function () {
@@ -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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "2.0.126",
3
+ "version": "2.0.127-test-0.0.2",
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": "7af77d5a5fda5e6aaa76145cf4547f5bc66cb4b1"
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.