@seafile/sdoc-editor 3.0.0 → 3.0.2

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 (41) hide show
  1. package/dist/api/seafile-api.js +20 -0
  2. package/dist/context.js +14 -0
  3. package/dist/editor/sdoc-editor.js +3 -0
  4. package/dist/editor/wiki-editor.js +4 -1
  5. package/dist/extension/commons/file-link-preview/index.css +1 -1
  6. package/dist/extension/commons/insert-element-dialog/index.js +26 -13
  7. package/dist/extension/commons/select-file-dialog/index.css +1 -0
  8. package/dist/extension/commons/select-file-dialog/list-view/index.css +6 -0
  9. package/dist/extension/commons/select-file-dialog/tree-view/index.css +7 -0
  10. package/dist/extension/constants/element-type.js +2 -1
  11. package/dist/extension/constants/font.js +1 -2
  12. package/dist/extension/constants/index.js +17 -1
  13. package/dist/extension/constants/menus-config.js +8 -3
  14. package/dist/extension/plugins/blockquote/plugin.js +2 -7
  15. package/dist/extension/plugins/file-view/helpers.js +77 -0
  16. package/dist/extension/plugins/file-view/index.js +17 -0
  17. package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/constants.js +16 -0
  18. package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/index.css +96 -0
  19. package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/index.js +156 -0
  20. package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/lib.png +0 -0
  21. package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/option.css +49 -0
  22. package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/option.js +53 -0
  23. package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/select-option-group.css +37 -0
  24. package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/select-option-group.js +241 -0
  25. package/dist/extension/plugins/file-view/insert-view-dialog/index.js +232 -0
  26. package/dist/extension/plugins/file-view/insert-view-dialog/modal-portal.js +41 -0
  27. package/dist/extension/plugins/file-view/plugin.js +71 -0
  28. package/dist/extension/plugins/file-view/render-elem/index.css +53 -0
  29. package/dist/extension/plugins/file-view/render-elem/index.js +103 -0
  30. package/dist/extension/plugins/html/plugin.js +2 -3
  31. package/dist/extension/plugins/image/use-copy-image.js +2 -2
  32. package/dist/extension/plugins/index.js +9 -2
  33. package/dist/extension/plugins/link/dialog/add-link-dialog/index.css +46 -1
  34. package/dist/extension/plugins/link/dialog/add-link-dialog/index.js +45 -26
  35. package/dist/extension/plugins/link/helpers.js +2 -1
  36. package/dist/extension/plugins/quick-insert/render-elem.js +1 -0
  37. package/dist/extension/render/custom-element.js +6 -0
  38. package/dist/extension/toolbar/insert-element-toolbar/index.js +16 -1
  39. package/dist/extension/toolbar/side-toolbar/insert-block-menu.js +16 -2
  40. package/dist/node-id/index.js +3 -0
  41. package/package.json +2 -2
@@ -64,30 +64,34 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
64
64
  _useState10 = (0, _slicedToArray2["default"])(_useState1, 2),
65
65
  selectedBlockId = _useState10[0],
66
66
  setSelectedBlockId = _useState10[1];
67
- var _useState11 = (0, _react.useState)(false),
67
+ var _useState11 = (0, _react.useState)([]),
68
68
  _useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
69
- isOpenSelect = _useState12[0],
70
- setIsOpenSelect = _useState12[1];
69
+ headerList = _useState12[0],
70
+ setheaderList = _useState12[1];
71
71
  var _useState13 = (0, _react.useState)(false),
72
72
  _useState14 = (0, _slicedToArray2["default"])(_useState13, 2),
73
- isOpenSelectHeader = _useState14[0],
74
- setIsOpenSelectHeader = _useState14[1];
73
+ isOpenSelect = _useState14[0],
74
+ setIsOpenSelect = _useState14[1];
75
75
  var _useState15 = (0, _react.useState)(false),
76
76
  _useState16 = (0, _slicedToArray2["default"])(_useState15, 2),
77
- isOpenSelectImageBlock = _useState16[0],
78
- setIsOpenSelectImageBlock = _useState16[1];
77
+ isOpenSelectHeader = _useState16[0],
78
+ setIsOpenSelectHeader = _useState16[1];
79
79
  var _useState17 = (0, _react.useState)(false),
80
80
  _useState18 = (0, _slicedToArray2["default"])(_useState17, 2),
81
- isOpenSelectCodeBlock = _useState18[0],
82
- setIsOpenSelectCodeBlock = _useState18[1];
81
+ isOpenSelectImageBlock = _useState18[0],
82
+ setIsOpenSelectImageBlock = _useState18[1];
83
83
  var _useState19 = (0, _react.useState)(false),
84
84
  _useState20 = (0, _slicedToArray2["default"])(_useState19, 2),
85
- isOpenSelectBlockquote = _useState20[0],
86
- setIsOpenSelectBlockquote = _useState20[1];
87
- var _useState21 = (0, _react.useState)(''),
85
+ isOpenSelectCodeBlock = _useState20[0],
86
+ setIsOpenSelectCodeBlock = _useState20[1];
87
+ var _useState21 = (0, _react.useState)(false),
88
88
  _useState22 = (0, _slicedToArray2["default"])(_useState21, 2),
89
- htmlString = _useState22[0],
90
- setHtmlString = _useState22[1];
89
+ isOpenSelectBlockquote = _useState22[0],
90
+ setIsOpenSelectBlockquote = _useState22[1];
91
+ var _useState23 = (0, _react.useState)(''),
92
+ _useState24 = (0, _slicedToArray2["default"])(_useState23, 2),
93
+ htmlString = _useState24[0],
94
+ setHtmlString = _useState24[1];
91
95
  var submit = (0, _react.useCallback)(function () {
92
96
  setLinkErrorMessage('');
93
97
  setTitleErrorMessage('');
@@ -144,7 +148,7 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
144
148
  }));
145
149
  }, [closeDialog]);
146
150
  var handleOnChangeBlock = function handleOnChangeBlock(e) {
147
- var block = e.target.closest('.linked-block-item');
151
+ var block = e.target.closest('.linked-block-item') || e.currentTarget.querySelector('.linked-header-block-item');
148
152
  if (block) {
149
153
  var clone = block.cloneNode(true);
150
154
  var displayContainer = document.getElementById('selected-block-display');
@@ -173,8 +177,9 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
173
177
  return function () {
174
178
  return clearTimeout(timer);
175
179
  };
176
- }, []);
180
+ }, [linked_id]);
177
181
  (0, _react.useEffect)(function () {
182
+ // Get codeblock,blockquote,image html
178
183
  var genHtml = /*#__PURE__*/function () {
179
184
  var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regenerator2["default"])().m(function _callee() {
180
185
  var list, mdValue, ids, processor, file;
@@ -207,7 +212,15 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
207
212
  }();
208
213
  genHtml();
209
214
  }, [editor.children]);
210
- var headersHTML = (0, _helpers.parseHtmlString)(htmlString, 'h1,h2,h3,h4,h5,h6');
215
+ (0, _react.useEffect)(function () {
216
+ // Get header node list
217
+ var headerList = editor.children.filter(function (node) {
218
+ return _slate.Element.isElement(node) && !(0, _helpers.isEmptyNode)(node) && _constants.HEADERS.includes(node.type);
219
+ });
220
+ if (headerList.length > 0) {
221
+ setheaderList(headerList);
222
+ }
223
+ }, [editor.children]);
211
224
  var imagesHTML = (0, _helpers.parseHtmlString)(htmlString, 'img');
212
225
  var codeBlockHTML = (0, _helpers.parseHtmlString)(htmlString, 'pre');
213
226
  var blockquoteHTML = (0, _helpers.parseHtmlString)(htmlString, 'blockquote');
@@ -279,7 +292,7 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
279
292
  className: "sdoc-file-icon sdoc-file-icon-toggle sdocfont sdoc-right-slide"
280
293
  })), isOpenSelect && /*#__PURE__*/_react["default"].createElement("div", {
281
294
  className: "link-block-wrapper"
282
- }, headersHTML && /*#__PURE__*/_react["default"].createElement("div", {
295
+ }, headerList.length > 0 && /*#__PURE__*/_react["default"].createElement("div", {
283
296
  className: (0, _classnames["default"])('select-block-wrapper', {
284
297
  'expanded': isOpenSelectHeader
285
298
  }),
@@ -290,14 +303,20 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
290
303
  className: "sdoc-file-icon sdoc-file-icon-toggle sdocfont sdoc-right-slide"
291
304
  }), /*#__PURE__*/_react["default"].createElement("div", {
292
305
  className: "title"
293
- }, t('Header'))), isOpenSelectHeader && /*#__PURE__*/_react["default"].createElement("div", {
294
- className: "link-block-container",
295
- dangerouslySetInnerHTML: {
296
- __html: headersHTML
297
- },
298
- onClick: function onClick(e) {
299
- return handleOnChangeBlock(e);
300
- }
306
+ }, t('Header'))), isOpenSelectHeader && headerList.map(function (header, key) {
307
+ var headerContext = _slate.Node.string(header);
308
+ return /*#__PURE__*/_react["default"].createElement("div", {
309
+ className: "link-header-block-container",
310
+ key: key,
311
+ onClick: function onClick(e) {
312
+ return handleOnChangeBlock(e);
313
+ }
314
+ }, /*#__PURE__*/_react["default"].createElement("div", {
315
+ className: "heading-prefix"
316
+ }, _constants.HEADER_TAG[header.type]), /*#__PURE__*/_react["default"].createElement("div", {
317
+ "data-id": header.id,
318
+ className: "linked-header-block-item"
319
+ }, headerContext));
301
320
  }), imagesHTML && /*#__PURE__*/_react["default"].createElement("div", {
302
321
  className: (0, _classnames["default"])('select-block-wrapper', {
303
322
  'expanded': isOpenSelectImageBlock
@@ -252,7 +252,7 @@ var parseHtmlString = exports.parseHtmlString = function parseHtmlString(htmlStr
252
252
  var parser = new DOMParser();
253
253
  var doc = parser.parseFromString(htmlString, 'text/html');
254
254
  var resultHtml;
255
- if (targetType == 'img') {
255
+ if (targetType === 'img') {
256
256
  resultHtml = (0, _toConsumableArray2["default"])(doc.querySelectorAll('p:has(img)')).map(function (p) {
257
257
  return p.outerHTML;
258
258
  }).join('');
@@ -264,6 +264,7 @@ var parseHtmlString = exports.parseHtmlString = function parseHtmlString(htmlStr
264
264
  return resultHtml;
265
265
  };
266
266
  var isEmptyNode = exports.isEmptyNode = function isEmptyNode(node) {
267
+ if (node.type === _constants.IMAGE_BLOCK) return false;
267
268
  var text = _slate.Node.string(node);
268
269
  return text.trim() === '';
269
270
  };
@@ -76,6 +76,7 @@ var RenderQuickInsert = function RenderQuickInsert(_ref, editor, readonly) {
76
76
  document.addEventListener('click', handleClick);
77
77
  scrollDom.addEventListener('scroll', handleScroll);
78
78
  resizeObserver = new ResizeObserver(function (entries) {
79
+ // eslint-disable-next-line no-unused-vars
79
80
  var _iterator = (0, _createForOfIteratorHelper2["default"])(entries),
80
81
  _step;
81
82
  try {
@@ -240,6 +240,12 @@ var CustomRenderElement = function CustomRenderElement(props) {
240
240
  renderWhiteboard = _WhiteboardPlugin$ren[0];
241
241
  return renderWhiteboard((0, _objectSpread2["default"])({}, props), editor);
242
242
  }
243
+ case _elementType.FILE_VIEW:
244
+ {
245
+ var _FileViewPlugin$rende = (0, _slicedToArray2["default"])(_plugins.FileViewPlugin.renderElements, 1),
246
+ renderFileView = _FileViewPlugin$rende[0];
247
+ return renderFileView((0, _objectSpread2["default"])({}, props));
248
+ }
243
249
  default:
244
250
  {
245
251
  var _ParagraphPlugin$rend3 = (0, _slicedToArray2["default"])(_plugins.ParagraphPlugin.renderElements, 1),
@@ -112,6 +112,16 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
112
112
  });
113
113
  // eslint-disable-next-line react-hooks/exhaustive-deps
114
114
  }, [insertPosition]);
115
+ var openFileViewDialog = (0, _react.useCallback)(function () {
116
+ callback && callback();
117
+ var eventBus = _eventBus["default"].getInstance();
118
+ eventBus.dispatch(_constants.INTERNAL_EVENT.INSERT_ELEMENT, {
119
+ type: _constants2.ELEMENT_TYPE.FILE_VIEW,
120
+ insertPosition: insertPosition,
121
+ slateNode: slateNode
122
+ });
123
+ // eslint-disable-next-line react-hooks/exhaustive-deps
124
+ }, [insertPosition]);
115
125
  var onInsertCodeBlock = (0, _react.useCallback)(function () {
116
126
  callback && callback();
117
127
  var newInsertPosition = slateNode.type === _constants2.ELEMENT_TYPE.LIST_ITEM ? _constants2.INSERT_POSITION.AFTER : insertPosition;
@@ -203,7 +213,12 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
203
213
  (0, _helper2.insertMultiColumn)(editor, editor.selection, newInsertPosition, type);
204
214
  }, [callback, editor, insertPosition, slateNode]);
205
215
  var dropDownItems = (0, _react.useMemo)(function () {
206
- var items = (0, _objectSpread4["default"])((0, _objectSpread4["default"])((0, _defineProperty2["default"])({}, _constants2.IMAGE, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
216
+ var items = (0, _objectSpread4["default"])((0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, editor.editorType === _constants.WIKI_EDITOR && (0, _defineProperty2["default"])({}, _constants2.FILE_VIEW, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
217
+ isHidden: !quickInsertMenuSearchMap[_constants2.FILE_VIEW],
218
+ key: "sdoc-insert-menu-file-view",
219
+ menuConfig: (0, _objectSpread4["default"])({}, _constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.FILE_VIEW]),
220
+ onClick: openFileViewDialog
221
+ }))), {}, (0, _defineProperty2["default"])({}, _constants2.IMAGE, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
207
222
  isHidden: !quickInsertMenuSearchMap[_constants2.IMAGE],
208
223
  disabled: isDisableImage,
209
224
  key: "sdoc-insert-menu-image",
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports["default"] = void 0;
9
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
10
9
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
10
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
  var _reactI18next = require("react-i18next");
13
13
  var _reactstrap = require("reactstrap");
@@ -142,7 +142,21 @@ var InsertBlockMenu = function InsertBlockMenu(_ref) {
142
142
  var newInsertPosition = slateNode.type === _constants2.ELEMENT_TYPE.LIST_ITEM ? _constants2.INSERT_POSITION.AFTER : insertPosition;
143
143
  (0, _helper2.insertMultiColumn)(editor, editor.selection, newInsertPosition, type);
144
144
  }, [editor, insertPosition, slateNode]);
145
- return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, [_constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.PARAGRAPH]].concat((0, _toConsumableArray2["default"])(_constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.HEADER])).map(function (item) {
145
+ var insertFileView = (0, _react.useCallback)(function () {
146
+ var eventBus = _eventBus["default"].getInstance();
147
+ eventBus.dispatch(_constants.INTERNAL_EVENT.INSERT_ELEMENT, {
148
+ type: _constants2.ELEMENT_TYPE.FILE_VIEW,
149
+ insertPosition: insertPosition,
150
+ slateNode: slateNode
151
+ });
152
+ // eslint-disable-next-line react-hooks/exhaustive-deps
153
+ }, [insertPosition]);
154
+ console.log(editor.editorType);
155
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, editor.editorType === _constants.WIKI_EDITOR && /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
156
+ isHidden: !insertMenuSearchMap[_constants2.ELEMENT_TYPE.FILE_VIEW],
157
+ menuConfig: (0, _objectSpread2["default"])({}, _constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.FILE_VIEW]),
158
+ onClick: insertFileView
159
+ }), [_constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.PARAGRAPH]].concat((0, _toConsumableArray2["default"])(_constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.HEADER])).map(function (item) {
146
160
  return /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
147
161
  isHidden: !insertMenuSearchMap[item.type],
148
162
  disabled: isNodeEmpty && item.type === _constants2.PARAGRAPH,
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
@@ -7,6 +8,7 @@ exports["default"] = void 0;
7
8
  var _slate = require("@seafile/slate");
8
9
  var _constants = require("../extension/constants");
9
10
  var _documentUtils = require("../utils/document-utils");
11
+ var _localStorageUtils = _interopRequireDefault(require("../utils/local-storage-utils"));
10
12
  var _helpers = require("./helpers");
11
13
  var withNodeId = function withNodeId(editor) {
12
14
  var apply = editor.apply,
@@ -65,6 +67,7 @@ var withNodeId = function withNodeId(editor) {
65
67
  var cleaned = (0, _helpers.removeCommentMarks)(parsed);
66
68
  var newData = (0, _helpers.replacePastedDataId)(cleaned);
67
69
  var normalizeNewData = (0, _documentUtils.normalizeCopyNodes)(newEditor, newData);
70
+ _localStorageUtils["default"].setItem(_constants.RECENT_COPY_CONTENT, normalizeNewData);
68
71
  newEditor.insertFragment(normalizeNewData);
69
72
  return newEditor;
70
73
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "3.0.0",
3
+ "version": "3.0.2",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "test": "jest",
@@ -71,5 +71,5 @@
71
71
  "publishConfig": {
72
72
  "access": "public"
73
73
  },
74
- "gitHead": "bb8d81d4df2885fa2558ae327b02d9ebf12ae093"
74
+ "gitHead": "6a60ac9e210680a19a336fc2a98dbae74795305d"
75
75
  }