@seafile/sdoc-editor 0.1.127 → 0.1.129

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.
Files changed (76) hide show
  1. package/dist/basic-sdk/assets/css/default.css +8 -0
  2. package/dist/basic-sdk/comment/comment/editor-comment.js +13 -0
  3. package/dist/basic-sdk/editor.js +25 -172
  4. package/dist/basic-sdk/extension/constants/font.js +2 -1
  5. package/dist/basic-sdk/extension/constants/index.js +2 -2
  6. package/dist/basic-sdk/extension/plugins/blockquote/helpers.js +2 -1
  7. package/dist/basic-sdk/extension/plugins/blockquote/menu/index.js +7 -5
  8. package/dist/basic-sdk/extension/plugins/check-list/helpers.js +2 -1
  9. package/dist/basic-sdk/extension/plugins/check-list/menu/index.js +7 -5
  10. package/dist/basic-sdk/extension/plugins/clear-format/helpers.js +2 -0
  11. package/dist/basic-sdk/extension/plugins/clear-format/menu/index.js +3 -2
  12. package/dist/basic-sdk/extension/plugins/code-block/helpers.js +2 -1
  13. package/dist/basic-sdk/extension/plugins/code-block/menu/index.js +7 -4
  14. package/dist/basic-sdk/extension/plugins/font/helpers.js +5 -4
  15. package/dist/basic-sdk/extension/plugins/font/menu/font-family/index.js +3 -2
  16. package/dist/basic-sdk/extension/plugins/font/menu/font-size/index.js +3 -2
  17. package/dist/basic-sdk/extension/plugins/font/menu/index.js +6 -3
  18. package/dist/basic-sdk/extension/plugins/header/helpers.js +2 -0
  19. package/dist/basic-sdk/extension/plugins/header/menu/index.js +4 -2
  20. package/dist/basic-sdk/extension/plugins/image/helpers.js +2 -1
  21. package/dist/basic-sdk/extension/plugins/image/menu/index.js +8 -6
  22. package/dist/basic-sdk/extension/plugins/image/plugin.js +17 -2
  23. package/dist/basic-sdk/extension/plugins/link/helpers.js +2 -1
  24. package/dist/basic-sdk/extension/plugins/link/menu/index.js +8 -6
  25. package/dist/basic-sdk/extension/plugins/list/helpers.js +2 -1
  26. package/dist/basic-sdk/extension/plugins/list/menu/index.js +11 -9
  27. package/dist/basic-sdk/extension/plugins/sdoc-link/helpers.js +2 -1
  28. package/dist/basic-sdk/extension/plugins/sdoc-link/menu/index.js +4 -3
  29. package/dist/basic-sdk/extension/plugins/sdoc-link/render-elem.js +1 -0
  30. package/dist/basic-sdk/extension/plugins/table/helpers.js +2 -1
  31. package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/cell-text-align-menu.js +6 -3
  32. package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/common-menu.js +3 -2
  33. package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/index.js +12 -6
  34. package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/remove-table-menu.js +5 -3
  35. package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/table-column-menu.js +8 -4
  36. package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/table-row-menu.js +8 -4
  37. package/dist/basic-sdk/extension/plugins/table/menu/table-menu/index.js +7 -5
  38. package/dist/basic-sdk/extension/plugins/text-align/helpers.js +2 -1
  39. package/dist/basic-sdk/extension/plugins/text-align/menu/index.js +3 -2
  40. package/dist/basic-sdk/extension/plugins/text-style/helpers.js +2 -1
  41. package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +5 -4
  42. package/dist/basic-sdk/extension/toolbar/header-toolbar/index.js +37 -17
  43. package/dist/basic-sdk/extension/toolbar/header-toolbar/redo-undo.js +7 -4
  44. package/dist/basic-sdk/layout/editor-container.js +27 -0
  45. package/dist/basic-sdk/layout/editor-content.js +56 -0
  46. package/dist/basic-sdk/layout/index.js +4 -0
  47. package/dist/basic-sdk/outline/index.js +0 -1
  48. package/dist/basic-sdk/outline/style.css +5 -1
  49. package/dist/basic-sdk/slate-editor.js +149 -0
  50. package/dist/basic-sdk/socket/with-socket-io.js +1 -0
  51. package/dist/basic-sdk/utils/diff.js +12 -0
  52. package/dist/basic-sdk/views/diff-viewer.js +10 -5
  53. package/dist/basic-sdk/views/viewer.js +20 -20
  54. package/dist/components/doc-operations/index.js +2 -0
  55. package/dist/components/doc-operations/revision-operations/changes-count/index.css +34 -0
  56. package/dist/components/doc-operations/revision-operations/changes-count/index.js +85 -0
  57. package/dist/components/doc-operations/revision-operations/index.js +5 -1
  58. package/dist/pages/diff-viewer.js +2 -0
  59. package/dist/pages/simple-editor.js +16 -3
  60. package/package.json +4 -1
  61. package/public/locales/cs/sdoc-editor.json +299 -104
  62. package/public/locales/de/sdoc-editor.json +317 -122
  63. package/public/locales/en/sdoc-editor.json +5 -1
  64. package/public/locales/es/sdoc-editor.json +300 -105
  65. package/public/locales/fr/sdoc-editor.json +308 -113
  66. package/public/locales/it/sdoc-editor.json +300 -105
  67. package/public/locales/ru/sdoc-editor.json +300 -105
  68. package/public/locales/{zh-CN → zh_CN}/sdoc-editor.json +27 -26
  69. package/public/media/sdoc-editor-font/iconfont.eot +0 -0
  70. package/public/media/sdoc-editor-font/iconfont.svg +4 -0
  71. package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
  72. package/public/media/sdoc-editor-font/iconfont.woff +0 -0
  73. package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
  74. package/public/media/sdoc-editor-font.css +14 -6
  75. package/dist/pages/diff-viewer/history-version-viewer.js +0 -15
  76. package/dist/pages/diff-viewer/index.js +0 -35
@@ -0,0 +1,8 @@
1
+ /* modify default css */
2
+ .sdoc-editor-container .article {
3
+ font-size: 16px;
4
+ }
5
+
6
+ .sdoc-editor-container .sdoc-code-block-pre {
7
+ font-size: 14px;
8
+ }
@@ -51,6 +51,19 @@ var EditorComment = function EditorComment() {
51
51
  setComments([]);
52
52
  setIsShowComments(false);
53
53
  }, [element_comments_map, selectionElement, editor.selection]);
54
+ var onHiddenComment = useCallback(function (e) {
55
+ if (e.target.className === 'article') {
56
+ setComments([]);
57
+ setIsShowComments(false);
58
+ }
59
+ }, []);
60
+ useEffect(function () {
61
+ window.addEventListener('click', onHiddenComment);
62
+ return function () {
63
+ window.removeEventListener('click', onHiddenComment);
64
+ };
65
+ // eslint-disable-next-line react-hooks/exhaustive-deps
66
+ }, []);
54
67
  return /*#__PURE__*/React.createElement("div", {
55
68
  className: "sdoc-comment-container"
56
69
  }, /*#__PURE__*/React.createElement("div", {
@@ -1,31 +1,21 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
- import React, { useCallback, useEffect, useMemo, useRef, useState, forwardRef, useImperativeHandle, Fragment } from 'react';
2
+ import React, { useEffect, useMemo, useState, forwardRef, useImperativeHandle } from 'react';
3
3
  import { Editor } from '@seafile/slate';
4
- import { Editable, ReactEditor, Slate } from '@seafile/slate-react';
5
- import defaultEditor, { renderLeaf, renderElement, Toolbar, ContextToolbar } from './extension';
6
- import { focusEditor, getAboveBlockNode, getNextNode, getPrevNode, isSelectionAtBlockEnd, isSelectionAtBlockStart } from './extension/core';
4
+ import { useTranslation } from 'react-i18next';
5
+ import defaultEditor from './extension';
6
+ import { focusEditor } from './extension/core';
7
7
  import { withSocketIO } from './socket';
8
8
  import withNodeId from './node-id';
9
- import SDocOutline from './outline';
10
- import EventProxy from './utils/event-handler';
11
- import { useCursors } from './cursor/use-cursors';
12
- import { INTERNAL_EVENT, PAGE_EDIT_AREA_WIDTH } from './constants';
13
- import { SetNodeToDecorations } from './highlight-decorate/setNodeToDecorations';
14
- import { ScrollContext } from './hooks/use-scroll-context';
15
- import CommentContextProvider from './comment/comment-context-provider';
16
- import CommentWrapper from './comment';
17
- import { usePipDecorate } from './decorates';
18
- import { getCursorPosition, getDomHeight, getDomMarginTop } from './utils/dom-utils';
19
- import EventBus from './utils/event-bus';
20
- import { ColorProvider } from './hooks/use-color-context';
21
- import ArticleContainer from './layout/article-container';
22
- import './assets/css/layout.css';
23
- import './assets/css/sdoc-editor-plugins.css';
24
- import './assets/css/dropdown-menu.css';
25
- import SideToolbar from './extension/toolbar/side-toolbar';
9
+ import { PAGE_EDIT_AREA_WIDTH } from './constants';
10
+ import context from '../context';
11
+ import { EditorContainer, EditorContent } from './layout';
12
+ import SlateEditor from './slate-editor';
26
13
  var SDocEditor = forwardRef(function (_ref, ref) {
27
14
  var document = _ref.document,
28
15
  config = _ref.config;
16
+ var _useTranslation = useTranslation(),
17
+ t = _useTranslation.t;
18
+
29
19
  // init editor
30
20
  var editor = useMemo(function () {
31
21
  var newEditor = withNodeId(withSocketIO(defaultEditor, {
@@ -42,16 +32,6 @@ var SDocEditor = forwardRef(function (_ref, ref) {
42
32
  _useState2 = _slicedToArray(_useState, 2),
43
33
  slateValue = _useState2[0],
44
34
  setSlateValue = _useState2[1];
45
- var _useCursors = useCursors(editor),
46
- cursors = _useCursors.cursors;
47
- var scrollRef = useRef(null);
48
- var decorate = usePipDecorate(editor);
49
-
50
- // init eventHandler
51
- // eslint-disable-next-line react-hooks/exhaustive-deps
52
- var eventProxy = useMemo(function () {
53
- return new EventProxy(editor);
54
- }, []);
55
35
 
56
36
  // The parent component can call the method of this component through ref
57
37
  useImperativeHandle(ref, function () {
@@ -95,153 +75,26 @@ var SDocEditor = forwardRef(function (_ref, ref) {
95
75
  };
96
76
  // eslint-disable-next-line react-hooks/exhaustive-deps
97
77
  }, []);
98
- var onChange = useCallback(function (slateValue) {
99
- setSlateValue(slateValue);
100
- // eslint-disable-next-line react-hooks/exhaustive-deps
101
- }, []);
102
- var onMouseDown = useCallback(function (event) {
103
- if (event.button === 0) {
104
- editor.reSetTableSelectedRange();
105
- var eventBus = EventBus.getInstance();
106
- eventBus.dispatch(INTERNAL_EVENT.CANCEL_TABLE_SELECT_RANGE);
107
- }
108
- // eslint-disable-next-line react-hooks/exhaustive-deps
109
- }, []);
110
- var onKeyDown = useCallback(function (event) {
111
- var _scrollRef$current = scrollRef.current,
112
- scrollTop = _scrollRef$current.scrollTop,
113
- clientHeight = _scrollRef$current.clientHeight;
114
- eventProxy.onKeyDown(event);
115
- if (event.key === 'ArrowLeft') {
116
- if (!isSelectionAtBlockStart(editor)) return;
117
- }
118
- if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') {
119
- if (scrollTop === 0) return;
120
- var prevNode = getPrevNode(editor);
121
- if (!prevNode) return;
122
- var domNode = ReactEditor.toDOMNode(editor, prevNode[0]);
123
- var domHeight = getDomHeight(domNode);
124
- var isScrollUp = true;
125
- var _getCursorPosition = getCursorPosition(isScrollUp),
126
- y = _getCursorPosition.y;
127
- if (y >= domHeight) return;
128
- scrollRef.current.scroll(0, Math.max(0, scrollTop - domHeight));
129
- return;
130
- }
131
- if (event.key === 'ArrowRight') {
132
- if (!isSelectionAtBlockEnd(editor)) return;
133
- }
134
- if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {
135
- var nextNode = getNextNode(editor);
136
- if (!nextNode) return;
137
- var _domNode = ReactEditor.toDOMNode(editor, nextNode[0]);
138
- var _domHeight = getDomHeight(_domNode);
139
- var _isScrollUp = false;
140
- var _getCursorPosition2 = getCursorPosition(_isScrollUp),
141
- _y = _getCursorPosition2.y;
142
- if (clientHeight - _y >= _domHeight) return;
143
- scrollRef.current.scroll(0, Math.max(0, scrollTop + _domHeight));
144
- return;
145
- }
146
- if (event.key === 'Backspace') {
147
- var _getCursorPosition3 = getCursorPosition(),
148
- _y2 = _getCursorPosition3.y;
149
78
 
150
- // above viewport
151
- if (_y2 < 0) {
152
- var newY = Math.abs(_y2);
153
- if (isSelectionAtBlockStart(editor)) {
154
- var _prevNode = getPrevNode(editor);
155
- if (!_prevNode) return;
156
- var _domNode2 = ReactEditor.toDOMNode(editor, _prevNode[0]);
157
- var _domHeight2 = getDomHeight(_domNode2);
158
- var node = getAboveBlockNode(editor);
159
- if (!node) return;
160
- var currentDomNode = ReactEditor.toDOMNode(editor, node[0]);
161
- var marginTop = getDomMarginTop(currentDomNode);
162
- scrollRef.current.scroll(0, Math.max(0, scrollTop - (newY + _domHeight2 + marginTop)));
163
- } else {
164
- scrollRef.current.scroll(0, Math.max(0, scrollTop - newY));
165
- }
166
- return;
167
- }
168
-
169
- // insider viewport
170
- if (_y2 >= 0 && _y2 <= clientHeight) {
171
- if (isSelectionAtBlockStart(editor)) {
172
- var _prevNode2 = getPrevNode(editor);
173
- if (!_prevNode2) return;
174
- var _domNode3 = ReactEditor.toDOMNode(editor, _prevNode2[0]);
175
- var _domHeight3 = getDomHeight(_domNode3);
176
- if (_y2 >= _domHeight3) return;
177
- // Scroll up the height of the previous block
178
- scrollRef.current.scroll(0, Math.max(0, scrollTop - _domHeight3));
179
- return;
180
- }
181
- }
182
-
183
- // below viewport
184
- if (_y2 > clientHeight) {
185
- if (isSelectionAtBlockStart(editor)) {
186
- // y: text top border
187
- scrollRef.current.scroll(0, Math.max(0, scrollTop + (_y2 - clientHeight)));
188
- } else {
189
- var marginBottom = 11.2;
190
- var _getCursorPosition4 = getCursorPosition(false),
191
- _newY = _getCursorPosition4.y;
192
- var rectBottom = _newY + marginBottom; // text bottom border
193
- scrollRef.current.scroll(0, Math.max(0, scrollTop + (rectBottom - clientHeight)));
194
- }
195
- return;
196
- }
79
+ // useMount: reset title
80
+ useEffect(function () {
81
+ var isSdocRevision = context.getSetting('isSdocRevision');
82
+ var originFilename = context.getSetting('originFilename');
83
+ if (isSdocRevision) {
84
+ window.document.getElementsByTagName('title')[0].innerText = "".concat(t('Revision'), " - ").concat(originFilename);
197
85
  }
198
86
 
199
87
  // eslint-disable-next-line react-hooks/exhaustive-deps
200
88
  }, []);
201
- var _useState3 = useState(0),
202
- _useState4 = _slicedToArray(_useState3, 2),
203
- scrollLeft = _useState4[0],
204
- setScrollLeft = _useState4[1];
205
- var onWrapperScroll = useCallback(function (event) {
206
- var scrollLeft = event.target.scrollLeft;
207
- setScrollLeft(scrollLeft);
208
- }, []);
209
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
210
- className: "sdoc-editor-container"
211
- }, /*#__PURE__*/React.createElement(ColorProvider, null, /*#__PURE__*/React.createElement(Toolbar, {
89
+ return /*#__PURE__*/React.createElement(EditorContainer, {
212
90
  editor: editor
213
- }), /*#__PURE__*/React.createElement("div", {
214
- className: "sdoc-editor-content"
215
- }, /*#__PURE__*/React.createElement("div", {
216
- className: "sdoc-absolute-wrapper"
217
- }, /*#__PURE__*/React.createElement(SDocOutline, {
218
- scrollLeft: scrollLeft,
219
- doc: slateValue,
220
- docUuid: config.docUuid
221
- })), /*#__PURE__*/React.createElement("div", {
222
- className: "sdoc-absolute-wrapper"
223
- }, /*#__PURE__*/React.createElement("div", {
224
- ref: scrollRef,
225
- className: "sdoc-scroll-container",
226
- onScroll: onWrapperScroll
227
- }, /*#__PURE__*/React.createElement(ScrollContext.Provider, {
228
- value: {
229
- scrollRef: scrollRef
230
- }
231
- }, /*#__PURE__*/React.createElement(Slate, {
91
+ }, /*#__PURE__*/React.createElement(EditorContent, {
92
+ docValue: slateValue,
93
+ showOutline: true
94
+ }, /*#__PURE__*/React.createElement(SlateEditor, {
232
95
  editor: editor,
233
- value: slateValue,
234
- onChange: onChange
235
- }, /*#__PURE__*/React.createElement(ArticleContainer, {
236
- editor: editor
237
- }, /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(ContextToolbar, null), /*#__PURE__*/React.createElement(SetNodeToDecorations, null), /*#__PURE__*/React.createElement(Editable, {
238
- cursors: cursors,
239
- renderElement: renderElement,
240
- renderLeaf: renderLeaf,
241
- onKeyDown: onKeyDown,
242
- onMouseDown: onMouseDown,
243
- decorate: decorate,
244
- onCut: eventProxy.onCut
245
- })), /*#__PURE__*/React.createElement(SideToolbar, null), /*#__PURE__*/React.createElement(CommentContextProvider, null, /*#__PURE__*/React.createElement(CommentWrapper, null)))))))))));
96
+ slateValue: slateValue,
97
+ setSlateValue: setSlateValue
98
+ })));
246
99
  });
247
100
  export default SDocEditor;
@@ -31,7 +31,8 @@ var FONT_WEIGHT_400_700 = [400, 700];
31
31
  var FONT_WEIGHT_100_400_700 = [100, 400, 700];
32
32
  var FONT_WEIGHT_100_400_700_800 = [100, 400, 700, 800];
33
33
  export var SPECIAL_FONT_SIZE_NAME = ['初号', '小初', '一号', '小一', '二号', '小二', '三号', '小三', '四号', '小四', '五号', '小五'];
34
- export var DEFAULT_COMMON_FONT_SIZE = 14;
34
+ export var DEFAULT_COMMON_FONT_SIZE = 16;
35
+ export var DEFAULT_CODE_FONT_SIZE = 14;
35
36
  export var FONT_SIZE = [{
36
37
  name: '初号',
37
38
  value: 42,
@@ -5,7 +5,7 @@ import * as ELEMENT_TYPE from './element-type';
5
5
  import { BLOCKQUOTE, HEADER, HEADER1, HEADER2, HEADER3, HEADER4, HEADER5, HEADER6, PARAGRAPH, BOLD, ITALIC, UNDERLINE, STRIKETHROUGH, SUPERSCRIPT, SUBSCRIPT, ORDERED_LIST, UNORDERED_LIST, LIST_ITEM, LIST_LIC, CHECK_LIST, CHECK_LIST_ITEM, LINK, HTML, CODE_BLOCK, CODE_LINE, IMAGE, TABLE, TABLE_CELL, TABLE_ROW, FORMULA, COLUMN, TEXT_STYLE, TEXT_STYLE_MORE, BOLD_ITALIC, TEXT_ALIGN, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, CLEAR_FORMAT, COLOR, HIGHLIGHT_COLOR, SDOC_LINK } from './element-type';
6
6
  import KEYBOARD from './keyboard';
7
7
  import { DEFAULT_COLORS, STANDARD_COLORS, DEFAULT_RECENT_USED_LIST, DEFAULT_FONT_COLOR, RECENT_USED_HIGHLIGHT_COLORS_KEY, RECENT_USED_FONT_COLORS_KEY, RECENT_USED_TABLE_CELL_BG_COLORS_KEY, DEFAULT_LAST_USED_FONT_COLOR, DEFAULT_LAST_USED_HIGHLIGHT_COLOR, DEFAULT_LAST_USED_TABLE_CELL_BG_COLOR } from './color';
8
- import { SPECIAL_FONT_SIZE_NAME, DEFAULT_COMMON_FONT_SIZE, FONT_SIZE, DEFAULT_FONT, FONT, GOOGLE_FONT_CLASS, RECENT_USED_FONTS_KEY, HEADER_FONT_SIZE } from './font';
8
+ import { SPECIAL_FONT_SIZE_NAME, DEFAULT_COMMON_FONT_SIZE, FONT_SIZE, DEFAULT_FONT, FONT, GOOGLE_FONT_CLASS, RECENT_USED_FONTS_KEY, HEADER_FONT_SIZE, DEFAULT_CODE_FONT_SIZE } from './font';
9
9
 
10
10
  // history
11
11
  export var UNDO = 'undo';
@@ -232,4 +232,4 @@ export var SIDE_MENUS_CONFIG = [{
232
232
  type: BLOCKQUOTE,
233
233
  title: 'Quote'
234
234
  }];
235
- export { BLOCKQUOTE, HEADER, HEADER1, HEADER2, HEADER3, HEADER4, HEADER5, HEADER6, PARAGRAPH, BOLD, ITALIC, UNDERLINE, STRIKETHROUGH, SUPERSCRIPT, SUBSCRIPT, ORDERED_LIST, UNORDERED_LIST, LIST_ITEM, LIST_LIC, CHECK_LIST, CHECK_LIST_ITEM, LINK, HTML, CODE_BLOCK, CODE_LINE, IMAGE, TABLE, TABLE_CELL, TABLE_ROW, FORMULA, COLUMN, TEXT_STYLE, TEXT_STYLE_MORE, BOLD_ITALIC, TEXT_ALIGN, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ELEMENT_TYPE, KEYBOARD, DEFAULT_COLORS, STANDARD_COLORS, DEFAULT_RECENT_USED_LIST, CLEAR_FORMAT, DEFAULT_FONT_COLOR, RECENT_USED_HIGHLIGHT_COLORS_KEY, RECENT_USED_FONT_COLORS_KEY, RECENT_USED_TABLE_CELL_BG_COLORS_KEY, DEFAULT_LAST_USED_FONT_COLOR, DEFAULT_LAST_USED_HIGHLIGHT_COLOR, DEFAULT_LAST_USED_TABLE_CELL_BG_COLOR, SPECIAL_FONT_SIZE_NAME, DEFAULT_COMMON_FONT_SIZE, FONT_SIZE, DEFAULT_FONT, FONT, GOOGLE_FONT_CLASS, RECENT_USED_FONTS_KEY, HEADER_FONT_SIZE, SDOC_LINK };
235
+ export { BLOCKQUOTE, HEADER, HEADER1, HEADER2, HEADER3, HEADER4, HEADER5, HEADER6, PARAGRAPH, BOLD, ITALIC, UNDERLINE, STRIKETHROUGH, SUPERSCRIPT, SUBSCRIPT, ORDERED_LIST, UNORDERED_LIST, LIST_ITEM, LIST_LIC, CHECK_LIST, CHECK_LIST_ITEM, LINK, HTML, CODE_BLOCK, CODE_LINE, IMAGE, TABLE, TABLE_CELL, TABLE_ROW, FORMULA, COLUMN, TEXT_STYLE, TEXT_STYLE_MORE, BOLD_ITALIC, TEXT_ALIGN, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ELEMENT_TYPE, KEYBOARD, DEFAULT_COLORS, STANDARD_COLORS, DEFAULT_RECENT_USED_LIST, CLEAR_FORMAT, DEFAULT_FONT_COLOR, RECENT_USED_HIGHLIGHT_COLORS_KEY, RECENT_USED_FONT_COLORS_KEY, RECENT_USED_TABLE_CELL_BG_COLORS_KEY, DEFAULT_LAST_USED_FONT_COLOR, DEFAULT_LAST_USED_HIGHLIGHT_COLOR, DEFAULT_LAST_USED_TABLE_CELL_BG_COLOR, SPECIAL_FONT_SIZE_NAME, DEFAULT_COMMON_FONT_SIZE, DEFAULT_CODE_FONT_SIZE, FONT_SIZE, DEFAULT_FONT, FONT, GOOGLE_FONT_CLASS, RECENT_USED_FONTS_KEY, HEADER_FONT_SIZE, SDOC_LINK };
@@ -3,7 +3,8 @@ import { Editor, Transforms, Element } from '@seafile/slate';
3
3
  import slugid from 'slugid';
4
4
  import { BLOCKQUOTE, CHECK_LIST_ITEM, IMAGE, ORDERED_LIST, UNORDERED_LIST } from '../../constants';
5
5
  import { focusEditor, getNodeType } from '../../core';
6
- export var isMenuDisabled = function isMenuDisabled(editor) {
6
+ export var isMenuDisabled = function isMenuDisabled(editor, readonly) {
7
+ if (readonly) return true;
7
8
  if (editor.selection == null) return true;
8
9
  var _Editor$nodes = Editor.nodes(editor, {
9
10
  match: function match(n) {
@@ -22,8 +22,10 @@ var QuoteMenu = /*#__PURE__*/function (_React$Component) {
22
22
  return getBlockQuoteType(editor) === BLOCKQUOTE;
23
23
  };
24
24
  _this.isDisabled = function () {
25
- var editor = _this.props.editor;
26
- return isMenuDisabled(editor);
25
+ var _this$props = _this.props,
26
+ editor = _this$props.editor,
27
+ readonly = _this$props.readonly;
28
+ return isMenuDisabled(editor, readonly);
27
29
  };
28
30
  _this.onMouseDown = function (e) {
29
31
  var editor = _this.props.editor;
@@ -35,9 +37,9 @@ var QuoteMenu = /*#__PURE__*/function (_React$Component) {
35
37
  _createClass(QuoteMenu, [{
36
38
  key: "render",
37
39
  value: function render() {
38
- var _this$props = this.props,
39
- isRichEditor = _this$props.isRichEditor,
40
- className = _this$props.className;
40
+ var _this$props2 = this.props,
41
+ isRichEditor = _this$props2.isRichEditor,
42
+ className = _this$props2.className;
41
43
  var menuConfig = MENUS_CONFIG_MAP[BLOCKQUOTE];
42
44
  var props = _objectSpread(_objectSpread({
43
45
  isRichEditor: isRichEditor,
@@ -3,7 +3,8 @@ import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIt
3
3
  import { Transforms, Editor, Element } from '@seafile/slate';
4
4
  import { CHECK_LIST_ITEM, PARAGRAPH, ELEMENT_TYPE } from '../../constants';
5
5
  import { getSelectedNodeByType } from '../../core';
6
- export var isMenuDisabled = function isMenuDisabled(editor) {
6
+ export var isMenuDisabled = function isMenuDisabled(editor, readonly) {
7
+ if (readonly) return true;
7
8
  if (editor.selection == null) return true;
8
9
  var selectedElements = [];
9
10
  var nodeEntries = Editor.nodes(editor, {
@@ -22,8 +22,10 @@ var CheckListMenu = /*#__PURE__*/function (_React$Component) {
22
22
  return getCheckListItemType(editor) === CHECK_LIST_ITEM;
23
23
  };
24
24
  _this.isDisabled = function () {
25
- var editor = _this.props.editor;
26
- return isMenuDisabled(editor);
25
+ var _this$props = _this.props,
26
+ editor = _this$props.editor,
27
+ readonly = _this$props.readonly;
28
+ return isMenuDisabled(editor, readonly);
27
29
  };
28
30
  _this.onMouseDown = function () {
29
31
  var editor = _this.props.editor;
@@ -36,9 +38,9 @@ var CheckListMenu = /*#__PURE__*/function (_React$Component) {
36
38
  _createClass(CheckListMenu, [{
37
39
  key: "render",
38
40
  value: function render() {
39
- var _this$props = this.props,
40
- isRichEditor = _this$props.isRichEditor,
41
- className = _this$props.className;
41
+ var _this$props2 = this.props,
42
+ isRichEditor = _this$props2.isRichEditor,
43
+ className = _this$props2.className;
42
44
  var menuConfig = MENUS_CONFIG_MAP[CHECK_LIST];
43
45
  var props = _objectSpread(_objectSpread({
44
46
  isRichEditor: isRichEditor,
@@ -4,6 +4,8 @@ import { Editor, Text } from '@seafile/slate';
4
4
  import { CODE_BLOCK, CODE_LINE } from '../../constants';
5
5
  import { getNodeType } from '../../core';
6
6
  export var isMenuDisabled = function isMenuDisabled(editor) {
7
+ var readonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
8
+ if (readonly) return true;
7
9
  if (editor.selection == null) return true;
8
10
  var _Editor$nodes = Editor.nodes(editor, {
9
11
  match: function match(n) {
@@ -7,7 +7,8 @@ var menuConfig = MENUS_CONFIG_MAP[CLEAR_FORMAT];
7
7
  var ClearFormatMenu = function ClearFormatMenu(_ref) {
8
8
  var isRichEditor = _ref.isRichEditor,
9
9
  className = _ref.className,
10
- editor = _ref.editor;
10
+ editor = _ref.editor,
11
+ readonly = _ref.readonly;
11
12
  var onMouseDown = useCallback(function () {
12
13
  clearStyles(editor);
13
14
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -16,7 +17,7 @@ var ClearFormatMenu = function ClearFormatMenu(_ref) {
16
17
  isRichEditor: isRichEditor,
17
18
  className: className
18
19
  }, menuConfig), {}, {
19
- disabled: isMenuDisabled(editor),
20
+ disabled: isMenuDisabled(editor, readonly),
20
21
  isActive: false,
21
22
  'onMouseDown': onMouseDown
22
23
  });
@@ -5,7 +5,8 @@ import { Transforms, Editor, Node } from '@seafile/slate';
5
5
  import slugid from 'slugid';
6
6
  import { CODE_BLOCK, CODE_LINE, PARAGRAPH } from '../../constants';
7
7
  import { getNodeType, getSelectedNodeByType, getSelectedElems } from '../../core';
8
- export var isMenuDisabled = function isMenuDisabled(editor) {
8
+ export var isMenuDisabled = function isMenuDisabled(editor, readonly) {
9
+ if (readonly) return true;
9
10
  var selection = editor.selection;
10
11
  if (selection == null) return true;
11
12
  var selectedElems = getSelectedElems(editor);
@@ -24,7 +24,10 @@ var CodeBlockMenu = /*#__PURE__*/function (_React$Component) {
24
24
  return !!elem;
25
25
  };
26
26
  _this.isDisabled = function () {
27
- return isMenuDisabled(_this.props.editor);
27
+ var _this$props = _this.props,
28
+ editor = _this$props.editor,
29
+ readonly = _this$props.readonly;
30
+ return isMenuDisabled(editor, readonly);
28
31
  };
29
32
  _this.onMouseDown = function (e) {
30
33
  e.preventDefault();
@@ -45,9 +48,9 @@ var CodeBlockMenu = /*#__PURE__*/function (_React$Component) {
45
48
  _createClass(CodeBlockMenu, [{
46
49
  key: "render",
47
50
  value: function render() {
48
- var _this$props = this.props,
49
- isRichEditor = _this$props.isRichEditor,
50
- className = _this$props.className;
51
+ var _this$props2 = this.props,
52
+ isRichEditor = _this$props2.isRichEditor,
53
+ className = _this$props2.className;
51
54
  var menuConfig = MENUS_CONFIG_MAP[CODE_BLOCK];
52
55
  var props = _objectSpread(_objectSpread({
53
56
  isRichEditor: isRichEditor,
@@ -1,10 +1,11 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
2
  import { Editor, Element } from '@seafile/slate';
3
- import { CODE_BLOCK, DEFAULT_COMMON_FONT_SIZE, IMAGE, FONT_SIZE, SPECIAL_FONT_SIZE_NAME, DEFAULT_FONT, GOOGLE_FONT_CLASS, FONT, HEADER_FONT_SIZE, HEADERS } from '../../constants';
3
+ import { CODE_BLOCK, DEFAULT_COMMON_FONT_SIZE, IMAGE, FONT_SIZE, SPECIAL_FONT_SIZE_NAME, DEFAULT_FONT, GOOGLE_FONT_CLASS, FONT, HEADER_FONT_SIZE, HEADERS, ELEMENT_TYPE, DEFAULT_CODE_FONT_SIZE } from '../../constants';
4
4
  import { focusEditor, getParentNode } from '../../core';
5
5
  import context from '../../../../context';
6
6
  import { isMac } from '../../../../utils';
7
- export var isMenuDisabled = function isMenuDisabled(editor) {
7
+ export var isMenuDisabled = function isMenuDisabled(editor, readonly) {
8
+ if (readonly) return true;
8
9
  if (!editor.selection) return true;
9
10
  var _Editor$nodes = Editor.nodes(editor, {
10
11
  match: function match(node) {
@@ -32,10 +33,9 @@ export var getFontSize = function getFontSize(editor) {
32
33
  at: Editor.unhangRange(editor, selection),
33
34
  match: function match(n) {
34
35
  if (!Editor.isEditor(n) && !Element.isElement(n)) {
35
- // console.log(n) && n['font-size']
36
36
  if (n['font-size']) return true;
37
37
  var _parentNode = getParentNode(editor.children, n.id);
38
- if (_parentNode && HEADERS.includes(_parentNode.type)) {
38
+ if (_parentNode && (HEADERS.includes(_parentNode.type) || _parentNode.type === ELEMENT_TYPE.CODE_LINE)) {
39
39
  return true;
40
40
  }
41
41
  return false;
@@ -50,6 +50,7 @@ export var getFontSize = function getFontSize(editor) {
50
50
  if (matched['font-size']) return matched['font-size'];
51
51
  var parentNode = getParentNode(editor.children, matched.id);
52
52
  if (HEADERS.includes(parentNode.type)) return HEADER_FONT_SIZE[parentNode.type];
53
+ if (parentNode.type === ELEMENT_TYPE.CODE_LINE) return DEFAULT_CODE_FONT_SIZE;
53
54
  return DEFAULT_COMMON_FONT_SIZE;
54
55
  };
55
56
  export var setFontSize = function setFontSize(editor, value) {
@@ -15,7 +15,8 @@ import './index.css';
15
15
  var FontFamily = function FontFamily(_ref) {
16
16
  var editor = _ref.editor,
17
17
  isRichEditor = _ref.isRichEditor,
18
- className = _ref.className;
18
+ className = _ref.className,
19
+ readonly = _ref.readonly;
19
20
  var _useState = useState(LocalStorage.getItem(RECENT_USED_FONTS_KEY, [])),
20
21
  _useState2 = _slicedToArray(_useState, 2),
21
22
  recentUsedFonts = _useState2[0],
@@ -31,7 +32,7 @@ var FontFamily = function FontFamily(_ref) {
31
32
  var _useTranslation = useTranslation(),
32
33
  t = _useTranslation.t;
33
34
  var popoverRef = useRef(null);
34
- var disabled = isMenuDisabled(editor);
35
+ var disabled = isMenuDisabled(editor, readonly);
35
36
  var fontSizeButtonId = 'sdoc-button-font';
36
37
  var selectedFont = getFont(editor);
37
38
  var lang = context.getSetting('lang');
@@ -13,7 +13,8 @@ import './index.css';
13
13
  var FontSize = function FontSize(_ref) {
14
14
  var isRichEditor = _ref.isRichEditor,
15
15
  className = _ref.className,
16
- editor = _ref.editor;
16
+ editor = _ref.editor,
17
+ readonly = _ref.readonly;
17
18
  var _useState = useState(false),
18
19
  _useState2 = _slicedToArray(_useState, 2),
19
20
  isShowMenu = _useState2[0],
@@ -21,7 +22,7 @@ var FontSize = function FontSize(_ref) {
21
22
  var _useTranslation = useTranslation(),
22
23
  t = _useTranslation.t;
23
24
  var popoverRef = useRef(null);
24
- var disabled = isMenuDisabled(editor);
25
+ var disabled = isMenuDisabled(editor, readonly);
25
26
  var fontSizeButtonId = 'sdoc-button-font-size';
26
27
  var selectedFontSize = getFontSize(editor);
27
28
  var selectedFontSizeValue = selectedFontSize;
@@ -2,11 +2,14 @@ import React from 'react';
2
2
  import FontFamily from './font-family';
3
3
  import FontSize from './font-size';
4
4
  var Font = function Font(_ref) {
5
- var editor = _ref.editor;
5
+ var editor = _ref.editor,
6
+ readonly = _ref.readonly;
6
7
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FontFamily, {
7
- editor: editor
8
+ editor: editor,
9
+ readonly: readonly
8
10
  }), /*#__PURE__*/React.createElement(FontSize, {
9
- editor: editor
11
+ editor: editor,
12
+ readonly: readonly
10
13
  }));
11
14
  };
12
15
  export default Font;
@@ -3,6 +3,8 @@ import { Editor, Transforms } from '@seafile/slate';
3
3
  import { getNodeType, isTextNode, getParentNode } from '../../core';
4
4
  import { ELEMENT_TYPE } from '../../constants';
5
5
  export var isMenuDisabled = function isMenuDisabled(editor) {
6
+ var readonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
7
+ if (readonly) return true;
6
8
  if (!editor.selection) return true;
7
9
  var _Editor$nodes = Editor.nodes(editor, {
8
10
  match: function match(n) {
@@ -41,8 +41,10 @@ var HeaderMenu = /*#__PURE__*/function (_React$Component) {
41
41
  return _this.getValue() === type;
42
42
  };
43
43
  _this.isDisabled = function () {
44
- var editor = _this.props.editor;
45
- return isMenuDisabled(editor);
44
+ var _this$props = _this.props,
45
+ editor = _this$props.editor,
46
+ readonly = _this$props.readonly;
47
+ return isMenuDisabled(editor, readonly);
46
48
  };
47
49
  _this.onToggleClick = function (event) {
48
50
  event.stopPropagation();
@@ -5,7 +5,8 @@ import { Editor, Range, Transforms } from '@seafile/slate';
5
5
  import { CODE_BLOCK, IMAGE } from '../../constants';
6
6
  import { generateEmptyElement, getNodeType, isTextNode, getParentNode } from '../../core';
7
7
  import context from '../../../../context';
8
- export var isInsertImageMenuDisabled = function isInsertImageMenuDisabled(editor) {
8
+ export var isInsertImageMenuDisabled = function isInsertImageMenuDisabled(editor, readonly) {
9
+ if (readonly) return true;
9
10
  var selection = editor.selection;
10
11
  if (selection === null) return true;
11
12
  if (!Range.isCollapsed(selection)) return true;
@@ -35,8 +35,10 @@ var ImageMenu = /*#__PURE__*/function (_React$Component) {
35
35
  return false;
36
36
  };
37
37
  _this.isDisabled = function () {
38
- var editor = _this.props.editor;
39
- return isInsertImageMenuDisabled(editor);
38
+ var _this$props = _this.props,
39
+ editor = _this$props.editor,
40
+ readonly = _this$props.readonly;
41
+ return isInsertImageMenuDisabled(editor, readonly);
40
42
  };
41
43
  _this.onToggleClick = function (event) {
42
44
  event.stopPropagation();
@@ -105,10 +107,10 @@ var ImageMenu = /*#__PURE__*/function (_React$Component) {
105
107
  _createClass(ImageMenu, [{
106
108
  key: "render",
107
109
  value: function render() {
108
- var _this$props = this.props,
109
- isRichEditor = _this$props.isRichEditor,
110
- className = _this$props.className,
111
- t = _this$props.t;
110
+ var _this$props2 = this.props,
111
+ isRichEditor = _this$props2.isRichEditor,
112
+ className = _this$props2.className,
113
+ t = _this$props2.t;
112
114
  var _this$state = this.state,
113
115
  isShowImagePopover = _this$state.isShowImagePopover,
114
116
  isShowInsertImageDialog = _this$state.isShowInsertImageDialog;
@@ -1,10 +1,13 @@
1
- import { Transforms, Path } from '@seafile/slate';
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { Transforms, Path, Editor, Element } from '@seafile/slate';
2
3
  import context from '../../../../context';
3
4
  import { insertImage } from './helpers';
5
+ import { focusEditor } from '../../core';
4
6
  var withImage = function withImage(editor) {
5
7
  var isInline = editor.isInline,
6
8
  isVoid = editor.isVoid,
7
- insertData = editor.insertData;
9
+ insertData = editor.insertData,
10
+ deleteBackward = editor.deleteBackward;
8
11
  var newEditor = editor;
9
12
 
10
13
  // rewrite isInline
@@ -53,6 +56,18 @@ var withImage = function withImage(editor) {
53
56
  return;
54
57
  }
55
58
  };
59
+ newEditor.deleteBackward = function (unit) {
60
+ deleteBackward(unit);
61
+ // After the delete operation, if the selected image is selected, the cursor moves backward one position
62
+ var selection = editor.selection;
63
+ var _Editor$parent = Editor.parent(editor, selection),
64
+ _Editor$parent2 = _slicedToArray(_Editor$parent, 2),
65
+ node = _Editor$parent2[0],
66
+ path = _Editor$parent2[1];
67
+ if (Element.isElement(node) && node.type === 'image') {
68
+ focusEditor(editor, Path.next(path));
69
+ }
70
+ };
56
71
  return newEditor;
57
72
  };
58
73
  export default withImage;
@@ -6,7 +6,8 @@ import { Editor, Transforms, Range } from '@seafile/slate';
6
6
  import slugid from 'slugid';
7
7
  import { LINK } from '../../constants';
8
8
  import { getNodeType, getSelectedElems, getAboveNode, getEditorString, replaceNodeChildren } from '../../core';
9
- export var isMenuDisabled = function isMenuDisabled(editor) {
9
+ export var isMenuDisabled = function isMenuDisabled(editor, readonly) {
10
+ if (readonly) return true;
10
11
  if (editor.selection == null) return true;
11
12
  var selectedElems = getSelectedElems(editor);
12
13
  var notMatch = selectedElems.some(function (elem) {