@seafile/sdoc-editor 1.0.97 → 1.0.98

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.
@@ -45,7 +45,8 @@ const INTERNAL_EVENT = exports.INTERNAL_EVENT = {
45
45
  TABLE_HIDE_DRAG_HANDLER: 'table_show_drag_handler',
46
46
  ON_PRINT: 'on_print',
47
47
  COMMENT_EDITOR_POST_COMMENT: 'comment_editor_post_comment',
48
- CLOSE_FILE_INSET_DIALOG: 'close_file_insert_dialog'
48
+ CLOSE_FILE_INSET_DIALOG: 'close_file_insert_dialog',
49
+ RESIZE_ARTICLE: 'resize_article'
49
50
  };
50
51
  const REVISION_DIFF_KEY = exports.REVISION_DIFF_KEY = 'diff';
51
52
  const REVISION_DIFF_VALUE = exports.REVISION_DIFF_VALUE = '1';
@@ -130,12 +130,12 @@
130
130
  justify-content: space-between;
131
131
  }
132
132
 
133
- .sdoc-langs-list-container .langs-list-ul .langs-list-li:hover {
134
- background-color: #f5f5f5;;
133
+ .sdoc-langs-list-container .langs-list-ul .langs-list-li.active {
134
+ background-color: #f5f5f5;
135
135
  }
136
136
 
137
- .sdoc-langs-list-container .langs-list-ul .langs-list-li .active {
138
- background-color: #f5f5f5;;
137
+ .sdoc-langs-list-container .langs-list-ul .langs-list-li.hover {
138
+ background-color: #f5f5f5;
139
139
  }
140
140
 
141
141
  .sdoc-langs-list-container .langs-list-ul .langs-list-li .li-check-mark {
@@ -14,11 +14,12 @@ var _commons = require("../../../commons/");
14
14
  var _prismjs = require("../prismjs");
15
15
  var _helpers = require("../helpers");
16
16
  require("./index.css");
17
- const LangList = _ref => {
17
+ const LangList = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
18
18
  let {
19
19
  langsData,
20
20
  onSelectLang,
21
- selectedLanguageText
21
+ selectedLanguageText,
22
+ selectedIndex
22
23
  } = _ref;
23
24
  const {
24
25
  t
@@ -30,13 +31,14 @@ const LangList = _ref => {
30
31
  }
31
32
  return /*#__PURE__*/_react.default.createElement("ul", {
32
33
  className: "langs-list-ul"
33
- }, langsData.map(item => {
34
+ }, langsData.map((item, index) => {
34
35
  return /*#__PURE__*/_react.default.createElement("li", {
35
- className: `langs-list-li ${selectedLanguageText === item.text ? 'active' : ''}`,
36
+ ref: el => ref.current[index] = el,
37
+ className: `langs-list-li ${selectedLanguageText === item.text ? 'active' : ''} ${selectedIndex === index ? 'hover' : ''}`,
36
38
  id: item.value,
37
39
  key: item.value,
38
40
  onClick: () => {
39
- onSelectLang(item);
41
+ onSelectLang(item, index);
40
42
  }
41
43
  }, item.text, /*#__PURE__*/_react.default.createElement("span", {
42
44
  className: `li-check-mark ${selectedLanguageText === item.text ? 'li-checked' : ''}`
@@ -44,7 +46,7 @@ const LangList = _ref => {
44
46
  className: "sdocfont sdoc-check-mark icon-font"
45
47
  })));
46
48
  }));
47
- };
49
+ });
48
50
  const CodeBlockHoverMenu = _ref2 => {
49
51
  let {
50
52
  style,
@@ -63,6 +65,11 @@ const CodeBlockHoverMenu = _ref2 => {
63
65
  const [selectedLanguageText, setSelectedLanguageText] = (0, _react.useState)('');
64
66
  const [langsData, setLangsData] = (0, _react.useState)((0, _prismjs.genCodeLangs)());
65
67
  const [isShowTooltip, setIsShowTooltip] = (0, _react.useState)(false);
68
+ const [selectedIndex, setSelectedIndex] = (0, _react.useState)(0);
69
+ const langRefs = (0, _react.useRef)([]);
70
+ (0, _react.useEffect)(() => {
71
+ langRefs.current = Array(langsData.length).fill().map((_, i) => langRefs.current[i] || /*#__PURE__*/_react.default.createRef());
72
+ }, [langsData]);
66
73
  const onHiddenLangsList = (0, _react.useCallback)(e => {
67
74
  if (!e.target.parentNode.className.includes('sdoc-search-langs')) {
68
75
  setIsShowlangsList(false);
@@ -79,9 +86,10 @@ const CodeBlockHoverMenu = _ref2 => {
79
86
  }, []);
80
87
  const onShowLangs = (0, _react.useCallback)(e => {
81
88
  e.stopPropagation();
89
+ setSelectedIndex(langsData.findIndex(lang => lang.text === selectedLanguageText));
82
90
  setIsShowlangsList(!isShowlangsList);
83
91
  // eslint-disable-next-line react-hooks/exhaustive-deps
84
- }, [isShowlangsList]);
92
+ }, [isShowlangsList, selectedLanguageText]);
85
93
  const onAutoLineWrap = (0, _react.useCallback)(() => {
86
94
  if (white_space === 'normal') {
87
95
  onChangeAutoLineWrap('nowrap');
@@ -94,14 +102,22 @@ const CodeBlockHoverMenu = _ref2 => {
94
102
  onDeleteCodeBlock();
95
103
  // eslint-disable-next-line react-hooks/exhaustive-deps
96
104
  }, []);
97
- const onSelectLang = (0, _react.useCallback)(lang => {
105
+ const onSelectLang = (0, _react.useCallback)((lang, index) => {
98
106
  const {
99
107
  text
100
108
  } = lang;
101
109
  setSelectedLanguageText(text);
110
+ setSelectedIndex(index);
102
111
  onChangeLanguage(lang);
112
+ const selectedLangRef = langRefs.current[index];
113
+ if (selectedLangRef) {
114
+ selectedLangRef.scrollIntoView({
115
+ behavior: 'smooth',
116
+ block: 'nearest'
117
+ });
118
+ }
103
119
  // eslint-disable-next-line react-hooks/exhaustive-deps
104
- }, []);
120
+ }, [onChangeLanguage]);
105
121
  (0, _react.useEffect)(() => {
106
122
  // Compatible with legacy code
107
123
  let selectedLanguage = language;
@@ -126,6 +142,41 @@ const CodeBlockHoverMenu = _ref2 => {
126
142
  setLangsData(filterData);
127
143
  // eslint-disable-next-line react-hooks/exhaustive-deps
128
144
  }, []);
145
+ const onKeyDown = (0, _react.useCallback)(e => {
146
+ const {
147
+ key
148
+ } = e;
149
+ switch (key) {
150
+ case 'ArrowUp':
151
+ e.preventDefault();
152
+ setSelectedIndex(prevIndex => {
153
+ const newIndex = Math.max(prevIndex - 1, 0);
154
+ scrollToLang(newIndex);
155
+ return newIndex;
156
+ });
157
+ break;
158
+ case 'ArrowDown':
159
+ e.preventDefault();
160
+ setSelectedIndex(prevIndex => {
161
+ const newIndex = Math.min(prevIndex + 1, langsData.length - 1);
162
+ scrollToLang(newIndex);
163
+ return newIndex;
164
+ });
165
+ break;
166
+ case 'Enter':
167
+ onSelectLang(langsData[selectedIndex], selectedIndex);
168
+ break;
169
+ }
170
+ }, [langsData, selectedIndex, onSelectLang]);
171
+ const scrollToLang = index => {
172
+ const selectedLangRef = langRefs.current[index];
173
+ if (selectedLangRef) {
174
+ selectedLangRef.scrollIntoView({
175
+ behavior: 'smooth',
176
+ block: 'nearest'
177
+ });
178
+ }
179
+ };
129
180
  return /*#__PURE__*/_react.default.createElement(_commons.ElementPopover, null, /*#__PURE__*/_react.default.createElement("div", {
130
181
  className: "sdoc-code-block-hover-menu-container",
131
182
  style: menuPosition
@@ -191,11 +242,14 @@ const CodeBlockHoverMenu = _ref2 => {
191
242
  }, /*#__PURE__*/_react.default.createElement(_reactstrap.Input, {
192
243
  autoFocus: true,
193
244
  placeholder: t('Search_language'),
194
- onChange: onChange
245
+ onChange: onChange,
246
+ onKeyDown: onKeyDown
195
247
  })), /*#__PURE__*/_react.default.createElement(LangList, {
196
248
  langsData: langsData,
197
249
  onSelectLang: onSelectLang,
198
- selectedLanguageText: selectedLanguageText
250
+ selectedLanguageText: selectedLanguageText,
251
+ selectedIndex: selectedIndex,
252
+ ref: langRefs
199
253
  })))));
200
254
  };
201
255
  var _default = exports.default = (0, _reactI18next.withTranslation)('sdoc-editor')(CodeBlockHoverMenu);
@@ -53,7 +53,11 @@ function ArticleContainer(_ref) {
53
53
  (0, _react.useEffect)(() => {
54
54
  const eventBus = _eventBus.default.getInstance();
55
55
  const unsubscribeOutline = eventBus.subscribe(_constants.INTERNAL_EVENT.OUTLINE_STATE_CHANGED, handleWindowResize);
56
- return unsubscribeOutline;
56
+ const unsubscribeResizeArticle = eventBus.subscribe(_constants.INTERNAL_EVENT.RESIZE_ARTICLE, handleWindowResize);
57
+ return () => {
58
+ unsubscribeOutline();
59
+ unsubscribeResizeArticle();
60
+ };
57
61
  }, [handleWindowResize]);
58
62
  (0, _react.useEffect)(() => {
59
63
  if (editor.editorType === _constants.WIKI_EDITOR) return;
@@ -10,6 +10,7 @@ var _react = _interopRequireWildcard(require("react"));
10
10
  var _hooks = require("../../hooks");
11
11
  var _resizeWidth = _interopRequireDefault(require("./resize-width"));
12
12
  var _constants = require("../constants");
13
+ var _eventBus = _interopRequireDefault(require("../utils/event-bus"));
13
14
  require("./index.css");
14
15
  const MIN_PANEL_WIDTH = 360;
15
16
  const MAX_PANEL_WIDTH = 620;
@@ -40,17 +41,26 @@ const RightPanel = _ref => {
40
41
  setWidth(width);
41
42
  }, []);
42
43
  const resizeWidthEnd = (0, _react.useCallback)(width => {
43
- window.localStorage.setItem('sdoc-panel-width', width);
44
+ const settings = JSON.parse(window.localStorage.getItem('sdoc') || '{}');
45
+ window.localStorage.setItem('sdoc', JSON.stringify({
46
+ ...settings,
47
+ panelWidth: width
48
+ }));
49
+ const eventBus = _eventBus.default.getInstance();
50
+ eventBus.dispatch(_constants.INTERNAL_EVENT.RESIZE_ARTICLE);
44
51
  }, []);
45
52
  (0, _react.useEffect)(() => {
46
- let width = parseInt(window.localStorage.getItem('sdoc-panel-width', '0')) || MIN_PANEL_WIDTH;
47
- if (width < MIN_PANEL_WIDTH) {
48
- width = MIN_PANEL_WIDTH;
49
- } else if (width > MAX_PANEL_WIDTH) {
50
- width = MAX_PANEL_WIDTH;
51
- }
53
+ const settings = JSON.parse(window.localStorage.getItem('sdoc', '{}')) || {};
54
+ const {
55
+ panelWidth
56
+ } = settings;
57
+ const width = Math.max(MIN_PANEL_WIDTH, Math.min(parseInt(panelWidth, 10) || MIN_PANEL_WIDTH, MAX_PANEL_WIDTH));
52
58
  setWidth(width);
53
59
  }, []);
60
+ (0, _react.useEffect)(() => {
61
+ const eventBus = _eventBus.default.getInstance();
62
+ eventBus.dispatch(_constants.INTERNAL_EVENT.RESIZE_ARTICLE);
63
+ }, [displayPluginName]);
54
64
  if (!displayPluginName) return null;
55
65
  const plugin = plugins.find(p => p.name === displayPluginName);
56
66
  if (!plugin) return null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "1.0.97",
3
+ "version": "1.0.98",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",