@seafile/sdoc-editor 0.1.175 → 0.2.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/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/extension/plugins/image/constants/index.js +17 -0
- 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/package.json +1 -1
- 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
|
|
@@ -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
|
+
}];
|
|
@@ -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
|
package/package.json
CHANGED
|
@@ -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
|
}
|