@seafile/seafile-editor 0.4.2 → 0.4.3
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/new-editor-toolbar.css +52 -0
- package/dist/assets/css/new-editor.css +33 -3
- package/dist/new-editors/editor.js +7 -11
- package/dist/slate-extension/constants/index.js +13 -2
- package/dist/slate-extension/menu/index.js +1 -0
- package/dist/slate-extension/menu/menu-group.js +3 -0
- package/dist/slate-extension/menu/menu-item.js +1 -1
- package/dist/slate-extension/menu/menu.css +34 -0
- package/dist/slate-extension/plugins/blockquote/helpers.js +49 -0
- package/dist/slate-extension/plugins/blockquote/menu/index.js +7 -36
- package/dist/slate-extension/plugins/blockquote/plugin.js +1 -1
- package/dist/slate-extension/plugins/check-list/helpers.js +44 -0
- package/dist/slate-extension/plugins/check-list/menu/index.js +56 -0
- package/dist/slate-extension/plugins/check-list/model.js +12 -0
- package/dist/slate-extension/plugins/check-list/plugin.js +27 -3
- package/dist/slate-extension/plugins/check-list/render-elem.js +2 -4
- package/dist/slate-extension/plugins/header/helpers.js +40 -0
- package/dist/slate-extension/plugins/header/menu/index.js +115 -0
- package/dist/slate-extension/plugins/header/render-elem.js +3 -1
- package/dist/slate-extension/plugins/list/helpers.js +43 -0
- package/dist/slate-extension/plugins/list/index.js +1 -1
- package/dist/slate-extension/plugins/list/menu/index.js +5 -40
- package/dist/slate-extension/plugins/list/{with-list.js → plugin/index.js} +3 -3
- package/dist/slate-extension/plugins/list/transforms/index.js +2 -1
- package/dist/slate-extension/plugins/list/{plugin → transforms}/toggle-list.js +1 -1
- package/dist/slate-extension/render/render-element.js +9 -2
- package/dist/slate-extension/toolbar/index.js +11 -6
- package/package.json +1 -1
- package/public/media/seafile-ui.css +6 -11166
- package/dist/slate-extension/plugins/check-list/helper.js +0 -8
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
.header-menu {
|
|
2
|
+
display: flex;
|
|
3
|
+
height: 30px;
|
|
4
|
+
width: 140px;
|
|
5
|
+
padding: 5px;
|
|
6
|
+
box-sizing: border-box;
|
|
7
|
+
border-right: 1px solid #e5e5e5;
|
|
8
|
+
border-left: 1px solid #e5e5e5;
|
|
9
|
+
position: relative;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.header-menu .header-toggle {
|
|
13
|
+
flex: 1;
|
|
14
|
+
display: flex;
|
|
15
|
+
justify-content: space-between;
|
|
16
|
+
align-items: center;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.header-menu .header-toggle .iconfont {
|
|
20
|
+
width: 30px;
|
|
21
|
+
height: 30px;
|
|
22
|
+
display: inline-flex;
|
|
23
|
+
justify-content: center;
|
|
24
|
+
align-items: center;
|
|
25
|
+
font-size: 13px;
|
|
26
|
+
transform: scale(.8);
|
|
27
|
+
cursor: pointer;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.header-menu .header-popover {
|
|
31
|
+
position: absolute;
|
|
32
|
+
top: 32px;
|
|
33
|
+
left: 5px;
|
|
34
|
+
padding: 8px 0;
|
|
35
|
+
display: flex;
|
|
36
|
+
flex-direction: column;
|
|
37
|
+
align-items: flex-start;
|
|
38
|
+
z-index: 10;
|
|
39
|
+
background-color: #fff;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.header-menu .header-popover .header-menu-item {
|
|
43
|
+
cursor: pointer;
|
|
44
|
+
height: 30px;
|
|
45
|
+
width: 100%;
|
|
46
|
+
padding: 4px 24px;
|
|
47
|
+
user-select: none;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.header-menu .header-popover .header-menu-item:hover {
|
|
51
|
+
background-color: rgb(245, 245, 245);
|
|
52
|
+
}
|
|
@@ -3,7 +3,37 @@
|
|
|
3
3
|
padding-inline-start: 24px;
|
|
4
4
|
}
|
|
5
5
|
|
|
6
|
-
.editor-container
|
|
7
|
-
|
|
6
|
+
.sf-editor-container {
|
|
7
|
+
flex: 1;
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
8
10
|
background: #f0f0f0;
|
|
9
|
-
|
|
11
|
+
min-height: 0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.sf-editor-container .sf-editor-toolbar {
|
|
15
|
+
display: flex;
|
|
16
|
+
justify-content: center;
|
|
17
|
+
height: 39px;
|
|
18
|
+
align-items: center;
|
|
19
|
+
padding: 0 10px;
|
|
20
|
+
background-color: #fcfcfc;
|
|
21
|
+
user-select: none;
|
|
22
|
+
border-bottom: 1px solid #e5e5e5;
|
|
23
|
+
box-shadow: 0 3px 2px -2px rgb(200 200 200 / 15%)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.sf-editor-container .sf-editor-content {
|
|
27
|
+
flex: 1;
|
|
28
|
+
height: 100%;
|
|
29
|
+
overflow: auto;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.sf-editor-container .sf-editor-content .editor-article {
|
|
33
|
+
max-width: 950px;
|
|
34
|
+
min-height: calc(100% - 40px);
|
|
35
|
+
margin: 20px auto;
|
|
36
|
+
padding: 40px 60px;
|
|
37
|
+
background-color: #fff;
|
|
38
|
+
border: 1px solid rgb(230,230,221);
|
|
39
|
+
}
|
|
@@ -21,13 +21,6 @@ var NewEditor = /*#__PURE__*/function (_React$Component) {
|
|
|
21
21
|
});
|
|
22
22
|
onValueChanged && onValueChanged(slateValue);
|
|
23
23
|
};
|
|
24
|
-
_this.getStyle = function () {
|
|
25
|
-
return {
|
|
26
|
-
with: 980,
|
|
27
|
-
height: '100%',
|
|
28
|
-
margin: '0 auto'
|
|
29
|
-
};
|
|
30
|
-
};
|
|
31
24
|
_this.state = {
|
|
32
25
|
slateValue: props.value,
|
|
33
26
|
isLoading: true
|
|
@@ -51,14 +44,17 @@ var NewEditor = /*#__PURE__*/function (_React$Component) {
|
|
|
51
44
|
var _this2 = this;
|
|
52
45
|
var slateValue = this.state.slateValue;
|
|
53
46
|
return /*#__PURE__*/React.createElement("div", {
|
|
54
|
-
className: "editor-container"
|
|
55
|
-
style: this.getStyle()
|
|
47
|
+
className: "sf-editor-container"
|
|
56
48
|
}, /*#__PURE__*/React.createElement(Toolbar, {
|
|
57
49
|
editor: this.editor
|
|
58
|
-
}), /*#__PURE__*/React.createElement(
|
|
50
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
51
|
+
className: "sf-editor-content"
|
|
52
|
+
}, /*#__PURE__*/React.createElement(Slate, {
|
|
59
53
|
editor: this.editor,
|
|
60
54
|
value: slateValue,
|
|
61
55
|
onChange: this.onChange
|
|
56
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
57
|
+
className: "editor-article"
|
|
62
58
|
}, /*#__PURE__*/React.createElement(Editable, {
|
|
63
59
|
placeholder: "Enter some text...",
|
|
64
60
|
renderElement: function renderElement(props) {
|
|
@@ -73,7 +69,7 @@ var NewEditor = /*#__PURE__*/function (_React$Component) {
|
|
|
73
69
|
editor.handleTab && editor.handleTab(event);
|
|
74
70
|
}
|
|
75
71
|
}
|
|
76
|
-
})));
|
|
72
|
+
})))));
|
|
77
73
|
}
|
|
78
74
|
}]);
|
|
79
75
|
return NewEditor;
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
-
var _MENUS_CONFIG_MAP;
|
|
2
|
+
var _MENUS_CONFIG_MAP, _HEADER_TITLE_MAP;
|
|
3
3
|
// extension plugin
|
|
4
4
|
export var BLOCKQUOTE = 'blockquote';
|
|
5
5
|
export var BLOB = 'blob';
|
|
6
6
|
export var HEADER = 'header';
|
|
7
|
+
export var HEADER1 = 'header1';
|
|
8
|
+
export var HEADER2 = 'header2';
|
|
9
|
+
export var HEADER3 = 'header3';
|
|
10
|
+
export var HEADER4 = 'header4';
|
|
11
|
+
export var HEADER5 = 'header5';
|
|
12
|
+
export var HEADER6 = 'header6';
|
|
7
13
|
export var ORDERED_LIST = 'ordered_list';
|
|
8
14
|
export var UNORDERED_LIST = 'unordered_list'; // unordered_list can not work
|
|
9
15
|
export var LIST_ITEM = 'list-item';
|
|
@@ -35,4 +41,9 @@ export var MENUS_CONFIG_MAP = (_MENUS_CONFIG_MAP = {}, _defineProperty(_MENUS_CO
|
|
|
35
41
|
id: UNORDERED_LIST,
|
|
36
42
|
iconClass: 'iconfont icon-list-ul',
|
|
37
43
|
text: 'unordered_list'
|
|
38
|
-
}), _MENUS_CONFIG_MAP
|
|
44
|
+
}), _defineProperty(_MENUS_CONFIG_MAP, CHECK_LIST, {
|
|
45
|
+
id: CHECK_LIST,
|
|
46
|
+
iconClass: 'iconfont icon-check-square',
|
|
47
|
+
text: 'check_list_item'
|
|
48
|
+
}), _MENUS_CONFIG_MAP);
|
|
49
|
+
export var HEADER_TITLE_MAP = (_HEADER_TITLE_MAP = {}, _defineProperty(_HEADER_TITLE_MAP, HEADER1, 'header_1'), _defineProperty(_HEADER_TITLE_MAP, HEADER2, 'header_2'), _defineProperty(_HEADER_TITLE_MAP, HEADER3, 'header_3'), _defineProperty(_HEADER_TITLE_MAP, HEADER4, 'header_4'), _defineProperty(_HEADER_TITLE_MAP, HEADER5, 'header_5'), _defineProperty(_HEADER_TITLE_MAP, HEADER6, 'header_6'), _defineProperty(_HEADER_TITLE_MAP, PARAGRAPH, 'pargraph'), _HEADER_TITLE_MAP);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
.menu-group {
|
|
2
|
+
height: 100%;
|
|
3
|
+
padding: 5px 0 5px 5px;
|
|
4
|
+
font-size: 0.75rem;
|
|
5
|
+
border-right: 1px solid #e5e5e5;
|
|
6
|
+
color: #555555;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.menu-group .menu-group-item {
|
|
10
|
+
width: 30px;
|
|
11
|
+
height: 100%;
|
|
12
|
+
margin-right: 10px;
|
|
13
|
+
border: 1px solid transparent;
|
|
14
|
+
line-height: 30px;
|
|
15
|
+
color: #555555;
|
|
16
|
+
background-color: #fcfcfc;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.menu-group .menu-group-item:disabled {
|
|
20
|
+
color: #999;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.menu-group .menu-group-item:hover {
|
|
24
|
+
background-color: #e5e5e5;
|
|
25
|
+
border-radius: 2px;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.menu-group .menu-group-item[data-active='true'] {
|
|
29
|
+
color: #eb8205;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.menu-group .menu-group-item .iconfont {
|
|
33
|
+
font-size: 13px;
|
|
34
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import { Editor, Transforms } from "slate";
|
|
3
|
+
import { BLOCKQUOTE } from "../../constants";
|
|
4
|
+
import { getNodeType } from "../../core";
|
|
5
|
+
export var isMenuDisabled = function isMenuDisabled(editor) {
|
|
6
|
+
if (editor.selection == null) return true;
|
|
7
|
+
var _Editor$nodes = Editor.nodes(editor, {
|
|
8
|
+
match: function match(n) {
|
|
9
|
+
var type = getNodeType(n);
|
|
10
|
+
|
|
11
|
+
// 只可用于 p 和 blockquote
|
|
12
|
+
if (type === 'paragraph') return true;
|
|
13
|
+
if (type === 'blockquote') return true;
|
|
14
|
+
return false;
|
|
15
|
+
},
|
|
16
|
+
universal: true,
|
|
17
|
+
mode: 'highest' // 匹配最高层级
|
|
18
|
+
}),
|
|
19
|
+
_Editor$nodes2 = _slicedToArray(_Editor$nodes, 1),
|
|
20
|
+
nodeEntry = _Editor$nodes2[0];
|
|
21
|
+
|
|
22
|
+
// 匹配到 p blockquote ,不禁用
|
|
23
|
+
if (nodeEntry) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
// 未匹配到,则禁用
|
|
27
|
+
return true;
|
|
28
|
+
};
|
|
29
|
+
export var getBlockQuoteType = function getBlockQuoteType(editor) {
|
|
30
|
+
var _Editor$nodes3 = Editor.nodes(editor, {
|
|
31
|
+
match: function match(n) {
|
|
32
|
+
return getNodeType(n) === BLOCKQUOTE;
|
|
33
|
+
},
|
|
34
|
+
universal: true
|
|
35
|
+
}),
|
|
36
|
+
_Editor$nodes4 = _slicedToArray(_Editor$nodes3, 1),
|
|
37
|
+
match = _Editor$nodes4[0];
|
|
38
|
+
if (!match) return 'paragraph';
|
|
39
|
+
var _match = _slicedToArray(match, 1),
|
|
40
|
+
n = _match[0];
|
|
41
|
+
return getNodeType(n);
|
|
42
|
+
};
|
|
43
|
+
export var setBlockQuoteType = function setBlockQuoteType(editor, type) {
|
|
44
|
+
Transforms.setNodes(editor, {
|
|
45
|
+
type: type
|
|
46
|
+
}, {
|
|
47
|
+
mode: 'highest'
|
|
48
|
+
});
|
|
49
|
+
};
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
-
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
3
2
|
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
4
3
|
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
5
4
|
import _inherits from "@babel/runtime/helpers/esm/inherits";
|
|
6
5
|
import _createSuper from "@babel/runtime/helpers/esm/createSuper";
|
|
7
6
|
import React from 'react';
|
|
8
|
-
import {
|
|
9
|
-
import { BLOCKQUOTE, MENUS_CONFIG_MAP } from '../../../constants';
|
|
10
|
-
import { getNodeType, getSelectedNodeByType } from '../../../core';
|
|
7
|
+
import { BLOCKQUOTE, MENUS_CONFIG_MAP, PARAGRAPH } from '../../../constants';
|
|
11
8
|
import { MenuItem } from '../../../menu/';
|
|
9
|
+
import { getBlockQuoteType, isMenuDisabled, setBlockQuoteType } from '../helpers';
|
|
12
10
|
var QuoteMenu = /*#__PURE__*/function (_React$Component) {
|
|
13
11
|
_inherits(QuoteMenu, _React$Component);
|
|
14
12
|
var _super = _createSuper(QuoteMenu);
|
|
@@ -21,45 +19,18 @@ var QuoteMenu = /*#__PURE__*/function (_React$Component) {
|
|
|
21
19
|
_this = _super.call.apply(_super, [this].concat(args));
|
|
22
20
|
_this.isActive = function () {
|
|
23
21
|
var editor = _this.props.editor;
|
|
24
|
-
|
|
25
|
-
return !!node;
|
|
22
|
+
return getBlockQuoteType(editor) === BLOCKQUOTE;
|
|
26
23
|
};
|
|
27
24
|
_this.isDisabled = function () {
|
|
28
25
|
var editor = _this.props.editor;
|
|
29
|
-
|
|
30
|
-
var _Editor$nodes = Editor.nodes(editor, {
|
|
31
|
-
match: function match(n) {
|
|
32
|
-
var type = getNodeType(n);
|
|
33
|
-
|
|
34
|
-
// 只可用于 p 和 blockquote
|
|
35
|
-
if (type === 'paragraph') return true;
|
|
36
|
-
if (type === 'blockquote') return true;
|
|
37
|
-
return false;
|
|
38
|
-
},
|
|
39
|
-
universal: true,
|
|
40
|
-
mode: 'highest' // 匹配最高层级
|
|
41
|
-
}),
|
|
42
|
-
_Editor$nodes2 = _slicedToArray(_Editor$nodes, 1),
|
|
43
|
-
nodeEntry = _Editor$nodes2[0];
|
|
44
|
-
|
|
45
|
-
// 匹配到 p blockquote ,不禁用
|
|
46
|
-
if (nodeEntry) {
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
// 未匹配到,则禁用
|
|
50
|
-
return true;
|
|
26
|
+
return isMenuDisabled(editor);
|
|
51
27
|
};
|
|
52
28
|
_this.onMouseDown = function () {
|
|
53
29
|
var editor = _this.props.editor;
|
|
54
30
|
var active = _this.isActive(editor);
|
|
55
|
-
var newType = active ?
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
Transforms.setNodes(editor, {
|
|
59
|
-
type: newType
|
|
60
|
-
}, {
|
|
61
|
-
mode: 'highest'
|
|
62
|
-
});
|
|
31
|
+
var newType = active ? PARAGRAPH : BLOCKQUOTE;
|
|
32
|
+
console.log(newType);
|
|
33
|
+
setBlockQuoteType(editor, newType);
|
|
63
34
|
};
|
|
64
35
|
return _this;
|
|
65
36
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
-
import { Editor, Element, Point, Transforms } from 'slate';
|
|
2
|
+
import { Editor, Element, Point, Transforms, Node } from 'slate';
|
|
3
3
|
import { ReactEditor } from 'slate-react';
|
|
4
4
|
import { BLOCKQUOTE } from '../../constants';
|
|
5
5
|
var withBlockquote = function withBlockquote(editor) {
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
|
|
3
|
+
import { Transforms, Editor, Element } from 'slate';
|
|
4
|
+
import { CHECK_LIST_ITEM, PARAGRAPH } from '../../constants';
|
|
5
|
+
import { getSelectedNodeByType } from '../../core';
|
|
6
|
+
export var isMenuDisabled = function isMenuDisabled(editor) {
|
|
7
|
+
if (editor.selection == null) return true;
|
|
8
|
+
var selectedElements = [];
|
|
9
|
+
var nodeEntries = Editor.nodes(editor, {
|
|
10
|
+
universal: true
|
|
11
|
+
});
|
|
12
|
+
var _iterator = _createForOfIteratorHelper(nodeEntries),
|
|
13
|
+
_step;
|
|
14
|
+
try {
|
|
15
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
16
|
+
var nodeEntry = _step.value;
|
|
17
|
+
var _nodeEntry = _slicedToArray(nodeEntry, 1),
|
|
18
|
+
node = _nodeEntry[0];
|
|
19
|
+
if (Element.isElement(node)) selectedElements.push(node);
|
|
20
|
+
}
|
|
21
|
+
} catch (err) {
|
|
22
|
+
_iterator.e(err);
|
|
23
|
+
} finally {
|
|
24
|
+
_iterator.f();
|
|
25
|
+
}
|
|
26
|
+
var notMatch = selectedElements.some(function (element) {
|
|
27
|
+
if (Editor.isVoid(editor, element) && Editor.isBlock(editor, element)) return true;
|
|
28
|
+
var type = element.type;
|
|
29
|
+
if (['pre', 'code', 'list-item'].includes(type)) return true;
|
|
30
|
+
return false;
|
|
31
|
+
});
|
|
32
|
+
if (notMatch) return true;
|
|
33
|
+
return false;
|
|
34
|
+
};
|
|
35
|
+
export var getCheckListItemType = function getCheckListItemType(editor) {
|
|
36
|
+
var node = getSelectedNodeByType(editor, CHECK_LIST_ITEM);
|
|
37
|
+
if (!node) return PARAGRAPH;
|
|
38
|
+
return node.type;
|
|
39
|
+
};
|
|
40
|
+
export var setCheckListItemType = function setCheckListItemType(editor, newType) {
|
|
41
|
+
Transforms.setNodes(editor, {
|
|
42
|
+
type: newType
|
|
43
|
+
});
|
|
44
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
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';
|
|
7
|
+
import { CHECK_LIST, CHECK_LIST_ITEM, MENUS_CONFIG_MAP, PARAGRAPH } from '../../../constants';
|
|
8
|
+
import { MenuItem } from '../../../menu';
|
|
9
|
+
import { isMenuDisabled, setCheckListItemType, getCheckListItemType } from '../helpers';
|
|
10
|
+
var CheckListMenu = /*#__PURE__*/function (_React$Component) {
|
|
11
|
+
_inherits(CheckListMenu, _React$Component);
|
|
12
|
+
var _super = _createSuper(CheckListMenu);
|
|
13
|
+
function CheckListMenu() {
|
|
14
|
+
var _this;
|
|
15
|
+
_classCallCheck(this, CheckListMenu);
|
|
16
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
17
|
+
args[_key] = arguments[_key];
|
|
18
|
+
}
|
|
19
|
+
_this = _super.call.apply(_super, [this].concat(args));
|
|
20
|
+
_this.isActive = function () {
|
|
21
|
+
var editor = _this.props.editor;
|
|
22
|
+
return getCheckListItemType(editor) === CHECK_LIST_ITEM;
|
|
23
|
+
};
|
|
24
|
+
_this.isDisabled = function () {
|
|
25
|
+
var editor = _this.props.editor;
|
|
26
|
+
return isMenuDisabled(editor);
|
|
27
|
+
};
|
|
28
|
+
_this.onMouseDown = function () {
|
|
29
|
+
var editor = _this.props.editor;
|
|
30
|
+
var active = _this.isActive(editor);
|
|
31
|
+
var newType = active ? PARAGRAPH : CHECK_LIST_ITEM;
|
|
32
|
+
setCheckListItemType(editor, newType);
|
|
33
|
+
};
|
|
34
|
+
return _this;
|
|
35
|
+
}
|
|
36
|
+
_createClass(CheckListMenu, [{
|
|
37
|
+
key: "render",
|
|
38
|
+
value: function render() {
|
|
39
|
+
var _this$props = this.props,
|
|
40
|
+
isRichEditor = _this$props.isRichEditor,
|
|
41
|
+
className = _this$props.className;
|
|
42
|
+
var menuConfig = MENUS_CONFIG_MAP[CHECK_LIST];
|
|
43
|
+
var props = _objectSpread(_objectSpread({
|
|
44
|
+
isRichEditor: isRichEditor,
|
|
45
|
+
className: className
|
|
46
|
+
}, menuConfig), {}, {
|
|
47
|
+
disabled: this.isDisabled(),
|
|
48
|
+
isActive: this.isActive(),
|
|
49
|
+
onMouseDown: this.onMouseDown
|
|
50
|
+
});
|
|
51
|
+
return /*#__PURE__*/React.createElement(MenuItem, props);
|
|
52
|
+
}
|
|
53
|
+
}]);
|
|
54
|
+
return CheckListMenu;
|
|
55
|
+
}(React.Component);
|
|
56
|
+
export default CheckListMenu;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
2
|
+
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
3
|
+
import { CHECK_LIST_ITEM } from '../../constants';
|
|
4
|
+
var CheckListItem = /*#__PURE__*/_createClass(function CheckListItem(options) {
|
|
5
|
+
_classCallCheck(this, CheckListItem);
|
|
6
|
+
this.type = options.type || CHECK_LIST_ITEM;
|
|
7
|
+
this.checked = options.checked || false;
|
|
8
|
+
this.children = options.children || [{
|
|
9
|
+
text: ''
|
|
10
|
+
}];
|
|
11
|
+
});
|
|
12
|
+
export default CheckListItem;
|
|
@@ -1,17 +1,41 @@
|
|
|
1
1
|
import { Node, Range, Transforms } from 'slate';
|
|
2
|
+
import { CHECK_LIST_ITEM, PARAGRAPH } from '../../constants';
|
|
2
3
|
import { getSelectedNodeByType } from '../../core';
|
|
3
4
|
var withCheckList = function withCheckList(editor) {
|
|
4
|
-
var
|
|
5
|
+
var insertBreak = editor.insertBreak,
|
|
6
|
+
deleteBackWord = editor.deleteBackWord;
|
|
5
7
|
var newEditor = editor;
|
|
8
|
+
newEditor.insertBreak = function () {
|
|
9
|
+
var selection = newEditor.selection;
|
|
10
|
+
if (!selection) {
|
|
11
|
+
insertBreak();
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
var node = getSelectedNodeByType(editor, CHECK_LIST_ITEM);
|
|
15
|
+
if (!node) {
|
|
16
|
+
insertBreak();
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (Node.string(node).length === 0) {
|
|
20
|
+
Transforms.setNodes(editor, {
|
|
21
|
+
type: PARAGRAPH
|
|
22
|
+
}, {
|
|
23
|
+
mode: 'highest'
|
|
24
|
+
});
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
insertBreak();
|
|
28
|
+
return;
|
|
29
|
+
};
|
|
6
30
|
newEditor.deleteBackWord = function (unit) {
|
|
7
31
|
var selection = newEditor.selection;
|
|
8
32
|
if (selection && Range.isCollapsed(selection)) {
|
|
9
|
-
var selectedTodo = getSelectedNodeByType(editor,
|
|
33
|
+
var selectedTodo = getSelectedNodeByType(editor, CHECK_LIST_ITEM);
|
|
10
34
|
if (selectedTodo) {
|
|
11
35
|
// 当前 todo 已经没有文字,则转换为 paragraph
|
|
12
36
|
if (Node.string(selectedTodo).length === 0) {
|
|
13
37
|
Transforms.setNodes(editor, {
|
|
14
|
-
type:
|
|
38
|
+
type: PARAGRAPH
|
|
15
39
|
}, {
|
|
16
40
|
mode: 'highest'
|
|
17
41
|
});
|
|
@@ -30,9 +30,7 @@ var CheckListItem = /*#__PURE__*/function (_React$PureComponent) {
|
|
|
30
30
|
element = _this$props.element;
|
|
31
31
|
var path = ReactEditor.findPath(editor, element);
|
|
32
32
|
Transforms.setNodes(editor, {
|
|
33
|
-
|
|
34
|
-
checked: checked
|
|
35
|
-
}
|
|
33
|
+
checked: checked
|
|
36
34
|
}, {
|
|
37
35
|
at: path
|
|
38
36
|
});
|
|
@@ -47,7 +45,7 @@ var CheckListItem = /*#__PURE__*/function (_React$PureComponent) {
|
|
|
47
45
|
children = _this$props2.children,
|
|
48
46
|
style = _this$props2.style,
|
|
49
47
|
node = _this$props2.element;
|
|
50
|
-
var _ref =
|
|
48
|
+
var _ref = node || {},
|
|
51
49
|
_ref$checked = _ref.checked,
|
|
52
50
|
checked = _ref$checked === void 0 ? false : _ref$checked;
|
|
53
51
|
return /*#__PURE__*/React.createElement("div", Object.assign({}, attributes, {
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import { Editor, Transforms } from "slate";
|
|
3
|
+
import { getNodeType } from "../../core";
|
|
4
|
+
export var isMenuDisabled = function isMenuDisabled(editor) {
|
|
5
|
+
if (!editor.selection) return true;
|
|
6
|
+
var _Editor$nodes = Editor.nodes(editor, {
|
|
7
|
+
match: function match(n) {
|
|
8
|
+
var type = getNodeType(n);
|
|
9
|
+
if (type === 'paragraph') return true;
|
|
10
|
+
if (type.startsWith('header')) return true;
|
|
11
|
+
return false;
|
|
12
|
+
},
|
|
13
|
+
universal: true,
|
|
14
|
+
mode: 'highest'
|
|
15
|
+
}),
|
|
16
|
+
_Editor$nodes2 = _slicedToArray(_Editor$nodes, 1),
|
|
17
|
+
nodeEntry = _Editor$nodes2[0];
|
|
18
|
+
if (nodeEntry) return false;
|
|
19
|
+
return true;
|
|
20
|
+
};
|
|
21
|
+
export var getHeaderType = function getHeaderType(editor) {
|
|
22
|
+
var _Editor$nodes3 = Editor.nodes(editor, {
|
|
23
|
+
match: function match(n) {
|
|
24
|
+
return getNodeType(n).includes('header');
|
|
25
|
+
},
|
|
26
|
+
universal: true
|
|
27
|
+
}),
|
|
28
|
+
_Editor$nodes4 = _slicedToArray(_Editor$nodes3, 1),
|
|
29
|
+
match = _Editor$nodes4[0];
|
|
30
|
+
if (!match) return 'paragraph';
|
|
31
|
+
var _match = _slicedToArray(match, 1),
|
|
32
|
+
n = _match[0];
|
|
33
|
+
return getNodeType(n);
|
|
34
|
+
};
|
|
35
|
+
export var setHeaderType = function setHeaderType(editor, type) {
|
|
36
|
+
if (!type) return;
|
|
37
|
+
Transforms.setNodes(editor, {
|
|
38
|
+
type: type
|
|
39
|
+
});
|
|
40
|
+
};
|