@seafile/sdoc-editor 1.0.220 → 1.0.222
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/assets/css/dropdown-menu.css +14 -1
- package/dist/basic-sdk/assets/css/sdoc-editor-plugins.css +0 -23
- package/dist/basic-sdk/extension/commons/search-list/index.css +28 -0
- package/dist/basic-sdk/extension/commons/search-list/index.js +150 -0
- package/dist/basic-sdk/extension/constants/index.js +2 -6
- package/dist/basic-sdk/extension/constants/menus-config.js +15 -0
- package/dist/basic-sdk/extension/plugins/font/helpers.js +7 -0
- package/dist/basic-sdk/extension/plugins/header/render-elem.js +2 -1
- package/dist/basic-sdk/extension/plugins/image/helpers.js +9 -21
- package/dist/basic-sdk/extension/plugins/image/image-loader/index.css +37 -0
- package/dist/basic-sdk/extension/plugins/image/image-loader/index.js +23 -0
- package/dist/basic-sdk/extension/plugins/image/render-elem.js +24 -76
- package/dist/basic-sdk/extension/plugins/image/use-upload-image.js +80 -0
- package/dist/basic-sdk/extension/plugins/multi-column/constants/index.js +1 -1
- package/dist/basic-sdk/extension/plugins/multi-column/helper.js +24 -7
- package/dist/basic-sdk/extension/plugins/multi-column/plugin.js +1 -1
- package/dist/basic-sdk/extension/plugins/multi-column/render/index.css +1 -3
- package/dist/basic-sdk/extension/plugins/multi-column/render/index.js +7 -2
- package/dist/basic-sdk/extension/plugins/multi-column/resize-handlers/index.js +2 -2
- package/dist/basic-sdk/extension/plugins/seatable-column/menu/column-list-item.js +36 -0
- package/dist/basic-sdk/extension/plugins/seatable-column/menu/column-list-menu.css +4 -2
- package/dist/basic-sdk/extension/plugins/seatable-column/menu/column-list-menu.js +8 -13
- package/dist/basic-sdk/extension/plugins/seatable-column/menu/index.js +5 -9
- package/dist/basic-sdk/extension/plugins/seatable-column/plugin.js +9 -1
- package/dist/basic-sdk/extension/plugins/seatable-column/render-elem.js +71 -7
- package/dist/basic-sdk/extension/plugins/seatable-tables/menu/index.js +3 -6
- package/dist/basic-sdk/extension/plugins/seatable-tables/menu/seatable-list.js +35 -2
- package/dist/basic-sdk/extension/plugins/seatable-tables/op-menu/index.css +19 -4
- package/dist/basic-sdk/extension/plugins/seatable-tables/op-menu/index.js +39 -9
- package/dist/basic-sdk/extension/plugins/seatable-tables/render-element/seatable-table.js +2 -1
- package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/hide-column-setter/hide-column-popover.js +2 -4
- package/dist/basic-sdk/extension/plugins/table/helpers.js +1 -0
- package/dist/basic-sdk/extension/plugins/text-style/helpers.js +1 -1
- package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +10 -1
- package/dist/basic-sdk/extension/toolbar/header-toolbar/insert-toolbar/index.js +4 -0
- package/dist/basic-sdk/extension/toolbar/insert-element-toolbar/index.js +7 -0
- package/dist/basic-sdk/extension/toolbar/side-toolbar/helpers.js +53 -2
- package/dist/basic-sdk/extension/toolbar/side-toolbar/index.js +116 -20
- package/dist/basic-sdk/utils/full-width-mode.js +1 -1
- package/package.json +1 -1
- package/public/locales/en/sdoc-editor.json +2 -1
- package/public/locales/zh_CN/sdoc-editor.json +2 -1
|
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
exports.default = OpMenu;
|
|
9
9
|
var _react = _interopRequireWildcard(require("react"));
|
|
10
10
|
var _reactI18next = require("react-i18next");
|
|
11
|
+
var _reactstrap = require("reactstrap");
|
|
11
12
|
var _commons = require("../../../commons");
|
|
12
13
|
var _tooltip = _interopRequireDefault(require("../../../../../components/tooltip"));
|
|
13
14
|
var _customSwitch = _interopRequireDefault(require("../seatable-settings/custom-switch"));
|
|
@@ -22,18 +23,26 @@ const TablesList = _ref => {
|
|
|
22
23
|
let {
|
|
23
24
|
tablesData,
|
|
24
25
|
onSelectTable,
|
|
25
|
-
selectedTableText
|
|
26
|
+
selectedTableText,
|
|
27
|
+
onChange,
|
|
28
|
+
onCompositionStart,
|
|
29
|
+
onCompositionEnd
|
|
26
30
|
} = _ref;
|
|
27
31
|
const {
|
|
28
32
|
t
|
|
29
33
|
} = (0, _reactI18next.useTranslation)('sdoc-editor');
|
|
30
|
-
if (!tablesData.length) {
|
|
31
|
-
return /*#__PURE__*/_react.default.createElement("div", {
|
|
32
|
-
className: "tables-list-empty"
|
|
33
|
-
}, /*#__PURE__*/_react.default.createElement("span", null, t('Search_not_found')));
|
|
34
|
-
}
|
|
35
34
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
36
35
|
className: "seatable-setting-container"
|
|
36
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
37
|
+
className: "seatable-setting-input-wrapper"
|
|
38
|
+
}, /*#__PURE__*/_react.default.createElement(_reactstrap.Input, {
|
|
39
|
+
autoFocus: true,
|
|
40
|
+
placeholder: t('Search_action'),
|
|
41
|
+
onChange: onChange,
|
|
42
|
+
onCompositionStart: onCompositionStart,
|
|
43
|
+
onCompositionEnd: onCompositionEnd
|
|
44
|
+
})), /*#__PURE__*/_react.default.createElement("div", {
|
|
45
|
+
className: "seatable-setting-list-wrapper"
|
|
37
46
|
}, tablesData.map(item => {
|
|
38
47
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
39
48
|
className: `seatable-setting-item ${selectedTableText === item.name ? 'active' : ''}`,
|
|
@@ -49,7 +58,9 @@ const TablesList = _ref => {
|
|
|
49
58
|
}, /*#__PURE__*/_react.default.createElement("i", {
|
|
50
59
|
className: "sdocfont sdoc-check-mark icon-font"
|
|
51
60
|
})));
|
|
52
|
-
})
|
|
61
|
+
}), !tablesData.length && /*#__PURE__*/_react.default.createElement("div", {
|
|
62
|
+
className: "tables-list-empty"
|
|
63
|
+
}, /*#__PURE__*/_react.default.createElement("span", null, t('Search_not_found')))));
|
|
53
64
|
};
|
|
54
65
|
const TablesSettings = _ref2 => {
|
|
55
66
|
let {
|
|
@@ -97,7 +108,8 @@ function OpMenu(_ref3) {
|
|
|
97
108
|
} = (0, _reactI18next.useTranslation)('sdoc-editor');
|
|
98
109
|
const scrollRef = (0, _useScrollContext.useScrollContext)();
|
|
99
110
|
const timer = (0, _react.useRef)(null);
|
|
100
|
-
const
|
|
111
|
+
const hoverMenuRef = (0, _react.useRef)(null);
|
|
112
|
+
const [tablesData, setTablesData] = (0, _react.useState)(editor.tables || []);
|
|
101
113
|
const [isShowTooltip, setIsShowTooltip] = (0, _react.useState)(false);
|
|
102
114
|
const [selectedTable, setSelectedTable] = (0, _react.useState)({});
|
|
103
115
|
const [selectedTableText, setSelectedTableText] = (0, _react.useState)('');
|
|
@@ -242,8 +254,23 @@ function OpMenu(_ref3) {
|
|
|
242
254
|
onCloseOther(['tableList', 'tableSort', 'tableColumnHidden', 'tableFilter']);
|
|
243
255
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
244
256
|
}, [isShowSeaTableSetting]);
|
|
257
|
+
const onChange = (0, _react.useCallback)(e => {
|
|
258
|
+
if (!hoverMenuRef.current.isInputtingChinese) {
|
|
259
|
+
const value = e.target.value.trim().toUpperCase();
|
|
260
|
+
const newTablesData = editor.tables.filter(item => item.name.toUpperCase().includes(value));
|
|
261
|
+
setTablesData(newTablesData);
|
|
262
|
+
}
|
|
263
|
+
}, [editor.tables]);
|
|
264
|
+
const onCompositionStart = (0, _react.useCallback)(() => {
|
|
265
|
+
hoverMenuRef.current.isInputtingChinese = true;
|
|
266
|
+
}, []);
|
|
267
|
+
const onCompositionEnd = (0, _react.useCallback)(e => {
|
|
268
|
+
hoverMenuRef.current.isInputtingChinese = false;
|
|
269
|
+
onChange(e);
|
|
270
|
+
}, [onChange]);
|
|
245
271
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_commons.ElementPopover, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
246
272
|
id: "sdoc-seatable-hover-menu-container",
|
|
273
|
+
ref: hoverMenuRef,
|
|
247
274
|
className: "sdoc-seatable-hover-menu-container",
|
|
248
275
|
style: menuPosition
|
|
249
276
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
@@ -317,7 +344,10 @@ function OpMenu(_ref3) {
|
|
|
317
344
|
}, /*#__PURE__*/_react.default.createElement(TablesList, {
|
|
318
345
|
tablesData: tablesData,
|
|
319
346
|
onSelectTable: onSelectTable,
|
|
320
|
-
selectedTableText: selectedTableText
|
|
347
|
+
selectedTableText: selectedTableText,
|
|
348
|
+
onChange: onChange,
|
|
349
|
+
onCompositionStart: onCompositionStart,
|
|
350
|
+
onCompositionEnd: onCompositionEnd
|
|
321
351
|
})), /*#__PURE__*/_react.default.createElement(_filterSetter.default, {
|
|
322
352
|
target: "sdoc_seatable_filter",
|
|
323
353
|
container: document.getElementById('sdoc-seatable-hover-menu-container'),
|
|
@@ -311,7 +311,8 @@ function SeaTableTable(_ref) {
|
|
|
311
311
|
}), isLoading && /*#__PURE__*/_react.default.createElement(_loading.default, null), !isLoading && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("table", {
|
|
312
312
|
className: (0, _classnames.default)('seatable-view-records', {
|
|
313
313
|
'no_alternate_color': !element.alternate_color
|
|
314
|
-
})
|
|
314
|
+
}),
|
|
315
|
+
contentEditable: false
|
|
315
316
|
}, /*#__PURE__*/_react.default.createElement("thead", null, /*#__PURE__*/_react.default.createElement(_recordHeader.default, {
|
|
316
317
|
editor: editor,
|
|
317
318
|
element: element,
|
|
@@ -171,6 +171,7 @@ class HideColumnPopover extends _react.default.Component {
|
|
|
171
171
|
}, /*#__PURE__*/_react.default.createElement("input", {
|
|
172
172
|
className: "form-control",
|
|
173
173
|
type: "text",
|
|
174
|
+
autoFocus: true,
|
|
174
175
|
placeholder: t('Search_column'),
|
|
175
176
|
value: this.state.searchVal,
|
|
176
177
|
onChange: this.onChangeSearch
|
|
@@ -179,10 +180,7 @@ class HideColumnPopover extends _react.default.Component {
|
|
|
179
180
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
180
181
|
className: "empty-hidden-columns-list"
|
|
181
182
|
}, t('No_columns_available_to_be_hidden'))), !isEmpty && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
182
|
-
className: "field-settings-body"
|
|
183
|
-
style: {
|
|
184
|
-
maxHeight: window.innerHeight - 400 + 'px'
|
|
185
|
-
}
|
|
183
|
+
className: "field-settings-body"
|
|
186
184
|
}, fieldSettings.map(setting => {
|
|
187
185
|
return /*#__PURE__*/_react.default.createElement(_hideColumnItem.default, {
|
|
188
186
|
key: setting.key,
|
|
@@ -42,6 +42,7 @@ const isTableMenuDisabled = (editor, readonly) => {
|
|
|
42
42
|
if (type === _constants.ELEMENT_TYPE.TABLE_CELL) return true;
|
|
43
43
|
if (type === _constants.ELEMENT_TYPE.TABLE_ROW) return true;
|
|
44
44
|
if (type === _constants.ELEMENT_TYPE.CALL_OUT) return true;
|
|
45
|
+
if (type === _constants.ELEMENT_TYPE.MULTI_COLUMN) return true;
|
|
45
46
|
if (_slate.Editor.isVoid(editor, n)) return true;
|
|
46
47
|
return false;
|
|
47
48
|
},
|
|
@@ -16,7 +16,7 @@ const isMenuDisabled = (editor, readonly) => {
|
|
|
16
16
|
match: n => {
|
|
17
17
|
const type = (0, _core.getNodeType)(n);
|
|
18
18
|
if (type === _elementType.CODE_BLOCK) return true; // Code block
|
|
19
|
-
if (_slate.Editor.isVoid(editor, n)) return true; // void node
|
|
19
|
+
if (_slate.Editor.isVoid(editor, n) && (n === null || n === void 0 ? void 0 : n.type) !== _elementType.SEATABLE_COLUMN) return true; // void node
|
|
20
20
|
|
|
21
21
|
return false;
|
|
22
22
|
},
|
|
@@ -49,6 +49,10 @@ const TextStyleMenuList = _ref => {
|
|
|
49
49
|
return (0, _helpers2.isMenuDisabled)(editor, readonly);
|
|
50
50
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
51
51
|
}, [editor, readonly]);
|
|
52
|
+
const isSelectedSeaTableColumn = (0, _react.useCallback)(() => {
|
|
53
|
+
const entery = (0, _core.getSelectedNodeByType)(editor, _constants.SEATABLE_COLUMN);
|
|
54
|
+
return !!entery;
|
|
55
|
+
}, [editor]);
|
|
52
56
|
const openLinkDialog = (0, _react.useCallback)(() => {
|
|
53
57
|
const eventBus = _eventBus.default.getInstance();
|
|
54
58
|
eventBus.dispatch(_constants2.INTERNAL_EVENT.INSERT_ELEMENT, {
|
|
@@ -99,11 +103,16 @@ const TextStyleMenuList = _ref => {
|
|
|
99
103
|
}, [editor, selectedFontSize, selectedFontSizeValue]);
|
|
100
104
|
const getTextStyleList = (0, _react.useCallback)(key => {
|
|
101
105
|
return _constants.MENUS_CONFIG_MAP[key].map(item => {
|
|
106
|
+
let disable = isDisabled();
|
|
107
|
+
const disableTypes = [_constants.TEXT_STYLE_MAP.CODE, _constants.TEXT_STYLE_MAP.LINK, _constants.TEXT_STYLE_MAP.SUPERSCRIPT, _constants.TEXT_STYLE_MAP.SUBSCRIPT];
|
|
108
|
+
if (disableTypes.includes(item.type)) {
|
|
109
|
+
disable = isSelectedSeaTableColumn() ? true : disable;
|
|
110
|
+
}
|
|
102
111
|
let itemProps = {
|
|
103
112
|
isRichEditor,
|
|
104
113
|
className,
|
|
105
114
|
ariaLabel: item === null || item === void 0 ? void 0 : item.ariaLabel,
|
|
106
|
-
disabled:
|
|
115
|
+
disabled: disable,
|
|
107
116
|
isActive: isActive(item.type),
|
|
108
117
|
onMouseDown: item.isColor ? () => {} : onMouseDown
|
|
109
118
|
};
|
|
@@ -41,6 +41,10 @@ const InsertToolbar = _ref => {
|
|
|
41
41
|
return _eventBus.default.getInstance();
|
|
42
42
|
}, []);
|
|
43
43
|
const toggle = (0, _react.useCallback)(event => {
|
|
44
|
+
var _event$target;
|
|
45
|
+
if (event !== null && event !== void 0 && event.target && (event === null || event === void 0 ? void 0 : (_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.tagName) === 'INPUT') {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
44
48
|
popoverRef.current && popoverRef.current.toggle();
|
|
45
49
|
setMenuShow(!isShowMenu);
|
|
46
50
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -138,6 +138,12 @@ const QuickInsertBlockMenu = _ref => {
|
|
|
138
138
|
});
|
|
139
139
|
return !!callout;
|
|
140
140
|
}, [editor]);
|
|
141
|
+
const isDisableTable = (0, _react.useMemo)(() => {
|
|
142
|
+
const callout = (0, _core.getAboveBlockNode)(editor, {
|
|
143
|
+
match: n => [_constants.ELEMENT_TYPE.ORDERED_LIST, _constants.ELEMENT_TYPE.UNORDERED_LIST, _constants.ELEMENT_TYPE.CHECK_LIST_ITEM, _constants.ELEMENT_TYPE.MULTI_COLUMN].includes(n.type)
|
|
144
|
+
});
|
|
145
|
+
return !!callout;
|
|
146
|
+
}, [editor]);
|
|
141
147
|
const createMultiColumn = (0, _react.useCallback)(type => {
|
|
142
148
|
callback && callback();
|
|
143
149
|
const newInsertPosition = slateNode.type === _constants.ELEMENT_TYPE.LIST_ITEM ? _constants.INSERT_POSITION.AFTER : insertPosition;
|
|
@@ -168,6 +174,7 @@ const QuickInsertBlockMenu = _ref => {
|
|
|
168
174
|
// eslint-disable-next-line react/jsx-indent
|
|
169
175
|
_react.default.createElement(_dropdownMenuItem.default, {
|
|
170
176
|
isHidden: !quickInsertMenuSearchMap[_constants.TABLE],
|
|
177
|
+
disabled: isDisableTable,
|
|
171
178
|
key: "sdoc-insert-menu-table",
|
|
172
179
|
menuConfig: {
|
|
173
180
|
..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.TABLE]
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.setSelection = exports.onWrapMultiListItemToNonListTypeTarget = exports.onWrapMultiListItem = exports.onWrapListItem = exports.onSetNodeType = exports.onDeleteNode = exports.onCopyNode = exports.normalizeCopyData = exports.isVoidNode = exports.isNotSupportTransform = exports.isMultiColumn = exports.isListItem = exports.isList = exports.isInMultiColumnNode = exports.isBlockquote = exports.insertEmptyListNodeAtTarget = exports.insertElement = exports.getTransformMenusConfig = exports.getTopValue = exports.getSearchedOperations = exports.getNodeEntry = exports.getListNode = exports.deleteNodesFromBack = exports.createDragPreviewContainer = void 0;
|
|
7
|
+
exports.setSelection = exports.onWrapMultiListItemToNonListTypeTarget = exports.onWrapMultiListItem = exports.onWrapListItemFromMultiColumn = exports.onWrapListItem = exports.onSetNodeType = exports.onDeleteNode = exports.onCopyNode = exports.normalizeCopyData = exports.isVoidNode = exports.isNotSupportTransform = exports.isMultiColumn = exports.isListItem = exports.isList = exports.isInMultiColumnNode = exports.isBlockquote = exports.insertEmptyListNodeAtTarget = exports.insertElement = exports.getTransformMenusConfig = exports.getTopValue = exports.getSearchedOperations = exports.getNodeEntry = exports.getListNodeFromMultiColumn = exports.getListNode = exports.deleteNodesFromBack = exports.createDragPreviewContainer = void 0;
|
|
8
8
|
var _slate = require("@seafile/slate");
|
|
9
9
|
var _slugid = _interopRequireDefault(require("slugid"));
|
|
10
10
|
var _slateReact = require("@seafile/slate-react");
|
|
@@ -20,6 +20,7 @@ var _helpers2 = require("../../plugins/check-list/helpers");
|
|
|
20
20
|
var _constants3 = require("../../../constants");
|
|
21
21
|
var _helpers3 = require("../../../node-id/helpers");
|
|
22
22
|
var _documentUtils = require("../../../utils/document-utils");
|
|
23
|
+
var _helper2 = require("../../plugins/multi-column/helper");
|
|
23
24
|
const onSetNodeType = (editor, element, type) => {
|
|
24
25
|
if (!type) return;
|
|
25
26
|
if (type === _constants.CALL_OUT) {
|
|
@@ -53,6 +54,32 @@ const onSetNodeType = (editor, element, type) => {
|
|
|
53
54
|
});
|
|
54
55
|
return;
|
|
55
56
|
}
|
|
57
|
+
|
|
58
|
+
// Transform to multi_column and put content into first column
|
|
59
|
+
if (_constants.MULTI_COLUMN_TYPE.includes(type)) {
|
|
60
|
+
const path = (0, _core.findPath)(editor, element);
|
|
61
|
+
const multiColumnNode = (0, _helper2.generateEmptyMultiColumn)(editor, type);
|
|
62
|
+
_slate.Transforms.insertNodes(editor, multiColumnNode, {
|
|
63
|
+
at: [path[0] + 1]
|
|
64
|
+
});
|
|
65
|
+
const nodeIndex = path[0];
|
|
66
|
+
const highestNode = editor.children[nodeIndex];
|
|
67
|
+
if (path.length > 1 && [_constants.BLOCKQUOTE, _constants.ORDERED_LIST, _constants.UNORDERED_LIST, _constants.CODE_BLOCK].includes(highestNode.type)) {
|
|
68
|
+
_slate.Transforms.moveNodes(editor, {
|
|
69
|
+
at: [path[0]],
|
|
70
|
+
to: [path[0] + 1, 0, 0]
|
|
71
|
+
});
|
|
72
|
+
} else {
|
|
73
|
+
_slate.Transforms.moveNodes(editor, {
|
|
74
|
+
at: path,
|
|
75
|
+
to: [path[0] + 1, 0, 0]
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
_slate.Transforms.removeNodes(editor, {
|
|
79
|
+
at: [path[0], 0, 1]
|
|
80
|
+
});
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
56
83
|
_slate.Transforms.setNodes(editor, {
|
|
57
84
|
type: type
|
|
58
85
|
});
|
|
@@ -134,7 +161,8 @@ const isVoidNode = node => {
|
|
|
134
161
|
const isCodeBlock = node.type === _constants.CODE_BLOCK;
|
|
135
162
|
const isCallout = node.type === _constants.CALL_OUT;
|
|
136
163
|
const isSeaTableTable = node.type === _constants.SEATABLE_TABLE;
|
|
137
|
-
|
|
164
|
+
const isSeaTableColumn = node.type === _constants.SEATABLE_COLUMN;
|
|
165
|
+
return _slate.Node.string(node) === '' && !hasImage && !isVideo && !isTable && !isCodeBlock && !isCallout && !isSeaTableTable && !isSeaTableColumn;
|
|
138
166
|
};
|
|
139
167
|
exports.isVoidNode = isVoidNode;
|
|
140
168
|
const isNotSupportTransform = node => {
|
|
@@ -219,6 +247,25 @@ const getListNode = (editor, path) => {
|
|
|
219
247
|
return listNode;
|
|
220
248
|
};
|
|
221
249
|
exports.getListNode = getListNode;
|
|
250
|
+
const getListNodeFromMultiColumn = (editor, path) => {
|
|
251
|
+
let listType = _slate.Editor.node(editor, path.slice(0, 3))[0].type;
|
|
252
|
+
const listItem = _slate.Editor.node(editor, path)[0];
|
|
253
|
+
const listNode = (0, _model.generateEmptyList)(listType);
|
|
254
|
+
listNode.children[0] = listItem;
|
|
255
|
+
return listNode;
|
|
256
|
+
};
|
|
257
|
+
exports.getListNodeFromMultiColumn = getListNodeFromMultiColumn;
|
|
258
|
+
const onWrapListItemFromMultiColumn = (editor, targetPath, sourcePath) => {
|
|
259
|
+
const nextPath = _slate.Path.next(targetPath);
|
|
260
|
+
const listNode = getListNodeFromMultiColumn(editor, sourcePath.slice(0, 4));
|
|
261
|
+
_slate.Transforms.removeNodes(editor, {
|
|
262
|
+
at: sourcePath.slice(0, 4)
|
|
263
|
+
});
|
|
264
|
+
_slate.Transforms.insertNodes(editor, listNode, {
|
|
265
|
+
at: nextPath
|
|
266
|
+
});
|
|
267
|
+
};
|
|
268
|
+
exports.onWrapListItemFromMultiColumn = onWrapListItemFromMultiColumn;
|
|
222
269
|
const onWrapListItem = (editor, targetPath, sourcePath) => {
|
|
223
270
|
const nextPath = _slate.Path.next(targetPath);
|
|
224
271
|
const listNode = getListNode(editor, sourcePath);
|
|
@@ -273,6 +320,10 @@ const getTransformMenusConfig = (editor, slateNode) => {
|
|
|
273
320
|
if (highestNode.type === _constants.BLOCKQUOTE) {
|
|
274
321
|
newSideMenusConfig = _constants.SIDE_TRANSFORM_MENUS_CONFIG.filter(item => item.type !== _constants.CALL_OUT);
|
|
275
322
|
}
|
|
323
|
+
// Element in Multi_column can not be converted to multi_column type
|
|
324
|
+
if (highestNode.type === _constants.MULTI_COLUMN) {
|
|
325
|
+
newSideMenusConfig = _constants.SIDE_TRANSFORM_MENUS_CONFIG.filter(item => !_constants.MULTI_COLUMN_TYPE.includes(item.type));
|
|
326
|
+
}
|
|
276
327
|
}
|
|
277
328
|
|
|
278
329
|
// headers can't be nested by quote block
|
|
@@ -20,6 +20,7 @@ var _constants = require("../../../constants");
|
|
|
20
20
|
var _constants2 = require("../../constants");
|
|
21
21
|
var _helper = require("../../plugins/callout/helper");
|
|
22
22
|
var _event = require("./event");
|
|
23
|
+
var _helper2 = require("../../plugins/multi-column/helper");
|
|
23
24
|
require("./index.css");
|
|
24
25
|
let sourceElement = null;
|
|
25
26
|
let targetElement = null;
|
|
@@ -88,6 +89,9 @@ const SideToolbar = () => {
|
|
|
88
89
|
let dom = e.target;
|
|
89
90
|
while (((_dom = dom) === null || _dom === void 0 ? void 0 : (_dom$dataset = _dom.dataset) === null || _dom$dataset === void 0 ? void 0 : _dom$dataset.root) !== 'true') {
|
|
90
91
|
var _dom, _dom$dataset;
|
|
92
|
+
if (dom.className === 'column') {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
91
95
|
if (!dom.parentNode) return;
|
|
92
96
|
dom = dom.parentNode;
|
|
93
97
|
}
|
|
@@ -106,6 +110,20 @@ const SideToolbar = () => {
|
|
|
106
110
|
} = document.querySelector('.sdoc-editor-container').getBoundingClientRect();
|
|
107
111
|
left = editorLeft - containerLeft - 40;
|
|
108
112
|
}
|
|
113
|
+
const path = (0, _core.findPath)(editor, node);
|
|
114
|
+
// Add side-tool-bar for paragraphs in multi_column
|
|
115
|
+
if (path.length > 2 && (0, _helpers.isInMultiColumnNode)(editor, node)) {
|
|
116
|
+
let domLeft;
|
|
117
|
+
domLeft = document.querySelector(`[data-id="${dom.dataset.id}"]`) && document.querySelector(`[data-id="${dom.dataset.id}"]`).getBoundingClientRect().left;
|
|
118
|
+
const parentNode = _slate.Editor.node(editor, path.slice(0, 3))[0];
|
|
119
|
+
if ([_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST, _constants2.BLOCKQUOTE].includes(parentNode.type)) {
|
|
120
|
+
domLeft = document.querySelector(`[data-id="${parentNode.id}"]`) && document.querySelector(`[data-id="${parentNode.id}"]`).getBoundingClientRect().left;
|
|
121
|
+
}
|
|
122
|
+
const {
|
|
123
|
+
left: containerLeft
|
|
124
|
+
} = document.querySelector('.sdoc-editor__article').getBoundingClientRect();
|
|
125
|
+
left = domLeft - containerLeft - 41;
|
|
126
|
+
}
|
|
109
127
|
setTimeout(() => {
|
|
110
128
|
// wait animation
|
|
111
129
|
setSidePosition({
|
|
@@ -247,6 +265,7 @@ const SideToolbar = () => {
|
|
|
247
265
|
leaveElement.classList.remove('sdoc-draging');
|
|
248
266
|
}, []);
|
|
249
267
|
const drop = (0, _react.useCallback)(event => {
|
|
268
|
+
var _parentNode$children$;
|
|
250
269
|
targetElement = event.currentTarget;
|
|
251
270
|
targetElement.classList.remove('sdoc-draging');
|
|
252
271
|
const dragTypes = event.dataTransfer.types;
|
|
@@ -326,11 +345,17 @@ const SideToolbar = () => {
|
|
|
326
345
|
return;
|
|
327
346
|
}
|
|
328
347
|
|
|
329
|
-
//
|
|
348
|
+
// Dragging into callout is not supported
|
|
330
349
|
if ([_constants2.CALL_OUT, _constants2.CODE_BLOCK, _constants2.TABLE].includes(sourceNode.type) && (0, _helper.getCalloutEntry)(editor, targetPath)) {
|
|
331
350
|
return;
|
|
332
351
|
}
|
|
333
352
|
|
|
353
|
+
// Dragging multi_column's child into multi_column is not supported
|
|
354
|
+
const isInMultiColumn = (0, _helpers.isInMultiColumnNode)(editor, sourceNode);
|
|
355
|
+
if (isInMultiColumn && (0, _helpers.isMultiColumn)(editor, [targetPath[0]])) {
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
|
|
334
359
|
// Drag list
|
|
335
360
|
if ((0, _helpers.isList)(editor, sourcePath)) {
|
|
336
361
|
// ordinary list items
|
|
@@ -380,32 +405,103 @@ const SideToolbar = () => {
|
|
|
380
405
|
}
|
|
381
406
|
}
|
|
382
407
|
|
|
383
|
-
//
|
|
384
|
-
|
|
385
|
-
|
|
408
|
+
// Dragging element from multi_column to other nodes
|
|
409
|
+
const currentSourceNode = _slate.Editor.node(editor, sourcePath.slice(0, 3))[0];
|
|
410
|
+
if (isInMultiColumn && sourceNode.type === _constants2.PARAGRAPH) {
|
|
411
|
+
// Dragging list
|
|
412
|
+
if ([_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST].includes(currentSourceNode.type)) {
|
|
413
|
+
// Drag ordinary list items to places other than list and quoteBlock
|
|
414
|
+
if (!(0, _helpers.isList)(editor, targetPath) && !(0, _helpers.isBlockquote)(editor, [targetPath[0]])) {
|
|
415
|
+
(0, _helpers.onWrapListItemFromMultiColumn)(editor, targetPath, sourcePath);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// Drag ordinary list items to list
|
|
419
|
+
if ((0, _helpers.isList)(editor, targetPath)) {
|
|
420
|
+
_slate.Transforms.moveNodes(editor, {
|
|
421
|
+
at: sourcePath.slice(0, 4),
|
|
422
|
+
to: _slate.Path.next(targetPath)
|
|
423
|
+
});
|
|
424
|
+
}
|
|
386
425
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
426
|
+
// Drag ordinary list items into the quoteBlock
|
|
427
|
+
if ((0, _helpers.isBlockquote)(editor, [targetPath[0]])) {
|
|
428
|
+
// Drag and drop ordinary list items onto the list within the quoteBlock
|
|
429
|
+
if ((0, _helpers.isList)(editor, targetPath)) {
|
|
430
|
+
_slate.Transforms.moveNodes(editor, {
|
|
431
|
+
at: sourcePath.slice(0, 4),
|
|
432
|
+
to: _slate.Path.next(targetPath)
|
|
433
|
+
});
|
|
434
|
+
} else {
|
|
435
|
+
(0, _helpers.onWrapListItemFromMultiColumn)(editor, targetPath, sourcePath);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
390
438
|
}
|
|
391
439
|
|
|
392
|
-
//
|
|
393
|
-
if (
|
|
394
|
-
|
|
440
|
+
// Dragging quoteBlock's children element from multi_column is not supported
|
|
441
|
+
if (currentSourceNode.type === _constants2.BLOCKQUOTE) {
|
|
442
|
+
return;
|
|
395
443
|
}
|
|
396
|
-
_slate.Transforms.moveNodes(editor, {
|
|
397
|
-
at: sourcePath,
|
|
398
|
-
to: toPath
|
|
399
|
-
});
|
|
400
444
|
}
|
|
401
445
|
|
|
402
|
-
//
|
|
446
|
+
// Handling drag situations including non-multi_column or non-list item dragged from multiColumn
|
|
447
|
+
if (!isInMultiColumn || isInMultiColumn && ![_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST].includes(currentSourceNode.type)) {
|
|
448
|
+
// Drag backward
|
|
449
|
+
if (_slate.Path.isAfter(targetPath, sourcePath)) {
|
|
450
|
+
let toPath = targetPath.slice(0);
|
|
451
|
+
|
|
452
|
+
// Drag elements outside the quoteBlock into the quoteBlock
|
|
453
|
+
if (!(0, _helpers.isBlockquote)(editor, [sourcePath[0]]) && (0, _helpers.isBlockquote)(editor, [targetPath[0]]) && targetPath.length > 1) {
|
|
454
|
+
toPath = _slate.Path.next(targetPath);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Drag into list
|
|
458
|
+
if ((0, _helpers.isList)(editor, targetPath)) {
|
|
459
|
+
toPath = _slate.Path.next(targetPath);
|
|
460
|
+
}
|
|
461
|
+
_slate.Transforms.moveNodes(editor, {
|
|
462
|
+
at: sourcePath,
|
|
463
|
+
to: toPath
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// Drag forward
|
|
468
|
+
if (_slate.Path.isBefore(targetPath, sourcePath)) {
|
|
469
|
+
const toPath = _slate.Path.next(targetPath);
|
|
470
|
+
_slate.Transforms.moveNodes(editor, {
|
|
471
|
+
at: sourcePath,
|
|
472
|
+
to: toPath
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
let selectedSourcePath = sourcePath;
|
|
477
|
+
// Handling drag forward situation for multi_column update
|
|
403
478
|
if (_slate.Path.isBefore(targetPath, sourcePath)) {
|
|
404
|
-
const
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
479
|
+
const targetNode = _slate.Editor.node(editor, [targetPath[0]])[0];
|
|
480
|
+
if (![_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST].includes(targetNode.type)) {
|
|
481
|
+
selectedSourcePath[0] += 1;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Dragging childNodes from multi_column
|
|
486
|
+
const nodeIndex = selectedSourcePath[0];
|
|
487
|
+
const highestNode = editor.children[nodeIndex];
|
|
488
|
+
const [parentNode] = _slate.Editor.parent(editor, selectedSourcePath.slice(0, 3));
|
|
489
|
+
if (selectedSourcePath.length > 1 && highestNode.type === _constants2.MULTI_COLUMN && !((_parentNode$children$ = parentNode.children[0]) !== null && _parentNode$children$ !== void 0 && _parentNode$children$.type)) {
|
|
490
|
+
if (highestNode.children.length <= 2) {
|
|
491
|
+
_slate.Transforms.removeNodes(editor, {
|
|
492
|
+
at: selectedSourcePath.slice(0, 2)
|
|
493
|
+
});
|
|
494
|
+
_slate.Transforms.unwrapNodes(editor, {
|
|
495
|
+
at: [selectedSourcePath[0]]
|
|
496
|
+
});
|
|
497
|
+
} else {
|
|
498
|
+
const topNodesColumnAttribute = highestNode.column;
|
|
499
|
+
_slate.Transforms.removeNodes(editor, {
|
|
500
|
+
at: selectedSourcePath.slice(0, 2)
|
|
501
|
+
});
|
|
502
|
+
const isDragged = true;
|
|
503
|
+
(0, _helper2.updateColumnWidthOnDeletion)(editor, selectedSourcePath, topNodesColumnAttribute, 'deleteBackward', isDragged);
|
|
504
|
+
}
|
|
409
505
|
}
|
|
410
506
|
|
|
411
507
|
// reset
|
|
@@ -17,7 +17,7 @@ const getStyleByFullWidthMode = (scrollRef, editor) => {
|
|
|
17
17
|
containerStyle['minWidth'] = _constants.ARTICLE_FULL_MIN_WIDTH;
|
|
18
18
|
|
|
19
19
|
// Has outline
|
|
20
|
-
if (isShowOutline && editor.editorType !== _constants.WIKI_EDITOR) {
|
|
20
|
+
if (isShowOutline && (editor === null || editor === void 0 ? void 0 : editor.editorType) !== _constants.WIKI_EDITOR) {
|
|
21
21
|
containerStyle['marginLeft'] = `${_constants.LEFT_OUTLINE_WIDTH}px`;
|
|
22
22
|
const adjustWidth = ` - ${_constants.LEFT_OUTLINE_WIDTH - 50}px`; // One side is 50
|
|
23
23
|
containerStyle['width'] = containerStyle['width'].slice(0, -1) + adjustWidth;
|
package/package.json
CHANGED
|
@@ -613,5 +613,6 @@
|
|
|
613
613
|
"Support_Youtube_Tencent_Bilibili_and_more": "Support Youtube, Tencent, Bilibili and more",
|
|
614
614
|
"Image_cannot_be_copied_Please_download_the_source_image": "Image cannot be copied. Please download the source image,",
|
|
615
615
|
"And_select_insert_-_image_to_upload": "and select 「insert」 - 「image」 to upload.",
|
|
616
|
-
"Image_copy_error": "Image copy error"
|
|
616
|
+
"Image_copy_error": "Image copy error",
|
|
617
|
+
"Image_is_uploading": "Image is uploading..."
|
|
617
618
|
}
|
|
@@ -613,5 +613,6 @@
|
|
|
613
613
|
"Support_Youtube_Tencent_Bilibili_and_more": "支持Youtube,腾讯视频,B站及其他平台",
|
|
614
614
|
"Image_cannot_be_copied_Please_download_the_source_image": "此照片不支持复制,请下载原图",
|
|
615
615
|
"And_select_insert_-_image_to_upload": "后点击工具栏「插入」- 「照片」上传",
|
|
616
|
-
"Image_copy_error": "图片复制错误"
|
|
616
|
+
"Image_copy_error": "图片复制错误",
|
|
617
|
+
"Image_is_uploading": "图片正在上传..."
|
|
617
618
|
}
|