@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.
@@ -34,6 +34,11 @@
34
34
  margin: 0 3px;
35
35
  }
36
36
 
37
+ .sdoc-editor-container .article .sdoc-image-inner {
38
+ position: relative;
39
+ display: inline-block;
40
+ }
41
+
37
42
  .sdoc-editor-container .article .image-selected {
38
43
  box-shadow: 0 0 0 2px #007bff;
39
44
  }
@@ -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 _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
3
- import _createClass from "@babel/runtime/helpers/esm/createClass";
4
- import _inherits from "@babel/runtime/helpers/esm/inherits";
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 = /*#__PURE__*/function (_React$Component) {
17
- _inherits(Image, _React$Component);
18
- var _super = _createSuper(Image);
19
- function Image(props) {
20
- var _this;
21
- _classCallCheck(this, Image);
22
- _this = _super.call(this, props);
23
- _this.registerEvent = function () {
24
- document.addEventListener('mousemove', _this.onMouseMove);
25
- document.addEventListener('mouseup', _this.onResizeEnd);
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
- _this.unregisterEvent = function () {
28
- document.removeEventListener('mousemove', _this.onMouseMove);
29
- document.removeEventListener('mouseup', _this.onResizeEnd);
30
- };
31
- _this.onResizeStart = function (event) {
32
- event.preventDefault();
33
- event.stopPropagation();
34
- _this.setState({
35
- isResizing: true
36
- }, function () {
37
- _this.registerEvent();
38
- });
39
- };
40
- _this.onMouseMove = function (event) {
41
- event.preventDefault();
42
- event.stopPropagation();
43
- var changeX = event.clientX - _this.resizer.getBoundingClientRect().left - 5;
44
- var imageWidth = _this.image.width + changeX;
45
- if (imageWidth < 20) return;
46
- _this.setState({
47
- width: imageWidth
48
- });
49
- };
50
- _this.onResizeEnd = function (event) {
51
- event.preventDefault();
52
- event.stopPropagation();
53
- _this.unregisterEvent();
54
- var width = _this.state.width;
55
- var _this$props = _this.props,
56
- editor = _this$props.editor,
57
- element = _this$props.element;
58
- var newData = _objectSpread(_objectSpread({}, element.data), {}, {
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
- _this.onImageLoadError = function () {
93
- _this.setState({
94
- isShowImagePlaceholder: true
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
- return Image;
172
- }(React.Component);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "0.1.175",
3
+ "version": "0.2.0",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",
@@ -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
  }
@@ -378,5 +378,7 @@
378
378
  "Has_been_removed_tip": "文档已经被删除,请查看其他文档",
379
379
  "Revision_created": "已创建修订稿 {{id}}",
380
380
  "Checking": "检查中...",
381
- "Publishing": "发布中..."
381
+ "Publishing": "发布中...",
382
+ "Inline": "嵌入行内",
383
+ "Block": "独占一行"
382
384
  }