@seafile/sdoc-editor 3.0.204 → 3.0.205

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.
@@ -255,6 +255,16 @@ var SdocEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
255
255
  (0, _dispatchContentSelectEvent.dispatchContentSelectEvent)(validEditor);
256
256
  }
257
257
  };
258
+ (0, _react.useEffect)(function () {
259
+ validEditor.onHeaderCollapseStateChange = function () {
260
+ _setSlateValue(function (value) {
261
+ return (0, _toConsumableArray2["default"])(value);
262
+ });
263
+ };
264
+ return function () {
265
+ validEditor.onHeaderCollapseStateChange = null;
266
+ };
267
+ }, [validEditor]);
258
268
  var isFreezed = _context["default"].getSetting('isFreezed');
259
269
  if (isReloading || isLoadingMathJax) {
260
270
  return /*#__PURE__*/_react["default"].createElement("div", {
@@ -146,6 +146,16 @@ var WikiEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
146
146
  }, 0);
147
147
  _setSlateValue(value);
148
148
  };
149
+ (0, _react.useEffect)(function () {
150
+ validEditor.onHeaderCollapseStateChange = function () {
151
+ _setSlateValue(function (value) {
152
+ return (0, _toConsumableArray2["default"])(value);
153
+ });
154
+ };
155
+ return function () {
156
+ validEditor.onHeaderCollapseStateChange = null;
157
+ };
158
+ }, [validEditor]);
149
159
  if (isReloading || isLoadingMathJax) {
150
160
  return /*#__PURE__*/_react["default"].createElement("div", {
151
161
  className: "h-100 w-100 d-flex align-items-center justify-content-center"
@@ -4,11 +4,77 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.setHeaderType = exports.isSelectionInHeader = exports.isMenuDisabled = exports.isHasImage = exports.isElementHiddenByCollapsedHeader = exports.getSkippedHiddenHeaderMovePoint = exports.getHeaderType = exports.getHeaderLevel = exports.getCollapsedHeaderSectionEndIndex = void 0;
7
+ exports.toggleHeaderCollapsed = exports.setHeaderType = exports.setHeaderCollapsed = exports.isSelectionInHeader = exports.isMenuDisabled = exports.isHeaderCollapsed = exports.isHasImage = exports.isElementHiddenByCollapsedHeader = exports.getSkippedHiddenHeaderMovePoint = exports.getHeaderType = exports.getHeaderLevel = exports.getCollapsedHeaderSectionEndIndex = exports.getCollapsedHeaderInsertPath = exports.clearHeaderCollapsedState = void 0;
8
8
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
9
9
  var _slate = require("@seafile/slate");
10
+ var _context = _interopRequireDefault(require("../../../context"));
11
+ var _localStorageUtils = _interopRequireDefault(require("../../../utils/local-storage-utils"));
10
12
  var _constants = require("../../constants");
11
13
  var _core = require("../../core");
14
+ var HEADER_COLLAPSE_STORAGE_PREFIX = 'sdoc-header-collapsed:';
15
+ var getHeaderStorageDocKey = function getHeaderStorageDocKey() {
16
+ return _context["default"].getSetting('docUuid') || _context["default"].getSetting('wikiId') || window.location.pathname || 'default';
17
+ };
18
+ var getHeaderStorageKey = function getHeaderStorageKey() {
19
+ return "".concat(HEADER_COLLAPSE_STORAGE_PREFIX).concat(getHeaderStorageDocKey());
20
+ };
21
+ var clearAllHeaderCollapsedState = function clearAllHeaderCollapsedState() {
22
+ Object.keys(window.localStorage).forEach(function (key) {
23
+ if (key.startsWith(HEADER_COLLAPSE_STORAGE_PREFIX)) {
24
+ _localStorageUtils["default"].removeItem(key);
25
+ }
26
+ });
27
+ };
28
+ var getCollapsedHeaderState = function getCollapsedHeaderState() {
29
+ return _localStorageUtils["default"].getItem(getHeaderStorageKey(), {});
30
+ };
31
+ var persistCollapsedHeaderState = function persistCollapsedHeaderState(collapsedHeaderState) {
32
+ try {
33
+ _localStorageUtils["default"].setItem(getHeaderStorageKey(), collapsedHeaderState);
34
+ } catch (error) {
35
+ clearAllHeaderCollapsedState();
36
+ try {
37
+ _localStorageUtils["default"].setItem(getHeaderStorageKey(), collapsedHeaderState);
38
+ } catch (_unused) {
39
+ // Ignore storage failures after cleanup.
40
+ }
41
+ }
42
+ };
43
+ var getHeaderId = function getHeaderId(editor, element, defaultPath) {
44
+ var _Node$get;
45
+ if (element !== null && element !== void 0 && element.id) return element.id;
46
+ var path = defaultPath || (0, _core.findPath)(editor, element);
47
+ if (!path) return null;
48
+ return ((_Node$get = _slate.Node.get(editor, path)) === null || _Node$get === void 0 ? void 0 : _Node$get.id) || "path:".concat(path.join('.'));
49
+ };
50
+ var isHeaderCollapsed = exports.isHeaderCollapsed = function isHeaderCollapsed(editor, element, defaultPath) {
51
+ var headerId = getHeaderId(editor, element, defaultPath);
52
+ if (!headerId) {
53
+ return !!(element !== null && element !== void 0 && element.collapsed);
54
+ }
55
+ var collapsedHeaderState = getCollapsedHeaderState();
56
+ if (Object.prototype.hasOwnProperty.call(collapsedHeaderState, headerId)) {
57
+ return !!collapsedHeaderState[headerId];
58
+ }
59
+ return !!(element !== null && element !== void 0 && element.collapsed);
60
+ };
61
+ var setHeaderCollapsed = exports.setHeaderCollapsed = function setHeaderCollapsed(editor, element, collapsed, defaultPath) {
62
+ var _editor$onHeaderColla;
63
+ var headerId = getHeaderId(editor, element, defaultPath);
64
+ if (!headerId) return;
65
+ var collapsedHeaderState = getCollapsedHeaderState();
66
+ collapsedHeaderState[headerId] = collapsed;
67
+ persistCollapsedHeaderState(collapsedHeaderState);
68
+ (_editor$onHeaderColla = editor.onHeaderCollapseStateChange) === null || _editor$onHeaderColla === void 0 ? void 0 : _editor$onHeaderColla.call(editor);
69
+ };
70
+ var toggleHeaderCollapsed = exports.toggleHeaderCollapsed = function toggleHeaderCollapsed(editor, element, defaultPath) {
71
+ setHeaderCollapsed(editor, element, !isHeaderCollapsed(editor, element, defaultPath), defaultPath);
72
+ };
73
+ var clearHeaderCollapsedState = exports.clearHeaderCollapsedState = function clearHeaderCollapsedState(editor) {
74
+ var _editor$onHeaderColla2;
75
+ _localStorageUtils["default"].removeItem(getHeaderStorageKey());
76
+ editor === null || editor === void 0 ? void 0 : (_editor$onHeaderColla2 = editor.onHeaderCollapseStateChange) === null || _editor$onHeaderColla2 === void 0 ? void 0 : _editor$onHeaderColla2.call(editor);
77
+ };
12
78
  var isMenuDisabled = exports.isMenuDisabled = function isMenuDisabled(editor) {
13
79
  var readonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
14
80
  if (readonly) return true;
@@ -99,6 +165,14 @@ var getCollapsedHeaderSectionEndIndex = exports.getCollapsedHeaderSectionEndInde
99
165
  if (level === null) return null;
100
166
  return getSectionEndIndex(siblings, currentIndex, level);
101
167
  };
168
+ var getCollapsedHeaderInsertPath = exports.getCollapsedHeaderInsertPath = function getCollapsedHeaderInsertPath(editor, element, defaultPath) {
169
+ var endIndex = getCollapsedHeaderSectionEndIndex(editor, element, defaultPath);
170
+ if (endIndex === null) {
171
+ var path = (0, _core.findPath)(editor, element, defaultPath);
172
+ return path ? _slate.Path.next(path) : null;
173
+ }
174
+ return [endIndex];
175
+ };
102
176
  var isElementHiddenByCollapsedHeader = exports.isElementHiddenByCollapsedHeader = function isElementHiddenByCollapsedHeader(editor, element, defaultPath) {
103
177
  var path = (0, _core.findPath)(editor, element, defaultPath);
104
178
  if (!path || path.length !== 1) return false;
@@ -107,7 +181,7 @@ var isElementHiddenByCollapsedHeader = exports.isElementHiddenByCollapsedHeader
107
181
  var siblings = parentPath.length === 0 ? editor.children : _slate.Node.get(editor, parentPath).children;
108
182
  for (var index = currentIndex - 1; index >= 0; index--) {
109
183
  var sibling = siblings[index];
110
- if (!_slate.Element.isElement(sibling) || !sibling.collapsed) continue;
184
+ if (!_slate.Element.isElement(sibling) || !isHeaderCollapsed(editor, sibling, [index])) continue;
111
185
  var siblingLevel = getHeaderLevel(sibling.type);
112
186
  if (siblingLevel === null) continue;
113
187
  var endIndex = getSectionEndIndex(siblings, index, siblingLevel);
@@ -64,7 +64,7 @@ var withHeader = function withHeader(editor) {
64
64
  var _match = (0, _slicedToArray2["default"])(match, 2),
65
65
  currentNode = _match[0],
66
66
  path = _match[1];
67
- var isCollapsedHeader = !!currentNode.collapsed;
67
+ var isCollapsedHeader = (0, _helpers2.isHeaderCollapsed)(newEditor, currentNode, path);
68
68
  var startPoint = _slate.Editor.start(newEditor, path);
69
69
  var endPoint = _slate.Editor.end(newEditor, path);
70
70
  if (isCollapsedHeader) {
@@ -80,8 +80,7 @@ var withHeader = function withHeader(editor) {
80
80
  }
81
81
  if (isAtHeaderEnd) {
82
82
  _slate.Editor.withoutNormalizing(newEditor, function () {
83
- var sectionEndIndex = (0, _helpers2.getCollapsedHeaderSectionEndIndex)(newEditor, currentNode, path);
84
- var insertPath = sectionEndIndex === null ? _slate.Path.next(path) : [sectionEndIndex];
83
+ var insertPath = (0, _helpers2.getCollapsedHeaderInsertPath)(newEditor, currentNode, path);
85
84
  var newNode = (0, _core.generateEmptyElement)(currentNode.type);
86
85
  _slate.Transforms.insertNodes(newEditor, newNode, {
87
86
  at: insertPath
@@ -91,7 +90,7 @@ var withHeader = function withHeader(editor) {
91
90
  return;
92
91
  }
93
92
  _slate.Editor.withoutNormalizing(newEditor, function () {
94
- var sectionEndIndex = (0, _helpers2.getCollapsedHeaderSectionEndIndex)(newEditor, currentNode, path);
93
+ var insertPath = (0, _helpers2.getCollapsedHeaderInsertPath)(newEditor, currentNode, path);
95
94
  var afterRange = {
96
95
  anchor: cursorPoint,
97
96
  focus: endPoint
@@ -100,9 +99,9 @@ var withHeader = function withHeader(editor) {
100
99
  _slate.Transforms["delete"](newEditor, {
101
100
  at: afterRange
102
101
  });
102
+ (0, _helpers2.setHeaderCollapsed)(newEditor, currentNode, true, path);
103
103
  var newNode = (0, _core.generateEmptyElement)(currentNode.type);
104
104
  newNode.children[0].text = afterText;
105
- var insertPath = sectionEndIndex === null ? _slate.Path.next(path) : [sectionEndIndex];
106
105
  _slate.Transforms.insertNodes(newEditor, newNode, {
107
106
  at: insertPath
108
107
  });
@@ -2,6 +2,15 @@
2
2
  position: relative;
3
3
  }
4
4
 
5
+ .sdoc-header-row::before {
6
+ content: '';
7
+ position: absolute;
8
+ right: 100%;
9
+ top: 0;
10
+ width: 20px;
11
+ height: 100%;
12
+ }
13
+
5
14
  .sdoc-header-collapse-prefix {
6
15
  display: inline-flex;
7
16
  align-items: center;
@@ -19,6 +28,8 @@
19
28
  }
20
29
 
21
30
  .sdoc-header-collapse-prefix:hover {
31
+ opacity: 1;
32
+ pointer-events: auto;
22
33
  background-color: rgba(0, 0, 0, .04);
23
34
  border-radius: 2px;
24
35
  }
@@ -28,6 +39,11 @@
28
39
  pointer-events: auto;
29
40
  }
30
41
 
42
+ .sdoc-header-row:hover .sdoc-header-collapse-prefix {
43
+ opacity: 1;
44
+ pointer-events: auto;
45
+ }
46
+
31
47
  .sdoc-header-collapse-prefix .sdocfont {
32
48
  width: 16px;
33
49
  height: 16px;
@@ -12,6 +12,7 @@ var _slateReact = require("@seafile/slate-react");
12
12
  var _classnames = _interopRequireDefault(require("classnames"));
13
13
  var _constants = require("../../constants");
14
14
  var _helper = require("../paragraph/helper");
15
+ var _helpers = require("./helpers");
15
16
  var _placeholder = _interopRequireDefault(require("./placeholder"));
16
17
  require("./render-elem.css");
17
18
  var renderTitle = exports.renderTitle = function renderTitle(props, editor) {
@@ -52,16 +53,8 @@ var renderHeader = exports.renderHeader = function renderHeader(props, editor) {
52
53
  isComposing = props.isComposing;
53
54
  var type = element.type;
54
55
  var level = type.split('header')[1];
55
- var collapsed = !!element.collapsed;
56
56
  var currentPath = _slateReact.ReactEditor.findPath(editor, element);
57
- var activeHeaderEntry = editor.selection ? _slate.Editor.above(editor, {
58
- at: editor.selection,
59
- match: function match(node, path) {
60
- return _slate.Element.isElement(node) && node.id === element.id && path.length === currentPath.length;
61
- },
62
- mode: 'lowest'
63
- }) : null;
64
- var isActiveHeader = !!activeHeaderEntry;
57
+ var collapsed = (0, _helpers.isHeaderCollapsed)(editor, element, currentPath);
65
58
  var style = (0, _objectSpread2["default"])({
66
59
  textAlign: element.align,
67
60
  fontSize: "".concat(_constants.SDOC_FONT_SIZE[element.type], "pt")
@@ -75,11 +68,12 @@ var renderHeader = exports.renderHeader = function renderHeader(props, editor) {
75
68
  var onToggleCollapsed = function onToggleCollapsed(event) {
76
69
  event.preventDefault();
77
70
  event.stopPropagation();
78
- _slate.Transforms.setNodes(editor, {
79
- collapsed: !collapsed
80
- }, {
81
- at: currentPath
82
- });
71
+ (0, _helpers.toggleHeaderCollapsed)(editor, element, currentPath);
72
+ if (collapsed) {
73
+ var endPoint = _slate.Editor.end(editor, currentPath);
74
+ _slate.Transforms.select(editor, endPoint);
75
+ _slateReact.ReactEditor.focus(editor);
76
+ }
83
77
  };
84
78
  return /*#__PURE__*/_react["default"].createElement("div", Object.assign({
85
79
  "data-id": element.id,
@@ -93,7 +87,7 @@ var renderHeader = exports.renderHeader = function renderHeader(props, editor) {
93
87
  className: "sdoc-header-row"
94
88
  }, /*#__PURE__*/_react["default"].createElement("span", {
95
89
  className: (0, _classnames["default"])('sdoc-header-collapse-prefix', {
96
- 'sdoc-header-collapse-prefix-visible': isActiveHeader,
90
+ 'sdoc-header-collapse-prefix-visible': collapsed,
97
91
  'sdoc-header-collapse-prefix-collapsed': collapsed
98
92
  }),
99
93
  contentEditable: false,
@@ -109,7 +109,6 @@ var onSetNodeType = exports.onSetNodeType = function onSetNodeType(editor, eleme
109
109
  id: _slugid["default"].nice(),
110
110
  type: _constants2.TOGGLE_HEADER,
111
111
  level: level,
112
- collapsed: false,
113
112
  children: [titleNode, bodyNode]
114
113
  };
115
114
  _slate.Editor.withoutNormalizing(editor, function () {
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
3
  var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports["default"] = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
9
10
  var _react = _interopRequireWildcard(require("react"));
10
11
  var _slateReact = require("@seafile/slate-react");
11
12
  var _comment = _interopRequireDefault(require("../comment"));
@@ -20,6 +21,19 @@ var ReadOnlyArticle = function ReadOnlyArticle(_ref) {
20
21
  _ref$showComment = _ref.showComment,
21
22
  showComment = _ref$showComment === void 0 ? false : _ref$showComment;
22
23
  var decorate = (0, _decorates.usePipDecorate)(editor);
24
+ var _useState = (0, _react.useState)(0),
25
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
26
+ setVersion = _useState2[1];
27
+ (0, _react.useEffect)(function () {
28
+ editor.onHeaderCollapseStateChange = function () {
29
+ setVersion(function (value) {
30
+ return value + 1;
31
+ });
32
+ };
33
+ return function () {
34
+ editor.onHeaderCollapseStateChange = null;
35
+ };
36
+ }, [editor]);
23
37
  return /*#__PURE__*/_react["default"].createElement(_slateReact.Slate, {
24
38
  editor: editor,
25
39
  value: slateValue,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "3.0.204",
3
+ "version": "3.0.205",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "test": "jest",
@@ -72,5 +72,5 @@
72
72
  "publishConfig": {
73
73
  "access": "public"
74
74
  },
75
- "gitHead": "8e18dcc0fe2eac6fa672fa406c5475d0c5f5b5b6"
75
+ "gitHead": "8ced52244e7fab9a1f1af86ab419b8b5adb833b0"
76
76
  }