@seafile/sdoc-editor 3.0.124 → 3.0.125

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.
@@ -15,16 +15,17 @@ var _context = _interopRequireDefault(require("../../../context"));
15
15
  var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
16
16
  var _constants2 = require("../../constants");
17
17
  var _index = _interopRequireDefault(require("../../plugins/ai/ai-module/index.js"));
18
+ var _index2 = _interopRequireDefault(require("../../plugins/embed-link/dialog/add-embed-link-dialog/index.js"));
18
19
  var _formulaModal = _interopRequireDefault(require("../../plugins/formula/menu/formula-modal.js"));
19
20
  var _helpers = require("../../plugins/image/helpers");
20
21
  var _addLinkDialog = _interopRequireDefault(require("../../plugins/link/dialog/add-link-dialog"));
21
22
  var _dialogs = require("../../plugins/table/dialogs");
22
- var _index2 = require("../../plugins/video/constants/index.js");
23
- var _index3 = _interopRequireDefault(require("../../plugins/video/dialog/add-video-link-dialog/index.js"));
23
+ var _index3 = require("../../plugins/video/constants/index.js");
24
+ var _index4 = _interopRequireDefault(require("../../plugins/video/dialog/add-video-link-dialog/index.js"));
24
25
  var _helpers2 = require("../../plugins/video/helpers");
25
- var _index4 = _interopRequireDefault(require("../file-insert-dialog/index.js"));
26
- var _index5 = _interopRequireDefault(require("../select-file-dialog/index.js"));
27
- var _index6 = _interopRequireDefault(require("../wiki-file-insert-dialog/index.js"));
26
+ var _index5 = _interopRequireDefault(require("../file-insert-dialog/index.js"));
27
+ var _index6 = _interopRequireDefault(require("../select-file-dialog/index.js"));
28
+ var _index7 = _interopRequireDefault(require("../wiki-file-insert-dialog/index.js"));
28
29
  var InsertElementDialog = function InsertElementDialog(_ref) {
29
30
  var editor = _ref.editor;
30
31
  var _useState = (0, _react.useState)(''),
@@ -100,7 +101,7 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
100
101
  var onVideoFileChanged = (0, _react.useCallback)(function (event) {
101
102
  var files = event.target.files;
102
103
  // Show warning for 3s and no further insertion if video file is more than 5MB
103
- if (files[0].size > _index2.VIDEO_MAX_SIZE_5MB) {
104
+ if (files[0].size > _index3.VIDEO_MAX_SIZE_5MB) {
104
105
  handleDisplayAlert();
105
106
  event.target.value = null;
106
107
  return;
@@ -214,6 +215,10 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
214
215
  {
215
216
  return /*#__PURE__*/_react["default"].createElement(_addLinkDialog["default"], props);
216
217
  }
218
+ case _constants2.ELEMENT_TYPE.EMBED_LINK:
219
+ {
220
+ return /*#__PURE__*/_react["default"].createElement(_index2["default"], props);
221
+ }
217
222
  case _constants2.ELEMENT_TYPE.SDOC_LINK:
218
223
  {
219
224
  var sdocLinkProps = {
@@ -222,7 +227,7 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
222
227
  insertLinkCallback: insertLinkCallback,
223
228
  closeDialog: closeDialog
224
229
  };
225
- return /*#__PURE__*/_react["default"].createElement(_index5["default"], sdocLinkProps);
230
+ return /*#__PURE__*/_react["default"].createElement(_index6["default"], sdocLinkProps);
226
231
  }
227
232
  case _constants2.ELEMENT_TYPE.FILE_LINK:
228
233
  {
@@ -232,7 +237,7 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
232
237
  insertLinkCallback: insertLinkCallback,
233
238
  closeDialog: closeDialog
234
239
  };
235
- return /*#__PURE__*/_react["default"].createElement(_index5["default"], fileLinkProps);
240
+ return /*#__PURE__*/_react["default"].createElement(_index6["default"], fileLinkProps);
236
241
  }
237
242
  case _constants2.ELEMENT_TYPE.WHITEBOARD:
238
243
  {
@@ -242,7 +247,7 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
242
247
  insertWhiteboardFile: insertWhiteboardFile,
243
248
  closeDialog: closeDialog
244
249
  };
245
- return /*#__PURE__*/_react["default"].createElement(_index5["default"], whiteboardProps);
250
+ return /*#__PURE__*/_react["default"].createElement(_index6["default"], whiteboardProps);
246
251
  }
247
252
  case _constants2.ELEMENT_TYPE.VIDEO:
248
253
  {
@@ -252,11 +257,11 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
252
257
  insertVideoCallback: insertVideoCallback,
253
258
  closeDialog: closeDialog
254
259
  };
255
- return /*#__PURE__*/_react["default"].createElement(_index5["default"], videoProps);
260
+ return /*#__PURE__*/_react["default"].createElement(_index6["default"], videoProps);
256
261
  }
257
262
  case _constants2.ELEMENT_TYPE.VIDEO_LINK:
258
263
  {
259
- return /*#__PURE__*/_react["default"].createElement(_index3["default"], props);
264
+ return /*#__PURE__*/_react["default"].createElement(_index4["default"], props);
260
265
  }
261
266
  case _constants2.ELEMENT_TYPE.FORMULA:
262
267
  {
@@ -300,13 +305,13 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
300
305
  case _constants2.ELEMENT_TYPE.FILE_LINK_INSET_INPUT_TEMP:
301
306
  {
302
307
  if (editor.editorType === _constants.WIKI_EDITOR) {
303
- return /*#__PURE__*/_react["default"].createElement(_index6["default"], {
308
+ return /*#__PURE__*/_react["default"].createElement(_index7["default"], {
304
309
  element: slateNode,
305
310
  editor: editor,
306
311
  closeDialog: closeDialog
307
312
  });
308
313
  }
309
- return /*#__PURE__*/_react["default"].createElement(_index4["default"], {
314
+ return /*#__PURE__*/_react["default"].createElement(_index5["default"], {
310
315
  element: slateNode,
311
316
  editor: editor,
312
317
  closeDialog: closeDialog
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WIKI_LINK = exports.WHITEBOARD = exports.VIDEO_LINK = exports.VIDEO = exports.UNORDERED_LIST = exports.TWO_COLUMN = exports.TOP_LEVEL_TYPES = exports.TOGGLE_HEADER3 = exports.TOGGLE_HEADER2 = exports.TOGGLE_HEADER1 = exports.TOGGLE_HEADER = exports.TOGGLE_CONTENT = 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.FORMULA = exports.FONT_SIZE_REDUCE = exports.FONT_SIZE_INCREASE = exports.FONT_SIZE = exports.FIVE_COLUMN = exports.FILE_VIEW = 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.TOGGLE_HEADER3 = exports.TOGGLE_HEADER2 = exports.TOGGLE_HEADER1 = exports.TOGGLE_HEADER = exports.TOGGLE_CONTENT = 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.FORMULA = exports.FONT_SIZE_REDUCE = exports.FONT_SIZE_INCREASE = exports.FONT_SIZE = exports.FIVE_COLUMN = exports.FILE_VIEW = exports.FILE_LINK_INSET_INPUT_TEMP = exports.FILE_LINK = exports.EMBED_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';
@@ -51,6 +51,7 @@ var TOGGLE_HEADER1 = exports.TOGGLE_HEADER1 = 'toggle_header1';
51
51
  var TOGGLE_HEADER2 = exports.TOGGLE_HEADER2 = 'toggle_header2';
52
52
  var TOGGLE_HEADER3 = exports.TOGGLE_HEADER3 = 'toggle_header3';
53
53
  var TOGGLE_CONTENT = exports.TOGGLE_CONTENT = 'toggle_content';
54
+ var EMBED_LINK = exports.EMBED_LINK = 'embed_link';
54
55
  var ASK_AI = exports.ASK_AI = 'ask_ai';
55
56
 
56
57
  // font
@@ -311,6 +311,11 @@ var SIDE_INSERT_MENUS_CONFIG = exports.SIDE_INSERT_MENUS_CONFIG = (_SIDE_INSERT_
311
311
  iconClass: 'sdocfont sdoc-link',
312
312
  type: _elementType.LINK,
313
313
  text: 'Link'
314
+ }), _elementType.EMBED_LINK, {
315
+ id: '',
316
+ iconClass: 'sdocfont sdoc-embed-link',
317
+ type: _elementType.EMBED_LINK,
318
+ text: 'Embed_link'
314
319
  }), _elementType.CODE_BLOCK, {
315
320
  id: '',
316
321
  iconClass: 'sdocfont sdoc-code-block',
@@ -335,12 +340,12 @@ var SIDE_INSERT_MENUS_CONFIG = exports.SIDE_INSERT_MENUS_CONFIG = (_SIDE_INSERT_
335
340
  iconClass: 'sdocfont sdoc-check-square',
336
341
  type: _elementType.CHECK_LIST_ITEM,
337
342
  text: 'Check_list'
338
- }), _elementType.PARAGRAPH, {
343
+ }), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_INSERT_MENUS_CO, _elementType.PARAGRAPH, {
339
344
  id: _elementType.PARAGRAPH,
340
345
  iconClass: 'sdocfont sdoc-text',
341
346
  type: _elementType.PARAGRAPH,
342
347
  text: 'Paragraph'
343
- }), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_INSERT_MENUS_CO, _elementType.HEADER, [{
348
+ }), _elementType.HEADER, [{
344
349
  id: _elementType.HEADER1,
345
350
  iconClass: 'sdocfont sdoc-header1',
346
351
  type: _elementType.HEADER1,
@@ -402,7 +407,7 @@ var SIDE_INSERT_MENUS_CONFIG = exports.SIDE_INSERT_MENUS_CONFIG = (_SIDE_INSERT_
402
407
  text: 'Formula'
403
408
  }));
404
409
  var SIDE_INSERT_MENUS_SEARCH_MAP = exports.SIDE_INSERT_MENUS_SEARCH_MAP = (_SIDE_INSERT_MENUS_SE = {}, (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"])(_SIDE_INSERT_MENUS_SE, _elementType.IMAGE, 'Image'), _elementType.VIDEO, 'Video'), _elementType.TABLE, 'Table'), _elementType.COLUMN, 'Column'), _elementType.TWO_COLUMN, 'Two_column'), _elementType.THREE_COLUMN, 'Three_column'), _elementType.FOUR_COLUMN, 'Four_column'), _elementType.LINK, 'Link'), _elementType.CODE_BLOCK, 'Code_block'), _elementType.CALL_OUT, 'Callout'), (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"])(_SIDE_INSERT_MENUS_SE, _elementType.UNORDERED_LIST, 'Unordered_list'), _elementType.ORDERED_LIST, 'Ordered_list'), _elementType.CHECK_LIST_ITEM, 'Check_list'), _elementType.PARAGRAPH, 'Paragraph'), _elementType.HEADER1, 'Header_one'), _elementType.HEADER2, 'Header_two'), _elementType.HEADER3, 'Header_three'), _elementType.HEADER4, 'Header_four'), _elementType.TOGGLE_HEADER1, 'Toggle_header_one'), _elementType.TOGGLE_HEADER2, 'Toggle_header_two'), (0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_INSERT_MENUS_SE, _elementType.TOGGLE_HEADER3, 'Toggle_header_three'), _elementType.FILE_VIEW, 'File_view'));
405
- var SIDE_QUICK_INSERT_MENUS_SEARCH_MAP = exports.SIDE_QUICK_INSERT_MENUS_SEARCH_MAP = (_SIDE_QUICK_INSERT_ME = {}, (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"])(_SIDE_QUICK_INSERT_ME, _elementType.IMAGE, 'Image'), _elementType.VIDEO, 'Video'), _elementType.TABLE, 'Table'), _elementType.COLUMN, 'Column'), _elementType.TWO_COLUMN, 'Two_column'), _elementType.THREE_COLUMN, 'Three_column'), _elementType.FOUR_COLUMN, 'Four_column'), _elementType.LINK, 'Link'), _elementType.CODE_BLOCK, 'Code_block'), _elementType.CALL_OUT, 'Callout'), (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"])(_SIDE_QUICK_INSERT_ME, _elementType.UNORDERED_LIST, 'Unordered_list'), _elementType.ORDERED_LIST, 'Ordered_list'), _elementType.CHECK_LIST_ITEM, 'Check_list'), _elementType.PARAGRAPH, 'Paragraph'), _elementType.HEADER1, 'Header_one'), _elementType.HEADER2, 'Header_two'), _elementType.HEADER3, 'Header_three'), _elementType.HEADER4, 'Header_four'), _elementType.FILE_VIEW, 'File_view'), _elementType.FORMULA, 'Formula'), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_QUICK_INSERT_ME, _elementType.TOGGLE_HEADER1, 'Toggle_header_one'), _elementType.TOGGLE_HEADER2, 'Toggle_header_two'), _elementType.TOGGLE_HEADER3, 'Toggle_header_three'));
410
+ var SIDE_QUICK_INSERT_MENUS_SEARCH_MAP = exports.SIDE_QUICK_INSERT_MENUS_SEARCH_MAP = (_SIDE_QUICK_INSERT_ME = {}, (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"])(_SIDE_QUICK_INSERT_ME, _elementType.IMAGE, 'Image'), _elementType.VIDEO, 'Video'), _elementType.TABLE, 'Table'), _elementType.COLUMN, 'Column'), _elementType.TWO_COLUMN, 'Two_column'), _elementType.THREE_COLUMN, 'Three_column'), _elementType.FOUR_COLUMN, 'Four_column'), _elementType.LINK, 'Link'), _elementType.CODE_BLOCK, 'Code_block'), _elementType.CALL_OUT, 'Callout'), (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"])(_SIDE_QUICK_INSERT_ME, _elementType.UNORDERED_LIST, 'Unordered_list'), _elementType.ORDERED_LIST, 'Ordered_list'), _elementType.CHECK_LIST_ITEM, 'Check_list'), _elementType.PARAGRAPH, 'Paragraph'), _elementType.HEADER1, 'Header_one'), _elementType.HEADER2, 'Header_two'), _elementType.HEADER3, 'Header_three'), _elementType.HEADER4, 'Header_four'), _elementType.FILE_VIEW, 'File_view'), _elementType.FORMULA, 'Formula'), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_QUICK_INSERT_ME, _elementType.TOGGLE_HEADER1, 'Toggle_header_one'), _elementType.TOGGLE_HEADER2, 'Toggle_header_two'), _elementType.TOGGLE_HEADER3, 'Toggle_header_three'), _elementType.EMBED_LINK, 'Embed_link'));
406
411
 
407
412
  // Other operations menu config
408
413
  var SIDE_OTHER_OPERATIONS_MENUS_SEARCH_MAP = exports.SIDE_OTHER_OPERATIONS_MENUS_SEARCH_MAP = {
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.EMBED_LINK_SOURCE = void 0;
7
+ var EMBED_LINK_SOURCE = exports.EMBED_LINK_SOURCE = {
8
+ SEATABLE: 'seatable',
9
+ FIGMA: 'figma'
10
+ };
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _reactI18next = require("react-i18next");
12
+ var _reactstrap = require("reactstrap");
13
+ var _helper = require("../../helper");
14
+ var AddEmbedLinkDialog = function AddEmbedLinkDialog(_ref) {
15
+ var editor = _ref.editor,
16
+ className = _ref.className,
17
+ closeDialog = _ref.closeDialog,
18
+ handleSubmit = _ref.handleSubmit;
19
+ var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
20
+ t = _useTranslation.t;
21
+ var _useState = (0, _react.useState)(''),
22
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
23
+ linkErrorMessage = _useState2[0],
24
+ setLinkErrorMessage = _useState2[1];
25
+ var _useState3 = (0, _react.useState)(''),
26
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
27
+ url = _useState4[0],
28
+ setURL = _useState4[1];
29
+ var submit = (0, _react.useCallback)(function () {
30
+ setLinkErrorMessage('');
31
+ if (!url) {
32
+ setLinkErrorMessage(t('The_link_address_is_required'));
33
+ return;
34
+ }
35
+ var embedLinkType = (0, _helper.getEmbedLinkType)(url);
36
+ if (!embedLinkType) {
37
+ setLinkErrorMessage(t('The_link_address_is_invalid'));
38
+ return;
39
+ }
40
+ (0, _helper.insertEmbedLink)(editor, url, embedLinkType);
41
+ handleSubmit && handleSubmit();
42
+ closeDialog();
43
+
44
+ // eslint-disable-next-line react-hooks/exhaustive-deps
45
+ }, [editor, url]);
46
+ var onKeyDown = (0, _react.useCallback)(function (event) {
47
+ if (event.keyCode === 13) {
48
+ event.preventDefault();
49
+ submit();
50
+ return;
51
+ }
52
+ // eslint-disable-next-line react-hooks/exhaustive-deps
53
+ }, [editor, url]);
54
+ var handleUrlChange = (0, _react.useCallback)(function (event) {
55
+ var embedLinkUrl = event.target.value.trim();
56
+ if (embedLinkUrl === url) return;
57
+ setURL(embedLinkUrl);
58
+ }, [url]);
59
+ var close = (0, _react.useMemo)(function () {
60
+ return /*#__PURE__*/_react["default"].createElement("span", {
61
+ className: "sdoc-add-link-close-icon",
62
+ onClick: closeDialog
63
+ }, /*#__PURE__*/_react["default"].createElement("i", {
64
+ className: "sdocfont sdoc-sm-close",
65
+ "aria-hidden": "true"
66
+ }));
67
+ }, [closeDialog]);
68
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.Modal, {
69
+ isOpen: true,
70
+ autoFocus: false,
71
+ toggle: closeDialog,
72
+ className: className,
73
+ zIndex: 1071,
74
+ returnFocusAfterClose: false
75
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalHeader, {
76
+ close: close
77
+ }, t('Embed_link')), /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalBody, null, /*#__PURE__*/_react["default"].createElement(_react.Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
78
+ className: "form-group"
79
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Label, {
80
+ "for": "addLink"
81
+ }, t('Link_address')), /*#__PURE__*/_react["default"].createElement("input", {
82
+ onKeyDown: onKeyDown,
83
+ autoFocus: true,
84
+ type: "url",
85
+ className: "form-control",
86
+ id: "addVideoLink",
87
+ value: url || '',
88
+ onChange: handleUrlChange
89
+ }), linkErrorMessage && /*#__PURE__*/_react["default"].createElement(_reactstrap.Alert, {
90
+ color: "danger",
91
+ className: "mt-2"
92
+ }, t(linkErrorMessage))), /*#__PURE__*/_react["default"].createElement("div", {
93
+ style: {
94
+ textAlign: 'center',
95
+ fontSize: '12px',
96
+ color: '#787774'
97
+ }
98
+ }, t('Support_Figma_Seatable_link')))), /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalFooter, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
99
+ color: "secondary",
100
+ onClick: closeDialog
101
+ }, t('Cancel')), /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
102
+ color: "primary",
103
+ disabled: false,
104
+ onClick: submit
105
+ }, t('Add_link'))));
106
+ };
107
+ var _default = exports["default"] = AddEmbedLinkDialog;
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.normalizeFigmaEmbedLink = exports.isInsertEmbedLinkDisabled = exports.insertEmbedLink = exports.getEmbedLinkType = exports.generateEmbedLinkNode = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
9
+ var _slate = require("@seafile/slate");
10
+ var _slateReact = require("@seafile/slate-react");
11
+ var _slugid = _interopRequireDefault(require("slugid"));
12
+ var _constants = require("../../constants");
13
+ var _elementType = require("../../constants/element-type");
14
+ var _core = require("../../core");
15
+ var _constants2 = require("./constants");
16
+ var isInsertEmbedLinkDisabled = exports.isInsertEmbedLinkDisabled = function isInsertEmbedLinkDisabled(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 (_constants.TOGGLE_TITLE_TYPES.includes(type)) return true;
29
+ if (type === _constants.CODE_BLOCK) return true;
30
+ if (type.startsWith('header')) return true;
31
+ if (type === _constants.TITLE) return true;
32
+ if (type === _constants.SUBTITLE) return true;
33
+ if (type === _constants.LIST_ITEM) return true;
34
+ if (type === _constants.CHECK_LIST_ITEM) return true;
35
+ if (type === _constants.MULTI_COLUMN) return true;
36
+ if (type === _constants.BLOCKQUOTE) return true;
37
+ if (type === _constants.CALL_OUT) return true;
38
+ if (_slate.Editor.isVoid(editor, n)) return true;
39
+ return false;
40
+ },
41
+ universal: true
42
+ }),
43
+ _Editor$nodes2 = (0, _slicedToArray2["default"])(_Editor$nodes, 1),
44
+ match = _Editor$nodes2[0];
45
+ if (match) return true;
46
+ return false;
47
+ };
48
+ var getEmbedLinkType = exports.getEmbedLinkType = function getEmbedLinkType(text) {
49
+ var link = text.trim();
50
+ try {
51
+ var url = new URL(link);
52
+ var host = url.hostname.toLowerCase();
53
+ var path = url.pathname.toLowerCase();
54
+ // SeaTable
55
+ var isSeaTable = /(^|\.)seatable\.cn$/.test(host) && /^\/workspace\/\d+\/dtable\/.+/.test(path);
56
+ if (isSeaTable) return _constants2.EMBED_LINK_SOURCE.SEATABLE;
57
+
58
+ // Figma
59
+ var isFigma = /(^|\.)figma\.com$/.test(host) && /^\/(design|file|proto|board|slides)\//.test(path);
60
+ if (isFigma) return _constants2.EMBED_LINK_SOURCE.FIGMA;
61
+ return null;
62
+ } catch (e) {
63
+ return null;
64
+ }
65
+ };
66
+ var normalizeFigmaEmbedLink = exports.normalizeFigmaEmbedLink = function normalizeFigmaEmbedLink(text) {
67
+ var link = text.trim();
68
+ try {
69
+ var url = new URL(link);
70
+ var host = url.hostname.toLowerCase();
71
+ if (host === 'embed.figma.com') {
72
+ return url.toString();
73
+ }
74
+ if (!/(^|\.)figma\.com$/i.test(host)) return null;
75
+ if (!/^\/(design|file|proto|board|slides)\//i.test(url.pathname)) return null;
76
+ var embedUrl = new URL(url);
77
+ embedUrl.hostname = 'embed.figma.com';
78
+ embedUrl.searchParams["delete"]('t');
79
+ embedUrl.searchParams.set('embed-host', 'share');
80
+ return embedUrl.toString();
81
+ } catch (e) {
82
+ return null;
83
+ }
84
+ };
85
+ var generateEmbedLinkNode = exports.generateEmbedLinkNode = function generateEmbedLinkNode(link, type) {
86
+ var embedLinkNode = {
87
+ id: _slugid["default"].nice(),
88
+ type: _elementType.EMBED_LINK,
89
+ link: link,
90
+ link_type: type,
91
+ children: [{
92
+ id: _slugid["default"].nice(),
93
+ text: ''
94
+ }]
95
+ };
96
+ return embedLinkNode;
97
+ };
98
+ var insertEmbedLink = exports.insertEmbedLink = function insertEmbedLink(editor, link, type) {
99
+ var _editor$selection;
100
+ if (isInsertEmbedLinkDisabled(editor)) return;
101
+ if (editor.selection == null) return;
102
+ var embedLinkNode = generateEmbedLinkNode(link, type);
103
+ var path = (_editor$selection = editor.selection) === null || _editor$selection === void 0 ? void 0 : _editor$selection.anchor.path;
104
+
105
+ // When inserting embed link in the toggle content, insert current
106
+ var currentToggleContentEntry = (0, _core.getSelectedNodeEntryByType)(editor, _constants.TOGGLE_CONTENT);
107
+ if (currentToggleContentEntry) {
108
+ _slate.Transforms.insertNodes(editor, embedLinkNode, {
109
+ at: path.slice(0, -1)
110
+ });
111
+ _slate.Transforms.select(editor, _slate.Editor.start(editor, path));
112
+ _slateReact.ReactEditor.focus(editor);
113
+ return;
114
+ }
115
+ var position = 'after';
116
+ if (position === _constants.INSERT_POSITION.AFTER) {
117
+ _slate.Transforms.insertNodes(editor, embedLinkNode, {
118
+ at: [path[0] + 1]
119
+ });
120
+ var nextPath = _slate.Path.next([path[0] + 1]);
121
+ if (!(0, _core.getNode)(editor, nextPath)) {
122
+ _slate.Transforms.insertNodes(editor, (0, _core.generateDefaultParagraph)(), {
123
+ at: nextPath
124
+ });
125
+ }
126
+ var endOfFirstNode = _slate.Editor.start(editor, nextPath);
127
+ var range = {
128
+ anchor: endOfFirstNode,
129
+ focus: endOfFirstNode
130
+ };
131
+ (0, _core.focusEditor)(editor, range);
132
+ return;
133
+ }
134
+ };
@@ -0,0 +1,50 @@
1
+ .sdoc-embed-link-hover-menu-container {
2
+ position: absolute;
3
+ height: 42px;
4
+ z-index: 101;
5
+ width: auto;
6
+ }
7
+
8
+ .sdoc-embed-link-hover-menu-container .hover-menu-container {
9
+ height: 36px;
10
+ background-color: #fff;
11
+ display: flex;
12
+ justify-content: flex-start;
13
+ align-items: center;
14
+ border-radius: 3px;
15
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08);
16
+ border: 1px solid #e8e8e8;
17
+ }
18
+
19
+ .sdoc-embed-link-hover-menu-container .hover-menu-container>span {
20
+ padding: 0 8px;
21
+ }
22
+
23
+ .sdoc-embed-link-hover-menu-container .hover-menu-container>span:not(:last-of-type) {
24
+ padding: 0 8px;
25
+ border-right: 1px solid #e5e5e5;
26
+ }
27
+
28
+ .sdoc-embed-link-hover-menu-container .hover-menu-container .op-item {
29
+ position: relative;
30
+ font-size: 12px;
31
+ color: #212529;
32
+ padding: 0 5px;
33
+ border-radius: 2px;
34
+ min-width: 24px;
35
+ height: 24px;
36
+ display: inline-flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ }
40
+
41
+ .sdoc-embed-link-hover-menu-container .hover-menu-container .op-item:hover {
42
+ text-decoration: none;
43
+ background: #EFEFEF;
44
+ }
45
+
46
+ .sdoc-embed-link-hover-menu-container .hover-menu-container .sdocfont {
47
+ line-height: 1;
48
+ font-size: 14px;
49
+ color: #666;
50
+ }
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _reactI18next = require("react-i18next");
12
+ var _tooltip = _interopRequireDefault(require("../../../../components/tooltip"));
13
+ var _commons = require("../../../commons");
14
+ require("./index.css");
15
+ var EmbedLinkHoverMenu = function EmbedLinkHoverMenu(_ref) {
16
+ var isValidUrl = _ref.isValidUrl,
17
+ menuPosition = _ref.menuPosition,
18
+ onOpen = _ref.onOpen,
19
+ openFullscreen = _ref.openFullscreen,
20
+ onDeleteEmbedLink = _ref.onDeleteEmbedLink;
21
+ var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
22
+ t = _useTranslation.t;
23
+ var _useState = (0, _react.useState)(false),
24
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
25
+ showTooltip = _useState2[0],
26
+ setShowTooltip = _useState2[1];
27
+ (0, _react.useEffect)(function () {
28
+ setShowTooltip(true);
29
+ }, []);
30
+ return /*#__PURE__*/_react["default"].createElement(_commons.ElementPopover, null, /*#__PURE__*/_react["default"].createElement("div", {
31
+ className: "sdoc-embed-link-hover-menu-container",
32
+ style: menuPosition
33
+ }, /*#__PURE__*/_react["default"].createElement("div", {
34
+ className: "hover-menu-container"
35
+ }, isValidUrl && /*#__PURE__*/_react["default"].createElement("span", {
36
+ className: "op-group-item"
37
+ }, /*#__PURE__*/_react["default"].createElement("span", {
38
+ id: "sdoc_embed_link_open",
39
+ role: "button",
40
+ className: "op-item",
41
+ onClick: onOpen
42
+ }, /*#__PURE__*/_react["default"].createElement("span", {
43
+ className: "mr-1"
44
+ }, t('Open')))), /*#__PURE__*/_react["default"].createElement("span", {
45
+ className: "op-group-item"
46
+ }, /*#__PURE__*/_react["default"].createElement("span", {
47
+ id: "sdoc_embed_link_delete",
48
+ role: "button",
49
+ className: "op-item",
50
+ onClick: onDeleteEmbedLink
51
+ }, /*#__PURE__*/_react["default"].createElement("i", {
52
+ className: "sdocfont sdoc-delete"
53
+ }), showTooltip && /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
54
+ target: "sdoc_embed_link_delete",
55
+ placement: "top",
56
+ fade: true
57
+ }, t('Delete')))), isValidUrl && /*#__PURE__*/_react["default"].createElement("span", {
58
+ className: "op-group-item"
59
+ }, /*#__PURE__*/_react["default"].createElement("span", {
60
+ id: "sdoc_embed_link_full_screen_mode",
61
+ role: "button",
62
+ className: "op-item",
63
+ onClick: openFullscreen
64
+ }, /*#__PURE__*/_react["default"].createElement("i", {
65
+ className: "sdocfont sdoc-fullscreen icon-font"
66
+ }), showTooltip && /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
67
+ target: "sdoc_embed_link_full_screen_mode",
68
+ placement: "top",
69
+ fade: true
70
+ }, t('Full_screen_mode')))))));
71
+ };
72
+ var _default = exports["default"] = EmbedLinkHoverMenu;
@@ -0,0 +1,69 @@
1
+ .sdoc-embed-link-container {
2
+ position: relative;
3
+ width: 100%;
4
+ height: 300px;
5
+ border: 1px solid #ccc;
6
+ margin: 5px 0;
7
+ }
8
+
9
+ .sdoc-embed-link-container.isSelected {
10
+ border: 2px solid rgb(0, 123, 255);
11
+ }
12
+
13
+ .sdoc-embed-link-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: 3;
23
+ }
24
+
25
+ .sdoc-embed-link-container .iframe-overlay {
26
+ position: absolute;
27
+ top: 0;
28
+ left: 0;
29
+ width: 100%;
30
+ height: 100%;
31
+ cursor: pointer;
32
+ z-index: 2;
33
+ }
34
+
35
+ .sdoc-embed-link-container .sdoc-embed-link-element {
36
+ width: 100%;
37
+ height: 100%;
38
+ border: none;
39
+ position: relative;
40
+ z-index: 1;
41
+ }
42
+
43
+ .embed-link-zoom-out-container {
44
+ position: fixed;
45
+ inset: 0;
46
+ background: rgba(0, 0, 0, 0.7);
47
+ display: flex;
48
+ justify-content: center;
49
+ align-items: center;
50
+ z-index: 9999;
51
+ }
52
+
53
+ .embed-link-zoom-out-container .sdoc-embed-link-element-full-screen {
54
+ pointer-events: auto;
55
+ background: #fff;
56
+ border-radius: 12px;
57
+ width: 80%;
58
+ height: 80%;
59
+ overflow: auto;
60
+ }
61
+
62
+ .sdoc-embed-link-tip {
63
+ width: 100%;
64
+ height: 100%;
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: center;
68
+ color: red;
69
+ }
@@ -0,0 +1,16 @@
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 _elementType = require("../../constants/element-type");
9
+ var _plugin = _interopRequireDefault(require("./plugin"));
10
+ var _renderElem = require("./render-elem");
11
+ var EmbedLinkPlugin = {
12
+ type: _elementType.EMBED_LINK,
13
+ editorPlugin: _plugin["default"],
14
+ renderElements: [_renderElem.renderEmbedLink]
15
+ };
16
+ var _default = exports["default"] = EmbedLinkPlugin;
@@ -0,0 +1,54 @@
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 _elementType = require("../../constants/element-type");
14
+ var _core = require("../../core");
15
+ var _helpers = require("../../toolbar/side-toolbar/helpers");
16
+ var withEmbedLink = function withEmbedLink(editor) {
17
+ var isVoid = editor.isVoid,
18
+ onHotKeyDown = editor.onHotKeyDown;
19
+ var newEditor = editor;
20
+
21
+ // Make embed link as void node
22
+ newEditor.isVoid = function (elem) {
23
+ var type = elem.type;
24
+ if (type === _elementType.EMBED_LINK) {
25
+ return true;
26
+ }
27
+ return isVoid(elem);
28
+ };
29
+ newEditor.onHotKeyDown = function (event) {
30
+ var _ref = (0, _core.getSelectedNodeEntryByType)(editor, _elementType.EMBED_LINK) || [],
31
+ _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
32
+ embedLinkNode = _ref2[0],
33
+ path = _ref2[1];
34
+ if (path) {
35
+ // Insert empty paragraph node after embed link when clicking 'enter' on selected embed link
36
+ if ((0, _isHotkey["default"])('enter', event)) {
37
+ event.preventDefault();
38
+ var emptyParagraph = (0, _core.generateEmptyElement)(_constants.PARAGRAPH);
39
+ _slate.Transforms.insertNodes(editor, emptyParagraph, {
40
+ at: _slate.Path.next(path)
41
+ });
42
+ var focusPoint = _slate.Editor.end(editor, _slate.Path.next(path));
43
+ (0, _core.focusEditor)(newEditor, focusPoint);
44
+ }
45
+ if ((0, _isHotkey["default"])('mod+c', event)) {
46
+ (0, _helpers.onCopyNode)(editor, embedLinkNode);
47
+ }
48
+ return true;
49
+ }
50
+ return onHotKeyDown && onHotKeyDown(event);
51
+ };
52
+ return newEditor;
53
+ };
54
+ var _default = exports["default"] = withEmbedLink;
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.renderEmbedLink = renderEmbedLink;
9
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createForOfIteratorHelper"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
11
+ var _react = _interopRequireWildcard(require("react"));
12
+ var _reactDom = _interopRequireDefault(require("react-dom"));
13
+ var _reactI18next = require("react-i18next");
14
+ var _slate = require("@seafile/slate");
15
+ var _slateReact = require("@seafile/slate-react");
16
+ var _classnames = _interopRequireDefault(require("classnames"));
17
+ var _isUrl = _interopRequireDefault(require("is-url"));
18
+ var _useScrollContext = require("../../../hooks/use-scroll-context");
19
+ var _core = require("../../core");
20
+ var _utils = require("../../utils");
21
+ var _constants = require("./constants");
22
+ var _helper = require("./helper");
23
+ var _hoverMenu = _interopRequireDefault(require("./hover-menu"));
24
+ require("./index.css");
25
+ var EmbedLink = function EmbedLink(_ref) {
26
+ var editor = _ref.editor,
27
+ element = _ref.element;
28
+ var EmbedLinkRef = (0, _react.useRef)();
29
+ var fullscreenRef = (0, _react.useRef)();
30
+ var scrollRef = (0, _useScrollContext.useScrollContext)();
31
+ var isSelected = (0, _slateReact.useSelected)();
32
+ var readOnly = (0, _slateReact.useReadOnly)();
33
+ var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
34
+ t = _useTranslation.t;
35
+ var _useState = (0, _react.useState)({
36
+ top: '',
37
+ left: ''
38
+ }),
39
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
40
+ menuPosition = _useState2[0],
41
+ setMenuPosition = _useState2[1];
42
+ var _useState3 = (0, _react.useState)(false),
43
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
44
+ isShowZoomOut = _useState4[0],
45
+ setIsShowZoomOut = _useState4[1];
46
+ var originalLink = element.link,
47
+ link_type = element.link_type;
48
+ var link = originalLink;
49
+ if (link_type === _constants.EMBED_LINK_SOURCE.FIGMA) {
50
+ link = (0, _helper.normalizeFigmaEmbedLink)(originalLink);
51
+ }
52
+ var isValidUrl = (0, _react.useMemo)(function () {
53
+ return (0, _isUrl["default"])(link);
54
+ }, [link]);
55
+ var onDeleteEmbedLink = (0, _react.useCallback)(function () {
56
+ var path = _slateReact.ReactEditor.findPath(editor, element);
57
+ _slate.Transforms.removeNodes(editor, {
58
+ at: path
59
+ });
60
+ (0, _core.focusEditor)(editor);
61
+ _slate.Transforms.select(editor, editor.selection);
62
+ }, [editor, element]);
63
+ var handleDoubleClick = function handleDoubleClick(event) {
64
+ event.preventDefault();
65
+ if (!isValidUrl) return;
66
+ window.open(link, '_blank');
67
+ return;
68
+ };
69
+ var handleScroll = (0, _react.useCallback)(function (e) {
70
+ if (readOnly) return;
71
+ if (!isSelected && !isShowZoomOut) return;
72
+ var menuPosition = (0, _utils.getMenuPosition)(EmbedLinkRef.current, editor);
73
+ setMenuPosition(menuPosition);
74
+ }, [editor, isSelected, readOnly, isShowZoomOut]);
75
+ (0, _react.useEffect)(function () {
76
+ if (readOnly) return;
77
+ var observerRefValue = null;
78
+ var resizeObserver = null;
79
+ if (scrollRef.current) {
80
+ scrollRef.current.addEventListener('scroll', handleScroll);
81
+ observerRefValue = scrollRef.current;
82
+ resizeObserver = new ResizeObserver(function (entries) {
83
+ // eslint-disable-next-line no-unused-vars
84
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(entries),
85
+ _step;
86
+ try {
87
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
88
+ var entry = _step.value;
89
+ if (resizeObserver) {
90
+ handleScroll();
91
+ }
92
+ }
93
+ } catch (err) {
94
+ _iterator.e(err);
95
+ } finally {
96
+ _iterator.f();
97
+ }
98
+ });
99
+ resizeObserver.observe(scrollRef.current);
100
+ }
101
+ return function () {
102
+ observerRefValue.removeEventListener('scroll', handleScroll);
103
+ if (resizeObserver) {
104
+ resizeObserver.disconnect();
105
+ }
106
+ };
107
+ }, [handleScroll, readOnly, scrollRef]);
108
+ var handleOnClick = (0, _react.useCallback)(function () {
109
+ if (readOnly) return;
110
+ if (isSelected) {
111
+ var _menuPosition = (0, _utils.getMenuPosition)(EmbedLinkRef.current, editor);
112
+ setMenuPosition(_menuPosition);
113
+ }
114
+ }, [editor, isSelected, readOnly]);
115
+ var openFullscreen = function openFullscreen(e) {
116
+ e.stopPropagation();
117
+ setIsShowZoomOut(true);
118
+ };
119
+ (0, _react.useEffect)(function () {
120
+ var handleKeyDown = function handleKeyDown(e) {
121
+ if (e.key === 'Escape') {
122
+ setIsShowZoomOut(false);
123
+ }
124
+ };
125
+ if (isShowZoomOut) {
126
+ document.addEventListener('keydown', handleKeyDown);
127
+ }
128
+ return function () {
129
+ document.removeEventListener('keydown', handleKeyDown);
130
+ };
131
+ }, [isShowZoomOut, setIsShowZoomOut]);
132
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
133
+ className: (0, _classnames["default"])('sdoc-embed-link-container', {
134
+ 'isSelected': isSelected
135
+ }),
136
+ onDoubleClick: handleDoubleClick,
137
+ scrolling: "no"
138
+ }, isValidUrl && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("iframe", {
139
+ className: "sdoc-embed-link-element ".concat(link_type),
140
+ title: link,
141
+ src: link,
142
+ ref: EmbedLinkRef
143
+ }), /*#__PURE__*/_react["default"].createElement("div", {
144
+ className: "iframe-overlay",
145
+ onDoubleClick: handleDoubleClick,
146
+ onClick: handleOnClick
147
+ })), !isValidUrl && /*#__PURE__*/_react["default"].createElement("div", {
148
+ ref: EmbedLinkRef,
149
+ className: "sdoc-embed-link-tip"
150
+ }, t('Embed_link_invalid_tip'))), isSelected && !readOnly && !isShowZoomOut && /*#__PURE__*/_react["default"].createElement(_hoverMenu["default"], {
151
+ isValidUrl: isValidUrl,
152
+ menuPosition: menuPosition,
153
+ onOpen: handleDoubleClick,
154
+ openFullscreen: openFullscreen,
155
+ onDeleteEmbedLink: onDeleteEmbedLink
156
+ }), isShowZoomOut && (/*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement("div", {
157
+ className: "embed-link-zoom-out-container",
158
+ onClick: function onClick() {
159
+ return setIsShowZoomOut(false);
160
+ }
161
+ }, /*#__PURE__*/_react["default"].createElement("iframe", {
162
+ title: link,
163
+ className: "sdoc-embed-link-element-full-screen ".concat(link_type),
164
+ src: link,
165
+ ref: fullscreenRef
166
+ })), document.body)));
167
+ };
168
+ function renderEmbedLink(props, editor) {
169
+ var element = props.element,
170
+ children = props.children,
171
+ attributes = props.attributes;
172
+ return /*#__PURE__*/_react["default"].createElement("div", Object.assign({}, attributes, {
173
+ contentEditable: "false",
174
+ suppressContentEditableWarning: true
175
+ }), children, /*#__PURE__*/_react["default"].createElement(EmbedLink, {
176
+ editor: editor,
177
+ element: element,
178
+ contentEditable: "false"
179
+ }));
180
+ }
@@ -29,6 +29,12 @@ Object.defineProperty(exports, "CodeBlockPlugin", {
29
29
  }
30
30
  });
31
31
  exports.CommentPlugins = void 0;
32
+ Object.defineProperty(exports, "EmbedLinkPlugin", {
33
+ enumerable: true,
34
+ get: function get() {
35
+ return _embedLink["default"];
36
+ }
37
+ });
32
38
  Object.defineProperty(exports, "FileLinkPlugin", {
33
39
  enumerable: true,
34
40
  get: function get() {
@@ -178,6 +184,7 @@ var _blockquote = _interopRequireDefault(require("./blockquote"));
178
184
  var _callout = _interopRequireDefault(require("./callout"));
179
185
  var _checkList = _interopRequireDefault(require("./check-list"));
180
186
  var _codeBlock = _interopRequireDefault(require("./code-block"));
187
+ var _embedLink = _interopRequireDefault(require("./embed-link"));
181
188
  var _fileLink = _interopRequireDefault(require("./file-link"));
182
189
  var _fileView = _interopRequireDefault(require("./file-view"));
183
190
  var _font = _interopRequireDefault(require("./font"));
@@ -202,7 +209,7 @@ var _toggleHeader = _interopRequireDefault(require("./toggle-header"));
202
209
  var _video = _interopRequireDefault(require("./video"));
203
210
  var _whiteboard = _interopRequireDefault(require("./whiteboard"));
204
211
  var _wikiLink = _interopRequireDefault(require("./wiki-link"));
205
- 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"], _fileView["default"], _formula["default"], _toggleHeader["default"]];
212
+ 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"], _fileView["default"], _formula["default"], _toggleHeader["default"], _embedLink["default"]];
206
213
  var WikiPlugins = exports.WikiPlugins = [].concat(Plugins, [_wikiLink["default"], _fileView["default"]]);
207
214
  var CommentPlugins = exports.CommentPlugins = [_markdown["default"], _html["default"], _paragraph["default"], _textStyle["default"], _list["default"], _image["default"], _link["default"], _mention["default"], _blockquote["default"]];
208
215
  var _default = exports["default"] = Plugins;
@@ -19,9 +19,10 @@ var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
19
19
  var _constants2 = require("../../constants");
20
20
  var _core = require("../../core");
21
21
  var _utils = require("../../utils");
22
+ var _helper = require("../embed-link/helper");
22
23
  var _helpers = require("../file-link/helpers");
23
24
  var _helpers2 = require("../sdoc-link/helpers");
24
- var _helper = require("../whiteboard/helper");
25
+ var _helper2 = require("../whiteboard/helper");
25
26
  var _helpers3 = require("../wiki-link/helpers");
26
27
  var _helpers4 = require("./helpers");
27
28
  var withLink = function withLink(editor) {
@@ -43,7 +44,7 @@ var withLink = function withLink(editor) {
43
44
  };
44
45
  newEditor.insertData = /*#__PURE__*/function () {
45
46
  var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regenerator2["default"])().m(function _callee(data) {
46
- var text, selectedElems, isCodeContext, res, fileName, fileUuid, _fileName, fileParentPath, filePath, repoId, _fileName2, _fileUuid, url, pathname, _context$getSetting, parts, wikiPageId, title, wikiPageList, page, linkedNodeId, _title, params, link, _link, _link2, _Editor$next, _Editor$next2, focusPath, focusPoint, _t;
47
+ var text, selectedElems, isCodeContext, res, fileName, fileUuid, _fileName, fileParentPath, filePath, repoId, _fileName2, _fileUuid, url, pathname, _context$getSetting, parts, wikiPageId, title, wikiPageList, page, linkedNodeId, _title, params, link, _link, embedLinkType, _link2, _Editor$next, _Editor$next2, focusPath, focusPoint, _t;
47
48
  return (0, _regenerator2["default"])().w(function (_context) {
48
49
  while (1) switch (_context.p = _context.n) {
49
50
  case 0:
@@ -60,7 +61,7 @@ var withLink = function withLink(editor) {
60
61
  return _context.a(2, insertData(data));
61
62
  case 1:
62
63
  if (!((0, _isUrl["default"])(text) && !(0, _utils.isImage)(text))) {
63
- _context.n = 15;
64
+ _context.n = 16;
64
65
  break;
65
66
  }
66
67
  if (!(0, _utils.isSameDomain)(text, _context2["default"].getSetting('serviceUrl'))) {
@@ -90,7 +91,7 @@ var withLink = function withLink(editor) {
90
91
  fileParentPath = res.data.files_info[text].parent_path;
91
92
  filePath = fileParentPath + '/' + _fileName;
92
93
  repoId = res.data.files_info[text].repo_id;
93
- (0, _helper.insertWhiteboard)(editor, _fileName, filePath, repoId);
94
+ (0, _helper2.insertWhiteboard)(editor, _fileName, filePath, repoId);
94
95
  _context.n = 10;
95
96
  break;
96
97
  case 5:
@@ -153,20 +154,29 @@ var withLink = function withLink(editor) {
153
154
  _link = (0, _helpers4.genLinkNode)(text, text);
154
155
  _slate.Transforms.insertNodes(newEditor, _link);
155
156
  case 12:
156
- _context.n = 14;
157
+ _context.n = 15;
157
158
  break;
158
159
  case 13:
160
+ // Paste Seatable or Figma link
161
+ embedLinkType = (0, _helper.getEmbedLinkType)(text);
162
+ if (!embedLinkType) {
163
+ _context.n = 14;
164
+ break;
165
+ }
166
+ (0, _helper.insertEmbedLink)(newEditor, text, embedLinkType);
167
+ return _context.a(2);
168
+ case 14:
159
169
  _link2 = (0, _helpers4.genLinkNode)(text, text);
160
170
  _slate.Transforms.insertNodes(newEditor, _link2);
161
- case 14:
171
+ case 15:
162
172
  // Void merging text from link
163
173
  _Editor$next = _slate.Editor.next(newEditor), _Editor$next2 = (0, _slicedToArray2["default"])(_Editor$next, 2), focusPath = _Editor$next2[1];
164
174
  focusPoint = _slate.Editor.start(newEditor, focusPath);
165
175
  _slate.Transforms.select(newEditor, focusPoint);
166
176
  return _context.a(2);
167
- case 15:
168
- insertData(data);
169
177
  case 16:
178
+ insertData(data);
179
+ case 17:
170
180
  return _context.a(2);
171
181
  }
172
182
  }, _callee, null, [[2, 11]]);
@@ -260,6 +260,12 @@ var CustomRenderElement = function CustomRenderElement(props) {
260
260
  renderWhiteboard = _WhiteboardPlugin$ren[0];
261
261
  return renderWhiteboard((0, _objectSpread2["default"])({}, props), editor);
262
262
  }
263
+ case _elementType.EMBED_LINK:
264
+ {
265
+ var _EmbedLinkPlugin$rend = (0, _slicedToArray2["default"])(_plugins.EmbedLinkPlugin.renderElements, 1),
266
+ _renderWhiteboard = _EmbedLinkPlugin$rend[0];
267
+ return _renderWhiteboard((0, _objectSpread2["default"])({}, props), editor);
268
+ }
263
269
  case _elementType.FILE_VIEW:
264
270
  {
265
271
  var _FileViewPlugin$rende = (0, _slicedToArray2["default"])(_plugins.FileViewPlugin.renderElements, 1),
@@ -22,6 +22,7 @@ var _commonUtils = require("../../../utils/common-utils");
22
22
  var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
23
23
  var _dropdownMenuItem = _interopRequireDefault(require("../../commons/dropdown-menu-item"));
24
24
  var _constants2 = require("../../constants");
25
+ var _elementType = require("../../constants/element-type");
25
26
  var _core = require("../../core");
26
27
  var _helper = require("../../plugins/callout/helper");
27
28
  var _helpers = require("../../plugins/check-list/helpers");
@@ -132,6 +133,16 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
132
133
  });
133
134
  // eslint-disable-next-line react-hooks/exhaustive-deps
134
135
  }, [insertPosition]);
136
+ var addEmbedLinkDialog = (0, _react.useCallback)(function () {
137
+ callback && callback();
138
+ var eventBus = _eventBus["default"].getInstance();
139
+ eventBus.dispatch(_constants.INTERNAL_EVENT.INSERT_ELEMENT, {
140
+ type: _constants2.ELEMENT_TYPE.EMBED_LINK,
141
+ insertPosition: insertPosition,
142
+ slateNode: slateNode
143
+ });
144
+ // eslint-disable-next-line react-hooks/exhaustive-deps
145
+ }, [insertPosition]);
135
146
  var openFileViewDialog = (0, _react.useCallback)(function () {
136
147
  callback && callback();
137
148
  var eventBus = _eventBus["default"].getInstance();
@@ -381,7 +392,7 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
381
392
  }, t('Add_video_link')), editor.editorType !== _constants.WIKI_EDITOR && /*#__PURE__*/_react["default"].createElement("div", {
382
393
  className: "sdoc-dropdown-menu-item",
383
394
  onClick: openSelectVideoFileDialog
384
- }, t('Link_video_file'))))))), {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants2.TABLE,
395
+ }, t('Link_video_file'))))))), {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants2.TABLE,
385
396
  /*#__PURE__*/
386
397
  // eslint-disable-next-line react/jsx-indent
387
398
  _react["default"].createElement(_dropdownMenuItem["default"], {
@@ -407,6 +418,11 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
407
418
  key: "sdoc-insert-menu-link",
408
419
  menuConfig: (0, _objectSpread6["default"])({}, _constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.LINK]),
409
420
  onClick: openLinkDialog
421
+ })), _elementType.EMBED_LINK, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
422
+ isHidden: !quickInsertMenuSearchMap[_elementType.EMBED_LINK],
423
+ key: "sdoc-insert-menu-embed-link",
424
+ menuConfig: (0, _objectSpread6["default"])({}, _constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.EMBED_LINK]),
425
+ onClick: addEmbedLinkDialog
410
426
  })), _constants2.CODE_BLOCK, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
411
427
  isHidden: !quickInsertMenuSearchMap[_constants2.CODE_BLOCK],
412
428
  disabled: isDisableCodeBlock,
@@ -472,7 +488,7 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
472
488
  });
473
489
  return items;
474
490
  // eslint-disable-next-line react-hooks/exhaustive-deps
475
- }, [quickInsertMenuSearchMap, isDisableImage, onInsertImageToggle, isDisableVideo, isDisableMultiColumn, onInsertVideoToggle, isDisableTable, editor, createTable, callback, handleClosePopover, openLinkDialog, onInsertCodeBlock, isDisableCallout, isDisableToggleHeader, onInsertCheckList, isEmptyNode, onInsertCallout, onInsertList, onInsert, createMultiColumn, isDisableHeader]);
491
+ }, [quickInsertMenuSearchMap, isDisableImage, onInsertImageToggle, isDisableVideo, isDisableMultiColumn, onInsertVideoToggle, isDisableTable, editor, createTable, callback, handleClosePopover, openLinkDialog, addEmbedLinkDialog, onInsertCodeBlock, isDisableCallout, isDisableToggleHeader, onInsertCheckList, isEmptyNode, onInsertCallout, onInsertList, onInsert, createMultiColumn, isDisableHeader]);
476
492
  var getSelectItemDom = function getSelectItemDom(selectIndex) {
477
493
  var dropDownItemWrapper = downDownWrapperRef.current;
478
494
  var searchedDropDownItemWrapper = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "3.0.124",
3
+ "version": "3.0.125",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "test": "jest",
@@ -72,5 +72,5 @@
72
72
  "publishConfig": {
73
73
  "access": "public"
74
74
  },
75
- "gitHead": "cac597b945276ad424c9014d4e8647062d984f6b"
75
+ "gitHead": "2bbbad257fff37cb6d3ad399d769b1338270e593"
76
76
  }