@seafile/seafile-editor 1.0.34 → 1.0.36

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.
@@ -38,6 +38,7 @@ function SimpleSlateEditor(_ref) {
38
38
  const decorate = (0, _extension.useHighlight)(editor);
39
39
  const onChange = (0, _react.useCallback)(value => {
40
40
  setSlateValue(value);
41
+ if (editor.forceNormalize) return;
41
42
  const operations = editor.operations;
42
43
  const modifyOps = operations.filter(o => o.type !== 'set_selection');
43
44
  if (modifyOps.length > 0) {
@@ -45,14 +46,16 @@ function SimpleSlateEditor(_ref) {
45
46
  }
46
47
  const eventBus = _eventBus.default.getInstance();
47
48
  eventBus.dispatch('change');
48
- }, [editor.operations, onContentChanged]);
49
+ }, [editor, onContentChanged]);
49
50
 
50
51
  // useMount: focus editor
51
52
  (0, _react.useEffect)(() => {
53
+ editor.forceNormalize = true;
52
54
  _slate.Editor.normalize(editor, {
53
55
  force: true
54
56
  });
55
57
  const timer = setTimeout(() => {
58
+ editor.forceNormalize = false;
56
59
  const [firstNode] = editor.children;
57
60
  if (firstNode) {
58
61
  const [firstNodeFirstChild] = firstNode.children;
@@ -67,6 +70,7 @@ function SimpleSlateEditor(_ref) {
67
70
  }
68
71
  }, 300);
69
72
  return () => {
73
+ editor.forceNormalize = false;
70
74
  clearTimeout(timer);
71
75
  };
72
76
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -43,6 +43,7 @@ function SlateEditor(_ref) {
43
43
  const decorate = (0, _extension.useHighlight)(editor);
44
44
  const onChange = (0, _react.useCallback)(value => {
45
45
  setSlateValue(value);
46
+ if (editor.forceNormalize) return;
46
47
  const operations = editor.operations;
47
48
  const modifyOps = operations.filter(o => o.type !== 'set_selection');
48
49
  if (modifyOps.length > 0) {
@@ -50,14 +51,16 @@ function SlateEditor(_ref) {
50
51
  }
51
52
  const eventBus = _eventBus.default.getInstance();
52
53
  eventBus.dispatch('change');
53
- }, [editor.operations, onContentChanged]);
54
+ }, [editor.forceNormalize, editor.operations, onContentChanged]);
54
55
 
55
56
  // useMount: focus editor
56
57
  (0, _react.useEffect)(() => {
58
+ editor.forceNormalize = true;
57
59
  _slate.Editor.normalize(editor, {
58
60
  force: true
59
61
  });
60
62
  const timer = setTimeout(() => {
63
+ editor.forceNormalize = false;
61
64
  const [firstNode] = editor.children;
62
65
  if (firstNode) {
63
66
  const [firstNodeFirstChild] = firstNode.children;
@@ -72,6 +75,7 @@ function SlateEditor(_ref) {
72
75
  }
73
76
  }, 300);
74
77
  return () => {
78
+ editor.forceNormalize = false;
75
79
  clearTimeout(timer);
76
80
  };
77
81
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -13,8 +13,8 @@ var _helper = require("../helper");
13
13
  var _tooltip = _interopRequireDefault(require("../../../commons/tooltip"));
14
14
  var _keyboard = require("../../../constants/keyboard");
15
15
  var _constants = require("../../../constants");
16
- require("./style.css");
17
16
  var _constants2 = require("../../../../constants");
17
+ require("./style.css");
18
18
  const headerPopoverShowerList = [_constants.ELementTypes.PARAGRAPH, ..._constants.HEADERS];
19
19
  const HeaderMenu = _ref => {
20
20
  let {
@@ -26,20 +26,19 @@ const ImageMenu = _ref => {
26
26
  isShowImagePopover ? registerEventHandler() : unregisterEventHandler();
27
27
  // eslint-disable-next-line react-hooks/exhaustive-deps
28
28
  }, [isShowImagePopover]);
29
+ const handleChangePopoverDisplayed = (0, _react.useCallback)(() => {
30
+ setIsShowImagePopover(!isShowImagePopover);
31
+ }, [isShowImagePopover]);
29
32
  const onMousedown = (0, _react.useCallback)(e => {
30
33
  e.stopPropagation();
31
34
  handleChangePopoverDisplayed();
32
- // eslint-disable-next-line react-hooks/exhaustive-deps
33
- }, []);
35
+ }, [handleChangePopoverDisplayed]);
34
36
  const registerEventHandler = () => {
35
37
  return window.addEventListener('click', handleChangePopoverDisplayed);
36
38
  };
37
39
  const unregisterEventHandler = () => {
38
40
  return window.removeEventListener('click', handleChangePopoverDisplayed);
39
41
  };
40
- const handleChangePopoverDisplayed = (0, _react.useCallback)(() => {
41
- setIsShowImagePopover(!isShowImagePopover);
42
- }, [isShowImagePopover]);
43
42
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_commons.MenuItem, Object.assign({
44
43
  type: Image,
45
44
  isRichEditor: isRichEditor,
@@ -36,6 +36,7 @@
36
36
  background-color: #fff;
37
37
  user-select: none !important;
38
38
  z-index: 1000;
39
+ cursor: pointer;
39
40
  }
40
41
 
41
42
  .sf-image-wrapper .full-screen:hover {
@@ -54,6 +54,7 @@
54
54
 
55
55
  .sf-link-op-icon .iconfont {
56
56
  font-size: 12px;
57
+ cursor: pointer;
57
58
  }
58
59
 
59
60
  .sf-link-op-icon:hover {
@@ -13,11 +13,15 @@ var _insertFragmentList = require("./insert-fragment-list");
13
13
  var _normalizeList = require("./normalize-list");
14
14
  var _constant = require("../constant");
15
15
  var _shortcut = require("./shortcut");
16
+ var _queries = require("../queries");
17
+ var _core = require("../../../core");
18
+ var _transforms = require("../transforms");
19
+ var _elementTypes = require("../../../constants/element-types");
16
20
  const withList = editor => {
17
21
  const {
18
22
  insertBreak,
19
23
  onHotKeyDown,
20
- deleteBackWord,
24
+ deleteBackward,
21
25
  insertText
22
26
  } = editor;
23
27
  const newEditor = editor;
@@ -26,16 +30,28 @@ const withList = editor => {
26
30
  insertBreak();
27
31
  return;
28
32
  };
29
- newEditor.deleteBackWord = unit => {
33
+ newEditor.deleteBackward = unit => {
30
34
  const {
31
35
  selection
32
36
  } = newEditor;
33
37
  if (selection === null) {
34
- deleteBackWord(unit);
38
+ deleteBackward(unit);
35
39
  return;
36
40
  }
41
+ const res = (0, _queries.getListItemEntry)(editor, {});
42
+ if (res && (0, _core.isSelectionAtBlockStart)(editor, {
43
+ match: node => node.type === _elementTypes.LIST_ITEM
44
+ })) {
45
+ const {
46
+ list,
47
+ listItem
48
+ } = res;
49
+ if ((0, _core.isFirstNode)(list[0], listItem[0]) && !(0, _queries.isListNested)(editor, list[1])) {
50
+ (0, _transforms.unwrapList)(editor);
51
+ }
52
+ }
37
53
  // nothing todo
38
- deleteBackWord(unit);
54
+ deleteBackward(unit);
39
55
  };
40
56
  newEditor.insertText = text => {
41
57
  const isPreventInsert = (0, _shortcut.handleShortcut)(newEditor, text);
@@ -49,9 +49,12 @@ const handleShortcut = (editor, text) => {
49
49
  if (matchOrderListResult.index !== 0) return false;
50
50
  if (matchedOrderListText !== '1.') return false;
51
51
  const previousNodePath = (0, _core.getPreviousPath)(aboveNodePath);
52
- const [previousNode] = _slate.Editor.node(editor, previousNodePath);
52
+ let previousNodeEntry = null;
53
+ if (previousNodePath) {
54
+ previousNodeEntry = _slate.Editor.node(editor, previousNodePath);
55
+ }
53
56
  // If the previous node is not an ordered list and is start with `1.`,transforms to ordered list
54
- if (previousNode.type !== _elementTypes.ORDERED_LIST) {
57
+ if (!previousNodePath || previousNodeEntry[0].type !== _elementTypes.ORDERED_LIST) {
55
58
  // Delete shortcut key text
56
59
  _slate.Transforms.delete(editor, {
57
60
  at: range
@@ -25,25 +25,26 @@ const TableMenu = _ref => {
25
25
  // eslint-disable-next-line react-hooks/exhaustive-deps
26
26
  const disabled = (0, _react.useMemo)(() => (0, _helper.isDisabled)(editor, readonly), [editor.selection, readonly]);
27
27
  const isActive = (0, _helper.isInTable)(editor);
28
- const onSelectorHide = (0, _react.useCallback)(() => {
28
+ const onHideSelector = (0, _react.useCallback)(() => {
29
29
  setIsOpenTableSizeSelector(false);
30
30
  unregisterEvent();
31
31
  // eslint-disable-next-line react-hooks/exhaustive-deps
32
32
  }, [setIsOpenTableSizeSelector]);
33
33
  const registerEvent = (0, _react.useCallback)(() => {
34
- window.addEventListener('click', onSelectorHide);
34
+ window.addEventListener('click', onHideSelector);
35
35
  // eslint-disable-next-line react-hooks/exhaustive-deps
36
36
  }, []);
37
37
  const unregisterEvent = (0, _react.useCallback)(() => {
38
- window.removeEventListener('click', onSelectorHide);
38
+ window.removeEventListener('click', onHideSelector);
39
39
  // eslint-disable-next-line react-hooks/exhaustive-deps
40
40
  }, []);
41
41
  const onMouseDown = (0, _react.useCallback)(e => {
42
42
  e.stopPropagation();
43
43
  e.preventDefault();
44
- setIsOpenTableSizeSelector(true);
45
- registerEvent();
46
- }, [setIsOpenTableSizeSelector, registerEvent]);
44
+ const newState = !isOpenTableSizeSelector;
45
+ setIsOpenTableSizeSelector(newState);
46
+ newState ? registerEvent() : unregisterEvent();
47
+ }, [isOpenTableSizeSelector, registerEvent, unregisterEvent]);
47
48
  return /*#__PURE__*/_react.default.createElement("div", {
48
49
  className: "sf-table-menu-item"
49
50
  }, /*#__PURE__*/_react.default.createElement(_menuItem.default, Object.assign({
@@ -103,6 +103,10 @@ function EmailEditorDialog(_ref) {
103
103
  event.stopPropagation();
104
104
  onHotKey(event);
105
105
  };
106
+ const onEmailContainerClick = event => {
107
+ event.stopPropagation();
108
+ event.nativeEvent.stopImmediatePropagation();
109
+ };
106
110
  const headerClass = (0, _classnames.default)('longtext-header-container', {
107
111
  'longtext-header-container-border': readOnly || isWindowsWechat
108
112
  });
@@ -133,6 +137,7 @@ function EmailEditorDialog(_ref) {
133
137
  isWindowsWechat: isWindowsWechat
134
138
  })), /*#__PURE__*/_react.default.createElement("div", {
135
139
  onKeyDown: onContainerKeyDown,
140
+ onClick: onEmailContainerClick,
136
141
  className: contentClass
137
142
  }, /*#__PURE__*/_react.default.createElement(_seatableEditor.default, {
138
143
  ref: editorRef,
@@ -112,6 +112,10 @@
112
112
  box-shadow: none;
113
113
  }
114
114
 
115
+ .longtext-content-container .sf-slate-editor-content {
116
+ height: calc(100% - 34px);
117
+ }
118
+
115
119
  .longtext-content-container .sf-slate-editor-toolbar .sf-menu-group {
116
120
  padding: 4px 0 4px 8px;
117
121
  }
@@ -150,6 +154,7 @@
150
154
  padding: 16px;
151
155
  height: auto;
152
156
  min-height: 100% !important;
157
+ margin: 0 !important;
153
158
  }
154
159
 
155
160
  .longtext-content-container .sf-simple-slate-editor-container .article > div[role="textbox"] > :first-child {
@@ -166,4 +171,32 @@
166
171
 
167
172
  .longtext-content-container .sf-slate-editor-toolbar button:focus {
168
173
  outline: none;
169
- }
174
+ }
175
+
176
+ .longtext-content-container .sf-image-wrapper .full-screen {
177
+ position: absolute;
178
+ display: flex;
179
+ align-items: center;
180
+ justify-content: center;
181
+ height: 28px;
182
+ width: 28px;
183
+ line-height: 28px;
184
+ top: 10px;
185
+ right: 10px;
186
+ padding: 0px;
187
+ box-shadow: none;
188
+ border-radius: 3px;
189
+ border: none;
190
+ background-color: rgba(0, 0, 0, 0.5);
191
+ user-select: none !important;
192
+ z-index: 1000;
193
+ }
194
+
195
+ .longtext-content-container .sf-image-wrapper .full-screen .iconfont {
196
+ color: #fff;
197
+ }
198
+
199
+ .longtext-content-container .sf-image-wrapper .full-screen:hover {
200
+ display: flex;
201
+ background-color: rgba(0, 0, 0, 0.5);
202
+ }
@@ -8,8 +8,8 @@ exports.default = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/defineProperty"));
9
9
  var _react = _interopRequireDefault(require("react"));
10
10
  var _loading = _interopRequireDefault(require("../../containers/loading"));
11
- var _markdownView = _interopRequireDefault(require("../markdown-view"));
12
11
  var _slateConvert = require("../../slate-convert");
12
+ var _slateViewer = _interopRequireDefault(require("../../editors/slate-viewer"));
13
13
  require("./style.css");
14
14
  // Windows old Wechat (3.0 or earlier) inner core is chrome 53 and don't support ECMA6, can't use seafile-editor markdownViewer
15
15
  // Windows new Wechat (lastest version 3.3.5) support seafile-editor markdownViewer
@@ -57,8 +57,8 @@ class MarkdownPreview extends _react.default.PureComponent {
57
57
  dangerouslySetInnerHTML: {
58
58
  __html: this.state.innerHtml
59
59
  }
60
- }), !isWindowsWechat && /*#__PURE__*/_react.default.createElement(_markdownView.default, {
61
- value: value,
60
+ }), !isWindowsWechat && /*#__PURE__*/_react.default.createElement(_slateViewer.default, {
61
+ value: (0, _slateConvert.mdStringToSlate)(value),
62
62
  isShowOutline: isShowOutline
63
63
  }));
64
64
  }
@@ -54,6 +54,10 @@ const getPreviewText = (content, previewContent) => {
54
54
  };
55
55
  const getTextOfNode = node => {
56
56
  let text = '';
57
+ if (node.type === 'check_list_item') {
58
+ text += '';
59
+ return text;
60
+ }
57
61
  for (let index = 0; index < node.children.length; index++) {
58
62
  const currentNode = node.children[index];
59
63
  const {
@@ -61,12 +65,6 @@ const getTextOfNode = node => {
61
65
  } = currentNode;
62
66
  if (type === 'link') {
63
67
  text += '';
64
- } else if (type === 'check_list_item') {
65
- if (Reflect.has(currentNode, 'checked')) {
66
- text += '';
67
- } else {
68
- text += _slate.Node.string(currentNode) + ' ';
69
- }
70
68
  } else {
71
69
  text += _slate.Node.string(currentNode) + ' ';
72
70
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/seafile-editor",
3
- "version": "1.0.34",
3
+ "version": "1.0.36",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {