@seafile/sdoc-editor 0.1.124 → 0.1.125-beta

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 (78) hide show
  1. package/dist/basic-sdk/comment/comment/editor-comment.js +11 -2
  2. package/dist/basic-sdk/comment/comment/style.css +1 -0
  3. package/dist/basic-sdk/editor.js +25 -171
  4. package/dist/basic-sdk/extension/plugins/blockquote/helpers.js +2 -1
  5. package/dist/basic-sdk/extension/plugins/blockquote/menu/index.js +7 -5
  6. package/dist/basic-sdk/extension/plugins/check-list/helpers.js +2 -1
  7. package/dist/basic-sdk/extension/plugins/check-list/index.js +2 -2
  8. package/dist/basic-sdk/extension/plugins/check-list/menu/index.js +7 -5
  9. package/dist/basic-sdk/extension/plugins/check-list/render-elem.js +5 -9
  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/code-block/plugin.js +9 -1
  15. package/dist/basic-sdk/extension/plugins/code-block/render-elem.js +13 -21
  16. package/dist/basic-sdk/extension/plugins/font/helpers.js +2 -1
  17. package/dist/basic-sdk/extension/plugins/font/menu/font-family/index.js +3 -2
  18. package/dist/basic-sdk/extension/plugins/font/menu/font-size/index.js +3 -2
  19. package/dist/basic-sdk/extension/plugins/font/menu/index.js +6 -3
  20. package/dist/basic-sdk/extension/plugins/header/helpers.js +2 -0
  21. package/dist/basic-sdk/extension/plugins/header/menu/index.js +4 -2
  22. package/dist/basic-sdk/extension/plugins/image/helpers.js +2 -1
  23. package/dist/basic-sdk/extension/plugins/image/menu/index.js +8 -6
  24. package/dist/basic-sdk/extension/plugins/link/helpers.js +2 -1
  25. package/dist/basic-sdk/extension/plugins/link/menu/index.js +8 -6
  26. package/dist/basic-sdk/extension/plugins/list/helpers.js +2 -1
  27. package/dist/basic-sdk/extension/plugins/list/menu/index.js +11 -9
  28. package/dist/basic-sdk/extension/plugins/sdoc-link/dialogs/select-sdoc-file-dialog/index.css +55 -0
  29. package/dist/basic-sdk/extension/plugins/sdoc-link/{menu/sdoc-link-file-dialog.js → dialogs/select-sdoc-file-dialog/index.js} +36 -29
  30. package/dist/basic-sdk/extension/plugins/sdoc-link/dialogs/select-sdoc-file-dialog/local-files/index.css +75 -0
  31. package/dist/basic-sdk/extension/plugins/sdoc-link/{menu/local-files.js → dialogs/select-sdoc-file-dialog/local-files/index.js} +42 -32
  32. package/dist/basic-sdk/extension/plugins/sdoc-link/helpers.js +2 -1
  33. package/dist/basic-sdk/extension/plugins/sdoc-link/{menu/sdoc-link-hover-menu.js → hover-menu/index.js} +1 -1
  34. package/dist/basic-sdk/extension/plugins/sdoc-link/menu/index.js +7 -6
  35. package/dist/basic-sdk/extension/plugins/sdoc-link/render-elem.js +3 -2
  36. package/dist/basic-sdk/extension/plugins/table/helpers.js +2 -1
  37. package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/cell-text-align-menu.js +6 -3
  38. package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/common-menu.js +3 -2
  39. package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/index.js +12 -6
  40. package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/remove-table-menu.js +5 -3
  41. package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/table-column-menu.js +8 -4
  42. package/dist/basic-sdk/extension/plugins/table/menu/active-table-menu/table-row-menu.js +8 -4
  43. package/dist/basic-sdk/extension/plugins/table/menu/table-menu/index.js +7 -5
  44. package/dist/basic-sdk/extension/plugins/text-align/helpers.js +2 -1
  45. package/dist/basic-sdk/extension/plugins/text-align/menu/index.js +3 -2
  46. package/dist/basic-sdk/extension/plugins/text-style/helpers.js +2 -1
  47. package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +5 -4
  48. package/dist/basic-sdk/extension/render/render-element.js +3 -5
  49. package/dist/basic-sdk/extension/toolbar/header-toolbar/index.js +37 -17
  50. package/dist/basic-sdk/extension/toolbar/header-toolbar/redo-undo.js +7 -4
  51. package/dist/basic-sdk/layout/editor-container.js +26 -0
  52. package/dist/basic-sdk/layout/editor-content.js +56 -0
  53. package/dist/basic-sdk/layout/index.js +4 -0
  54. package/dist/basic-sdk/outline/index.js +6 -7
  55. package/dist/basic-sdk/outline/style.css +5 -1
  56. package/dist/basic-sdk/slate-editor.js +149 -0
  57. package/dist/basic-sdk/socket/with-socket-io.js +1 -0
  58. package/dist/basic-sdk/utils/diff.js +12 -0
  59. package/dist/basic-sdk/views/diff-viewer.js +10 -5
  60. package/dist/basic-sdk/views/viewer.js +20 -20
  61. package/dist/components/doc-operations/index.js +2 -0
  62. package/dist/components/doc-operations/revision-operations/changes-count/index.css +34 -0
  63. package/dist/components/doc-operations/revision-operations/changes-count/index.js +85 -0
  64. package/dist/components/doc-operations/revision-operations/index.js +5 -1
  65. package/dist/pages/diff-viewer.js +2 -0
  66. package/dist/pages/simple-editor.js +16 -3
  67. package/package.json +1 -1
  68. package/public/media/sdoc-editor-font/iconfont.eot +0 -0
  69. package/public/media/sdoc-editor-font/iconfont.svg +4 -0
  70. package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
  71. package/public/media/sdoc-editor-font/iconfont.woff +0 -0
  72. package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
  73. package/public/media/sdoc-editor-font.css +14 -6
  74. package/dist/basic-sdk/extension/plugins/sdoc-link/menu/local-files.css +0 -98
  75. package/dist/basic-sdk/extension/plugins/sdoc-link/menu/sdoc-link-file-dialog.css +0 -35
  76. package/dist/pages/diff-viewer/history-version-viewer.js +0 -15
  77. package/dist/pages/diff-viewer/index.js +0 -35
  78. /package/dist/basic-sdk/extension/plugins/sdoc-link/{menu/sdoc-link-hover-menu.css → hover-menu/index.css} +0 -0
@@ -8,15 +8,17 @@ import { TABLE_ELEMENT } from '../../constants';
8
8
  var RemoveTable = function RemoveTable(_ref) {
9
9
  var isRichEditor = _ref.isRichEditor,
10
10
  className = _ref.className,
11
- editor = _ref.editor;
11
+ editor = _ref.editor,
12
+ readonly = _ref.readonly;
12
13
  var removeTable = useCallback(function () {
14
+ if (readonly) return;
13
15
  removeTableElement(editor, TABLE_ELEMENT.TABLE);
14
- }, [editor]);
16
+ }, [editor, readonly]);
15
17
  var menuConfig = MENUS_CONFIG_MAP[REMOVE_TABLE];
16
18
  var props = _objectSpread(_objectSpread({
17
19
  isRichEditor: isRichEditor,
18
20
  className: classnames(className, 'sdoc-remove-table menu-group-item'),
19
- disabled: false,
21
+ disabled: readonly,
20
22
  isActive: false
21
23
  }, menuConfig), {}, {
22
24
  onMouseDown: removeTable
@@ -4,22 +4,26 @@ import CommonMenu from './common-menu';
4
4
  import { insertTableElement, removeTableElement } from '../../helpers';
5
5
  import { TABLE_ELEMENT } from '../../constants';
6
6
  var TableColumnMenu = function TableColumnMenu(_ref) {
7
- var editor = _ref.editor;
7
+ var editor = _ref.editor,
8
+ readonly = _ref.readonly;
8
9
  var tableColumnRef = useRef(null);
9
10
  var _useTranslation = useTranslation(),
10
11
  t = _useTranslation.t;
11
12
  var insertColumn = useCallback(function (type) {
13
+ if (readonly) return;
12
14
  insertTableElement(editor, type);
13
15
  tableColumnRef.current && tableColumnRef.current.hidePopover();
14
- }, [editor]);
16
+ }, [editor, readonly]);
15
17
  var removeColumn = useCallback(function (type) {
18
+ if (readonly) return;
16
19
  removeTableElement(editor, type);
17
20
  tableColumnRef.current && tableColumnRef.current.hidePopover();
18
- }, [editor]);
21
+ }, [editor, readonly]);
19
22
  return /*#__PURE__*/React.createElement(CommonMenu, {
20
23
  id: "table-column",
21
24
  iconClass: "sdocfont sdoc-column",
22
- ref: tableColumnRef
25
+ ref: tableColumnRef,
26
+ disabled: readonly
23
27
  }, /*#__PURE__*/React.createElement("div", {
24
28
  className: "sdoc-dropdown-menu-item",
25
29
  onClick: function onClick() {
@@ -4,22 +4,26 @@ import CommonMenu from './common-menu';
4
4
  import { insertTableElement, removeTableElement } from '../../helpers';
5
5
  import { TABLE_ELEMENT } from '../../constants';
6
6
  var TableRowMenu = function TableRowMenu(_ref) {
7
- var editor = _ref.editor;
7
+ var editor = _ref.editor,
8
+ readonly = _ref.readonly;
8
9
  var tableRowRef = useRef(null);
9
10
  var _useTranslation = useTranslation(),
10
11
  t = _useTranslation.t;
11
12
  var insertRow = useCallback(function (type) {
13
+ if (readonly) return;
12
14
  insertTableElement(editor, type);
13
15
  tableRowRef.current && tableRowRef.current.hidePopover();
14
- }, [editor]);
16
+ }, [editor, readonly]);
15
17
  var removeRow = useCallback(function (type) {
18
+ if (readonly) return;
16
19
  removeTableElement(editor, type);
17
20
  tableRowRef.current && tableRowRef.current.hidePopover();
18
- }, [editor]);
21
+ }, [editor, readonly]);
19
22
  return /*#__PURE__*/React.createElement(CommonMenu, {
20
23
  id: "table-row",
21
24
  iconClass: "sdocfont sdoc-row",
22
- ref: tableRowRef
25
+ ref: tableRowRef,
26
+ disabled: readonly
23
27
  }, /*#__PURE__*/React.createElement("div", {
24
28
  className: "sdoc-dropdown-menu-item",
25
29
  onClick: function onClick() {
@@ -23,8 +23,10 @@ var TableMenu = /*#__PURE__*/function (_React$Component) {
23
23
  return false;
24
24
  };
25
25
  _this.isDisabled = function () {
26
- var editor = _this.props.editor;
27
- return isTableMenuDisabled(editor);
26
+ var _this$props = _this.props,
27
+ editor = _this$props.editor,
28
+ readonly = _this$props.readonly;
29
+ return isTableMenuDisabled(editor, readonly);
28
30
  };
29
31
  _this.createTable = function (size) {
30
32
  var editor = _this.props.editor;
@@ -35,9 +37,9 @@ var TableMenu = /*#__PURE__*/function (_React$Component) {
35
37
  _createClass(TableMenu, [{
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[TABLE];
42
44
  var props = _objectSpread(_objectSpread({
43
45
  isRichEditor: isRichEditor,
@@ -1,7 +1,8 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
2
  import { Editor, Transforms, Element } from '@seafile/slate';
3
3
  import { TEXT_ALIGN, MENUS_CONFIG_MAP, CODE_BLOCK, TABLE } from '../../constants';
4
- export var isMenuDisabled = function isMenuDisabled(editor) {
4
+ export var isMenuDisabled = function isMenuDisabled(editor, readonly) {
5
+ if (readonly) return true;
5
6
  if (!editor.selection) return true;
6
7
  var _Editor$nodes = Editor.nodes(editor, {
7
8
  match: function match(node) {
@@ -8,13 +8,14 @@ import { TEXT_ALIGN, MENUS_CONFIG_MAP } from '../../../constants';
8
8
  var TextAlignMenu = function TextAlignMenu(_ref) {
9
9
  var isRichEditor = _ref.isRichEditor,
10
10
  className = _ref.className,
11
- editor = _ref.editor;
11
+ editor = _ref.editor,
12
+ readonly = _ref.readonly;
12
13
  var _useState = useState(false),
13
14
  _useState2 = _slicedToArray(_useState, 2),
14
15
  isShowMenu = _useState2[0],
15
16
  setMenuShow = _useState2[1];
16
17
  var popoverRef = useRef(null);
17
- var disabled = isMenuDisabled(editor);
18
+ var disabled = isMenuDisabled(editor, readonly);
18
19
  var buttonId = 'sdoc-button-text-align';
19
20
  var toggle = useCallback(function (event) {
20
21
  popoverRef.current.toggle();
@@ -1,7 +1,8 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
2
  import { Editor } from '@seafile/slate';
3
3
  import { getNodeType } from '../../core';
4
- export var isMenuDisabled = function isMenuDisabled(editor) {
4
+ export var isMenuDisabled = function isMenuDisabled(editor, readonly) {
5
+ if (readonly) return true;
5
6
  if (editor.selection == null) return true;
6
7
  var _Editor$nodes = Editor.nodes(editor, {
7
8
  match: function match(n) {
@@ -12,7 +12,8 @@ var TextStyleMenuList = function TextStyleMenuList(_ref) {
12
12
  t = _ref.t,
13
13
  isRichEditor = _ref.isRichEditor,
14
14
  className = _ref.className,
15
- idPrefix = _ref.idPrefix;
15
+ idPrefix = _ref.idPrefix,
16
+ readonly = _ref.readonly;
16
17
  var _useColorContext = useColorContext(),
17
18
  lastUsedFontColor = _useColorContext.lastUsedFontColor,
18
19
  updateLastUsedFontColor = _useColorContext.updateLastUsedFontColor,
@@ -25,10 +26,10 @@ var TextStyleMenuList = function TextStyleMenuList(_ref) {
25
26
  // eslint-disable-next-line react-hooks/exhaustive-deps
26
27
  }, [editor]);
27
28
  var isDisabled = useCallback(function () {
28
- return isMenuDisabled(editor);
29
+ return isMenuDisabled(editor, readonly);
29
30
 
30
31
  // eslint-disable-next-line react-hooks/exhaustive-deps
31
- }, [editor]);
32
+ }, [editor, readonly]);
32
33
  var onMouseDown = useCallback(function (event, type) {
33
34
  event.preventDefault();
34
35
  event.stopPropagation();
@@ -72,7 +73,7 @@ var TextStyleMenuList = function TextStyleMenuList(_ref) {
72
73
  });
73
74
 
74
75
  // eslint-disable-next-line react-hooks/exhaustive-deps
75
- }, [editor, lastUsedFontColor, lastUsedHighlightColor]);
76
+ }, [editor, lastUsedFontColor, lastUsedHighlightColor, readonly]);
76
77
  var list = getTextStyleList(TEXT_STYLE);
77
78
  var dropdownList = getTextStyleList(TEXT_STYLE_MORE);
78
79
  return /*#__PURE__*/React.createElement(React.Fragment, null, list.map(function (itemProps, index) {
@@ -57,11 +57,9 @@ var CustomElement = function CustomElement(props) {
57
57
  }
58
58
  case CHECK_LIST_ITEM:
59
59
  {
60
- var _CheckListPlugin$rend = _slicedToArray(CheckListPlugin.renderElements, 2),
61
- CheckListItem = _CheckListPlugin$rend[1];
62
- return /*#__PURE__*/React.createElement(CheckListItem, Object.assign({}, props, {
63
- editor: editor
64
- }));
60
+ var _CheckListPlugin$rend = _slicedToArray(CheckListPlugin.renderElements, 1),
61
+ renderCheckListItem = _CheckListPlugin$rend[0];
62
+ return renderCheckListItem(props, editor);
65
63
  }
66
64
  case CODE_BLOCK:
67
65
  {
@@ -17,44 +17,64 @@ import HistoryMenu from './redo-undo';
17
17
  import Font from '../../plugins/font/menu';
18
18
  import SdocLinkMenu from '../../plugins/sdoc-link/menu';
19
19
  var Toolbar = function Toolbar(_ref) {
20
- var editor = _ref.editor;
20
+ var editor = _ref.editor,
21
+ readonly = _ref.readonly;
21
22
  useSelectionUpdate();
22
23
  return /*#__PURE__*/React.createElement("div", {
23
24
  className: "sdoc-editor-toolbar"
24
25
  }, /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(HistoryMenu, {
25
- editor: editor
26
+ editor: editor,
27
+ readonly: readonly
26
28
  }), /*#__PURE__*/React.createElement(ClearFormatMenu, {
27
- editor: editor
29
+ editor: editor,
30
+ readonly: readonly
28
31
  })), /*#__PURE__*/React.createElement(HeaderMenu, {
29
- editor: editor
32
+ editor: editor,
33
+ readonly: readonly
30
34
  }), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(Font, {
31
- editor: editor
35
+ editor: editor,
36
+ readonly: readonly
32
37
  }), /*#__PURE__*/React.createElement(TextStyleMenuList, {
33
- editor: editor
38
+ editor: editor,
39
+ readonly: readonly
34
40
  })), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(QuoteMenu, {
35
- editor: editor
41
+ editor: editor,
42
+ readonly: readonly
36
43
  }), /*#__PURE__*/React.createElement(ListMenu, {
37
44
  editor: editor,
38
- type: UNORDERED_LIST
45
+ type: UNORDERED_LIST,
46
+ readonly: readonly
39
47
  }), /*#__PURE__*/React.createElement(ListMenu, {
40
48
  editor: editor,
41
- type: ORDERED_LIST
49
+ type: ORDERED_LIST,
50
+ readonly: readonly
42
51
  }), /*#__PURE__*/React.createElement(CheckListMenu, {
43
- editor: editor
52
+ editor: editor,
53
+ readonly: readonly
44
54
  }), /*#__PURE__*/React.createElement(TextAlignMenu, {
45
- editor: editor
55
+ editor: editor,
56
+ readonly: readonly
46
57
  })), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(CodeBlockMenu, {
47
- editor: editor
58
+ editor: editor,
59
+ readonly: readonly
48
60
  }), /*#__PURE__*/React.createElement(TableMenu, {
49
- editor: editor
61
+ editor: editor,
62
+ readonly: readonly
50
63
  })), /*#__PURE__*/React.createElement(ActiveTableMenu, {
51
- editor: editor
64
+ editor: editor,
65
+ readonly: readonly
52
66
  }), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(ImageMenu, {
53
- editor: editor
67
+ editor: editor,
68
+ readonly: readonly
54
69
  }), /*#__PURE__*/React.createElement(LinkMenu, {
55
- editor: editor
70
+ editor: editor,
71
+ readonly: readonly
56
72
  })), /*#__PURE__*/React.createElement(MenuGroup, null, /*#__PURE__*/React.createElement(SdocLinkMenu, {
57
- editor: editor
73
+ editor: editor,
74
+ readonly: readonly
58
75
  })));
59
76
  };
77
+ Toolbar.defaultProps = {
78
+ readonly: false
79
+ };
60
80
  export default Toolbar;
@@ -17,7 +17,10 @@ var HistoryMenu = /*#__PURE__*/function (_React$Component) {
17
17
  }
18
18
  _this = _super.call.apply(_super, [this].concat(args));
19
19
  _this.isDisabled = function (type) {
20
- var editor = _this.props.editor;
20
+ var _this$props = _this.props,
21
+ editor = _this$props.editor,
22
+ readonly = _this$props.readonly;
23
+ if (readonly) return true;
21
24
  var history = editor.history;
22
25
  if (type === UNDO) {
23
26
  return history.undos.length === 0;
@@ -37,9 +40,9 @@ var HistoryMenu = /*#__PURE__*/function (_React$Component) {
37
40
  _createClass(HistoryMenu, [{
38
41
  key: "render",
39
42
  value: function render() {
40
- var _this$props = this.props,
41
- isRichEditor = _this$props.isRichEditor,
42
- className = _this$props.className;
43
+ var _this$props2 = this.props,
44
+ isRichEditor = _this$props2.isRichEditor,
45
+ className = _this$props2.className;
43
46
  var undoConfig = MENUS_CONFIG_MAP[UNDO];
44
47
  var redoConfig = MENUS_CONFIG_MAP[REDO];
45
48
  var undoProps = _objectSpread(_objectSpread({
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import classnames from 'classnames';
3
+ import { ColorProvider } from '../hooks/use-color-context';
4
+ import { Toolbar } from '../extension';
5
+ import { isMobile } from '../../utils';
6
+ import '../assets/css/layout.css';
7
+ import '../assets/css/sdoc-editor-plugins.css';
8
+ import '../assets/css/dropdown-menu.css';
9
+ var EditorContainer = function EditorContainer(_ref) {
10
+ var editor = _ref.editor,
11
+ readonly = _ref.readonly,
12
+ children = _ref.children,
13
+ showToolbar = _ref.showToolbar;
14
+ return /*#__PURE__*/React.createElement("div", {
15
+ className: classnames('sdoc-editor-container', {
16
+ 'mobile': isMobile && readonly
17
+ })
18
+ }, /*#__PURE__*/React.createElement(ColorProvider, null, showToolbar && /*#__PURE__*/React.createElement(Toolbar, {
19
+ editor: editor,
20
+ readonly: readonly
21
+ }), children));
22
+ };
23
+ EditorContainer.defaultProps = {
24
+ showToolbar: true
25
+ };
26
+ export default EditorContainer;
@@ -0,0 +1,56 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React, { useRef, useState, useCallback } from 'react';
3
+ import { ScrollContext } from '../hooks/use-scroll-context';
4
+ import SDocOutline from '../outline';
5
+ var EditorContent = function EditorContent(_ref) {
6
+ var readonly = _ref.readonly,
7
+ showOutline = _ref.showOutline,
8
+ children = _ref.children,
9
+ docValue = _ref.docValue;
10
+ var scrollRef = useRef(null);
11
+ var _useState = useState(0),
12
+ _useState2 = _slicedToArray(_useState, 2),
13
+ scrollLeft = _useState2[0],
14
+ setScrollLeft = _useState2[1];
15
+ var onWrapperScroll = useCallback(function (event) {
16
+ var scrollLeft = event.target.scrollLeft;
17
+ setScrollLeft(scrollLeft);
18
+ }, []);
19
+ if (readonly && !showOutline) {
20
+ return /*#__PURE__*/React.createElement("div", {
21
+ className: "sdoc-editor-content readonly"
22
+ }, /*#__PURE__*/React.createElement("div", {
23
+ ref: scrollRef,
24
+ className: "sdoc-scroll-container",
25
+ id: "sdoc-scroll-container"
26
+ }, /*#__PURE__*/React.createElement(ScrollContext.Provider, {
27
+ value: {
28
+ scrollRef: scrollRef
29
+ }
30
+ }, children)));
31
+ }
32
+ return /*#__PURE__*/React.createElement("div", {
33
+ className: "sdoc-editor-content"
34
+ }, /*#__PURE__*/React.createElement("div", {
35
+ className: "sdoc-absolute-wrapper"
36
+ }, /*#__PURE__*/React.createElement(SDocOutline, {
37
+ scrollLeft: scrollLeft,
38
+ doc: docValue
39
+ })), /*#__PURE__*/React.createElement("div", {
40
+ className: "sdoc-absolute-wrapper"
41
+ }, /*#__PURE__*/React.createElement("div", {
42
+ ref: scrollRef,
43
+ className: "sdoc-scroll-container",
44
+ onScroll: onWrapperScroll,
45
+ id: "sdoc-scroll-container"
46
+ }, /*#__PURE__*/React.createElement(ScrollContext.Provider, {
47
+ value: {
48
+ scrollRef: scrollRef
49
+ }
50
+ }, children))));
51
+ };
52
+ EditorContent.defaultProps = {
53
+ readonly: false,
54
+ showOutline: true
55
+ };
56
+ export default EditorContent;
@@ -0,0 +1,4 @@
1
+ import ArticleContainer from './article-container';
2
+ import EditorContainer from './editor-container';
3
+ import EditorContent from './editor-content';
4
+ export { ArticleContainer, EditorContainer, EditorContent };
@@ -4,22 +4,21 @@ import { withTranslation } from 'react-i18next';
4
4
  import { UncontrolledTooltip } from 'reactstrap';
5
5
  import OutlineItem from './outline-item';
6
6
  import './style.css';
7
- var getOutlineSetting = function getOutlineSetting(docUuid) {
8
- var currentValue = localStorage.getItem(docUuid);
7
+ var getOutlineSetting = function getOutlineSetting() {
8
+ var currentValue = localStorage.getItem('sdoc');
9
9
  var config = currentValue ? JSON.parse(currentValue) : {};
10
10
  var _config$outlineOpen = config.outlineOpen,
11
11
  outlineOpen = _config$outlineOpen === void 0 ? false : _config$outlineOpen;
12
12
  return outlineOpen;
13
13
  };
14
- var setOutlineSetting = function setOutlineSetting(docUuid, isShown) {
15
- var currentValue = localStorage.getItem(docUuid);
14
+ var setOutlineSetting = function setOutlineSetting(isShown) {
15
+ var currentValue = localStorage.getItem('sdoc');
16
16
  var config = currentValue ? JSON.parse(currentValue) : {};
17
17
  config['outlineOpen'] = isShown;
18
- localStorage.setItem(docUuid, JSON.stringify(config));
18
+ localStorage.setItem('sdoc', JSON.stringify(config));
19
19
  };
20
20
  var SDocOutline = function SDocOutline(_ref) {
21
21
  var scrollLeft = _ref.scrollLeft,
22
- docUuid = _ref.docUuid,
23
22
  doc = _ref.doc,
24
23
  t = _ref.t;
25
24
  var _useState = useState(false),
@@ -27,7 +26,7 @@ var SDocOutline = function SDocOutline(_ref) {
27
26
  isShown = _useState2[0],
28
27
  setIsShown = _useState2[1];
29
28
  useEffect(function () {
30
- var outlineOpen = getOutlineSetting(docUuid);
29
+ var outlineOpen = getOutlineSetting();
31
30
  setIsShown(outlineOpen);
32
31
  // eslint-disable-next-line react-hooks/exhaustive-deps
33
32
  }, []);
@@ -78,6 +78,10 @@
78
78
  left: -16px;
79
79
  }
80
80
 
81
- .sdoc-outline-menu:hover {
81
+ .sdoc-outline-menu.disabled {
82
+ opacity: .65;
83
+ }
84
+
85
+ .sdoc-outline-menu:not(.disabled):hover {
82
86
  color: #333;
83
87
  }
@@ -0,0 +1,149 @@
1
+ import React, { useCallback, useMemo, Fragment } from 'react';
2
+ import { Editable, ReactEditor, Slate } from '@seafile/slate-react';
3
+ import { renderLeaf, renderElement, ContextToolbar } from './extension';
4
+ import { getAboveBlockNode, getNextNode, getPrevNode, isSelectionAtBlockEnd, isSelectionAtBlockStart } from './extension/core';
5
+ import EventProxy from './utils/event-handler';
6
+ import { useCursors } from './cursor/use-cursors';
7
+ import { INTERNAL_EVENT } from './constants';
8
+ import { SetNodeToDecorations } from './highlight-decorate/setNodeToDecorations';
9
+ import CommentContextProvider from './comment/comment-context-provider';
10
+ import CommentWrapper from './comment';
11
+ import { usePipDecorate } from './decorates';
12
+ import { getCursorPosition, getDomHeight, getDomMarginTop } from './utils/dom-utils';
13
+ import EventBus from './utils/event-bus';
14
+ import { ArticleContainer } from './layout';
15
+ import { useScrollContext } from './hooks/use-scroll-context';
16
+ var SlateEditor = function SlateEditor(_ref) {
17
+ var editor = _ref.editor,
18
+ setSlateValue = _ref.setSlateValue,
19
+ slateValue = _ref.slateValue;
20
+ var _useCursors = useCursors(editor),
21
+ cursors = _useCursors.cursors;
22
+ var decorate = usePipDecorate(editor);
23
+
24
+ // init eventHandler
25
+ // eslint-disable-next-line react-hooks/exhaustive-deps
26
+ var eventProxy = useMemo(function () {
27
+ return new EventProxy(editor);
28
+ }, []);
29
+ var onChange = useCallback(function (slateValue) {
30
+ setSlateValue(slateValue);
31
+ // eslint-disable-next-line react-hooks/exhaustive-deps
32
+ }, []);
33
+ var onMouseDown = useCallback(function (event) {
34
+ if (event.button === 0) {
35
+ editor.reSetTableSelectedRange();
36
+ var eventBus = EventBus.getInstance();
37
+ eventBus.dispatch(INTERNAL_EVENT.CANCEL_TABLE_SELECT_RANGE);
38
+ }
39
+ // eslint-disable-next-line react-hooks/exhaustive-deps
40
+ }, []);
41
+ var scrollRef = useScrollContext();
42
+ var onKeyDown = useCallback(function (event) {
43
+ var _scrollRef$current = scrollRef.current,
44
+ scrollTop = _scrollRef$current.scrollTop,
45
+ clientHeight = _scrollRef$current.clientHeight;
46
+ eventProxy.onKeyDown(event);
47
+ if (event.key === 'ArrowLeft') {
48
+ if (!isSelectionAtBlockStart(editor)) return;
49
+ }
50
+ if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') {
51
+ if (scrollTop === 0) return;
52
+ var prevNode = getPrevNode(editor);
53
+ if (!prevNode) return;
54
+ var domNode = ReactEditor.toDOMNode(editor, prevNode[0]);
55
+ var domHeight = getDomHeight(domNode);
56
+ var isScrollUp = true;
57
+ var _getCursorPosition = getCursorPosition(isScrollUp),
58
+ y = _getCursorPosition.y;
59
+ if (y >= domHeight) return;
60
+ scrollRef.current.scroll(0, Math.max(0, scrollTop - domHeight));
61
+ return;
62
+ }
63
+ if (event.key === 'ArrowRight') {
64
+ if (!isSelectionAtBlockEnd(editor)) return;
65
+ }
66
+ if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {
67
+ var nextNode = getNextNode(editor);
68
+ if (!nextNode) return;
69
+ var _domNode = ReactEditor.toDOMNode(editor, nextNode[0]);
70
+ var _domHeight = getDomHeight(_domNode);
71
+ var _isScrollUp = false;
72
+ var _getCursorPosition2 = getCursorPosition(_isScrollUp),
73
+ _y = _getCursorPosition2.y;
74
+ if (clientHeight - _y >= _domHeight) return;
75
+ scrollRef.current.scroll(0, Math.max(0, scrollTop + _domHeight));
76
+ return;
77
+ }
78
+ if (event.key === 'Backspace') {
79
+ var _getCursorPosition3 = getCursorPosition(),
80
+ _y2 = _getCursorPosition3.y;
81
+
82
+ // above viewport
83
+ if (_y2 < 0) {
84
+ var newY = Math.abs(_y2);
85
+ if (isSelectionAtBlockStart(editor)) {
86
+ var _prevNode = getPrevNode(editor);
87
+ if (!_prevNode) return;
88
+ var _domNode2 = ReactEditor.toDOMNode(editor, _prevNode[0]);
89
+ var _domHeight2 = getDomHeight(_domNode2);
90
+ var node = getAboveBlockNode(editor);
91
+ if (!node) return;
92
+ var currentDomNode = ReactEditor.toDOMNode(editor, node[0]);
93
+ var marginTop = getDomMarginTop(currentDomNode);
94
+ scrollRef.current.scroll(0, Math.max(0, scrollTop - (newY + _domHeight2 + marginTop)));
95
+ } else {
96
+ scrollRef.current.scroll(0, Math.max(0, scrollTop - newY));
97
+ }
98
+ return;
99
+ }
100
+
101
+ // insider viewport
102
+ if (_y2 >= 0 && _y2 <= clientHeight) {
103
+ if (isSelectionAtBlockStart(editor)) {
104
+ var _prevNode2 = getPrevNode(editor);
105
+ if (!_prevNode2) return;
106
+ var _domNode3 = ReactEditor.toDOMNode(editor, _prevNode2[0]);
107
+ var _domHeight3 = getDomHeight(_domNode3);
108
+ if (_y2 >= _domHeight3) return;
109
+ // Scroll up the height of the previous block
110
+ scrollRef.current.scroll(0, Math.max(0, scrollTop - _domHeight3));
111
+ return;
112
+ }
113
+ }
114
+
115
+ // below viewport
116
+ if (_y2 > clientHeight) {
117
+ if (isSelectionAtBlockStart(editor)) {
118
+ // y: text top border
119
+ scrollRef.current.scroll(0, Math.max(0, scrollTop + (_y2 - clientHeight)));
120
+ } else {
121
+ var marginBottom = 11.2;
122
+ var _getCursorPosition4 = getCursorPosition(false),
123
+ _newY = _getCursorPosition4.y;
124
+ var rectBottom = _newY + marginBottom; // text bottom border
125
+ scrollRef.current.scroll(0, Math.max(0, scrollTop + (rectBottom - clientHeight)));
126
+ }
127
+ return;
128
+ }
129
+ }
130
+
131
+ // eslint-disable-next-line react-hooks/exhaustive-deps
132
+ }, [scrollRef]);
133
+ return /*#__PURE__*/React.createElement(Slate, {
134
+ editor: editor,
135
+ value: slateValue,
136
+ onChange: onChange
137
+ }, /*#__PURE__*/React.createElement(ArticleContainer, {
138
+ editor: editor
139
+ }, /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(ContextToolbar, null), /*#__PURE__*/React.createElement(SetNodeToDecorations, null), /*#__PURE__*/React.createElement(Editable, {
140
+ cursors: cursors,
141
+ renderElement: renderElement,
142
+ renderLeaf: renderLeaf,
143
+ onKeyDown: onKeyDown,
144
+ onMouseDown: onMouseDown,
145
+ decorate: decorate,
146
+ onCut: eventProxy.onCut
147
+ })), /*#__PURE__*/React.createElement(CommentContextProvider, null, /*#__PURE__*/React.createElement(CommentWrapper, null))));
148
+ };
149
+ export default SlateEditor;
@@ -19,6 +19,7 @@ var withSocketIO = function withSocketIO(editor, options) {
19
19
  SocketManager.destroy();
20
20
  };
21
21
  newEditor.onChange = function () {
22
+ if (newEditor.readonly) return;
22
23
  var operations = newEditor.operations;
23
24
  if (!newEditor.isRemote && operations.length > 0) {
24
25
  var isAllSetSelection = operations.every(function (operation) {
@@ -261,6 +261,18 @@ export var getDiff = function getDiff() {
261
261
  var oldValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
262
262
  children: []
263
263
  };
264
+ if (!currentValue && !oldValue) return {
265
+ value: [],
266
+ changes: []
267
+ };
268
+ if (!currentValue && oldValue) return {
269
+ value: normalizeChildren(oldValue.children),
270
+ changes: []
271
+ };
272
+ if (currentValue && !oldValue) return {
273
+ value: normalizeChildren(currentValue.children),
274
+ changes: []
275
+ };
264
276
  var _currentValue$childre = _objectSpread(_objectSpread({}, currentValue), {}, {
265
277
  children: normalizeChildren(currentValue.children)
266
278
  }),
@@ -8,11 +8,10 @@ import '../../assets/css/diff-viewer.css';
8
8
  var DiffViewer = function DiffViewer(_ref) {
9
9
  var currentContent = _ref.currentContent,
10
10
  lastContent = _ref.lastContent,
11
- didMountCallback = _ref.didMountCallback;
12
- var diff = currentContent ? getDiff(currentContent, lastContent) : {
13
- value: [],
14
- changes: []
15
- };
11
+ didMountCallback = _ref.didMountCallback,
12
+ showToolbar = _ref.showToolbar,
13
+ showOutline = _ref.showOutline;
14
+ var diff = getDiff(currentContent, lastContent);
16
15
  context.initSettings();
17
16
  useEffect(function () {
18
17
  didMountCallback && didMountCallback(diff);
@@ -39,6 +38,8 @@ var DiffViewer = function DiffViewer(_ref) {
39
38
  return renderElement(props, editor);
40
39
  }, []);
41
40
  return /*#__PURE__*/React.createElement(SDocViewer, {
41
+ showToolbar: showToolbar,
42
+ showOutline: showOutline,
42
43
  document: {
43
44
  children: diff.value
44
45
  },
@@ -46,4 +47,8 @@ var DiffViewer = function DiffViewer(_ref) {
46
47
  renderElement: customRenderElement
47
48
  });
48
49
  };
50
+ DiffViewer.defaultProps = {
51
+ showToolbar: false,
52
+ showOutline: false
53
+ };
49
54
  export default DiffViewer;