@seafile/sdoc-editor 3.0.1 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/seafile-api.js +20 -0
- package/dist/context.js +14 -0
- package/dist/editor/sdoc-editor.js +3 -0
- package/dist/editor/wiki-editor.js +4 -1
- package/dist/extension/commons/insert-element-dialog/index.js +26 -13
- package/dist/extension/constants/element-type.js +2 -1
- package/dist/extension/constants/font.js +1 -2
- package/dist/extension/constants/index.js +8 -0
- package/dist/extension/constants/menus-config.js +8 -3
- package/dist/extension/plugins/file-view/helpers.js +77 -0
- package/dist/extension/plugins/file-view/index.js +17 -0
- package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/constants.js +16 -0
- package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/index.css +96 -0
- package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/index.js +156 -0
- package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/lib.png +0 -0
- package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/option.css +49 -0
- package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/option.js +53 -0
- package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/select-option-group.css +37 -0
- package/dist/extension/plugins/file-view/insert-view-dialog/dropdown-select/select-option-group.js +241 -0
- package/dist/extension/plugins/file-view/insert-view-dialog/index.js +232 -0
- package/dist/extension/plugins/file-view/insert-view-dialog/modal-portal.js +41 -0
- package/dist/extension/plugins/file-view/plugin.js +71 -0
- package/dist/extension/plugins/file-view/render-elem/index.css +53 -0
- package/dist/extension/plugins/file-view/render-elem/index.js +103 -0
- package/dist/extension/plugins/html/plugin.js +2 -3
- package/dist/extension/plugins/image/use-copy-image.js +2 -2
- package/dist/extension/plugins/index.js +9 -2
- package/dist/extension/plugins/quick-insert/render-elem.js +1 -0
- package/dist/extension/render/custom-element.js +6 -0
- package/dist/extension/toolbar/insert-element-toolbar/index.js +16 -1
- package/dist/extension/toolbar/side-toolbar/insert-block-menu.js +16 -2
- package/dist/node-id/index.js +3 -0
- package/package.json +2 -2
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
11
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
12
|
+
var _reactI18next = require("react-i18next");
|
|
13
|
+
var _reactstrap = require("reactstrap");
|
|
14
|
+
var _loading = _interopRequireDefault(require("../../../../components/loading"));
|
|
15
|
+
var _toast = _interopRequireDefault(require("../../../../components/toast"));
|
|
16
|
+
var _context = _interopRequireDefault(require("../../../../context"));
|
|
17
|
+
var _commonUtils = require("../../../../utils/common-utils");
|
|
18
|
+
var _helpers = require("../helpers");
|
|
19
|
+
var _dropdownSelect = _interopRequireDefault(require("./dropdown-select"));
|
|
20
|
+
var InsertViewDialog = function InsertViewDialog(_ref) {
|
|
21
|
+
var className = _ref.className,
|
|
22
|
+
editor = _ref.editor,
|
|
23
|
+
_ref$element = _ref.element,
|
|
24
|
+
element = _ref$element === void 0 ? {} : _ref$element,
|
|
25
|
+
slateNode = _ref.slateNode,
|
|
26
|
+
insertPosition = _ref.insertPosition,
|
|
27
|
+
closeDialog = _ref.closeDialog;
|
|
28
|
+
var _element$data = element.data,
|
|
29
|
+
data = _element$data === void 0 ? {} : _element$data;
|
|
30
|
+
var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
|
|
31
|
+
t = _useTranslation.t;
|
|
32
|
+
var _useState = (0, _react.useState)(true),
|
|
33
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
34
|
+
isLoading = _useState2[0],
|
|
35
|
+
setIsLoading = _useState2[1];
|
|
36
|
+
var _useState3 = (0, _react.useState)(''),
|
|
37
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
38
|
+
viewName = _useState4[0],
|
|
39
|
+
setViewName = _useState4[1];
|
|
40
|
+
var _useState5 = (0, _react.useState)(null),
|
|
41
|
+
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
|
|
42
|
+
currentTypeOption = _useState6[0],
|
|
43
|
+
setCurrentTypeOption = _useState6[1];
|
|
44
|
+
var _useState7 = (0, _react.useState)(null),
|
|
45
|
+
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
|
|
46
|
+
currentRepoOption = _useState8[0],
|
|
47
|
+
setCurrentRepoOption = _useState8[1];
|
|
48
|
+
var _useState9 = (0, _react.useState)(''),
|
|
49
|
+
_useState0 = (0, _slicedToArray2["default"])(_useState9, 2),
|
|
50
|
+
viewNameErrorMessage = _useState0[0],
|
|
51
|
+
setViewNameErrorMessage = _useState0[1];
|
|
52
|
+
var _useState1 = (0, _react.useState)(''),
|
|
53
|
+
_useState10 = (0, _slicedToArray2["default"])(_useState1, 2),
|
|
54
|
+
typeErrorMessage = _useState10[0],
|
|
55
|
+
setTypeErrorMessage = _useState10[1];
|
|
56
|
+
var _useState11 = (0, _react.useState)(''),
|
|
57
|
+
_useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
|
|
58
|
+
repoErrorMessage = _useState12[0],
|
|
59
|
+
setRepoErrorMessage = _useState12[1];
|
|
60
|
+
var _useState13 = (0, _react.useState)([]),
|
|
61
|
+
_useState14 = (0, _slicedToArray2["default"])(_useState13, 2),
|
|
62
|
+
repoOptions = _useState14[0],
|
|
63
|
+
setRepoOptions = _useState14[1];
|
|
64
|
+
var TYPE_OPERATIONS = (0, _react.useMemo)(function () {
|
|
65
|
+
return [{
|
|
66
|
+
id: 'table',
|
|
67
|
+
name: 'table',
|
|
68
|
+
value: 'table',
|
|
69
|
+
label: 'table'
|
|
70
|
+
}];
|
|
71
|
+
}, []);
|
|
72
|
+
(0, _react.useEffect)(function () {
|
|
73
|
+
var _element$data2 = element.data,
|
|
74
|
+
data = _element$data2 === void 0 ? {} : _element$data2;
|
|
75
|
+
setViewName(data.view_name);
|
|
76
|
+
var typeOption = TYPE_OPERATIONS.find(function (item) {
|
|
77
|
+
return item.value === data.view_type;
|
|
78
|
+
}) || null;
|
|
79
|
+
setCurrentTypeOption(typeOption);
|
|
80
|
+
var wikiSettings = (0, _helpers.getWikiSettings)();
|
|
81
|
+
var accessibleRepos = (0, _helpers.getAccessibleRepos)();
|
|
82
|
+
var linkedRepoIds = wikiSettings.linked_repos;
|
|
83
|
+
var repoList = accessibleRepos.map(function (item) {
|
|
84
|
+
item.sharePermission = 'rw';
|
|
85
|
+
return item;
|
|
86
|
+
});
|
|
87
|
+
var options = repoList.map(function (item) {
|
|
88
|
+
return {
|
|
89
|
+
id: item.repo_id,
|
|
90
|
+
name: item.repo_name,
|
|
91
|
+
value: item.repo_name,
|
|
92
|
+
label: item.repo_name,
|
|
93
|
+
permission: item.permission
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
var optionsMap = options.reduce(function (result, item) {
|
|
97
|
+
result[item.id] = item;
|
|
98
|
+
return result;
|
|
99
|
+
}, {});
|
|
100
|
+
var repoOptions = linkedRepoIds.map(function (id) {
|
|
101
|
+
return optionsMap[id];
|
|
102
|
+
}).filter(Boolean);
|
|
103
|
+
setRepoOptions(repoOptions);
|
|
104
|
+
setCurrentRepoOption(repoOptions.find(function (item) {
|
|
105
|
+
return item.id === data.linked_repo_id;
|
|
106
|
+
}));
|
|
107
|
+
setIsLoading(false);
|
|
108
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
109
|
+
}, []);
|
|
110
|
+
var submit = (0, _react.useCallback)(function () {
|
|
111
|
+
setViewNameErrorMessage('');
|
|
112
|
+
setTypeErrorMessage('');
|
|
113
|
+
setRepoErrorMessage('');
|
|
114
|
+
if (!viewName) {
|
|
115
|
+
setViewNameErrorMessage(t('The_view_name_is_required'));
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (!currentTypeOption) {
|
|
119
|
+
setTypeErrorMessage(t('The_view_type_is_required'));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (!currentRepoOption) {
|
|
123
|
+
setRepoErrorMessage(t('The_linked_library_is_required'));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
var viewType = currentTypeOption.value;
|
|
127
|
+
var linkedRepoId = currentRepoOption.id;
|
|
128
|
+
var wikiId = _context["default"].getSetting('wikiId');
|
|
129
|
+
var data = {
|
|
130
|
+
wiki_id: wikiId,
|
|
131
|
+
view_name: viewName,
|
|
132
|
+
view_type: viewType,
|
|
133
|
+
link_repo_id: linkedRepoId
|
|
134
|
+
};
|
|
135
|
+
_context["default"].insertWikiView(data).then(function (res) {
|
|
136
|
+
var view = res.data.view;
|
|
137
|
+
var viewData = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, data), {}, {
|
|
138
|
+
view_id: view._id
|
|
139
|
+
});
|
|
140
|
+
(0, _helpers.insertFileView)(viewData, editor, insertPosition, slateNode);
|
|
141
|
+
closeDialog();
|
|
142
|
+
})["catch"](function (error) {
|
|
143
|
+
var errorMessage = (0, _commonUtils.getErrorMsg)(error);
|
|
144
|
+
_toast["default"].danger(errorMessage);
|
|
145
|
+
});
|
|
146
|
+
}, [viewName, currentTypeOption, currentRepoOption, t, editor, insertPosition, slateNode, closeDialog]);
|
|
147
|
+
var onKeyDown = (0, _react.useCallback)(function (event) {
|
|
148
|
+
if (event.keyCode === 13) {
|
|
149
|
+
event.preventDefault();
|
|
150
|
+
submit();
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
}, [submit]);
|
|
154
|
+
var onValueChanged = (0, _react.useCallback)(function (event) {
|
|
155
|
+
var value = event.target.value;
|
|
156
|
+
if (value === viewName) return;
|
|
157
|
+
setViewName(value);
|
|
158
|
+
setViewNameErrorMessage('');
|
|
159
|
+
}, [viewName]);
|
|
160
|
+
var onSelectTypeOption = (0, _react.useCallback)(function (option) {
|
|
161
|
+
setCurrentTypeOption(option);
|
|
162
|
+
setTypeErrorMessage('');
|
|
163
|
+
}, []);
|
|
164
|
+
var onSelectTableOption = (0, _react.useCallback)(function (option) {
|
|
165
|
+
setCurrentRepoOption(option);
|
|
166
|
+
setRepoErrorMessage('');
|
|
167
|
+
}, []);
|
|
168
|
+
var close = (0, _react.useMemo)(function () {
|
|
169
|
+
return /*#__PURE__*/_react["default"].createElement("span", {
|
|
170
|
+
className: "sdoc-add-link-close-icon",
|
|
171
|
+
onClick: closeDialog
|
|
172
|
+
}, /*#__PURE__*/_react["default"].createElement("i", {
|
|
173
|
+
className: "sdocfont sdoc-sm-close",
|
|
174
|
+
"aria-hidden": "true"
|
|
175
|
+
}));
|
|
176
|
+
}, [closeDialog]);
|
|
177
|
+
return /*#__PURE__*/_react["default"].createElement(_reactstrap.Modal, {
|
|
178
|
+
isOpen: true,
|
|
179
|
+
autoFocus: false,
|
|
180
|
+
toggle: closeDialog,
|
|
181
|
+
className: className,
|
|
182
|
+
zIndex: 1071,
|
|
183
|
+
returnFocusAfterClose: false
|
|
184
|
+
}, /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalHeader, {
|
|
185
|
+
close: close
|
|
186
|
+
}, t('Insert_file_view')), /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalBody, null, isLoading && /*#__PURE__*/_react["default"].createElement(_loading["default"], null), !isLoading && repoOptions.length === 0 && /*#__PURE__*/_react["default"].createElement("div", {
|
|
187
|
+
className: ""
|
|
188
|
+
}, t('Linked_repo_tip')), !isLoading && repoOptions.length !== 0 && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
|
|
189
|
+
className: "form-group"
|
|
190
|
+
}, /*#__PURE__*/_react["default"].createElement(_reactstrap.Label, {
|
|
191
|
+
"for": "addTitle"
|
|
192
|
+
}, t('View_name')), /*#__PURE__*/_react["default"].createElement("input", {
|
|
193
|
+
onKeyDown: onKeyDown,
|
|
194
|
+
type: "text",
|
|
195
|
+
className: "form-control",
|
|
196
|
+
id: "addTitle",
|
|
197
|
+
value: data.view_name,
|
|
198
|
+
onChange: onValueChanged
|
|
199
|
+
}), viewNameErrorMessage && /*#__PURE__*/_react["default"].createElement(_reactstrap.Alert, {
|
|
200
|
+
color: "danger",
|
|
201
|
+
className: "mt-2"
|
|
202
|
+
}, t(viewNameErrorMessage))), /*#__PURE__*/_react["default"].createElement("div", {
|
|
203
|
+
className: "form-group"
|
|
204
|
+
}, /*#__PURE__*/_react["default"].createElement(_reactstrap.Label, null, t('View_type')), /*#__PURE__*/_react["default"].createElement(_dropdownSelect["default"], {
|
|
205
|
+
selectedOption: currentTypeOption,
|
|
206
|
+
options: TYPE_OPERATIONS,
|
|
207
|
+
onSelectOption: onSelectTypeOption,
|
|
208
|
+
isInModal: true
|
|
209
|
+
}), typeErrorMessage && /*#__PURE__*/_react["default"].createElement(_reactstrap.Alert, {
|
|
210
|
+
color: "danger",
|
|
211
|
+
className: "mt-2"
|
|
212
|
+
}, t(typeErrorMessage))), /*#__PURE__*/_react["default"].createElement("div", {
|
|
213
|
+
className: "form-group"
|
|
214
|
+
}, /*#__PURE__*/_react["default"].createElement(_reactstrap.Label, null, t('Linked_library')), /*#__PURE__*/_react["default"].createElement(_dropdownSelect["default"], {
|
|
215
|
+
hasIcon: true,
|
|
216
|
+
selectedOption: currentRepoOption,
|
|
217
|
+
options: repoOptions,
|
|
218
|
+
onSelectOption: onSelectTableOption,
|
|
219
|
+
isInModal: true
|
|
220
|
+
}), repoErrorMessage && /*#__PURE__*/_react["default"].createElement(_reactstrap.Alert, {
|
|
221
|
+
color: "danger",
|
|
222
|
+
className: "mt-2"
|
|
223
|
+
}, t(repoErrorMessage))))), !isLoading && repoOptions.length !== 0 && /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalFooter, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
|
|
224
|
+
color: "secondary",
|
|
225
|
+
onClick: closeDialog
|
|
226
|
+
}, t('Cancel')), /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
|
|
227
|
+
color: "primary",
|
|
228
|
+
disabled: false,
|
|
229
|
+
onClick: submit
|
|
230
|
+
}, t('Submit'))));
|
|
231
|
+
};
|
|
232
|
+
var _default = exports["default"] = InsertViewDialog;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/classCallCheck"));
|
|
9
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createClass"));
|
|
10
|
+
var _callSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/callSuper"));
|
|
11
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/inherits"));
|
|
12
|
+
var _react = _interopRequireDefault(require("react"));
|
|
13
|
+
var _reactDom = require("react-dom");
|
|
14
|
+
var modalRoot = document.getElementById('modal-wrapper');
|
|
15
|
+
var ModalPortal = /*#__PURE__*/function (_React$Component) {
|
|
16
|
+
function ModalPortal(props) {
|
|
17
|
+
var _this;
|
|
18
|
+
(0, _classCallCheck2["default"])(this, ModalPortal);
|
|
19
|
+
_this = (0, _callSuper2["default"])(this, ModalPortal, [props]);
|
|
20
|
+
_this.el = document.createElement('div');
|
|
21
|
+
return _this;
|
|
22
|
+
}
|
|
23
|
+
(0, _inherits2["default"])(ModalPortal, _React$Component);
|
|
24
|
+
return (0, _createClass2["default"])(ModalPortal, [{
|
|
25
|
+
key: "componentDidMount",
|
|
26
|
+
value: function componentDidMount() {
|
|
27
|
+
modalRoot.appendChild(this.el);
|
|
28
|
+
}
|
|
29
|
+
}, {
|
|
30
|
+
key: "componentWillUnmount",
|
|
31
|
+
value: function componentWillUnmount() {
|
|
32
|
+
modalRoot.removeChild(this.el);
|
|
33
|
+
}
|
|
34
|
+
}, {
|
|
35
|
+
key: "render",
|
|
36
|
+
value: function render() {
|
|
37
|
+
return /*#__PURE__*/(0, _reactDom.createPortal)(this.props.children, this.el);
|
|
38
|
+
}
|
|
39
|
+
}]);
|
|
40
|
+
}(_react["default"].Component);
|
|
41
|
+
var _default = exports["default"] = ModalPortal;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
9
|
+
var _slate = require("@seafile/slate");
|
|
10
|
+
var _isHotkey = _interopRequireDefault(require("is-hotkey"));
|
|
11
|
+
var _constants = require("../../constants");
|
|
12
|
+
var _core = require("../../core");
|
|
13
|
+
var _helpers = require("../../toolbar/side-toolbar/helpers");
|
|
14
|
+
var withFileView = function withFileView(editor) {
|
|
15
|
+
var isVoid = editor.isVoid,
|
|
16
|
+
onHotKeyDown = editor.onHotKeyDown,
|
|
17
|
+
normalizeNode = editor.normalizeNode;
|
|
18
|
+
var newEditor = editor;
|
|
19
|
+
|
|
20
|
+
// Make video as void node
|
|
21
|
+
newEditor.isVoid = function (elem) {
|
|
22
|
+
var type = elem.type;
|
|
23
|
+
if (type === _constants.FILE_VIEW) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
return isVoid(elem);
|
|
27
|
+
};
|
|
28
|
+
newEditor.onHotKeyDown = function (event) {
|
|
29
|
+
var _ref = (0, _core.getSelectedNodeEntryByType)(editor, _constants.FILE_VIEW) || [],
|
|
30
|
+
_ref2 = (0, _slicedToArray2["default"])(_ref, 2),
|
|
31
|
+
fileNode = _ref2[0],
|
|
32
|
+
path = _ref2[1];
|
|
33
|
+
if (path) {
|
|
34
|
+
// Insert empty paragraph node after video when clicking 'enter' on selected video
|
|
35
|
+
if ((0, _isHotkey["default"])('enter', event)) {
|
|
36
|
+
event.preventDefault();
|
|
37
|
+
var emptyParagraph = (0, _core.generateEmptyElement)(_constants.PARAGRAPH);
|
|
38
|
+
_slate.Transforms.insertNodes(editor, emptyParagraph, {
|
|
39
|
+
at: _slate.Path.next(path)
|
|
40
|
+
});
|
|
41
|
+
var focusPoint = _slate.Editor.end(editor, _slate.Path.next(path));
|
|
42
|
+
(0, _core.focusEditor)(newEditor, focusPoint);
|
|
43
|
+
}
|
|
44
|
+
if ((0, _isHotkey["default"])('mod+c', event)) {
|
|
45
|
+
(0, _helpers.onCopyNode)(editor, fileNode);
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
return onHotKeyDown && onHotKeyDown(event);
|
|
50
|
+
};
|
|
51
|
+
newEditor.normalizeNode = function (_ref3) {
|
|
52
|
+
var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2),
|
|
53
|
+
node = _ref4[0],
|
|
54
|
+
path = _ref4[1];
|
|
55
|
+
var type = (0, _core.getNodeType)(node);
|
|
56
|
+
if (type !== _constants.ELEMENT_TYPE.FILE_VIEW) {
|
|
57
|
+
return normalizeNode([node, path]);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// insert empty node,continue editor
|
|
61
|
+
var isLast = (0, _core.isLastNode)(newEditor, node);
|
|
62
|
+
if (isLast) {
|
|
63
|
+
var p = (0, _core.generateEmptyElement)(_constants.PARAGRAPH);
|
|
64
|
+
_slate.Transforms.insertNodes(newEditor, p, {
|
|
65
|
+
at: [path[0] + 1]
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
return newEditor;
|
|
70
|
+
};
|
|
71
|
+
var _default = exports["default"] = withFileView;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
.sdoc-file-view-container {
|
|
2
|
+
position: relative;
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
border: 2px;
|
|
6
|
+
border: 2px solid #eee;
|
|
7
|
+
border-radius: 4px;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.sdoc-file-view-container.is-selected {
|
|
11
|
+
border: 2px solid rgb(0, 123, 255);
|
|
12
|
+
border-radius: 4px;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.sdoc-file-view-container .sdoc-file-view-title {
|
|
16
|
+
position: absolute;
|
|
17
|
+
height: 44px;
|
|
18
|
+
line-height: 44px;
|
|
19
|
+
top: 0px;
|
|
20
|
+
left: 0px;
|
|
21
|
+
z-index: 10;
|
|
22
|
+
height: 44px;
|
|
23
|
+
line-height: 44px;
|
|
24
|
+
margin-left: 16px;
|
|
25
|
+
cursor: pointer;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.sdoc-file-view-container .sdoc-file-view-content {
|
|
29
|
+
position: relative;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.sdoc-file-view-container .iframe-skeleton {
|
|
33
|
+
position: absolute;
|
|
34
|
+
left: 0;
|
|
35
|
+
right: 0;
|
|
36
|
+
top: 0;
|
|
37
|
+
bottom: 0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.sdoc-file-view-container .iframe-skeleton {
|
|
41
|
+
display: flex;
|
|
42
|
+
align-items: center;
|
|
43
|
+
justify-content: center;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.sdoc-file-view-container .sdoc-file-view-mask {
|
|
47
|
+
position: absolute;
|
|
48
|
+
left: 0;
|
|
49
|
+
right: 0;
|
|
50
|
+
top: 0;
|
|
51
|
+
bottom: 0;
|
|
52
|
+
background-color: transparent;
|
|
53
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.renderFileView = void 0;
|
|
9
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
11
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
12
|
+
var _slateReact = require("@seafile/slate-react");
|
|
13
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
14
|
+
var _fileLoading = _interopRequireDefault(require("../../../../components/file-loading"));
|
|
15
|
+
var _toast = _interopRequireDefault(require("../../../../components/toast"));
|
|
16
|
+
var _context = _interopRequireDefault(require("../../../../context"));
|
|
17
|
+
var _commonUtils = require("../../../../utils/common-utils");
|
|
18
|
+
var _localStorageUtils = _interopRequireDefault(require("../../../../utils/local-storage-utils"));
|
|
19
|
+
var _constants = require("../../../constants");
|
|
20
|
+
var _helpers = require("../helpers");
|
|
21
|
+
require("./index.css");
|
|
22
|
+
var FileView = function FileView(_ref) {
|
|
23
|
+
var element = _ref.element,
|
|
24
|
+
children = _ref.children,
|
|
25
|
+
attributes = _ref.attributes;
|
|
26
|
+
var data = element.data;
|
|
27
|
+
var editor = (0, _slateReact.useSlateStatic)();
|
|
28
|
+
var isSelected = (0, _slateReact.useSelected)();
|
|
29
|
+
var _useState = (0, _react.useState)(true),
|
|
30
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
31
|
+
isLoading = _useState2[0],
|
|
32
|
+
setIsLoading = _useState2[1];
|
|
33
|
+
var _useState3 = (0, _react.useState)(true),
|
|
34
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
35
|
+
isShowMask = _useState4[0],
|
|
36
|
+
setIsShowMask = _useState4[1];
|
|
37
|
+
(0, _react.useEffect)(function () {
|
|
38
|
+
if (!isSelected) {
|
|
39
|
+
setIsShowMask(true);
|
|
40
|
+
}
|
|
41
|
+
}, [isSelected]);
|
|
42
|
+
(0, _react.useEffect)(function () {
|
|
43
|
+
var copyContent = _localStorageUtils["default"].getItem(_constants.RECENT_COPY_CONTENT);
|
|
44
|
+
var wikiId = _context["default"].getSetting('wikiId');
|
|
45
|
+
if (wikiId !== data.wiki_id) return;
|
|
46
|
+
if (!copyContent) return;
|
|
47
|
+
var stringContent = JSON.stringify(copyContent);
|
|
48
|
+
if (stringContent.indexOf(data.wiki_id) > -1 && stringContent.indexOf(data.view_id) > -1) {
|
|
49
|
+
_context["default"].duplicateWikiView(data.view_id).then(function (res) {
|
|
50
|
+
var view = res.data.view;
|
|
51
|
+
var newData = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, data), {}, {
|
|
52
|
+
view_id: view._id,
|
|
53
|
+
view_name: view.name
|
|
54
|
+
});
|
|
55
|
+
(0, _helpers.updateFileView)(newData, editor, element);
|
|
56
|
+
})["catch"](function (error) {
|
|
57
|
+
var errorMessage = (0, _commonUtils.getErrorMsg)(error);
|
|
58
|
+
_toast["default"].danger(errorMessage);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
62
|
+
}, []);
|
|
63
|
+
var handleLoad = (0, _react.useCallback)(function () {
|
|
64
|
+
setIsLoading(false);
|
|
65
|
+
}, []);
|
|
66
|
+
var onClick = (0, _react.useCallback)(function () {
|
|
67
|
+
setIsShowMask(false);
|
|
68
|
+
}, []);
|
|
69
|
+
return /*#__PURE__*/_react["default"].createElement("div", Object.assign({
|
|
70
|
+
"data-id": element.id
|
|
71
|
+
}, attributes, {
|
|
72
|
+
className: (0, _classnames["default"])('sdoc-file-view-container', {
|
|
73
|
+
'is-selected': isSelected
|
|
74
|
+
}),
|
|
75
|
+
contentEditable: "false",
|
|
76
|
+
suppressContentEditableWarning: true
|
|
77
|
+
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
78
|
+
className: "sdoc-file-view-title"
|
|
79
|
+
}, data.view_name), /*#__PURE__*/_react["default"].createElement("div", {
|
|
80
|
+
className: "sdoc-file-view-content"
|
|
81
|
+
}, /*#__PURE__*/_react["default"].createElement("iframe", {
|
|
82
|
+
className: "sdoc-file-view-element",
|
|
83
|
+
title: data.view_name,
|
|
84
|
+
src: (0, _helpers.getFileUrl)(element),
|
|
85
|
+
onLoad: handleLoad,
|
|
86
|
+
style: {
|
|
87
|
+
width: '100%',
|
|
88
|
+
height: '100%',
|
|
89
|
+
border: 'none',
|
|
90
|
+
opacity: isLoading ? 0 : 1,
|
|
91
|
+
transition: 'opacity 0.3s ease-in-out',
|
|
92
|
+
minHeight: '370px'
|
|
93
|
+
}
|
|
94
|
+
}), isLoading && /*#__PURE__*/_react["default"].createElement("div", {
|
|
95
|
+
className: "iframe-skeleton"
|
|
96
|
+
}, /*#__PURE__*/_react["default"].createElement(_fileLoading["default"], null)), !isLoading && isShowMask && /*#__PURE__*/_react["default"].createElement("div", {
|
|
97
|
+
className: "sdoc-file-view-mask",
|
|
98
|
+
onClick: onClick
|
|
99
|
+
})), children);
|
|
100
|
+
};
|
|
101
|
+
var renderFileView = exports.renderFileView = function renderFileView(props) {
|
|
102
|
+
return /*#__PURE__*/_react["default"].createElement(FileView, props);
|
|
103
|
+
};
|
|
@@ -8,7 +8,6 @@ exports["default"] = void 0;
|
|
|
8
8
|
var _slugid = _interopRequireDefault(require("slugid"));
|
|
9
9
|
var _localStorageUtils = _interopRequireDefault(require("../../../utils/local-storage-utils"));
|
|
10
10
|
var _constants = require("../../constants");
|
|
11
|
-
var _font = require("../../constants/font");
|
|
12
11
|
var _core = require("../../core");
|
|
13
12
|
var _helper = require("./helper");
|
|
14
13
|
var withHtml = function withHtml(editor) {
|
|
@@ -39,11 +38,11 @@ var withHtml = function withHtml(editor) {
|
|
|
39
38
|
var htmlContent = data.getData('text/html') || '';
|
|
40
39
|
if (htmlContent) {
|
|
41
40
|
var content = (0, _helper.deserializeHtml)(htmlContent);
|
|
42
|
-
_localStorageUtils["default"].setItem(
|
|
41
|
+
_localStorageUtils["default"].setItem(_constants.RECENT_COPY_CONTENT, htmlContent);
|
|
43
42
|
editor.insertFragment(content);
|
|
44
43
|
return;
|
|
45
44
|
}
|
|
46
|
-
_localStorageUtils["default"].setItem(
|
|
45
|
+
_localStorageUtils["default"].setItem(_constants.RECENT_COPY_CONTENT, data);
|
|
47
46
|
insertData(data);
|
|
48
47
|
}
|
|
49
48
|
};
|
|
@@ -14,7 +14,7 @@ var _slate = require("@seafile/slate");
|
|
|
14
14
|
var _slateReact = require("@seafile/slate-react");
|
|
15
15
|
var _context3 = _interopRequireDefault(require("../../../context"));
|
|
16
16
|
var _localStorageUtils = _interopRequireDefault(require("../../../utils/local-storage-utils"));
|
|
17
|
-
var
|
|
17
|
+
var _constants = require("../../constants");
|
|
18
18
|
var _helpers = require("./helpers");
|
|
19
19
|
var updateImageNode = /*#__PURE__*/function () {
|
|
20
20
|
var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regenerator2["default"])().m(function _callee(editor, element, newUrl) {
|
|
@@ -70,7 +70,7 @@ var useCopyImage = function useCopyImage(_ref2) {
|
|
|
70
70
|
|
|
71
71
|
// not md convert to sdoc
|
|
72
72
|
if (url.indexOf('/file/images/auto-upload/') < 0) {
|
|
73
|
-
var cacheContent = _localStorageUtils["default"].getItem(
|
|
73
|
+
var cacheContent = _localStorageUtils["default"].getItem(_constants.RECENT_COPY_CONTENT);
|
|
74
74
|
// sync content from another user's copy
|
|
75
75
|
if (!cacheContent || JSON.stringify(cacheContent).indexOf(url) === -1) return;
|
|
76
76
|
}
|
|
@@ -35,6 +35,12 @@ Object.defineProperty(exports, "FileLinkPlugin", {
|
|
|
35
35
|
return _fileLink["default"];
|
|
36
36
|
}
|
|
37
37
|
});
|
|
38
|
+
Object.defineProperty(exports, "FileViewPlugin", {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
get: function get() {
|
|
41
|
+
return _fileView["default"];
|
|
42
|
+
}
|
|
43
|
+
});
|
|
38
44
|
Object.defineProperty(exports, "FontPlugin", {
|
|
39
45
|
enumerable: true,
|
|
40
46
|
get: function get() {
|
|
@@ -161,6 +167,7 @@ var _callout = _interopRequireDefault(require("./callout"));
|
|
|
161
167
|
var _checkList = _interopRequireDefault(require("./check-list"));
|
|
162
168
|
var _codeBlock = _interopRequireDefault(require("./code-block"));
|
|
163
169
|
var _fileLink = _interopRequireDefault(require("./file-link"));
|
|
170
|
+
var _fileView = _interopRequireDefault(require("./file-view"));
|
|
164
171
|
var _font = _interopRequireDefault(require("./font"));
|
|
165
172
|
var _group = _interopRequireDefault(require("./group"));
|
|
166
173
|
var _header = _interopRequireDefault(require("./header"));
|
|
@@ -181,7 +188,7 @@ var _textStyle = _interopRequireDefault(require("./text-style"));
|
|
|
181
188
|
var _video = _interopRequireDefault(require("./video"));
|
|
182
189
|
var _whiteboard = _interopRequireDefault(require("./whiteboard"));
|
|
183
190
|
var _wikiLink = _interopRequireDefault(require("./wiki-link"));
|
|
184
|
-
var Plugins = [_markdown["default"], _html["default"], _header["default"], _link["default"], _blockquote["default"], _list["default"], _checkList["default"], _codeBlock["default"], _image["default"], _video["default"], _table["default"], _multiColumn["default"], _textStyle["default"], _textAlign["default"], _font["default"], _sdocLink["default"], _paragraph["default"], _fileLink["default"], _callout["default"], _searchReplace["default"], _quickInsert["default"], _group["default"], _whiteboard["default"]];
|
|
185
|
-
var WikiPlugins = exports.WikiPlugins = [].concat(Plugins, [_wikiLink["default"]]);
|
|
191
|
+
var Plugins = [_markdown["default"], _html["default"], _header["default"], _link["default"], _blockquote["default"], _list["default"], _checkList["default"], _codeBlock["default"], _image["default"], _video["default"], _table["default"], _multiColumn["default"], _textStyle["default"], _textAlign["default"], _font["default"], _sdocLink["default"], _paragraph["default"], _fileLink["default"], _callout["default"], _searchReplace["default"], _quickInsert["default"], _group["default"], _whiteboard["default"], _fileView["default"]];
|
|
192
|
+
var WikiPlugins = exports.WikiPlugins = [].concat(Plugins, [_wikiLink["default"], _fileView["default"]]);
|
|
186
193
|
var CommentPlugins = exports.CommentPlugins = [_markdown["default"], _html["default"], _paragraph["default"], _textStyle["default"], _list["default"], _image["default"], _link["default"], _mention["default"], _blockquote["default"]];
|
|
187
194
|
var _default = exports["default"] = Plugins;
|
|
@@ -76,6 +76,7 @@ var RenderQuickInsert = function RenderQuickInsert(_ref, editor, readonly) {
|
|
|
76
76
|
document.addEventListener('click', handleClick);
|
|
77
77
|
scrollDom.addEventListener('scroll', handleScroll);
|
|
78
78
|
resizeObserver = new ResizeObserver(function (entries) {
|
|
79
|
+
// eslint-disable-next-line no-unused-vars
|
|
79
80
|
var _iterator = (0, _createForOfIteratorHelper2["default"])(entries),
|
|
80
81
|
_step;
|
|
81
82
|
try {
|
|
@@ -240,6 +240,12 @@ var CustomRenderElement = function CustomRenderElement(props) {
|
|
|
240
240
|
renderWhiteboard = _WhiteboardPlugin$ren[0];
|
|
241
241
|
return renderWhiteboard((0, _objectSpread2["default"])({}, props), editor);
|
|
242
242
|
}
|
|
243
|
+
case _elementType.FILE_VIEW:
|
|
244
|
+
{
|
|
245
|
+
var _FileViewPlugin$rende = (0, _slicedToArray2["default"])(_plugins.FileViewPlugin.renderElements, 1),
|
|
246
|
+
renderFileView = _FileViewPlugin$rende[0];
|
|
247
|
+
return renderFileView((0, _objectSpread2["default"])({}, props));
|
|
248
|
+
}
|
|
243
249
|
default:
|
|
244
250
|
{
|
|
245
251
|
var _ParagraphPlugin$rend3 = (0, _slicedToArray2["default"])(_plugins.ParagraphPlugin.renderElements, 1),
|
|
@@ -112,6 +112,16 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
|
|
|
112
112
|
});
|
|
113
113
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
114
114
|
}, [insertPosition]);
|
|
115
|
+
var openFileViewDialog = (0, _react.useCallback)(function () {
|
|
116
|
+
callback && callback();
|
|
117
|
+
var eventBus = _eventBus["default"].getInstance();
|
|
118
|
+
eventBus.dispatch(_constants.INTERNAL_EVENT.INSERT_ELEMENT, {
|
|
119
|
+
type: _constants2.ELEMENT_TYPE.FILE_VIEW,
|
|
120
|
+
insertPosition: insertPosition,
|
|
121
|
+
slateNode: slateNode
|
|
122
|
+
});
|
|
123
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
124
|
+
}, [insertPosition]);
|
|
115
125
|
var onInsertCodeBlock = (0, _react.useCallback)(function () {
|
|
116
126
|
callback && callback();
|
|
117
127
|
var newInsertPosition = slateNode.type === _constants2.ELEMENT_TYPE.LIST_ITEM ? _constants2.INSERT_POSITION.AFTER : insertPosition;
|
|
@@ -203,7 +213,12 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
|
|
|
203
213
|
(0, _helper2.insertMultiColumn)(editor, editor.selection, newInsertPosition, type);
|
|
204
214
|
}, [callback, editor, insertPosition, slateNode]);
|
|
205
215
|
var dropDownItems = (0, _react.useMemo)(function () {
|
|
206
|
-
var items = (0, _objectSpread4["default"])((0, _objectSpread4["default"])((0, _defineProperty2["default"])({}, _constants2.
|
|
216
|
+
var items = (0, _objectSpread4["default"])((0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, editor.editorType === _constants.WIKI_EDITOR && (0, _defineProperty2["default"])({}, _constants2.FILE_VIEW, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
|
|
217
|
+
isHidden: !quickInsertMenuSearchMap[_constants2.FILE_VIEW],
|
|
218
|
+
key: "sdoc-insert-menu-file-view",
|
|
219
|
+
menuConfig: (0, _objectSpread4["default"])({}, _constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.FILE_VIEW]),
|
|
220
|
+
onClick: openFileViewDialog
|
|
221
|
+
}))), {}, (0, _defineProperty2["default"])({}, _constants2.IMAGE, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
|
|
207
222
|
isHidden: !quickInsertMenuSearchMap[_constants2.IMAGE],
|
|
208
223
|
disabled: isDisableImage,
|
|
209
224
|
key: "sdoc-insert-menu-image",
|
|
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports["default"] = void 0;
|
|
9
|
-
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
|
|
10
9
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
|
|
10
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
|
|
11
11
|
var _react = _interopRequireWildcard(require("react"));
|
|
12
12
|
var _reactI18next = require("react-i18next");
|
|
13
13
|
var _reactstrap = require("reactstrap");
|
|
@@ -142,7 +142,21 @@ var InsertBlockMenu = function InsertBlockMenu(_ref) {
|
|
|
142
142
|
var newInsertPosition = slateNode.type === _constants2.ELEMENT_TYPE.LIST_ITEM ? _constants2.INSERT_POSITION.AFTER : insertPosition;
|
|
143
143
|
(0, _helper2.insertMultiColumn)(editor, editor.selection, newInsertPosition, type);
|
|
144
144
|
}, [editor, insertPosition, slateNode]);
|
|
145
|
-
|
|
145
|
+
var insertFileView = (0, _react.useCallback)(function () {
|
|
146
|
+
var eventBus = _eventBus["default"].getInstance();
|
|
147
|
+
eventBus.dispatch(_constants.INTERNAL_EVENT.INSERT_ELEMENT, {
|
|
148
|
+
type: _constants2.ELEMENT_TYPE.FILE_VIEW,
|
|
149
|
+
insertPosition: insertPosition,
|
|
150
|
+
slateNode: slateNode
|
|
151
|
+
});
|
|
152
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
153
|
+
}, [insertPosition]);
|
|
154
|
+
console.log(editor.editorType);
|
|
155
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, editor.editorType === _constants.WIKI_EDITOR && /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
|
|
156
|
+
isHidden: !insertMenuSearchMap[_constants2.ELEMENT_TYPE.FILE_VIEW],
|
|
157
|
+
menuConfig: (0, _objectSpread2["default"])({}, _constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.FILE_VIEW]),
|
|
158
|
+
onClick: insertFileView
|
|
159
|
+
}), [_constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.PARAGRAPH]].concat((0, _toConsumableArray2["default"])(_constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.HEADER])).map(function (item) {
|
|
146
160
|
return /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
|
|
147
161
|
isHidden: !insertMenuSearchMap[item.type],
|
|
148
162
|
disabled: isNodeEmpty && item.type === _constants2.PARAGRAPH,
|