@seafile/sdoc-editor 0.1.175 → 0.2.1
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/sdoc-editor-plugins.css +5 -0
- package/dist/basic-sdk/assets/images/black-border.png +0 -0
- package/dist/basic-sdk/assets/images/grey-border.png +0 -0
- package/dist/basic-sdk/assets/images/no-border.png +0 -0
- package/dist/basic-sdk/editor/sdoc-editor.js +15 -0
- package/dist/basic-sdk/extension/plugins/image/constants/index.js +17 -0
- package/dist/basic-sdk/extension/plugins/image/dialogs/image-previewer.js +0 -6
- package/dist/basic-sdk/extension/plugins/image/hover-menu/index.css +108 -0
- package/dist/basic-sdk/extension/plugins/image/hover-menu/index.js +179 -0
- package/dist/basic-sdk/extension/plugins/image/render-elem.js +211 -159
- package/dist/basic-sdk/extension/plugins/list/transforms/move-list-item-up.js +1 -1
- package/dist/basic-sdk/extension/plugins/table/plugin.js +9 -4
- package/dist/basic-sdk/extension/toolbar/side-toolbar/helpers.js +16 -2
- package/dist/basic-sdk/extension/toolbar/side-toolbar/side-menu.js +3 -3
- package/dist/basic-sdk/views/readonly-article.js +1 -2
- package/dist/components/doc-operations/index.js +6 -0
- package/package.json +2 -2
- package/public/locales/en/sdoc-editor.json +3 -1
- package/public/locales/zh_CN/sdoc-editor.json +3 -1
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -16,6 +16,8 @@ import { EditorContainer, EditorContent } from '../layout';
|
|
|
16
16
|
import EditableArticle from './editable-article';
|
|
17
17
|
import { ColorProvider } from '../hooks/use-color-context';
|
|
18
18
|
import { HeaderToolbar } from '../extension';
|
|
19
|
+
import ReadOnlyArticle from '../views/readonly-article';
|
|
20
|
+
import { isMobile } from '../../utils';
|
|
19
21
|
var SdocEditor = forwardRef(function (_ref, ref) {
|
|
20
22
|
var document = _ref.document,
|
|
21
23
|
isReloading = _ref.isReloading;
|
|
@@ -98,6 +100,19 @@ var SdocEditor = forwardRef(function (_ref, ref) {
|
|
|
98
100
|
className: "h-100 w-100 d-flex align-items-center justify-content-center"
|
|
99
101
|
}, /*#__PURE__*/React.createElement(CommonLoading, null));
|
|
100
102
|
}
|
|
103
|
+
if (isMobile) {
|
|
104
|
+
return /*#__PURE__*/React.createElement(EditorContainer, {
|
|
105
|
+
editor: editor,
|
|
106
|
+
readonly: true
|
|
107
|
+
}, /*#__PURE__*/React.createElement(ColorProvider, null, /*#__PURE__*/React.createElement(EditorContent, {
|
|
108
|
+
docValue: slateValue,
|
|
109
|
+
readonly: true,
|
|
110
|
+
showOutline: false
|
|
111
|
+
}, /*#__PURE__*/React.createElement(ReadOnlyArticle, {
|
|
112
|
+
editor: editor,
|
|
113
|
+
slateValue: slateValue
|
|
114
|
+
}))));
|
|
115
|
+
}
|
|
101
116
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(EditorContainer, {
|
|
102
117
|
editor: editor
|
|
103
118
|
}, /*#__PURE__*/React.createElement(ColorProvider, null, /*#__PURE__*/React.createElement(HeaderToolbar, {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import blackBorder from '../../../../assets/images/black-border.png';
|
|
2
|
+
import greyBorder from '../../../../assets/images/grey-border.png';
|
|
3
|
+
import noBorder from '../../../../assets/images/no-border.png';
|
|
4
|
+
export var IMAGE_DISPLAY_TYPE = ['Inline', 'Block'];
|
|
5
|
+
export var IMAGE_BORDER_TYPE = [{
|
|
6
|
+
type: 'none',
|
|
7
|
+
imgUrl: noBorder,
|
|
8
|
+
value: 'none'
|
|
9
|
+
}, {
|
|
10
|
+
type: 'grey',
|
|
11
|
+
imgUrl: greyBorder,
|
|
12
|
+
value: '2px solid #E5E5E5'
|
|
13
|
+
}, {
|
|
14
|
+
type: 'black',
|
|
15
|
+
imgUrl: blackBorder,
|
|
16
|
+
value: '2px solid #41464A'
|
|
17
|
+
}];
|
|
@@ -83,12 +83,6 @@ var ImagePreviewer = /*#__PURE__*/function (_React$Component) {
|
|
|
83
83
|
onCloseRequest: this.props.toggleImagePreviewer,
|
|
84
84
|
onMovePrevRequest: this.moveToPrevImage,
|
|
85
85
|
onMoveNextRequest: this.moveToNextImage,
|
|
86
|
-
imagePadding: 70,
|
|
87
|
-
reactModalStyle: {
|
|
88
|
-
overlay: {
|
|
89
|
-
zIndex: 1071
|
|
90
|
-
}
|
|
91
|
-
},
|
|
92
86
|
reactModalProps: {
|
|
93
87
|
shouldReturnFocusAfterClose: false
|
|
94
88
|
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
.sdoc-image-hover-menu-container {
|
|
2
|
+
position: absolute;
|
|
3
|
+
height: 42px;
|
|
4
|
+
z-index: 101;
|
|
5
|
+
width: auto;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.sdoc-image-hover-menu-container .hover-menu-container {
|
|
9
|
+
height: 36px;
|
|
10
|
+
padding: 7px 8px;
|
|
11
|
+
background-color: #fff;
|
|
12
|
+
display: flex;
|
|
13
|
+
justify-content: flex-start;
|
|
14
|
+
align-items: center;
|
|
15
|
+
border-radius: 3px;
|
|
16
|
+
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08);
|
|
17
|
+
border: 1px solid #e8e8e8;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.sdoc-image-hover-menu-container .hover-menu-container > span:not(:last-of-type) {
|
|
21
|
+
padding: 0 8px;
|
|
22
|
+
border-right: 1px solid #e5e5e5;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.sdoc-image-hover-menu-container .hover-menu-container .op-item {
|
|
26
|
+
position: relative;
|
|
27
|
+
font-size: 12px;
|
|
28
|
+
color: #212529;
|
|
29
|
+
padding: 0 5px;
|
|
30
|
+
border-radius: 2px;
|
|
31
|
+
min-width: 24px;
|
|
32
|
+
height: 24px;
|
|
33
|
+
display: inline-flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
justify-content: center;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.sdoc-image-hover-menu-container .hover-menu-container .op-item:hover {
|
|
39
|
+
color: #212529;
|
|
40
|
+
text-decoration: none;
|
|
41
|
+
background: #f1f1f1;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.sdoc-image-hover-menu-container .op-group-item:last-child .op-item {
|
|
45
|
+
margin-left: 8px;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.sdoc-image-hover-menu-container .hover-menu-container .active {
|
|
49
|
+
background: #f1f1f1;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.sdoc-image-hover-menu-container .hover-menu-container .op-tooltip:hover::after {
|
|
53
|
+
position: absolute;
|
|
54
|
+
color: #212529;
|
|
55
|
+
content: attr(op-item-tooltip);
|
|
56
|
+
top: -40px;
|
|
57
|
+
left: -20px;
|
|
58
|
+
width: 70px;
|
|
59
|
+
height: 30px;
|
|
60
|
+
display: flex;
|
|
61
|
+
justify-content: center;
|
|
62
|
+
align-items: center;
|
|
63
|
+
background-color: #fff;
|
|
64
|
+
border-radius: 3px;
|
|
65
|
+
border: 1px solid #e8e8e8;
|
|
66
|
+
font-size: 12px;
|
|
67
|
+
box-shadow: 0 0 5px #ccc;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.sdoc-image-hover-menu-container .hover-menu-container .icon-font {
|
|
71
|
+
font-size: 12px;
|
|
72
|
+
color: #999999;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.sdoc-image-hover-menu-container .sdoc-image-popover {
|
|
76
|
+
position: absolute;
|
|
77
|
+
top: 37px;
|
|
78
|
+
background-color: #fff;
|
|
79
|
+
border: 1px solid #e5e6e8;
|
|
80
|
+
border-radius: 2px;
|
|
81
|
+
box-shadow: 0 0 10px #ccc;
|
|
82
|
+
display: flex;
|
|
83
|
+
flex-direction: column;
|
|
84
|
+
align-items: flex-start;
|
|
85
|
+
z-index: 101;
|
|
86
|
+
white-space: nowrap;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.sdoc-image-hover-menu-container .align-popover {
|
|
90
|
+
left: 80px;
|
|
91
|
+
min-width: 6rem;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.sdoc-image-hover-menu-container .border-popover {
|
|
95
|
+
left: 115px;
|
|
96
|
+
flex-direction: row;
|
|
97
|
+
height: 80px;
|
|
98
|
+
align-items: center;
|
|
99
|
+
padding: 0 8px;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.sdoc-image-hover-menu-container .border-popover .sdoc-dropdown-menu-item .sdoc-dropdown-item-content .sdoc-check-mark {
|
|
103
|
+
transform: translateX(-24px);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.sdoc-image-hover-menu-container .border-popover .sdoc-dropdown-menu-item:hover {
|
|
107
|
+
background-color: transparent;
|
|
108
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
3
|
+
import React, { useCallback, useState } from 'react';
|
|
4
|
+
import { Transforms } from '@seafile/slate';
|
|
5
|
+
import { ReactEditor } from '@seafile/slate-react';
|
|
6
|
+
import { withTranslation } from 'react-i18next';
|
|
7
|
+
import classnames from 'classnames';
|
|
8
|
+
import { ElementPopover } from '../../../commons';
|
|
9
|
+
import ImagePreviewer from '../dialogs/image-previewer';
|
|
10
|
+
import { getImageURL } from '../helpers';
|
|
11
|
+
import { IMAGE_DISPLAY_TYPE, IMAGE_BORDER_TYPE } from '../constants';
|
|
12
|
+
import { MENUS_CONFIG_MAP, TEXT_ALIGN } from '../../../constants';
|
|
13
|
+
import './index.css';
|
|
14
|
+
var ImageHoverMenu = function ImageHoverMenu(_ref) {
|
|
15
|
+
var editor = _ref.editor,
|
|
16
|
+
menuPosition = _ref.menuPosition,
|
|
17
|
+
element = _ref.element,
|
|
18
|
+
onHideImageHoverMenu = _ref.onHideImageHoverMenu,
|
|
19
|
+
t = _ref.t;
|
|
20
|
+
var data = element.data,
|
|
21
|
+
display_type = element.display_type,
|
|
22
|
+
align = element.align,
|
|
23
|
+
border_type = element.border_type;
|
|
24
|
+
var _useState = useState({
|
|
25
|
+
displayPopover: false,
|
|
26
|
+
alignPopover: false,
|
|
27
|
+
borderPopover: false
|
|
28
|
+
}),
|
|
29
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
30
|
+
popoverState = _useState2[0],
|
|
31
|
+
setPopoverState = _useState2[1];
|
|
32
|
+
var _useState3 = useState(false),
|
|
33
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
34
|
+
isShowImagePreview = _useState4[0],
|
|
35
|
+
setIsShowImagePreview = _useState4[1];
|
|
36
|
+
var onShowProver = useCallback(function (event, showProverKey) {
|
|
37
|
+
event.stopPropagation();
|
|
38
|
+
var newPopoverState = popoverState;
|
|
39
|
+
for (var key in newPopoverState) {
|
|
40
|
+
if (key === showProverKey) {
|
|
41
|
+
newPopoverState[key] = !newPopoverState[key];
|
|
42
|
+
} else {
|
|
43
|
+
newPopoverState[key] = false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
setPopoverState(_objectSpread({}, newPopoverState));
|
|
47
|
+
}, [popoverState]);
|
|
48
|
+
var onSelect = useCallback(function (event, props) {
|
|
49
|
+
event.stopPropagation();
|
|
50
|
+
var path = ReactEditor.findPath(editor, element);
|
|
51
|
+
if (path) {
|
|
52
|
+
Transforms.setNodes(editor, props, {
|
|
53
|
+
at: path
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
onHideImageHoverMenu();
|
|
57
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
58
|
+
}, []);
|
|
59
|
+
return /*#__PURE__*/React.createElement(ElementPopover, null, /*#__PURE__*/React.createElement("div", {
|
|
60
|
+
className: "sdoc-image-hover-menu-container",
|
|
61
|
+
style: menuPosition
|
|
62
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
63
|
+
className: "hover-menu-container"
|
|
64
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
65
|
+
className: "op-group-item"
|
|
66
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
67
|
+
role: "button",
|
|
68
|
+
className: classnames('op-item', {
|
|
69
|
+
'active': popoverState.displayPopover
|
|
70
|
+
}),
|
|
71
|
+
onClick: function onClick(e) {
|
|
72
|
+
onShowProver(e, 'displayPopover');
|
|
73
|
+
}
|
|
74
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
75
|
+
className: "mr-1"
|
|
76
|
+
}, t(display_type || IMAGE_DISPLAY_TYPE[0])), /*#__PURE__*/React.createElement("i", {
|
|
77
|
+
className: "sdocfont sdoc-drop-down icon-font"
|
|
78
|
+
}))), /*#__PURE__*/React.createElement("span", {
|
|
79
|
+
className: "op-group-item"
|
|
80
|
+
}, display_type === IMAGE_DISPLAY_TYPE[1] && /*#__PURE__*/React.createElement("span", {
|
|
81
|
+
role: "button",
|
|
82
|
+
className: classnames('op-item', {
|
|
83
|
+
'active': popoverState.alignPopover
|
|
84
|
+
}),
|
|
85
|
+
onClick: function onClick(e) {
|
|
86
|
+
onShowProver(e, 'alignPopover');
|
|
87
|
+
}
|
|
88
|
+
}, /*#__PURE__*/React.createElement("i", {
|
|
89
|
+
className: classnames("sdocfont sdoc-align-".concat(align || 'left', " icon-font mr-1"))
|
|
90
|
+
}), /*#__PURE__*/React.createElement("i", {
|
|
91
|
+
className: "sdocfont sdoc-drop-down icon-font"
|
|
92
|
+
})), /*#__PURE__*/React.createElement("span", {
|
|
93
|
+
role: "button",
|
|
94
|
+
className: classnames('op-item', 'ml-1', {
|
|
95
|
+
'active': popoverState.borderPopover
|
|
96
|
+
}),
|
|
97
|
+
onClick: function onClick(e) {
|
|
98
|
+
onShowProver(e, 'borderPopover');
|
|
99
|
+
}
|
|
100
|
+
}, /*#__PURE__*/React.createElement("i", {
|
|
101
|
+
className: "sdocfont sdoc-image icon-font mr-1"
|
|
102
|
+
}), /*#__PURE__*/React.createElement("i", {
|
|
103
|
+
className: "sdocfont sdoc-drop-down icon-font"
|
|
104
|
+
}))), /*#__PURE__*/React.createElement("span", {
|
|
105
|
+
className: "op-group-item"
|
|
106
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
107
|
+
role: "button",
|
|
108
|
+
className: "op-item",
|
|
109
|
+
onClick: function onClick(e) {
|
|
110
|
+
e.stopPropagation();
|
|
111
|
+
setIsShowImagePreview(!isShowImagePreview);
|
|
112
|
+
}
|
|
113
|
+
}, /*#__PURE__*/React.createElement("i", {
|
|
114
|
+
className: "sdocfont sdoc-fullscreen icon-font"
|
|
115
|
+
})))), popoverState.displayPopover && /*#__PURE__*/React.createElement("div", {
|
|
116
|
+
className: "sdoc-image-popover sdoc-dropdown-menu"
|
|
117
|
+
}, IMAGE_DISPLAY_TYPE.map(function (item) {
|
|
118
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
119
|
+
key: item,
|
|
120
|
+
className: "sdoc-dropdown-menu-item sdoc-dropdown-item-with-left-icon pr-2",
|
|
121
|
+
onClick: function onClick(event) {
|
|
122
|
+
return onSelect(event, {
|
|
123
|
+
display_type: item
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
127
|
+
className: "sdoc-dropdown-item-content"
|
|
128
|
+
}, /*#__PURE__*/React.createElement("i", {
|
|
129
|
+
className: "sdoc-dropdown-item-content-icon"
|
|
130
|
+
}), /*#__PURE__*/React.createElement("span", null, t(item))), display_type === item && /*#__PURE__*/React.createElement("i", {
|
|
131
|
+
className: "sdocfont sdoc-check-mark sdoc-dropdown-item-right-icon"
|
|
132
|
+
}));
|
|
133
|
+
})), popoverState.alignPopover && /*#__PURE__*/React.createElement("div", {
|
|
134
|
+
className: "sdoc-image-popover align-popover sdoc-dropdown-menu"
|
|
135
|
+
}, MENUS_CONFIG_MAP[TEXT_ALIGN].map(function (item) {
|
|
136
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
137
|
+
key: item.id,
|
|
138
|
+
className: "sdoc-dropdown-menu-item sdoc-dropdown-item-with-left-icon pr-2",
|
|
139
|
+
onClick: function onClick(event) {
|
|
140
|
+
return onSelect(event, {
|
|
141
|
+
align: item.type
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
145
|
+
className: "sdoc-dropdown-item-content"
|
|
146
|
+
}, /*#__PURE__*/React.createElement("i", {
|
|
147
|
+
className: classnames(item.iconClass, 'icon-font')
|
|
148
|
+
})), align === item.type && /*#__PURE__*/React.createElement("i", {
|
|
149
|
+
className: "sdocfont sdoc-check-mark sdoc-dropdown-item-right-icon"
|
|
150
|
+
}));
|
|
151
|
+
})), popoverState.borderPopover && /*#__PURE__*/React.createElement("div", {
|
|
152
|
+
className: "sdoc-image-popover border-popover sdoc-dropdown-menu"
|
|
153
|
+
}, IMAGE_BORDER_TYPE.map(function (item) {
|
|
154
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
155
|
+
key: item.type,
|
|
156
|
+
className: "sdoc-dropdown-menu-item sdoc-dropdown-item-with-left-icon pr-2",
|
|
157
|
+
onClick: function onClick(event) {
|
|
158
|
+
return onSelect(event, {
|
|
159
|
+
border_type: item.type
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
163
|
+
className: "sdoc-dropdown-item-content"
|
|
164
|
+
}, /*#__PURE__*/React.createElement("img", {
|
|
165
|
+
src: item.imgUrl,
|
|
166
|
+
draggable: false,
|
|
167
|
+
alt: ""
|
|
168
|
+
}), border_type === item.type && /*#__PURE__*/React.createElement("i", {
|
|
169
|
+
className: "sdocfont sdoc-check-mark sdoc-dropdown-item-right-icon"
|
|
170
|
+
})));
|
|
171
|
+
})), isShowImagePreview && /*#__PURE__*/React.createElement(ImagePreviewer, {
|
|
172
|
+
imageUrl: getImageURL(data.src),
|
|
173
|
+
editor: editor,
|
|
174
|
+
toggleImagePreviewer: function toggleImagePreviewer() {
|
|
175
|
+
setIsShowImagePreview(!isShowImagePreview);
|
|
176
|
+
}
|
|
177
|
+
})));
|
|
178
|
+
};
|
|
179
|
+
export default withTranslation('sdoc-editor')(ImageHoverMenu);
|
|
@@ -1,175 +1,227 @@
|
|
|
1
1
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import _createSuper from "@babel/runtime/helpers/esm/createSuper";
|
|
6
|
-
import { useSelected } from '@seafile/slate-react';
|
|
7
|
-
import React from 'react';
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
3
|
+
import React, { useState, useCallback, useRef, useEffect } from 'react';
|
|
4
|
+
import { useSelected, useReadOnly } from '@seafile/slate-react';
|
|
8
5
|
import classNames from 'classnames';
|
|
9
6
|
import { withTranslation } from 'react-i18next';
|
|
10
7
|
import { getImageURL, updateImage } from './helpers';
|
|
11
|
-
import ImagePreviewer from './dialogs/image-previewer';
|
|
12
8
|
import EventBus from '../../../utils/event-bus';
|
|
13
9
|
import { INTERNAL_EVENT } from '../../../constants';
|
|
10
|
+
import ImageHoverMenu from './hover-menu';
|
|
11
|
+
import { useScrollContext } from '../../../hooks/use-scroll-context';
|
|
12
|
+
import { IMAGE_BORDER_TYPE } from './constants';
|
|
14
13
|
import { ADDED_STYLE, DELETED_STYLE } from '../../constants';
|
|
15
14
|
import imagePlaceholder from '../../../assets/images/image-placeholder.png';
|
|
16
|
-
var Image =
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
15
|
+
var Image = function Image(_ref) {
|
|
16
|
+
var element = _ref.element,
|
|
17
|
+
editor = _ref.editor,
|
|
18
|
+
className = _ref.className,
|
|
19
|
+
attributes = _ref.attributes,
|
|
20
|
+
children = _ref.children,
|
|
21
|
+
isSelected = _ref.isSelected,
|
|
22
|
+
t = _ref.t;
|
|
23
|
+
var data = element.data,
|
|
24
|
+
display_type = element.display_type,
|
|
25
|
+
align = element.align,
|
|
26
|
+
_element$border_type = element.border_type,
|
|
27
|
+
border_type = _element$border_type === void 0 ? IMAGE_BORDER_TYPE[0].type : _element$border_type;
|
|
28
|
+
var imageWrapStyle = {
|
|
29
|
+
display: display_type === 'Block' ? 'block' : 'inline-block',
|
|
30
|
+
textAlign: display_type === 'Block' ? align : ''
|
|
31
|
+
};
|
|
32
|
+
var imageInnerStyle = {
|
|
33
|
+
border: IMAGE_BORDER_TYPE.find(function (item) {
|
|
34
|
+
return item.type === border_type;
|
|
35
|
+
}).value
|
|
36
|
+
};
|
|
37
|
+
var readOnly = useReadOnly();
|
|
38
|
+
var imageRef = useRef(null);
|
|
39
|
+
var resizerRef = useRef(null);
|
|
40
|
+
var scrollRef = useScrollContext();
|
|
41
|
+
var _useState = useState(null),
|
|
42
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
43
|
+
width = _useState2[0],
|
|
44
|
+
setWidth = _useState2[1];
|
|
45
|
+
var _useState3 = useState(false),
|
|
46
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
47
|
+
isResizing = _useState4[0],
|
|
48
|
+
setIsResizing = _useState4[1];
|
|
49
|
+
var _useState5 = useState(false),
|
|
50
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
51
|
+
isShowImagePlaceholder = _useState6[0],
|
|
52
|
+
setIsShowImagePlaceholder = _useState6[1];
|
|
53
|
+
var _useState7 = useState(false),
|
|
54
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
55
|
+
isShowImageHoverMenu = _useState8[0],
|
|
56
|
+
setIsShowImageHoverMenu = _useState8[1];
|
|
57
|
+
var _useState9 = useState({}),
|
|
58
|
+
_useState10 = _slicedToArray(_useState9, 2),
|
|
59
|
+
menuPosition = _useState10[0],
|
|
60
|
+
setMenuPosition = _useState10[1];
|
|
61
|
+
var registerEvent = useCallback(function (eventList) {
|
|
62
|
+
eventList.forEach(function (element) {
|
|
63
|
+
document.addEventListener(element.eventName, element.event);
|
|
64
|
+
});
|
|
65
|
+
}, []);
|
|
66
|
+
var unregisterEvent = useCallback(function (eventList) {
|
|
67
|
+
eventList.forEach(function (element) {
|
|
68
|
+
document.removeEventListener(element.eventName, element.event);
|
|
69
|
+
});
|
|
70
|
+
}, []);
|
|
71
|
+
var onMouseMove = useCallback(function (event) {
|
|
72
|
+
var _resizerRef$current;
|
|
73
|
+
event.preventDefault();
|
|
74
|
+
event.stopPropagation();
|
|
75
|
+
var changeX = event.clientX - ((_resizerRef$current = resizerRef.current) === null || _resizerRef$current === void 0 ? void 0 : _resizerRef$current.getBoundingClientRect().left) - 5;
|
|
76
|
+
var imageWidth = imageRef.current.width + changeX;
|
|
77
|
+
if (imageWidth < 20) return;
|
|
78
|
+
setWidth(imageWidth);
|
|
79
|
+
}, []);
|
|
80
|
+
var onResizeEnd = useCallback(function (event) {
|
|
81
|
+
event.preventDefault();
|
|
82
|
+
event.stopPropagation();
|
|
83
|
+
unregisterEvent([{
|
|
84
|
+
'eventName': 'mousemove',
|
|
85
|
+
'event': onMouseMove
|
|
86
|
+
}, {
|
|
87
|
+
'eventName': 'mouseup',
|
|
88
|
+
'event': onResizeEnd
|
|
89
|
+
}]);
|
|
90
|
+
var newData = _objectSpread(_objectSpread({}, element.data), {}, {
|
|
91
|
+
width: width
|
|
92
|
+
});
|
|
93
|
+
updateImage(editor, newData);
|
|
94
|
+
setIsResizing(false);
|
|
95
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
96
|
+
}, [editor, element.data, width]);
|
|
97
|
+
var onResizeStart = useCallback(function (event) {
|
|
98
|
+
event.preventDefault();
|
|
99
|
+
event.stopPropagation();
|
|
100
|
+
setIsResizing(true);
|
|
101
|
+
registerEvent([{
|
|
102
|
+
'eventName': 'mousemove',
|
|
103
|
+
'event': onMouseMove
|
|
104
|
+
}, {
|
|
105
|
+
'eventName': 'mouseup',
|
|
106
|
+
'event': onResizeEnd
|
|
107
|
+
}]);
|
|
108
|
+
}, [onMouseMove, onResizeEnd, registerEvent]);
|
|
109
|
+
var getImageStyle = useCallback(function () {
|
|
110
|
+
var imageWidth = element.data.width || '';
|
|
111
|
+
if (width) imageWidth = width;
|
|
112
|
+
return {
|
|
113
|
+
width: imageWidth
|
|
26
114
|
};
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
width: width
|
|
60
|
-
});
|
|
61
|
-
updateImage(editor, newData);
|
|
62
|
-
_this.setState({
|
|
63
|
-
isResizing: false
|
|
64
|
-
});
|
|
65
|
-
};
|
|
66
|
-
_this.getImageStyle = function () {
|
|
67
|
-
var element = _this.props.element;
|
|
68
|
-
var width = _this.state.width;
|
|
69
|
-
var imageWidth = element.data.width || '';
|
|
70
|
-
if (width) imageWidth = width;
|
|
71
|
-
return {
|
|
72
|
-
width: imageWidth
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
_this.setFullScreen = function () {
|
|
76
|
-
_this.setState({
|
|
77
|
-
isShowImagePreview: !_this.state.isShowImagePreview
|
|
78
|
-
});
|
|
79
|
-
};
|
|
80
|
-
_this.setImageRef = function (ref) {
|
|
81
|
-
_this.image = ref;
|
|
82
|
-
};
|
|
83
|
-
_this.setResizerRef = function (ref) {
|
|
84
|
-
_this.resizer = ref;
|
|
85
|
-
};
|
|
86
|
-
_this.reloadImage = function () {
|
|
87
|
-
if (_this.image) {
|
|
88
|
-
var data = _this.props.element.data;
|
|
89
|
-
_this.image.src = getImageURL(data.src);
|
|
115
|
+
}, [element.data, width]);
|
|
116
|
+
var onScroll = useCallback(function () {
|
|
117
|
+
setPosition(imageRef.current);
|
|
118
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
119
|
+
}, []);
|
|
120
|
+
var onHideImageHoverMenu = useCallback(function (e) {
|
|
121
|
+
if (e.target === imageRef.current) return;
|
|
122
|
+
setIsShowImageHoverMenu(false);
|
|
123
|
+
}, []);
|
|
124
|
+
useEffect(function () {
|
|
125
|
+
var observerRefValue = null;
|
|
126
|
+
if (isShowImageHoverMenu) {
|
|
127
|
+
registerEvent([{
|
|
128
|
+
'eventName': 'click',
|
|
129
|
+
'event': onHideImageHoverMenu
|
|
130
|
+
}]);
|
|
131
|
+
scrollRef.current && scrollRef.current.addEventListener('scroll', onScroll);
|
|
132
|
+
observerRefValue = scrollRef.current;
|
|
133
|
+
} else {
|
|
134
|
+
unregisterEvent([{
|
|
135
|
+
'eventName': 'click',
|
|
136
|
+
'event': onHideImageHoverMenu
|
|
137
|
+
}]);
|
|
138
|
+
scrollRef.current && scrollRef.current.removeEventListener('scroll', onScroll);
|
|
139
|
+
}
|
|
140
|
+
return function () {
|
|
141
|
+
unregisterEvent([{
|
|
142
|
+
'eventName': 'click',
|
|
143
|
+
'event': onHideImageHoverMenu
|
|
144
|
+
}]);
|
|
145
|
+
if (observerRefValue) {
|
|
146
|
+
observerRefValue.removeEventListener('scroll', onScroll);
|
|
90
147
|
}
|
|
91
148
|
};
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
149
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
150
|
+
}, [isShowImageHoverMenu, onHideImageHoverMenu]);
|
|
151
|
+
var setPosition = useCallback(function (elem) {
|
|
152
|
+
if (elem) {
|
|
153
|
+
var _elem$getBoundingClie = elem.getBoundingClientRect(),
|
|
154
|
+
top = _elem$getBoundingClie.top,
|
|
155
|
+
left = _elem$getBoundingClie.left;
|
|
156
|
+
var menuTop = top - 42;
|
|
157
|
+
var menuLeft = left - 18;
|
|
158
|
+
setMenuPosition({
|
|
159
|
+
top: menuTop,
|
|
160
|
+
left: menuLeft
|
|
95
161
|
});
|
|
96
|
-
var element = _this.props.element;
|
|
97
|
-
var data = element.data;
|
|
98
|
-
// External network images do not reload after failure to load
|
|
99
|
-
if (!data.src.startsWith('http')) {
|
|
100
|
-
var eventBus = EventBus.getInstance();
|
|
101
|
-
eventBus.subscribe(INTERNAL_EVENT.RELOAD_IMAGE, _this.reloadImage);
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
_this.state = {
|
|
105
|
-
width: null,
|
|
106
|
-
isResizing: false,
|
|
107
|
-
isShowImagePreview: false,
|
|
108
|
-
isShowImagePlaceholder: false
|
|
109
|
-
};
|
|
110
|
-
return _this;
|
|
111
|
-
}
|
|
112
|
-
_createClass(Image, [{
|
|
113
|
-
key: "render",
|
|
114
|
-
value: function render() {
|
|
115
|
-
var _this$props2 = this.props,
|
|
116
|
-
className = _this$props2.className,
|
|
117
|
-
attributes = _this$props2.attributes,
|
|
118
|
-
element = _this$props2.element,
|
|
119
|
-
children = _this$props2.children,
|
|
120
|
-
isSelected = _this$props2.isSelected,
|
|
121
|
-
t = _this$props2.t;
|
|
122
|
-
var _this$state = this.state,
|
|
123
|
-
isResizing = _this$state.isResizing,
|
|
124
|
-
isShowImagePreview = _this$state.isShowImagePreview,
|
|
125
|
-
isShowImagePlaceholder = _this$state.isShowImagePlaceholder;
|
|
126
|
-
var data = element.data;
|
|
127
|
-
var imageClassName = isSelected ? 'image-selected' : '';
|
|
128
|
-
var imageStyle = this.getImageStyle();
|
|
129
|
-
if (isShowImagePlaceholder) {
|
|
130
|
-
return /*#__PURE__*/React.createElement("span", Object.assign({
|
|
131
|
-
className: classNames('sdoc-image-wrapper', className)
|
|
132
|
-
}, attributes), /*#__PURE__*/React.createElement("img", {
|
|
133
|
-
ref: this.setImageRef,
|
|
134
|
-
src: imagePlaceholder,
|
|
135
|
-
style: imageStyle,
|
|
136
|
-
draggable: false,
|
|
137
|
-
alt: ""
|
|
138
|
-
}), children);
|
|
139
|
-
}
|
|
140
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", Object.assign({
|
|
141
|
-
className: classNames('sdoc-image-wrapper', className)
|
|
142
|
-
}, attributes), /*#__PURE__*/React.createElement("img", {
|
|
143
|
-
onError: this.onImageLoadError,
|
|
144
|
-
className: imageClassName,
|
|
145
|
-
ref: this.setImageRef,
|
|
146
|
-
src: getImageURL(data.src),
|
|
147
|
-
style: imageStyle,
|
|
148
|
-
draggable: false,
|
|
149
|
-
alt: ""
|
|
150
|
-
}), isSelected && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
|
|
151
|
-
className: "image-resizer",
|
|
152
|
-
ref: this.setResizerRef,
|
|
153
|
-
onMouseDown: this.onResizeStart
|
|
154
|
-
}), /*#__PURE__*/React.createElement("span", {
|
|
155
|
-
className: "image-full-screen",
|
|
156
|
-
contentEditable: false,
|
|
157
|
-
onClick: this.setFullScreen
|
|
158
|
-
}, /*#__PURE__*/React.createElement("i", {
|
|
159
|
-
className: 'sdocfont sdoc-fullscreen',
|
|
160
|
-
title: t('Full_screen')
|
|
161
|
-
}))), isResizing && /*#__PURE__*/React.createElement("span", {
|
|
162
|
-
className: "image-size",
|
|
163
|
-
contentEditable: false
|
|
164
|
-
}, /*#__PURE__*/React.createElement("span", null, t('Width'), ':', parseInt(this.state.width || this.image.clientWidth)), /*#__PURE__*/React.createElement("span", null, "\xA0\xA0"), /*#__PURE__*/React.createElement("span", null, t('Height'), ':', this.image.clientHeight)), children), isShowImagePreview && /*#__PURE__*/React.createElement(ImagePreviewer, {
|
|
165
|
-
imageUrl: getImageURL(data.src),
|
|
166
|
-
editor: this.props.editor,
|
|
167
|
-
toggleImagePreviewer: this.setFullScreen
|
|
168
|
-
}));
|
|
169
162
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
163
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
164
|
+
}, []);
|
|
165
|
+
var onClickImage = useCallback(function (e) {
|
|
166
|
+
setPosition(e.currentTarget);
|
|
167
|
+
setIsShowImageHoverMenu(true);
|
|
168
|
+
}, [setPosition]);
|
|
169
|
+
var reloadImage = useCallback(function () {
|
|
170
|
+
if (imageRef) {
|
|
171
|
+
imageRef.current = getImageURL(data.src);
|
|
172
|
+
}
|
|
173
|
+
}, [data.src]);
|
|
174
|
+
var onImageLoadError = useCallback(function () {
|
|
175
|
+
setIsShowImagePlaceholder(true);
|
|
176
|
+
// External network images do not reload after failure to load
|
|
177
|
+
if (!data.src.startsWith('http')) {
|
|
178
|
+
var eventBus = EventBus.getInstance();
|
|
179
|
+
eventBus.subscribe(INTERNAL_EVENT.RELOAD_IMAGE, reloadImage);
|
|
180
|
+
}
|
|
181
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
182
|
+
}, []);
|
|
183
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, isShowImagePlaceholder && /*#__PURE__*/React.createElement("span", Object.assign({
|
|
184
|
+
className: classNames('sdoc-image-wrapper', className)
|
|
185
|
+
}, attributes), /*#__PURE__*/React.createElement("img", {
|
|
186
|
+
ref: imageRef,
|
|
187
|
+
src: imagePlaceholder,
|
|
188
|
+
style: getImageStyle(),
|
|
189
|
+
draggable: false,
|
|
190
|
+
alt: ""
|
|
191
|
+
}), children), !isShowImagePlaceholder && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", Object.assign({
|
|
192
|
+
className: classNames('sdoc-image-wrapper', className)
|
|
193
|
+
}, attributes, {
|
|
194
|
+
style: imageWrapStyle
|
|
195
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
196
|
+
className: "sdoc-image-inner",
|
|
197
|
+
onClick: onClickImage,
|
|
198
|
+
style: imageInnerStyle
|
|
199
|
+
}, /*#__PURE__*/React.createElement("img", {
|
|
200
|
+
className: classNames({
|
|
201
|
+
'image-selected': isSelected
|
|
202
|
+
}),
|
|
203
|
+
ref: imageRef,
|
|
204
|
+
src: getImageURL(data.src),
|
|
205
|
+
style: getImageStyle(),
|
|
206
|
+
draggable: false,
|
|
207
|
+
onError: onImageLoadError,
|
|
208
|
+
alt: ""
|
|
209
|
+
}), isSelected && /*#__PURE__*/React.createElement("span", {
|
|
210
|
+
className: "image-resizer",
|
|
211
|
+
ref: resizerRef,
|
|
212
|
+
onMouseDown: onResizeStart
|
|
213
|
+
}), isResizing && /*#__PURE__*/React.createElement("span", {
|
|
214
|
+
className: "image-size",
|
|
215
|
+
contentEditable: false
|
|
216
|
+
}, /*#__PURE__*/React.createElement("span", null, t('Width'), ':', parseInt(width || imageRef.current.clientWidth)), /*#__PURE__*/React.createElement("span", null, "\xA0\xA0"), /*#__PURE__*/React.createElement("span", null, t('Height'), ':', imageRef.current.clientHeight))), children), isShowImageHoverMenu && !readOnly && /*#__PURE__*/React.createElement(ImageHoverMenu, {
|
|
217
|
+
editor: editor,
|
|
218
|
+
menuPosition: menuPosition,
|
|
219
|
+
element: element,
|
|
220
|
+
onHideImageHoverMenu: function onHideImageHoverMenu() {
|
|
221
|
+
setIsShowImageHoverMenu(false);
|
|
222
|
+
}
|
|
223
|
+
})));
|
|
224
|
+
};
|
|
173
225
|
var SdocImage = withTranslation('sdoc-editor')(Image);
|
|
174
226
|
function renderImage(props, editor) {
|
|
175
227
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
@@ -33,7 +33,7 @@ export var movedListItemUp = function movedListItemUp(editor, _ref) {
|
|
|
33
33
|
} catch (err) {
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
|
-
var condA = hasListChild(
|
|
36
|
+
var condA = hasListChild(liNode);
|
|
37
37
|
var condB = !isLastChild(list, liPath);
|
|
38
38
|
if (condA || condB) {
|
|
39
39
|
// 创建一个新的兄弟节点
|
|
@@ -140,10 +140,10 @@ var withTable = function withTable(editor) {
|
|
|
140
140
|
var _column = columns[_j];
|
|
141
141
|
selectedColumns.push(_column);
|
|
142
142
|
}
|
|
143
|
-
return Object.freeze(_objectSpread(_objectSpread({}, selectedNode), {}, {
|
|
143
|
+
return [Object.freeze(_objectSpread(_objectSpread({}, selectedNode), {}, {
|
|
144
144
|
children: selectedRows,
|
|
145
145
|
columns: selectedColumns
|
|
146
|
-
}));
|
|
146
|
+
}))];
|
|
147
147
|
};
|
|
148
148
|
|
|
149
149
|
// copy: mod + c
|
|
@@ -191,8 +191,13 @@ var withTable = function withTable(editor) {
|
|
|
191
191
|
if (fragment) {
|
|
192
192
|
var decoded = decodeURIComponent(window.atob(fragment));
|
|
193
193
|
var parsedData = JSON.parse(decoded);
|
|
194
|
-
if (
|
|
195
|
-
|
|
194
|
+
if (Array.isArray(parsedData) && parsedData.some(function (item) {
|
|
195
|
+
return item.type === ELEMENT_TYPE.TABLE;
|
|
196
|
+
})) {
|
|
197
|
+
var tableElement = parsedData.find(function (item) {
|
|
198
|
+
return item.type === ELEMENT_TYPE.TABLE;
|
|
199
|
+
});
|
|
200
|
+
insertMultipleRowsAndColumns(newEditor, tableElement.children, tableElement.columns);
|
|
196
201
|
return;
|
|
197
202
|
}
|
|
198
203
|
}
|
|
@@ -4,7 +4,8 @@ import { ReactEditor } from '@seafile/slate-react';
|
|
|
4
4
|
import copy from 'copy-to-clipboard';
|
|
5
5
|
import { toggleList } from '../../plugins/list/transforms';
|
|
6
6
|
import { generateEmptyElement } from '../../core';
|
|
7
|
-
import { ORDERED_LIST, UNORDERED_LIST, PARAGRAPH, CHECK_LIST_ITEM, IMAGE, TABLE, CODE_BLOCK, BLOCKQUOTE, LIST_ITEM_CORRELATION_TYPE, ADD_POSITION_OFFSET_TYPE, INSERT_POSITION } from '../../constants';
|
|
7
|
+
import { ORDERED_LIST, UNORDERED_LIST, PARAGRAPH, CHECK_LIST_ITEM, IMAGE, TABLE, CODE_BLOCK, BLOCKQUOTE, LIST_ITEM_CORRELATION_TYPE, ADD_POSITION_OFFSET_TYPE, INSERT_POSITION, ELEMENT_TYPE } from '../../constants';
|
|
8
|
+
import { EMPTY_SELECTED_RANGE } from '../../plugins/table/constants';
|
|
8
9
|
export var onSetNodeType = function onSetNodeType(editor, element, type) {
|
|
9
10
|
if (!type) return;
|
|
10
11
|
if ([ORDERED_LIST, UNORDERED_LIST].includes(type)) {
|
|
@@ -40,7 +41,17 @@ export var setSelection = function setSelection(editor, element) {
|
|
|
40
41
|
Transforms.select(editor, path);
|
|
41
42
|
}
|
|
42
43
|
};
|
|
43
|
-
export var onCopyNode = function onCopyNode(editor) {
|
|
44
|
+
export var onCopyNode = function onCopyNode(editor, element) {
|
|
45
|
+
if (element.type === ELEMENT_TYPE.TABLE) {
|
|
46
|
+
var tableSize = [element.children.length, element.children[0].children.length];
|
|
47
|
+
var tableSelectedRange = {
|
|
48
|
+
minRowIndex: 0,
|
|
49
|
+
maxRowIndex: tableSize[0] - 1,
|
|
50
|
+
minColIndex: 0,
|
|
51
|
+
maxColIndex: tableSize[1] - 1
|
|
52
|
+
};
|
|
53
|
+
editor.tableSelectedRange = tableSelectedRange;
|
|
54
|
+
}
|
|
44
55
|
var newData = editor.setFragmentData(new DataTransfer());
|
|
45
56
|
copy('copy', {
|
|
46
57
|
onCopy: function onCopy(clipboardData) {
|
|
@@ -50,6 +61,9 @@ export var onCopyNode = function onCopyNode(editor) {
|
|
|
50
61
|
});
|
|
51
62
|
}
|
|
52
63
|
});
|
|
64
|
+
if (element.type === ELEMENT_TYPE.TABLE) {
|
|
65
|
+
editor.tableSelectedRange = EMPTY_SELECTED_RANGE;
|
|
66
|
+
}
|
|
53
67
|
};
|
|
54
68
|
export var onDeleteNode = function onDeleteNode(editor, element) {
|
|
55
69
|
var path = ReactEditor.findPath(editor, element);
|
|
@@ -29,11 +29,11 @@ var SideMenu = function SideMenu(_ref) {
|
|
|
29
29
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
30
30
|
}, []);
|
|
31
31
|
var onCopy = useCallback(function () {
|
|
32
|
-
onCopyNode(editor);
|
|
32
|
+
onCopyNode(editor, slateNode);
|
|
33
33
|
onReset();
|
|
34
|
-
}, [editor, onReset]);
|
|
34
|
+
}, [editor, onReset, slateNode]);
|
|
35
35
|
var onCut = useCallback(function () {
|
|
36
|
-
onCopyNode(editor);
|
|
36
|
+
onCopyNode(editor, slateNode);
|
|
37
37
|
onDeleteNode(editor, slateNode);
|
|
38
38
|
onReset();
|
|
39
39
|
}, [editor, onReset, slateNode]);
|
|
@@ -12,8 +12,7 @@ export default function ReadOnlyArticle(_ref) {
|
|
|
12
12
|
editor: editor,
|
|
13
13
|
value: slateValue
|
|
14
14
|
}, /*#__PURE__*/React.createElement(ArticleContainer, {
|
|
15
|
-
editor: editor
|
|
16
|
-
readOnly: true
|
|
15
|
+
editor: editor
|
|
17
16
|
}, /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(SetNodeToDecorations, null), /*#__PURE__*/React.createElement(Editable, {
|
|
18
17
|
readOnly: true,
|
|
19
18
|
placeholder: "",
|
|
@@ -7,6 +7,7 @@ import CollaboratorsOperation from './collaborators-operation';
|
|
|
7
7
|
import MoreOperations from './more-operations';
|
|
8
8
|
import CommentsOperation from './comments-operation';
|
|
9
9
|
import ShareOperation from './share-operation';
|
|
10
|
+
import { isMobile } from '../../utils';
|
|
10
11
|
import './style.css';
|
|
11
12
|
var DocOperations = function DocOperations(_ref) {
|
|
12
13
|
var isShowChanges = _ref.isShowChanges,
|
|
@@ -14,6 +15,11 @@ var DocOperations = function DocOperations(_ref) {
|
|
|
14
15
|
handleViewChangesToggle = _ref.handleViewChangesToggle,
|
|
15
16
|
handleRevisionPublished = _ref.handleRevisionPublished;
|
|
16
17
|
var isSdocRevision = context.getSetting('isSdocRevision');
|
|
18
|
+
if (isMobile) {
|
|
19
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
20
|
+
className: "doc-ops"
|
|
21
|
+
}, !isSdocRevision && /*#__PURE__*/React.createElement(ShareOperation, null), !isSdocRevision && /*#__PURE__*/React.createElement(MoreOperations, null));
|
|
22
|
+
}
|
|
17
23
|
return /*#__PURE__*/React.createElement("div", {
|
|
18
24
|
className: "doc-ops"
|
|
19
25
|
}, /*#__PURE__*/React.createElement(RevisionOperations, {
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "This is a sdoc editor",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@seafile/react-image-lightbox": "2.0.
|
|
8
|
+
"@seafile/react-image-lightbox": "2.0.4",
|
|
9
9
|
"@seafile/slate": "0.91.8",
|
|
10
10
|
"@seafile/slate-history": "0.86.2",
|
|
11
11
|
"@seafile/slate-hyperscript": "0.81.7",
|
|
@@ -378,5 +378,7 @@
|
|
|
378
378
|
"Has_been_removed_tip": "Document has been removed, please view other documents.",
|
|
379
379
|
"Revision_created": "Revision {{id}} created",
|
|
380
380
|
"Checking": "Checking...",
|
|
381
|
-
"Publishing": "Publishing..."
|
|
381
|
+
"Publishing": "Publishing...",
|
|
382
|
+
"Inline": "Inline",
|
|
383
|
+
"Block": "Block"
|
|
382
384
|
}
|