@seafile/sdoc-editor 1.0.176 → 1.0.178

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 (67) hide show
  1. package/dist/api/seafile-api.js +12 -0
  2. package/dist/basic-sdk/assets/images/sdoc-ask-ai.png +0 -0
  3. package/dist/basic-sdk/comment/components/comment-editor.js +0 -1
  4. package/dist/basic-sdk/comment/components/comment-item-wrapper.js +19 -10
  5. package/dist/basic-sdk/comment/components/comment-list.css +2 -6
  6. package/dist/basic-sdk/comment/components/comment-list.js +29 -39
  7. package/dist/basic-sdk/comment/components/editor-comment.js +13 -2
  8. package/dist/basic-sdk/constants/index.js +2 -1
  9. package/dist/basic-sdk/extension/commons/file-insert-dialog/index.js +28 -18
  10. package/dist/basic-sdk/extension/commons/file-insert-dialog/style.css +12 -9
  11. package/dist/basic-sdk/extension/commons/insert-element-dialog/index.js +10 -0
  12. package/dist/basic-sdk/extension/commons/select-file-dialog/helpers.js +9 -2
  13. package/dist/basic-sdk/extension/commons/select-file-dialog/index.css +115 -0
  14. package/dist/basic-sdk/extension/commons/select-file-dialog/index.js +68 -5
  15. package/dist/basic-sdk/extension/commons/select-file-dialog/local-files/index.css +42 -0
  16. package/dist/basic-sdk/extension/commons/select-file-dialog/local-files/index.js +49 -12
  17. package/dist/basic-sdk/extension/constants/element-type.js +2 -1
  18. package/dist/basic-sdk/extension/constants/menus-config.js +1 -1
  19. package/dist/basic-sdk/extension/core/queries/index.js +12 -1
  20. package/dist/basic-sdk/extension/plugins/ai/ai-icon/index.js +26 -0
  21. package/dist/basic-sdk/extension/plugins/ai/ai-icon/style.css +22 -0
  22. package/dist/basic-sdk/extension/plugins/ai/ai-menu/ai-context-menu.js +39 -0
  23. package/dist/basic-sdk/extension/plugins/ai/ai-menu/ai-dropdown-menu.js +35 -0
  24. package/dist/basic-sdk/extension/plugins/ai/ai-menu/index.js +20 -0
  25. package/dist/basic-sdk/extension/plugins/ai/ai-menu/menu-item.js +62 -0
  26. package/dist/basic-sdk/extension/plugins/ai/ai-menu/style.css +3 -0
  27. package/dist/basic-sdk/extension/plugins/ai/ai-module/adjust-sub-menu.js +40 -0
  28. package/dist/basic-sdk/extension/plugins/ai/ai-module/index.js +452 -0
  29. package/dist/basic-sdk/extension/plugins/ai/ai-module/lang-sub-menu.js +55 -0
  30. package/dist/basic-sdk/extension/plugins/ai/ai-module/style.css +104 -0
  31. package/dist/basic-sdk/extension/plugins/ai/ai-module/tip-dialog.js +32 -0
  32. package/dist/basic-sdk/extension/plugins/ai/constants/index.js +128 -0
  33. package/dist/basic-sdk/extension/plugins/ai/index.js +1 -0
  34. package/dist/basic-sdk/extension/plugins/blockquote/plugin.js +2 -2
  35. package/dist/basic-sdk/extension/plugins/image/helpers.js +25 -16
  36. package/dist/basic-sdk/extension/plugins/image/hover-menu/index.js +1 -1
  37. package/dist/basic-sdk/extension/plugins/sdoc-link/helpers.js +7 -2
  38. package/dist/basic-sdk/extension/plugins/sdoc-link/render/render-elem.css +19 -3
  39. package/dist/basic-sdk/extension/plugins/sdoc-link/render/render-elem.js +8 -3
  40. package/dist/basic-sdk/extension/plugins/text-style/menu/comemnt-editor-menu.js +7 -11
  41. package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +7 -17
  42. package/dist/basic-sdk/extension/plugins/video/helpers.js +1 -0
  43. package/dist/basic-sdk/extension/plugins/video/plugin.js +26 -1
  44. package/dist/basic-sdk/extension/toolbar/side-toolbar/index.js +7 -0
  45. package/dist/basic-sdk/extension/toolbar/side-toolbar/side-menu.js +4 -1
  46. package/dist/components/doc-operations/revision-operations/more-revision-operations/index.js +4 -0
  47. package/dist/components/doc-operations/revision-operations/revisions/index.js +13 -0
  48. package/dist/constants/index.js +3 -1
  49. package/dist/context.js +8 -0
  50. package/package.json +1 -1
  51. package/public/locales/cs/sdoc-editor.json +23 -1
  52. package/public/locales/de/sdoc-editor.json +23 -1
  53. package/public/locales/en/sdoc-editor.json +23 -1
  54. package/public/locales/es/sdoc-editor.json +23 -1
  55. package/public/locales/es_AR/sdoc-editor.json +23 -1
  56. package/public/locales/es_MX/sdoc-editor.json +23 -1
  57. package/public/locales/fr/sdoc-editor.json +23 -1
  58. package/public/locales/it/sdoc-editor.json +23 -1
  59. package/public/locales/ru/sdoc-editor.json +24 -2
  60. package/public/locales/zh_CN/sdoc-editor.json +23 -1
  61. package/public/media/sdoc-editor-font/iconfont.css +548 -0
  62. package/public/media/sdoc-editor-font/iconfont.eot +0 -0
  63. package/public/media/sdoc-editor-font/iconfont.svg +18 -0
  64. package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
  65. package/public/media/sdoc-editor-font/iconfont.woff +0 -0
  66. package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
  67. package/public/media/sdoc-editor-font.css +42 -6
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.OPERATION_TYPES = exports.OPERATION_MENUS_CONFIG = exports.LANG_MENU_CONFIG = exports.AI_RESULT_TYPES = exports.AI_MIN_HEIGHT = void 0;
7
+ const OPERATION_TYPES = exports.OPERATION_TYPES = {
8
+ DEFAULT: 'default',
9
+ CONTINUATION: 'continuation',
10
+ MORE_DETAILS: 'more_details',
11
+ MORE_CONCISE: 'more_concise',
12
+ MORE_VIVID: 'more_vivid',
13
+ TRANSLATE: 'translate'
14
+ };
15
+ const OPERATION_MENUS_CONFIG = exports.OPERATION_MENUS_CONFIG = {
16
+ CONTINUATION: {
17
+ id: 'CONTINUATION',
18
+ text: 'Continuation',
19
+ iconClass: 'sdocfont sdoc-continue-writing',
20
+ type: 'continuation'
21
+ },
22
+ MORE_DETAILS: {
23
+ id: 'MORE_DETAILS',
24
+ text: 'More_details',
25
+ iconClass: 'sdocfont sdoc-adjust',
26
+ type: 'more_details'
27
+ },
28
+ MORE_CONCISE: {
29
+ id: 'MORE_CONCISE',
30
+ text: 'More_concise',
31
+ iconClass: 'sdocfont sdoc-adjust',
32
+ type: 'more_concise'
33
+ },
34
+ MORE_VIVID: {
35
+ id: 'MORE_VIVID',
36
+ text: 'More_vivid',
37
+ iconClass: 'sdocfont sdoc-adjust',
38
+ type: 'more_vivid'
39
+ },
40
+ TRANSLATE: {
41
+ id: 'TRANSLATE',
42
+ text: 'Translate',
43
+ iconClass: 'sdocfont sdoc-ai-translate',
44
+ type: 'translate'
45
+ },
46
+ ADJUSTMENT: {
47
+ id: 'ADJUSTMENT',
48
+ text: 'Adjustment',
49
+ iconClass: 'sdocfont sdoc-adjust',
50
+ type: 'adjustment'
51
+ },
52
+ INSERT_BELOW: {
53
+ id: 'INSERT_BELOW',
54
+ text: 'Insert_below',
55
+ iconClass: 'sdocfont sdoc-insert-below',
56
+ type: 'insert_below'
57
+ },
58
+ REPLACE: {
59
+ id: 'REPLACE',
60
+ text: 'Replace',
61
+ iconClass: 'sdocfont sdoc-replace',
62
+ type: 'replace'
63
+ },
64
+ TRY_AGAIN: {
65
+ id: 'TRY_AGAIN',
66
+ text: 'Try_again',
67
+ iconClass: 'sdocfont sdoc-try-again',
68
+ type: 'try_again'
69
+ },
70
+ COPY: {
71
+ id: 'COPY',
72
+ text: 'Copy',
73
+ iconClass: 'sdocfont sdoc-copy',
74
+ type: 'copy'
75
+ },
76
+ DEPRECATION: {
77
+ id: 'DEPRECATION',
78
+ text: 'Deprecation',
79
+ iconClass: 'sdocfont sdoc-delete',
80
+ type: 'deprecation'
81
+ }
82
+ };
83
+ const AI_RESULT_TYPES = exports.AI_RESULT_TYPES = {
84
+ continuation: true,
85
+ mode_details: true,
86
+ more_concise: true,
87
+ MORE_VIVID: true,
88
+ TRANSLATE: true
89
+ };
90
+ const LANG_MENU_CONFIG = exports.LANG_MENU_CONFIG = {
91
+ EN: {
92
+ id: 'en',
93
+ type: 'en',
94
+ text: 'English',
95
+ iconClass: 'sdocfont sdoc-ai-translate'
96
+ },
97
+ ZH_CN: {
98
+ id: 'zh-cn',
99
+ type: 'zh-cn',
100
+ text: 'Chinese',
101
+ iconClass: 'sdocfont sdoc-ai-translate'
102
+ },
103
+ 'ZH-CN': {
104
+ id: 'zh-cn',
105
+ type: 'en',
106
+ text: 'Chinese',
107
+ iconClass: 'sdocfont sdoc-ai-translate'
108
+ },
109
+ DE: {
110
+ id: 'de',
111
+ type: 'de',
112
+ text: 'German',
113
+ iconClass: 'sdocfont sdoc-ai-translate'
114
+ },
115
+ FR: {
116
+ id: 'fr',
117
+ type: 'fr',
118
+ text: 'French',
119
+ iconClass: 'sdocfont sdoc-ai-translate'
120
+ },
121
+ RU: {
122
+ id: 'ru',
123
+ type: 'ru',
124
+ text: 'Russian',
125
+ iconClass: 'sdocfont sdoc-ai-translate'
126
+ }
127
+ };
128
+ const AI_MIN_HEIGHT = exports.AI_MIN_HEIGHT = 474;
@@ -0,0 +1 @@
1
+ "use strict";
@@ -26,13 +26,13 @@ const withBlockquote = editor => {
26
26
  });
27
27
  if (!quoteBlockEntry) return insertBreak();
28
28
  const [currentLineEntry] = _slate.Editor.nodes(newEditor, {
29
- match: n => _slate.Element.isElement(n) && n.type === _constants.PARAGRAPH,
29
+ match: n => _slate.Element.isElement(n) && [_constants.PARAGRAPH, _constants.HEADER1, _constants.HEADER2, _constants.HEADER3, _constants.HEADER4, _constants.HEADER5, _constants.HEADER6, _constants.TITLE, _constants.SUBTITLE].includes(n.type),
30
30
  mode: 'lowest'
31
31
  });
32
32
  // Exit blockquote when current line is empty
33
33
  const isAtEnd = currentLineEntry[1].slice(-1)[0] === quoteBlockEntry[0].children.length - 1;
34
34
  if (isAtEnd) {
35
- const isEmptyLine = !(currentLineEntry && _slate.Editor.string(newEditor, currentLineEntry[1]).length);
35
+ const isEmptyLine = !(currentLineEntry && _slate.Editor.string(newEditor, currentLineEntry[1]).length) && !(0, _core.isContainsVoidElement)(currentLineEntry[0]);
36
36
  if (isEmptyLine) {
37
37
  const nextPath = _slate.Path.next(quoteBlockEntry[1]);
38
38
  _slate.Transforms.moveNodes(newEditor, {
@@ -89,22 +89,31 @@ const insertImage = function (editor, srcList, selection) {
89
89
  _slate.Transforms.insertNodes(editor, imageNode, {
90
90
  at: validSelection
91
91
  });
92
- _slate.Transforms.setNodes(editor, {
93
- type: _constants2.IMAGE_BLOCK
94
- }, {
95
- at: validSelection
96
- });
97
- const nodePath = [aboveNodeEntry[1][0]];
98
- const nextPath = _slate.Path.next(nodePath);
99
- _slate.Transforms.insertNodes(editor, (0, _core.generateDefaultParagraph)(), {
100
- at: nextPath
101
- });
102
- const endOfFirstNode = _slate.Editor.start(editor, nextPath);
103
- const range = {
104
- anchor: endOfFirstNode,
105
- focus: endOfFirstNode
106
- };
107
- (0, _core.focusEditor)(editor, range);
92
+
93
+ // BLOCKQUOTE and CALL_OUT use inline images
94
+ let imageType = _constants2.IMAGE_BLOCK;
95
+ const [topNode] = _slate.Editor.node(editor, [aboveNodeEntry[1][0]]);
96
+ if ([_constants2.BLOCKQUOTE, _constants2.CALL_OUT].includes(topNode === null || topNode === void 0 ? void 0 : topNode.type)) {
97
+ imageType = '';
98
+ }
99
+ if (imageType === _constants2.IMAGE_BLOCK) {
100
+ _slate.Transforms.setNodes(editor, {
101
+ type: imageType
102
+ }, {
103
+ at: validSelection
104
+ });
105
+ const nodePath = [aboveNodeEntry[1][0]];
106
+ const nextPath = _slate.Path.next(nodePath);
107
+ _slate.Transforms.insertNodes(editor, (0, _core.generateDefaultParagraph)(), {
108
+ at: nextPath
109
+ });
110
+ const endOfFirstNode = _slate.Editor.start(editor, nextPath);
111
+ const range = {
112
+ anchor: endOfFirstNode,
113
+ focus: endOfFirstNode
114
+ };
115
+ (0, _core.focusEditor)(editor, range);
116
+ }
108
117
  return;
109
118
  }
110
119
  _slate.Transforms.insertNodes(editor, imageNodes, {
@@ -165,7 +165,7 @@ const ImageHoverMenu = _ref => {
165
165
  style: menuPosition
166
166
  }, /*#__PURE__*/_react.default.createElement("div", {
167
167
  className: "hover-menu-container"
168
- }, type !== _constants2.TABLE && !readonly && /*#__PURE__*/_react.default.createElement("span", {
168
+ }, ![_constants2.TABLE, _constants2.BLOCKQUOTE, _constants2.CALL_OUT].includes(type) && !readonly && /*#__PURE__*/_react.default.createElement("span", {
169
169
  className: "op-group-item"
170
170
  }, /*#__PURE__*/_react.default.createElement("span", {
171
171
  role: "button",
@@ -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.unwrapLinkNode = exports.removeTempInput = exports.removeShortCutSymbol = exports.onCopySdocLinkNode = exports.isTriggeredByShortcut = exports.isMenuDisabled = exports.insertTextWhenRemoveFileNameCollector = exports.insertTempInput = exports.insertSdocFileLink = exports.getUrl = exports.getType = exports.getNewFileListData = exports.getFileSearchInputEntry = exports.getBeforeText = exports.generateSdocFileNode = void 0;
7
+ exports.unwrapLinkNode = exports.sdocFileIcon = exports.removeTempInput = exports.removeShortCutSymbol = exports.onCopySdocLinkNode = exports.isTriggeredByShortcut = exports.isMenuDisabled = exports.insertTextWhenRemoveFileNameCollector = exports.insertTempInput = exports.insertSdocFileLink = exports.getUrl = exports.getType = exports.getNewFileListData = exports.getFileSearchInputEntry = exports.getBeforeText = exports.generateSdocFileNode = void 0;
8
8
  var _slateReact = require("@seafile/slate-react");
9
9
  var _slate = require("@seafile/slate");
10
10
  var _slugid = _interopRequireDefault(require("slugid"));
@@ -273,4 +273,9 @@ const insertTextWhenRemoveFileNameCollector = (editor, searchInputNode) => {
273
273
  });
274
274
  removeTempInput(editor, searchInputNode);
275
275
  };
276
- exports.insertTextWhenRemoveFileNameCollector = insertTextWhenRemoveFileNameCollector;
276
+ exports.insertTextWhenRemoveFileNameCollector = insertTextWhenRemoveFileNameCollector;
277
+ const sdocFileIcon = () => {
278
+ const server = _context.default.getSetting('serviceUrl');
279
+ return `${server}/media/img/file/256/sdoc.png`;
280
+ };
281
+ exports.sdocFileIcon = sdocFileIcon;
@@ -1,5 +1,6 @@
1
1
  .sdoc-file-render:hover {
2
- background-color: #e5e5e5
2
+ background-color: #e5e5e5;
3
+ padding: 3px 0;
3
4
  }
4
5
 
5
6
  .sdoc-file-card-link {
@@ -25,13 +26,28 @@
25
26
 
26
27
  .sdoc-file-card-link .sdoc-file-link-icon {
27
28
  position: absolute;
28
- top: 6px;
29
+ top: 12px;
29
30
  left: 12px;
30
31
  }
31
32
 
33
+ .sdoc-file-render:not(.sdoc-file-card-link) .sdoc-file-link-icon .file-link-img {
34
+ width: 21.6px;
35
+ }
36
+
37
+ .sdoc-file-card-link .sdoc-file-link-icon .file-link-img {
38
+ width: 26px;
39
+ }
40
+
41
+ .sdoc-file-render .sdoc-file-text-link.sdoc-no-file-link-icon a {
42
+ font-weight: bold;
43
+ text-decoration: underline;
44
+ text-decoration-thickness: 2px;
45
+ color: #ff9800;
46
+ }
47
+
32
48
  .sdoc-file-card-link .sdoc-file-text-link {
33
49
  position: absolute;
34
- top: 16px;
50
+ top: 14px;
35
51
  left: 42px;
36
52
  }
37
53
 
@@ -9,6 +9,7 @@ exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _slate = require("@seafile/slate");
11
11
  var _slateReact = require("@seafile/slate-react");
12
+ var _classnames = _interopRequireDefault(require("classnames"));
12
13
  var _useScrollContext = require("../../../../hooks/use-scroll-context");
13
14
  var _helpers = require("../helpers");
14
15
  var _hoverMenu = _interopRequireDefault(require("../hover-menu"));
@@ -138,14 +139,18 @@ const SdocFileLink = _ref => {
138
139
  }, [_constants2.SDOC_LINK_TYPE.ICON_LINK, _constants2.SDOC_LINK_TYPE.CARD_LINK].includes(element.display_type) && /*#__PURE__*/_react.default.createElement("span", {
139
140
  className: "sdoc-file-link-icon",
140
141
  style: style
141
- }, element.type !== _elementType.WIKI_LINK && /*#__PURE__*/_react.default.createElement("i", {
142
- className: "sdocfont sdoc-document"
142
+ }, element.type !== _elementType.WIKI_LINK && /*#__PURE__*/_react.default.createElement("img", {
143
+ className: "file-link-img",
144
+ src: (0, _helpers.sdocFileIcon)(),
145
+ alt: ""
143
146
  }), element.type === _elementType.WIKI_LINK && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, icon && /*#__PURE__*/_react.default.createElement("span", null, icon), !icon && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isDir ? /*#__PURE__*/_react.default.createElement("span", {
144
147
  className: "sf3-font sf3-font-files2"
145
148
  }) : /*#__PURE__*/_react.default.createElement("span", {
146
149
  className: "sf3-font sf3-font-file"
147
150
  })))), /*#__PURE__*/_react.default.createElement("span", {
148
- className: 'sdoc-file-text-link',
151
+ className: (0, _classnames.default)('sdoc-file-text-link', {
152
+ 'sdoc-no-file-link-icon': ![_constants2.SDOC_LINK_TYPE.ICON_LINK, _constants2.SDOC_LINK_TYPE.CARD_LINK].includes(element.display_type)
153
+ }),
149
154
  style: style
150
155
  }, /*#__PURE__*/_react.default.createElement("a", {
151
156
  href: url,
@@ -12,20 +12,14 @@ var _core = require("../../../core");
12
12
  var _commons = require("../../../commons");
13
13
  var _helpers = require("../helpers");
14
14
  var _menusConfig = require("../../../constants/menus-config");
15
- const filterFontTypes = _ref => {
16
- let {
17
- id
18
- } = _ref;
19
- return [_menusConfig.BOLD, _menusConfig.ITALIC].includes(id);
20
- };
21
- const CommentEditorTextStyleMenuList = _ref2 => {
15
+ const CommentEditorTextStyleMenuList = _ref => {
22
16
  let {
23
17
  editor,
24
18
  isRichEditor,
25
19
  className,
26
20
  idPrefix,
27
21
  readonly
28
- } = _ref2;
22
+ } = _ref;
29
23
  const isActive = (0, _react.useCallback)(type => {
30
24
  const isMark = (0, _helpers.getValue)(editor, type);
31
25
  return !!isMark;
@@ -50,8 +44,10 @@ const CommentEditorTextStyleMenuList = _ref2 => {
50
44
  (0, _core.focusEditor)(editor);
51
45
  // eslint-disable-next-line react-hooks/exhaustive-deps
52
46
  }, [editor]);
53
- const getTextStyleList = (0, _react.useCallback)(key => {
54
- return _constants.MENUS_CONFIG_MAP[key].map(item => {
47
+ const getTextStyleList = (0, _react.useCallback)(() => {
48
+ const styleMenus = _constants.MENUS_CONFIG_MAP[_constants.TEXT_STYLE];
49
+ const commentMenus = styleMenus.filter(item => [_menusConfig.BOLD, _menusConfig.ITALIC].includes(item.id));
50
+ return commentMenus.map(item => {
55
51
  let itemProps = {
56
52
  isRichEditor,
57
53
  className,
@@ -68,7 +64,7 @@ const CommentEditorTextStyleMenuList = _ref2 => {
68
64
 
69
65
  // eslint-disable-next-line react-hooks/exhaustive-deps
70
66
  }, [editor, readonly]);
71
- const list = getTextStyleList(_constants.TEXT_STYLE).filter(filterFontTypes);
67
+ const list = getTextStyleList();
72
68
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, list.map((itemProps, index) => /*#__PURE__*/_react.default.createElement(_commons.MenuItem, Object.assign({
73
69
  key: index
74
70
  }, itemProps))));
@@ -17,15 +17,8 @@ var _fontSizeScale = _interopRequireDefault(require("../../font/menu/font-size/f
17
17
  var _helpers2 = require("../helpers");
18
18
  var _useColorContext = require("../../../../hooks/use-color-context");
19
19
  var _mouseEvent = require("../../../../utils/mouse-event");
20
- var _menusConfig = require("../../../constants/menus-config");
21
- var _constants2 = require("../../../../constants");
22
- const filterFontTypes = _ref => {
23
- let {
24
- id
25
- } = _ref;
26
- return [_menusConfig.BOLD, _menusConfig.ITALIC].includes(id);
27
- };
28
- const TextStyleMenuList = _ref2 => {
20
+ var _aiMenu = require("../../ai/ai-menu");
21
+ const TextStyleMenuList = _ref => {
29
22
  let {
30
23
  editor,
31
24
  t,
@@ -33,10 +26,9 @@ const TextStyleMenuList = _ref2 => {
33
26
  className,
34
27
  idPrefix,
35
28
  readonly
36
- } = _ref2;
29
+ } = _ref;
37
30
  let selectedFontSize = (0, _helpers.getFontSize)(editor);
38
31
  let selectedFontSizeValue = selectedFontSize;
39
- const isCommentEditor = editor.editorType === _constants2.COMMENT_EDITOR;
40
32
  const {
41
33
  lastUsedFontColor,
42
34
  updateLastUsedFontColor,
@@ -114,17 +106,13 @@ const TextStyleMenuList = _ref2 => {
114
106
  // eslint-disable-next-line react-hooks/exhaustive-deps
115
107
  }, [editor, lastUsedFontColor, lastUsedHighlightColor, readonly]);
116
108
  let list = getTextStyleList(_constants.TEXT_STYLE);
117
- // Filter for comment editor
118
- if (isCommentEditor) {
119
- list = list.filter(filterFontTypes);
120
- }
121
109
  const dropdownList = getTextStyleList(_constants.TEXT_STYLE_MORE);
122
110
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, list.map((itemProps, index) => {
123
111
  const Component = itemProps.isColor ? _commons.ColorMenu : _commons.MenuItem;
124
112
  return /*#__PURE__*/_react.default.createElement(Component, Object.assign({
125
113
  key: index
126
114
  }, itemProps));
127
- }), !isCommentEditor && /*#__PURE__*/_react.default.createElement(_commons.MoreDropdown, null, dropdownList.map((itemProps, index) => /*#__PURE__*/_react.default.createElement(_commons.MenuItem, Object.assign({
115
+ }), /*#__PURE__*/_react.default.createElement(_commons.MoreDropdown, null, dropdownList.map((itemProps, index) => /*#__PURE__*/_react.default.createElement(_commons.MenuItem, Object.assign({
128
116
  key: index
129
117
  }, itemProps))), /*#__PURE__*/_react.default.createElement(_fontSizeScale.default, {
130
118
  disabled: isDisabled(),
@@ -140,6 +128,8 @@ const TextStyleMenuList = _ref2 => {
140
128
  tipMessage: t('Reduce_font_size')
141
129
  }, /*#__PURE__*/_react.default.createElement("i", {
142
130
  className: "sdocfont sdoc-reduce-font-size"
143
- }))));
131
+ }))), idPrefix && /*#__PURE__*/_react.default.createElement(_aiMenu.AIContextMenu, {
132
+ isRichEditor: isRichEditor
133
+ }));
144
134
  };
145
135
  var _default = exports.default = (0, _reactI18next.withTranslation)('sdoc-editor')(TextStyleMenuList);
@@ -31,6 +31,7 @@ const isInsertVideoMenuDisabled = (editor, readonly) => {
31
31
  if (type === _constants.SUBTITLE) return true;
32
32
  if (type === _constants.LIST_ITEM) return true;
33
33
  if (type === _constants.CHECK_LIST_ITEM) return true;
34
+ if (type === _constants.MULTI_COLUMN) return true;
34
35
  if (_slate.Editor.isVoid(editor, n)) return true;
35
36
  return false;
36
37
  },
@@ -6,10 +6,15 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _react = _interopRequireDefault(require("react"));
9
+ var _slate = require("@seafile/slate");
10
+ var _isHotkey = _interopRequireDefault(require("is-hotkey"));
11
+ var _core = require("../../core");
9
12
  var _constants = require("../../constants");
13
+ var _helpers = require("../../toolbar/side-toolbar/helpers");
10
14
  const withVideo = editor => {
11
15
  const {
12
- isVoid
16
+ isVoid,
17
+ onHotKeyDown
13
18
  } = editor;
14
19
  const newEditor = editor;
15
20
 
@@ -23,6 +28,26 @@ const withVideo = editor => {
23
28
  }
24
29
  return isVoid(elem);
25
30
  };
31
+ newEditor.onHotKeyDown = event => {
32
+ const [videoNode, path] = (0, _core.getSelectedNodeEntryByType)(editor, _constants.VIDEO);
33
+ if (path) {
34
+ // Insert empty paragraph node after video when clicking 'enter' on selected video
35
+ if ((0, _isHotkey.default)('enter', event)) {
36
+ event.preventDefault();
37
+ const emptyParagraph = (0, _core.generateEmptyElement)(_constants.PARAGRAPH);
38
+ _slate.Transforms.insertNodes(editor, emptyParagraph, {
39
+ at: _slate.Path.next(path)
40
+ });
41
+ const focusPoint = _slate.Editor.end(editor, _slate.Path.next(path));
42
+ (0, _core.focusEditor)(newEditor, focusPoint);
43
+ }
44
+ if ((0, _isHotkey.default)('mod+c', event)) {
45
+ (0, _helpers.onCopyNode)(editor, videoNode);
46
+ }
47
+ return true;
48
+ }
49
+ return onHotKeyDown && onHotKeyDown(event);
50
+ };
26
51
  return newEditor;
27
52
  };
28
53
  var _default = exports.default = withVideo;
@@ -47,6 +47,13 @@ const SideToolbar = () => {
47
47
  const handleClick = (0, _react.useCallback)(e => {
48
48
  if (!isShowSideMenu || !menuRef.current) return;
49
49
  const isClickSideTool = menuRef.current.contains(e.target);
50
+ const sideAskAI = document.querySelector('#side-toolbar-ai');
51
+ if (sideAskAI && sideAskAI.contains(e.target)) {
52
+ setTimeout(() => {
53
+ setShowSideMenu(!isShowSideMenu);
54
+ }, 0);
55
+ return;
56
+ }
50
57
  if (isClickSideTool || !sideMenuRef.current) return;
51
58
  const {
52
59
  sideMenuDom
@@ -21,6 +21,7 @@ var _transformMenus = _interopRequireDefault(require("./transform-menus"));
21
21
  var _dropdownMenuItem = _interopRequireDefault(require("../../commons/dropdown-menu-item"));
22
22
  var _toast = _interopRequireDefault(require("../../../../components/toast"));
23
23
  var _constants = require("../../constants");
24
+ var _aiMenu = require("../../plugins/ai/ai-menu");
24
25
  require("./side-menu.css");
25
26
  const SideMenu = (_ref, ref) => {
26
27
  let {
@@ -211,7 +212,9 @@ const SideMenu = (_ref, ref) => {
211
212
  isHidden: !otherOperatonsMenuSearchMap['COPY_LINK_OF_SECTION']
212
213
  }), !otherOperatonsMenuSearchMap['searching'] && /*#__PURE__*/_react.default.createElement("div", {
213
214
  className: "sdoc-dropdown-menu-divider"
214
- })), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
215
+ })), /*#__PURE__*/_react.default.createElement(_aiMenu.AIDropdownMenu, {
216
+ slateNode: slateNode
217
+ }), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
215
218
  menuConfig: {
216
219
  text: 'Copy',
217
220
  iconClass: 'sdocfont sdoc-copy'
@@ -11,11 +11,14 @@ var _reactI18next = require("react-i18next");
11
11
  var _reactstrap = require("reactstrap");
12
12
  var _context = _interopRequireDefault(require("../../../../context"));
13
13
  var _toast = _interopRequireDefault(require("../../../toast"));
14
+ var _basicSdk = require("../../../../basic-sdk");
15
+ var _constants = require("../../../../constants");
14
16
  require("./index.css");
15
17
  const MoreRevisionOperations = _ref => {
16
18
  let {
17
19
  t
18
20
  } = _ref;
21
+ const eventBus = _basicSdk.EventBus.getInstance();
19
22
  const [isDropdownOpen, setIsDropdownOpen] = (0, _react.useState)(false);
20
23
  const toggleDropdown = (0, _react.useCallback)(isDropdownOpen => {
21
24
  setIsDropdownOpen(!isDropdownOpen);
@@ -26,6 +29,7 @@ const MoreRevisionOperations = _ref => {
26
29
  const siteRoot = _context.default.getSetting('siteRoot');
27
30
  const revisionURL = `${siteRoot}lib/${repoID}/revisions/${res.data.revision_id}/`;
28
31
  window.open(revisionURL, '_blank');
32
+ eventBus.dispatch(_constants.EXTERNAL_EVENT.NEW_REVISION);
29
33
  }).catch(error => {
30
34
  _toast.default.danger(t('Error'));
31
35
  });
@@ -12,13 +12,19 @@ var _context = _interopRequireDefault(require("../../../../context"));
12
12
  var _revisionsDialog = _interopRequireDefault(require("./revisions-dialog"));
13
13
  var _utils = require("../../../../utils");
14
14
  var _toast = _interopRequireDefault(require("../../../toast"));
15
+ var _basicSdk = require("../../../../basic-sdk");
16
+ var _constants = require("../../../../constants");
15
17
  require("./index.css");
16
18
  const Revisions = () => {
19
+ const eventBus = _basicSdk.EventBus.getInstance();
17
20
  const {
18
21
  t
19
22
  } = (0, _reactI18next.useTranslation)();
20
23
  const [revisionsCount, setRevisionsCount] = (0, _react.useState)(0);
21
24
  const [isShowRevisions, setShowRevisions] = (0, _react.useState)(false);
25
+ const autoIncrementRevisionsCount = (0, _react.useCallback)(() => {
26
+ setRevisionsCount(revisionsCount + 1);
27
+ }, [revisionsCount]);
22
28
 
23
29
  // did mount
24
30
  (0, _react.useEffect)(() => {
@@ -32,6 +38,13 @@ const Revisions = () => {
32
38
 
33
39
  // eslint-disable-next-line react-hooks/exhaustive-deps
34
40
  }, []);
41
+ (0, _react.useEffect)(() => {
42
+ const autoIncrementRevisionSubscribe = eventBus.subscribe(_constants.EXTERNAL_EVENT.NEW_REVISION, autoIncrementRevisionsCount);
43
+ return () => {
44
+ autoIncrementRevisionSubscribe();
45
+ };
46
+ // eslint-disable-next-line react-hooks/exhaustive-deps
47
+ }, [autoIncrementRevisionsCount]);
35
48
  const showRevisions = (0, _react.useCallback)(() => {
36
49
  setShowRevisions(true);
37
50
  }, []);
@@ -40,7 +40,9 @@ const EXTERNAL_EVENT = exports.EXTERNAL_EVENT = {
40
40
  INSERT_LINK: 'insert_link',
41
41
  // document
42
42
  COLLABORATORS_UPDATED: 'collaborators_updated',
43
- IMAGE_COLUMN_TOGGLE: 'Image_column_toggle'
43
+ IMAGE_COLUMN_TOGGLE: 'Image_column_toggle',
44
+ // revise
45
+ NEW_REVISION: 'new_revision'
44
46
  };
45
47
  const TIP_TYPE = exports.TIP_TYPE = {
46
48
  DELETE_NO_CHANGES_REVISION: 'delete_no_changes_revision',
package/dist/context.js CHANGED
@@ -223,6 +223,10 @@ class Context {
223
223
  const docUuid = this.getSetting('docUuid');
224
224
  return this.api.searchSdocFiles(docUuid, query, page, per_page);
225
225
  }
226
+ getSearchFilesByFilename(query, page, per_page, search_type) {
227
+ const docUuid = this.getSetting('docUuid');
228
+ return this.api.searchFilesByFilename(docUuid, query, page, per_page, search_type);
229
+ }
226
230
 
227
231
  // participants
228
232
  listParticipants() {
@@ -255,6 +259,10 @@ class Context {
255
259
  const docUuid = this.getDocUuid();
256
260
  return this.api.readAllNotifications(docUuid);
257
261
  }
262
+ aiTranslate(text, lang) {
263
+ const docUuid = this.getDocUuid();
264
+ return this.api.aiTranslate(docUuid, text, lang);
265
+ }
258
266
  updateConfigUuid(docUuid) {
259
267
  if (!this.config) return;
260
268
  this.config['docUuid'] = docUuid;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "1.0.176",
3
+ "version": "1.0.178",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",
@@ -581,5 +581,27 @@
581
581
  "Page": "Page",
582
582
  "Share_1": "Sdílet",
583
583
  "Collect": "Collect",
584
- "Collected": "Collected"
584
+ "Collected": "Collected",
585
+ "Link_to_file": "Link to file",
586
+ "Create_a_new_file": "Create a new file",
587
+ "Suggestion": "Návrh",
588
+ "Continuation": "Continuation",
589
+ "More_details": "More details",
590
+ "More_concise": "More concise",
591
+ "More_vivid": "More vivid",
592
+ "Translate": "Translate",
593
+ "Adjustment": "Adjustment",
594
+ "Try_again": "Try again",
595
+ "Deprecation": "Deprecation",
596
+ "Generated_content_x_words": "Generated content {{count}} words",
597
+ "Ask_AI_anything": "Ask AI anything...",
598
+ "Thinking": "Thinking...",
599
+ "Translation_error_message": "Translation error, please try again.",
600
+ "The_translation_content_cannot_be_empty": "The translation content cannot be empty",
601
+ "Processing_message": "Processing, please wait...",
602
+ "AI_tip_content": "Discard current content?",
603
+ "Discard": "Zrušit změny",
604
+ "English": "English",
605
+ "Chinese": "Chinese",
606
+ "Ask_AI": "Ask AI"
585
607
  }
@@ -581,5 +581,27 @@
581
581
  "Page": "Page",
582
582
  "Share_1": "Freigeben",
583
583
  "Collect": "Collect",
584
- "Collected": "Collected"
584
+ "Collected": "Collected",
585
+ "Link_to_file": "Link to file",
586
+ "Create_a_new_file": "Create a new file",
587
+ "Suggestion": "Vorschlag",
588
+ "Continuation": "Continuation",
589
+ "More_details": "More details",
590
+ "More_concise": "More concise",
591
+ "More_vivid": "More vivid",
592
+ "Translate": "Translate",
593
+ "Adjustment": "Adjustment",
594
+ "Try_again": "Try again",
595
+ "Deprecation": "Deprecation",
596
+ "Generated_content_x_words": "Generated content {{count}} words",
597
+ "Ask_AI_anything": "Ask AI anything...",
598
+ "Thinking": "Thinking...",
599
+ "Translation_error_message": "Translation error, please try again.",
600
+ "The_translation_content_cannot_be_empty": "The translation content cannot be empty",
601
+ "Processing_message": "Processing, please wait...",
602
+ "AI_tip_content": "Discard current content?",
603
+ "Discard": "Verwerfen",
604
+ "English": "English",
605
+ "Chinese": "Chinese",
606
+ "Ask_AI": "KI fragen"
585
607
  }