@seafile/sdoc-editor 0.1.82 → 0.1.84
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/layout.css +33 -7
- package/dist/basic-sdk/comment/color-menu/color-item.js +22 -0
- package/dist/basic-sdk/comment/color-menu/index.css +109 -0
- package/dist/basic-sdk/comment/color-menu/index.js +199 -0
- package/dist/basic-sdk/comment/style.css +1 -0
- package/dist/basic-sdk/constants/index.js +1 -0
- package/dist/basic-sdk/editor.js +45 -4
- package/dist/basic-sdk/extension/constants/color.js +265 -0
- package/dist/basic-sdk/extension/constants/index.js +9 -2
- package/dist/basic-sdk/extension/plugins/header/menu/style.css +1 -1
- package/dist/basic-sdk/extension/plugins/header/plugin.js +2 -1
- package/dist/basic-sdk/extension/plugins/image/helpers.js +1 -3
- package/dist/basic-sdk/extension/plugins/image/menu/style.css +2 -2
- package/dist/basic-sdk/extension/plugins/image/plugin.js +21 -0
- package/dist/basic-sdk/extension/plugins/table/helpers.js +386 -49
- package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/common-menu.js +4 -0
- package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/index.js +40 -13
- package/dist/basic-sdk/extension/plugins/table/plugin.js +138 -214
- package/dist/basic-sdk/extension/plugins/table/render/index.js +38 -8
- package/dist/basic-sdk/extension/plugins/table/render/render-cell.js +16 -7
- package/dist/basic-sdk/extension/plugins/table/render/table-header/rows-header/row-header.js +2 -2
- package/dist/basic-sdk/extension/plugins/text-align/menu/style.css +1 -1
- package/dist/basic-sdk/node-id/helpers.js +18 -0
- package/dist/basic-sdk/node-id/index.js +3 -3
- package/dist/basic-sdk/outline/index.js +75 -0
- package/dist/basic-sdk/outline/outline-item.js +52 -0
- package/dist/basic-sdk/outline/style.css +83 -0
- package/dist/basic-sdk/utils/event-handler.js +9 -1
- package/dist/basic-sdk/utils/object-utils.js +3 -0
- package/dist/basic-sdk/views/viewer.js +6 -4
- package/dist/components/code-block-hover-menu/index.css +1 -1
- package/dist/components/doc-info/index.js +3 -1
- package/dist/components/draft-dropdown/index.js +77 -0
- package/dist/components/draft-dropdown/style.css +43 -0
- package/dist/components/more-dropdown/index.js +10 -3
- package/dist/components/more-dropdown/style.css +1 -1
- package/dist/constants/index.js +3 -1
- package/dist/pages/simple-editor.js +2 -0
- package/dist/utils/index.js +2 -1
- package/dist/utils/local-storage-utils.js +49 -0
- package/package.json +2 -1
- package/public/locales/en/sdoc-editor.json +46 -1
- package/public/locales/zh-CN/sdoc-editor.json +46 -1
- package/public/media/sdoc-editor-font/iconfont.eot +0 -0
- package/public/media/sdoc-editor-font/iconfont.svg +4 -0
- package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
- package/public/media/sdoc-editor-font/iconfont.woff +0 -0
- package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
- package/public/media/sdoc-editor-font.css +14 -6
- package/dist/basic-sdk/assets/css/outline.css +0 -52
- package/dist/basic-sdk/outline.js +0 -125
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { withTranslation } from 'react-i18next';
|
|
4
|
+
import { UncontrolledTooltip } from 'reactstrap';
|
|
5
|
+
import OutlineItem from './outline-item';
|
|
6
|
+
import './style.css';
|
|
7
|
+
var getOutlineSetting = function getOutlineSetting(docUuid) {
|
|
8
|
+
var currentValue = localStorage.getItem(docUuid);
|
|
9
|
+
var config = currentValue ? JSON.parse(currentValue) : {};
|
|
10
|
+
var _config$outlineOpen = config.outlineOpen,
|
|
11
|
+
outlineOpen = _config$outlineOpen === void 0 ? false : _config$outlineOpen;
|
|
12
|
+
return outlineOpen;
|
|
13
|
+
};
|
|
14
|
+
var setOutlineSetting = function setOutlineSetting(docUuid, isShown) {
|
|
15
|
+
var currentValue = localStorage.getItem(docUuid);
|
|
16
|
+
var config = currentValue ? JSON.parse(currentValue) : {};
|
|
17
|
+
config['outlineOpen'] = isShown;
|
|
18
|
+
localStorage.setItem(docUuid, JSON.stringify(config));
|
|
19
|
+
};
|
|
20
|
+
var SDocOutline = function SDocOutline(_ref) {
|
|
21
|
+
var scrollLeft = _ref.scrollLeft,
|
|
22
|
+
docUuid = _ref.docUuid,
|
|
23
|
+
doc = _ref.doc,
|
|
24
|
+
t = _ref.t;
|
|
25
|
+
var _useState = useState(false),
|
|
26
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
27
|
+
isShown = _useState2[0],
|
|
28
|
+
setIsShown = _useState2[1];
|
|
29
|
+
useEffect(function () {
|
|
30
|
+
var outlineOpen = getOutlineSetting(docUuid);
|
|
31
|
+
setIsShown(outlineOpen);
|
|
32
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
33
|
+
}, []);
|
|
34
|
+
var toggleShow = useCallback(function () {
|
|
35
|
+
setIsShown(!isShown);
|
|
36
|
+
setOutlineSetting(!isShown);
|
|
37
|
+
}, [isShown]);
|
|
38
|
+
var list = useMemo(function () {
|
|
39
|
+
return doc.filter(function (item) {
|
|
40
|
+
return ['header2', 'header3'].includes(item.type);
|
|
41
|
+
});
|
|
42
|
+
}, [doc]);
|
|
43
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
44
|
+
className: "sdoc-outline-wrapper",
|
|
45
|
+
style: {
|
|
46
|
+
left: -scrollLeft
|
|
47
|
+
}
|
|
48
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
49
|
+
className: "sdoc-outline"
|
|
50
|
+
}, isShown && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
51
|
+
className: "sdoc-outline-header"
|
|
52
|
+
}, /*#__PURE__*/React.createElement("h2", {
|
|
53
|
+
className: "sdoc-outline-header__title"
|
|
54
|
+
}, t('Outline')), /*#__PURE__*/React.createElement("span", {
|
|
55
|
+
className: "sdoc-outline-header__close sdocfont sdoc-cancel",
|
|
56
|
+
onClick: toggleShow
|
|
57
|
+
})), list.length === 0 && /*#__PURE__*/React.createElement("p", {
|
|
58
|
+
className: "mt-4 text-secondary"
|
|
59
|
+
}, t('Headings_you_add_to_the_document_will_appear_here')), list.length > 0 && /*#__PURE__*/React.createElement("ol", {
|
|
60
|
+
className: "sdoc-outline-list-container"
|
|
61
|
+
}, list.map(function (item, index) {
|
|
62
|
+
return /*#__PURE__*/React.createElement(OutlineItem, {
|
|
63
|
+
key: index,
|
|
64
|
+
item: item
|
|
65
|
+
});
|
|
66
|
+
})))), !isShown && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
|
|
67
|
+
id: "sdoc-outline-menu",
|
|
68
|
+
className: "sdoc-outline-menu sdocfont sdoc-table-of-content",
|
|
69
|
+
onClick: toggleShow
|
|
70
|
+
}), /*#__PURE__*/React.createElement(UncontrolledTooltip, {
|
|
71
|
+
placement: "right",
|
|
72
|
+
target: "sdoc-outline-menu"
|
|
73
|
+
}, t('Outline'))));
|
|
74
|
+
};
|
|
75
|
+
export default withTranslation('sdoc-editor')(SDocOutline);
|
|
@@ -0,0 +1,52 @@
|
|
|
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
|
+
var OutlineItem = /*#__PURE__*/function (_React$PureComponent) {
|
|
7
|
+
_inherits(OutlineItem, _React$PureComponent);
|
|
8
|
+
var _super = _createSuper(OutlineItem);
|
|
9
|
+
function OutlineItem(props) {
|
|
10
|
+
var _this;
|
|
11
|
+
_classCallCheck(this, OutlineItem);
|
|
12
|
+
_this = _super.call(this, props);
|
|
13
|
+
_this.onItemClick = function () {
|
|
14
|
+
var item = _this.props.item;
|
|
15
|
+
var id = item.id;
|
|
16
|
+
document.getElementById(id).scrollIntoView();
|
|
17
|
+
};
|
|
18
|
+
_this.onMouseOver = function () {
|
|
19
|
+
_this.setState({
|
|
20
|
+
isHighlighted: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
_this.onMouseOut = function () {
|
|
24
|
+
_this.setState({
|
|
25
|
+
isHighlighted: false
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
_this.state = {
|
|
29
|
+
isHighlighted: false
|
|
30
|
+
};
|
|
31
|
+
return _this;
|
|
32
|
+
}
|
|
33
|
+
_createClass(OutlineItem, [{
|
|
34
|
+
key: "render",
|
|
35
|
+
value: function render() {
|
|
36
|
+
var isHighlighted = this.state.isHighlighted;
|
|
37
|
+
var item = this.props.item;
|
|
38
|
+
var type = item.type,
|
|
39
|
+
children = item.children;
|
|
40
|
+
return /*#__PURE__*/React.createElement("li", {
|
|
41
|
+
className: "sdoc-outline-item ".concat(type === 'header3' ? 'pl-5' : '', " ").concat(isHighlighted ? 'active' : ''),
|
|
42
|
+
onClick: this.onItemClick,
|
|
43
|
+
onMouseOver: this.onMouseOver,
|
|
44
|
+
onMouseOut: this.onMouseOut
|
|
45
|
+
}, children.map(function (child) {
|
|
46
|
+
return child.text;
|
|
47
|
+
}).join(''));
|
|
48
|
+
}
|
|
49
|
+
}]);
|
|
50
|
+
return OutlineItem;
|
|
51
|
+
}(React.PureComponent);
|
|
52
|
+
export default OutlineItem;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
.sdoc-outline-wrapper {
|
|
2
|
+
position: absolute;
|
|
3
|
+
top: 0;
|
|
4
|
+
bottom: 0;
|
|
5
|
+
display: flex;
|
|
6
|
+
margin: 20px 30px 20px 16px;
|
|
7
|
+
min-height: 0;
|
|
8
|
+
z-index: 101;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.sdoc-outline {
|
|
12
|
+
flex: 1;
|
|
13
|
+
width: 220px;
|
|
14
|
+
display: flex;
|
|
15
|
+
min-height: 0;
|
|
16
|
+
flex-direction: column;
|
|
17
|
+
font-size: 14px;
|
|
18
|
+
position: relative;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.sdoc-outline-header {
|
|
22
|
+
display: flex;
|
|
23
|
+
justify-content: space-between;
|
|
24
|
+
align-items: center;
|
|
25
|
+
padding: 0.25rem 0;
|
|
26
|
+
color: #999;
|
|
27
|
+
border-bottom: 1px solid #dbdbdb;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.sdoc-outline-header__title {
|
|
31
|
+
font-size: 14px;
|
|
32
|
+
line-height: 1.1;
|
|
33
|
+
margin: 0 !important;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.sdoc-outline-header__close {
|
|
37
|
+
cursor: pointer;
|
|
38
|
+
font-size: 14px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.sdoc-outline-header__close:hover {
|
|
42
|
+
color: #555;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.sdoc-outline-list-container {
|
|
46
|
+
list-style: none;
|
|
47
|
+
padding: 0.5rem 0;
|
|
48
|
+
flex: 1;
|
|
49
|
+
display: flex;
|
|
50
|
+
flex-direction: column;
|
|
51
|
+
overflow: auto;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.sdoc-outline-item {
|
|
55
|
+
padding: 4px 0;
|
|
56
|
+
cursor: pointer;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.sdoc-outline-item.active {
|
|
60
|
+
color: #ff8000;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.sdoc-outline-menu {
|
|
64
|
+
line-height: 1;
|
|
65
|
+
font-size: 14px;
|
|
66
|
+
color: #888;
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
width: 28px;
|
|
69
|
+
height: 28px;
|
|
70
|
+
background: #fff;
|
|
71
|
+
border-radius: 0 50% 50% 0;
|
|
72
|
+
box-shadow: 0 0 6px rgba(0,0,0, 0.12);
|
|
73
|
+
display: flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
justify-content: center;
|
|
76
|
+
position: absolute;
|
|
77
|
+
top: 20px;
|
|
78
|
+
left: -16px;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.sdoc-outline-menu:hover {
|
|
82
|
+
color: #333;
|
|
83
|
+
}
|
|
@@ -52,13 +52,21 @@ var EventProxy = /*#__PURE__*/_createClass(function EventProxy(_editor) {
|
|
|
52
52
|
if (node) {
|
|
53
53
|
_this.editor.tableOnKeyDown(event);
|
|
54
54
|
}
|
|
55
|
+
var imageNode = getSelectedNodeByType(editor, ELEMENT_TYPE.IMAGE);
|
|
56
|
+
if (imageNode) {
|
|
57
|
+
_this.editor.imageOnKeyDown(event);
|
|
58
|
+
}
|
|
55
59
|
};
|
|
56
60
|
this.onCopy = function (event) {
|
|
57
61
|
event.stopPropagation();
|
|
58
62
|
event.nativeEvent.stopImmediatePropagation();
|
|
59
63
|
// 处理数据
|
|
60
64
|
};
|
|
61
|
-
this.onCut = function (event) {
|
|
65
|
+
this.onCut = function (event) {
|
|
66
|
+
if (_this.editor.cut) {
|
|
67
|
+
_this.editor.cut(event);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
62
70
|
this.onPaste = function (event) {};
|
|
63
71
|
this.editor = _editor;
|
|
64
72
|
});
|
|
@@ -54,6 +54,9 @@ var ObjectUtils = /*#__PURE__*/function () {
|
|
|
54
54
|
}]);
|
|
55
55
|
return ObjectUtils;
|
|
56
56
|
}();
|
|
57
|
+
ObjectUtils.isObject = function (data) {
|
|
58
|
+
return ObjectUtils.getDataType(data) === 'Object';
|
|
59
|
+
};
|
|
57
60
|
ObjectUtils.hasProperty = function (obj, prop) {
|
|
58
61
|
if (!obj) return false;
|
|
59
62
|
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
@@ -25,10 +25,12 @@ var SDocViewer = function SDocViewer(_ref) {
|
|
|
25
25
|
return /*#__PURE__*/React.createElement("div", {
|
|
26
26
|
className: "sdoc-editor-container"
|
|
27
27
|
}, /*#__PURE__*/React.createElement("div", {
|
|
28
|
-
className: "sdoc-editor-content"
|
|
28
|
+
className: "sdoc-editor-content readonly"
|
|
29
29
|
}, /*#__PURE__*/React.createElement("div", {
|
|
30
30
|
ref: scrollRef,
|
|
31
|
-
className: "sdoc-
|
|
31
|
+
className: "sdoc-article-wrapper"
|
|
32
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
33
|
+
className: "sdoc-article-container"
|
|
32
34
|
}, /*#__PURE__*/React.createElement(ScrollContext.Provider, {
|
|
33
35
|
value: {
|
|
34
36
|
scrollRef: scrollRef
|
|
@@ -37,7 +39,7 @@ var SDocViewer = function SDocViewer(_ref) {
|
|
|
37
39
|
editor: editor,
|
|
38
40
|
value: slateValue
|
|
39
41
|
}, /*#__PURE__*/React.createElement("div", {
|
|
40
|
-
className: "article
|
|
42
|
+
className: "article",
|
|
41
43
|
ref: articleRef
|
|
42
44
|
}, /*#__PURE__*/React.createElement(SetNodeToDecorations, null), /*#__PURE__*/React.createElement(Editable, {
|
|
43
45
|
readOnly: true,
|
|
@@ -50,6 +52,6 @@ var SDocViewer = function SDocViewer(_ref) {
|
|
|
50
52
|
},
|
|
51
53
|
onDOMBeforeInput: function onDOMBeforeInput(event) {},
|
|
52
54
|
decorate: decorate
|
|
53
|
-
})))))));
|
|
55
|
+
}))))))));
|
|
54
56
|
};
|
|
55
57
|
export default SDocViewer;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
.sdoc-code-block-hover-menu-container {
|
|
2
2
|
position: absolute;
|
|
3
3
|
height: 42px;
|
|
4
|
+
z-index: 101;
|
|
4
5
|
}
|
|
5
6
|
|
|
6
7
|
.sdoc-code-block-hover-menu-container .hover-menu-container {
|
|
@@ -14,7 +15,6 @@
|
|
|
14
15
|
border-radius: 3px;
|
|
15
16
|
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08);
|
|
16
17
|
border: 1px solid #e8e8e8;
|
|
17
|
-
z-index: 1000;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
.sdoc-code-block-hover-menu-container .hover-menu-container .active {
|
|
@@ -5,9 +5,11 @@ import context from '../../context';
|
|
|
5
5
|
import { EventBus } from '../../basic-sdk';
|
|
6
6
|
import { EXTERNAL_EVENT } from '../../constants';
|
|
7
7
|
import { DateUtils } from '../../utils';
|
|
8
|
+
import DraftDropdown from '../draft-dropdown';
|
|
8
9
|
var DocInfo = function DocInfo(_ref) {
|
|
9
10
|
var t = _ref.t,
|
|
10
11
|
isStarred = _ref.isStarred,
|
|
12
|
+
isDraft = _ref.isDraft,
|
|
11
13
|
isEditMode = _ref.isEditMode;
|
|
12
14
|
var onInternalLinkClick = useCallback(function () {
|
|
13
15
|
var eventBus = EventBus.getInstance();
|
|
@@ -22,7 +24,7 @@ var DocInfo = function DocInfo(_ref) {
|
|
|
22
24
|
var _context$getSettings = context.getSettings(),
|
|
23
25
|
isShowInternalLink = _context$getSettings.isShowInternalLink,
|
|
24
26
|
isStarIconShown = _context$getSettings.isStarIconShown;
|
|
25
|
-
var docInfo = /*#__PURE__*/React.createElement(React.Fragment, null, isStarIconShown && /*#__PURE__*/React.createElement("button", {
|
|
27
|
+
var docInfo = /*#__PURE__*/React.createElement(React.Fragment, null, isDraft && /*#__PURE__*/React.createElement(DraftDropdown, null), isStarIconShown && /*#__PURE__*/React.createElement("button", {
|
|
26
28
|
className: "doc-icon sdocfont ".concat(isStarred ? 'sdoc-starred' : 'sdoc-unstarred', " border-0 p-0 bg-transparent"),
|
|
27
29
|
title: isStarred ? t('Starred') : t('Unstarred'),
|
|
28
30
|
"aria-label": isStarred ? t('Unstar') : t('Star'),
|
|
@@ -0,0 +1,77 @@
|
|
|
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 { EventBus } from '../../basic-sdk';
|
|
8
|
+
import { EXTERNAL_EVENT } from '../../constants';
|
|
9
|
+
import './style.css';
|
|
10
|
+
var DraftDropdownMenu = /*#__PURE__*/function (_React$Component) {
|
|
11
|
+
_inherits(DraftDropdownMenu, _React$Component);
|
|
12
|
+
var _super = _createSuper(DraftDropdownMenu);
|
|
13
|
+
function DraftDropdownMenu(props) {
|
|
14
|
+
var _this;
|
|
15
|
+
_classCallCheck(this, DraftDropdownMenu);
|
|
16
|
+
_this = _super.call(this, props);
|
|
17
|
+
_this.registerEventHandler = function () {
|
|
18
|
+
document.addEventListener('click', _this.onHideDraftDropdownMenu);
|
|
19
|
+
};
|
|
20
|
+
_this.unregisterEventHandler = function () {
|
|
21
|
+
document.removeEventListener('click', _this.onHideDraftDropdownMenu);
|
|
22
|
+
};
|
|
23
|
+
_this.onHideDraftDropdownMenu = function () {
|
|
24
|
+
_this.setState({
|
|
25
|
+
isDropdownMenuOpen: false
|
|
26
|
+
}, function () {
|
|
27
|
+
_this.unregisterEventHandler();
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
_this.onToggleClick = function (event) {
|
|
31
|
+
event.stopPropagation();
|
|
32
|
+
event.nativeEvent.stopImmediatePropagation();
|
|
33
|
+
var isDropdownMenuOpen = !_this.state.isDropdownMenuOpen;
|
|
34
|
+
if (isDropdownMenuOpen) {
|
|
35
|
+
_this.setState({
|
|
36
|
+
isDropdownMenuOpen: isDropdownMenuOpen
|
|
37
|
+
}, function () {
|
|
38
|
+
_this.registerEventHandler();
|
|
39
|
+
});
|
|
40
|
+
} else {
|
|
41
|
+
_this.setState({
|
|
42
|
+
isDropdownMenuOpen: isDropdownMenuOpen
|
|
43
|
+
}, function () {
|
|
44
|
+
_this.unregisterEventHandler();
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
_this.unmark = function () {
|
|
49
|
+
var eventBus = EventBus.getInstance();
|
|
50
|
+
eventBus.dispatch(EXTERNAL_EVENT.UNMARK_AS_DRAFT);
|
|
51
|
+
};
|
|
52
|
+
_this.state = {
|
|
53
|
+
isDropdownMenuOpen: false
|
|
54
|
+
};
|
|
55
|
+
return _this;
|
|
56
|
+
}
|
|
57
|
+
_createClass(DraftDropdownMenu, [{
|
|
58
|
+
key: "render",
|
|
59
|
+
value: function render() {
|
|
60
|
+
var isDropdownMenuOpen = this.state.isDropdownMenuOpen;
|
|
61
|
+
var t = this.props.t;
|
|
62
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
63
|
+
className: "sdoc-draft-menu"
|
|
64
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
65
|
+
className: "draft-toggle sdoc-draft-identifier",
|
|
66
|
+
onClick: this.onToggleClick
|
|
67
|
+
}, t('Draft')), isDropdownMenuOpen && /*#__PURE__*/React.createElement("ul", {
|
|
68
|
+
className: "draft-popover list-unstyled m-0"
|
|
69
|
+
}, /*#__PURE__*/React.createElement("li", {
|
|
70
|
+
className: "draft-menu-item",
|
|
71
|
+
onClick: this.unmark
|
|
72
|
+
}, t('Unmark_as_draft'))));
|
|
73
|
+
}
|
|
74
|
+
}]);
|
|
75
|
+
return DraftDropdownMenu;
|
|
76
|
+
}(React.Component);
|
|
77
|
+
export default withTranslation('sdoc-editor')(DraftDropdownMenu);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
.sdoc-draft-menu {
|
|
2
|
+
position: relative;
|
|
3
|
+
margin-left: 0.5rem;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.sdoc-draft-identifier {
|
|
7
|
+
display: inline-block;
|
|
8
|
+
font-size: 14px;
|
|
9
|
+
color: #888;
|
|
10
|
+
background: #eee;
|
|
11
|
+
padding: 0 8px;
|
|
12
|
+
height: 20px;
|
|
13
|
+
line-height: 20px;
|
|
14
|
+
border-radius: 10px;
|
|
15
|
+
cursor: pointer;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.sdoc-draft-identifier:hover {
|
|
19
|
+
background: #dbdbdb;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.sdoc-draft-menu .draft-popover {
|
|
23
|
+
position: absolute;
|
|
24
|
+
top: 25px;
|
|
25
|
+
left: 0;
|
|
26
|
+
width: 178px;
|
|
27
|
+
background-color: #fff;
|
|
28
|
+
border: 1px solid #e5e6e8;
|
|
29
|
+
border-radius: 2px;
|
|
30
|
+
padding: 8px 0;
|
|
31
|
+
box-shadow: 0 0 10px #e5e6e8;
|
|
32
|
+
z-index: 10;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.sdoc-draft-menu .draft-popover .draft-menu-item {
|
|
36
|
+
cursor: pointer;
|
|
37
|
+
width: 100%;
|
|
38
|
+
padding: 4px 12px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.sdoc-draft-menu .draft-popover .draft-menu-item:hover {
|
|
42
|
+
background-color: rgb(245, 245, 245);
|
|
43
|
+
}
|
|
@@ -12,12 +12,15 @@ var MoreDropdownMenu = /*#__PURE__*/function (_React$Component) {
|
|
|
12
12
|
_classCallCheck(this, MoreDropdownMenu);
|
|
13
13
|
_this = _super.call(this, props);
|
|
14
14
|
_this.registerEventHandler = function () {
|
|
15
|
-
document.addEventListener('click', _this.onHideMoreDropdownMenu);
|
|
15
|
+
document.addEventListener('click', _this.onHideMoreDropdownMenu, true);
|
|
16
16
|
};
|
|
17
17
|
_this.unregisterEventHandler = function () {
|
|
18
|
-
document.removeEventListener('click', _this.onHideMoreDropdownMenu);
|
|
18
|
+
document.removeEventListener('click', _this.onHideMoreDropdownMenu, true);
|
|
19
19
|
};
|
|
20
|
-
_this.onHideMoreDropdownMenu = function () {
|
|
20
|
+
_this.onHideMoreDropdownMenu = function (e) {
|
|
21
|
+
var menu = _this.menu;
|
|
22
|
+
var clickIsInMenu = menu && menu.contains(e.target) && menu !== e.target;
|
|
23
|
+
if (clickIsInMenu) return;
|
|
21
24
|
_this.setState({
|
|
22
25
|
isDropdownMenuOpen: false
|
|
23
26
|
}, function () {
|
|
@@ -42,6 +45,9 @@ var MoreDropdownMenu = /*#__PURE__*/function (_React$Component) {
|
|
|
42
45
|
});
|
|
43
46
|
}
|
|
44
47
|
};
|
|
48
|
+
_this.setMenuRef = function (ref) {
|
|
49
|
+
_this.menu = ref;
|
|
50
|
+
};
|
|
45
51
|
_this.state = {
|
|
46
52
|
isDropdownMenuOpen: false
|
|
47
53
|
};
|
|
@@ -59,6 +65,7 @@ var MoreDropdownMenu = /*#__PURE__*/function (_React$Component) {
|
|
|
59
65
|
}, /*#__PURE__*/React.createElement("span", {
|
|
60
66
|
className: "sdocfont sdoc-more"
|
|
61
67
|
})), isDropdownMenuOpen && /*#__PURE__*/React.createElement("div", {
|
|
68
|
+
ref: this.setMenuRef,
|
|
62
69
|
className: "more-popover"
|
|
63
70
|
}, this.props.children));
|
|
64
71
|
}
|
package/dist/constants/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export var EXTERNAL_EVENT = {
|
|
2
2
|
INTERNAL_LINK_CLICK: 'internal_link_click',
|
|
3
3
|
TOGGLE_STAR: 'toggle_star',
|
|
4
|
-
|
|
4
|
+
UNMARK_AS_DRAFT: 'unmark_as_draft',
|
|
5
|
+
CANCEL_TABLE_SELECT_RANGE: 'cancel_table_select_range',
|
|
6
|
+
SET_TABLE_SELECT_RANGE: 'set_table_select_range'
|
|
5
7
|
};
|
|
6
8
|
export var PAGE_EDIT_AREA_WIDTH = 672; // 672 = 794 - 2[borderLeft + borderRight] - 120[paddingLeft + paddingRight]
|
|
@@ -12,6 +12,7 @@ import DiffViewer from './diff-viewer';
|
|
|
12
12
|
import '../assets/css/simple-editor.css';
|
|
13
13
|
var SimpleEditor = function SimpleEditor(_ref) {
|
|
14
14
|
var isStarred = _ref.isStarred,
|
|
15
|
+
isDraft = _ref.isDraft,
|
|
15
16
|
t = _ref.t;
|
|
16
17
|
var _useState = useState(true),
|
|
17
18
|
_useState2 = _slicedToArray(_useState, 2),
|
|
@@ -123,6 +124,7 @@ var SimpleEditor = function SimpleEditor(_ref) {
|
|
|
123
124
|
}
|
|
124
125
|
return /*#__PURE__*/React.createElement(Layout, null, /*#__PURE__*/React.createElement(Header, null, /*#__PURE__*/React.createElement(DocInfo, {
|
|
125
126
|
isStarred: isStarred,
|
|
127
|
+
isDraft: isDraft,
|
|
126
128
|
isEditMode: !isShowChanges
|
|
127
129
|
}), /*#__PURE__*/React.createElement(DocOperations, {
|
|
128
130
|
isShowChanges: isShowChanges,
|
package/dist/utils/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import DateUtils from './date-utils';
|
|
2
|
+
import LocalStorage from './local-storage-utils';
|
|
2
3
|
export var getDirPath = function getDirPath(path) {
|
|
3
4
|
var dir = path.slice(0, path.lastIndexOf('/'));
|
|
4
5
|
if (dir === '') {
|
|
@@ -39,4 +40,4 @@ export var getErrorMsg = function getErrorMsg(error) {
|
|
|
39
40
|
}
|
|
40
41
|
return errorMsg;
|
|
41
42
|
};
|
|
42
|
-
export { DateUtils };
|
|
43
|
+
export { DateUtils, LocalStorage };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
2
|
+
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
3
|
+
var LocalStorage = /*#__PURE__*/function () {
|
|
4
|
+
function LocalStorage() {
|
|
5
|
+
_classCallCheck(this, LocalStorage);
|
|
6
|
+
}
|
|
7
|
+
_createClass(LocalStorage, null, [{
|
|
8
|
+
key: "setItem",
|
|
9
|
+
value: function setItem(key, value) {
|
|
10
|
+
return window.localStorage.setItem(key, JSON.stringify(value));
|
|
11
|
+
}
|
|
12
|
+
}, {
|
|
13
|
+
key: "getItem",
|
|
14
|
+
value: function getItem(key, defaultValue) {
|
|
15
|
+
return JSON.parse(window.localStorage.getItem(key)) || defaultValue;
|
|
16
|
+
}
|
|
17
|
+
}, {
|
|
18
|
+
key: "removeItem",
|
|
19
|
+
value: function removeItem(key) {
|
|
20
|
+
return window.localStorage.removeItem(key);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//The setExpire and getExpire methods used to satisfy some cases that need to be updated regularly
|
|
24
|
+
}, {
|
|
25
|
+
key: "setExpire",
|
|
26
|
+
value: function setExpire(key, value, expire) {
|
|
27
|
+
var obj = {
|
|
28
|
+
data: value,
|
|
29
|
+
time: Date.now(),
|
|
30
|
+
expire: expire
|
|
31
|
+
};
|
|
32
|
+
this.setItem(key, JSON.stringify(obj));
|
|
33
|
+
}
|
|
34
|
+
}, {
|
|
35
|
+
key: "getExpire",
|
|
36
|
+
value: function getExpire(key) {
|
|
37
|
+
var val = this.getItem(key);
|
|
38
|
+
if (!val) return val;
|
|
39
|
+
val = JSON.parse(val);
|
|
40
|
+
if (Date.now() - val.time > val.expire) {
|
|
41
|
+
this.removeItem(key);
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
return val.data;
|
|
45
|
+
}
|
|
46
|
+
}]);
|
|
47
|
+
return LocalStorage;
|
|
48
|
+
}();
|
|
49
|
+
export default LocalStorage;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.84",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "This is a sdoc editor",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"lodash.throttle": "4.1.1",
|
|
20
20
|
"randomcolor": "0.6.2",
|
|
21
21
|
"prismjs": "^1.29.0",
|
|
22
|
+
"react-color": "2.19.3",
|
|
22
23
|
"react-cookies": "0.1.1",
|
|
23
24
|
"reactstrap": "8.9.0",
|
|
24
25
|
"slugid": "3.2.0",
|
|
@@ -260,5 +260,50 @@
|
|
|
260
260
|
"Start_revise": "Start revise",
|
|
261
261
|
"Failed_to_execute_operation_on_server": "Failed to execute operation on server",
|
|
262
262
|
"Start_revise_tip": "Create a temporary document and modify on it, merge it back after reviewing changes",
|
|
263
|
-
"Load_doc_content_error": "Load doc content error"
|
|
263
|
+
"Load_doc_content_error": "Load doc content error",
|
|
264
|
+
"Draft": "Draft",
|
|
265
|
+
"Unmark_as_draft": "Unmark as draft",
|
|
266
|
+
"Background_color": "Background color",
|
|
267
|
+
"No_color": "No color",
|
|
268
|
+
"Standard_color": "Standard color",
|
|
269
|
+
"Recently_used": "Recently used",
|
|
270
|
+
"More_color": "More color",
|
|
271
|
+
"White": "White",
|
|
272
|
+
"Black": "Black",
|
|
273
|
+
"Blue_grey": "Blue_grey",
|
|
274
|
+
"Blue": "Blue",
|
|
275
|
+
"Sky_blue": "Sky_blue",
|
|
276
|
+
"Green": "Green",
|
|
277
|
+
"Red": "Red",
|
|
278
|
+
"Orange": "Orange",
|
|
279
|
+
"Yellow": "Yellow",
|
|
280
|
+
"Purple": "Purple",
|
|
281
|
+
"Light_grey_x": "Light grey {{value}}",
|
|
282
|
+
"Dark_grey_x": "Dark grey {{value}}",
|
|
283
|
+
"Light_blue_grey_x": "Light blue grey {{value}}",
|
|
284
|
+
"Light_blue_x": "Light blue {{value}}",
|
|
285
|
+
"Light_sky_blue_x": "Light sky blue {{value}}",
|
|
286
|
+
"Light_green_x": "Light green {{value}}",
|
|
287
|
+
"Light_red_x": "Light red {{value}}",
|
|
288
|
+
"Light_orange_x": "Light orange {{value}}",
|
|
289
|
+
"Light_yellow_x": "Light yellow {{value}}",
|
|
290
|
+
"Light_purple_x": "Light purple {{value}}",
|
|
291
|
+
"Dark_blue_grey_x": "Dark blue grey {{value}}",
|
|
292
|
+
"Dark_blue_x": "Dark blue {{value}}",
|
|
293
|
+
"Dark_sky_blue_x": "Dark sky blue {{value}}",
|
|
294
|
+
"Dark_green_x": "Dark green {{value}}",
|
|
295
|
+
"Dark_red_x": "Dark red {{value}}",
|
|
296
|
+
"Dark_orange_x": "Dark orange {{value}}",
|
|
297
|
+
"Dark_yellow_x": "Dark yellow {{value}}",
|
|
298
|
+
"Dark_purple_x": "Dark purple {{value}}",
|
|
299
|
+
"Standard_dark_red": "Standard dark red",
|
|
300
|
+
"Standard_red": "Standard red",
|
|
301
|
+
"Standard_orange": "Standard orange",
|
|
302
|
+
"Standard_yellow": "Standard yellow",
|
|
303
|
+
"Standard_light_green": "Standard light green",
|
|
304
|
+
"Standard_green": "Standard green",
|
|
305
|
+
"Standard_light_blue": "Standard light blue",
|
|
306
|
+
"Standard_blue": "Standard blue",
|
|
307
|
+
"Standard_dark_blue": "Standard dark blue",
|
|
308
|
+
"Standard_purple": "Standard purple"
|
|
264
309
|
}
|