@seafile/sdoc-editor 2.0.48 → 2.0.50

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.
@@ -1,3 +1,54 @@
1
+ .sdoc-editor-container.fullscreen .sdoc-content-wrapper {
2
+ height: 100vh !important;
3
+ }
4
+
5
+ .sdoc-editor-container.fullscreen .sdoc-article-container {
6
+ width: 100% !important;
7
+ padding: 0 !important;
8
+ }
9
+
10
+ .sdoc-editor-container.fullscreen .sdoc-editor__article {
11
+ padding: calc(100vw / 794 * 40) calc(100vw / 794 * 60) !important;
12
+ font-size: calc(100vw / 794 * 14.7) !important;
13
+ }
14
+
15
+ .sdoc-editor-container.fullscreen .sdoc-checkbox-input {
16
+ width: calc(100vw / 794 * 13) !important;
17
+ }
18
+
19
+ .sdoc-editor-container.fullscreen .sdoc-code-block-pre {
20
+ font-size: calc(100vw / 794 * 13.3) !important;
21
+ }
22
+
23
+ .sdoc-editor-container.fullscreen .sdoc-header-title {
24
+ font-size: calc(100vw / 794 * 33.7) !important;
25
+ }
26
+
27
+ .sdoc-editor-container.fullscreen .sdoc-header-subtitle {
28
+ font-size: calc(100vw / 794 * 20) !important;
29
+ }
30
+
31
+ .sdoc-editor-container.fullscreen .sdoc-header-1 {
32
+ font-size: calc(100vw / 794 * 26.7) !important;
33
+ }
34
+
35
+ .sdoc-editor-container.fullscreen .sdoc-header-2 {
36
+ font-size: calc(100vw / 794 * 21.3) !important;
37
+ }
38
+
39
+ .sdoc-editor-container.fullscreen .sdoc-header-3 {
40
+ font-size: calc(100vw / 794 * 18.7) !important;
41
+ }
42
+
43
+ .sdoc-editor-container.fullscreen .sdoc-header-4 {
44
+ font-size: calc(100vw / 794 * 16) !important;
45
+ }
46
+
47
+ .sdoc-editor-container.fullscreen .sdoc-header-5,
48
+ .sdoc-editor-container.fullscreen .sdoc-header-6 {
49
+ font-size: calc(100vw / 794 * 14.7) !important;
50
+ }
51
+
1
52
  .sdoc-editor-container {
2
53
  flex: 1;
3
54
  display: flex;
@@ -9,6 +9,7 @@ exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _slate = require("@seafile/slate");
11
11
  var _deepCopy = _interopRequireDefault(require("deep-copy"));
12
+ var _isHotkey = _interopRequireDefault(require("is-hotkey"));
12
13
  var _context = _interopRequireDefault(require("../../context"));
13
14
  var _commonLoading = _interopRequireDefault(require("../../components/common-loading"));
14
15
  var _constants = require("../constants");
@@ -28,6 +29,7 @@ var _outlineModule = require("../../android/outline-module");
28
29
  var _jsBridge = _interopRequireDefault(require("../../android/js-bridge"));
29
30
  var _helpers = require("../extension/plugins/ai/ai-module/helpers");
30
31
  const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
32
+ var _ref3;
31
33
  let {
32
34
  editor: propsEditor,
33
35
  document,
@@ -36,6 +38,7 @@ const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
36
38
  isShowHeaderToolbar = true,
37
39
  showOutline = true
38
40
  } = _ref;
41
+ const [showFullScreen, setShowFullScreen] = (0, _react.useState)(false);
39
42
  const validEditor = (0, _react.useMemo)(() => {
40
43
  if (propsEditor) return propsEditor;
41
44
  const defaultEditor = (0, _extension.createDefaultEditor)();
@@ -131,6 +134,45 @@ const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
131
134
  // eslint-disable-next-line react-hooks/exhaustive-deps
132
135
  }, [onRefreshDocument]);
133
136
 
137
+ // Handle presentation fullscreen mode
138
+ const handleFullScreenPresentation = (0, _react.useCallback)(_ref2 => {
139
+ let {
140
+ isShowFullScreen
141
+ } = _ref2;
142
+ if (isShowFullScreen) {
143
+ setShowFullScreen(true);
144
+ }
145
+ }, []);
146
+ (0, _react.useEffect)(() => {
147
+ const eventBus = _basicSdk.EventBus.getInstance();
148
+ const unsubscribePresentationFullScreen = eventBus.subscribe(_constants2.EXTERNAL_EVENT.TOGGLE_PRESENTATION_MODE, handleFullScreenPresentation);
149
+ return () => {
150
+ unsubscribePresentationFullScreen();
151
+ };
152
+ }, [handleFullScreenPresentation]);
153
+ (0, _react.useEffect)(() => {
154
+ const handleExit = e => {
155
+ if ((0, _isHotkey.default)('esc', e)) {
156
+ e.preventDefault();
157
+ if (window.document.fullscreenElement) {
158
+ window.document.exitFullscreen();
159
+ }
160
+ }
161
+ };
162
+ const onFullscreenChange = () => {
163
+ if (!window.document.fullscreenElement) {
164
+ setShowFullScreen(false);
165
+ }
166
+ };
167
+ window.addEventListener('keydown', handleExit);
168
+ window.document.addEventListener('fullscreenchange', onFullscreenChange);
169
+ return () => {
170
+ window.removeEventListener('keydown', handleExit);
171
+ window.document.removeEventListener('fullscreenchange', onFullscreenChange);
172
+ };
173
+ // eslint-disable-next-line react-hooks/exhaustive-deps
174
+ }, []);
175
+
134
176
  // The parent component can call the method of this component through ref
135
177
  (0, _react.useImperativeHandle)(ref, () => ({
136
178
  setSlateValue: document => {
@@ -205,20 +247,27 @@ const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
205
247
  }
206
248
  const isShowComment = typeof showComment === 'boolean' ? showComment : true;
207
249
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_layout.EditorContainer, {
208
- editor: validEditor
209
- }, /*#__PURE__*/_react.default.createElement(_useColorContext.ColorProvider, null, isShowHeaderToolbar && /*#__PURE__*/_react.default.createElement(_extension.HeaderToolbar, {
250
+ editor: validEditor,
251
+ readonly: showFullScreen,
252
+ fullscreen: showFullScreen
253
+ }, /*#__PURE__*/_react.default.createElement(_useColorContext.ColorProvider, null, !showFullScreen && isShowHeaderToolbar && /*#__PURE__*/_react.default.createElement(_extension.HeaderToolbar, {
210
254
  editor: validEditor
211
255
  }), /*#__PURE__*/_react.default.createElement(_layout.EditorContent, {
212
256
  docValue: slateValue,
213
- showOutline: showOutline !== null && showOutline !== void 0 ? showOutline : true,
257
+ showOutline: (_ref3 = !showFullScreen && showOutline) !== null && _ref3 !== void 0 ? _ref3 : true,
258
+ readonly: showFullScreen,
214
259
  editor: validEditor,
215
- showComment: isShowComment
216
- }, /*#__PURE__*/_react.default.createElement(_editableArticle.default, {
260
+ showComment: !showFullScreen && isShowComment
261
+ }, showFullScreen ? /*#__PURE__*/_react.default.createElement(_readonlyArticle.default, {
262
+ editor: validEditor,
263
+ slateValue: slateValue,
264
+ showComment: false
265
+ }) : /*#__PURE__*/_react.default.createElement(_editableArticle.default, {
217
266
  editor: validEditor,
218
267
  slateValue: slateValue,
219
268
  updateSlateValue: onValueChange,
220
269
  showComment: isShowComment
221
- })))), /*#__PURE__*/_react.default.createElement(_insertElementDialog.default, {
270
+ })))), !showFullScreen && /*#__PURE__*/_react.default.createElement(_insertElementDialog.default, {
222
271
  editor: validEditor
223
272
  }));
224
273
  });
@@ -27,6 +27,7 @@ const MultiColumn = _ref => {
27
27
  } : {});
28
28
  const multiColumnContainerClassName = (0, _classnames.default)('sdoc-multicolumn-container', className);
29
29
  const [pageWidth, setPageWidth] = (0, _react.useState)((0, _helper.getCurrentPageWidth)(editor));
30
+ const readOnly = (0, _slateReact.useReadOnly)();
30
31
  const handleResizeColumn = newColumn => {
31
32
  (0, _helper.updateColumnWidth)(editor, element, newColumn);
32
33
  };
@@ -79,14 +80,12 @@ const MultiColumn = _ref => {
79
80
  style: style,
80
81
  ref: multiColumn,
81
82
  "data-id": element.id
82
- }, children, /*#__PURE__*/_react.default.createElement(_resizeHandlers.default, {
83
+ }, children, !readOnly && /*#__PURE__*/_react.default.createElement(_resizeHandlers.default, {
83
84
  element: element,
84
85
  handleResizeColumn: handleResizeColumn
85
86
  })));
86
87
  };
87
88
  function renderMultiColumn(props) {
88
- // When read only
89
-
90
89
  return /*#__PURE__*/_react.default.createElement(MultiColumn, props);
91
90
  }
92
91
  var _default = exports.default = renderMultiColumn;
@@ -68,7 +68,7 @@ const Column = _ref => {
68
68
  strikethrough = null
69
69
  } = element.children[0];
70
70
  const style = {
71
- margin: '0 10px',
71
+ margin: '0',
72
72
  border: '1px solid transparent',
73
73
  userSelect: 'none',
74
74
  display: 'inline-block',
@@ -27,6 +27,7 @@ const Video = _ref => {
27
27
  const videoName = (data === null || data === void 0 ? void 0 : data.name) || (data === null || data === void 0 ? void 0 : data.src);
28
28
  const videoSize = data === null || data === void 0 ? void 0 : data.size;
29
29
  const isEmbeddableLink = data === null || data === void 0 ? void 0 : data.is_embeddable_link;
30
+ const readonly = (0, _slateReact.useReadOnly)();
30
31
  const handlePlay = () => {
31
32
  setVideoStates(prev => ({
32
33
  ...prev,
@@ -98,6 +99,7 @@ const Video = _ref => {
98
99
  ref: videoRef,
99
100
  src: (0, _helpers.getVideoURL)(data),
100
101
  controls: true,
102
+ controlsList: readonly && 'nofullscreen',
101
103
  onClick: onClickVideo,
102
104
  draggable: false,
103
105
  onPlay: handlePlay,
@@ -17,11 +17,13 @@ require("../assets/css/dropdown-menu.css");
17
17
  const EditorContainer = _ref => {
18
18
  let {
19
19
  children,
20
- readonly
20
+ readonly,
21
+ fullscreen
21
22
  } = _ref;
22
23
  const className = (0, _classnames.default)('sdoc-editor-container', {
23
24
  'mobile': _utils.isMobile,
24
- 'readonly': readonly
25
+ 'readonly': readonly,
26
+ 'fullscreen': fullscreen
25
27
  });
26
28
  return /*#__PURE__*/_react.default.createElement("div", {
27
29
  className: className
@@ -14,6 +14,7 @@ var _moreOperations = _interopRequireDefault(require("./more-operations"));
14
14
  var _shareOperation = _interopRequireDefault(require("./share-operation"));
15
15
  var _pluginsOperations = _interopRequireDefault(require("./plugins-operations"));
16
16
  var _utils = require("../../utils");
17
+ var _presentationOperation = _interopRequireDefault(require("./presentation-operation"));
17
18
  require("./style.css");
18
19
  const DocOperations = _ref => {
19
20
  let {
@@ -43,6 +44,6 @@ const DocOperations = _ref => {
43
44
  handleViewChangesToggle: handleViewChangesToggle,
44
45
  handleRevisionMerged: handleRevisionMerged,
45
46
  handleRevisionPublished: handleRevisionPublished
46
- }), !isSdocRevision && /*#__PURE__*/_react.default.createElement(_pluginsOperations.default, null), !isSdocRevision && /*#__PURE__*/_react.default.createElement(_shareOperation.default, null), !isPublished && /*#__PURE__*/_react.default.createElement(_collaboratorsOperation.default, null), !isSdocRevision && /*#__PURE__*/_react.default.createElement(_moreOperations.default, null));
47
+ }), !isSdocRevision && /*#__PURE__*/_react.default.createElement(_presentationOperation.default, null), !isSdocRevision && /*#__PURE__*/_react.default.createElement(_pluginsOperations.default, null), !isSdocRevision && /*#__PURE__*/_react.default.createElement(_shareOperation.default, null), !isPublished && /*#__PURE__*/_react.default.createElement(_collaboratorsOperation.default, null), !isSdocRevision && /*#__PURE__*/_react.default.createElement(_moreOperations.default, null));
47
48
  };
48
49
  var _default = exports.default = (0, _reactI18next.withTranslation)('sdoc-editor')(DocOperations);
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _basicSdk = require("../../../basic-sdk");
10
+ var _constants = require("../../../constants");
11
+ const PresentationOperation = () => {
12
+ const onPresentationToggle = (0, _react.useCallback)(() => {
13
+ const eventBus = _basicSdk.EventBus.getInstance();
14
+ eventBus.dispatch(_constants.EXTERNAL_EVENT.TOGGLE_PRESENTATION_MODE, {
15
+ isShowFullScreen: true
16
+ });
17
+ const node = document.querySelector('.sdoc-editor-container');
18
+ if (node !== null && node !== void 0 && node.requestFullscreen) {
19
+ node.requestFullscreen().catch(err => console.error('Failed to enter fullscreen:', err));
20
+ }
21
+ }, []);
22
+ return /*#__PURE__*/_react.default.createElement("span", {
23
+ className: "op-item",
24
+ onClick: onPresentationToggle
25
+ }, /*#__PURE__*/_react.default.createElement("i", {
26
+ className: "sdocfont sdoc-presentation"
27
+ }));
28
+ };
29
+ var _default = exports.default = PresentationOperation;
@@ -38,6 +38,7 @@ const EXTERNAL_EVENT = exports.EXTERNAL_EVENT = {
38
38
  CREATE_WIKI_PAGE: 'create_wiki_page',
39
39
  ADD_VIDEO_LINK: 'add_video_link',
40
40
  CHANGE_HEADER_WIDTH: 'change_header_width',
41
+ TOGGLE_PRESENTATION_MODE: 'toggle_presentation_mode',
41
42
  // wiki
42
43
  INSERT_LINK: 'insert_link',
43
44
  // document
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "2.0.48",
3
+ "version": "2.0.50",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",
@@ -1,11 +1,11 @@
1
1
  @font-face {
2
2
  font-family: "sdocfont"; /* Project id 4097705 */
3
- src: url('iconfont.eot?t=1740817787686'); /* IE9 */
4
- src: url('iconfont.eot?t=1740817787686#iefix') format('embedded-opentype'), /* IE6-IE8 */
5
- url('iconfont.woff2?t=1740817787686') format('woff2'),
6
- url('iconfont.woff?t=1740817787686') format('woff'),
7
- url('iconfont.ttf?t=1740817787686') format('truetype'),
8
- url('iconfont.svg?t=1740817787686#sdocfont') format('svg');
3
+ src: url('iconfont.eot?t=1744104550669'); /* IE9 */
4
+ src: url('iconfont.eot?t=1744104550669#iefix') format('embedded-opentype'), /* IE6-IE8 */
5
+ url('iconfont.woff2?t=1744104550669') format('woff2'),
6
+ url('iconfont.woff?t=1744104550669') format('woff'),
7
+ url('iconfont.ttf?t=1744104550669') format('truetype'),
8
+ url('iconfont.svg?t=1744104550669#sdocfont') format('svg');
9
9
  }
10
10
 
11
11
  .sdocfont {
@@ -16,6 +16,14 @@
16
16
  -moz-osx-font-smoothing: grayscale;
17
17
  }
18
18
 
19
+ .sdoc-presentation:before {
20
+ content: "\e688";
21
+ }
22
+
23
+ .sdoc-close-presentation:before {
24
+ content: "\e689";
25
+ }
26
+
19
27
  .sdoc-seatable-row:before {
20
28
  content: "\e687";
21
29
  }
@@ -547,3 +555,4 @@
547
555
  .sdoc-user:before {
548
556
  content: "\e629";
549
557
  }
558
+
@@ -14,6 +14,10 @@
14
14
  />
15
15
  <missing-glyph />
16
16
 
17
+ <glyph glyph-name="sdoc-presentation" unicode="&#59016;" d="M128 96c-35.2 0-64 28.8-64 67.2V764.8h-16C22.4 764.8 0 787.2 0 816S22.4 864 48 864h928c25.6 0 48-22.4 48-48S1001.6 768 976 768H960v-601.6c0-35.2-28.8-67.2-64-67.2h-105.6c28.8-41.6 51.2-70.4 64-86.4 19.2-25.6 19.2-60.8-9.6-86.4-28.8-25.6-73.6-22.4-92.8 3.2s-118.4 166.4-121.6 169.6H384c-3.2-3.2-99.2-137.6-118.4-166.4s-64-32-86.4-12.8c-25.6 19.2-35.2 60.8-16 89.6 12.8 19.2 35.2 48 64 92.8L128 96zM160 768v-576h704V768H160zM409.6 656l268.8-163.2c9.6-6.4 9.6-22.4 0-28.8l-268.8-163.2c-9.6-6.4-25.6 0-25.6 12.8V643.2c0 12.8 12.8 19.2 25.6 12.8z" horiz-adv-x="1024" />
18
+
19
+ <glyph glyph-name="sdoc-close-presentation" unicode="&#59017;" d="M172.8 688c-188.8-185.6-188.8-489.6 0-675.2 188.8-185.6 492.8-185.6 678.4 0 188.8 185.6 188.8 489.6 0 675.2-12.8 16-35.2 19.2-54.4 16-19.2-6.4-35.2-19.2-41.6-41.6-6.4-19.2 0-41.6 16-54.4 144-144 144-374.4 0-515.2-144-144-374.4-144-518.4 0-144 140.8-144 371.2 0 515.2 12.8 12.8 19.2 35.2 16 54.4-6.4 19.2-22.4 35.2-41.6 38.4-19.2 6.4-41.6 0-54.4-12.8zM512 896c35.2 0 64-28.8 64-64v-384c0-35.2-28.8-64-64-64s-64 28.8-64 64V832c0 35.2 28.8 64 64 64z" horiz-adv-x="1024" />
20
+
17
21
  <glyph glyph-name="sdoc-seatable-row" unicode="&#59015;" d="M0 528L256 384l-256-144v288zM0 64h1024v-96H0v96z m320 368h704v-96H320v96zM0 800h1024v-96H0V800z" horiz-adv-x="1024" />
18
22
 
19
23
  <glyph glyph-name="sdoc-ask-ai" unicode="&#59013;" d="M678.4 896l92.8-252.8 252.8-92.8-252.8-92.8-92.8-252.8-92.8 252.8-252.8 92.8c166.4 60.8 252.8 92.8 252.8 92.8L678.4 896zM185.6 198.4L256 384l70.4-185.6L512 128l-185.6-70.4L256-128l-70.4 185.6L0 128z" horiz-adv-x="1024" />
@@ -1,14 +1,11 @@
1
1
  @font-face {
2
- font-family: "sdocfont";
3
- /* Project id 4097705 */
4
- src: url('./sdoc-editor-font/iconfont.eot?t=1740817787686');
5
- /* IE9 */
6
- src: url('./sdoc-editor-font/iconfont.eot?t=1740817787686#iefix') format('embedded-opentype'),
7
- /* IE6-IE8 */
8
- url('./sdoc-editor-font/iconfont.woff2?t=1740817787686') format('woff2'),
9
- url('./sdoc-editor-font/iconfont.woff?t=1740817787686') format('woff'),
10
- url('./sdoc-editor-font/iconfont.ttf?t=1740817787686') format('truetype'),
11
- url('./sdoc-editor-font/iconfont.svg?t=1740817787686#sdocfont') format('svg');
2
+ font-family: "sdocfont"; /* Project id 4097705 */
3
+ src: url('./sdoc-editor-font/iconfont.eot?t=1744104550669'); /* IE9 */
4
+ src: url('./sdoc-editor-font/iconfont.eot?t=1744104550669#iefix') format('embedded-opentype'), /* IE6-IE8 */
5
+ url('./sdoc-editor-font/iconfont.woff2?t=1744104550669') format('woff2'),
6
+ url('./sdoc-editor-font/iconfont.woff?t=1744104550669') format('woff'),
7
+ url('./sdoc-editor-font/iconfont.ttf?t=1744104550669') format('truetype'),
8
+ url('./sdoc-editor-font/iconfont.svg?t=1744104550669#sdocfont') format('svg');
12
9
  }
13
10
 
14
11
  .sdocfont {
@@ -19,6 +16,14 @@
19
16
  -moz-osx-font-smoothing: grayscale;
20
17
  }
21
18
 
19
+ .sdoc-presentation:before {
20
+ content: "\e688";
21
+ }
22
+
23
+ .sdoc-close-presentation:before {
24
+ content: "\e689";
25
+ }
26
+
22
27
  .sdoc-seatable-row:before {
23
28
  content: "\e687";
24
29
  }
@@ -550,3 +555,4 @@
550
555
  .sdoc-user:before {
551
556
  content: "\e629";
552
557
  }
558
+