@seafile/sdoc-editor 0.1.138 → 0.1.139

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 (59) hide show
  1. package/dist/assets/css/simple-viewer.css +6 -0
  2. package/dist/basic-sdk/assets/css/default.css +4 -0
  3. package/dist/basic-sdk/assets/css/dropdown-menu.css +47 -2
  4. package/dist/basic-sdk/constants/index.js +2 -1
  5. package/dist/basic-sdk/editor.js +5 -2
  6. package/dist/basic-sdk/extension/commons/color-menu/index.js +1 -1
  7. package/dist/basic-sdk/extension/commons/dropdown-menu-item/index.css +4 -0
  8. package/dist/basic-sdk/extension/commons/dropdown-menu-item/index.js +38 -0
  9. package/dist/basic-sdk/extension/commons/insert-element-dialog/index.js +105 -0
  10. package/dist/basic-sdk/extension/constants/index.js +25 -16
  11. package/dist/basic-sdk/extension/plugins/code-block/helpers.js +53 -29
  12. package/dist/basic-sdk/extension/plugins/code-block/hover-menu/index.js +3 -4
  13. package/dist/basic-sdk/extension/plugins/code-block/menu/index.js +23 -66
  14. package/dist/basic-sdk/extension/plugins/image/dialogs/insert-web-image-dialog.js +56 -67
  15. package/dist/basic-sdk/extension/plugins/image/helpers.js +16 -3
  16. package/dist/basic-sdk/extension/plugins/image/menu/index.js +51 -150
  17. package/dist/basic-sdk/extension/plugins/image/plugin.js +2 -1
  18. package/dist/basic-sdk/extension/plugins/link/dialog/add-link-dialog/index.js +129 -0
  19. package/dist/basic-sdk/extension/plugins/link/helpers.js +31 -11
  20. package/dist/basic-sdk/extension/plugins/link/hover/index.js +38 -0
  21. package/dist/basic-sdk/extension/plugins/link/menu/index.js +26 -68
  22. package/dist/basic-sdk/extension/plugins/link/render-elem.js +17 -23
  23. package/dist/basic-sdk/extension/plugins/sdoc-link/{dialogs → dialog}/select-sdoc-file-dialog/index.js +4 -10
  24. package/dist/basic-sdk/extension/plugins/sdoc-link/hover-menu/index.css +0 -42
  25. package/dist/basic-sdk/extension/plugins/sdoc-link/hover-menu/index.js +10 -10
  26. package/dist/basic-sdk/extension/plugins/sdoc-link/menu/index.js +23 -82
  27. package/dist/basic-sdk/extension/plugins/sdoc-link/render-elem.js +10 -5
  28. package/dist/basic-sdk/extension/plugins/table/dialog/custom-table-size-dialog/index.js +87 -100
  29. package/dist/basic-sdk/extension/plugins/table/helpers.js +13 -3
  30. package/dist/basic-sdk/extension/plugins/table/menu/table-menu/index.js +32 -58
  31. package/dist/basic-sdk/extension/plugins/table/popover/table-size-popover/index.js +99 -135
  32. package/dist/basic-sdk/extension/toolbar/header-toolbar/index.js +4 -23
  33. package/dist/basic-sdk/extension/toolbar/header-toolbar/insert-toolbar/index.css +18 -0
  34. package/dist/basic-sdk/extension/toolbar/header-toolbar/insert-toolbar/index.js +94 -0
  35. package/dist/basic-sdk/extension/toolbar/side-toolbar/helpers.js +2 -67
  36. package/dist/basic-sdk/extension/toolbar/side-toolbar/index.js +4 -0
  37. package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-below-menu.js +4 -7
  38. package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-block-menu.js +70 -76
  39. package/dist/basic-sdk/extension/toolbar/side-toolbar/side-menu.css +0 -40
  40. package/dist/basic-sdk/extension/toolbar/side-toolbar/side-menu.js +43 -27
  41. package/dist/basic-sdk/extension/toolbar/side-toolbar/transform-menus.js +7 -10
  42. package/dist/basic-sdk/highlight-decorate/index.js +2 -1
  43. package/dist/basic-sdk/highlight-decorate/setNodeToDecorations.js +2 -1
  44. package/dist/pages/simple-viewer.js +21 -7
  45. package/package.json +1 -1
  46. package/public/media/sdoc-editor-font/iconfont.eot +0 -0
  47. package/public/media/sdoc-editor-font/iconfont.svg +2 -0
  48. package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
  49. package/public/media/sdoc-editor-font/iconfont.woff +0 -0
  50. package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
  51. package/public/media/sdoc-editor-font.css +10 -6
  52. package/dist/basic-sdk/extension/plugins/image/menu/style.css +0 -43
  53. package/dist/basic-sdk/extension/plugins/link/menu/add-link-dialog.js +0 -151
  54. package/dist/basic-sdk/extension/plugins/link/menu/hover-link-dialog.js +0 -51
  55. package/dist/basic-sdk/extension/plugins/sdoc-link/menu/index.css +0 -54
  56. package/dist/basic-sdk/extension/toolbar/side-toolbar/side-menu-item.js +0 -35
  57. /package/dist/basic-sdk/extension/plugins/sdoc-link/{dialogs → dialog}/select-sdoc-file-dialog/index.css +0 -0
  58. /package/dist/basic-sdk/extension/plugins/sdoc-link/{dialogs → dialog}/select-sdoc-file-dialog/local-files/index.css +0 -0
  59. /package/dist/basic-sdk/extension/plugins/sdoc-link/{dialogs → dialog}/select-sdoc-file-dialog/local-files/index.js +0 -0
@@ -0,0 +1,6 @@
1
+ .sdoc-share-permission {
2
+ font-size: 12px;
3
+ padding: 2px 6px;
4
+ border-radius: 4px;
5
+ border: solid 1px rgba(0, 0, 0, 0.12);
6
+ }
@@ -8,3 +8,7 @@
8
8
  padding: 3px 0;
9
9
  margin: 0;
10
10
  }
11
+
12
+ .element-icon {
13
+ color: #444 !important;
14
+ }
@@ -1,5 +1,7 @@
1
- .sdoc-dropdown-menu {
1
+ .sdoc-dropdown-menu,
2
+ .sdoc-dropdown-menu .sdoc-dropdown-menu-container {
2
3
  padding: 8px 0;
4
+ min-width: 12rem;
3
5
  }
4
6
 
5
7
  .sdoc-dropdown-menu .sdoc-dropdown-menu-divider {
@@ -11,7 +13,6 @@
11
13
  }
12
14
 
13
15
  .sdoc-dropdown-menu .sdoc-dropdown-menu-item {
14
- cursor: pointer;
15
16
  height: 28px;
16
17
  width: 100%;
17
18
  padding: 4px 24px;
@@ -20,11 +21,55 @@
20
21
  align-items: center;
21
22
  }
22
23
 
24
+ .sdoc-dropdown-menu .sdoc-dropdown-menu-item.disabled,
25
+ .sdoc-dropdown-menu .sdoc-dropdown-menu-item.disabled .sdoc-dropdown-item-content-icon {
26
+ color: #c2c2c2 !important;
27
+ }
28
+
23
29
  .sdoc-dropdown-menu .sdoc-dropdown-menu-item:hover {
24
30
  background-color: rgb(245, 245, 245);
31
+ cursor: pointer;
32
+ }
33
+
34
+ .sdoc-dropdown-menu .sdoc-dropdown-menu-item.disabled:hover {
35
+ background-color: unset;
36
+ cursor: default;
37
+ color: #c2c2c2;
25
38
  }
26
39
 
27
40
  .sdoc-dropdown-menu .sdoc-dropdown-menu-item .sdocfont {
28
41
  font-size: 12px;
29
42
  line-height: 12px;
30
43
  }
44
+
45
+ .sdoc-dropdown-menu .sdoc-dropdown-menu-item .sdoc-dropdown-item-content {
46
+ display: flex;
47
+ align-items: center;
48
+ justify-content: flex-start;
49
+ flex: 1;
50
+ font-size: 14px;
51
+ }
52
+
53
+ .sdoc-dropdown-menu .sdoc-dropdown-item-content .sdoc-dropdown-item-content-icon {
54
+ margin-right: 10px;
55
+ }
56
+
57
+ .sdoc-dropdown-menu .sdoc-dropdown-item-right-icon {
58
+ color: #999;
59
+ transform: scale(.6);
60
+ }
61
+
62
+ .sdoc-dropdown-menu .sdoc-dropdown-item-with-left-icon {
63
+ min-height: 32px;
64
+ padding: 3px 12px;
65
+ }
66
+
67
+ .sdoc-dropdown-menu .sdoc-check-mark {
68
+ transform: scale(.8);
69
+ color: #798d99;
70
+ }
71
+
72
+ /* sub menu */
73
+ .sdoc-sub-dropdown-menu .popover {
74
+ left: -24px !important;
75
+ }
@@ -2,6 +2,7 @@ export var INTERNAL_EVENT = {
2
2
  CANCEL_TABLE_SELECT_RANGE: 'cancel_table_select_range',
3
3
  SET_TABLE_SELECT_RANGE: 'set_table_select_range',
4
4
  HIDDEN_CODE_BLOCK_HOVER_MENU: 'hidden_code_block_hover_menu',
5
- ON_MOUSE_ENTER_BLOCK: 'on_mouse_enter_block'
5
+ ON_MOUSE_ENTER_BLOCK: 'on_mouse_enter_block',
6
+ INSERT_ELEMENT: 'insert_element'
6
7
  };
7
8
  export var PAGE_EDIT_AREA_WIDTH = 672; // 672 = 794 - 2[borderLeft + borderRight] - 120[paddingLeft + paddingRight]
@@ -10,6 +10,7 @@ import { PAGE_EDIT_AREA_WIDTH } from './constants';
10
10
  import context from '../context';
11
11
  import { EditorContainer, EditorContent } from './layout';
12
12
  import SlateEditor from './slate-editor';
13
+ import InsertElementDialog from './extension/commons/insert-element-dialog';
13
14
  var SDocEditor = forwardRef(function (_ref, ref) {
14
15
  var document = _ref.document,
15
16
  config = _ref.config;
@@ -88,7 +89,7 @@ var SDocEditor = forwardRef(function (_ref, ref) {
88
89
 
89
90
  // eslint-disable-next-line react-hooks/exhaustive-deps
90
91
  }, []);
91
- return /*#__PURE__*/React.createElement(EditorContainer, {
92
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(EditorContainer, {
92
93
  editor: editor
93
94
  }, /*#__PURE__*/React.createElement(EditorContent, {
94
95
  docValue: slateValue,
@@ -97,6 +98,8 @@ var SDocEditor = forwardRef(function (_ref, ref) {
97
98
  editor: editor,
98
99
  slateValue: slateValue,
99
100
  setSlateValue: setSlateValue
100
- })));
101
+ }))), /*#__PURE__*/React.createElement(InsertElementDialog, {
102
+ editor: editor
103
+ }));
101
104
  });
102
105
  export default SDocEditor;
@@ -189,7 +189,7 @@ var ColorMenu = function ColorMenu(_ref) {
189
189
  })))), /*#__PURE__*/React.createElement("div", {
190
190
  className: "sdoc-colors-divider"
191
191
  }), /*#__PURE__*/React.createElement("div", {
192
- className: classnames('sdoc-more-colors', {
192
+ className: classnames('sdoc-more-colors pr-2', {
193
193
  'show-pick': isPickerShow
194
194
  }),
195
195
  id: "sdoc-more-colors"
@@ -0,0 +1,4 @@
1
+ /* insert element dropdown item */
2
+ .sdoc-dropdown-item-with-left-icon .sdoc-dropdown-item-content .sdoc-dropdown-item-content-icon {
3
+ color: #444;
4
+ }
@@ -0,0 +1,38 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React, { useState, useEffect } from 'react';
3
+ import { useTranslation } from 'react-i18next';
4
+ import classnames from 'classnames';
5
+ import './index.css';
6
+ var DropdownMenuItem = function DropdownMenuItem(_ref) {
7
+ var disabled = _ref.disabled,
8
+ onClick = _ref.onClick,
9
+ menuConfig = _ref.menuConfig,
10
+ children = _ref.children,
11
+ className = _ref.className;
12
+ var _useTranslation = useTranslation(),
13
+ t = _useTranslation.t;
14
+ var iconClass = menuConfig.iconClass;
15
+ var _useState = useState(false),
16
+ _useState2 = _slicedToArray(_useState, 2),
17
+ isShowChildren = _useState2[0],
18
+ setShowChildren = _useState2[1];
19
+
20
+ // onMount
21
+ useEffect(function () {
22
+ setShowChildren(!isShowChildren);
23
+ // eslint-disable-next-line react-hooks/exhaustive-deps
24
+ }, []);
25
+ return /*#__PURE__*/React.createElement("div", {
26
+ className: classnames('sdoc-dropdown-menu-item', className, {
27
+ 'disabled': disabled,
28
+ 'sdoc-dropdown-item-with-left-icon': iconClass
29
+ }),
30
+ id: menuConfig.id || '',
31
+ onClick: disabled ? function () {} : onClick || function () {}
32
+ }, /*#__PURE__*/React.createElement("div", {
33
+ className: "sdoc-dropdown-item-content"
34
+ }, iconClass && /*#__PURE__*/React.createElement("i", {
35
+ className: classnames(iconClass, 'sdoc-dropdown-item-content-icon')
36
+ }), /*#__PURE__*/React.createElement("span", null, t(menuConfig.text))), isShowChildren && children);
37
+ };
38
+ export default DropdownMenuItem;
@@ -0,0 +1,105 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React, { useCallback, useEffect, useState, useRef } from 'react';
3
+ import InsertWebImageDialog from '../../plugins/image/dialogs/insert-web-image-dialog';
4
+ import CustomTableSizeDialog from '../../plugins/table/dialog/custom-table-size-dialog';
5
+ import AddLinkDialog from '../../plugins/link/dialog/add-link-dialog';
6
+ import SelectSdocFileDialog from '../../plugins/sdoc-link/dialog/select-sdoc-file-dialog';
7
+ import EventBus from '../../../utils/event-bus';
8
+ import { INTERNAL_EVENT } from '../../../constants';
9
+ import { ELEMENT_TYPE, INSERT_POSITION, INSERT_IMAGE_TYPE } from '../../constants';
10
+ import context from '../../../../context';
11
+ import { insertImage } from '../../plugins/image/helpers';
12
+ var InsertElementDialog = function InsertElementDialog(_ref) {
13
+ var editor = _ref.editor;
14
+ var _useState = useState(''),
15
+ _useState2 = _slicedToArray(_useState, 2),
16
+ dialogType = _useState2[0],
17
+ setDialogType = _useState2[1];
18
+ var _useState3 = useState(''),
19
+ _useState4 = _slicedToArray(_useState3, 2),
20
+ element = _useState4[0],
21
+ setElement = _useState4[1];
22
+ var _useState5 = useState(INSERT_POSITION.CURRENT),
23
+ _useState6 = _slicedToArray(_useState5, 2),
24
+ insertPosition = _useState6[0],
25
+ setInsertPosition = _useState6[1];
26
+ var uploadLocalImageInputRef = useRef();
27
+ var onFileChanged = useCallback(function (event) {
28
+ var file = event.target.files[0];
29
+ context.uploadLocalImage(file).then(function (fileUrl) {
30
+ insertImage(editor, fileUrl, editor.selection, insertPosition);
31
+ if (uploadLocalImageInputRef.current) {
32
+ uploadLocalImageInputRef.current.value = '';
33
+ }
34
+ });
35
+ }, [editor, uploadLocalImageInputRef, insertPosition]);
36
+ useEffect(function () {
37
+ var eventBus = EventBus.getInstance();
38
+ var toggleDialogSubscribe = eventBus.subscribe(INTERNAL_EVENT.INSERT_ELEMENT, toggleDialog);
39
+ return function () {
40
+ toggleDialogSubscribe();
41
+ };
42
+
43
+ // eslint-disable-next-line react-hooks/exhaustive-deps
44
+ }, []);
45
+ var toggleDialog = useCallback(function (_ref2) {
46
+ var type = _ref2.type,
47
+ element = _ref2.element,
48
+ _ref2$insertPosition = _ref2.insertPosition,
49
+ insertPosition = _ref2$insertPosition === void 0 ? INSERT_POSITION.CURRENT : _ref2$insertPosition;
50
+ setInsertPosition(insertPosition);
51
+ setElement(element);
52
+ setDialogType(type);
53
+ if (type === INSERT_IMAGE_TYPE.LOCAL_IMAGE) {
54
+ setTimeout(function () {
55
+ uploadLocalImageInputRef.current && uploadLocalImageInputRef.current.click();
56
+ }, 0);
57
+ }
58
+ }, [uploadLocalImageInputRef]);
59
+ var closeDialog = useCallback(function () {
60
+ setInsertPosition(INSERT_POSITION.CURRENT);
61
+ setElement('');
62
+ setDialogType('');
63
+ }, []);
64
+ var props = {
65
+ insertPosition: insertPosition,
66
+ editor: editor,
67
+ element: element,
68
+ closeDialog: closeDialog
69
+ };
70
+ switch (dialogType) {
71
+ case ELEMENT_TYPE.TABLE:
72
+ {
73
+ return /*#__PURE__*/React.createElement(CustomTableSizeDialog, props);
74
+ }
75
+ case ELEMENT_TYPE.LINK:
76
+ {
77
+ return /*#__PURE__*/React.createElement(AddLinkDialog, props);
78
+ }
79
+ case ELEMENT_TYPE.SDOC_LINK:
80
+ {
81
+ return /*#__PURE__*/React.createElement(SelectSdocFileDialog, props);
82
+ }
83
+ case INSERT_IMAGE_TYPE.WEB_IMAGE:
84
+ {
85
+ return /*#__PURE__*/React.createElement(InsertWebImageDialog, props);
86
+ }
87
+ case INSERT_IMAGE_TYPE.LOCAL_IMAGE:
88
+ {
89
+ return /*#__PURE__*/React.createElement("input", {
90
+ ref: uploadLocalImageInputRef,
91
+ type: "file",
92
+ accept: "image/*",
93
+ style: {
94
+ display: 'none'
95
+ },
96
+ onChange: onFileChanged
97
+ });
98
+ }
99
+ default:
100
+ {
101
+ return null;
102
+ }
103
+ }
104
+ };
105
+ export default InsertElementDialog;
@@ -133,8 +133,8 @@ export var MENUS_CONFIG_MAP = (_MENUS_CONFIG_MAP = {}, _defineProperty(_MENUS_CO
133
133
  text: 'Clear_format'
134
134
  }), _defineProperty(_MENUS_CONFIG_MAP, SDOC_LINK, {
135
135
  id: "sdoc_".concat(SDOC_LINK),
136
- iconClass: 'sdocfont sdoc-insert',
137
- text: 'Insert'
136
+ iconClass: 'sdocfont sdoc-document',
137
+ text: 'Sdoc_document'
138
138
  }), _MENUS_CONFIG_MAP);
139
139
  export var HEADERS = [HEADER1, HEADER2, HEADER3, HEADER4, HEADER5, HEADER6];
140
140
  export var HEADER_TITLE_MAP = (_HEADER_TITLE_MAP = {}, _defineProperty(_HEADER_TITLE_MAP, TITLE, 'Title'), _defineProperty(_HEADER_TITLE_MAP, SUBTITLE, 'Subtitle'), _defineProperty(_HEADER_TITLE_MAP, HEADER1, 'Header_one'), _defineProperty(_HEADER_TITLE_MAP, HEADER2, 'Header_two'), _defineProperty(_HEADER_TITLE_MAP, HEADER3, 'Header_three'), _defineProperty(_HEADER_TITLE_MAP, HEADER4, 'Header_four'), _defineProperty(_HEADER_TITLE_MAP, HEADER5, 'Header_five'), _defineProperty(_HEADER_TITLE_MAP, HEADER6, 'Header_six'), _defineProperty(_HEADER_TITLE_MAP, PARAGRAPH, 'Paragraph'), _HEADER_TITLE_MAP);
@@ -164,71 +164,80 @@ export var SIDE_MENUS_CONFIG = [{
164
164
  id: PARAGRAPH,
165
165
  iconClass: 'sdocfont sdoc-text',
166
166
  type: PARAGRAPH,
167
- title: 'Paragraph'
167
+ text: 'Paragraph'
168
168
  }, {
169
169
  id: HEADER1,
170
170
  iconClass: 'sdocfont sdoc-header1',
171
171
  type: HEADER1,
172
- title: 'Header_one'
172
+ text: 'Header_one'
173
173
  }, {
174
174
  id: HEADER2,
175
175
  iconClass: 'sdocfont sdoc-header2',
176
176
  type: HEADER2,
177
- title: 'Header_two'
177
+ text: 'Header_two'
178
178
  }, {
179
179
  id: HEADER3,
180
180
  iconClass: 'sdocfont sdoc-header3',
181
181
  type: HEADER3,
182
- title: 'Header_three'
182
+ text: 'Header_three'
183
183
  }, {
184
184
  id: HEADER4,
185
185
  iconClass: 'sdocfont sdoc-header4',
186
186
  type: HEADER4,
187
- title: 'Header_four'
187
+ text: 'Header_four'
188
188
  }, {
189
189
  id: HEADER5,
190
190
  iconClass: 'sdocfont sdoc-header5',
191
191
  type: HEADER5,
192
- title: 'Header_five'
192
+ text: 'Header_five'
193
193
  }, {
194
194
  id: HEADER6,
195
195
  iconClass: 'sdocfont sdoc-header6',
196
196
  type: HEADER6,
197
- title: 'Header_six'
197
+ text: 'Header_six'
198
198
  }, {
199
199
  id: UNORDERED_LIST,
200
200
  iconClass: 'sdocfont sdoc-list-ul',
201
201
  type: UNORDERED_LIST,
202
- title: 'Unordered_list'
202
+ text: 'Unordered_list'
203
203
  }, {
204
204
  id: ORDERED_LIST,
205
205
  iconClass: 'sdocfont sdoc-list-ol',
206
206
  type: ORDERED_LIST,
207
- title: 'Ordered_list'
207
+ text: 'Ordered_list'
208
208
  }, {
209
209
  id: CHECK_LIST_ITEM,
210
210
  iconClass: 'sdocfont sdoc-check-square',
211
211
  type: CHECK_LIST_ITEM,
212
- title: 'Check_list_item'
212
+ text: 'Check_list_item'
213
213
  }, {
214
214
  id: ALIGN_LEFT,
215
215
  iconClass: 'sdocfont sdoc-align-left',
216
216
  type: 'left',
217
- title: 'Left'
217
+ text: 'Left'
218
218
  }, {
219
219
  id: ALIGN_CENTER,
220
220
  iconClass: 'sdocfont sdoc-align-center',
221
221
  type: 'center',
222
- title: 'Center'
222
+ text: 'Center'
223
223
  }, {
224
224
  id: ALIGN_RIGHT,
225
225
  iconClass: 'sdocfont sdoc-align-right',
226
226
  type: 'right',
227
- title: 'Right'
227
+ text: 'Right'
228
228
  }, {
229
229
  id: BLOCKQUOTE,
230
230
  iconClass: 'sdocfont sdoc-quote1',
231
231
  type: BLOCKQUOTE,
232
- title: 'Quote'
232
+ text: 'Quote'
233
233
  }];
234
+ export var INSERT_POSITION = {
235
+ BEFORE: 'before',
236
+ CURRENT: 'current',
237
+ AFTER: 'after'
238
+ };
239
+ export var INSERT_IMAGE_TYPE = {
240
+ LOCAL_IMAGE: 'local-image',
241
+ WEB_IMAGE: 'web-image'
242
+ };
234
243
  export { BLOCKQUOTE, HEADER, TITLE, SUBTITLE, HEADER1, HEADER2, HEADER3, HEADER4, HEADER5, HEADER6, PARAGRAPH, BOLD, ITALIC, UNDERLINE, STRIKETHROUGH, SUPERSCRIPT, SUBSCRIPT, ORDERED_LIST, UNORDERED_LIST, LIST_ITEM, LIST_LIC, CHECK_LIST, CHECK_LIST_ITEM, LINK, HTML, CODE_BLOCK, CODE_LINE, IMAGE, TABLE, TABLE_CELL, TABLE_ROW, FORMULA, COLUMN, TEXT_STYLE, TEXT_STYLE_MORE, BOLD_ITALIC, TEXT_ALIGN, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ELEMENT_TYPE, KEYBOARD, MAC_HOTKEYS, WIN_HOTKEYS, DEFAULT_COLORS, STANDARD_COLORS, DEFAULT_RECENT_USED_LIST, CLEAR_FORMAT, DEFAULT_FONT_COLOR, RECENT_USED_HIGHLIGHT_COLORS_KEY, RECENT_USED_FONT_COLORS_KEY, RECENT_USED_TABLE_CELL_BG_COLORS_KEY, DEFAULT_LAST_USED_FONT_COLOR, DEFAULT_LAST_USED_HIGHLIGHT_COLOR, DEFAULT_LAST_USED_TABLE_CELL_BG_COLOR, FONT_SIZE, DEFAULT_FONT, FONT, GOOGLE_FONT_CLASS, RECENT_USED_FONTS_KEY, SDOC_FONT_SIZE, SDOC_LINK };
@@ -3,8 +3,9 @@ import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIt
3
3
  import copy from 'copy-to-clipboard';
4
4
  import { Transforms, Editor, Node } from '@seafile/slate';
5
5
  import slugid from 'slugid';
6
- import { CODE_BLOCK, CODE_LINE, PARAGRAPH } from '../../constants';
6
+ import { CODE_BLOCK, CODE_LINE, INSERT_POSITION, PARAGRAPH } from '../../constants';
7
7
  import { getNodeType, getSelectedNodeByType, getSelectedElems } from '../../core';
8
+ import { genCodeLangs } from './prismjs';
8
9
  export var isMenuDisabled = function isMenuDisabled(editor, readonly) {
9
10
  if (readonly) return true;
10
11
  var selection = editor.selection;
@@ -28,35 +29,42 @@ export var getSelectCodeElem = function getSelectCodeElem(editor) {
28
29
  if (codeNode == null) return null;
29
30
  return codeNode;
30
31
  };
31
- export var changeToCodeBlock = function changeToCodeBlock(editor, language) {
32
+ export var changeToCodeBlock = function changeToCodeBlock(editor) {
33
+ var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
34
+ var position = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : INSERT_POSITION.CURRENT;
32
35
  // Summarizes the strings for the selected highest-level node
33
36
  var strArr = [];
34
- var nodeEntries = Editor.nodes(editor, {
35
- match: function match(n) {
36
- return editor.children.includes(n);
37
- },
38
- // Matches the selected node at the highest level
39
- universal: true
40
- });
41
- var _iterator = _createForOfIteratorHelper(nodeEntries),
42
- _step;
43
- try {
44
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
45
- var nodeEntry = _step.value;
46
- var _nodeEntry = _slicedToArray(nodeEntry, 1),
47
- n = _nodeEntry[0];
48
- if (n) strArr.push(Node.string(n));
49
- }
37
+ if (position === INSERT_POSITION.AFTER) {
38
+ strArr = [''];
39
+ } else {
40
+ // Select the plain text of the node
41
+ var nodeEntries = Editor.nodes(editor, {
42
+ match: function match(n) {
43
+ return editor.children.includes(n);
44
+ },
45
+ // Matches the selected node at the highest level
46
+ universal: true
47
+ });
48
+ var _iterator = _createForOfIteratorHelper(nodeEntries),
49
+ _step;
50
+ try {
51
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
52
+ var nodeEntry = _step.value;
53
+ var _nodeEntry = _slicedToArray(nodeEntry, 1),
54
+ n = _nodeEntry[0];
55
+ if (n) strArr.push(Node.string(n));
56
+ }
50
57
 
51
- // Deletes the selected node at the highest level
52
- } catch (err) {
53
- _iterator.e(err);
54
- } finally {
55
- _iterator.f();
58
+ // Deletes the selected node at the highest level
59
+ } catch (err) {
60
+ _iterator.e(err);
61
+ } finally {
62
+ _iterator.f();
63
+ }
64
+ Transforms.removeNodes(editor, {
65
+ mode: 'highest'
66
+ });
56
67
  }
57
- Transforms.removeNodes(editor, {
58
- mode: 'highest'
59
- });
60
68
 
61
69
  // Insert the codeBlockNode node
62
70
  var newCodeBlockNode = {
@@ -73,12 +81,17 @@ export var changeToCodeBlock = function changeToCodeBlock(editor, language) {
73
81
  children: [{
74
82
  text: strArr.join('\n'),
75
83
  id: slugid.nice()
76
- } // Select the plain text of the node
77
- ]
84
+ }]
78
85
  }]
79
86
  };
80
-
81
87
  var path = Editor.path(editor, editor.selection);
88
+ if (position === INSERT_POSITION.AFTER) {
89
+ Transforms.insertNodes(editor, newCodeBlockNode, {
90
+ mode: 'highest',
91
+ at: [path[0] + 1]
92
+ });
93
+ return;
94
+ }
82
95
  var atPath = path ? [path[0]] : editor.selection;
83
96
  Transforms.insertNodes(editor, newCodeBlockNode, {
84
97
  mode: 'highest',
@@ -131,4 +144,15 @@ export var deleteBackwardByLength = function deleteBackwardByLength(editor, len)
131
144
  Editor.deleteBackward(editor, 'word');
132
145
  i--;
133
146
  }
147
+ };
148
+ export var getSelectedLangOption = function getSelectedLangOption(lang) {
149
+ var langs = genCodeLangs();
150
+ var selectedLangOption = langs.find(function (item) {
151
+ return item.value === lang;
152
+ });
153
+ return selectedLangOption || langs[0];
154
+ };
155
+ export var getValidLang = function getValidLang(lang) {
156
+ var langOption = getSelectedLangOption(lang);
157
+ return langOption.value;
134
158
  };
@@ -4,6 +4,7 @@ import { Input } from 'reactstrap';
4
4
  import { withTranslation } from 'react-i18next';
5
5
  import { ElementPopover } from '../../../commons/';
6
6
  import { genCodeLangs } from '../prismjs';
7
+ import { getSelectedLangOption } from '../helpers';
7
8
  import './index.css';
8
9
  var CodeBlockHoverMenu = function CodeBlockHoverMenu(_ref) {
9
10
  var style = _ref.style,
@@ -70,10 +71,8 @@ var CodeBlockHoverMenu = function CodeBlockHoverMenu(_ref) {
70
71
  if (language === 'text') {
71
72
  selectedLanguage = 'plaintext';
72
73
  }
73
- var selectedLanguageText = genCodeLangs().find(function (item) {
74
- return item.value === selectedLanguage;
75
- }).text;
76
- setSelectedLanguageText(selectedLanguageText);
74
+ var selectedLanguageOption = getSelectedLangOption(selectedLanguage);
75
+ setSelectedLanguageText(selectedLanguageOption.text);
77
76
  }, [language]);
78
77
  var onChange = useCallback(function (e) {
79
78
  var filterData = [];
@@ -1,68 +1,25 @@
1
- import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
- import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
3
- import _createClass from "@babel/runtime/helpers/esm/createClass";
4
- import _inherits from "@babel/runtime/helpers/esm/inherits";
5
- import _createSuper from "@babel/runtime/helpers/esm/createSuper";
6
- import React from 'react';
1
+ import React, { useCallback } from 'react';
7
2
  import { focusEditor } from '../../../core';
8
- import { CODE_BLOCK, MENUS_CONFIG_MAP } from '../../../constants';
9
- import { MenuItem } from '../../../commons';
10
- import { getSelectCodeElem, isMenuDisabled, changeToCodeBlock, changeToPlainText } from '../helpers';
11
- var CodeBlockMenu = /*#__PURE__*/function (_React$Component) {
12
- _inherits(CodeBlockMenu, _React$Component);
13
- var _super = _createSuper(CodeBlockMenu);
14
- function CodeBlockMenu() {
15
- var _this;
16
- _classCallCheck(this, CodeBlockMenu);
17
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
18
- args[_key] = arguments[_key];
19
- }
20
- _this = _super.call.apply(_super, [this].concat(args));
21
- _this.isActive = function () {
22
- var editor = _this.props.editor;
23
- var elem = getSelectCodeElem(editor);
24
- return !!elem;
25
- };
26
- _this.isDisabled = function () {
27
- var _this$props = _this.props,
28
- editor = _this$props.editor,
29
- readonly = _this$props.readonly;
30
- return isMenuDisabled(editor, readonly);
31
- };
32
- _this.onMouseDown = function (e) {
33
- e.preventDefault();
34
- e.stopPropagation();
35
- var editor = _this.props.editor;
36
- var active = _this.isActive(editor);
37
- if (active) {
38
- // It is currently in a code-block and needs to be converted to plain text
39
- changeToPlainText(editor);
40
- } else {
41
- // It is not currently in code-block, so it needs to be converted to code-block
42
- changeToCodeBlock(editor, 'plaintext');
43
- }
44
- focusEditor(editor);
45
- };
46
- return _this;
47
- }
48
- _createClass(CodeBlockMenu, [{
49
- key: "render",
50
- value: function render() {
51
- var _this$props2 = this.props,
52
- isRichEditor = _this$props2.isRichEditor,
53
- className = _this$props2.className;
54
- var menuConfig = MENUS_CONFIG_MAP[CODE_BLOCK];
55
- var props = _objectSpread(_objectSpread({
56
- isRichEditor: isRichEditor,
57
- className: className
58
- }, menuConfig), {}, {
59
- disabled: this.isDisabled(),
60
- isActive: this.isActive(),
61
- onMouseDown: this.onMouseDown
62
- });
63
- return /*#__PURE__*/React.createElement(MenuItem, props);
64
- }
65
- }]);
66
- return CodeBlockMenu;
67
- }(React.Component);
3
+ import { MENUS_CONFIG_MAP, ELEMENT_TYPE, INSERT_POSITION } from '../../../constants';
4
+ import { isMenuDisabled, changeToCodeBlock } from '../helpers';
5
+ import DropdownMenuItem from '../../../commons/dropdown-menu-item';
6
+ var CodeBlockMenu = function CodeBlockMenu(_ref) {
7
+ var editor = _ref.editor,
8
+ readonly = _ref.readonly,
9
+ toggle = _ref.toggle;
10
+ var disabled = isMenuDisabled(editor, readonly);
11
+ var menuConfig = MENUS_CONFIG_MAP[ELEMENT_TYPE.CODE_BLOCK];
12
+ var insertCodeBlock = useCallback(function () {
13
+ changeToCodeBlock(editor, 'plaintext', INSERT_POSITION.CURRENT);
14
+ toggle && toggle();
15
+ focusEditor(editor);
16
+
17
+ // eslint-disable-next-line react-hooks/exhaustive-deps
18
+ }, [editor, toggle]);
19
+ return /*#__PURE__*/React.createElement(DropdownMenuItem, {
20
+ disabled: disabled,
21
+ menuConfig: menuConfig,
22
+ onClick: insertCodeBlock
23
+ });
24
+ };
68
25
  export default CodeBlockMenu;