@seafile/seafile-editor 2.0.12 → 2.0.14-test-0.0.1

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.
@@ -86,6 +86,12 @@ const MENUS_CONFIG_MAP = exports.MENUS_CONFIG_MAP = {
86
86
  text: 'Bold',
87
87
  type: BOLD
88
88
  },
89
+ [UNDERLINE]: {
90
+ id: `seafile_${UNDERLINE}`,
91
+ iconClass: 'iconfont icon-underline',
92
+ text: 'Underline',
93
+ type: UNDERLINE
94
+ },
89
95
  [CODE]: {
90
96
  id: `seafile_${CODE}`,
91
97
  iconClass: 'iconfont icon-code',
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.TABLE_ROW_NODE_NAME = exports.TABLE_MAX_ROWS = exports.TABLE_MAX_COLUMNS = exports.TABLE_ELEMENT_POSITION = exports.TABLE_ELEMENT = exports.TABLE_CELL_NODE_NAME = exports.TABLE_BODY_NODE_NAME = void 0;
6
+ exports.TABLE_ROW_NODE_NAME = exports.TABLE_MAX_ROWS = exports.TABLE_MAX_COLUMNS = exports.TABLE_ELEMENT_POSITION = exports.TABLE_ELEMENT = exports.TABLE_CELL_STYLE = exports.TABLE_CELL_NODE_NAME = exports.TABLE_BODY_NODE_NAME = exports.INHERIT_CELL_STYLE_WHEN_SELECT_SINGLE = exports.INHERIT_CELL_STYLE_WHEN_SELECT_MULTIPLE = exports.EMPTY_SELECTED_RANGE = void 0;
7
7
  const TABLE_CELL_NODE_NAME = exports.TABLE_CELL_NODE_NAME = 'td';
8
8
  const TABLE_ROW_NODE_NAME = exports.TABLE_ROW_NODE_NAME = 'tr';
9
9
  const TABLE_BODY_NODE_NAME = exports.TABLE_BODY_NODE_NAME = 'tbody';
@@ -18,4 +18,17 @@ const TABLE_ELEMENT = exports.TABLE_ELEMENT = {
18
18
  const TABLE_ELEMENT_POSITION = exports.TABLE_ELEMENT_POSITION = {
19
19
  AFTER: 'after',
20
20
  BEFORE: 'before'
21
- };
21
+ };
22
+ const EMPTY_SELECTED_RANGE = exports.EMPTY_SELECTED_RANGE = {
23
+ minRowIndex: -1,
24
+ maxRowIndex: -1,
25
+ minColIndex: -1,
26
+ maxColIndex: -1
27
+ };
28
+ const TABLE_CELL_STYLE = exports.TABLE_CELL_STYLE = {
29
+ TEXT_ALIGN: 'text_align',
30
+ BACKGROUND_COLOR: 'background_color',
31
+ ALIGN_ITEMS: 'align_items'
32
+ };
33
+ const INHERIT_CELL_STYLE_WHEN_SELECT_SINGLE = exports.INHERIT_CELL_STYLE_WHEN_SELECT_SINGLE = ['background_color'];
34
+ const INHERIT_CELL_STYLE_WHEN_SELECT_MULTIPLE = exports.INHERIT_CELL_STYLE_WHEN_SELECT_MULTIPLE = ['background_color', 'text_align'];
@@ -12,8 +12,16 @@ var _tableOperations = require("../table-operations");
12
12
  var _constants = require("../../../../constants");
13
13
  var _insertTableElement = _interopRequireDefault(require("./insert-table-element"));
14
14
  var _constant = require("../constant");
15
+ var _objectUtils = _interopRequireDefault(require("../../../../utils/object-utils"));
16
+ var _helper = require("../helper");
17
+ var _verticalAlignPopover = _interopRequireDefault(require("../menu/vertical-align-popover"));
18
+ var _core = require("../../../core");
19
+ var _elementTypes = require("../../../constants/element-types");
20
+ var _horizontalAlignPopover = _interopRequireDefault(require("../menu/horizontal-align-popover"));
21
+ var _eventTypes = require("../../../../constants/event-types");
15
22
  require("./style.css");
16
23
  const ContextMenu = _ref => {
24
+ var _tableCellNode$style, _tableCellNode$style2;
17
25
  let {
18
26
  element,
19
27
  position,
@@ -22,9 +30,26 @@ const ContextMenu = _ref => {
22
30
  } = _ref;
23
31
  const [contextMenuStyle, setContextMenuStyle] = (0, _react.useState)({});
24
32
  const contextMenuRef = (0, _react.useRef)(null);
33
+ const verticalAlignRef = (0, _react.useRef)(null);
34
+ const horizontalAlignRef = (0, _react.useRef)(null);
25
35
  const {
26
36
  t
27
37
  } = (0, _reactI18next.useTranslation)(_constants.TRANSLATE_NAMESPACE);
38
+ const {
39
+ tableSelectedRange
40
+ } = editor;
41
+ const enableCombineCell = !_objectUtils.default.isSameObject(tableSelectedRange, _constant.EMPTY_SELECTED_RANGE);
42
+ const enableSplitCell = !enableCombineCell;
43
+ const tableCellNode = (0, _core.getSelectedNodeByType)(editor, _elementTypes.TABLE_CELL);
44
+ const horizontalAlign = tableCellNode === null || tableCellNode === void 0 ? void 0 : (_tableCellNode$style = tableCellNode.style) === null || _tableCellNode$style === void 0 ? void 0 : _tableCellNode$style[_constant.TABLE_CELL_STYLE.TEXT_ALIGN];
45
+ const verticalAlign = tableCellNode === null || tableCellNode === void 0 ? void 0 : (_tableCellNode$style2 = tableCellNode.style) === null || _tableCellNode$style2 === void 0 ? void 0 : _tableCellNode$style2[(0, _helper.KebabToCamel)(_constant.TABLE_CELL_STYLE.ALIGN_ITEMS)];
46
+ const isMergedCell = () => {
47
+ const {
48
+ colspan,
49
+ rowspan
50
+ } = (0, _core.getSelectedNodeByType)(editor, _elementTypes.TABLE_CELL);
51
+ return colspan > 1 || rowspan > 1;
52
+ };
28
53
  const currentRowsCount = (0, _react.useMemo)(() => {
29
54
  const rows = element.children;
30
55
  return rows.length;
@@ -58,6 +83,17 @@ const ContextMenu = _ref => {
58
83
  (0, _tableOperations.insertTableElement)(editor, type, position, count);
59
84
  handleCloseContextMenu();
60
85
  };
86
+ const handleCombineCell = editor => {
87
+ console.log(2, editor);
88
+ (0, _helper.combineCells)(editor);
89
+ };
90
+ const toggleSplitCellSettingDialog = () => {
91
+ (void 0).eventBus.dispatch(_eventTypes.INTERNAL_EVENTS.INSERT_ELEMENT, {
92
+ type: _elementTypes.TABLE_CELL
93
+ });
94
+ };
95
+
96
+ // console.log(1, enableCombineCell, tableSelectedRange)
61
97
  return /*#__PURE__*/_react.default.createElement("div", {
62
98
  contentEditable: false,
63
99
  style: contextMenuStyle,
@@ -100,6 +136,37 @@ const ContextMenu = _ref => {
100
136
  }, t('Delete_column')), /*#__PURE__*/_react.default.createElement("button", {
101
137
  onMouseDown: () => handleClickOperationBtn(_tableOperations.removeTable),
102
138
  className: 'sf-context-menu-item sf-dropdown-menu-item'
103
- }, t('Delete_table'))));
139
+ }, t('Delete_table')), /*#__PURE__*/_react.default.createElement("div", {
140
+ className: 'sf-divider dropdown-divider'
141
+ }), /*#__PURE__*/_react.default.createElement("button", {
142
+ disabled: enableCombineCell,
143
+ onMouseDown: e => {
144
+ e.preventDefault();
145
+ handleCombineCell(editor);
146
+ },
147
+ className: 'sf-context-menu-item sf-dropdown-menu-item'
148
+ }, t('Combine_cell')), /*#__PURE__*/_react.default.createElement("button", {
149
+ className: "sf-context-menu-item sf-dropdown-menu-item",
150
+ disabled: !isMergedCell || !enableSplitCell,
151
+ onMouseDown: toggleSplitCellSettingDialog
152
+ }, t('Split_cell')), /*#__PURE__*/_react.default.createElement("button", {
153
+ ref: horizontalAlignRef,
154
+ className: "sf-context-menu-item sf-dropdown-menu-item side-extendable"
155
+ }, /*#__PURE__*/_react.default.createElement("span", null, t('Horizontal_align')), /*#__PURE__*/_react.default.createElement("i", {
156
+ className: "iconfont icon-right"
157
+ })), horizontalAlignRef.current && /*#__PURE__*/_react.default.createElement(_horizontalAlignPopover.default, {
158
+ target: horizontalAlignRef,
159
+ editor: editor,
160
+ horizontalAlign: horizontalAlign
161
+ }), /*#__PURE__*/_react.default.createElement("button", {
162
+ ref: verticalAlignRef,
163
+ className: "sf-context-menu-item sf-dropdown-menu-item side-extendable"
164
+ }, /*#__PURE__*/_react.default.createElement("span", null, t('Vertical_align')), /*#__PURE__*/_react.default.createElement("i", {
165
+ className: "iconfont icon-right"
166
+ })), verticalAlignRef.current && /*#__PURE__*/_react.default.createElement(_verticalAlignPopover.default, {
167
+ target: verticalAlignRef,
168
+ editor: editor,
169
+ verticalAlign: verticalAlign
170
+ })));
104
171
  };
105
172
  var _default = exports.default = ContextMenu;
@@ -68,3 +68,7 @@
68
68
  .sf-context-menu .sf-context-menu-item:disabled .insert-number-input {
69
69
  color: #adb5bd;
70
70
  }
71
+
72
+ /* .sf-context-menu-wrapper .dropdown-divider {
73
+ border: 1px solid #e9ecef;
74
+ } */
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.selectCellByGrid = exports.pasteContentIntoTable = exports.jumpOutTableInEditor = exports.isSelectingMultipleTables = exports.isInTable = exports.isDisabled = exports.insertTable = exports.getTableFocusingInfos = exports.getTableEntry = exports.getSelectedTableCells = exports.getSelectGrid = exports.getContextMenuPosition = void 0;
7
+ exports.setCellStyle = exports.selectCellByGrid = exports.pasteContentIntoTable = exports.jumpOutTableInEditor = exports.isSelectingMultipleTables = exports.isInTable = exports.isDisabled = exports.insertTable = exports.getTableFocusingInfos = exports.getTableEntry = exports.getSelectedTableCells = exports.getSelectedInfo = exports.getSelectGrid = exports.getContextMenuPosition = exports.generateInheritStyle = exports.combineCells = exports.KebabToCamel = void 0;
8
8
  var _slate = require("slate");
9
9
  var _slateReact = require("slate-react");
10
10
  var _isUrl = _interopRequireDefault(require("is-url"));
@@ -16,6 +16,9 @@ var _deserializeHtml = require("../../../utils/deserialize-html");
16
16
  var _common = require("../../../utils/common");
17
17
  var _helper = require("../link/helper");
18
18
  var _helper2 = require("../image/helper");
19
+ var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
20
+ var _objectUtils = _interopRequireDefault(require("../../../utils/object-utils"));
21
+ var _constant = require("./constant");
19
22
  const isDisabled = (editor, readonly) => {
20
23
  const {
21
24
  selection
@@ -329,4 +332,145 @@ const getContextMenuPosition = (event, tableRef) => {
329
332
  left
330
333
  };
331
334
  };
332
- exports.getContextMenuPosition = getContextMenuPosition;
335
+ exports.getContextMenuPosition = getContextMenuPosition;
336
+ const getSelectedInfo = editor => {
337
+ const currentTable = (0, _core.getSelectedNodeByType)(editor, _elementTypes.TABLE);
338
+ const currentRow = (0, _core.getSelectedNodeByType)(editor, _elementTypes.TABLE_ROW);
339
+ const currentCell = (0, _core.getSelectedNodeByType)(editor, _elementTypes.TABLE_CELL);
340
+ const currentCellPath = (0, _core.findPath)(editor, currentCell);
341
+ console.log(2, currentCellPath);
342
+ return {
343
+ table: currentTable,
344
+ tablePath: (0, _core.findPath)(editor, currentTable),
345
+ tableSize: [currentTable.children.length, currentRow.children.length],
346
+ row: currentRow,
347
+ rowPath: (0, _core.findPath)(editor, currentRow),
348
+ rowIndex: currentCellPath[currentCellPath.length - 2],
349
+ cell: currentCell,
350
+ cellPath: (0, _core.findPath)(editor, currentCell),
351
+ cellIndex: currentCellPath[currentCellPath.length - 1]
352
+ };
353
+ };
354
+ exports.getSelectedInfo = getSelectedInfo;
355
+ const combineCells = editor => {
356
+ const {
357
+ tablePath
358
+ } = getSelectedInfo(editor);
359
+ const {
360
+ minColIndex,
361
+ maxColIndex,
362
+ minRowIndex,
363
+ maxRowIndex
364
+ } = editor.tableSelectedRange;
365
+ let newCellContent = [];
366
+ for (let i = minRowIndex; i < maxRowIndex + 1; i++) {
367
+ for (let j = minColIndex; j < maxColIndex + 1; j++) {
368
+ let nodePath = [...tablePath, i, j];
369
+ let node = _slate.Editor.node(editor, nodePath);
370
+ if (node[0].is_combined) {
371
+ continue;
372
+ }
373
+ _slate.Transforms.setNodes(editor, {
374
+ 'is_combined': true
375
+ }, {
376
+ at: nodePath
377
+ });
378
+ newCellContent = newCellContent.concat(node[0].children);
379
+ }
380
+ }
381
+ console.log(minColIndex, maxColIndex, minRowIndex, maxRowIndex);
382
+ const targetCellPath = [...tablePath, minRowIndex, minColIndex];
383
+ const newCell = (0, _model.generateTableCell)(editor);
384
+ newCell.children = newCellContent;
385
+ newCell.rowspan = maxRowIndex - minRowIndex + 1;
386
+ newCell.colspan = maxColIndex - minColIndex + 1;
387
+ // keep row.children.length not changed
388
+ _slate.Transforms.removeNodes(editor, {
389
+ at: targetCellPath
390
+ });
391
+ _slate.Transforms.insertNodes(editor, newCell, {
392
+ at: targetCellPath
393
+ });
394
+ (0, _core.focusEditor)(editor, targetCellPath);
395
+
396
+ // for clicking the 'combine cell' icon in the toolbar
397
+ // const eventBus = EventBus.getInstance();
398
+ // eventBus.dispatch(INTERNAL_EVENT.CANCEL_TABLE_SELECT_RANGE);
399
+ };
400
+ exports.combineCells = combineCells;
401
+ const generateInheritStyle = (allowedInheritStyleList, style, cell) => {
402
+ const inheritStyle = {
403
+ ...cell['inherit_style']
404
+ } || {};
405
+ for (const key in style) {
406
+ if (Object.hasOwnProperty.call(style, key) && allowedInheritStyleList.includes(key)) {
407
+ inheritStyle[key] = style[key];
408
+ }
409
+ }
410
+ return inheritStyle;
411
+ };
412
+ exports.generateInheritStyle = generateInheritStyle;
413
+ const setCellStyle = (editor, style) => {
414
+ // Select single cell
415
+ if (_objectUtils.default.isSameObject(editor.tableSelectedRange, _constant.EMPTY_SELECTED_RANGE)) {
416
+ const selectedNodes = (0, _core.getSelectedElems)(editor);
417
+ let firstTableCellNodePath;
418
+ selectedNodes.forEach(node => {
419
+ if (node.type === _elementTypes.TABLE_CELL) {
420
+ const path = (0, _core.findPath)(editor, node);
421
+ if (path) {
422
+ firstTableCellNodePath = firstTableCellNodePath ? firstTableCellNodePath : path;
423
+ _slate.Transforms.setNodes(editor, {
424
+ style: {
425
+ ...node.style,
426
+ ...style
427
+ },
428
+ inherit_style: generateInheritStyle(_constant.INHERIT_CELL_STYLE_WHEN_SELECT_SINGLE, style, node)
429
+ }, {
430
+ at: path
431
+ });
432
+ }
433
+ }
434
+ });
435
+ if (firstTableCellNodePath) {
436
+ const start = _slate.Editor.start(editor, firstTableCellNodePath);
437
+ const end = _slate.Editor.end(editor, firstTableCellNodePath);
438
+ const newSelection = {
439
+ anchor: start,
440
+ focus: end
441
+ };
442
+ _slate.Transforms.select(editor, newSelection);
443
+ }
444
+ return;
445
+ }
446
+ // Select multiple cells
447
+ const {
448
+ minColIndex,
449
+ maxColIndex,
450
+ minRowIndex,
451
+ maxRowIndex
452
+ } = editor.tableSelectedRange;
453
+ const {
454
+ tablePath
455
+ } = getSelectedInfo(editor);
456
+ for (let i = minRowIndex; i <= maxRowIndex; i++) {
457
+ for (let j = minColIndex; j <= maxColIndex; j++) {
458
+ const path = [...tablePath, i, j];
459
+ const node = (0, _core.getNode)(editor, path);
460
+ _slate.Transforms.setNodes(editor, {
461
+ style: {
462
+ ...node.style,
463
+ ...style
464
+ },
465
+ inherit_style: generateInheritStyle(_constant.INHERIT_CELL_STYLE_WHEN_SELECT_MULTIPLE, style, node)
466
+ }, {
467
+ at: path
468
+ });
469
+ }
470
+ }
471
+ };
472
+ exports.setCellStyle = setCellStyle;
473
+ const KebabToCamel = str => {
474
+ return str.replace(/(_[a-z])/g, match => `${match.slice(1).toUpperCase()}`);
475
+ };
476
+ exports.KebabToCamel = KebabToCamel;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _reactI18next = require("react-i18next");
11
+ var _reactstrap = require("reactstrap");
12
+ var _classnames = _interopRequireDefault(require("classnames"));
13
+ var _helper = require("../../helper");
14
+ var _constant = require("../../constant");
15
+ var _core = require("../../../../core");
16
+ var _constants = require("../../../../../constants");
17
+ require("../vertical-align-popover/style.css");
18
+ const HorizontalAlignPopover = _ref => {
19
+ let {
20
+ target,
21
+ editor,
22
+ readonly,
23
+ horizontalAlign
24
+ } = _ref;
25
+ const {
26
+ t
27
+ } = (0, _reactI18next.useTranslation)(_constants.TRANSLATE_NAMESPACE);
28
+ const setTextAlignStyle = (0, _react.useCallback)(textAlign => {
29
+ if (readonly) return;
30
+ (0, _helper.setCellStyle)(editor, {
31
+ [_constant.TABLE_CELL_STYLE.TEXT_ALIGN]: textAlign
32
+ });
33
+ const focusPoint = editor.selection.focus;
34
+ // prevent select all text in the editor
35
+ (0, _core.focusEditor)(editor, focusPoint);
36
+ // Select last focus point
37
+ setTimeout(() => {
38
+ (0, _core.focusEditor)(editor, focusPoint);
39
+ }, 0);
40
+ }, [editor, readonly]);
41
+ return /*#__PURE__*/_react.default.createElement(_reactstrap.UncontrolledPopover, {
42
+ target: target.current,
43
+ trigger: "hover",
44
+ placement: "right-start",
45
+ hideArrow: true,
46
+ fade: false
47
+ }, /*#__PURE__*/_react.default.createElement("div", {
48
+ className: "sdoc-dropdown-menu sdoc-table-alignment-menu"
49
+ }, /*#__PURE__*/_react.default.createElement("div", {
50
+ className: "sdoc-dropdown-menu-item",
51
+ onMouseDown: () => setTextAlignStyle('left')
52
+ }, /*#__PURE__*/_react.default.createElement("div", {
53
+ className: "sdoc-checked"
54
+ }, /*#__PURE__*/_react.default.createElement("i", {
55
+ className: (0, _classnames.default)('iconfont icon-check-mark', {
56
+ active: !horizontalAlign || horizontalAlign === 'left'
57
+ })
58
+ })), /*#__PURE__*/_react.default.createElement("span", {
59
+ className: "active"
60
+ }, t('Left'))), /*#__PURE__*/_react.default.createElement("div", {
61
+ className: "sdoc-dropdown-menu-item",
62
+ onMouseDown: () => setTextAlignStyle('center')
63
+ }, /*#__PURE__*/_react.default.createElement("div", {
64
+ className: "sdoc-checked"
65
+ }, /*#__PURE__*/_react.default.createElement("i", {
66
+ className: (0, _classnames.default)('iconfont icon-check-mark', {
67
+ active: horizontalAlign === 'center'
68
+ })
69
+ })), /*#__PURE__*/_react.default.createElement("span", null, t('Center'))), /*#__PURE__*/_react.default.createElement("div", {
70
+ className: "sdoc-dropdown-menu-item",
71
+ onMouseDown: () => setTextAlignStyle('right')
72
+ }, /*#__PURE__*/_react.default.createElement("div", {
73
+ className: "sdoc-checked"
74
+ }, /*#__PURE__*/_react.default.createElement("i", {
75
+ className: (0, _classnames.default)('iconfont icon-check-mark', {
76
+ active: horizontalAlign === 'right'
77
+ })
78
+ })), /*#__PURE__*/_react.default.createElement("span", null, t('Right')))));
79
+ };
80
+ var _default = exports.default = HorizontalAlignPopover;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _reactI18next = require("react-i18next");
11
+ var _reactstrap = require("reactstrap");
12
+ var _classnames = _interopRequireDefault(require("classnames"));
13
+ var _helper = require("../../helper");
14
+ var _constant = require("../../constant");
15
+ var _core = require("../../../../core");
16
+ var _constants = require("../../../../../constants");
17
+ require("./style.css");
18
+ const VerticalAlignPopover = _ref => {
19
+ let {
20
+ target,
21
+ editor,
22
+ readonly,
23
+ verticalAlign
24
+ } = _ref;
25
+ const {
26
+ t
27
+ } = (0, _reactI18next.useTranslation)(_constants.TRANSLATE_NAMESPACE);
28
+ const setVerticalAlignStyle = (0, _react.useCallback)(position => {
29
+ if (readonly) return;
30
+ const alignItems = (0, _helper.KebabToCamel)(_constant.TABLE_CELL_STYLE.ALIGN_ITEMS);
31
+ (0, _helper.setCellStyle)(editor, {
32
+ [alignItems]: position
33
+ });
34
+ const focusPoint = editor.selection.focus;
35
+ // prevent select all text in the editor
36
+ (0, _core.focusEditor)(editor, focusPoint);
37
+ // Select last focus point
38
+ setTimeout(() => {
39
+ (0, _core.focusEditor)(editor, focusPoint);
40
+ }, 0);
41
+ }, [editor, readonly]);
42
+ return /*#__PURE__*/_react.default.createElement(_reactstrap.UncontrolledPopover, {
43
+ target: target.current,
44
+ trigger: "hover",
45
+ placement: "right-start",
46
+ hideArrow: true,
47
+ fade: false
48
+ }, /*#__PURE__*/_react.default.createElement("div", {
49
+ className: "sdoc-dropdown-menu sdoc-table-alignment-menu"
50
+ }, /*#__PURE__*/_react.default.createElement("div", {
51
+ className: "sdoc-dropdown-menu-item",
52
+ onMouseDown: () => setVerticalAlignStyle('flex-start')
53
+ }, /*#__PURE__*/_react.default.createElement("div", {
54
+ className: "sdoc-checked"
55
+ }, /*#__PURE__*/_react.default.createElement("i", {
56
+ className: (0, _classnames.default)('iconfont icon-check-mark', {
57
+ active: !verticalAlign || verticalAlign === 'flex-start'
58
+ })
59
+ })), /*#__PURE__*/_react.default.createElement("span", {
60
+ className: "active"
61
+ }, t('Top_align'))), /*#__PURE__*/_react.default.createElement("div", {
62
+ className: "sdoc-dropdown-menu-item",
63
+ onMouseDown: () => setVerticalAlignStyle('center')
64
+ }, /*#__PURE__*/_react.default.createElement("div", {
65
+ className: "sdoc-checked"
66
+ }, /*#__PURE__*/_react.default.createElement("i", {
67
+ className: (0, _classnames.default)('iconfont icon-check-mark', {
68
+ active: verticalAlign === 'center'
69
+ })
70
+ })), /*#__PURE__*/_react.default.createElement("span", null, t('Center_align'))), /*#__PURE__*/_react.default.createElement("div", {
71
+ className: "sdoc-dropdown-menu-item",
72
+ onMouseDown: () => setVerticalAlignStyle('flex-end')
73
+ }, /*#__PURE__*/_react.default.createElement("div", {
74
+ className: "sdoc-checked"
75
+ }, /*#__PURE__*/_react.default.createElement("i", {
76
+ className: (0, _classnames.default)('iconfont icon-check-mark', {
77
+ active: verticalAlign === 'flex-end'
78
+ })
79
+ })), /*#__PURE__*/_react.default.createElement("span", null, t('Bottom_align')))));
80
+ };
81
+ var _default = exports.default = VerticalAlignPopover;
@@ -0,0 +1,24 @@
1
+ .sdoc-context-menu .sdoc-dropdown-menu {
2
+ display: flex;
3
+ flex-direction: column;
4
+ }
5
+
6
+ .sdoc-table-alignment-menu .sdoc-dropdown-menu-item {
7
+ padding: 4px 10px !important;
8
+ }
9
+
10
+ .sdoc-table-alignment-menu .sdoc-dropdown-menu-item .sdoc-checked {
11
+ margin-right: 6px;
12
+ height: 21px;
13
+ line-height: 21px;
14
+ width: 12px;
15
+ }
16
+
17
+ .sdoc-table-alignment-menu .sdoc-dropdown-menu-item .icon-check-mark {
18
+ display: none;
19
+ font-size: 12px !important;
20
+ }
21
+
22
+ .sdoc-table-alignment-menu .sdoc-dropdown-menu-item .icon-check-mark.active {
23
+ display: inline;
24
+ }
@@ -16,6 +16,7 @@ var _getEventTransfer = _interopRequireDefault(require("../../../containers/cust
16
16
  var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
17
17
  var _eventTypes = require("../../../constants/event-types");
18
18
  var _core = require("../../core");
19
+ var _constant = require("./constant");
19
20
  /**
20
21
  * @param {Editor} editor
21
22
  */
@@ -32,6 +33,7 @@ const withTable = editor => {
32
33
  normalizeNode
33
34
  } = editor;
34
35
  const newEditor = editor;
36
+ newEditor.tableSelectedRange = _constant.EMPTY_SELECTED_RANGE;
35
37
  newEditor.insertBreak = () => {
36
38
  const isTableActive = (0, _helper.isInTable)(newEditor);
37
39
  if (!editor.selection || !isTableActive) return insertBreak && insertBreak();
@@ -17,19 +17,14 @@ var _menu2 = _interopRequireDefault(require("../../plugins/header/menu"));
17
17
  var _menu3 = _interopRequireDefault(require("../../plugins/text-style/menu"));
18
18
  var _menu4 = _interopRequireDefault(require("../../plugins/link/menu"));
19
19
  var _constants = require("../../constants");
20
- var _menu5 = _interopRequireDefault(require("../../plugins/image/menu"));
21
- var _menu6 = _interopRequireDefault(require("../../plugins/code-block/menu"));
22
- var _menu7 = _interopRequireDefault(require("../../plugins/check-list/menu"));
23
- var _menu8 = _interopRequireDefault(require("../../plugins/list/menu"));
20
+ var _menu5 = _interopRequireDefault(require("../../plugins/check-list/menu"));
21
+ var _menu6 = _interopRequireDefault(require("../../plugins/list/menu"));
24
22
  var _elementTypes = require("../../constants/element-types");
25
- var _menu9 = _interopRequireDefault(require("../../plugins/table/menu"));
26
- var _tableOperator = require("../../plugins/table/menu/table-operator");
27
23
  var _helper = require("../../plugins/table/helper");
28
- var _menu10 = _interopRequireDefault(require("../../plugins/formula/menu"));
29
- var _menu11 = _interopRequireDefault(require("../../plugins/clear-format/menu"));
24
+ var _menu7 = _interopRequireDefault(require("../../plugins/clear-format/menu"));
30
25
  var _shortcutDialog = _interopRequireDefault(require("../user-help/shortcut-dialog"));
31
- var _menu12 = _interopRequireDefault(require("../../plugins/column/menu"));
32
26
  var _insertElementDialog = _interopRequireDefault(require("../../commons/insert-element-dialog"));
27
+ var _insertToolbar = _interopRequireDefault(require("./insert-toolbar"));
33
28
  require("./style.css");
34
29
  const Toolbar = _ref => {
35
30
  let {
@@ -42,14 +37,6 @@ const Toolbar = _ref => {
42
37
  } = _ref;
43
38
  (0, _useSelectionUpdate.default)();
44
39
  const [isShowArticleInfo, setIsShowArticleInfo] = (0, _react.useState)(false);
45
- // eslint-disable-next-line react-hooks/exhaustive-deps
46
- const isShowSubTableMenu = (0, _react.useMemo)(() => (0, _helper.isInTable)(editor), [editor.selection]);
47
- const updateArticleInfoState = (0, _react.useCallback)(() => {
48
- const newState = !isShowArticleInfo;
49
- setIsShowArticleInfo(newState);
50
- const eventBus = _eventBus.default.getInstance();
51
- eventBus.dispatch(_eventTypes.INTERNAL_EVENTS.ON_ARTICLE_INFO_TOGGLE, newState);
52
- }, [isShowArticleInfo]);
53
40
  const onHelpInfoToggle = (0, _react.useCallback)(state => {
54
41
  if (state) setIsShowArticleInfo(false);
55
42
  }, []);
@@ -66,10 +53,6 @@ const Toolbar = _ref => {
66
53
  const onHelpIconToggle = (0, _react.useCallback)(() => {
67
54
  setIsShowHelpModal(!isShowHelpModal);
68
55
  }, [isShowHelpModal]);
69
- const sideIconClass = (0, _classnames.default)('iconfont', {
70
- 'icon-angle-double-left': !isShowArticleInfo,
71
- 'icon-angle-double-right': isShowArticleInfo
72
- });
73
56
  const commonProps = {
74
57
  editor,
75
58
  readonly,
@@ -77,21 +60,22 @@ const Toolbar = _ref => {
77
60
  };
78
61
  return /*#__PURE__*/_react.default.createElement("div", {
79
62
  className: "sf-slate-editor-toolbar"
80
- }, isRichEditor && /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu2.default, commonProps)), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu3.default, Object.assign({}, commonProps, {
63
+ }, isRichEditor && /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_insertToolbar.default, {
64
+ editor: editor,
65
+ readonly: readonly
66
+ })), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu2.default, commonProps)), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu3.default, Object.assign({}, commonProps, {
67
+ type: _constants.TEXT_STYLE_MAP.ITALIC
68
+ })), /*#__PURE__*/_react.default.createElement(_menu3.default, Object.assign({}, commonProps, {
81
69
  type: _constants.TEXT_STYLE_MAP.BOLD
82
70
  })), /*#__PURE__*/_react.default.createElement(_menu3.default, Object.assign({}, commonProps, {
83
- type: _constants.TEXT_STYLE_MAP.ITALIC
71
+ type: _constants.TEXT_STYLE_MAP.UNDERLINE
84
72
  })), /*#__PURE__*/_react.default.createElement(_menu3.default, Object.assign({}, commonProps, {
85
73
  type: _constants.TEXT_STYLE_MAP.CODE
86
- })), /*#__PURE__*/_react.default.createElement(_menu4.default, commonProps)), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu.default, commonProps), /*#__PURE__*/_react.default.createElement(_menu7.default, commonProps), /*#__PURE__*/_react.default.createElement(_menu8.default, Object.assign({}, commonProps, {
87
- type: _elementTypes.ORDERED_LIST
88
- })), /*#__PURE__*/_react.default.createElement(_menu8.default, Object.assign({}, commonProps, {
74
+ })), /*#__PURE__*/_react.default.createElement(_menu4.default, commonProps)), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu.default, commonProps), /*#__PURE__*/_react.default.createElement(_menu5.default, commonProps), /*#__PURE__*/_react.default.createElement(_menu6.default, Object.assign({}, commonProps, {
89
75
  type: _elementTypes.UNORDERED_LIST
90
- }))), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu6.default, commonProps), /*#__PURE__*/_react.default.createElement(_menu9.default, commonProps), /*#__PURE__*/_react.default.createElement(_menu5.default, Object.assign({}, commonProps, {
91
- isSupportInsertSeafileImage: isSupportInsertSeafileImage
92
- })), isSupportFormula && /*#__PURE__*/_react.default.createElement(_menu10.default, commonProps), isSupportColumn && /*#__PURE__*/_react.default.createElement(_menu12.default, commonProps)), isShowSubTableMenu && /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, {
93
- className: "sf-menu-group sf-table-operations-group"
94
- }, /*#__PURE__*/_react.default.createElement(_tableOperator.AlignmentDropDown, commonProps), /*#__PURE__*/_react.default.createElement(_tableOperator.ColumnOperationDropDownList, commonProps), /*#__PURE__*/_react.default.createElement(_tableOperator.RowOperationDropDownList, commonProps), /*#__PURE__*/_react.default.createElement(_tableOperator.RemoveTableMenu, commonProps)), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu11.default, commonProps)), !isRichEditor && /*#__PURE__*/_react.default.createElement("div", {
76
+ })), /*#__PURE__*/_react.default.createElement(_menu6.default, Object.assign({}, commonProps, {
77
+ type: _elementTypes.ORDERED_LIST
78
+ }))), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu7.default, commonProps)), !isRichEditor && /*#__PURE__*/_react.default.createElement("div", {
95
79
  className: "sf-slate-help-info-control",
96
80
  onClick: onHelpIconToggle
97
81
  }, /*#__PURE__*/_react.default.createElement("span", {
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _reactI18next = require("react-i18next");
11
+ var _reactstrap = require("reactstrap");
12
+ var _classnames = _interopRequireDefault(require("classnames"));
13
+ var _tooltip = _interopRequireDefault(require("../../../commons/tooltip"));
14
+ var _menu = _interopRequireDefault(require("../../../plugins/image/menu"));
15
+ var _menu2 = _interopRequireDefault(require("../../../plugins/table/menu"));
16
+ var _menu3 = _interopRequireDefault(require("../../../plugins/code-block/menu"));
17
+ require("./style.css");
18
+ // import Tooltip from '../../../../components/tooltip';
19
+ // import EventBus from '../../../../utils/event-bus';
20
+ // import CodeBlockMenu from '../../../plugins/code-block/menu';
21
+ // import FileLinkMenu from '../../../plugins/file-link/menu';
22
+ // import ImageMenu from '../../../plugins/image/menu';
23
+ // import LinkMenu from '../../../plugins/link/menu';
24
+ // import SdocLinkMenu from '../../../plugins/sdoc-link/menu';
25
+ // import TableMenu from '../../../plugins/table/menu/table-menu';
26
+ // import VideoMenu from '../../../plugins/video/menu';
27
+
28
+ const InsertToolbar = _ref => {
29
+ let {
30
+ isRichEditor = true,
31
+ className = 'menu-group-item',
32
+ editor,
33
+ readonly
34
+ } = _ref;
35
+ const [isShowMenu, setMenuShow] = (0, _react.useState)(false);
36
+ const {
37
+ t
38
+ } = (0, _reactI18next.useTranslation)('sdoc-editor');
39
+ const popoverRef = (0, _react.useRef)(null);
40
+ const disabled = readonly;
41
+ const insertButtonRef = (0, _react.useRef)(null);
42
+ const insertToolbarId = 'sdoc-insert-toolbar-btn';
43
+
44
+ // const eventBus = useMemo(() => {
45
+ // return EventBus.getInstance();
46
+ // }, []);
47
+
48
+ const toggle = (0, _react.useCallback)(event => {
49
+ var _event$target;
50
+ if (event !== null && event !== void 0 && event.target && (event === null || event === void 0 ? void 0 : (_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.tagName) === 'INPUT') {
51
+ return;
52
+ }
53
+ popoverRef.current && popoverRef.current.toggle();
54
+ setMenuShow(!isShowMenu);
55
+ // eslint-disable-next-line react-hooks/exhaustive-deps
56
+ }, [isShowMenu]);
57
+ const validClassName = (0, _classnames.default)(className, 'sdoc-menu-with-dropdown sdoc-insert-toolbar-btn', {
58
+ 'menu-show': isShowMenu,
59
+ 'disabled': disabled,
60
+ 'rich-icon-btn d-flex': isRichEditor,
61
+ 'rich-icon-btn-disabled': isRichEditor && disabled,
62
+ 'rich-icon-btn-hover': isRichEditor && !disabled,
63
+ 'btn btn-icon btn-secondary btn-active d-flex': !isRichEditor
64
+ });
65
+ const caretIconClass = `sdoc-menu-with-dropdown-triangle-icon sdocfont sdoc-${isShowMenu ? 'caret-up' : 'drop-down'}`;
66
+ const {
67
+ bottom
68
+ } = insertButtonRef.current ? insertButtonRef.current.getBoundingClientRect() : {
69
+ bottom: 92.5
70
+ };
71
+ const props = {
72
+ // eventBus,
73
+ editor,
74
+ readonly,
75
+ toggle
76
+ };
77
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("button", {
78
+ type: "button",
79
+ className: validClassName,
80
+ id: insertToolbarId,
81
+ disabled: disabled,
82
+ ref: insertButtonRef
83
+ }, /*#__PURE__*/_react.default.createElement("div", {
84
+ className: "sdoc-menu-with-dropdown-icon"
85
+ }, /*#__PURE__*/_react.default.createElement("i", {
86
+ className: "sdocfont sdoc-insert mr-1"
87
+ }), /*#__PURE__*/_react.default.createElement("span", {
88
+ className: "text-truncate"
89
+ }, t('Insert'))), /*#__PURE__*/_react.default.createElement("div", {
90
+ className: "sdoc-menu-with-dropdown-triangle"
91
+ }, /*#__PURE__*/_react.default.createElement("span", {
92
+ className: caretIconClass
93
+ }))), /*#__PURE__*/_react.default.createElement(_tooltip.default, {
94
+ target: insertToolbarId
95
+ }, t('Insert')), !disabled && /*#__PURE__*/_react.default.createElement(_reactstrap.UncontrolledPopover, {
96
+ target: insertToolbarId,
97
+ className: "sdoc-menu-popover sdoc-dropdown-menu sdoc-insert-menu-popover",
98
+ trigger: "legacy",
99
+ placement: "bottom-start",
100
+ hideArrow: true,
101
+ toggle: toggle,
102
+ fade: false,
103
+ ref: popoverRef
104
+ }, /*#__PURE__*/_react.default.createElement("div", {
105
+ className: "sdoc-insert-menu-container sdoc-dropdown-menu-container",
106
+ style: {
107
+ maxHeight: window.innerHeight - bottom - 100
108
+ }
109
+ }, /*#__PURE__*/_react.default.createElement(_menu.default, props), /*#__PURE__*/_react.default.createElement(_menu2.default, props), /*#__PURE__*/_react.default.createElement(_menu3.default, props))));
110
+ };
111
+ var _default = exports.default = InsertToolbar;
@@ -0,0 +1,28 @@
1
+ .menu-group .menu-group-item.sdoc-insert-toolbar-btn {
2
+ width: 76px;
3
+ display: flex;
4
+ align-items: center;
5
+ justify-content: space-between;
6
+ }
7
+
8
+ .menu-group .menu-group-item.sdoc-insert-toolbar-btn.disabled {
9
+ /* 64: 76 - 12 */
10
+ width: 64px !important;
11
+ color: #BDBDBD;
12
+ }
13
+
14
+ .menu-group .sdoc-insert-toolbar-btn .sdoc-menu-with-dropdown-icon {
15
+ flex: 1;
16
+ justify-content: flex-start;
17
+ padding-left: 6px;
18
+ padding-right: 2px;
19
+ font-size: 14px;
20
+ }
21
+
22
+ .sdoc-insert-menu-popover .popover {
23
+ min-width: 200px;
24
+ }
25
+
26
+ .sdoc-insert-menu-popover .sdoc-insert-menu-container {
27
+ padding: 8px 0;
28
+ }
@@ -39,9 +39,6 @@ const InlineToolbar = _ref => {
39
39
  onExpandEditorToggle
40
40
  } = _ref;
41
41
  (0, _useSelectionUpdate.default)();
42
-
43
- // eslint-disable-next-line react-hooks/exhaustive-deps
44
- const isShowSubTableMenu = (0, _react.useMemo)(() => (0, _helper.isInTable)(editor), [editor.selection]);
45
42
  const [isShowHelpModal, setIsShowHelpModal] = (0, _react.useState)(false);
46
43
  const onHelpIconToggle = (0, _react.useCallback)(() => {
47
44
  setIsShowHelpModal(!isShowHelpModal);
@@ -65,9 +62,7 @@ const InlineToolbar = _ref => {
65
62
  type: _elementTypes.UNORDERED_LIST
66
63
  }))), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu6.default, commonProps), /*#__PURE__*/_react.default.createElement(_commons.MoreMenu, commonProps, /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu5.default, Object.assign({}, commonProps, {
67
64
  isSupportInsertSeafileImage: isSupportInsertSeafileImage
68
- }))), isShowSubTableMenu && /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, {
69
- className: "sf-menu-group sf-table-operations-group"
70
- }, /*#__PURE__*/_react.default.createElement(_tableOperator.AlignmentDropDown, commonProps), /*#__PURE__*/_react.default.createElement(_tableOperator.ColumnOperationDropDownList, commonProps), /*#__PURE__*/_react.default.createElement(_tableOperator.RowOperationDropDownList, commonProps), /*#__PURE__*/_react.default.createElement(_tableOperator.RemoveTableMenu, commonProps)), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu9.default, commonProps)), !isRichEditor && /*#__PURE__*/_react.default.createElement("div", {
65
+ }))), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu9.default, commonProps)), !isRichEditor && /*#__PURE__*/_react.default.createElement("div", {
71
66
  className: "sf-slate-help-info-control",
72
67
  onClick: onHelpIconToggle
73
68
  }, /*#__PURE__*/_react.default.createElement("span", {
@@ -60,8 +60,9 @@
60
60
  justify-content: center;
61
61
  border-radius: 3px;
62
62
  color: #666;
63
- font-size: 14px;
63
+ font-size: 16px;
64
64
  cursor: pointer;
65
+ opacity: 1;
65
66
  }
66
67
 
67
68
  .longtext-header-container .longtext-header-tool-item.long-text-full-screen {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/seafile-editor",
3
- "version": "2.0.12",
3
+ "version": "2.0.14-test-0.0.1",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -36,7 +36,7 @@
36
36
  "babel-plugin-import": "^1.13.6",
37
37
  "babel-preset-react-app": "^10.0.1",
38
38
  "clean-webpack-plugin": "4.0.0",
39
- "css-loader": "6.8.1",
39
+ "css-loader": "^6.11.0",
40
40
  "css-minimizer-webpack-plugin": "5.0.1",
41
41
  "ejs": "3.1.10",
42
42
  "eslint": "8.49.0",
@@ -65,7 +65,7 @@
65
65
  "react-router": "6.16.0",
66
66
  "react-router-dom": "6.16.0",
67
67
  "seafile-js": "0.2.234",
68
- "style-loader": "3.3.3",
68
+ "style-loader": "^3.3.4",
69
69
  "terser-webpack-plugin": "5.3.9",
70
70
  "url-loader": "4.1.1",
71
71
  "webpack": "5.98.0",
@@ -0,0 +1,234 @@
1
+ {
2
+ "Bold": "粗体",
3
+ "Italic": "斜体",
4
+ "Inline_code": "代码",
5
+ "Header_one": "一级标题",
6
+ "Header_two": "二级标题",
7
+ "Header_three": "三级标题",
8
+ "Header_four": "四级标题",
9
+ "Header_five": "五级标题",
10
+ "Header_six": "六级标题",
11
+ "Paragraph": "段落",
12
+ "Quote": "引用",
13
+ "Ordered_list": "有序列表",
14
+ "Unordered_list": "无序列表",
15
+ "Check_list_item": "任务列表",
16
+ "Insert_image": "插入图片",
17
+ "Insert_formula": "插入公式",
18
+ "Formula": "公式",
19
+ "Insert_file": "插入文件",
20
+ "Code": "行内代码",
21
+ "Code_block": "代码块",
22
+ "Insert_link": "添加链接",
23
+ "Insert_table": "添加表格",
24
+ "Save": "保存",
25
+ "More": "更多",
26
+ "Invalid_url": "无效链接",
27
+ "Link_address": "链接地址",
28
+ "Image_address": "图片地址",
29
+ "Submit": "提交",
30
+ "Cancel": "取消",
31
+ "Switch_to_plain_text_editor": "切换至普通文本编辑器",
32
+ "Switch_to_rich_text_editor": "切换至富文本编辑器",
33
+ "Switch_to_viewer": "切换到只读模式",
34
+ "Help": "帮助",
35
+ "Delete_table": "删除表格",
36
+ "Column": "列",
37
+ "Row": "行",
38
+ "Insert_row_before": "上方插入行",
39
+ "Insert_row_after": "下方插入行",
40
+ "Insert_column_before": "左边插入列",
41
+ "Insert_column_after": "右边插入列",
42
+ "Delete_row": "删除当前行",
43
+ "Delete_column": "删除当前列",
44
+ "Insert_row": "插入行",
45
+ "Insert_column": "插入列",
46
+ "Set_align": "对齐方式",
47
+ "Left": "左对齐",
48
+ "Center": "居中",
49
+ "Right": "右对齐",
50
+ "File_saved": "保存文件成功",
51
+ "File_failed_to_save": "保存文件失败",
52
+ "Star": "添加星标",
53
+ "Unstar": "移除星标",
54
+ "Back_to_parent_directory": "返回上级目录",
55
+ "Edit": "编辑",
56
+ "Copy": "复制",
57
+ "Copied": "已复制",
58
+ "Internal_link": "内部链接",
59
+ "Copy_internal_link": "内部链接已复制到剪贴板",
60
+ "Internal_link_desc": "内部链接是指向文件或目录的链接,只有对该文件或目录有访问权限的人可以访问。",
61
+ "Share": "共享",
62
+ "Share_link": "共享链接",
63
+ "Generate": "生成链接",
64
+ "Add_password_protection": "增加密码保护",
65
+ "Password": "密码",
66
+ "At_least_8_characters": "至少8个字符",
67
+ "Password_again": "请再次输入密码",
68
+ "Add_auto_expiration": "增加自动过期",
69
+ "Days": "天",
70
+ "Please_enter_password": "请输入密码",
71
+ "Greater_than_or_equal_to": "大于或等于",
72
+ "Less_than_or_equal_to": "小于或等于",
73
+ "Set_permission": "设置权限",
74
+ "Preview_and_download": "预览与下载",
75
+ "Preview_only": "仅查看",
76
+ "Please_enter_valid_days": "请输入有效的天数",
77
+ "Please_enter_a_non-negative_integer": "请输入一个非负整数",
78
+ "Please_enter_days": "请输入天数",
79
+ "Password_is_too_short": "密码长度太短",
80
+ "Passwords_do_not_match": "两次输入的密码不一致",
81
+ "Return_to_wiki_page": "返回维基页面",
82
+ "Insert_network_image": "插入网络图片",
83
+ "Upload_local_image": "上传本地图片",
84
+ "Add_link": "加入链接",
85
+ "File_history": "文件历史",
86
+ "History_version": "历史版本",
87
+ "Back_to_viewer": "返回查看页面",
88
+ "Link_title": "链接标题",
89
+ "Local_draft": "本地草稿",
90
+ "Use_draft": "使用草稿",
91
+ "Delete_draft": "删除草稿",
92
+ "You_have_an_unsaved_draft_do_you_like_to_use_it": "有未保存的草稿,使用草稿吗?",
93
+ "Local_draft_saved": "本地草稿已保存",
94
+ "New_draft": "创建草稿",
95
+ "View_draft": "查看草稿",
96
+ "Publish": "发布",
97
+ "This_file_has_a_draft": "这个文件有一个草稿.",
98
+ "Delete": "删除",
99
+ "Comments": "评论",
100
+ "Add_a_comment": "增加评论",
101
+ "No_comment_yet": "还没有评论",
102
+ "Mark_as_resolved": "标记为已解决",
103
+ "Ask_for_review": "发起评审",
104
+ "Review_already_exists": "评审已存在",
105
+ "View_review": "查看评审",
106
+ "There_is_an_associated_review_with_this_file": "有一个与此文件相关联的评审。",
107
+ "Start_review": "开始评审",
108
+ "This_file_is_in_draft_stage": "该文件处于草稿阶段。",
109
+ "This_file_is_in_review_stage": "该文件处于评审阶段。",
110
+ "This_file_has_been_updated": "这个文件已被修改。",
111
+ "Refresh": "刷新",
112
+ "Related_files": "相关文件",
113
+ "Related_file": "相关文件",
114
+ "No_tags": "没有标签",
115
+ "Date": "日期",
116
+ "Participants": "参与人",
117
+ "Meeting_note": "会议记录",
118
+ "Chooser_document_type": "选择文档类型",
119
+ "Empty": "暂无",
120
+ "No_related_files": "没有相关文件",
121
+ "Outline": "目录",
122
+ "No_outline": "没有大纲",
123
+ "Editing_files_in_this_browser_can_lead_to_slight_display_problems": "在此浏览器中,编辑文件可能导致轻微的显示问题。",
124
+ "No_document_improvement_suggestion": "没有文档改进建议",
125
+ "Hide_side_panel": "隐藏侧旁栏",
126
+ "Show_side_panel": "显示侧旁栏",
127
+ "Show_resolved_comments": "显示已解决的评论",
128
+ "Update": "更新",
129
+ "Width": "宽度",
130
+ "Height": "高度",
131
+ "Full_screen": "全屏",
132
+ "Insert_library_image": "插入资料库图片",
133
+ "Size": "大小",
134
+ "Location": "位置",
135
+ "Last_update": "更新时间",
136
+ "Tags": "标签",
137
+ "Add_participants": "添加参与人",
138
+ "Clear_format": "清除格式",
139
+ "Image_address_invalid": "图片地址不正确",
140
+ "Shortcut_help": "快捷键帮助",
141
+ "Link_address_required": "链接地址是必填项。",
142
+ "Link_address_invalid": "链接地址不合法",
143
+ "Link_title_required": "链接标题是必填项。",
144
+ "Blank_title_not_allowed": "不允许空白标题",
145
+ "userHelp": {
146
+ "title": "键盘快捷键",
147
+ "userHelpData": [
148
+ {
149
+ "shortcutType": "列表快捷键",
150
+ "shortcutData": {
151
+ "Make_list": "生成列表",
152
+ "Make_ordered_list": "生成有序列表",
153
+ "Insert_new_item": "插入列表项",
154
+ "Insert_child_in_item": "插入新段落",
155
+ "Increase_depth": "增加列表项深度"
156
+ }
157
+ },
158
+ {
159
+ "shortcutType": "标题快捷键",
160
+ "shortcutData": {
161
+ "Heading_1": "一级标题",
162
+ "Heading_2": "二级标题",
163
+ "Heading_3": "三级标题",
164
+ "Heading_4": "四级标题",
165
+ "Heading_5": "五级标题",
166
+ "Heading_6": "六级标题"
167
+ }
168
+ },
169
+ {
170
+ "shortcutType": "代码块快捷键",
171
+ "shortcutData": {
172
+ "Make_code_block": "生成代码块",
173
+ "Insert_new_line": "插入行",
174
+ "Escape_code_block": "退出代码块",
175
+ "Insert_indent": "缩进"
176
+ }
177
+ },
178
+ {
179
+ "shortcutType": "引用快捷键",
180
+ "shortcutData": {
181
+ "Make_block_quote": "生成引用",
182
+ "Escape_block_quote": "退出引用"
183
+ }
184
+ },
185
+ {
186
+ "shortcutType": "表格快捷键",
187
+ "shortcutData": {
188
+ "Insert_table_row": "插入行",
189
+ "Escape_table": "退出表格"
190
+ }
191
+ },
192
+ {
193
+ "shortcutType": "公式快捷键",
194
+ "shortcutData": {
195
+ "Insert_formula": "插入公式"
196
+ }
197
+ },
198
+ {
199
+ "shortcutType": "行级操作",
200
+ "shortcutData": {
201
+ "Bold": "粗体",
202
+ "Italic": "斜体",
203
+ "Italic_bold": "斜体加粗",
204
+ "Inline_code": "行内代码"
205
+ }
206
+ },
207
+ {
208
+ "shortcutType": "文件保存",
209
+ "shortcutData": {
210
+ "Save_file": "保存文件"
211
+ }
212
+ },
213
+ {
214
+ "shortcutType": "图片操作",
215
+ "shortcutData": {
216
+ "Paste_screen_shot": "上传截图",
217
+ "Drag_image_from_anywhere_to_upload_it": "拖拽任意图片上传"
218
+ }
219
+ }
220
+ ]
221
+ },
222
+ "Select_field": "选中字段",
223
+ "Font_style": "字体样式",
224
+ "Open_link": "打开链接",
225
+ "Image_is_uploading": "图片正在上传",
226
+ "Image_loading_failed": "图片加载失败",
227
+ "Expand_editor": "展开编辑器",
228
+ "Insert_below": "在下方插入",
229
+ "Insert_above": "在上方插入",
230
+ "Insert_on_the_right": "在右侧插入",
231
+ "Insert_on_the_left": "在左侧插入",
232
+ "Row(s)": "行",
233
+ "Column(s)": "列"
234
+ }