@seafile/sdoc-editor 3.0.3 → 3.0.5
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/android/constants.js +5 -1
- package/dist/android/dispatch-content-select-event.js +41 -0
- package/dist/android/dispatch-system-event.js +20 -0
- package/dist/android/js-bridge.js +4 -3
- package/dist/android/mobile-message.js +119 -0
- package/dist/android/toolbar-trigger.js +59 -0
- package/dist/assets/css/layout.css +1 -2
- package/dist/comment/components/comment-list.css +1 -0
- package/dist/comment/components/editor-comment.js +19 -19
- package/dist/comment/provider/comment-context-provider.js +1 -0
- package/dist/editor/editable-article.js +1 -0
- package/dist/editor/sdoc-editor.js +11 -2
- package/dist/extension/constants/element-type.js +1 -1
- package/dist/extension/core/queries/index.js +30 -4
- package/dist/extension/plugins/text-style/helpers.js +16 -1
- package/dist/extension/plugins/text-style/render-elem.js +5 -1
- package/dist/extension/render/render-leaf.js +17 -1
- package/package.json +2 -2
|
@@ -7,5 +7,9 @@ exports.ACTION_TYPES = void 0;
|
|
|
7
7
|
var ACTION_TYPES = exports.ACTION_TYPES = {
|
|
8
8
|
GET_OUTLINE: 'sdoc.outline.data.get',
|
|
9
9
|
SELECT_OUTLINE: 'sdoc.outline.data.select',
|
|
10
|
-
EDITOR_ACTION_TRANSFER: 'sdoc.editor.data.edit'
|
|
10
|
+
EDITOR_ACTION_TRANSFER: 'sdoc.editor.data.edit',
|
|
11
|
+
TOOLBAR_MENU_TRIGGER: 'sdoc.toolbar.menu.trigger',
|
|
12
|
+
EDITOR_CONTENT_SELECT: 'sdoc.editor.content.select',
|
|
13
|
+
EDITOR_OPERATION_EXECUTE: 'sdoc.editor.operation.execute',
|
|
14
|
+
EDITOR_SYSTEM_EVENT: 'sdoc.editor.system.event'
|
|
11
15
|
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.dispatchContentSelectEvent = void 0;
|
|
8
|
+
var _constants = require("../extension/constants");
|
|
9
|
+
var _core = require("../extension/core");
|
|
10
|
+
var _constants2 = require("./constants");
|
|
11
|
+
var _jsBridge = _interopRequireDefault(require("./js-bridge"));
|
|
12
|
+
var dispatchContentSelectEvent = exports.dispatchContentSelectEvent = function dispatchContentSelectEvent(editor) {
|
|
13
|
+
var topBlockEntry = (0, _core.getTopLevelBlockNode)(editor);
|
|
14
|
+
if (!topBlockEntry) return;
|
|
15
|
+
var topNode = topBlockEntry[0];
|
|
16
|
+
var topType = topNode.type;
|
|
17
|
+
if (topType === _constants.MULTI_COLUMN) {
|
|
18
|
+
var selection = editor.selection;
|
|
19
|
+
var currentNodeInColumn = (0, _core.getNode)(editor, selection.anchor.path.slice(0, 3));
|
|
20
|
+
topType = currentNodeInColumn.type;
|
|
21
|
+
}
|
|
22
|
+
// content select
|
|
23
|
+
var selectData = {
|
|
24
|
+
v: 2,
|
|
25
|
+
action: _constants2.ACTION_TYPES.EDITOR_CONTENT_SELECT,
|
|
26
|
+
data: JSON.stringify({
|
|
27
|
+
type: topType
|
|
28
|
+
})
|
|
29
|
+
};
|
|
30
|
+
_jsBridge["default"].callAndroidFunction(JSON.stringify(selectData));
|
|
31
|
+
|
|
32
|
+
// op execute
|
|
33
|
+
var opData = {
|
|
34
|
+
v: 2,
|
|
35
|
+
action: _constants2.ACTION_TYPES.EDITOR_OPERATION_EXECUTE,
|
|
36
|
+
data: JSON.stringify({
|
|
37
|
+
type: 'op-execute'
|
|
38
|
+
})
|
|
39
|
+
};
|
|
40
|
+
_jsBridge["default"].callAndroidFunction(JSON.stringify(opData));
|
|
41
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.dispatchSystemEvent = void 0;
|
|
8
|
+
var _constants = require("./constants");
|
|
9
|
+
var _jsBridge = _interopRequireDefault(require("./js-bridge"));
|
|
10
|
+
var dispatchSystemEvent = exports.dispatchSystemEvent = function dispatchSystemEvent(message_type) {
|
|
11
|
+
// op execute
|
|
12
|
+
var opData = {
|
|
13
|
+
v: 2,
|
|
14
|
+
action: _constants.ACTION_TYPES.EDITOR_SYSTEM_EVENT,
|
|
15
|
+
data: JSON.stringify({
|
|
16
|
+
type: message_type
|
|
17
|
+
})
|
|
18
|
+
};
|
|
19
|
+
_jsBridge["default"].callAndroidFunction(JSON.stringify(opData));
|
|
20
|
+
};
|
|
@@ -11,12 +11,13 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/es
|
|
|
11
11
|
var JSBridge = /*#__PURE__*/(0, _createClass2["default"])(function JSBridge() {
|
|
12
12
|
var _this = this;
|
|
13
13
|
(0, _classCallCheck2["default"])(this, JSBridge);
|
|
14
|
-
(0, _defineProperty2["default"])(this, "init", function () {
|
|
14
|
+
(0, _defineProperty2["default"])(this, "init", function (editor) {
|
|
15
15
|
if (window.WebViewJavascriptBridge) {
|
|
16
16
|
_this.initWebViewJavascriptBridge();
|
|
17
17
|
} else {
|
|
18
18
|
document.addEventListener('WebViewJavascriptBridgeReady', _this.initWebViewJavascriptBridge, false);
|
|
19
19
|
}
|
|
20
|
+
_this.editor = editor;
|
|
20
21
|
_this.initJSEventHandler();
|
|
21
22
|
});
|
|
22
23
|
(0, _defineProperty2["default"])(this, "finishPage", function () {
|
|
@@ -41,7 +42,7 @@ var JSBridge = /*#__PURE__*/(0, _createClass2["default"])(function JSBridge() {
|
|
|
41
42
|
}
|
|
42
43
|
if (!parsedData) {
|
|
43
44
|
responseCallback(JSON.stringify({
|
|
44
|
-
success:
|
|
45
|
+
success: false
|
|
45
46
|
}));
|
|
46
47
|
return;
|
|
47
48
|
}
|
|
@@ -59,7 +60,7 @@ var JSBridge = /*#__PURE__*/(0, _createClass2["default"])(function JSBridge() {
|
|
|
59
60
|
success: false
|
|
60
61
|
}));
|
|
61
62
|
}
|
|
62
|
-
var execActionSucceed = eventHandler(params);
|
|
63
|
+
var execActionSucceed = eventHandler(params, _this.editor);
|
|
63
64
|
if (execActionSucceed) {
|
|
64
65
|
responseCallback(JSON.stringify({
|
|
65
66
|
success: true
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/classCallCheck"));
|
|
9
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createClass"));
|
|
10
|
+
var _callSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/callSuper"));
|
|
11
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/inherits"));
|
|
12
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/defineProperty"));
|
|
13
|
+
var _react = _interopRequireDefault(require("react"));
|
|
14
|
+
var _eventBus = _interopRequireDefault(require("../utils/event-bus"));
|
|
15
|
+
var _dispatchSystemEvent = require("./dispatch-system-event");
|
|
16
|
+
var MobileMessage = /*#__PURE__*/function (_React$Component) {
|
|
17
|
+
function MobileMessage(props) {
|
|
18
|
+
var _this;
|
|
19
|
+
(0, _classCallCheck2["default"])(this, MobileMessage);
|
|
20
|
+
_this = (0, _callSuper2["default"])(this, MobileMessage, [props]);
|
|
21
|
+
(0, _defineProperty2["default"])(_this, "onOperationExecuteError", function () {
|
|
22
|
+
var message = 'failed_to_execute_operation_on_server';
|
|
23
|
+
(0, _dispatchSystemEvent.dispatchSystemEvent)(message);
|
|
24
|
+
});
|
|
25
|
+
(0, _defineProperty2["default"])(_this, "onSyncServerOperationError", function () {
|
|
26
|
+
var message = 'failed_to_sync_with_server_operations';
|
|
27
|
+
(0, _dispatchSystemEvent.dispatchSystemEvent)(message);
|
|
28
|
+
});
|
|
29
|
+
(0, _defineProperty2["default"])(_this, "onInternalServerExecError", function () {
|
|
30
|
+
var message = 'internal_server_exec_operations_error';
|
|
31
|
+
(0, _dispatchSystemEvent.dispatchSystemEvent)(message);
|
|
32
|
+
});
|
|
33
|
+
(0, _defineProperty2["default"])(_this, "onTokenExpiredError", function (msg) {
|
|
34
|
+
var message = 'token_expired_Please_refresh_the_page';
|
|
35
|
+
(0, _dispatchSystemEvent.dispatchSystemEvent)(message);
|
|
36
|
+
});
|
|
37
|
+
(0, _defineProperty2["default"])(_this, "onPendingOpExceedLimit", function () {
|
|
38
|
+
var message = 'pending_operations_exceed_limit';
|
|
39
|
+
(0, _dispatchSystemEvent.dispatchSystemEvent)(message);
|
|
40
|
+
});
|
|
41
|
+
(0, _defineProperty2["default"])(_this, "onDisconnect", function () {
|
|
42
|
+
var message = 'server_is_not_connected_operation_will_be_sent_to_server_later';
|
|
43
|
+
(0, _dispatchSystemEvent.dispatchSystemEvent)(message);
|
|
44
|
+
});
|
|
45
|
+
(0, _defineProperty2["default"])(_this, "onReconnectError", function () {
|
|
46
|
+
if (!_this.isConnectError) {
|
|
47
|
+
_this.isConnectError = true;
|
|
48
|
+
var message = 'server_is_disconnected_reconnecting';
|
|
49
|
+
(0, _dispatchSystemEvent.dispatchSystemEvent)(message);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
(0, _defineProperty2["default"])(_this, "onConnect", function () {
|
|
53
|
+
_this.isConnectError = false;
|
|
54
|
+
});
|
|
55
|
+
(0, _defineProperty2["default"])(_this, "onReconnect", function () {
|
|
56
|
+
_this.isConnectError = false;
|
|
57
|
+
var message = 'server_is_reconnected';
|
|
58
|
+
(0, _dispatchSystemEvent.dispatchSystemEvent)(message);
|
|
59
|
+
});
|
|
60
|
+
(0, _defineProperty2["default"])(_this, "onDocumentSaving", function () {
|
|
61
|
+
var message = 'document_is_saving';
|
|
62
|
+
(0, _dispatchSystemEvent.dispatchSystemEvent)(message);
|
|
63
|
+
});
|
|
64
|
+
(0, _defineProperty2["default"])(_this, "onDocumentSaved", function () {
|
|
65
|
+
var message = 'document_is_saved';
|
|
66
|
+
(0, _dispatchSystemEvent.dispatchSystemEvent)(message);
|
|
67
|
+
});
|
|
68
|
+
(0, _defineProperty2["default"])(_this, "render", function () {
|
|
69
|
+
return null;
|
|
70
|
+
});
|
|
71
|
+
_this.state = {
|
|
72
|
+
isSaved: false,
|
|
73
|
+
isSaving: false,
|
|
74
|
+
lastSavedAt: ''
|
|
75
|
+
};
|
|
76
|
+
_this.saveTimer = null;
|
|
77
|
+
return _this;
|
|
78
|
+
}
|
|
79
|
+
(0, _inherits2["default"])(MobileMessage, _React$Component);
|
|
80
|
+
return (0, _createClass2["default"])(MobileMessage, [{
|
|
81
|
+
key: "componentDidMount",
|
|
82
|
+
value: function componentDidMount() {
|
|
83
|
+
var eventBus = _eventBus["default"].getInstance();
|
|
84
|
+
this.unsubscribeSavingEvent = eventBus.subscribe('is-saving', this.onDocumentSaving);
|
|
85
|
+
this.unsubscribeSavedEvent = eventBus.subscribe('saved', this.onDocumentSaved);
|
|
86
|
+
this.unsubscribeSavedEvent = eventBus.subscribe('connect', this.onConnect);
|
|
87
|
+
// offline reconnect
|
|
88
|
+
this.unsubscribeDisconnectEvent = eventBus.subscribe('disconnect', this.onDisconnect);
|
|
89
|
+
this.unsubscribeReconnectErrorEvent = eventBus.subscribe('reconnect_error', this.onReconnectError);
|
|
90
|
+
this.unsubscribeReconnectEvent = eventBus.subscribe('reconnect', this.onReconnect);
|
|
91
|
+
|
|
92
|
+
// server return error
|
|
93
|
+
this.unsubscribeOpExecError = eventBus.subscribe('execute_client_operations_error', this.onOperationExecuteError);
|
|
94
|
+
this.unsubscribeSyncServerOpError = eventBus.subscribe('sync_server_operations_error', this.onSyncServerOperationError);
|
|
95
|
+
this.unsubscribeDocumentLoadError = eventBus.subscribe('load_document_content_error', this.onInternalServerExecError);
|
|
96
|
+
this.unsubscribeOperationsSaveError = eventBus.subscribe('save_operations_to_database_error', this.onInternalServerExecError);
|
|
97
|
+
this.unsubscribeOperationsSaveError = eventBus.subscribe('token_expired', this.onTokenExpiredError);
|
|
98
|
+
|
|
99
|
+
// local error
|
|
100
|
+
this.unsubscribePendingOpExceedLimit = eventBus.subscribe('pending_operations_exceed_limit', this.onPendingOpExceedLimit);
|
|
101
|
+
}
|
|
102
|
+
}, {
|
|
103
|
+
key: "componentWillUnmount",
|
|
104
|
+
value: function componentWillUnmount() {
|
|
105
|
+
this.unsubscribeSavingEvent();
|
|
106
|
+
this.unsubscribeSavedEvent();
|
|
107
|
+
this.unsubscribeDisconnectEvent();
|
|
108
|
+
this.unsubscribeReconnectErrorEvent();
|
|
109
|
+
this.unsubscribeReconnectEvent();
|
|
110
|
+
this.unsubscribeOpExecError();
|
|
111
|
+
this.unsubscribeSyncServerOpError();
|
|
112
|
+
this.unsubscribePendingOpExceedLimit();
|
|
113
|
+
this.unsubscribeDocumentLoadError();
|
|
114
|
+
this.unsubscribeOperationsSaveError();
|
|
115
|
+
clearTimeout(this.saveTimer);
|
|
116
|
+
}
|
|
117
|
+
}]);
|
|
118
|
+
}(_react["default"].Component);
|
|
119
|
+
var _default = exports["default"] = MobileMessage;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.updateEditorHistory = exports.registerToolbarMenuTrigger = void 0;
|
|
8
|
+
var _constants = require("../extension/constants");
|
|
9
|
+
var _core = require("../extension/core");
|
|
10
|
+
var _helpers = require("../extension/plugins/check-list/helpers");
|
|
11
|
+
var _helpers2 = require("../extension/plugins/header/helpers");
|
|
12
|
+
var _helpers3 = require("../extension/plugins/list/helpers");
|
|
13
|
+
var _constants2 = require("./constants");
|
|
14
|
+
var _jsBridge = _interopRequireDefault(require("./js-bridge"));
|
|
15
|
+
var headerTypes = [_constants.ELEMENT_TYPE.TITLE, _constants.ELEMENT_TYPE.SUBTITLE, _constants.ELEMENT_TYPE.HEADER1, _constants.ELEMENT_TYPE.HEADER2, _constants.ELEMENT_TYPE.HEADER3, _constants.ELEMENT_TYPE.HEADER4, _constants.ELEMENT_TYPE.HEADER5, _constants.ELEMENT_TYPE.HEADER6, _constants.ELEMENT_TYPE.PARAGRAPH];
|
|
16
|
+
var onToolbarTrigger = function onToolbarTrigger(data, editor) {
|
|
17
|
+
var type = data.type;
|
|
18
|
+
if (headerTypes.includes(type)) {
|
|
19
|
+
var nodeEntry = (0, _core.getNearestBlockNode)(editor);
|
|
20
|
+
if (!nodeEntry) return;
|
|
21
|
+
var newType = type;
|
|
22
|
+
if (nodeEntry[0].type === type) {
|
|
23
|
+
newType = _constants.PARAGRAPH;
|
|
24
|
+
}
|
|
25
|
+
(0, _helpers2.setHeaderType)(editor, newType);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (type === _constants.UNDO) {
|
|
29
|
+
editor.undo();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (type === _constants.REDO) {
|
|
33
|
+
editor.redo();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (type === _constants.UNORDERED_LIST || type === _constants.ORDERED_LIST) {
|
|
37
|
+
(0, _helpers3.setListType)(editor, type);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (type === _constants.CHECK_LIST_ITEM) {
|
|
41
|
+
var _nodeEntry = (0, _core.getNearestBlockNode)(editor);
|
|
42
|
+
if (!_nodeEntry) return;
|
|
43
|
+
var _newType = type;
|
|
44
|
+
if (_nodeEntry[0].type === type) {
|
|
45
|
+
_newType = _constants.PARAGRAPH;
|
|
46
|
+
}
|
|
47
|
+
(0, _helpers.setCheckListItemType)(editor, _newType);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var updateEditorHistory = exports.updateEditorHistory = function updateEditorHistory(editor) {
|
|
52
|
+
if (!window.seadroid) {
|
|
53
|
+
window.seadroid = {};
|
|
54
|
+
}
|
|
55
|
+
window.seadroid['history'] = editor.history;
|
|
56
|
+
};
|
|
57
|
+
var registerToolbarMenuTrigger = exports.registerToolbarMenuTrigger = function registerToolbarMenuTrigger() {
|
|
58
|
+
_jsBridge["default"].registerEventHandler(_constants2.ACTION_TYPES.TOOLBAR_MENU_TRIGGER, onToolbarTrigger);
|
|
59
|
+
};
|
|
@@ -73,7 +73,6 @@
|
|
|
73
73
|
|
|
74
74
|
.sdoc-editor-container .sdoc-editor-toolbar {
|
|
75
75
|
display: flex;
|
|
76
|
-
flex: 1;
|
|
77
76
|
justify-content: center;
|
|
78
77
|
position: relative;
|
|
79
78
|
height: 44px;
|
|
@@ -96,7 +95,7 @@
|
|
|
96
95
|
|
|
97
96
|
.sdoc-content-wrapper {
|
|
98
97
|
width: 100%;
|
|
99
|
-
|
|
98
|
+
flex: 1;
|
|
100
99
|
display: flex;
|
|
101
100
|
}
|
|
102
101
|
|
|
@@ -65,32 +65,32 @@ var EditorComment = function EditorComment(_ref) {
|
|
|
65
65
|
var unresolvedComments = element_comments_map[elementId].filter(function (item) {
|
|
66
66
|
return !item.resolved;
|
|
67
67
|
});
|
|
68
|
+
setIsShowComments(true);
|
|
68
69
|
setCommentDetail((0, _objectSpread2["default"])({}, unresolvedComments));
|
|
69
70
|
setIsClickedContextComment(false);
|
|
71
|
+
return;
|
|
70
72
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
var
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (elementId.includes(comment.detail.text_comment_id)) {
|
|
82
|
-
clickedComments.push(comment);
|
|
83
|
-
}
|
|
73
|
+
var clickedComments = [];
|
|
74
|
+
for (var _i = 0, _Object$values = Object.values(editor.element_comments_map); _i < _Object$values.length; _i++) {
|
|
75
|
+
var comments = _Object$values[_i];
|
|
76
|
+
var _iterator = (0, _createForOfIteratorHelper2["default"])(comments),
|
|
77
|
+
_step;
|
|
78
|
+
try {
|
|
79
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
80
|
+
var comment = _step.value;
|
|
81
|
+
if (elementId.includes(comment.detail.text_comment_id)) {
|
|
82
|
+
clickedComments.push(comment);
|
|
84
83
|
}
|
|
85
|
-
} catch (err) {
|
|
86
|
-
_iterator.e(err);
|
|
87
|
-
} finally {
|
|
88
|
-
_iterator.f();
|
|
89
84
|
}
|
|
85
|
+
} catch (err) {
|
|
86
|
+
_iterator.e(err);
|
|
87
|
+
} finally {
|
|
88
|
+
_iterator.f();
|
|
90
89
|
}
|
|
91
|
-
setCommentDetail((0, _objectSpread2["default"])({}, clickedComments));
|
|
92
|
-
setIsClickedContextComment(true);
|
|
93
90
|
}
|
|
91
|
+
setIsShowComments(true);
|
|
92
|
+
setCommentDetail((0, _objectSpread2["default"])({}, clickedComments));
|
|
93
|
+
setIsClickedContextComment(true);
|
|
94
94
|
}, [editor, element_comments_map, hiddenComment]);
|
|
95
95
|
(0, _react.useEffect)(function () {
|
|
96
96
|
var handleHoverContextComment = function handleHoverContextComment(event) {
|
|
@@ -22,6 +22,7 @@ var CommentContextProvider = function CommentContextProvider(_ref) {
|
|
|
22
22
|
dispatch = _useReducer2[1];
|
|
23
23
|
(0, _useCommentMount.useCommentsMount)(dispatch);
|
|
24
24
|
(0, _react.useEffect)(function () {
|
|
25
|
+
editor.element_comments_map = {};
|
|
25
26
|
if (Object.keys(commentsInfo.element_comments_map).length) {
|
|
26
27
|
editor.element_comments_map = commentsInfo.element_comments_map;
|
|
27
28
|
var eventBus = _eventBus["default"].getInstance();
|
|
@@ -189,6 +189,7 @@ var EditableArticle = function EditableArticle(_ref) {
|
|
|
189
189
|
});
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
192
193
|
}, [editor.selection]);
|
|
193
194
|
var onKeyDown = (0, _react.useCallback)(function (event) {
|
|
194
195
|
var _scrollRef$current = scrollRef.current,
|
|
@@ -13,9 +13,12 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
13
13
|
var _slate = require("@seafile/slate");
|
|
14
14
|
var _deepCopy = _interopRequireDefault(require("deep-copy"));
|
|
15
15
|
var _isHotkey = _interopRequireDefault(require("is-hotkey"));
|
|
16
|
+
var _dispatchContentSelectEvent = require("../android/dispatch-content-select-event");
|
|
16
17
|
var _editorTitleBar = require("../android/editor-title-bar");
|
|
17
18
|
var _jsBridge = _interopRequireDefault(require("../android/js-bridge"));
|
|
19
|
+
var _mobileMessage = _interopRequireDefault(require("../android/mobile-message"));
|
|
18
20
|
var _outlineModule = require("../android/outline-module");
|
|
21
|
+
var _toolbarTrigger = require("../android/toolbar-trigger");
|
|
19
22
|
var _fileLoading = _interopRequireDefault(require("../components/file-loading"));
|
|
20
23
|
var _constants = require("../constants");
|
|
21
24
|
var _context = _interopRequireDefault(require("../context"));
|
|
@@ -120,10 +123,12 @@ var SdocEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
|
120
123
|
(0, _react.useEffect)(function () {
|
|
121
124
|
var mobileLogin = _context["default"].getSetting('mobileLogin');
|
|
122
125
|
if (mobileLogin) {
|
|
123
|
-
_jsBridge["default"].init();
|
|
126
|
+
_jsBridge["default"].init(validEditor);
|
|
124
127
|
(0, _outlineModule.registerOutlineEventHandler)();
|
|
125
128
|
(0, _editorTitleBar.registerTitleBarEventHandler)();
|
|
129
|
+
(0, _toolbarTrigger.registerToolbarMenuTrigger)();
|
|
126
130
|
(0, _outlineModule.updateOutlineValue)(document.elements);
|
|
131
|
+
(0, _toolbarTrigger.updateEditorHistory)(validEditor);
|
|
127
132
|
}
|
|
128
133
|
return function () {
|
|
129
134
|
_jsBridge["default"].finishPage();
|
|
@@ -236,6 +241,9 @@ var SdocEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
|
236
241
|
if (_commonUtils.isMobile) {
|
|
237
242
|
(0, _outlineModule.updateOutlineValue)(value);
|
|
238
243
|
}
|
|
244
|
+
if (_commonUtils.isMobile && isEdit) {
|
|
245
|
+
(0, _dispatchContentSelectEvent.dispatchContentSelectEvent)(validEditor);
|
|
246
|
+
}
|
|
239
247
|
};
|
|
240
248
|
var isFreezed = _context["default"].getSetting('isFreezed');
|
|
241
249
|
if (isReloading) {
|
|
@@ -280,6 +288,7 @@ var SdocEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
|
280
288
|
}))));
|
|
281
289
|
}
|
|
282
290
|
var isShowComment = typeof showComment === 'boolean' ? showComment : true;
|
|
291
|
+
var mobileLogin = _context["default"].getSetting('mobileLogin');
|
|
283
292
|
if (_commonUtils.isMobile && isEdit) {
|
|
284
293
|
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_layout.EditorContainer, {
|
|
285
294
|
editor: validEditor
|
|
@@ -293,7 +302,7 @@ var SdocEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
|
293
302
|
slateValue: slateValue,
|
|
294
303
|
updateSlateValue: onValueChange,
|
|
295
304
|
showComment: false
|
|
296
|
-
})), isShowHeaderToolbar && /*#__PURE__*/_react["default"].createElement(_extension.HeaderToolbar, {
|
|
305
|
+
})), mobileLogin && /*#__PURE__*/_react["default"].createElement(_mobileMessage["default"], null), !mobileLogin && isShowHeaderToolbar && /*#__PURE__*/_react["default"].createElement(_extension.HeaderToolbar, {
|
|
297
306
|
editor: validEditor,
|
|
298
307
|
isEdit: isEdit
|
|
299
308
|
}))), /*#__PURE__*/_react["default"].createElement(_insertElementDialog["default"], {
|
|
@@ -54,5 +54,5 @@ var FONT_SIZE_REDUCE = exports.FONT_SIZE_REDUCE = 'font-size-reduce';
|
|
|
54
54
|
|
|
55
55
|
// group
|
|
56
56
|
var GROUP = exports.GROUP = 'group';
|
|
57
|
-
var TOP_LEVEL_TYPES = exports.TOP_LEVEL_TYPES = [BLOCKQUOTE, HEADER1, HEADER2, HEADER3, HEADER4, HEADER5, HEADER6, ORDERED_LIST, UNORDERED_LIST, CHECK_LIST_ITEM, PARAGRAPH, CODE_BLOCK, TABLE];
|
|
57
|
+
var TOP_LEVEL_TYPES = exports.TOP_LEVEL_TYPES = [BLOCKQUOTE, TITLE, SUBTITLE, HEADER1, HEADER2, HEADER3, HEADER4, HEADER5, HEADER6, ORDERED_LIST, UNORDERED_LIST, CHECK_LIST_ITEM, PARAGRAPH, CODE_BLOCK, TABLE, IMAGE_BLOCK, VIDEO, WHITEBOARD];
|
|
58
58
|
var INLINE_LEVEL_TYPES = exports.INLINE_LEVEL_TYPES = [IMAGE, LINK, MENTION, MENTION_TEMP];
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.someNode = exports.isTopLevelListItem = exports.isTextNode = exports.isStartPoint = exports.isSelectionAtBlockStart = exports.isSelectionAtBlockEnd = exports.isRangeInSameBlock = exports.isRangeAcrossBlocks = exports.isMultiLevelList = exports.isMiddlePoint = exports.isLastNode = exports.isLastChild = exports.isHasImg = exports.isFirstChild = exports.isEndPoint = exports.isEmptyArticle = exports.isCursorAtBlockStart = exports.isCurrentLineHasText = exports.isCurrentLineEmpty = exports.isContainsVoidElement = exports.isBlockTextEmptyAfterSelection = exports.isBlockAboveEmpty = exports.isAncestorEmpty = exports.getTopLevelBlockNode = exports.getStartPoint = exports.getSelectedNodeEntryByType = exports.getSelectedNodeByTypes = exports.getSelectedNodeByType = exports.getSelectedElems = exports.getQueryOptions = exports.getPreviousPath = exports.getPrevNode = exports.getPointBefore = exports.getParentNode = exports.getNodes = exports.getNodeType = exports.getNodeEntries = exports.getNodeById = exports.getNode = exports.getNextSiblingNodes = exports.getNextNode = exports.getLastChildPath = exports.getLastChild = exports.getEndPoint = exports.getEditorString = exports.getDeepInlineChildren = exports.getCurrentNode = exports.getCommonNode = exports.getChildren = exports.getAboveNode = exports.getAboveBlockNode = exports.findPath = exports.findNode = exports.findDescendant = void 0;
|
|
7
|
+
exports.someNode = exports.isTopLevelListItem = exports.isTextNode = exports.isStartPoint = exports.isSelectionAtBlockStart = exports.isSelectionAtBlockEnd = exports.isRangeInSameBlock = exports.isRangeAcrossBlocks = exports.isMultiLevelList = exports.isMiddlePoint = exports.isLastNode = exports.isLastChild = exports.isHasImg = exports.isFirstChild = exports.isEndPoint = exports.isEmptyArticle = exports.isCursorAtBlockStart = exports.isCurrentLineHasText = exports.isCurrentLineEmpty = exports.isContainsVoidElement = exports.isBlockTextEmptyAfterSelection = exports.isBlockAboveEmpty = exports.isAncestorEmpty = exports.getTopLevelBlockNode = exports.getStartPoint = exports.getSelectedNodeEntryByType = exports.getSelectedNodeByTypes = exports.getSelectedNodeByType = exports.getSelectedElems = exports.getQueryOptions = exports.getPreviousPath = exports.getPrevNode = exports.getPointBefore = exports.getParentNode = exports.getNodes = exports.getNodeType = exports.getNodeEntries = exports.getNodeById = exports.getNode = exports.getNextSiblingNodes = exports.getNextNode = exports.getNearestBlockNode = exports.getLastChildPath = exports.getLastChild = exports.getEndPoint = exports.getEditorString = exports.getDeepInlineChildren = exports.getCurrentNode = exports.getCommonNode = exports.getChildren = exports.getAboveNode = exports.getAboveBlockNode = exports.findPath = exports.findNode = exports.findDescendant = void 0;
|
|
8
8
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectWithoutProperties"));
|
|
9
9
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
|
|
10
10
|
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createForOfIteratorHelper"));
|
|
@@ -261,6 +261,32 @@ var getTopLevelBlockNode = exports.getTopLevelBlockNode = function getTopLevelBl
|
|
|
261
261
|
}
|
|
262
262
|
});
|
|
263
263
|
};
|
|
264
|
+
var getNearestBlockNode = exports.getNearestBlockNode = function getNearestBlockNode(editor) {
|
|
265
|
+
if (!editor.selection) return null;
|
|
266
|
+
var LIST_TYPES = [_constants.UNORDERED_LIST, _constants.ORDERED_LIST];
|
|
267
|
+
var _Editor$nodes7 = _slate.Editor.nodes(editor, {
|
|
268
|
+
at: editor.selection,
|
|
269
|
+
match: function match(n) {
|
|
270
|
+
return _slate.Element.isElement(n) && _slate.Editor.isBlock(editor, n) && LIST_TYPES.includes(n.type);
|
|
271
|
+
},
|
|
272
|
+
mode: 'lowest'
|
|
273
|
+
}),
|
|
274
|
+
_Editor$nodes8 = (0, _slicedToArray2["default"])(_Editor$nodes7, 1),
|
|
275
|
+
nodeEntry = _Editor$nodes8[0];
|
|
276
|
+
if (nodeEntry) {
|
|
277
|
+
return nodeEntry;
|
|
278
|
+
}
|
|
279
|
+
var _Editor$nodes9 = _slate.Editor.nodes(editor, {
|
|
280
|
+
at: editor.selection,
|
|
281
|
+
match: function match(n) {
|
|
282
|
+
return _slate.Element.isElement(n) && _slate.Editor.isBlock(editor, n) && _constants.TOP_LEVEL_TYPES.includes(n.type);
|
|
283
|
+
},
|
|
284
|
+
mode: 'lowest'
|
|
285
|
+
}),
|
|
286
|
+
_Editor$nodes0 = (0, _slicedToArray2["default"])(_Editor$nodes9, 1),
|
|
287
|
+
nodeEntry2 = _Editor$nodes0[0];
|
|
288
|
+
return nodeEntry2 || null;
|
|
289
|
+
};
|
|
264
290
|
var getPrevNode = exports.getPrevNode = function getPrevNode(editor) {
|
|
265
291
|
var lowerNodeEntry = getAboveNode(editor, {
|
|
266
292
|
mode: 'lowest',
|
|
@@ -308,15 +334,15 @@ var getPrevNode = exports.getPrevNode = function getPrevNode(editor) {
|
|
|
308
334
|
};
|
|
309
335
|
var getCurrentNode = exports.getCurrentNode = function getCurrentNode(editor) {
|
|
310
336
|
if (!editor.selection) return null;
|
|
311
|
-
var _Editor$
|
|
337
|
+
var _Editor$nodes1 = _slate.Editor.nodes(editor, {
|
|
312
338
|
at: editor.selection,
|
|
313
339
|
match: function match(n) {
|
|
314
340
|
return _slate.Element.isElement(n) && _slate.Editor.isBlock(editor, n);
|
|
315
341
|
},
|
|
316
342
|
mode: 'lowest'
|
|
317
343
|
}),
|
|
318
|
-
_Editor$
|
|
319
|
-
nodeEntry = _Editor$
|
|
344
|
+
_Editor$nodes10 = (0, _slicedToArray2["default"])(_Editor$nodes1, 1),
|
|
345
|
+
nodeEntry = _Editor$nodes10[0];
|
|
320
346
|
return nodeEntry || null;
|
|
321
347
|
};
|
|
322
348
|
var getNextNode = exports.getNextNode = function getNextNode(editor) {
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.removeMark = exports.isMenuDisabled = exports.getValue = exports.addMark = void 0;
|
|
7
|
+
exports.removeMark = exports.isTextCommentExist = exports.isMenuDisabled = exports.getValue = exports.addMark = void 0;
|
|
8
8
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
9
9
|
var _slate = require("@seafile/slate");
|
|
10
10
|
var _elementType = require("../../constants/element-type");
|
|
@@ -64,4 +64,19 @@ var getValue = exports.getValue = function getValue(editor, mark) {
|
|
|
64
64
|
match = _Editor$nodes4[0];
|
|
65
65
|
return !!match;
|
|
66
66
|
}
|
|
67
|
+
};
|
|
68
|
+
var isTextCommentExist = exports.isTextCommentExist = function isTextCommentExist(commentClass, editor) {
|
|
69
|
+
if (!commentClass) return null;
|
|
70
|
+
if (!editor.element_comments_map) return null;
|
|
71
|
+
var commentId = commentClass.split('sdoc_comment_')[1];
|
|
72
|
+
if (!commentId) return null;
|
|
73
|
+
var element_comments_map = editor.element_comments_map;
|
|
74
|
+
var commentsArray = Object.values(element_comments_map);
|
|
75
|
+
var comments = commentsArray.flat();
|
|
76
|
+
var comment = comments.find(function (item) {
|
|
77
|
+
var id = item.detail.text_comment_id || '';
|
|
78
|
+
if (id === commentId) return true;
|
|
79
|
+
return false;
|
|
80
|
+
});
|
|
81
|
+
return comment ? true : false;
|
|
67
82
|
};
|
|
@@ -12,8 +12,9 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
12
12
|
var _constants = require("../../constants");
|
|
13
13
|
var _helpers = require("../font/helpers");
|
|
14
14
|
var _caret = _interopRequireDefault(require("./caret"));
|
|
15
|
+
var _helpers2 = require("./helpers");
|
|
15
16
|
var _excluded = ["text"];
|
|
16
|
-
var renderText = function renderText(props) {
|
|
17
|
+
var renderText = function renderText(props, editor) {
|
|
17
18
|
var attributes = props.attributes,
|
|
18
19
|
children = props.children,
|
|
19
20
|
leaf = props.leaf;
|
|
@@ -57,6 +58,9 @@ var renderText = function renderText(props) {
|
|
|
57
58
|
var _step$value = (0, _slicedToArray2["default"])(_step.value, 2),
|
|
58
59
|
key = _step$value[0],
|
|
59
60
|
value = _step$value[1];
|
|
61
|
+
if (!(0, _helpers2.isTextCommentExist)(key, editor)) {
|
|
62
|
+
delete rest[key];
|
|
63
|
+
}
|
|
60
64
|
if (value === false && key.startsWith('sdoc_comment_')) {
|
|
61
65
|
var newKey = "removed_".concat(key);
|
|
62
66
|
rest[newKey] = true;
|
|
@@ -1,16 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
|
|
3
4
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
5
|
Object.defineProperty(exports, "__esModule", {
|
|
5
6
|
value: true
|
|
6
7
|
});
|
|
7
8
|
exports["default"] = void 0;
|
|
8
9
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
9
|
-
var _react =
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
10
11
|
var _slateReact = require("@seafile/slate-react");
|
|
12
|
+
var _constants = require("../../constants");
|
|
13
|
+
var _useForceUpdate = _interopRequireDefault(require("../../hooks/use-force-update"));
|
|
14
|
+
var _eventBus = _interopRequireDefault(require("../../utils/event-bus"));
|
|
11
15
|
var _plugins = require("../plugins");
|
|
12
16
|
var CustomLeaf = function CustomLeaf(props) {
|
|
13
17
|
var editor = (0, _slateReact.useSlateStatic)();
|
|
18
|
+
var forceUpdate = (0, _useForceUpdate["default"])();
|
|
19
|
+
var updateRender = (0, _react.useCallback)(function () {
|
|
20
|
+
forceUpdate();
|
|
21
|
+
}, [forceUpdate]);
|
|
22
|
+
(0, _react.useEffect)(function () {
|
|
23
|
+
var eventBus = _eventBus["default"].getInstance();
|
|
24
|
+
var unsubscribeReloadComment = eventBus.subscribe(_constants.INTERNAL_EVENT.RELOAD_COMMENT, updateRender);
|
|
25
|
+
return function () {
|
|
26
|
+
unsubscribeReloadComment();
|
|
27
|
+
};
|
|
28
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
29
|
+
}, []);
|
|
14
30
|
var _TextPlugin$renderEle = (0, _slicedToArray2["default"])(_plugins.TextPlugin.renderElements, 1),
|
|
15
31
|
renderText = _TextPlugin$renderEle[0];
|
|
16
32
|
return renderText(props, editor);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.5",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "jest",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"publishConfig": {
|
|
72
72
|
"access": "public"
|
|
73
73
|
},
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "8629f169a57be83cbaad84b8a413a728d4fd2a22"
|
|
75
75
|
}
|