@seafile/seafile-editor 1.0.34 → 1.0.36
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/editors/simple-slate-editor /index.js +5 -1
- package/dist/editors/slate-editor/index.js +5 -1
- package/dist/extension/plugins/header/menu/index.js +1 -1
- package/dist/extension/plugins/image/menu/index.js +4 -5
- package/dist/extension/plugins/image/render-element/style.css +1 -0
- package/dist/extension/plugins/link/render-elem/style.css +1 -0
- package/dist/extension/plugins/list/plugin/index.js +20 -4
- package/dist/extension/plugins/list/plugin/shortcut.js +5 -2
- package/dist/extension/plugins/table/menu/index.js +7 -6
- package/dist/pages/email-editor-dialog/index.js +5 -0
- package/dist/pages/longtext-editor-dialog/style.css +34 -1
- package/dist/pages/markdown-preview/index.js +3 -3
- package/dist/utils/get-preview-content.js +4 -6
- package/package.json +1 -1
|
@@ -38,6 +38,7 @@ function SimpleSlateEditor(_ref) {
|
|
|
38
38
|
const decorate = (0, _extension.useHighlight)(editor);
|
|
39
39
|
const onChange = (0, _react.useCallback)(value => {
|
|
40
40
|
setSlateValue(value);
|
|
41
|
+
if (editor.forceNormalize) return;
|
|
41
42
|
const operations = editor.operations;
|
|
42
43
|
const modifyOps = operations.filter(o => o.type !== 'set_selection');
|
|
43
44
|
if (modifyOps.length > 0) {
|
|
@@ -45,14 +46,16 @@ function SimpleSlateEditor(_ref) {
|
|
|
45
46
|
}
|
|
46
47
|
const eventBus = _eventBus.default.getInstance();
|
|
47
48
|
eventBus.dispatch('change');
|
|
48
|
-
}, [editor
|
|
49
|
+
}, [editor, onContentChanged]);
|
|
49
50
|
|
|
50
51
|
// useMount: focus editor
|
|
51
52
|
(0, _react.useEffect)(() => {
|
|
53
|
+
editor.forceNormalize = true;
|
|
52
54
|
_slate.Editor.normalize(editor, {
|
|
53
55
|
force: true
|
|
54
56
|
});
|
|
55
57
|
const timer = setTimeout(() => {
|
|
58
|
+
editor.forceNormalize = false;
|
|
56
59
|
const [firstNode] = editor.children;
|
|
57
60
|
if (firstNode) {
|
|
58
61
|
const [firstNodeFirstChild] = firstNode.children;
|
|
@@ -67,6 +70,7 @@ function SimpleSlateEditor(_ref) {
|
|
|
67
70
|
}
|
|
68
71
|
}, 300);
|
|
69
72
|
return () => {
|
|
73
|
+
editor.forceNormalize = false;
|
|
70
74
|
clearTimeout(timer);
|
|
71
75
|
};
|
|
72
76
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -43,6 +43,7 @@ function SlateEditor(_ref) {
|
|
|
43
43
|
const decorate = (0, _extension.useHighlight)(editor);
|
|
44
44
|
const onChange = (0, _react.useCallback)(value => {
|
|
45
45
|
setSlateValue(value);
|
|
46
|
+
if (editor.forceNormalize) return;
|
|
46
47
|
const operations = editor.operations;
|
|
47
48
|
const modifyOps = operations.filter(o => o.type !== 'set_selection');
|
|
48
49
|
if (modifyOps.length > 0) {
|
|
@@ -50,14 +51,16 @@ function SlateEditor(_ref) {
|
|
|
50
51
|
}
|
|
51
52
|
const eventBus = _eventBus.default.getInstance();
|
|
52
53
|
eventBus.dispatch('change');
|
|
53
|
-
}, [editor.operations, onContentChanged]);
|
|
54
|
+
}, [editor.forceNormalize, editor.operations, onContentChanged]);
|
|
54
55
|
|
|
55
56
|
// useMount: focus editor
|
|
56
57
|
(0, _react.useEffect)(() => {
|
|
58
|
+
editor.forceNormalize = true;
|
|
57
59
|
_slate.Editor.normalize(editor, {
|
|
58
60
|
force: true
|
|
59
61
|
});
|
|
60
62
|
const timer = setTimeout(() => {
|
|
63
|
+
editor.forceNormalize = false;
|
|
61
64
|
const [firstNode] = editor.children;
|
|
62
65
|
if (firstNode) {
|
|
63
66
|
const [firstNodeFirstChild] = firstNode.children;
|
|
@@ -72,6 +75,7 @@ function SlateEditor(_ref) {
|
|
|
72
75
|
}
|
|
73
76
|
}, 300);
|
|
74
77
|
return () => {
|
|
78
|
+
editor.forceNormalize = false;
|
|
75
79
|
clearTimeout(timer);
|
|
76
80
|
};
|
|
77
81
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -13,8 +13,8 @@ var _helper = require("../helper");
|
|
|
13
13
|
var _tooltip = _interopRequireDefault(require("../../../commons/tooltip"));
|
|
14
14
|
var _keyboard = require("../../../constants/keyboard");
|
|
15
15
|
var _constants = require("../../../constants");
|
|
16
|
-
require("./style.css");
|
|
17
16
|
var _constants2 = require("../../../../constants");
|
|
17
|
+
require("./style.css");
|
|
18
18
|
const headerPopoverShowerList = [_constants.ELementTypes.PARAGRAPH, ..._constants.HEADERS];
|
|
19
19
|
const HeaderMenu = _ref => {
|
|
20
20
|
let {
|
|
@@ -26,20 +26,19 @@ const ImageMenu = _ref => {
|
|
|
26
26
|
isShowImagePopover ? registerEventHandler() : unregisterEventHandler();
|
|
27
27
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
28
28
|
}, [isShowImagePopover]);
|
|
29
|
+
const handleChangePopoverDisplayed = (0, _react.useCallback)(() => {
|
|
30
|
+
setIsShowImagePopover(!isShowImagePopover);
|
|
31
|
+
}, [isShowImagePopover]);
|
|
29
32
|
const onMousedown = (0, _react.useCallback)(e => {
|
|
30
33
|
e.stopPropagation();
|
|
31
34
|
handleChangePopoverDisplayed();
|
|
32
|
-
|
|
33
|
-
}, []);
|
|
35
|
+
}, [handleChangePopoverDisplayed]);
|
|
34
36
|
const registerEventHandler = () => {
|
|
35
37
|
return window.addEventListener('click', handleChangePopoverDisplayed);
|
|
36
38
|
};
|
|
37
39
|
const unregisterEventHandler = () => {
|
|
38
40
|
return window.removeEventListener('click', handleChangePopoverDisplayed);
|
|
39
41
|
};
|
|
40
|
-
const handleChangePopoverDisplayed = (0, _react.useCallback)(() => {
|
|
41
|
-
setIsShowImagePopover(!isShowImagePopover);
|
|
42
|
-
}, [isShowImagePopover]);
|
|
43
42
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_commons.MenuItem, Object.assign({
|
|
44
43
|
type: Image,
|
|
45
44
|
isRichEditor: isRichEditor,
|
|
@@ -13,11 +13,15 @@ var _insertFragmentList = require("./insert-fragment-list");
|
|
|
13
13
|
var _normalizeList = require("./normalize-list");
|
|
14
14
|
var _constant = require("../constant");
|
|
15
15
|
var _shortcut = require("./shortcut");
|
|
16
|
+
var _queries = require("../queries");
|
|
17
|
+
var _core = require("../../../core");
|
|
18
|
+
var _transforms = require("../transforms");
|
|
19
|
+
var _elementTypes = require("../../../constants/element-types");
|
|
16
20
|
const withList = editor => {
|
|
17
21
|
const {
|
|
18
22
|
insertBreak,
|
|
19
23
|
onHotKeyDown,
|
|
20
|
-
|
|
24
|
+
deleteBackward,
|
|
21
25
|
insertText
|
|
22
26
|
} = editor;
|
|
23
27
|
const newEditor = editor;
|
|
@@ -26,16 +30,28 @@ const withList = editor => {
|
|
|
26
30
|
insertBreak();
|
|
27
31
|
return;
|
|
28
32
|
};
|
|
29
|
-
newEditor.
|
|
33
|
+
newEditor.deleteBackward = unit => {
|
|
30
34
|
const {
|
|
31
35
|
selection
|
|
32
36
|
} = newEditor;
|
|
33
37
|
if (selection === null) {
|
|
34
|
-
|
|
38
|
+
deleteBackward(unit);
|
|
35
39
|
return;
|
|
36
40
|
}
|
|
41
|
+
const res = (0, _queries.getListItemEntry)(editor, {});
|
|
42
|
+
if (res && (0, _core.isSelectionAtBlockStart)(editor, {
|
|
43
|
+
match: node => node.type === _elementTypes.LIST_ITEM
|
|
44
|
+
})) {
|
|
45
|
+
const {
|
|
46
|
+
list,
|
|
47
|
+
listItem
|
|
48
|
+
} = res;
|
|
49
|
+
if ((0, _core.isFirstNode)(list[0], listItem[0]) && !(0, _queries.isListNested)(editor, list[1])) {
|
|
50
|
+
(0, _transforms.unwrapList)(editor);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
37
53
|
// nothing todo
|
|
38
|
-
|
|
54
|
+
deleteBackward(unit);
|
|
39
55
|
};
|
|
40
56
|
newEditor.insertText = text => {
|
|
41
57
|
const isPreventInsert = (0, _shortcut.handleShortcut)(newEditor, text);
|
|
@@ -49,9 +49,12 @@ const handleShortcut = (editor, text) => {
|
|
|
49
49
|
if (matchOrderListResult.index !== 0) return false;
|
|
50
50
|
if (matchedOrderListText !== '1.') return false;
|
|
51
51
|
const previousNodePath = (0, _core.getPreviousPath)(aboveNodePath);
|
|
52
|
-
|
|
52
|
+
let previousNodeEntry = null;
|
|
53
|
+
if (previousNodePath) {
|
|
54
|
+
previousNodeEntry = _slate.Editor.node(editor, previousNodePath);
|
|
55
|
+
}
|
|
53
56
|
// If the previous node is not an ordered list and is start with `1.`,transforms to ordered list
|
|
54
|
-
if (
|
|
57
|
+
if (!previousNodePath || previousNodeEntry[0].type !== _elementTypes.ORDERED_LIST) {
|
|
55
58
|
// Delete shortcut key text
|
|
56
59
|
_slate.Transforms.delete(editor, {
|
|
57
60
|
at: range
|
|
@@ -25,25 +25,26 @@ const TableMenu = _ref => {
|
|
|
25
25
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
26
26
|
const disabled = (0, _react.useMemo)(() => (0, _helper.isDisabled)(editor, readonly), [editor.selection, readonly]);
|
|
27
27
|
const isActive = (0, _helper.isInTable)(editor);
|
|
28
|
-
const
|
|
28
|
+
const onHideSelector = (0, _react.useCallback)(() => {
|
|
29
29
|
setIsOpenTableSizeSelector(false);
|
|
30
30
|
unregisterEvent();
|
|
31
31
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
32
32
|
}, [setIsOpenTableSizeSelector]);
|
|
33
33
|
const registerEvent = (0, _react.useCallback)(() => {
|
|
34
|
-
window.addEventListener('click',
|
|
34
|
+
window.addEventListener('click', onHideSelector);
|
|
35
35
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
36
36
|
}, []);
|
|
37
37
|
const unregisterEvent = (0, _react.useCallback)(() => {
|
|
38
|
-
window.removeEventListener('click',
|
|
38
|
+
window.removeEventListener('click', onHideSelector);
|
|
39
39
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
40
40
|
}, []);
|
|
41
41
|
const onMouseDown = (0, _react.useCallback)(e => {
|
|
42
42
|
e.stopPropagation();
|
|
43
43
|
e.preventDefault();
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
const newState = !isOpenTableSizeSelector;
|
|
45
|
+
setIsOpenTableSizeSelector(newState);
|
|
46
|
+
newState ? registerEvent() : unregisterEvent();
|
|
47
|
+
}, [isOpenTableSizeSelector, registerEvent, unregisterEvent]);
|
|
47
48
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
48
49
|
className: "sf-table-menu-item"
|
|
49
50
|
}, /*#__PURE__*/_react.default.createElement(_menuItem.default, Object.assign({
|
|
@@ -103,6 +103,10 @@ function EmailEditorDialog(_ref) {
|
|
|
103
103
|
event.stopPropagation();
|
|
104
104
|
onHotKey(event);
|
|
105
105
|
};
|
|
106
|
+
const onEmailContainerClick = event => {
|
|
107
|
+
event.stopPropagation();
|
|
108
|
+
event.nativeEvent.stopImmediatePropagation();
|
|
109
|
+
};
|
|
106
110
|
const headerClass = (0, _classnames.default)('longtext-header-container', {
|
|
107
111
|
'longtext-header-container-border': readOnly || isWindowsWechat
|
|
108
112
|
});
|
|
@@ -133,6 +137,7 @@ function EmailEditorDialog(_ref) {
|
|
|
133
137
|
isWindowsWechat: isWindowsWechat
|
|
134
138
|
})), /*#__PURE__*/_react.default.createElement("div", {
|
|
135
139
|
onKeyDown: onContainerKeyDown,
|
|
140
|
+
onClick: onEmailContainerClick,
|
|
136
141
|
className: contentClass
|
|
137
142
|
}, /*#__PURE__*/_react.default.createElement(_seatableEditor.default, {
|
|
138
143
|
ref: editorRef,
|
|
@@ -112,6 +112,10 @@
|
|
|
112
112
|
box-shadow: none;
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
.longtext-content-container .sf-slate-editor-content {
|
|
116
|
+
height: calc(100% - 34px);
|
|
117
|
+
}
|
|
118
|
+
|
|
115
119
|
.longtext-content-container .sf-slate-editor-toolbar .sf-menu-group {
|
|
116
120
|
padding: 4px 0 4px 8px;
|
|
117
121
|
}
|
|
@@ -150,6 +154,7 @@
|
|
|
150
154
|
padding: 16px;
|
|
151
155
|
height: auto;
|
|
152
156
|
min-height: 100% !important;
|
|
157
|
+
margin: 0 !important;
|
|
153
158
|
}
|
|
154
159
|
|
|
155
160
|
.longtext-content-container .sf-simple-slate-editor-container .article > div[role="textbox"] > :first-child {
|
|
@@ -166,4 +171,32 @@
|
|
|
166
171
|
|
|
167
172
|
.longtext-content-container .sf-slate-editor-toolbar button:focus {
|
|
168
173
|
outline: none;
|
|
169
|
-
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.longtext-content-container .sf-image-wrapper .full-screen {
|
|
177
|
+
position: absolute;
|
|
178
|
+
display: flex;
|
|
179
|
+
align-items: center;
|
|
180
|
+
justify-content: center;
|
|
181
|
+
height: 28px;
|
|
182
|
+
width: 28px;
|
|
183
|
+
line-height: 28px;
|
|
184
|
+
top: 10px;
|
|
185
|
+
right: 10px;
|
|
186
|
+
padding: 0px;
|
|
187
|
+
box-shadow: none;
|
|
188
|
+
border-radius: 3px;
|
|
189
|
+
border: none;
|
|
190
|
+
background-color: rgba(0, 0, 0, 0.5);
|
|
191
|
+
user-select: none !important;
|
|
192
|
+
z-index: 1000;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.longtext-content-container .sf-image-wrapper .full-screen .iconfont {
|
|
196
|
+
color: #fff;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.longtext-content-container .sf-image-wrapper .full-screen:hover {
|
|
200
|
+
display: flex;
|
|
201
|
+
background-color: rgba(0, 0, 0, 0.5);
|
|
202
|
+
}
|
|
@@ -8,8 +8,8 @@ exports.default = void 0;
|
|
|
8
8
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/defineProperty"));
|
|
9
9
|
var _react = _interopRequireDefault(require("react"));
|
|
10
10
|
var _loading = _interopRequireDefault(require("../../containers/loading"));
|
|
11
|
-
var _markdownView = _interopRequireDefault(require("../markdown-view"));
|
|
12
11
|
var _slateConvert = require("../../slate-convert");
|
|
12
|
+
var _slateViewer = _interopRequireDefault(require("../../editors/slate-viewer"));
|
|
13
13
|
require("./style.css");
|
|
14
14
|
// Windows old Wechat (3.0 or earlier) inner core is chrome 53 and don't support ECMA6, can't use seafile-editor markdownViewer
|
|
15
15
|
// Windows new Wechat (lastest version 3.3.5) support seafile-editor markdownViewer
|
|
@@ -57,8 +57,8 @@ class MarkdownPreview extends _react.default.PureComponent {
|
|
|
57
57
|
dangerouslySetInnerHTML: {
|
|
58
58
|
__html: this.state.innerHtml
|
|
59
59
|
}
|
|
60
|
-
}), !isWindowsWechat && /*#__PURE__*/_react.default.createElement(
|
|
61
|
-
value: value,
|
|
60
|
+
}), !isWindowsWechat && /*#__PURE__*/_react.default.createElement(_slateViewer.default, {
|
|
61
|
+
value: (0, _slateConvert.mdStringToSlate)(value),
|
|
62
62
|
isShowOutline: isShowOutline
|
|
63
63
|
}));
|
|
64
64
|
}
|
|
@@ -54,6 +54,10 @@ const getPreviewText = (content, previewContent) => {
|
|
|
54
54
|
};
|
|
55
55
|
const getTextOfNode = node => {
|
|
56
56
|
let text = '';
|
|
57
|
+
if (node.type === 'check_list_item') {
|
|
58
|
+
text += '';
|
|
59
|
+
return text;
|
|
60
|
+
}
|
|
57
61
|
for (let index = 0; index < node.children.length; index++) {
|
|
58
62
|
const currentNode = node.children[index];
|
|
59
63
|
const {
|
|
@@ -61,12 +65,6 @@ const getTextOfNode = node => {
|
|
|
61
65
|
} = currentNode;
|
|
62
66
|
if (type === 'link') {
|
|
63
67
|
text += '';
|
|
64
|
-
} else if (type === 'check_list_item') {
|
|
65
|
-
if (Reflect.has(currentNode, 'checked')) {
|
|
66
|
-
text += '';
|
|
67
|
-
} else {
|
|
68
|
-
text += _slate.Node.string(currentNode) + ' ';
|
|
69
|
-
}
|
|
70
68
|
} else {
|
|
71
69
|
text += _slate.Node.string(currentNode) + ' ';
|
|
72
70
|
}
|