@seafile/sdoc-editor 2.0.38-alph-1.0.0 → 2.0.38-alph-1.1.0
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/basic-sdk/editor/editable-article.js +1 -3
- package/dist/basic-sdk/editor/sdoc-editor.js +13 -0
- package/dist/basic-sdk/extension/commons/menu/menu-item.js +0 -1
- package/dist/basic-sdk/extension/plugins/ai/ai-module/helpers.js +22 -1
- package/dist/basic-sdk/extension/plugins/ai/ai-module/index.js +6 -37
- package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +0 -4
- package/dist/basic-sdk/extension/plugins/text-style/render-elem.js +4 -22
- package/dist/basic-sdk/layout/article-container.js +15 -0
- package/package.json +1 -1
|
@@ -25,6 +25,7 @@ var _highlight = require("../highlight");
|
|
|
25
25
|
var _constants2 = require("../extension/constants");
|
|
26
26
|
var _helpers = require("../extension/plugins/table/helpers");
|
|
27
27
|
var _useForceUpdate = _interopRequireDefault(require("../../basic-sdk/hooks/use-force-update"));
|
|
28
|
+
var _helpers2 = require("../extension/plugins/ai/ai-module/helpers");
|
|
28
29
|
const EditableArticle = _ref => {
|
|
29
30
|
let {
|
|
30
31
|
showComment = true,
|
|
@@ -42,12 +43,9 @@ const EditableArticle = _ref => {
|
|
|
42
43
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
43
44
|
const eventProxy = (0, _react.useMemo)(() => new _eventHandler.default(editor), []);
|
|
44
45
|
const onMouseDown = (0, _react.useCallback)(event => {
|
|
45
|
-
// console.log(44);
|
|
46
46
|
if (event.button === 0) {
|
|
47
|
-
// console.log(444)
|
|
48
47
|
const isPreventReset = (0, _helpers.isPreventResetTableSelectedRange)(event);
|
|
49
48
|
if (!isPreventReset) {
|
|
50
|
-
// console.log(5)
|
|
51
49
|
editor.reSetTableSelectedRange();
|
|
52
50
|
const eventBus = _eventBus.default.getInstance();
|
|
53
51
|
eventBus.dispatch(_constants.INTERNAL_EVENT.CANCEL_TABLE_SELECT_RANGE);
|
|
@@ -26,6 +26,7 @@ var _basicSdk = require("../../basic-sdk");
|
|
|
26
26
|
var _constants2 = require("../../constants");
|
|
27
27
|
var _outlineModule = require("../../android/outline-module");
|
|
28
28
|
var _jsBridge = _interopRequireDefault(require("../../android/js-bridge"));
|
|
29
|
+
var _helpers = require("../extension/plugins/ai/ai-module/helpers");
|
|
29
30
|
const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
|
|
30
31
|
let {
|
|
31
32
|
editor: propsEditor,
|
|
@@ -60,6 +61,7 @@ const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
|
|
|
60
61
|
setSlateValue(document.elements);
|
|
61
62
|
}, [document.elements]);
|
|
62
63
|
(0, _react.useEffect)(() => {
|
|
64
|
+
console.log(22);
|
|
63
65
|
validEditor.readonly = false;
|
|
64
66
|
return () => {
|
|
65
67
|
validEditor.selection = null;
|
|
@@ -116,8 +118,18 @@ const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
|
|
|
116
118
|
|
|
117
119
|
// useMount: refresh document
|
|
118
120
|
(0, _react.useEffect)(() => {
|
|
121
|
+
console.log(44343);
|
|
119
122
|
const eventBus = _basicSdk.EventBus.getInstance();
|
|
120
123
|
eventBus.subscribe(_constants2.EXTERNAL_EVENT.REFRESH_DOCUMENT, onRefreshDocument);
|
|
124
|
+
const hasAIMark = !_slate.Editor.nodes(validEditor, {
|
|
125
|
+
at: [],
|
|
126
|
+
match: n => _slate.Text.isText(n) && n.isSelectedInAI === true
|
|
127
|
+
}).next().done;
|
|
128
|
+
if (hasAIMark) {
|
|
129
|
+
console.log(999);
|
|
130
|
+
(0, _helpers.removeMarks)(validEditor);
|
|
131
|
+
}
|
|
132
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
121
133
|
}, [onRefreshDocument]);
|
|
122
134
|
|
|
123
135
|
// The parent component can call the method of this component through ref
|
|
@@ -190,6 +202,7 @@ const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
|
|
|
190
202
|
}))));
|
|
191
203
|
}
|
|
192
204
|
const isShowComment = typeof showComment === 'boolean' ? showComment : true;
|
|
205
|
+
console.log(2, validEditor, slateValue, onValueChange, isShowComment);
|
|
193
206
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_layout.EditorContainer, {
|
|
194
207
|
editor: validEditor
|
|
195
208
|
}, /*#__PURE__*/_react.default.createElement(_useColorContext.ColorProvider, null, isShowHeaderToolbar && /*#__PURE__*/_react.default.createElement(_extension.HeaderToolbar, {
|
|
@@ -29,7 +29,6 @@ const MenuItem = _ref => {
|
|
|
29
29
|
} = (0, _reactI18next.useTranslation)('sdoc-editor');
|
|
30
30
|
const onClick = (0, _react.useCallback)(event => {
|
|
31
31
|
if (disabled) return;
|
|
32
|
-
console.log(3, type);
|
|
33
32
|
onMouseDown(event, type);
|
|
34
33
|
|
|
35
34
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -1 +1,22 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.removeMarks = void 0;
|
|
7
|
+
var _slate = require("@seafile/slate");
|
|
8
|
+
const removeMarks = editor => {
|
|
9
|
+
const {
|
|
10
|
+
selection
|
|
11
|
+
} = editor;
|
|
12
|
+
_slate.Transforms.unsetNodes(editor, 'isSelectedInAI', {
|
|
13
|
+
at: [],
|
|
14
|
+
match: n => _slate.Text.isText(n) && n.isSelectedInAI === true
|
|
15
|
+
});
|
|
16
|
+
if (selection) {
|
|
17
|
+
_slate.Transforms.select(editor, selection);
|
|
18
|
+
} else {
|
|
19
|
+
_slate.Transforms.deselect(editor);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.removeMarks = removeMarks;
|
|
@@ -23,9 +23,8 @@ var _tipDialog = _interopRequireDefault(require("./tip-dialog"));
|
|
|
23
23
|
var _core = require("../../../core");
|
|
24
24
|
var _constants2 = require("../../../constants");
|
|
25
25
|
var _aiIcon = _interopRequireDefault(require("../ai-icon"));
|
|
26
|
+
var _helpers = require("./helpers");
|
|
26
27
|
require("./style.css");
|
|
27
|
-
// import { highlightSelection } from './helpers';
|
|
28
|
-
|
|
29
28
|
function AIModule(_ref) {
|
|
30
29
|
let {
|
|
31
30
|
editor,
|
|
@@ -47,28 +46,21 @@ function AIModule(_ref) {
|
|
|
47
46
|
const [searchResult, setSearchResult] = (0, _react.useState)(null);
|
|
48
47
|
const [currentLang, setCurrentLang] = (0, _react.useState)('en');
|
|
49
48
|
const [isShowTipDialog, setIsShowTipDialog] = (0, _react.useState)(false);
|
|
50
|
-
const [selectDom, setSelectDom] = (0, _react.useState)(null);
|
|
51
|
-
// const [highlightedSpan, setHighlightedSpan] = useState(null);
|
|
52
|
-
console.log(2, element);
|
|
53
49
|
const toggleAskAI = (0, _react.useCallback)(() => {
|
|
54
|
-
//
|
|
55
|
-
console.log(0);
|
|
50
|
+
// Add marks for selection
|
|
56
51
|
_slate.Editor.addMark(editor, 'isSelectedInAI', true);
|
|
57
|
-
console.log(1, editor.selection);
|
|
58
52
|
scrollRef.current = document.querySelector('.sdoc-scroll-container');
|
|
59
53
|
const {
|
|
60
54
|
scrollTop,
|
|
61
55
|
scrollHeight
|
|
62
56
|
} = scrollRef.current;
|
|
63
57
|
if (!element) {
|
|
64
|
-
console.log(44444);
|
|
65
58
|
const content = window.getSelection().toString();
|
|
66
59
|
if (content) {
|
|
67
60
|
setSelectedValue(content);
|
|
68
61
|
}
|
|
69
62
|
const domSelection = window.getSelection();
|
|
70
63
|
const domRange = domSelection.getRangeAt(0);
|
|
71
|
-
setSelectDom(domRange);
|
|
72
64
|
const rect = domRange.getBoundingClientRect();
|
|
73
65
|
const needPaddingBottomHeight = scrollTop + rect.bottom + _constants.AI_MIN_HEIGHT - scrollHeight;
|
|
74
66
|
if (needPaddingBottomHeight > 0) {
|
|
@@ -85,23 +77,17 @@ function AIModule(_ref) {
|
|
|
85
77
|
setTimeout(() => {
|
|
86
78
|
var _rect, _inputRef$current;
|
|
87
79
|
const aboveNode = (0, _core.getAboveBlockNode)(editor);
|
|
88
|
-
// console.log(1, aboveNode)
|
|
89
80
|
const slateDom = _slateReact.ReactEditor.toDOMNode(editor, aboveNode[0]);
|
|
90
81
|
const slateRect = slateDom.getBoundingClientRect();
|
|
91
82
|
const markedSpan = document.querySelectorAll('span[data-slate-leaf="true"].isSelectedInAI');
|
|
92
|
-
console.log(3, markedSpan);
|
|
93
83
|
let rect;
|
|
94
84
|
if (markedSpan.length) {
|
|
95
85
|
rect = markedSpan[markedSpan.length - 1].getBoundingClientRect();
|
|
96
|
-
console.log(4, rect, markedSpan);
|
|
97
86
|
}
|
|
98
|
-
// const newRect = domRange.getBoundingClientRect();
|
|
99
87
|
const el = aiRef.current;
|
|
100
|
-
|
|
101
|
-
el.style.top = `${((_rect = rect) === null || _rect === void 0 ? void 0 : _rect.bottom) + 8 - 3}px`; // top = Current top + Element height
|
|
88
|
+
el.style.top = `${((_rect = rect) === null || _rect === void 0 ? void 0 : _rect.bottom) + 8 - 3.23}px`; // top = Current top + Element height - Element padding bottom
|
|
102
89
|
el.style.left = `${slateRect.left}px`;
|
|
103
90
|
el.style.display = 'block';
|
|
104
|
-
console.log(2, slateDom, slateRect, el, el.style.top);
|
|
105
91
|
setIsShowAIPopover(true);
|
|
106
92
|
(_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
|
|
107
93
|
}, 500);
|
|
@@ -109,7 +95,6 @@ function AIModule(_ref) {
|
|
|
109
95
|
}
|
|
110
96
|
const slateDom = _slateReact.ReactEditor.toDOMNode(editor, element);
|
|
111
97
|
const slateRect = slateDom.getBoundingClientRect();
|
|
112
|
-
console.log(555);
|
|
113
98
|
const content = _slate.Node.string(element);
|
|
114
99
|
if (content) {
|
|
115
100
|
setSelectedValue(content);
|
|
@@ -138,23 +123,9 @@ function AIModule(_ref) {
|
|
|
138
123
|
}, 500);
|
|
139
124
|
}, [editor, element]);
|
|
140
125
|
const onCloseClick = (0, _react.useCallback)(() => {
|
|
126
|
+
(0, _helpers.removeMarks)(editor);
|
|
141
127
|
const element = aiRef.current;
|
|
142
128
|
element.style.display = 'none';
|
|
143
|
-
console.log(2, element);
|
|
144
|
-
const markedSpan = document.querySelectorAll('span[data-slate-leaf="true"].isSelectedInAI');
|
|
145
|
-
if (markedSpan.length) {
|
|
146
|
-
console.log(1, markedSpan);
|
|
147
|
-
markedSpan.forEach(dom => {
|
|
148
|
-
dom.style.removeProperty('padding');
|
|
149
|
-
dom.style.removeProperty('background');
|
|
150
|
-
dom.classList.remove('isSelectedInAI');
|
|
151
|
-
});
|
|
152
|
-
console.log('Before remove:', _slate.Editor.marks(editor));
|
|
153
|
-
_slate.Editor.removeMark(editor, 'isSelectedInAI');
|
|
154
|
-
console.log('after remove:', _slate.Editor.marks(editor));
|
|
155
|
-
// ReactEditor.focus(editor);
|
|
156
|
-
console.log(99);
|
|
157
|
-
}
|
|
158
129
|
const articleDom = document.querySelector('.sdoc-editor__article');
|
|
159
130
|
articleDom.style.removeProperty('padding-bottom');
|
|
160
131
|
setSearchValue('');
|
|
@@ -202,13 +173,11 @@ function AIModule(_ref) {
|
|
|
202
173
|
if (markedSpan.length) {
|
|
203
174
|
rect = markedSpan[markedSpan.length - 1].getBoundingClientRect();
|
|
204
175
|
}
|
|
205
|
-
const newRect = selectDom.getBoundingClientRect();
|
|
206
176
|
const aboveNode = (0, _core.getAboveBlockNode)(editor);
|
|
207
177
|
const slateDom = _slateReact.ReactEditor.toDOMNode(editor, aboveNode[0]);
|
|
208
178
|
const slateRect = slateDom.getBoundingClientRect();
|
|
209
179
|
const el = aiRef.current;
|
|
210
|
-
el.style.top = `${((_rect2 = rect) === null || _rect2 === void 0 ? void 0 : _rect2.bottom) + 8 - 3}px`;
|
|
211
|
-
// el.style.top = `${newRect.bottom + 8 - 3}px`; // top = Current top + Element height
|
|
180
|
+
el.style.top = `${((_rect2 = rect) === null || _rect2 === void 0 ? void 0 : _rect2.bottom) + 8 - 3.23}px`; // top = Current top + Element height - Element padding bottom
|
|
212
181
|
el.style.left = `${slateRect.left}px`;
|
|
213
182
|
el.style.display = 'block';
|
|
214
183
|
} else {
|
|
@@ -219,7 +188,7 @@ function AIModule(_ref) {
|
|
|
219
188
|
el.style.left = `${slateRect.left}px`;
|
|
220
189
|
el.style.display = 'block';
|
|
221
190
|
}
|
|
222
|
-
}, [editor, element
|
|
191
|
+
}, [editor, element]);
|
|
223
192
|
(0, _react.useEffect)(() => {
|
|
224
193
|
let observerRefValue = null;
|
|
225
194
|
if (isShowAIPopover) {
|
|
@@ -61,7 +61,6 @@ const TextStyleMenuList = _ref => {
|
|
|
61
61
|
});
|
|
62
62
|
}, [editor]);
|
|
63
63
|
const onMouseDown = (0, _react.useCallback)((event, type) => {
|
|
64
|
-
console.log(2, type);
|
|
65
64
|
event.preventDefault();
|
|
66
65
|
event.stopPropagation();
|
|
67
66
|
if (isDisabled()) return;
|
|
@@ -77,14 +76,12 @@ const TextStyleMenuList = _ref => {
|
|
|
77
76
|
if (active) {
|
|
78
77
|
(0, _helpers2.removeMark)(editor, type);
|
|
79
78
|
} else {
|
|
80
|
-
console.log(3, type);
|
|
81
79
|
(0, _helpers2.addMark)(editor, type);
|
|
82
80
|
}
|
|
83
81
|
(0, _core.focusEditor)(editor);
|
|
84
82
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
85
83
|
}, [editor]);
|
|
86
84
|
const setColor = (0, _react.useCallback)((type, color) => {
|
|
87
|
-
// console.log(1, type, color);
|
|
88
85
|
_slate.Editor.addMark(editor, type, color);
|
|
89
86
|
(0, _core.focusEditor)(editor);
|
|
90
87
|
|
|
@@ -135,7 +132,6 @@ const TextStyleMenuList = _ref => {
|
|
|
135
132
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
136
133
|
}, [editor, lastUsedFontColor, lastUsedHighlightColor, readonly]);
|
|
137
134
|
let list = getTextStyleList(_constants.TEXT_STYLE);
|
|
138
|
-
// console.log(3, list);
|
|
139
135
|
const dropdownList = getTextStyleList(_constants.TEXT_STYLE_MORE);
|
|
140
136
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, list.map((itemProps, index) => {
|
|
141
137
|
const Component = itemProps.isColor ? _commons.ColorMenu : _commons.MenuItem;
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = void 0;
|
|
9
|
-
var _react =
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
10
9
|
var _caret = _interopRequireDefault(require("./caret"));
|
|
11
10
|
var _constants = require("../../constants");
|
|
12
11
|
var _helpers = require("../font/helpers");
|
|
13
|
-
|
|
14
|
-
const renderText = (props, editor) => {
|
|
12
|
+
const renderText = props => {
|
|
15
13
|
const {
|
|
16
14
|
attributes,
|
|
17
15
|
children,
|
|
@@ -21,24 +19,6 @@ const renderText = (props, editor) => {
|
|
|
21
19
|
text,
|
|
22
20
|
...rest
|
|
23
21
|
} = leaf;
|
|
24
|
-
console.log(1, leaf);
|
|
25
|
-
|
|
26
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
27
|
-
// useEffect(() => {
|
|
28
|
-
// if (leaf.isSelectedInAI) {
|
|
29
|
-
// console.log('origin');
|
|
30
|
-
// const markedSpan = document.querySelectorAll('span[data-slate-leaf="true"].isSelectedInAI');
|
|
31
|
-
// if (markedSpan.length) {
|
|
32
|
-
// console.log(1, markedSpan);
|
|
33
|
-
// markedSpan.forEach((dom) => {
|
|
34
|
-
// dom.style.removeProperty('padding');
|
|
35
|
-
// dom.style.removeProperty('background');
|
|
36
|
-
// dom.classList.remove('isSelectedInAI');
|
|
37
|
-
// });
|
|
38
|
-
// }
|
|
39
|
-
// }
|
|
40
|
-
// }, []);
|
|
41
|
-
|
|
42
22
|
let markedChildren = /*#__PURE__*/_react.default.cloneElement(children);
|
|
43
23
|
let style = {};
|
|
44
24
|
// The following is a workaround for a Chromium bug where,
|
|
@@ -54,6 +34,8 @@ const renderText = (props, editor) => {
|
|
|
54
34
|
style['display'] = 'inline-block';
|
|
55
35
|
style['minWidth'] = '2px';
|
|
56
36
|
}
|
|
37
|
+
|
|
38
|
+
// Add temporary marks for selection in AI
|
|
57
39
|
if (leaf.isSelectedInAI && leaf.text.trim()) {
|
|
58
40
|
style['padding'] = '3.23px 0';
|
|
59
41
|
style['background'] = '#a9c9ed';
|
|
@@ -13,6 +13,8 @@ var _localStorageUtils = _interopRequireDefault(require("../../utils/local-stora
|
|
|
13
13
|
var _fullWidthMode = require("../utils/full-width-mode");
|
|
14
14
|
var _defaultMode = require("../utils/default-mode");
|
|
15
15
|
var _constants = require("../constants");
|
|
16
|
+
var _slate = require("@seafile/slate");
|
|
17
|
+
var _helpers = require("../extension/plugins/ai/ai-module/helpers");
|
|
16
18
|
function ArticleContainer(_ref) {
|
|
17
19
|
let {
|
|
18
20
|
editor,
|
|
@@ -25,6 +27,19 @@ function ArticleContainer(_ref) {
|
|
|
25
27
|
editor.width = articleRef.current.children[0].clientWidth;
|
|
26
28
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
27
29
|
}, []);
|
|
30
|
+
|
|
31
|
+
// useEffect(() => {
|
|
32
|
+
// const hasAIMark = !Editor.nodes(editor, {
|
|
33
|
+
// at: [],
|
|
34
|
+
// match: n => Text.isText(n) && n.isSelectedInAI === true,
|
|
35
|
+
// }).next().done;
|
|
36
|
+
|
|
37
|
+
// if (hasAIMark) {
|
|
38
|
+
// removeMarks(editor);
|
|
39
|
+
// }
|
|
40
|
+
// // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
41
|
+
// }, []);
|
|
42
|
+
|
|
28
43
|
const handleWindowResize = (0, _react.useCallback)(function () {
|
|
29
44
|
let {
|
|
30
45
|
scrollIntoArticle = false,
|