@seafile/sdoc-editor 0.1.56 → 0.1.57-test0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/basic-sdk/editor.js +1 -1
- package/dist/basic-sdk/extension/constants/element-type.js +5 -1
- package/dist/basic-sdk/extension/constants/index.js +14 -2
- package/dist/basic-sdk/extension/core/queries/index.js +8 -0
- package/dist/basic-sdk/extension/plugins/blockquote/render-elem.js +6 -1
- package/dist/basic-sdk/extension/plugins/check-list/render-elem.js +8 -4
- package/dist/basic-sdk/extension/plugins/header/render-elem.js +6 -2
- package/dist/basic-sdk/extension/plugins/html/plugin.js +8 -6
- package/dist/basic-sdk/extension/plugins/index.js +3 -2
- package/dist/basic-sdk/extension/plugins/list/render-elem.js +16 -2
- package/dist/basic-sdk/extension/plugins/table/constants/index.js +5 -1
- package/dist/basic-sdk/extension/plugins/table/helpers.js +159 -22
- package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/index.js +3 -3
- package/dist/basic-sdk/extension/plugins/table/plugin.js +2 -2
- package/dist/basic-sdk/extension/plugins/table/render/hooks.js +17 -0
- package/dist/basic-sdk/extension/plugins/table/render/index.css +137 -0
- package/dist/basic-sdk/extension/plugins/table/render/index.js +161 -0
- package/dist/basic-sdk/extension/plugins/table/render/render-cell.js +48 -14
- package/dist/basic-sdk/extension/plugins/table/render/render-row.js +122 -7
- package/dist/basic-sdk/extension/plugins/table/render/resize-handler.js +109 -0
- package/dist/basic-sdk/extension/plugins/table/render/resize-handlers.js +27 -0
- package/dist/basic-sdk/extension/plugins/table/render/table-root.js +38 -0
- package/dist/basic-sdk/extension/plugins/table/render-elem.js +1 -1
- package/dist/basic-sdk/extension/plugins/text-align/helpers.js +43 -0
- package/dist/basic-sdk/extension/plugins/text-align/index.js +2 -0
- package/dist/basic-sdk/extension/plugins/text-align/menu/index.js +105 -0
- package/dist/basic-sdk/extension/plugins/text-align/menu/style.css +61 -0
- package/dist/basic-sdk/extension/render/render-element.js +9 -3
- package/dist/basic-sdk/extension/toolbar/index.js +3 -0
- package/dist/basic-sdk/utils/mouse-event.js +59 -0
- package/dist/basic-sdk/utils/object-utils.js +1 -0
- package/dist/components/doc-info/index.js +19 -4
- package/dist/config.js +16 -0
- package/dist/constants/index.js +1 -0
- package/dist/pages/simple-editor.js +3 -1
- package/package.json +1 -1
- package/public/locales/en/sdoc-editor.json +5 -1
- package/public/media/sdoc-editor-font.css +2 -2
- package/dist/basic-sdk/extension/plugins/table/render/context.js +0 -5
- package/dist/basic-sdk/extension/plugins/table/render/render-table/index.css +0 -72
- package/dist/basic-sdk/extension/plugins/table/render/render-table/index.js +0 -94
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import React, { useState, useRef } from 'react';
|
|
3
|
+
import classnames from 'classnames';
|
|
4
|
+
import { TABLE_MAX_WIDTH } from '../constants';
|
|
5
|
+
import { TableRootContext } from './hooks';
|
|
6
|
+
var TableRoot = function TableRoot(_ref) {
|
|
7
|
+
var attributes = _ref.attributes,
|
|
8
|
+
_ref$columns = _ref.columns,
|
|
9
|
+
columns = _ref$columns === void 0 ? [] : _ref$columns,
|
|
10
|
+
children = _ref.children;
|
|
11
|
+
var tableScrollWrapper = useRef(null);
|
|
12
|
+
var _useState = useState(0),
|
|
13
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
14
|
+
scrollLeft = _useState2[0],
|
|
15
|
+
setScrollLeft = _useState2[1];
|
|
16
|
+
var allWidth = columns.reduce(function (pre, cur) {
|
|
17
|
+
return pre + cur.width;
|
|
18
|
+
}, 0);
|
|
19
|
+
var onScroll = function onScroll(event) {
|
|
20
|
+
setScrollLeft(event.target.scrollLeft);
|
|
21
|
+
};
|
|
22
|
+
return /*#__PURE__*/React.createElement(TableRootContext.Provider, {
|
|
23
|
+
value: tableScrollWrapper.current
|
|
24
|
+
}, /*#__PURE__*/React.createElement("div", Object.assign({
|
|
25
|
+
className: classnames('sdoc-table-wrapper', {
|
|
26
|
+
'scroll position-relative': allWidth > TABLE_MAX_WIDTH
|
|
27
|
+
})
|
|
28
|
+
}, attributes), /*#__PURE__*/React.createElement("div", {
|
|
29
|
+
className: classnames('sdoc-table-scroll-wrapper', {
|
|
30
|
+
'scroll-at-center': scrollLeft + TABLE_MAX_WIDTH !== allWidth && scrollLeft > 0,
|
|
31
|
+
'scroll-at-right': scrollLeft + TABLE_MAX_WIDTH === allWidth,
|
|
32
|
+
'scroll-at-left': scrollLeft === 0
|
|
33
|
+
}),
|
|
34
|
+
ref: tableScrollWrapper,
|
|
35
|
+
onScroll: onScroll
|
|
36
|
+
}, children)));
|
|
37
|
+
};
|
|
38
|
+
export default TableRoot;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import { Editor, Transforms, Element } from '@seafile/slate';
|
|
3
|
+
import { TEXT_ALIGN, MENUS_CONFIG_MAP, CODE_BLOCK, TABLE } from '../../constants';
|
|
4
|
+
export var isMenuDisabled = function isMenuDisabled(editor) {
|
|
5
|
+
if (!editor.selection) return true;
|
|
6
|
+
var _Editor$nodes = Editor.nodes(editor, {
|
|
7
|
+
match: function match(node) {
|
|
8
|
+
return !Editor.isEditor(node) && Element.isElement(node) && Editor.isBlock(editor, node);
|
|
9
|
+
},
|
|
10
|
+
universal: true,
|
|
11
|
+
mode: 'highest'
|
|
12
|
+
}),
|
|
13
|
+
_Editor$nodes2 = _slicedToArray(_Editor$nodes, 1),
|
|
14
|
+
match = _Editor$nodes2[0];
|
|
15
|
+
var elementType = match[0].type;
|
|
16
|
+
// at present, TABLE got its own 'text align'
|
|
17
|
+
if (elementType == CODE_BLOCK || elementType == TABLE) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
};
|
|
22
|
+
export var getAlignType = function getAlignType(editor) {
|
|
23
|
+
var defaultType = MENUS_CONFIG_MAP[TEXT_ALIGN][0].type;
|
|
24
|
+
var selection = editor.selection;
|
|
25
|
+
if (!selection) {
|
|
26
|
+
return defaultType;
|
|
27
|
+
}
|
|
28
|
+
var _Editor$nodes3 = Editor.nodes(editor, {
|
|
29
|
+
at: Editor.unhangRange(editor, selection),
|
|
30
|
+
match: function match(n) {
|
|
31
|
+
return !Editor.isEditor(n) && Element.isElement(n) && n['align'];
|
|
32
|
+
}
|
|
33
|
+
}),
|
|
34
|
+
_Editor$nodes4 = _slicedToArray(_Editor$nodes3, 1),
|
|
35
|
+
match = _Editor$nodes4[0];
|
|
36
|
+
if (!match) return defaultType;
|
|
37
|
+
return match[0].align;
|
|
38
|
+
};
|
|
39
|
+
export var setAlignType = function setAlignType(editor, type) {
|
|
40
|
+
Transforms.setNodes(editor, {
|
|
41
|
+
'align': type
|
|
42
|
+
});
|
|
43
|
+
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
2
|
+
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
3
|
+
import _inherits from "@babel/runtime/helpers/esm/inherits";
|
|
4
|
+
import _createSuper from "@babel/runtime/helpers/esm/createSuper";
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { withTranslation } from 'react-i18next';
|
|
7
|
+
import classnames from 'classnames';
|
|
8
|
+
import { getAlignType, isMenuDisabled, setAlignType } from '../helpers';
|
|
9
|
+
import { TEXT_ALIGN, MENUS_CONFIG_MAP } from '../../../constants';
|
|
10
|
+
import './style.css';
|
|
11
|
+
var TextAlignMenu = /*#__PURE__*/function (_React$Component) {
|
|
12
|
+
_inherits(TextAlignMenu, _React$Component);
|
|
13
|
+
var _super = _createSuper(TextAlignMenu);
|
|
14
|
+
function TextAlignMenu(props) {
|
|
15
|
+
var _this;
|
|
16
|
+
_classCallCheck(this, TextAlignMenu);
|
|
17
|
+
_this = _super.call(this, props);
|
|
18
|
+
_this.registerEventHandler = function () {
|
|
19
|
+
document.addEventListener('click', _this.onHideTextAlignMenu);
|
|
20
|
+
};
|
|
21
|
+
_this.unregisterEventHandler = function () {
|
|
22
|
+
document.removeEventListener('click', _this.onHideTextAlignMenu);
|
|
23
|
+
};
|
|
24
|
+
_this.onHideTextAlignMenu = function () {
|
|
25
|
+
_this.setState({
|
|
26
|
+
isDropdownMenuOpen: false
|
|
27
|
+
}, function () {
|
|
28
|
+
_this.unregisterEventHandler();
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
_this.getCurrentType = function () {
|
|
32
|
+
var editor = _this.props.editor;
|
|
33
|
+
return getAlignType(editor);
|
|
34
|
+
};
|
|
35
|
+
_this.isActive = function (type) {
|
|
36
|
+
return _this.getCurrentType() === type;
|
|
37
|
+
};
|
|
38
|
+
_this.isDisabled = function () {
|
|
39
|
+
var editor = _this.props.editor;
|
|
40
|
+
return isMenuDisabled(editor);
|
|
41
|
+
};
|
|
42
|
+
_this.onToggleClick = function (event) {
|
|
43
|
+
event.stopPropagation();
|
|
44
|
+
event.nativeEvent.stopImmediatePropagation();
|
|
45
|
+
var isDropdownMenuOpen = !_this.state.isDropdownMenuOpen;
|
|
46
|
+
if (isDropdownMenuOpen) {
|
|
47
|
+
_this.setState({
|
|
48
|
+
isDropdownMenuOpen: isDropdownMenuOpen
|
|
49
|
+
}, function () {
|
|
50
|
+
_this.registerEventHandler();
|
|
51
|
+
});
|
|
52
|
+
} else {
|
|
53
|
+
_this.setState({
|
|
54
|
+
isDropdownMenuOpen: isDropdownMenuOpen
|
|
55
|
+
}, function () {
|
|
56
|
+
_this.unregisterEventHandler();
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
_this.setType = function (type) {
|
|
61
|
+
var editor = _this.props.editor;
|
|
62
|
+
setAlignType(editor, type);
|
|
63
|
+
};
|
|
64
|
+
_this.state = {
|
|
65
|
+
isDropdownMenuOpen: false
|
|
66
|
+
};
|
|
67
|
+
return _this;
|
|
68
|
+
}
|
|
69
|
+
_createClass(TextAlignMenu, [{
|
|
70
|
+
key: "render",
|
|
71
|
+
value: function render() {
|
|
72
|
+
var _this2 = this;
|
|
73
|
+
var t = this.props.t;
|
|
74
|
+
var isDropdownMenuOpen = this.state.isDropdownMenuOpen;
|
|
75
|
+
var caretIconClass = "caret-icon sdocfont sdoc-".concat(isDropdownMenuOpen ? 'caret-up' : 'drop-down');
|
|
76
|
+
var curType = this.getCurrentType();
|
|
77
|
+
var curIcon = MENUS_CONFIG_MAP[TEXT_ALIGN].filter(function (item) {
|
|
78
|
+
return item.type == curType;
|
|
79
|
+
})[0].iconClass;
|
|
80
|
+
var disabled = this.isDisabled();
|
|
81
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
82
|
+
className: "align-menu"
|
|
83
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
84
|
+
className: classnames('align-toggle px-2', {
|
|
85
|
+
'align-toggle-disabled': disabled
|
|
86
|
+
}),
|
|
87
|
+
onClick: disabled ? function () {} : this.onToggleClick
|
|
88
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
89
|
+
className: "mr-1 ".concat(curIcon)
|
|
90
|
+
}), !disabled && /*#__PURE__*/React.createElement("span", {
|
|
91
|
+
className: caretIconClass
|
|
92
|
+
})), isDropdownMenuOpen && /*#__PURE__*/React.createElement("div", {
|
|
93
|
+
className: "align-popover"
|
|
94
|
+
}, MENUS_CONFIG_MAP[TEXT_ALIGN].map(function (item, index) {
|
|
95
|
+
return /*#__PURE__*/React.createElement("span", {
|
|
96
|
+
key: index,
|
|
97
|
+
className: "align-menu-item ".concat(item.iconClass),
|
|
98
|
+
onClick: _this2.setType.bind(_this2, item.type)
|
|
99
|
+
});
|
|
100
|
+
})));
|
|
101
|
+
}
|
|
102
|
+
}]);
|
|
103
|
+
return TextAlignMenu;
|
|
104
|
+
}(React.Component);
|
|
105
|
+
export default withTranslation('sdoc-editor')(TextAlignMenu);
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
.align-menu {
|
|
2
|
+
display: flex;
|
|
3
|
+
position: relative;
|
|
4
|
+
margin-right: 10px;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.align-menu .align-toggle {
|
|
8
|
+
flex: 1;
|
|
9
|
+
display: flex;
|
|
10
|
+
justify-content: space-between;
|
|
11
|
+
align-items: center;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.align-menu .align-toggle-disabled {
|
|
15
|
+
color: #999;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.align-menu .align-toggle:not(.align-toggle-disabled):hover {
|
|
19
|
+
background: #e5e5e5;
|
|
20
|
+
border-radius: 2px;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.align-menu .align-toggle .sdocfont {
|
|
24
|
+
height: 30px;
|
|
25
|
+
display: inline-flex;
|
|
26
|
+
justify-content: center;
|
|
27
|
+
align-items: center;
|
|
28
|
+
font-size: 14px;
|
|
29
|
+
cursor: pointer;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.align-menu .align-toggle .caret-icon {
|
|
33
|
+
transform: scale(.8);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.align-menu .align-popover {
|
|
37
|
+
position: absolute;
|
|
38
|
+
top: 37px;
|
|
39
|
+
left: 0;
|
|
40
|
+
padding: 8px 0;
|
|
41
|
+
background-color: #fff;
|
|
42
|
+
border: 1px solid #e5e6e8;
|
|
43
|
+
border-radius: 2px;
|
|
44
|
+
box-shadow: 0 0 10px #ccc;
|
|
45
|
+
display: flex;
|
|
46
|
+
flex-direction: column;
|
|
47
|
+
align-items: flex-start;
|
|
48
|
+
z-index: 10;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.align-menu .align-popover .align-menu-item {
|
|
52
|
+
cursor: pointer;
|
|
53
|
+
height: 30px;
|
|
54
|
+
width: 100%;
|
|
55
|
+
padding: 4px 24px;
|
|
56
|
+
user-select: none;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.align-menu .align-popover .align-menu-item:hover {
|
|
60
|
+
background-color: rgb(245, 245, 245);
|
|
61
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
3
|
import React from 'react';
|
|
3
4
|
import { Node } from '@seafile/slate';
|
|
4
5
|
import { useSlateStatic } from '@seafile/slate-react';
|
|
@@ -10,6 +11,9 @@ var CustomElement = function CustomElement(props) {
|
|
|
10
11
|
var attributes = props.attributes,
|
|
11
12
|
children = props.children,
|
|
12
13
|
element = props.element;
|
|
14
|
+
var style = {
|
|
15
|
+
textAlign: element.align
|
|
16
|
+
};
|
|
13
17
|
switch (element.type) {
|
|
14
18
|
case PARAGRAPH:
|
|
15
19
|
{
|
|
@@ -25,9 +29,9 @@ var CustomElement = function CustomElement(props) {
|
|
|
25
29
|
return /*#__PURE__*/React.createElement("p", Object.assign({
|
|
26
30
|
"data-id": element.id
|
|
27
31
|
}, attributes, {
|
|
28
|
-
style: {
|
|
32
|
+
style: _objectSpread({
|
|
29
33
|
position: isShowPlaceHolder ? 'relative' : ''
|
|
30
|
-
}
|
|
34
|
+
}, style)
|
|
31
35
|
}), children, isShowPlaceHolder && /*#__PURE__*/React.createElement(Placeholder, {
|
|
32
36
|
title: 'Please_enter_text'
|
|
33
37
|
}));
|
|
@@ -116,7 +120,9 @@ var CustomElement = function CustomElement(props) {
|
|
|
116
120
|
{
|
|
117
121
|
return /*#__PURE__*/React.createElement("p", Object.assign({
|
|
118
122
|
"data-id": element.id
|
|
119
|
-
}, attributes
|
|
123
|
+
}, attributes, {
|
|
124
|
+
style: style
|
|
125
|
+
}), children);
|
|
120
126
|
}
|
|
121
127
|
}
|
|
122
128
|
};
|
|
@@ -10,6 +10,7 @@ import HeaderMenu from '../plugins/header/menu';
|
|
|
10
10
|
import CheckListMenu from '../plugins/check-list/menu';
|
|
11
11
|
import TextStyleMenuList from '../plugins/text-style/menu';
|
|
12
12
|
import CodeBlockMenu from '../plugins/code-block/menu';
|
|
13
|
+
import TextAlignMenu from '../plugins/text-align/menu';
|
|
13
14
|
import HistoryMenu from './redo-undo';
|
|
14
15
|
import { TableMenu, ActiveTableMenu } from '../plugins/table/menu';
|
|
15
16
|
import EventBus from '../../utils/event-bus';
|
|
@@ -48,6 +49,8 @@ var Toolbar = function Toolbar(_ref) {
|
|
|
48
49
|
type: ORDERED_LIST
|
|
49
50
|
}), /*#__PURE__*/React.createElement(CheckListMenu, {
|
|
50
51
|
editor: editor
|
|
52
|
+
}), /*#__PURE__*/React.createElement(TextAlignMenu, {
|
|
53
|
+
editor: editor
|
|
51
54
|
})), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(CodeBlockMenu, {
|
|
52
55
|
editor: editor
|
|
53
56
|
}), /*#__PURE__*/React.createElement(TableMenu, {
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export var eventStopPropagation = function eventStopPropagation(event) {
|
|
2
|
+
if (!event) return;
|
|
3
|
+
event.stopPropagation();
|
|
4
|
+
event.nativeEvent && event.nativeEvent.stopImmediatePropagation && event.nativeEvent.stopImmediatePropagation();
|
|
5
|
+
};
|
|
6
|
+
export var registerResizeEvents = function registerResizeEvents() {
|
|
7
|
+
var eventsMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
8
|
+
for (var key in eventsMap) {
|
|
9
|
+
document.addEventListener(key, eventsMap[key]);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
export var unregisterResizeEvents = function unregisterResizeEvents() {
|
|
13
|
+
var eventsMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
14
|
+
for (var key in eventsMap) {
|
|
15
|
+
document.removeEventListener(key, eventsMap[key]);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
export var getMouseDownInfo = function getMouseDownInfo(event, scrollContainer) {
|
|
19
|
+
var positionX = 0;
|
|
20
|
+
var positionY = 0;
|
|
21
|
+
var scrollLeft = 0;
|
|
22
|
+
var scrollTop = 0;
|
|
23
|
+
if (event) {
|
|
24
|
+
positionX = event.clientX;
|
|
25
|
+
positionY = event.clientY;
|
|
26
|
+
}
|
|
27
|
+
if (scrollContainer) {
|
|
28
|
+
scrollLeft = scrollContainer.scrollLeft;
|
|
29
|
+
scrollTop = scrollContainer.scrollTop;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
positionX: positionX,
|
|
33
|
+
positionY: positionY,
|
|
34
|
+
scrollLeft: scrollLeft,
|
|
35
|
+
scrollTop: scrollTop
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export var getMouseMoveInfo = function getMouseMoveInfo(event, mouseDownInfo, scrollContainer) {
|
|
39
|
+
var displacementX = 0;
|
|
40
|
+
var displacementY = 0;
|
|
41
|
+
if (!event) return {
|
|
42
|
+
displacementX: displacementX,
|
|
43
|
+
displacementY: displacementY
|
|
44
|
+
};
|
|
45
|
+
var currPositionX = event.clientX,
|
|
46
|
+
currPositionY = event.clientY;
|
|
47
|
+
var scrollLeft = 0;
|
|
48
|
+
var scrollTop = 0;
|
|
49
|
+
if (scrollContainer) {
|
|
50
|
+
scrollLeft = scrollContainer.scrollLeft;
|
|
51
|
+
scrollTop = scrollContainer.scrollTop;
|
|
52
|
+
}
|
|
53
|
+
displacementX = currPositionX - mouseDownInfo.positionX + scrollLeft - (mouseDownInfo.scrollLeft || 0);
|
|
54
|
+
displacementY = currPositionY - mouseDownInfo.positionY + scrollTop - (mouseDownInfo.scrollTop || 0);
|
|
55
|
+
return {
|
|
56
|
+
displacementX: displacementX,
|
|
57
|
+
displacementY: displacementY
|
|
58
|
+
};
|
|
59
|
+
};
|
|
@@ -22,21 +22,36 @@ var DocInfo = /*#__PURE__*/function (_React$Component) {
|
|
|
22
22
|
var eventBus = EventBus.getInstance();
|
|
23
23
|
eventBus.dispatch(EXTERNAL_EVENT.INTERNAL_LINK_CLICK);
|
|
24
24
|
};
|
|
25
|
+
_this.toggleStar = function () {
|
|
26
|
+
var eventBus = EventBus.getInstance();
|
|
27
|
+
eventBus.dispatch(EXTERNAL_EVENT.TOGGLE_STAR);
|
|
28
|
+
};
|
|
25
29
|
return _this;
|
|
26
30
|
}
|
|
27
31
|
_createClass(DocInfo, [{
|
|
28
32
|
key: "render",
|
|
29
33
|
value: function render() {
|
|
30
|
-
var
|
|
34
|
+
var _this$props = this.props,
|
|
35
|
+
t = _this$props.t,
|
|
36
|
+
isStarred = _this$props.isStarred;
|
|
31
37
|
var docName = context.getSetting('docName');
|
|
32
|
-
var
|
|
38
|
+
var _context$getSettings = context.getSettings(),
|
|
39
|
+
isShowInternalLink = _context$getSettings.isShowInternalLink,
|
|
40
|
+
isStarIconShown = _context$getSettings.isStarIconShown;
|
|
33
41
|
return /*#__PURE__*/React.createElement("div", {
|
|
34
42
|
className: "doc-info"
|
|
35
43
|
}, /*#__PURE__*/React.createElement("div", {
|
|
36
44
|
className: "doc-name"
|
|
37
|
-
}, docName), /*#__PURE__*/React.createElement("
|
|
45
|
+
}, docName), isStarIconShown && /*#__PURE__*/React.createElement("a", {
|
|
46
|
+
className: "file-star ".concat(isStarred ? 'fa' : 'far', " fa-star"),
|
|
47
|
+
href: "#",
|
|
48
|
+
title: isStarred ? t('starred') : t('unstarred'),
|
|
49
|
+
role: "button",
|
|
50
|
+
"aria-label": isStarred ? t('Unstar') : t('Star'),
|
|
51
|
+
onClick: this.toggleStar
|
|
52
|
+
}), isShowInternalLink && /*#__PURE__*/React.createElement("span", {
|
|
38
53
|
className: "doc-icon"
|
|
39
|
-
},
|
|
54
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
40
55
|
className: "internal-link sdocfont sdoc-link",
|
|
41
56
|
title: t('internal_link'),
|
|
42
57
|
onClick: this.onInternalLinkClick
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
var serverConfig = {
|
|
2
|
+
//serviceUrl: "http://127.0.0.1:8000",
|
|
3
|
+
serviceUrl: "http://192.168.1.100:8000",
|
|
4
|
+
username: "lj@11.com",
|
|
5
|
+
password: "11",
|
|
6
|
+
repoID: "79d1fa93-4b5f-4d6c-8fb5-ad3958e1fa47",
|
|
7
|
+
userInfo: {
|
|
8
|
+
username: 'lj@11.com',
|
|
9
|
+
name: 'lj-',
|
|
10
|
+
contact_email: 'lj@11.com'
|
|
11
|
+
},
|
|
12
|
+
filePath: '/xxx.md',
|
|
13
|
+
fileName: 'xxx.md',
|
|
14
|
+
dirPath: '/'
|
|
15
|
+
};
|
|
16
|
+
export { serverConfig };
|
package/dist/constants/index.js
CHANGED
|
@@ -112,7 +112,9 @@ var SimpleEditor = /*#__PURE__*/function (_React$Component) {
|
|
|
112
112
|
}, errorMessage);
|
|
113
113
|
}
|
|
114
114
|
var isOpenSocket = context.getSetting('isOpenSocket');
|
|
115
|
-
return /*#__PURE__*/React.createElement(Layout, null, /*#__PURE__*/React.createElement(Header, null, /*#__PURE__*/React.createElement(DocInfo,
|
|
115
|
+
return /*#__PURE__*/React.createElement(Layout, null, /*#__PURE__*/React.createElement(Header, null, /*#__PURE__*/React.createElement(DocInfo, {
|
|
116
|
+
isStarred: this.props.isStarred
|
|
117
|
+
}), /*#__PURE__*/React.createElement(DocOperations, null)), /*#__PURE__*/React.createElement(Content, null, /*#__PURE__*/React.createElement(SDocEditor, {
|
|
116
118
|
config: context.getEditorConfig(),
|
|
117
119
|
document: document,
|
|
118
120
|
isOpenSocket: isOpenSocket,
|
package/package.json
CHANGED
|
@@ -247,5 +247,9 @@
|
|
|
247
247
|
"Insert_below": "Insert below",
|
|
248
248
|
"Insert_above": "Insert above",
|
|
249
249
|
"Insert_on_the_right": "Insert on the right",
|
|
250
|
-
"Insert_on_the_left": "Insert on the left"
|
|
250
|
+
"Insert_on_the_left": "Insert on the left",
|
|
251
|
+
"starred": "starred",
|
|
252
|
+
"unstarred": "unstarred",
|
|
253
|
+
"Star": "Star",
|
|
254
|
+
"Unstar": "Unstar"
|
|
251
255
|
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
.sdoc-table-selected {
|
|
2
|
-
position: relative;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
.sdoc-table-selected .sdoc-table-rows-header {
|
|
6
|
-
width: 12px;
|
|
7
|
-
left: -12px;
|
|
8
|
-
top: 0;
|
|
9
|
-
height: 100%;
|
|
10
|
-
background-color: rgb(243, 245, 247);
|
|
11
|
-
display: flex;
|
|
12
|
-
flex-direction: column;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
.sdoc-table-selected .sdoc-table-rows-header .sdoc-table-rows-header-item {
|
|
16
|
-
border-bottom: 1px solid #ccc;
|
|
17
|
-
flex-shrink: 0;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
.sdoc-table-selected .sdoc-table-rows-header .sdoc-table-rows-header-item:last-child {
|
|
21
|
-
border-bottom: none;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
.sdoc-table-wrapper {
|
|
25
|
-
overflow: scroll;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
.sdoc-table-wrapper tr:first-child {
|
|
29
|
-
font-weight: unset;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
.sdoc-table-wrapper tr:nth-child(2n+1) {
|
|
33
|
-
background-color: unset;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
.article .sdoc-table-wrapper td {
|
|
37
|
-
min-width: 35px;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.sdoc-table-wrapper .cell-selected {
|
|
41
|
-
caret-color: transparent;
|
|
42
|
-
background-color: #fff4e6;
|
|
43
|
-
position: relative;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
.sdoc-table-wrapper .cell-light-height-top-border::before {
|
|
47
|
-
content: '';
|
|
48
|
-
position: absolute;
|
|
49
|
-
top: -1px;
|
|
50
|
-
left: 0;
|
|
51
|
-
width: 100%;
|
|
52
|
-
height: 2px;
|
|
53
|
-
border-top: 1px double #ffa94d;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
.sdoc-table-wrapper .cell-light-height-bottom-border {
|
|
57
|
-
border-bottom: 1px double #ffa94d;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.sdoc-table-wrapper .cell-light-height-left-border::after {
|
|
61
|
-
content: '';
|
|
62
|
-
position: absolute;
|
|
63
|
-
top: 0px;
|
|
64
|
-
left: -1px;
|
|
65
|
-
width: 2px;
|
|
66
|
-
height: 100%;
|
|
67
|
-
border-left: 1px double #ffa94d;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
.sdoc-table-wrapper .cell-light-height-right-border {
|
|
71
|
-
border-right: 1px double #ffa94d;
|
|
72
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
-
import React, { useRef, useState, useEffect } from 'react';
|
|
3
|
-
import classnames from 'classnames';
|
|
4
|
-
import throttle from 'lodash.throttle';
|
|
5
|
-
import { useSelected } from '@seafile/slate-react';
|
|
6
|
-
import { EMPTY_SELECTED_RANGE } from '../../constants';
|
|
7
|
-
import { TableContext } from '../context';
|
|
8
|
-
import EventBus from '../../../../../utils/event-bus';
|
|
9
|
-
import { EXTERNAL_EVENT } from '../../../../../../constants';
|
|
10
|
-
import { setTableSelectedRange } from '../../helpers';
|
|
11
|
-
import ObjectUtils from '../../../../../utils/object-utils';
|
|
12
|
-
import './index.css';
|
|
13
|
-
var Table = function Table(_ref) {
|
|
14
|
-
var className = _ref.className,
|
|
15
|
-
attributes = _ref.attributes,
|
|
16
|
-
children = _ref.children,
|
|
17
|
-
isSelected = _ref.isSelected,
|
|
18
|
-
editor = _ref.editor;
|
|
19
|
-
var table = useRef(null);
|
|
20
|
-
var startRowIndex = 0;
|
|
21
|
-
var startColIndex = 0;
|
|
22
|
-
var _selectedRange = EMPTY_SELECTED_RANGE;
|
|
23
|
-
var _useState = useState(EMPTY_SELECTED_RANGE),
|
|
24
|
-
_useState2 = _slicedToArray(_useState, 2),
|
|
25
|
-
selectedRange = _useState2[0],
|
|
26
|
-
setSelectedRange = _useState2[1];
|
|
27
|
-
var eventBus = EventBus.getInstance();
|
|
28
|
-
useEffect(function () {
|
|
29
|
-
var cancelTableSelectRangeSubscribe = eventBus.subscribe(EXTERNAL_EVENT.CANCEL_TABLE_SELECT_RANGE, clearRange);
|
|
30
|
-
return function () {
|
|
31
|
-
cancelTableSelectRangeSubscribe();
|
|
32
|
-
};
|
|
33
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
34
|
-
}, []);
|
|
35
|
-
var clearRange = function clearRange() {
|
|
36
|
-
_selectedRange = EMPTY_SELECTED_RANGE;
|
|
37
|
-
setSelectedRange(EMPTY_SELECTED_RANGE);
|
|
38
|
-
};
|
|
39
|
-
var onMouseMove = throttle(function (event) {
|
|
40
|
-
// if event.target not in the table, clear the mouseMove event
|
|
41
|
-
if (event.target.nodeName === 'TBODY' || !table.current.contains(event.target)) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
var endRowIndex = Number(event.target.getAttribute('row-index'));
|
|
45
|
-
var endColIndex = Number(event.target.getAttribute('cell-index'));
|
|
46
|
-
var newSelectedRange = {
|
|
47
|
-
minRowIndex: Math.min(startRowIndex, endRowIndex),
|
|
48
|
-
maxRowIndex: Math.max(startRowIndex, endRowIndex),
|
|
49
|
-
minColIndex: Math.min(startColIndex, endColIndex),
|
|
50
|
-
maxColIndex: Math.max(startColIndex, endColIndex)
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
// same cell
|
|
54
|
-
if (newSelectedRange.minRowIndex === newSelectedRange.maxRowIndex && newSelectedRange.minColIndex === newSelectedRange.maxColIndex) return;
|
|
55
|
-
_selectedRange = newSelectedRange;
|
|
56
|
-
setSelectedRange(newSelectedRange);
|
|
57
|
-
setTableSelectedRange(editor, newSelectedRange);
|
|
58
|
-
}, 200);
|
|
59
|
-
var onMouseUp = function onMouseUp(event) {
|
|
60
|
-
if (!ObjectUtils.isSameObject(_selectedRange, EMPTY_SELECTED_RANGE)) {
|
|
61
|
-
window.getSelection().collapseToEnd();
|
|
62
|
-
}
|
|
63
|
-
window.document.removeEventListener('mousemove', onMouseMove);
|
|
64
|
-
window.document.removeEventListener('mouseup', onMouseUp);
|
|
65
|
-
};
|
|
66
|
-
var onMouseDown = function onMouseDown(event) {
|
|
67
|
-
if (event.button !== 0) return; // right click not deal
|
|
68
|
-
startRowIndex = Number(event.target.getAttribute('row-index'));
|
|
69
|
-
startColIndex = Number(event.target.getAttribute('cell-index'));
|
|
70
|
-
setSelectedRange(EMPTY_SELECTED_RANGE);
|
|
71
|
-
setTableSelectedRange(editor, EMPTY_SELECTED_RANGE);
|
|
72
|
-
window.document.addEventListener('mousemove', onMouseMove);
|
|
73
|
-
window.document.addEventListener('mouseup', onMouseUp);
|
|
74
|
-
};
|
|
75
|
-
return /*#__PURE__*/React.createElement(TableContext.Provider, {
|
|
76
|
-
value: selectedRange
|
|
77
|
-
}, /*#__PURE__*/React.createElement("div", Object.assign({}, attributes, {
|
|
78
|
-
className: classnames('sdoc-table-wrapper', attributes.className, className, {
|
|
79
|
-
'sdoc-table-selected': isSelected
|
|
80
|
-
})
|
|
81
|
-
}), /*#__PURE__*/React.createElement("table", {
|
|
82
|
-
onMouseDown: onMouseDown,
|
|
83
|
-
ref: table
|
|
84
|
-
}, /*#__PURE__*/React.createElement("tbody", null, children))));
|
|
85
|
-
};
|
|
86
|
-
function renderTable(props, editor) {
|
|
87
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
88
|
-
var isSelected = useSelected();
|
|
89
|
-
return /*#__PURE__*/React.createElement(Table, Object.assign({}, props, {
|
|
90
|
-
editor: editor,
|
|
91
|
-
isSelected: isSelected
|
|
92
|
-
}));
|
|
93
|
-
}
|
|
94
|
-
export default renderTable;
|