@seafile/sdoc-editor 1.0.106 → 1.0.108

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.
@@ -28,6 +28,20 @@
28
28
  align-items: center;
29
29
  }
30
30
 
31
+ .sdoc-dropdown-menu .sdoc-dropdown-menu-item-no-results {
32
+ height: 30px;
33
+ width: 100%;
34
+ padding: 4px 24px;
35
+ user-select: none;
36
+ display: flex;
37
+ align-items: center;
38
+ font-size: 14px;
39
+ }
40
+
41
+ .sdoc-dropdown-menu .sdoc-dropdown-menu-item-hidden {
42
+ display: none;
43
+ }
44
+
31
45
  .sdoc-dropdown-menu .sdoc-dropdown-menu-item.disabled,
32
46
  .sdoc-dropdown-menu .sdoc-dropdown-menu-item.disabled .sdoc-dropdown-item-content-icon {
33
47
  color: #c2c2c2 !important;
@@ -18,7 +18,8 @@ const DropdownMenuItem = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
18
18
  menuConfig,
19
19
  children,
20
20
  className,
21
- shortcut
21
+ shortcut,
22
+ isHidden
22
23
  } = props;
23
24
  const {
24
25
  t
@@ -37,7 +38,8 @@ const DropdownMenuItem = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
37
38
  className: (0, _classnames.default)('sdoc-dropdown-menu-item', className, {
38
39
  'disabled': disabled,
39
40
  'sdoc-dropdown-item-with-left-icon': iconClass,
40
- 'sdoc-link-dropdown-menu-item': shortcut
41
+ 'sdoc-link-dropdown-menu-item': shortcut,
42
+ 'sdoc-dropdown-menu-item-hidden': isHidden
41
43
  }),
42
44
  id: menuConfig.id || '',
43
45
  onClick: disabled ? () => {} : onClick || (() => {}),
@@ -325,12 +325,24 @@ Object.defineProperty(exports, "SIDE_INSERT_MENUS_CONFIG", {
325
325
  return _menusConfig.SIDE_INSERT_MENUS_CONFIG;
326
326
  }
327
327
  });
328
+ Object.defineProperty(exports, "SIDE_INSERT_MENUS_SEARCH_MAP", {
329
+ enumerable: true,
330
+ get: function () {
331
+ return _menusConfig.SIDE_INSERT_MENUS_SEARCH_MAP;
332
+ }
333
+ });
328
334
  Object.defineProperty(exports, "SIDE_TRANSFORM_MENUS_CONFIG", {
329
335
  enumerable: true,
330
336
  get: function () {
331
337
  return _menusConfig.SIDE_TRANSFORM_MENUS_CONFIG;
332
338
  }
333
339
  });
340
+ Object.defineProperty(exports, "SIDE_TRANSFORM_MENUS_SEARCH_MAP", {
341
+ enumerable: true,
342
+ get: function () {
343
+ return _menusConfig.SIDE_TRANSFORM_MENUS_SEARCH_MAP;
344
+ }
345
+ });
334
346
  Object.defineProperty(exports, "STANDARD_COLORS", {
335
347
  enumerable: true,
336
348
  get: function () {
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.UNDO = exports.TEXT_STYLE_MORE = exports.TEXT_STYLE_MAP = exports.TEXT_STYLE = exports.TEXT_ALIGN = exports.SIDE_TRANSFORM_MENUS_CONFIG = exports.SIDE_INSERT_MENUS_CONFIG = exports.SEARCH_REPLACE = exports.REMOVE_TABLE = exports.REDO = exports.MENUS_CONFIG_MAP = exports.ITALIC = exports.COMBINE_CELL = exports.CLEAR_FORMAT = exports.BOLD = void 0;
6
+ exports.UNDO = exports.TEXT_STYLE_MORE = exports.TEXT_STYLE_MAP = exports.TEXT_STYLE = exports.TEXT_ALIGN = exports.SIDE_TRANSFORM_MENUS_SEARCH_MAP = exports.SIDE_TRANSFORM_MENUS_CONFIG = exports.SIDE_INSERT_MENUS_SEARCH_MAP = exports.SIDE_INSERT_MENUS_CONFIG = exports.SEARCH_REPLACE = exports.REMOVE_TABLE = exports.REDO = exports.MENUS_CONFIG_MAP = exports.ITALIC = exports.COMBINE_CELL = exports.CLEAR_FORMAT = exports.BOLD = void 0;
7
7
  var _color = require("./color");
8
8
  var _elementType = require("./element-type");
9
9
  const UNDO = exports.UNDO = 'undo';
@@ -285,6 +285,24 @@ const SIDE_TRANSFORM_MENUS_CONFIG = exports.SIDE_TRANSFORM_MENUS_CONFIG = [{
285
285
  type: _elementType.CALL_OUT,
286
286
  text: 'Callout'
287
287
  }];
288
+ const SIDE_TRANSFORM_MENUS_SEARCH_MAP = exports.SIDE_TRANSFORM_MENUS_SEARCH_MAP = {
289
+ [_elementType.PARAGRAPH]: 'Paragraph',
290
+ [_elementType.HEADER1]: 'Header_one',
291
+ [_elementType.HEADER2]: 'Header_two',
292
+ [_elementType.HEADER3]: 'Header_three',
293
+ [_elementType.HEADER4]: 'Header_four',
294
+ [_elementType.HEADER5]: 'Header_five',
295
+ [_elementType.HEADER6]: 'Header_six',
296
+ [_elementType.UNORDERED_LIST]: 'Unordered_list',
297
+ [_elementType.ORDERED_LIST]: 'Ordered_list',
298
+ [_elementType.CHECK_LIST_ITEM]: 'Check_list',
299
+ [_elementType.BLOCKQUOTE]: 'Quote',
300
+ [_elementType.CALL_OUT]: 'Callout',
301
+ 'COPY_LINK_OF_SECTION': 'Copy_link_of_section',
302
+ 'COPY': 'Copy',
303
+ 'CUT': 'Cut',
304
+ 'DELETE': 'Delete'
305
+ };
288
306
 
289
307
  // Side insert menu config
290
308
  const SIDE_INSERT_MENUS_CONFIG = exports.SIDE_INSERT_MENUS_CONFIG = {
@@ -368,4 +386,21 @@ const SIDE_INSERT_MENUS_CONFIG = exports.SIDE_INSERT_MENUS_CONFIG = {
368
386
  type: _elementType.BLOCKQUOTE,
369
387
  text: 'Quote'
370
388
  }
389
+ };
390
+ const SIDE_INSERT_MENUS_SEARCH_MAP = exports.SIDE_INSERT_MENUS_SEARCH_MAP = {
391
+ [_elementType.IMAGE]: 'Image',
392
+ [_elementType.TABLE]: 'Table',
393
+ [_elementType.LINK]: 'Link',
394
+ [_elementType.CODE_BLOCK]: 'Code_block',
395
+ [_elementType.CALL_OUT]: 'Callout',
396
+ [_elementType.UNORDERED_LIST]: 'Unordered_list',
397
+ [_elementType.ORDERED_LIST]: 'Ordered_list',
398
+ [_elementType.CHECK_LIST_ITEM]: 'Check_list',
399
+ [_elementType.PARAGRAPH]: 'Paragraph',
400
+ [_elementType.HEADER1]: 'Header_one',
401
+ [_elementType.HEADER2]: 'Header_two',
402
+ [_elementType.HEADER3]: 'Header_three',
403
+ [_elementType.HEADER4]: 'Header_four',
404
+ [_elementType.COLUMN]: 'SeaTable_column',
405
+ [_elementType.SEATABLE_TABLE]: 'SeaTable_table'
371
406
  };
@@ -12,7 +12,7 @@ const FILE_LINK_TYPE = exports.FILE_LINK_TYPE = {
12
12
  const FILE_LINK_TYPE_CONFIG = exports.FILE_LINK_TYPE_CONFIG = {
13
13
  [FILE_LINK_TYPE.TEXT_LINK]: {
14
14
  icon: 'sdocfont sdoc-text-link',
15
- text: 'Text_link'
15
+ text: 'Text_Link'
16
16
  },
17
17
  [FILE_LINK_TYPE.ICON_LINK]: {
18
18
  icon: 'sdocfont sdoc-inline-link',
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
+ var _classnames = _interopRequireDefault(require("classnames"));
10
11
  var _constants = require("../../../constants");
11
12
  var _dropdownMenuItem = _interopRequireDefault(require("../../../commons/dropdown-menu-item"));
12
13
  var _columnListMenu = _interopRequireDefault(require("./column-list-menu"));
@@ -17,7 +18,8 @@ const SeaTableColumnMenu = _ref => {
17
18
  editor,
18
19
  readonly,
19
20
  insertPosition,
20
- toggle
21
+ toggle,
22
+ isHidden
21
23
  } = _ref;
22
24
  const dropDownMenuRef = (0, _react.useRef)(null);
23
25
  const disabled = (0, _helpers.isMenuDisabled)(editor, readonly);
@@ -25,7 +27,9 @@ const SeaTableColumnMenu = _ref => {
25
27
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
26
28
  disabled: disabled,
27
29
  menuConfig: menuConfig,
28
- className: "pr-2 sdoc-dropdown-menu-item-relative",
30
+ className: (0, _classnames.default)('pr-2 sdoc-dropdown-menu-item-relative', {
31
+ 'sdoc-dropdown-menu-item-hidden': isHidden
32
+ }),
29
33
  ref: dropDownMenuRef
30
34
  }, !disabled && /*#__PURE__*/_react.default.createElement("i", {
31
35
  className: "sdocfont sdoc-right-slide sdoc-dropdown-item-right-icon"
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
+ var _classnames = _interopRequireDefault(require("classnames"));
10
11
  var _reactstrap = require("reactstrap");
11
12
  var _helpers = require("../helpers");
12
13
  var _constants = require("../../../constants");
@@ -18,7 +19,8 @@ const SeaTableTableMenu = _ref => {
18
19
  editor,
19
20
  readonly,
20
21
  insertPosition,
21
- toggle
22
+ toggle,
23
+ isHidden
22
24
  } = _ref;
23
25
  const dropDownMenuRef = (0, _react.useRef)(null);
24
26
  const disabled = (0, _helpers.isInsertSeaTableTableDisabled)(editor, readonly);
@@ -30,7 +32,9 @@ const SeaTableTableMenu = _ref => {
30
32
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
31
33
  disabled: disabled,
32
34
  menuConfig: menuConfig,
33
- className: "pr-2 sdoc-dropdown-menu-item-relative",
35
+ className: (0, _classnames.default)('pr-2 sdoc-dropdown-menu-item-relative', {
36
+ 'sdoc-dropdown-menu-item-hidden': isHidden
37
+ }),
34
38
  ref: dropDownMenuRef
35
39
  }, !disabled && /*#__PURE__*/_react.default.createElement("i", {
36
40
  className: "sdocfont sdoc-right-slide sdoc-dropdown-item-right-icon"
@@ -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.setSelection = exports.onWrapListItem = exports.onSetNodeType = exports.onDeleteNode = exports.onCopyNode = exports.isVoidNode = exports.isNotSupportTransform = exports.isList = exports.isBlockquote = exports.insertElement = exports.getTopValue = exports.getNodeEntry = exports.getListNode = void 0;
7
+ exports.setSelection = exports.onWrapListItem = exports.onSetNodeType = exports.onDeleteNode = exports.onCopyNode = exports.isVoidNode = exports.isNotSupportTransform = exports.isList = exports.isBlockquote = exports.insertElement = exports.getTransformMenusConfig = exports.getTopValue = exports.getSearchedOperations = exports.getNodeEntry = exports.getListNode = void 0;
8
8
  var _slate = require("@seafile/slate");
9
9
  var _slugid = _interopRequireDefault(require("slugid"));
10
10
  var _slateReact = require("@seafile/slate-react");
@@ -216,4 +216,60 @@ const onWrapListItem = (editor, targetPath, sourcePath) => {
216
216
  });
217
217
  return;
218
218
  };
219
- exports.onWrapListItem = onWrapListItem;
219
+ exports.onWrapListItem = onWrapListItem;
220
+ const getTransformMenusConfig = (editor, slateNode) => {
221
+ let newSideMenusConfig = _constants.SIDE_TRANSFORM_MENUS_CONFIG;
222
+ if (_constants.LIST_ITEM_CORRELATION_TYPE.includes(slateNode.type)) {
223
+ newSideMenusConfig = _constants.SIDE_TRANSFORM_MENUS_CONFIG.filter(item => _constants.LIST_ITEM_SUPPORTED_TRANSFORMATION.includes(item.type));
224
+ }
225
+ const path = _slateReact.ReactEditor.findPath(editor, slateNode);
226
+ if (path) {
227
+ const nodeIndex = path[0];
228
+ const highestNode = editor.children[nodeIndex];
229
+ if (path.length > 1) {
230
+ if (highestNode.type === _constants.BLOCKQUOTE) {
231
+ newSideMenusConfig = _constants.SIDE_TRANSFORM_MENUS_CONFIG.filter(item => item.type !== _constants.CALL_OUT);
232
+ }
233
+ }
234
+
235
+ // headers can't be nested by quote block
236
+ if (_constants.HEADERS.includes(highestNode.type)) {
237
+ newSideMenusConfig = _constants.SIDE_TRANSFORM_MENUS_CONFIG.filter(item => item.type !== _constants.BLOCKQUOTE);
238
+ }
239
+ if ([_constants.ORDERED_LIST, _constants.UNORDERED_LIST].includes(highestNode.type)) {
240
+ // If it's not the top list item, cannot be converted to checks
241
+ if (!(0, _core.isTopLevelListItem)(editor)) {
242
+ newSideMenusConfig = _constants.SIDE_TRANSFORM_MENUS_CONFIG.filter(item => item.type !== _constants.CALL_OUT);
243
+ }
244
+ // Multi-level list items cannot be converted to checks
245
+ if ((0, _core.isMultiLevelList)(highestNode)) {
246
+ newSideMenusConfig = newSideMenusConfig.filter(item => item.type !== _constants.CHECK_LIST_ITEM);
247
+ }
248
+ }
249
+ }
250
+ return newSideMenusConfig;
251
+ };
252
+ exports.getTransformMenusConfig = getTransformMenusConfig;
253
+ const getSearchedOperations = (sourceMenuSearchMap, isNodeEmpty, event, t) => {
254
+ let menuSearchMap = {};
255
+ if (event.target.value.trim()) {
256
+ Object.keys(sourceMenuSearchMap).forEach(key => {
257
+ const value = sourceMenuSearchMap[key];
258
+ const sourceStr = t(value).toUpperCase();
259
+ const targetStr = event.target.value.trim().toUpperCase();
260
+ if (sourceStr.includes(targetStr)) {
261
+ menuSearchMap[key] = value;
262
+ }
263
+ });
264
+ if (!isNodeEmpty) {
265
+ menuSearchMap['searchingForTransformMenu'] = true; // Used to identify the search for Transform menu list
266
+ }
267
+ } else {
268
+ menuSearchMap = sourceMenuSearchMap;
269
+ if (!isNodeEmpty) {
270
+ menuSearchMap['searchingForTransformMenu'] = false;
271
+ }
272
+ }
273
+ return menuSearchMap;
274
+ };
275
+ exports.getSearchedOperations = getSearchedOperations;
@@ -9,6 +9,7 @@ exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _slateReact = require("@seafile/slate-react");
11
11
  var _slate = require("@seafile/slate");
12
+ var _reactI18next = require("react-i18next");
12
13
  var _helpers = require("./helpers");
13
14
  var _helpers2 = require("../../plugins/table/helpers");
14
15
  var _tableSizePopover = _interopRequireDefault(require("../../plugins/table/popover/table-size-popover"));
@@ -26,9 +27,13 @@ const InsertBlockMenu = _ref => {
26
27
  let {
27
28
  insertPosition,
28
29
  slateNode,
29
- isNodeEmpty
30
+ isNodeEmpty,
31
+ insertMenuSearchMap = _constants.SIDE_INSERT_MENUS_SEARCH_MAP
30
32
  } = _ref;
31
33
  const editor = (0, _slateReact.useSlateStatic)();
34
+ const {
35
+ t
36
+ } = (0, _reactI18next.useTranslation)();
32
37
  const onInsertImageToggle = (0, _react.useCallback)(() => {
33
38
  const eventBus = _eventBus.default.getInstance();
34
39
  if (insertPosition === _constants.INSERT_POSITION.CURRENT) {
@@ -85,11 +90,13 @@ const InsertBlockMenu = _ref => {
85
90
  }
86
91
  }, [editor, insertPosition]);
87
92
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
93
+ isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.IMAGE],
88
94
  menuConfig: {
89
95
  ..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.IMAGE]
90
96
  },
91
97
  onClick: onInsertImageToggle
92
98
  }), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
99
+ isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.TABLE],
93
100
  menuConfig: {
94
101
  ..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.TABLE]
95
102
  },
@@ -104,21 +111,25 @@ const InsertBlockMenu = _ref => {
104
111
  popperClassName: "sdoc-side-menu-table-size",
105
112
  createTable: createTable
106
113
  })), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
114
+ isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.LINK],
107
115
  menuConfig: {
108
116
  ..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.LINK]
109
117
  },
110
118
  onClick: openLinkDialog
111
119
  }), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
120
+ isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.CODE_BLOCK],
112
121
  menuConfig: {
113
122
  ..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.CODE_BLOCK]
114
123
  },
115
124
  onClick: onInsertCodeBlock
116
125
  }), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
126
+ isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.CALL_OUT],
117
127
  menuConfig: {
118
128
  ..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.CALL_OUT]
119
129
  },
120
130
  onClick: () => onInsertCallout(_constants.PARAGRAPH)
121
131
  }), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
132
+ isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.UNORDERED_LIST],
122
133
  menuConfig: {
123
134
  ..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.UNORDERED_LIST]
124
135
  },
@@ -126,6 +137,7 @@ const InsertBlockMenu = _ref => {
126
137
  onInsertList(_constants.ELEMENT_TYPE.UNORDERED_LIST);
127
138
  }
128
139
  }), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
140
+ isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.ORDERED_LIST],
129
141
  menuConfig: {
130
142
  ..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.ORDERED_LIST]
131
143
  },
@@ -133,26 +145,32 @@ const InsertBlockMenu = _ref => {
133
145
  onInsertList(_constants.ELEMENT_TYPE.ORDERED_LIST);
134
146
  }
135
147
  }), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
148
+ isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.CHECK_LIST_ITEM],
136
149
  menuConfig: {
137
150
  ..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.CHECK_LIST_ITEM]
138
151
  },
139
152
  onClick: onInsertCheckList
140
153
  }), [_constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.PARAGRAPH], ..._constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.HEADER]].map(item => {
141
154
  return /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
155
+ isHidden: !insertMenuSearchMap[item.type],
142
156
  disabled: isNodeEmpty && item.type === _constants.PARAGRAPH,
143
157
  key: item.id,
144
158
  menuConfig: item,
145
159
  onClick: () => onInsert(item.type)
146
160
  });
147
161
  }), editor.columns && /*#__PURE__*/_react.default.createElement(_menu.default, {
162
+ isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.COLUMN],
148
163
  editor: editor,
149
164
  readonly: editor.readonly,
150
165
  insertPosition: insertPosition
151
166
  }), editor.tables && /*#__PURE__*/_react.default.createElement(_menu2.default, {
167
+ isHidden: !insertMenuSearchMap[_constants.ELEMENT_TYPE.SEATABLE_TABLE],
152
168
  editor: editor,
153
169
  readonly: editor.readonly,
154
170
  insertPosition: insertPosition
155
- }));
171
+ }), Object.keys(insertMenuSearchMap).length === 0 && /*#__PURE__*/_react.default.createElement("div", {
172
+ className: "sdoc-dropdown-menu-item-no-results"
173
+ }, t('No_results')));
156
174
  };
157
175
  InsertBlockMenu.defaultProps = {
158
176
  insertPosition: _constants.INSERT_POSITION.CURRENT
@@ -14,6 +14,15 @@
14
14
  z-index: 999;
15
15
  }
16
16
 
17
+ .sdoc-side-menu .sdoc-side-menu-search-wrapper {
18
+ padding: 12px;
19
+ }
20
+
21
+ .sdoc-side-menu .sdoc-side-menu-search-wrapper input {
22
+ max-height: 30px;
23
+ font-size: 14px;
24
+ }
25
+
17
26
  .sdoc-side-menu-insert-below-popover .popover {
18
27
  background-color: #fff;
19
28
  min-width: 150px;
@@ -9,6 +9,7 @@ exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _reactI18next = require("react-i18next");
11
11
  var _slateReact = require("@seafile/slate-react");
12
+ var _reactstrap = require("reactstrap");
12
13
  var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
13
14
  var _context = _interopRequireDefault(require("../../../../context"));
14
15
  var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
@@ -31,6 +32,8 @@ const SideMenu = (_ref, ref) => {
31
32
  } = _ref;
32
33
  const sideMenuRef = (0, _react.useRef)(null);
33
34
  const [menuStyle, setMenuStyle] = (0, _react.useState)('');
35
+ const [insertMenuSearchMap, setInsertMenuSearchMap] = (0, _react.useState)();
36
+ const [transformMenuSearchMap, setTransformMenuSearchMap] = (0, _react.useState)(_constants.SIDE_TRANSFORM_MENUS_SEARCH_MAP);
34
37
  const editor = (0, _slateReact.useSlateStatic)();
35
38
  (0, _react.useEffect)(() => {
36
39
  const eventBus = _eventBus.default.getInstance();
@@ -78,13 +81,45 @@ const SideMenu = (_ref, ref) => {
78
81
  sideMenuDom: sideMenuRef.current
79
82
  };
80
83
  }, []);
84
+ const onSetType = (0, _react.useCallback)(newType => {
85
+ (0, _helpers.onSetNodeType)(editor, slateNode, newType);
86
+ onReset();
87
+ // eslint-disable-next-line react-hooks/exhaustive-deps
88
+ }, []);
89
+ const onChange = (0, _react.useCallback)(e => {
90
+ if (!sideMenuRef.current.isInputtingChinese) {
91
+ if (isNodeEmpty) {
92
+ const newMenuSearchMap = (0, _helpers.getSearchedOperations)(_constants.SIDE_INSERT_MENUS_SEARCH_MAP, isNodeEmpty, e, t);
93
+ setInsertMenuSearchMap(newMenuSearchMap);
94
+ }
95
+ if (!isNodeEmpty) {
96
+ const newMenuSearchMap = (0, _helpers.getSearchedOperations)(_constants.SIDE_TRANSFORM_MENUS_SEARCH_MAP, isNodeEmpty, e, t);
97
+ setTransformMenuSearchMap(newMenuSearchMap);
98
+ }
99
+ }
100
+ }, [t, isNodeEmpty]);
101
+ const onCompositionStart = (0, _react.useCallback)(() => {
102
+ sideMenuRef.current.isInputtingChinese = true;
103
+ }, []);
104
+ const onCompositionEnd = (0, _react.useCallback)(e => {
105
+ sideMenuRef.current.isInputtingChinese = false;
106
+ onChange(e);
107
+ }, [onChange]);
81
108
  return /*#__PURE__*/_react.default.createElement(_commons.ElementPopover, {
82
109
  className: "sdoc-side-menu-popover",
83
110
  style: menuStyle
84
111
  }, /*#__PURE__*/_react.default.createElement("div", {
85
112
  className: "sdoc-side-menu sdoc-dropdown-menu",
86
113
  ref: sideMenuRef
87
- }, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !isNodeEmpty && !(0, _helpers.isNotSupportTransform)(slateNode) && /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
114
+ }, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
115
+ className: "sdoc-side-menu-search-wrapper"
116
+ }, /*#__PURE__*/_react.default.createElement(_reactstrap.Input, {
117
+ autoFocus: true,
118
+ placeholder: t('Search_action...'),
119
+ onChange: onChange,
120
+ onCompositionStart: onCompositionStart,
121
+ onCompositionEnd: onCompositionEnd
122
+ })), !isNodeEmpty && !(0, _helpers.isNotSupportTransform)(slateNode) && !transformMenuSearchMap['searchingForTransformMenu'] && /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
88
123
  menuConfig: {
89
124
  id: 'sdoc-side-menu-item-transform',
90
125
  text: 'Transform_to',
@@ -96,51 +131,67 @@ const SideMenu = (_ref, ref) => {
96
131
  }), /*#__PURE__*/_react.default.createElement(_transformMenus.default, {
97
132
  target: "sdoc-side-menu-item-transform",
98
133
  slateNode: slateNode,
99
- onReset: onReset
134
+ editor: editor,
135
+ onSetType: onSetType
100
136
  }))), isNodeEmpty && /*#__PURE__*/_react.default.createElement(_insertBlockMenu.default, {
101
137
  isNodeEmpty: isNodeEmpty,
102
- slateNode: slateNode
138
+ slateNode: slateNode,
139
+ insertMenuSearchMap: insertMenuSearchMap
103
140
  }), !isNodeEmpty && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
104
141
  menuConfig: {
105
142
  id: 'sdoc-side-menu-item-insert-below',
106
143
  text: 'Insert_below',
107
144
  iconClass: 'sdocfont sdoc-insert'
108
145
  },
109
- className: "pr-2 sdoc-dropdown-menu-item-relative"
146
+ className: "pr-2 sdoc-dropdown-menu-item-relative",
147
+ isHidden: transformMenuSearchMap['searchingForTransformMenu']
110
148
  }, /*#__PURE__*/_react.default.createElement("i", {
111
149
  className: "sdocfont sdoc-right-slide sdoc-dropdown-item-right-icon"
112
150
  }), /*#__PURE__*/_react.default.createElement(_insertBelowMenu.default, {
113
151
  target: "sdoc-side-menu-item-insert-below",
114
152
  slateNode: slateNode
115
- })), /*#__PURE__*/_react.default.createElement("div", {
153
+ })), transformMenuSearchMap['searchingForTransformMenu'] && (0, _helpers.getTransformMenusConfig)(editor, slateNode).map(item => {
154
+ return /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
155
+ isHidden: !transformMenuSearchMap[item.type],
156
+ key: item.id,
157
+ menuConfig: item,
158
+ onClick: () => onSetType(item.type)
159
+ });
160
+ }), !transformMenuSearchMap['searchingForTransformMenu'] && /*#__PURE__*/_react.default.createElement("div", {
116
161
  className: "sdoc-dropdown-menu-divider"
117
162
  }), [_constants.HEADER1, _constants.HEADER2, _constants.HEADER3].includes(slateNode === null || slateNode === void 0 ? void 0 : slateNode.type) && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
118
163
  menuConfig: {
119
164
  text: 'Copy_link_of_section',
120
165
  iconClass: 'sdocfont sdoc-link'
121
166
  },
122
- onClick: onCopyHeaderLink
123
- }), /*#__PURE__*/_react.default.createElement("div", {
167
+ onClick: onCopyHeaderLink,
168
+ isHidden: !transformMenuSearchMap['COPY_LINK_OF_SECTION']
169
+ }), !transformMenuSearchMap['searchingForTransformMenu'] && /*#__PURE__*/_react.default.createElement("div", {
124
170
  className: "sdoc-dropdown-menu-divider"
125
171
  })), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
126
172
  menuConfig: {
127
173
  text: 'Copy',
128
174
  iconClass: 'sdocfont sdoc-copy'
129
175
  },
130
- onClick: onCopy
176
+ onClick: onCopy,
177
+ isHidden: !transformMenuSearchMap['COPY']
131
178
  }), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
132
179
  menuConfig: {
133
180
  text: 'Cut',
134
181
  iconClass: 'sdocfont sdoc-cut'
135
182
  },
136
- onClick: onCut
183
+ onClick: onCut,
184
+ isHidden: !transformMenuSearchMap['CUT']
137
185
  }), /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
138
186
  menuConfig: {
139
187
  text: 'Delete',
140
188
  iconClass: 'sdocfont sdoc-delete'
141
189
  },
142
- onClick: onDelete
143
- }))));
190
+ onClick: onDelete,
191
+ isHidden: !transformMenuSearchMap['DELETE']
192
+ }), transformMenuSearchMap['searchingForTransformMenu'] && Object.keys(transformMenuSearchMap).length === 1 && /*#__PURE__*/_react.default.createElement("div", {
193
+ className: "sdoc-dropdown-menu-item-no-results"
194
+ }, t('No_results')))));
144
195
  };
145
196
  var _default = exports.default = (0, _reactI18next.withTranslation)('sdoc-editor', {
146
197
  withRef: true
@@ -1,65 +1,22 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
- var _react = _interopRequireWildcard(require("react"));
8
+ var _react = _interopRequireDefault(require("react"));
10
9
  var _reactstrap = require("reactstrap");
11
10
  var _reactI18next = require("react-i18next");
12
- var _slateReact = require("@seafile/slate-react");
13
11
  var _helpers = require("./helpers");
14
- var _constants = require("../../constants");
15
12
  var _dropdownMenuItem = _interopRequireDefault(require("../../commons/dropdown-menu-item"));
16
- var _core = require("../../core");
17
13
  const TransformMenus = _ref => {
18
14
  let {
19
- target,
15
+ editor,
20
16
  slateNode,
21
- onReset,
22
- t
17
+ target,
18
+ onSetType
23
19
  } = _ref;
24
- const editor = (0, _slateReact.useSlateStatic)();
25
- const onSetType = (0, _react.useCallback)(newType => {
26
- (0, _helpers.onSetNodeType)(editor, slateNode, newType);
27
- onReset();
28
- // eslint-disable-next-line react-hooks/exhaustive-deps
29
- }, []);
30
- const getSideMenusConfig = (0, _react.useCallback)(SIDE_TRANSFORM_MENUS_CONFIG => {
31
- let newSideMenusConfig = SIDE_TRANSFORM_MENUS_CONFIG;
32
- if (_constants.LIST_ITEM_CORRELATION_TYPE.includes(slateNode.type)) {
33
- newSideMenusConfig = SIDE_TRANSFORM_MENUS_CONFIG.filter(item => _constants.LIST_ITEM_SUPPORTED_TRANSFORMATION.includes(item.type));
34
- }
35
- const path = _slateReact.ReactEditor.findPath(editor, slateNode);
36
- if (path) {
37
- const nodeIndex = path[0];
38
- const highestNode = editor.children[nodeIndex];
39
- if (path.length > 1) {
40
- if (highestNode.type === _constants.BLOCKQUOTE) {
41
- newSideMenusConfig = SIDE_TRANSFORM_MENUS_CONFIG.filter(item => item.type !== _constants.CALL_OUT);
42
- }
43
- }
44
-
45
- // headers can't be nested by quote block
46
- if (_constants.HEADERS.includes(highestNode.type)) {
47
- newSideMenusConfig = SIDE_TRANSFORM_MENUS_CONFIG.filter(item => item.type !== _constants.BLOCKQUOTE);
48
- }
49
- if ([_constants.ORDERED_LIST, _constants.UNORDERED_LIST].includes(highestNode.type)) {
50
- // If it's not the top list item, cannot be converted to checks
51
- if (!(0, _core.isTopLevelListItem)(editor)) {
52
- newSideMenusConfig = SIDE_TRANSFORM_MENUS_CONFIG.filter(item => item.type !== _constants.CALL_OUT);
53
- }
54
- // Multi-level list items cannot be converted to checks
55
- if ((0, _core.isMultiLevelList)(highestNode)) {
56
- newSideMenusConfig = newSideMenusConfig.filter(item => item.type !== _constants.CHECK_LIST_ITEM);
57
- }
58
- }
59
- }
60
- return newSideMenusConfig;
61
- // eslint-disable-next-line react-hooks/exhaustive-deps
62
- }, [slateNode]);
63
20
  return /*#__PURE__*/_react.default.createElement(_reactstrap.UncontrolledPopover, {
64
21
  boundariesElement: "viewport",
65
22
  target: target,
@@ -70,7 +27,7 @@ const TransformMenus = _ref => {
70
27
  fade: false
71
28
  }, /*#__PURE__*/_react.default.createElement("div", {
72
29
  className: "sdoc-dropdown-menu-container"
73
- }, getSideMenusConfig(_constants.SIDE_TRANSFORM_MENUS_CONFIG).map(item => {
30
+ }, (0, _helpers.getTransformMenusConfig)(editor, slateNode).map(item => {
74
31
  return /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
75
32
  key: item.id,
76
33
  menuConfig: item,
@@ -51,7 +51,7 @@ const SDocOutline = _ref => {
51
51
  updateOutlineState(!isShown);
52
52
  }, [isShown, updateOutlineState]);
53
53
  const list = (0, _react.useMemo)(() => {
54
- return doc.filter(item => ['header1', 'header2', 'header3'].includes(item.type));
54
+ return doc === null || doc === void 0 ? void 0 : doc.filter(item => ['header1', 'header2', 'header3'].includes(item.type));
55
55
  }, [doc]);
56
56
  return /*#__PURE__*/_react.default.createElement("div", {
57
57
  className: (0, _classnames.default)('sdoc-outline-wrapper', {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "1.0.106",
3
+ "version": "1.0.108",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",
@@ -564,5 +564,6 @@
564
564
  "the_past_numbers_of_days": "the past numbers of days",
565
565
  "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width",
566
566
  "Enter_comment_Enter_for_new_line_shift_enter_to_send": "Enter comment, Enter for new line, Shift + Enter to send",
567
- "Sub_table": "Tabulka"
567
+ "Sub_table": "Tabulka",
568
+ "Search_action...": "Search action..."
568
569
  }
@@ -564,5 +564,6 @@
564
564
  "the_past_numbers_of_days": "the past numbers of days",
565
565
  "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width",
566
566
  "Enter_comment_Enter_for_new_line_shift_enter_to_send": "Enter comment, Enter for new line, Shift + Enter to send",
567
- "Sub_table": "Tabelle"
567
+ "Sub_table": "Tabelle",
568
+ "Search_action...": "Search action..."
568
569
  }
@@ -564,5 +564,6 @@
564
564
  "the_past_numbers_of_days": "the past numbers of days",
565
565
  "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width",
566
566
  "Enter_comment_Enter_for_new_line_shift_enter_to_send": "Enter comment, Enter for new line, Shift + Enter to send",
567
- "Sub_table": "Table"
567
+ "Sub_table": "Table",
568
+ "Search_action...": "Search action..."
568
569
  }
@@ -564,5 +564,6 @@
564
564
  "the_past_numbers_of_days": "the past numbers of days",
565
565
  "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width",
566
566
  "Enter_comment_Enter_for_new_line_shift_enter_to_send": "Enter comment, Enter for new line, Shift + Enter to send",
567
- "Sub_table": "Tabla"
567
+ "Sub_table": "Tabla",
568
+ "Search_action...": "Search action..."
568
569
  }
@@ -564,5 +564,6 @@
564
564
  "the_past_numbers_of_days": "the past numbers of days",
565
565
  "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width",
566
566
  "Enter_comment_Enter_for_new_line_shift_enter_to_send": "Enter comment, Enter for new line, Shift + Enter to send",
567
- "Sub_table": "Tabla"
567
+ "Sub_table": "Tabla",
568
+ "Search_action...": "Search action..."
568
569
  }
@@ -564,5 +564,6 @@
564
564
  "the_past_numbers_of_days": "the past numbers of days",
565
565
  "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width",
566
566
  "Enter_comment_Enter_for_new_line_shift_enter_to_send": "Enter comment, Enter for new line, Shift + Enter to send",
567
- "Sub_table": "Tabla"
567
+ "Sub_table": "Tabla",
568
+ "Search_action...": "Search action..."
568
569
  }
@@ -564,5 +564,6 @@
564
564
  "the_past_numbers_of_days": "the past numbers of days",
565
565
  "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width",
566
566
  "Enter_comment_Enter_for_new_line_shift_enter_to_send": "Enter comment, Enter for new line, Shift + Enter to send",
567
- "Sub_table": "Tableau"
567
+ "Sub_table": "Tableau",
568
+ "Search_action...": "Search action..."
568
569
  }
@@ -564,5 +564,6 @@
564
564
  "the_past_numbers_of_days": "the past numbers of days",
565
565
  "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width",
566
566
  "Enter_comment_Enter_for_new_line_shift_enter_to_send": "Enter comment, Enter for new line, Shift + Enter to send",
567
- "Sub_table": "Tabella"
567
+ "Sub_table": "Tabella",
568
+ "Search_action...": "Search action..."
568
569
  }
@@ -564,5 +564,6 @@
564
564
  "the_past_numbers_of_days": "прошедшее количество дней",
565
565
  "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Дважды щелкните, чтобы войти в режим редактирования и отрегулировать ширину поля",
566
566
  "Enter_comment_Enter_for_new_line_shift_enter_to_send": "Введите комментарий, Enter для новой строки, Shift + Enter для отправки",
567
- "Sub_table": "Таблица"
567
+ "Sub_table": "Таблица",
568
+ "Search_action...": "Search action..."
568
569
  }
@@ -564,5 +564,6 @@
564
564
  "the_past_numbers_of_days": "今天之前的指定天数",
565
565
  "Double_click_to_enter_edit_mode_and_adjust_field_width" : "双击可进入编辑模式并调整字段宽度",
566
566
  "Enter_comment_Enter_for_new_line_shift_enter_to_send": "输入评论,Enter 换行,Shift + Enter 发送",
567
- "Sub_table": "子表"
567
+ "Sub_table": "子表",
568
+ "Search_action...": "搜索操作..."
568
569
  }