@seafile/sdoc-editor 0.1.138 → 0.1.140
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.
- package/dist/assets/css/simple-viewer.css +6 -0
- package/dist/basic-sdk/assets/css/default.css +4 -0
- package/dist/basic-sdk/assets/css/dropdown-menu.css +47 -2
- package/dist/basic-sdk/comment/comment/comment-list.css +1 -1
- package/dist/basic-sdk/constants/index.js +2 -1
- package/dist/basic-sdk/editor.js +5 -2
- package/dist/basic-sdk/extension/commons/color-menu/index.js +1 -1
- package/dist/basic-sdk/extension/commons/dropdown-menu-item/index.css +4 -0
- package/dist/basic-sdk/extension/commons/dropdown-menu-item/index.js +38 -0
- package/dist/basic-sdk/extension/commons/insert-element-dialog/index.js +105 -0
- package/dist/basic-sdk/extension/constants/index.js +25 -16
- package/dist/basic-sdk/extension/plugins/code-block/helpers.js +53 -29
- package/dist/basic-sdk/extension/plugins/code-block/hover-menu/index.js +3 -4
- package/dist/basic-sdk/extension/plugins/code-block/menu/index.js +23 -66
- package/dist/basic-sdk/extension/plugins/image/dialogs/insert-web-image-dialog.js +56 -67
- package/dist/basic-sdk/extension/plugins/image/helpers.js +16 -3
- package/dist/basic-sdk/extension/plugins/image/menu/index.js +51 -150
- package/dist/basic-sdk/extension/plugins/image/plugin.js +2 -1
- package/dist/basic-sdk/extension/plugins/link/dialog/add-link-dialog/index.js +129 -0
- package/dist/basic-sdk/extension/plugins/link/helpers.js +31 -11
- package/dist/basic-sdk/extension/plugins/link/hover/index.js +38 -0
- package/dist/basic-sdk/extension/plugins/link/menu/index.js +26 -68
- package/dist/basic-sdk/extension/plugins/link/render-elem.js +17 -23
- package/dist/basic-sdk/extension/plugins/sdoc-link/{dialogs → dialog}/select-sdoc-file-dialog/index.js +4 -10
- package/dist/basic-sdk/extension/plugins/sdoc-link/hover-menu/index.css +0 -42
- package/dist/basic-sdk/extension/plugins/sdoc-link/hover-menu/index.js +10 -10
- package/dist/basic-sdk/extension/plugins/sdoc-link/menu/index.js +23 -82
- package/dist/basic-sdk/extension/plugins/sdoc-link/render-elem.js +10 -5
- package/dist/basic-sdk/extension/plugins/table/dialog/custom-table-size-dialog/index.js +87 -100
- package/dist/basic-sdk/extension/plugins/table/helpers.js +13 -3
- package/dist/basic-sdk/extension/plugins/table/menu/table-menu/index.js +32 -58
- package/dist/basic-sdk/extension/plugins/table/popover/table-size-popover/index.js +99 -135
- package/dist/basic-sdk/extension/plugins/text-style/render-elem.js +1 -1
- package/dist/basic-sdk/extension/toolbar/header-toolbar/index.js +4 -23
- package/dist/basic-sdk/extension/toolbar/header-toolbar/insert-toolbar/index.css +18 -0
- package/dist/basic-sdk/extension/toolbar/header-toolbar/insert-toolbar/index.js +94 -0
- package/dist/basic-sdk/extension/toolbar/side-toolbar/helpers.js +2 -67
- package/dist/basic-sdk/extension/toolbar/side-toolbar/index.js +4 -0
- package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-below-menu.js +4 -7
- package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-block-menu.js +70 -76
- package/dist/basic-sdk/extension/toolbar/side-toolbar/side-menu.css +0 -40
- package/dist/basic-sdk/extension/toolbar/side-toolbar/side-menu.js +43 -27
- package/dist/basic-sdk/extension/toolbar/side-toolbar/transform-menus.js +7 -10
- package/dist/basic-sdk/highlight-decorate/index.js +2 -1
- package/dist/basic-sdk/highlight-decorate/setNodeToDecorations.js +2 -1
- package/dist/pages/simple-viewer.js +21 -7
- package/package.json +1 -1
- package/public/media/sdoc-editor-font/iconfont.eot +0 -0
- package/public/media/sdoc-editor-font/iconfont.svg +2 -0
- package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
- package/public/media/sdoc-editor-font/iconfont.woff +0 -0
- package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
- package/public/media/sdoc-editor-font.css +10 -6
- package/dist/basic-sdk/extension/plugins/image/menu/style.css +0 -43
- package/dist/basic-sdk/extension/plugins/link/menu/add-link-dialog.js +0 -151
- package/dist/basic-sdk/extension/plugins/link/menu/hover-link-dialog.js +0 -51
- package/dist/basic-sdk/extension/plugins/sdoc-link/menu/index.css +0 -54
- package/dist/basic-sdk/extension/toolbar/side-toolbar/side-menu-item.js +0 -35
- /package/dist/basic-sdk/extension/plugins/sdoc-link/{dialogs → dialog}/select-sdoc-file-dialog/index.css +0 -0
- /package/dist/basic-sdk/extension/plugins/sdoc-link/{dialogs → dialog}/select-sdoc-file-dialog/local-files/index.css +0 -0
- /package/dist/basic-sdk/extension/plugins/sdoc-link/{dialogs → dialog}/select-sdoc-file-dialog/local-files/index.js +0 -0
|
@@ -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]
|
package/dist/basic-sdk/editor.js
CHANGED
|
@@ -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,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-
|
|
137
|
-
text: '
|
|
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
|
-
|
|
167
|
+
text: 'Paragraph'
|
|
168
168
|
}, {
|
|
169
169
|
id: HEADER1,
|
|
170
170
|
iconClass: 'sdocfont sdoc-header1',
|
|
171
171
|
type: HEADER1,
|
|
172
|
-
|
|
172
|
+
text: 'Header_one'
|
|
173
173
|
}, {
|
|
174
174
|
id: HEADER2,
|
|
175
175
|
iconClass: 'sdocfont sdoc-header2',
|
|
176
176
|
type: HEADER2,
|
|
177
|
-
|
|
177
|
+
text: 'Header_two'
|
|
178
178
|
}, {
|
|
179
179
|
id: HEADER3,
|
|
180
180
|
iconClass: 'sdocfont sdoc-header3',
|
|
181
181
|
type: HEADER3,
|
|
182
|
-
|
|
182
|
+
text: 'Header_three'
|
|
183
183
|
}, {
|
|
184
184
|
id: HEADER4,
|
|
185
185
|
iconClass: 'sdocfont sdoc-header4',
|
|
186
186
|
type: HEADER4,
|
|
187
|
-
|
|
187
|
+
text: 'Header_four'
|
|
188
188
|
}, {
|
|
189
189
|
id: HEADER5,
|
|
190
190
|
iconClass: 'sdocfont sdoc-header5',
|
|
191
191
|
type: HEADER5,
|
|
192
|
-
|
|
192
|
+
text: 'Header_five'
|
|
193
193
|
}, {
|
|
194
194
|
id: HEADER6,
|
|
195
195
|
iconClass: 'sdocfont sdoc-header6',
|
|
196
196
|
type: HEADER6,
|
|
197
|
-
|
|
197
|
+
text: 'Header_six'
|
|
198
198
|
}, {
|
|
199
199
|
id: UNORDERED_LIST,
|
|
200
200
|
iconClass: 'sdocfont sdoc-list-ul',
|
|
201
201
|
type: UNORDERED_LIST,
|
|
202
|
-
|
|
202
|
+
text: 'Unordered_list'
|
|
203
203
|
}, {
|
|
204
204
|
id: ORDERED_LIST,
|
|
205
205
|
iconClass: 'sdocfont sdoc-list-ol',
|
|
206
206
|
type: ORDERED_LIST,
|
|
207
|
-
|
|
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
|
-
|
|
212
|
+
text: 'Check_list_item'
|
|
213
213
|
}, {
|
|
214
214
|
id: ALIGN_LEFT,
|
|
215
215
|
iconClass: 'sdocfont sdoc-align-left',
|
|
216
216
|
type: 'left',
|
|
217
|
-
|
|
217
|
+
text: 'Left'
|
|
218
218
|
}, {
|
|
219
219
|
id: ALIGN_CENTER,
|
|
220
220
|
iconClass: 'sdocfont sdoc-align-center',
|
|
221
221
|
type: 'center',
|
|
222
|
-
|
|
222
|
+
text: 'Center'
|
|
223
223
|
}, {
|
|
224
224
|
id: ALIGN_RIGHT,
|
|
225
225
|
iconClass: 'sdocfont sdoc-align-right',
|
|
226
226
|
type: 'right',
|
|
227
|
-
|
|
227
|
+
text: 'Right'
|
|
228
228
|
}, {
|
|
229
229
|
id: BLOCKQUOTE,
|
|
230
230
|
iconClass: 'sdocfont sdoc-quote1',
|
|
231
231
|
type: BLOCKQUOTE,
|
|
232
|
-
|
|
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
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
}
|
|
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
|
|
74
|
-
|
|
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
|
|
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 {
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
var CodeBlockMenu =
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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;
|