@seafile/sdoc-editor 1.0.174 → 1.0.176-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 (43) hide show
  1. package/dist/basic-sdk/assets/css/dropdown-menu.css +13 -0
  2. package/dist/basic-sdk/assets/css/layout.css +2 -1
  3. package/dist/basic-sdk/assets/css/sdoc-viewer.css +2 -1
  4. package/dist/basic-sdk/extension/commons/wiki-file-insert-dialog/index.js +2 -2
  5. package/dist/basic-sdk/extension/constants/index.js +6 -0
  6. package/dist/basic-sdk/extension/constants/menus-config.js +23 -1
  7. package/dist/basic-sdk/extension/plugins/quick-insert/render-elem.js +6 -2
  8. package/dist/basic-sdk/extension/plugins/table/constants/index.js +7 -1
  9. package/dist/basic-sdk/extension/plugins/table/popover/table-size-popover/index.js +147 -5
  10. package/dist/basic-sdk/extension/plugins/table/popover/table-template/index.css +4 -0
  11. package/dist/basic-sdk/extension/plugins/table/popover/table-template/index.js +94 -4
  12. package/dist/basic-sdk/extension/plugins/table/popover/table-template/sample-table.js +12 -3
  13. package/dist/basic-sdk/extension/plugins/text-style/menu/comemnt-editor-menu.js +7 -11
  14. package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +3 -16
  15. package/dist/basic-sdk/extension/toolbar/insert-element-toolbar/index.js +108 -78
  16. package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-block-menu.js +31 -31
  17. package/dist/basic-sdk/extension/utils/index.js +29 -2
  18. package/dist/components/doc-info/index.js +4 -3
  19. package/dist/components/doc-operations/index.js +5 -1
  20. package/dist/components/doc-operations/more-operations.js +34 -3
  21. package/dist/components/doc-operations/revision-operations/more-revision-operations/index.js +4 -0
  22. package/dist/components/doc-operations/revision-operations/revisions/index.js +13 -0
  23. package/dist/constants/index.js +3 -1
  24. package/dist/pages/simple-editor.js +1 -0
  25. package/dist/utils/index.js +13 -2
  26. package/package.json +1 -1
  27. package/public/locales/cs/sdoc-editor.json +4 -1
  28. package/public/locales/de/sdoc-editor.json +4 -1
  29. package/public/locales/en/sdoc-editor.json +4 -1
  30. package/public/locales/es/sdoc-editor.json +4 -1
  31. package/public/locales/es_AR/sdoc-editor.json +4 -1
  32. package/public/locales/es_MX/sdoc-editor.json +4 -1
  33. package/public/locales/fr/sdoc-editor.json +4 -1
  34. package/public/locales/it/sdoc-editor.json +4 -1
  35. package/public/locales/ru/sdoc-editor.json +5 -2
  36. package/public/locales/zh_CN/sdoc-editor.json +4 -1
  37. package/public/media/sdoc-editor-font/iconfont.css +542 -0
  38. package/public/media/sdoc-editor-font/iconfont.eot +0 -0
  39. package/public/media/sdoc-editor-font/iconfont.svg +16 -0
  40. package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
  41. package/public/media/sdoc-editor-font/iconfont.woff +0 -0
  42. package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
  43. package/public/media/sdoc-editor-font.css +38 -6
@@ -112,3 +112,16 @@
112
112
  .sdoc-sub-dropdown-menu .sdoc-insert-element-table-size-wrapper {
113
113
  left: 227px !important;
114
114
  }
115
+
116
+ .mobile-login .sdoc-dropdown-menu {
117
+ padding: 0 !important;
118
+ }
119
+
120
+ .mobile-login .sdoc-dropdown-menu .sdoc-dropdown-menu-item {
121
+ padding: 16px !important;
122
+ height: 47px !important;
123
+ }
124
+
125
+ .mobile-login .sdoc-dropdown-menu .sdoc-operator-folder-divider {
126
+ margin: 0 !important;
127
+ }
@@ -42,7 +42,8 @@
42
42
  }
43
43
 
44
44
  .sdoc-editor-container.mobile .sdoc-editor-content.readonly.no-outline {
45
- min-width: 100%;
45
+ min-width: 100% !important;
46
+ width: 100% !important;
46
47
  }
47
48
 
48
49
  .sdoc-editor-container .sdoc-scroll-container {
@@ -4,7 +4,8 @@
4
4
 
5
5
  .sdoc-editor-container.mobile .sdoc-editor-content.readonly .sdoc-article-container {
6
6
  padding: 0;
7
- width: auto;
7
+ width: 100% !important;
8
+ min-width: 100% !important;
8
9
  }
9
10
 
10
11
  .sdoc-editor-container.mobile .sdoc-editor-content.readonly .article {
@@ -91,7 +91,7 @@ const WikiFileLinkInsertDialog = _ref => {
91
91
  getPosition();
92
92
  }, 100);
93
93
  const getHistoryFiles = (0, _react.useCallback)(isCalculatedByFiles => {
94
- let files = _utils.LocalStorage.getItem('wiki-recent-files') || [];
94
+ let files = (0, _utils.getLocalStorageFiles)(_utils.LocalStorage.getItem('wiki-recent-files') || []);
95
95
  if (isCalculatedByFiles) {
96
96
  const newFiles = (0, _utils.getMaximumCapacity)(files);
97
97
  // Can accommodate all without showing more operations
@@ -202,7 +202,7 @@ const WikiFileLinkInsertDialog = _ref => {
202
202
  }, [closeDialog, editor, element]);
203
203
  const onShowMoreWiki = (0, _react.useCallback)(e => {
204
204
  e.stopPropagation();
205
- const recentFiles = _utils.LocalStorage.getItem('wiki-recent-files') || [];
205
+ const recentFiles = (0, _utils.getLocalStorageFiles)(_utils.LocalStorage.getItem('wiki-recent-files') || []);
206
206
  setFiles(recentFiles);
207
207
  setHiddenMoreMenu(true);
208
208
  }, []);
@@ -367,6 +367,12 @@ Object.defineProperty(exports, "SIDE_OTHER_OPERATIONS_MENUS_SEARCH_MAP", {
367
367
  return _menusConfig.SIDE_OTHER_OPERATIONS_MENUS_SEARCH_MAP;
368
368
  }
369
369
  });
370
+ Object.defineProperty(exports, "SIDE_QUICK_INSERT_MENUS_SEARCH_MAP", {
371
+ enumerable: true,
372
+ get: function () {
373
+ return _menusConfig.SIDE_QUICK_INSERT_MENUS_SEARCH_MAP;
374
+ }
375
+ });
370
376
  Object.defineProperty(exports, "SIDE_TRANSFORM_MENUS_CONFIG", {
371
377
  enumerable: true,
372
378
  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_SEARCH_MAP = exports.SIDE_TRANSFORM_MENUS_CONFIG = exports.SIDE_OTHER_OPERATIONS_MENUS_SEARCH_MAP = 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;
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_QUICK_INSERT_MENUS_SEARCH_MAP = exports.SIDE_OTHER_OPERATIONS_MENUS_SEARCH_MAP = 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';
@@ -432,6 +432,28 @@ const SIDE_INSERT_MENUS_SEARCH_MAP = exports.SIDE_INSERT_MENUS_SEARCH_MAP = {
432
432
  [_elementType.SEATABLE_COLUMN]: 'SeaTable_column',
433
433
  [_elementType.SEATABLE_TABLE]: 'SeaTable_table'
434
434
  };
435
+ const SIDE_QUICK_INSERT_MENUS_SEARCH_MAP = exports.SIDE_QUICK_INSERT_MENUS_SEARCH_MAP = {
436
+ [_elementType.IMAGE]: 'Image',
437
+ [_elementType.VIDEO]: 'Video',
438
+ [_elementType.TABLE]: 'Table',
439
+ [_elementType.COLUMN]: 'Column',
440
+ [_elementType.TWO_COLUMN]: 'Two_column',
441
+ [_elementType.THREE_COLUMN]: 'Three_column',
442
+ [_elementType.FOUR_COLUMN]: 'Four_column',
443
+ [_elementType.LINK]: 'Link',
444
+ [_elementType.CODE_BLOCK]: 'Code_block',
445
+ [_elementType.CALL_OUT]: 'Callout',
446
+ [_elementType.UNORDERED_LIST]: 'Unordered_list',
447
+ [_elementType.ORDERED_LIST]: 'Ordered_list',
448
+ [_elementType.CHECK_LIST_ITEM]: 'Check_list',
449
+ [_elementType.PARAGRAPH]: 'Paragraph',
450
+ [_elementType.HEADER1]: 'Header_one',
451
+ [_elementType.HEADER2]: 'Header_two',
452
+ [_elementType.HEADER3]: 'Header_three',
453
+ [_elementType.HEADER4]: 'Header_four',
454
+ [_elementType.SEATABLE_COLUMN]: 'SeaTable_column',
455
+ [_elementType.SEATABLE_TABLE]: 'SeaTable_table'
456
+ };
435
457
 
436
458
  // Other operations menu config
437
459
  const SIDE_OTHER_OPERATIONS_MENUS_SEARCH_MAP = exports.SIDE_OTHER_OPERATIONS_MENUS_SEARCH_MAP = {
@@ -32,7 +32,7 @@ const RenderQuickInsert = (_ref, editor, readonly) => {
32
32
  const insertElmRef = (0, _react.useRef)(null);
33
33
  const aboveBlockNode = (0, _core.getAboveBlockNode)(editor);
34
34
  const isEmptyNode = (0, _helpers.isVoidNode)(aboveBlockNode === null || aboveBlockNode === void 0 ? void 0 : aboveBlockNode[0]);
35
- const [isShowPopover] = (0, _react.useState)((0, _helper.isSelectionSameWithInsert)(editor, element));
35
+ const [isShowPopover, setIsShowPopover] = (0, _react.useState)((0, _helper.isSelectionSameWithInsert)(editor, element));
36
36
  const handleClick = (0, _react.useCallback)(e => {
37
37
  // Click the search input
38
38
  if (sideMenuRef.current.contains(e.target) && e.target.tagName === 'INPUT') return;
@@ -80,6 +80,9 @@ const RenderQuickInsert = (_ref, editor, readonly) => {
80
80
  at: _slateReact.ReactEditor.findPath(editor, element)
81
81
  });
82
82
  };
83
+ const handleClosePopover = (0, _react.useCallback)(() => {
84
+ setIsShowPopover(false);
85
+ }, []);
83
86
  return /*#__PURE__*/_react.default.createElement("span", {
84
87
  ref: insertElmRef
85
88
  }, /*#__PURE__*/_react.default.createElement("span", Object.assign({}, attributes, {
@@ -94,7 +97,8 @@ const RenderQuickInsert = (_ref, editor, readonly) => {
94
97
  isEmptyNode: isEmptyNode,
95
98
  insertPosition: isEmptyNode ? _constants.INSERT_POSITION.CURRENT : _constants.INSERT_POSITION.AFTER,
96
99
  slateNode: aboveBlockNode === null || aboveBlockNode === void 0 ? void 0 : aboveBlockNode[0],
97
- callback: handleInsertBlock
100
+ callback: handleInsertBlock,
101
+ handleClosePopover: handleClosePopover
98
102
  })))));
99
103
  };
100
104
  var _default = exports.default = RenderQuickInsert;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.TABLE_ROW_STYLE = exports.TABLE_ROW_MIN_HEIGHT = exports.TABLE_MAX_ROWS = exports.TABLE_MAX_COLUMNS = exports.TABLE_ELEMENT_SPAN = exports.TABLE_ELEMENT_POSITION = exports.TABLE_ELEMENT = exports.TABLE_CELL_STYLE = exports.TABLE_CELL_MIN_WIDTH = exports.TABLE_ALTERNATE_HIGHLIGHT_CLASS_MAP = exports.SELECTED_TABLE_CELL_BACKGROUND_COLOR = exports.RESIZE_MASK_TOP = exports.RESIZE_MASK_RIGHT = exports.RESIZE_MASK_LEFT = exports.RESIZE_MASK_BOTTOM = exports.RESIZE_HANDLER_ROW = exports.RESIZE_HANDLER_FIRST_COLUMN = exports.RESIZE_HANDLER_COLUMN = exports.INHERIT_CELL_STYLE_WHEN_SELECT_SINGLE = exports.INHERIT_CELL_STYLE_WHEN_SELECT_MULTIPLE = exports.EMPTY_SELECTED_RANGE = exports.DRAG_HANDLER_ROW = exports.DRAG_HANDLER_COLUMN = exports.CELL_SELECTED = void 0;
6
+ exports.TABLE_TEMPLATE_POSITION_MAP = exports.TABLE_ROW_STYLE = exports.TABLE_ROW_MIN_HEIGHT = exports.TABLE_MAX_ROWS = exports.TABLE_MAX_COLUMNS = exports.TABLE_ELEMENT_SPAN = exports.TABLE_ELEMENT_POSITION = exports.TABLE_ELEMENT = exports.TABLE_CELL_STYLE = exports.TABLE_CELL_MIN_WIDTH = exports.TABLE_ALTERNATE_HIGHLIGHT_CLASS_MAP = exports.SELECTED_TABLE_CELL_BACKGROUND_COLOR = exports.RESIZE_MASK_TOP = exports.RESIZE_MASK_RIGHT = exports.RESIZE_MASK_LEFT = exports.RESIZE_MASK_BOTTOM = exports.RESIZE_HANDLER_ROW = exports.RESIZE_HANDLER_FIRST_COLUMN = exports.RESIZE_HANDLER_COLUMN = exports.INHERIT_CELL_STYLE_WHEN_SELECT_SINGLE = exports.INHERIT_CELL_STYLE_WHEN_SELECT_MULTIPLE = exports.EMPTY_SELECTED_RANGE = exports.DRAG_HANDLER_ROW = exports.DRAG_HANDLER_COLUMN = exports.CELL_SELECTED = void 0;
7
7
  const TABLE_MAX_ROWS = exports.TABLE_MAX_ROWS = 500;
8
8
  const TABLE_MAX_COLUMNS = exports.TABLE_MAX_COLUMNS = 50;
9
9
  const EMPTY_SELECTED_RANGE = exports.EMPTY_SELECTED_RANGE = {
@@ -44,6 +44,12 @@ const TABLE_ALTERNATE_HIGHLIGHT_CLASS_MAP = exports.TABLE_ALTERNATE_HIGHLIGHT_CL
44
44
  'sdoc-table-header-f77d21': 'sdoc-table-body-f77d21',
45
45
  'sdoc-table-header-0099f4': 'sdoc-table-body-0099f4'
46
46
  };
47
+ const TABLE_TEMPLATE_POSITION_MAP = exports.TABLE_TEMPLATE_POSITION_MAP = {
48
+ '[0,0]': 'sdoc-table-header-3f495d',
49
+ '[1,0]': 'sdoc-table-header-2367f2',
50
+ '[0,1]': 'sdoc-table-header-f77d21',
51
+ '[1,1]': 'sdoc-table-header-0099f4'
52
+ };
47
53
  const INHERIT_CELL_STYLE_WHEN_SELECT_SINGLE = exports.INHERIT_CELL_STYLE_WHEN_SELECT_SINGLE = ['background_color'];
48
54
  const INHERIT_CELL_STYLE_WHEN_SELECT_MULTIPLE = exports.INHERIT_CELL_STYLE_WHEN_SELECT_MULTIPLE = ['background_color', 'text_align'];
49
55
  const RESIZE_MASK_TOP = exports.RESIZE_MASK_TOP = 'top';
@@ -11,6 +11,7 @@ var _classnames = _interopRequireDefault(require("classnames"));
11
11
  var _reactI18next = require("react-i18next");
12
12
  var _reactstrap = require("reactstrap");
13
13
  var _tableTemplate = _interopRequireDefault(require("../table-template"));
14
+ var _keyCodes = _interopRequireDefault(require("../../../../../../constants/key-codes"));
14
15
  require("./index.css");
15
16
  const TableSizePopover = _ref => {
16
17
  let {
@@ -19,15 +20,22 @@ const TableSizePopover = _ref => {
19
20
  trigger = 'legacy',
20
21
  placement = 'bottom-start',
21
22
  popperClassName,
22
- createTable
23
+ createTable,
24
+ tableSizeRef,
25
+ handleClosePopover,
26
+ callback
23
27
  } = _ref;
24
28
  const minSize = [5, 10];
25
29
  const maxSize = [10, 10];
26
30
  const [displaySize, setDisplaySize] = (0, _react.useState)([5, 10]);
27
31
  const [selectedSize, setSelectedSize] = (0, _react.useState)([1, 1]);
28
32
  const ref = (0, _react.useRef)(null);
29
- const onMouseEnter = (0, _react.useCallback)(function (event) {
30
- let cellPosition = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [1, 1];
33
+ const templateRef = (0, _react.useRef)(null);
34
+ (0, _react.useEffect)(() => {
35
+ ref.current['firstRender'] = true;
36
+ }, []);
37
+ const onHandleTableSize = (0, _react.useCallback)(function () {
38
+ let cellPosition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [1, 1];
31
39
  let newDisplaySize = displaySize.slice(0);
32
40
  const cellPositionX = cellPosition[0];
33
41
  const cellPositionY = cellPosition[1];
@@ -50,6 +58,137 @@ const TableSizePopover = _ref => {
50
58
 
51
59
  // eslint-disable-next-line react-hooks/exhaustive-deps
52
60
  }, [selectedSize, ref]);
61
+ const onTemplateItemSelectedStyle = (0, _react.useCallback)(color => {
62
+ const templateEl = document.getElementById('sdoc-table-template-review-btn');
63
+ templateEl.style['backgroundColor'] = color;
64
+ }, []);
65
+ const handleSizeDown = (0, _react.useCallback)(e => {
66
+ const {
67
+ keyCode
68
+ } = e;
69
+ const {
70
+ UpArrow,
71
+ DownArrow,
72
+ Enter,
73
+ RightArrow,
74
+ LeftArrow
75
+ } = _keyCodes.default;
76
+ const newSelectedSize = selectedSize.slice(0);
77
+ if (keyCode === Enter) {
78
+ e.preventDefault();
79
+ onCreateTable();
80
+ }
81
+ if (keyCode === UpArrow) {
82
+ e.preventDefault();
83
+ if (newSelectedSize[0] > 1) {
84
+ newSelectedSize[0] = newSelectedSize[0] - 1;
85
+ }
86
+ }
87
+ if (keyCode === DownArrow) {
88
+ e.preventDefault();
89
+ newSelectedSize[0] = newSelectedSize[0] + 1;
90
+ }
91
+ if (keyCode === LeftArrow) {
92
+ e.preventDefault();
93
+ if (newSelectedSize[1] > 1) {
94
+ newSelectedSize[1] = newSelectedSize[1] - 1;
95
+ }
96
+ }
97
+ if (keyCode === RightArrow) {
98
+ e.preventDefault();
99
+ newSelectedSize[1] = newSelectedSize[1] + 1;
100
+ }
101
+ onHandleTableSize(newSelectedSize);
102
+ }, [onCreateTable, onHandleTableSize, selectedSize]);
103
+ const handleTableSizeKeyDown = (0, _react.useCallback)(e => {
104
+ if (document.getElementsByClassName('sdoc-table-template-popover')[0]) {
105
+ templateRef.current.handleTableTemplateKeyDown(e);
106
+ return;
107
+ }
108
+ const {
109
+ keyCode
110
+ } = e;
111
+ const {
112
+ UpArrow,
113
+ DownArrow,
114
+ Enter,
115
+ RightArrow,
116
+ LeftArrow,
117
+ Esc
118
+ } = _keyCodes.default;
119
+ const isInitSize = selectedSize[0] === 1 && selectedSize[1] === 1;
120
+ const templateEl = document.getElementById('sdoc-table-template-review-btn');
121
+ // Currently focusing on the template menu item
122
+ if (templateEl.style['background-color']) {
123
+ if (keyCode === DownArrow) {
124
+ e.preventDefault();
125
+ onTemplateItemSelectedStyle('');
126
+ }
127
+ // exit table size popover
128
+ if (keyCode === LeftArrow) {
129
+ e.preventDefault();
130
+ onTemplateItemSelectedStyle('');
131
+ ref.current['firstRender'] = true;
132
+ ref.current.toggle();
133
+ }
134
+ if (keyCode === Enter) {
135
+ e.preventDefault();
136
+ onTemplateItemSelectedStyle('');
137
+ templateRef.current.uncontrolledTemplatePopoverRef.current.toggle();
138
+ }
139
+ if (keyCode === Esc) {
140
+ e.preventDefault();
141
+ handleClosePopover();
142
+ }
143
+ return;
144
+ }
145
+
146
+ // left and right
147
+ if (keyCode === LeftArrow) {
148
+ e.preventDefault();
149
+ handleSizeDown(e);
150
+ }
151
+ if (keyCode === RightArrow) {
152
+ e.preventDefault();
153
+ if (ref.current['firstRender']) {
154
+ ref.current['firstRender'] = false;
155
+ onTemplateItemSelectedStyle('#e3e3e3');
156
+ return;
157
+ }
158
+ handleSizeDown(e);
159
+ }
160
+
161
+ // up and down
162
+ if (keyCode === UpArrow) {
163
+ e.preventDefault();
164
+ if (isInitSize) {
165
+ onTemplateItemSelectedStyle('#e3e3e3');
166
+ } else {
167
+ handleSizeDown(e);
168
+ }
169
+ }
170
+ if (keyCode === DownArrow) {
171
+ e.preventDefault();
172
+ onTemplateItemSelectedStyle('');
173
+ handleSizeDown(e);
174
+ }
175
+
176
+ // enter
177
+ if (keyCode === Enter) {
178
+ e.preventDefault();
179
+ handleSizeDown(e);
180
+ }
181
+ if (keyCode === Esc) {
182
+ e.preventDefault();
183
+ handleClosePopover();
184
+ }
185
+ }, [handleClosePopover, handleSizeDown, onTemplateItemSelectedStyle, selectedSize]);
186
+ (0, _react.useImperativeHandle)(tableSizeRef, () => {
187
+ return {
188
+ handleTableSizeKeyDown: handleTableSizeKeyDown,
189
+ uncontrolledPopoverRef: ref
190
+ };
191
+ });
53
192
  const renderTableSize = (0, _react.useCallback)(() => {
54
193
  let tableSize = [];
55
194
  for (let i = 1; i <= displaySize[0]; i++) {
@@ -62,7 +201,7 @@ const TableSizePopover = _ref => {
62
201
  'active': isSelectedChild
63
202
  }),
64
203
  onClick: onCreateTable,
65
- onMouseEnter: event => onMouseEnter(event, [i, j])
204
+ onMouseEnter: () => onHandleTableSize([i, j])
66
205
  });
67
206
  children.push(child);
68
207
  }
@@ -97,8 +236,11 @@ const TableSizePopover = _ref => {
97
236
  }, renderTableSize()), /*#__PURE__*/_react.default.createElement("div", {
98
237
  className: "sdoc-selected-table-size-tip w-100 "
99
238
  }, `${selectedSize[0]} x ${selectedSize[1]}`), /*#__PURE__*/_react.default.createElement(_tableTemplate.default, {
239
+ templateRef: templateRef,
100
240
  editor: editor,
101
- targetId: "sdoc-table-template-review-btn"
241
+ targetId: "sdoc-table-template-review-btn",
242
+ handleClosePopover: handleClosePopover,
243
+ callback: callback
102
244
  })));
103
245
  };
104
246
  var _default = exports.default = TableSizePopover;
@@ -18,6 +18,10 @@
18
18
  box-shadow: 0 0 3px 2px #e2e3e6;
19
19
  }
20
20
 
21
+ .sdoc-table-template-view-table.active {
22
+ box-shadow: 0 0 3px 2px #e2e3e6;
23
+ }
24
+
21
25
  .sdoc-table-template-view-table .sdoc-table-template-row .sdoc-table-template-cell {
22
26
  width: 28px;
23
27
  height: 15px;
@@ -11,17 +11,105 @@ var _reactstrap = require("reactstrap");
11
11
  var _constants = require("../../constants");
12
12
  var _sampleTable = _interopRequireDefault(require("./sample-table"));
13
13
  var _helpers = require("../../helpers");
14
+ var _keyCodes = _interopRequireDefault(require("../../../../../../constants/key-codes"));
14
15
  require("./index.css");
15
16
  require("../../render/alternate-color.css");
16
17
  const TableTemplate = _ref => {
17
18
  let {
18
19
  editor,
19
- targetId
20
+ targetId,
21
+ templateRef,
22
+ handleClosePopover,
23
+ callback
20
24
  } = _ref;
25
+ const ref = (0, _react.useRef)(null);
26
+ const [position, setPosition] = (0, _react.useState)([-1, -1]);
21
27
  const tableTemplatePreviewList = (0, _react.useMemo)(() => Reflect.ownKeys(_constants.TABLE_ALTERNATE_HIGHLIGHT_CLASS_MAP), []);
22
- const handleClickTemplate = (0, _react.useCallback)((e, alternateColor) => {
28
+ const handleClickTemplate = (0, _react.useCallback)(alternateColor => {
29
+ callback && callback();
23
30
  (0, _helpers.insertTableByTemplate)(editor, alternateColor);
24
- }, [editor]);
31
+ }, [callback, editor]);
32
+ const handleTableTemplateKeyDown = (0, _react.useCallback)(e => {
33
+ const {
34
+ keyCode
35
+ } = e;
36
+ const {
37
+ UpArrow,
38
+ DownArrow,
39
+ Enter,
40
+ RightArrow,
41
+ LeftArrow,
42
+ Esc
43
+ } = _keyCodes.default;
44
+ const position = ref.current.position;
45
+ const isInitPostion = position[0] === -1 && position[1] === -1;
46
+
47
+ // left and right
48
+ if (keyCode === LeftArrow) {
49
+ e.preventDefault();
50
+ if (position[0] > 0) {
51
+ const newPosition = [position[0] - 1, position[1]];
52
+ ref.current.position = newPosition;
53
+ setPosition(newPosition);
54
+ }
55
+ }
56
+ if (keyCode === RightArrow) {
57
+ e.preventDefault();
58
+ // Enter
59
+ if (isInitPostion) {
60
+ ref.current.position = [0, 0];
61
+ setPosition([0, 0]);
62
+ return;
63
+ }
64
+ if (position[0] < 1) {
65
+ const newPosition = [position[0] + 1, position[1]];
66
+ ref.current.position = newPosition;
67
+ setPosition(newPosition);
68
+ }
69
+ }
70
+
71
+ // up and down
72
+ if (keyCode === UpArrow) {
73
+ e.preventDefault();
74
+ if (isInitPostion) return;
75
+ if (position[1] > 0) {
76
+ const newPosition = [position[0], position[1] - 1];
77
+ ref.current.position = newPosition;
78
+ setPosition(newPosition);
79
+ }
80
+ }
81
+ if (keyCode === DownArrow) {
82
+ e.preventDefault();
83
+ if (isInitPostion) return;
84
+ if (position[1] < 1) {
85
+ const newPosition = [position[0], position[1] + 1];
86
+ ref.current.position = newPosition;
87
+ setPosition(newPosition);
88
+ }
89
+ }
90
+
91
+ // enter
92
+ if (keyCode === Enter) {
93
+ e.preventDefault();
94
+ if (isInitPostion) return;
95
+ const key = JSON.stringify(position);
96
+ handleClickTemplate(_constants.TABLE_TEMPLATE_POSITION_MAP[key]);
97
+ handleClosePopover();
98
+ }
99
+ if (keyCode === Esc) {
100
+ e.preventDefault();
101
+ handleClosePopover();
102
+ }
103
+ }, [handleClickTemplate, handleClosePopover]);
104
+ (0, _react.useImperativeHandle)(templateRef, () => {
105
+ return {
106
+ handleTableTemplateKeyDown: handleTableTemplateKeyDown,
107
+ uncontrolledTemplatePopoverRef: ref
108
+ };
109
+ });
110
+ (0, _react.useEffect)(() => {
111
+ ref.current.position = [-1, -1];
112
+ }, []);
25
113
  return /*#__PURE__*/_react.default.createElement(_reactstrap.UncontrolledPopover, {
26
114
  target: targetId,
27
115
  trigger: "hover",
@@ -29,9 +117,11 @@ const TableTemplate = _ref => {
29
117
  hideArrow: true,
30
118
  fade: false,
31
119
  className: "sdoc-sub-dropdown-menu sdoc-table-template-popover",
32
- innerClassName: "sdoc-table-template-inner-popover"
120
+ innerClassName: "sdoc-table-template-inner-popover",
121
+ ref: ref
33
122
  }, tableTemplatePreviewList.map((alternateColor, index) => /*#__PURE__*/_react.default.createElement(_sampleTable.default, {
34
123
  key: alternateColor + index,
124
+ curPositon: position,
35
125
  alternateColor: alternateColor,
36
126
  onClickTemplate: handleClickTemplate
37
127
  })));
@@ -8,24 +8,33 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
+ var _classnames = _interopRequireDefault(require("classnames"));
11
12
  var _helpers = require("../../helpers");
13
+ var _constants = require("../../constants");
12
14
  require("./index.css");
13
15
  const SampleTable = _ref => {
14
16
  let {
15
17
  alternateColor,
16
- onClickTemplate
18
+ onClickTemplate,
19
+ curPositon
17
20
  } = _ref;
18
21
  // generate table
19
22
  const renderTableRow = (0, _react.useCallback)((row, column) => new Array(row).fill(null).map((_, index) => /*#__PURE__*/_react.default.createElement("div", {
20
23
  className: `sdoc-table-template-row table-row ${(0, _helpers.getCellHighlightClassName)(alternateColor, index)}`,
21
24
  key: `sdoc-template-table-row-${index}`,
22
- onClick: e => onClickTemplate(e, alternateColor)
25
+ onClick: () => {
26
+ onClickTemplate(alternateColor);
27
+ }
23
28
  }, new Array(column).fill(null).map((_, index) => /*#__PURE__*/_react.default.createElement("div", {
24
29
  className: "sdoc-table-template-cell",
25
30
  key: `sdoc-template-table-cell-${index}`
26
31
  })))), [onClickTemplate, alternateColor]);
32
+ const key = JSON.stringify(curPositon);
33
+ const isActive = _constants.TABLE_TEMPLATE_POSITION_MAP[key] === alternateColor;
27
34
  return /*#__PURE__*/_react.default.createElement("div", {
28
- className: "sdoc-table-template-view-table"
35
+ className: (0, _classnames.default)('sdoc-table-template-view-table', {
36
+ 'active': isActive
37
+ })
29
38
  }, renderTableRow(4, 4));
30
39
  };
31
40
  SampleTable.protoTypes = {
@@ -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,7 @@ 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
+ const TextStyleMenuList = _ref => {
29
21
  let {
30
22
  editor,
31
23
  t,
@@ -33,10 +25,9 @@ const TextStyleMenuList = _ref2 => {
33
25
  className,
34
26
  idPrefix,
35
27
  readonly
36
- } = _ref2;
28
+ } = _ref;
37
29
  let selectedFontSize = (0, _helpers.getFontSize)(editor);
38
30
  let selectedFontSizeValue = selectedFontSize;
39
- const isCommentEditor = editor.editorType === _constants2.COMMENT_EDITOR;
40
31
  const {
41
32
  lastUsedFontColor,
42
33
  updateLastUsedFontColor,
@@ -114,17 +105,13 @@ const TextStyleMenuList = _ref2 => {
114
105
  // eslint-disable-next-line react-hooks/exhaustive-deps
115
106
  }, [editor, lastUsedFontColor, lastUsedHighlightColor, readonly]);
116
107
  let list = getTextStyleList(_constants.TEXT_STYLE);
117
- // Filter for comment editor
118
- if (isCommentEditor) {
119
- list = list.filter(filterFontTypes);
120
- }
121
108
  const dropdownList = getTextStyleList(_constants.TEXT_STYLE_MORE);
122
109
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, list.map((itemProps, index) => {
123
110
  const Component = itemProps.isColor ? _commons.ColorMenu : _commons.MenuItem;
124
111
  return /*#__PURE__*/_react.default.createElement(Component, Object.assign({
125
112
  key: index
126
113
  }, itemProps));
127
- }), !isCommentEditor && /*#__PURE__*/_react.default.createElement(_commons.MoreDropdown, null, dropdownList.map((itemProps, index) => /*#__PURE__*/_react.default.createElement(_commons.MenuItem, Object.assign({
114
+ }), /*#__PURE__*/_react.default.createElement(_commons.MoreDropdown, null, dropdownList.map((itemProps, index) => /*#__PURE__*/_react.default.createElement(_commons.MenuItem, Object.assign({
128
115
  key: index
129
116
  }, itemProps))), /*#__PURE__*/_react.default.createElement(_fontSizeScale.default, {
130
117
  disabled: isDisabled(),