@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.
- package/dist/extension/constants/menus-config.js +6 -0
- package/dist/extension/plugins/table/constant.js +15 -2
- package/dist/extension/plugins/table/context-menu/index.js +68 -1
- package/dist/extension/plugins/table/context-menu/style.css +4 -0
- package/dist/extension/plugins/table/helper.js +146 -2
- package/dist/extension/plugins/table/menu/horizontal-align-popover/index.js +80 -0
- package/dist/extension/plugins/table/menu/vertical-align-popover/index.js +81 -0
- package/dist/extension/plugins/table/menu/vertical-align-popover/style.css +24 -0
- package/dist/extension/plugins/table/plugin.js +2 -0
- package/dist/extension/toolbar/header-toolbar/index.js +15 -31
- package/dist/extension/toolbar/header-toolbar/insert-toolbar/index.js +111 -0
- package/dist/extension/toolbar/header-toolbar/insert-toolbar/style.css +28 -0
- package/dist/extension/toolbar/inline-toolbar/index.js +1 -6
- package/dist/pages/longtext-editor-dialog/style.css +2 -1
- package/package.json +3 -3
- package/public/locales/zh/seafile-editor.json +234 -0
|
@@ -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;
|
|
@@ -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/
|
|
21
|
-
var _menu6 = _interopRequireDefault(require("../../plugins/
|
|
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
|
|
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(
|
|
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.
|
|
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(
|
|
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
|
-
}))
|
|
91
|
-
|
|
92
|
-
})),
|
|
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
|
-
}))),
|
|
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", {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/seafile-editor",
|
|
3
|
-
"version": "2.0.
|
|
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.
|
|
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.
|
|
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
|
+
}
|