@seafile/sdoc-editor 1.0.177 → 1.0.179
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 +12 -0
- package/dist/basic-sdk/assets/images/sdoc-ask-ai.png +0 -0
- package/dist/basic-sdk/constants/index.js +2 -1
- package/dist/basic-sdk/extension/commons/file-insert-dialog/index.js +28 -18
- package/dist/basic-sdk/extension/commons/file-insert-dialog/style.css +12 -9
- package/dist/basic-sdk/extension/commons/insert-element-dialog/index.js +10 -0
- package/dist/basic-sdk/extension/commons/select-file-dialog/helpers.js +9 -2
- package/dist/basic-sdk/extension/commons/select-file-dialog/index.css +115 -0
- package/dist/basic-sdk/extension/commons/select-file-dialog/index.js +68 -5
- package/dist/basic-sdk/extension/commons/select-file-dialog/local-files/index.css +42 -0
- package/dist/basic-sdk/extension/commons/select-file-dialog/local-files/index.js +49 -12
- package/dist/basic-sdk/extension/constants/element-type.js +2 -1
- package/dist/basic-sdk/extension/constants/menus-config.js +10 -2
- package/dist/basic-sdk/extension/core/queries/index.js +12 -1
- package/dist/basic-sdk/extension/plugins/ai/ai-icon/index.js +26 -0
- package/dist/basic-sdk/extension/plugins/ai/ai-icon/style.css +22 -0
- package/dist/basic-sdk/extension/plugins/ai/ai-menu/ai-context-menu.js +39 -0
- package/dist/basic-sdk/extension/plugins/ai/ai-menu/ai-dropdown-menu.js +35 -0
- package/dist/basic-sdk/extension/plugins/ai/ai-menu/index.js +20 -0
- package/dist/basic-sdk/extension/plugins/ai/ai-menu/menu-item.js +62 -0
- package/dist/basic-sdk/extension/plugins/ai/ai-menu/style.css +3 -0
- package/dist/basic-sdk/extension/plugins/ai/ai-module/adjust-sub-menu.js +40 -0
- package/dist/basic-sdk/extension/plugins/ai/ai-module/index.js +452 -0
- package/dist/basic-sdk/extension/plugins/ai/ai-module/lang-sub-menu.js +55 -0
- package/dist/basic-sdk/extension/plugins/ai/ai-module/style.css +104 -0
- package/dist/basic-sdk/extension/plugins/ai/ai-module/tip-dialog.js +32 -0
- package/dist/basic-sdk/extension/plugins/ai/constants/index.js +128 -0
- package/dist/basic-sdk/extension/plugins/ai/index.js +1 -0
- package/dist/basic-sdk/extension/plugins/blockquote/plugin.js +2 -2
- package/dist/basic-sdk/extension/plugins/image/helpers.js +25 -16
- package/dist/basic-sdk/extension/plugins/image/hover-menu/index.js +1 -1
- package/dist/basic-sdk/extension/plugins/link/helpers.js +14 -5
- package/dist/basic-sdk/extension/plugins/sdoc-link/helpers.js +7 -2
- package/dist/basic-sdk/extension/plugins/sdoc-link/render/render-elem.css +19 -3
- package/dist/basic-sdk/extension/plugins/sdoc-link/render/render-elem.js +8 -3
- package/dist/basic-sdk/extension/plugins/text-style/helpers.js +4 -0
- package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +27 -8
- package/dist/basic-sdk/extension/plugins/video/helpers.js +1 -0
- package/dist/basic-sdk/extension/plugins/video/plugin.js +26 -1
- package/dist/basic-sdk/extension/toolbar/side-toolbar/index.js +7 -0
- package/dist/basic-sdk/extension/toolbar/side-toolbar/side-menu.js +4 -1
- package/dist/context.js +8 -0
- package/package.json +1 -1
- package/public/locales/cs/sdoc-editor.json +23 -1
- package/public/locales/de/sdoc-editor.json +23 -1
- package/public/locales/en/sdoc-editor.json +23 -1
- package/public/locales/es/sdoc-editor.json +23 -1
- package/public/locales/es_AR/sdoc-editor.json +23 -1
- package/public/locales/es_MX/sdoc-editor.json +23 -1
- package/public/locales/fr/sdoc-editor.json +23 -1
- package/public/locales/it/sdoc-editor.json +23 -1
- package/public/locales/ru/sdoc-editor.json +24 -2
- package/public/locales/zh_CN/sdoc-editor.json +23 -1
- package/public/media/sdoc-editor-font/iconfont.css +14 -8
- package/public/media/sdoc-editor-font/iconfont.eot +0 -0
- package/public/media/sdoc-editor-font/iconfont.svg +4 -2
- package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
- package/public/media/sdoc-editor-font/iconfont.woff +0 -0
- package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
- package/public/media/sdoc-editor-font.css +14 -10
package/dist/api/seafile-api.js
CHANGED
|
@@ -146,6 +146,10 @@ class SeafileAPI {
|
|
|
146
146
|
const url = 'api/v2.1/seadoc/search-filename/' + docUuid + '/?query=' + query + '&page=' + page + '&per_page=' + per_page;
|
|
147
147
|
return this.req.get(url);
|
|
148
148
|
}
|
|
149
|
+
searchFilesByFilename(docUuid, query, page, per_page, search_type) {
|
|
150
|
+
const url = 'api/v2.1/seadoc/search-filename/' + docUuid + '/?query=' + query + '&page=' + page + '&per_page=' + per_page + '&search_type=' + search_type;
|
|
151
|
+
return this.req.get(url);
|
|
152
|
+
}
|
|
149
153
|
|
|
150
154
|
// participants
|
|
151
155
|
listParticipants(docUuid) {
|
|
@@ -193,5 +197,13 @@ class SeafileAPI {
|
|
|
193
197
|
const url = `/api/v2.1/seadoc/notifications/${docUuid}/`;
|
|
194
198
|
return this.req.put(url);
|
|
195
199
|
}
|
|
200
|
+
aiTranslate(docUuid, text, lang) {
|
|
201
|
+
const url = '/api/v2.1/ai/translate/?file_uuid=' + docUuid;
|
|
202
|
+
let form = new FormData();
|
|
203
|
+
form.append('text', text);
|
|
204
|
+
form.append('lang', lang);
|
|
205
|
+
form.append('file_uuid', docUuid);
|
|
206
|
+
return this.req.post(url, form);
|
|
207
|
+
}
|
|
196
208
|
}
|
|
197
209
|
var _default = exports.default = SeafileAPI;
|
|
Binary file
|
|
@@ -48,7 +48,8 @@ const INTERNAL_EVENT = exports.INTERNAL_EVENT = {
|
|
|
48
48
|
CLOSE_FILE_INSET_DIALOG: 'close_file_insert_dialog',
|
|
49
49
|
RESIZE_ARTICLE: 'resize_article',
|
|
50
50
|
ON_VIDEO_FILES_UPLOADED: 'on_video_files_uploaded',
|
|
51
|
-
RELOAD_COMMENT: 'reload_comment'
|
|
51
|
+
RELOAD_COMMENT: 'reload_comment',
|
|
52
|
+
ASK_AI: 'ask_ai'
|
|
52
53
|
};
|
|
53
54
|
const REVISION_DIFF_KEY = exports.REVISION_DIFF_KEY = 'diff';
|
|
54
55
|
const REVISION_DIFF_VALUE = exports.REVISION_DIFF_VALUE = '1';
|
|
@@ -16,9 +16,11 @@ var _utils = require("../../../../utils");
|
|
|
16
16
|
var _constants = require("../../../../constants");
|
|
17
17
|
var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
|
|
18
18
|
var _constants2 = require("../../../constants");
|
|
19
|
+
var _debounce = _interopRequireDefault(require("../../../utils/debounce"));
|
|
19
20
|
var _constants3 = require("../../constants");
|
|
20
21
|
var _toast = _interopRequireDefault(require("../../../../components/toast"));
|
|
21
22
|
var _helpers = require("../../plugins/sdoc-link/helpers");
|
|
23
|
+
var _helpers2 = require("../select-file-dialog/helpers");
|
|
22
24
|
require("./style.css");
|
|
23
25
|
const FileLinkInsertDialog = _ref => {
|
|
24
26
|
let {
|
|
@@ -39,6 +41,7 @@ const FileLinkInsertDialog = _ref => {
|
|
|
39
41
|
});
|
|
40
42
|
const [newFileName, setNewFileName] = (0, _react.useState)('');
|
|
41
43
|
const [header, setHeader] = (0, _react.useState)(t('Recent_visited'));
|
|
44
|
+
const [hiddenMoreMenu, setHiddenMoreMenu] = (0, _react.useState)(false);
|
|
42
45
|
const deleteInputAndInsertText = (0, _react.useCallback)(function () {
|
|
43
46
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
44
47
|
args[_key] = arguments[_key];
|
|
@@ -98,6 +101,10 @@ const FileLinkInsertDialog = _ref => {
|
|
|
98
101
|
let files = _utils.LocalStorage.getItem(getItemKey) || [];
|
|
99
102
|
if (isCalculatedByFiles) {
|
|
100
103
|
const newFiles = (0, _utils.getMaximumCapacity)(files);
|
|
104
|
+
// Can accommodate all without showing more operations
|
|
105
|
+
if (files.length <= newFiles.length) {
|
|
106
|
+
setHiddenMoreMenu(true);
|
|
107
|
+
}
|
|
101
108
|
files = newFiles;
|
|
102
109
|
}
|
|
103
110
|
setFiles(files);
|
|
@@ -144,34 +151,30 @@ const FileLinkInsertDialog = _ref => {
|
|
|
144
151
|
unsubscribeCloseDialog();
|
|
145
152
|
};
|
|
146
153
|
}, [closeDialog, editor, eventBus, files, getPosition, onClick, onKeydown, onScroll]);
|
|
147
|
-
const onSearch = (0, _react.useCallback)(async searchText => {
|
|
154
|
+
const onSearch = (0, _react.useCallback)((0, _debounce.default)(async searchText => {
|
|
148
155
|
// Show history files when search is empty
|
|
149
156
|
if (searchText.trim().length === 0) {
|
|
150
157
|
setHeader(t('Recent_visited'));
|
|
158
|
+
setHiddenMoreMenu(true);
|
|
151
159
|
setNewFileName('');
|
|
152
160
|
getHistoryFiles();
|
|
153
161
|
return;
|
|
154
162
|
}
|
|
163
|
+
setNewFileName(searchText);
|
|
155
164
|
|
|
156
165
|
// Cannot be found if the search is less than three characters.
|
|
157
166
|
if ((0, _utils.isEnglish)(searchText.trim()) && searchText.length < 3) {
|
|
158
167
|
setFiles([]);
|
|
159
168
|
setHeader(t('Enter_more_character_start_search'));
|
|
160
|
-
setNewFileName(searchText);
|
|
161
169
|
return;
|
|
162
170
|
}
|
|
163
171
|
try {
|
|
164
172
|
var _res$data;
|
|
165
|
-
const res = await _context.default.
|
|
173
|
+
const res = await _context.default.getSearchFilesByFilename(searchText, 1, 10, 'sdoc');
|
|
166
174
|
if (res !== null && res !== void 0 && (_res$data = res.data) !== null && _res$data !== void 0 && _res$data.results) {
|
|
167
175
|
let newFiles = res.data.results;
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
setNewFileName(searchText);
|
|
171
|
-
} else {
|
|
172
|
-
setHeader('');
|
|
173
|
-
setNewFileName('');
|
|
174
|
-
}
|
|
176
|
+
setHeader(t(newFiles.length === 0 ? 'No_results' : 'Link_to_file'));
|
|
177
|
+
setHiddenMoreMenu(true);
|
|
175
178
|
setFiles(newFiles);
|
|
176
179
|
return;
|
|
177
180
|
}
|
|
@@ -179,7 +182,7 @@ const FileLinkInsertDialog = _ref => {
|
|
|
179
182
|
_toast.default.danger(error.message);
|
|
180
183
|
}
|
|
181
184
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
182
|
-
}, []);
|
|
185
|
+
}, 50), []);
|
|
183
186
|
(0, _react.useEffect)(() => {
|
|
184
187
|
if (!(element !== null && element !== void 0 && element.children)) return;
|
|
185
188
|
// No search on first load
|
|
@@ -210,10 +213,11 @@ const FileLinkInsertDialog = _ref => {
|
|
|
210
213
|
e.stopPropagation();
|
|
211
214
|
(0, _helpers.removeTempInput)(editor, element);
|
|
212
215
|
const eventBus = _eventBus.default.getInstance();
|
|
213
|
-
const createName = newFileName.trim();
|
|
216
|
+
const createName = newFileName.trim() || t('Create_a_new_file');
|
|
214
217
|
const external_props = {
|
|
215
218
|
insertSdocFileLink: _helpers.insertSdocFileLink,
|
|
216
|
-
editor
|
|
219
|
+
editor,
|
|
220
|
+
noShowDialog: true
|
|
217
221
|
};
|
|
218
222
|
eventBus.dispatch(_constants.EXTERNAL_EVENT.CREATE_SDOC_FILE, {
|
|
219
223
|
newFileName: createName,
|
|
@@ -221,7 +225,7 @@ const FileLinkInsertDialog = _ref => {
|
|
|
221
225
|
});
|
|
222
226
|
}, [editor, element, newFileName]);
|
|
223
227
|
const createFileTipDefault = (0, _react.useMemo)(() => {
|
|
224
|
-
return '
|
|
228
|
+
return 'Create_a_new_file';
|
|
225
229
|
}, []);
|
|
226
230
|
const createFileName = (0, _react.useMemo)(() => {
|
|
227
231
|
return `${newFileName}.sdoc`;
|
|
@@ -246,15 +250,21 @@ const FileLinkInsertDialog = _ref => {
|
|
|
246
250
|
onClick: () => {
|
|
247
251
|
onSelect(item);
|
|
248
252
|
}
|
|
249
|
-
}, /*#__PURE__*/_react.default.createElement("
|
|
250
|
-
className: "file-item-
|
|
253
|
+
}, /*#__PURE__*/_react.default.createElement("img", {
|
|
254
|
+
className: "file-item-img",
|
|
255
|
+
src: (0, _helpers2.sdocFileIcon)(),
|
|
256
|
+
alt: ""
|
|
251
257
|
}), /*#__PURE__*/_react.default.createElement("span", {
|
|
252
258
|
className: "file-item-name"
|
|
253
259
|
}, item.name));
|
|
254
|
-
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
260
|
+
}), !hiddenMoreMenu && /*#__PURE__*/_react.default.createElement("div", {
|
|
255
261
|
className: "sdoc-history-files-item",
|
|
256
262
|
onClick: onShowMore
|
|
257
|
-
},
|
|
263
|
+
}, /*#__PURE__*/_react.default.createElement("i", {
|
|
264
|
+
className: "file-item-more sdocfont sdoc-more"
|
|
265
|
+
}), /*#__PURE__*/_react.default.createElement("span", {
|
|
266
|
+
className: "more-text"
|
|
267
|
+
}, t('More')))), /*#__PURE__*/_react.default.createElement("div", {
|
|
258
268
|
className: "sdoc-history-files-add",
|
|
259
269
|
onClick: onCreateFile
|
|
260
270
|
}, /*#__PURE__*/_react.default.createElement("i", {
|
|
@@ -43,15 +43,9 @@
|
|
|
43
43
|
align-items: flex-start;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
.sdoc-history-files-content .sdoc-history-files .
|
|
47
|
-
|
|
48
|
-
margin-right:
|
|
49
|
-
color: #ff9800;
|
|
50
|
-
width: 20px;
|
|
51
|
-
height: 20px;
|
|
52
|
-
display: flex;
|
|
53
|
-
justify-content: center;
|
|
54
|
-
align-items: center;
|
|
46
|
+
.sdoc-history-files-content .sdoc-history-files .file-item-img {
|
|
47
|
+
width: 21.6px;
|
|
48
|
+
margin-right: 6px;
|
|
55
49
|
}
|
|
56
50
|
|
|
57
51
|
.sdoc-history-files-content .sdoc-history-files .sdoc-history-files-item .file-item-name {
|
|
@@ -60,6 +54,15 @@
|
|
|
60
54
|
overflow: hidden;
|
|
61
55
|
}
|
|
62
56
|
|
|
57
|
+
.sdoc-history-files-content .sdoc-history-files .sdoc-history-files-item .file-item-more {
|
|
58
|
+
font-size: 16px;
|
|
59
|
+
margin-left: 2px;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.sdoc-history-files-content .sdoc-history-files .sdoc-history-files-item .more-text {
|
|
63
|
+
margin-left: 10px;
|
|
64
|
+
}
|
|
65
|
+
|
|
63
66
|
.sdoc-history-files-content .sdoc-history-files .sdoc-history-files-item:hover {
|
|
64
67
|
background-color: #f5f5f5;
|
|
65
68
|
}
|
|
@@ -22,6 +22,7 @@ var _index3 = _interopRequireDefault(require("../file-insert-dialog/index.js"));
|
|
|
22
22
|
var _index4 = _interopRequireDefault(require("../../../../components/toast/index.js"));
|
|
23
23
|
var _index5 = require("../../plugins/video/constants/index.js");
|
|
24
24
|
var _constants3 = require("../../../../basic-sdk/constants");
|
|
25
|
+
var _index6 = _interopRequireDefault(require("../../plugins/ai/ai-module/index.js"));
|
|
25
26
|
const InsertElementDialog = _ref => {
|
|
26
27
|
let {
|
|
27
28
|
editor
|
|
@@ -55,6 +56,7 @@ const InsertElementDialog = _ref => {
|
|
|
55
56
|
duration: 3
|
|
56
57
|
});
|
|
57
58
|
}, 0);
|
|
59
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
58
60
|
}, []);
|
|
59
61
|
const onVideoFileChanged = (0, _react.useCallback)(event => {
|
|
60
62
|
const files = event.target.files;
|
|
@@ -209,6 +211,14 @@ const InsertElementDialog = _ref => {
|
|
|
209
211
|
closeDialog: closeDialog
|
|
210
212
|
});
|
|
211
213
|
}
|
|
214
|
+
case _constants2.ELEMENT_TYPE.ASK_AI:
|
|
215
|
+
{
|
|
216
|
+
return /*#__PURE__*/_react.default.createElement(_index6.default, {
|
|
217
|
+
element: slateNode,
|
|
218
|
+
editor: editor,
|
|
219
|
+
closeModule: closeDialog
|
|
220
|
+
});
|
|
221
|
+
}
|
|
212
222
|
default:
|
|
213
223
|
{
|
|
214
224
|
return null;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
|
-
exports.addDataToTree = void 0;
|
|
7
|
+
exports.sdocFileIcon = exports.addDataToTree = void 0;
|
|
8
|
+
var _context = _interopRequireDefault(require("../../../../context"));
|
|
7
9
|
const addDataToTree = (treeData, indexId, childrenData, path) => {
|
|
8
10
|
for (let i = 0; i < treeData.length; i++) {
|
|
9
11
|
var _treeData$i;
|
|
@@ -21,4 +23,9 @@ const addDataToTree = (treeData, indexId, childrenData, path) => {
|
|
|
21
23
|
}
|
|
22
24
|
return treeData;
|
|
23
25
|
};
|
|
24
|
-
exports.addDataToTree = addDataToTree;
|
|
26
|
+
exports.addDataToTree = addDataToTree;
|
|
27
|
+
const sdocFileIcon = () => {
|
|
28
|
+
const server = _context.default.getSetting('serviceUrl');
|
|
29
|
+
return `${server}/media/img/file/256/sdoc.png`;
|
|
30
|
+
};
|
|
31
|
+
exports.sdocFileIcon = sdocFileIcon;
|
|
@@ -18,3 +18,118 @@
|
|
|
18
18
|
background-color: #FF8000;
|
|
19
19
|
border-color: #FF8000;
|
|
20
20
|
}
|
|
21
|
+
|
|
22
|
+
.sdoc-file-select-dialog .modal-header-container {
|
|
23
|
+
display: flex;
|
|
24
|
+
position: relative;
|
|
25
|
+
justify-content: space-between;
|
|
26
|
+
align-items: center;
|
|
27
|
+
width: 100%;
|
|
28
|
+
height: 57px;
|
|
29
|
+
padding: 16px;
|
|
30
|
+
border-bottom: 1px solid #e9ecef;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.modal-title-container {
|
|
34
|
+
flex: 0 1 auto;
|
|
35
|
+
white-space: nowrap;
|
|
36
|
+
position: relative;
|
|
37
|
+
display: flex;
|
|
38
|
+
align-items: center;
|
|
39
|
+
justify-content: center;
|
|
40
|
+
margin: auto;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.search-container {
|
|
44
|
+
display: flex;
|
|
45
|
+
flex: 1;
|
|
46
|
+
align-items: center;
|
|
47
|
+
justify-content: flex-end;
|
|
48
|
+
margin-right: 8px;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.sdoc-close-dialog {
|
|
52
|
+
display: flex;
|
|
53
|
+
align-items: center;
|
|
54
|
+
justify-content: center;
|
|
55
|
+
width: 28px;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.search-container .search-icon-container .sdoc-find-replace,
|
|
59
|
+
.modal-header-container .sdoc-close1 {
|
|
60
|
+
font-size: 16px;
|
|
61
|
+
color: #666666;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.search-container .search-icon-container .sdoc-find-replace:hover,
|
|
65
|
+
.modal-header-container .sdoc-close1:hover {
|
|
66
|
+
background-color: #EFEFEF;
|
|
67
|
+
border-radius: 3px;
|
|
68
|
+
height: 28px;
|
|
69
|
+
width: 28px;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.sdoc-files-search-popover{
|
|
73
|
+
display: flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
justify-content: center;
|
|
76
|
+
width: 28px;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.sdoc-files-search-popover-container {
|
|
80
|
+
display: flex;
|
|
81
|
+
justify-content: center;
|
|
82
|
+
align-items: center;
|
|
83
|
+
width: 200px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.sdoc-search-wrapper {
|
|
87
|
+
position: relative;
|
|
88
|
+
display: flex;
|
|
89
|
+
align-items: center;
|
|
90
|
+
width: 100%;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.sdoc-search-input {
|
|
94
|
+
flex: 1;
|
|
95
|
+
height: 28px;
|
|
96
|
+
padding: 0 25px;
|
|
97
|
+
line-height: 28px;
|
|
98
|
+
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.sdoc-search-input::placeholder {
|
|
102
|
+
color: #868E96;
|
|
103
|
+
font-size: 14px;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.sdoc-files-search-popover-container .sdoc-search-wrapper .sdoc-close,
|
|
107
|
+
.sdoc-files-search-popover-container .sdoc-search-wrapper .sdoc-search {
|
|
108
|
+
display: flex;
|
|
109
|
+
align-items: center;
|
|
110
|
+
justify-content: center;
|
|
111
|
+
width: 20px;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.sdoc-files-search-popover-container .sdoc-search-wrapper .sdoc-close1,
|
|
115
|
+
.sdoc-files-search-popover-container .sdoc-search-wrapper .sdoc-find-replace {
|
|
116
|
+
color: #666666;
|
|
117
|
+
font-size: 14px;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.sdoc-files-search-popover-container .sdoc-search-wrapper .sdoc-close1:hover {
|
|
121
|
+
background-color: #EFEFEF;
|
|
122
|
+
border-radius: 3px;
|
|
123
|
+
height: 20px;
|
|
124
|
+
width: 20px;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.sdoc-files-search-popover-container .sdoc-search-wrapper .sdoc-search {
|
|
128
|
+
position: absolute;
|
|
129
|
+
left: 4px;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.sdoc-files-search-popover-container .sdoc-search-wrapper .sdoc-close {
|
|
133
|
+
position: absolute;
|
|
134
|
+
right: 4px;
|
|
135
|
+
}
|
|
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
exports.default = void 0;
|
|
9
9
|
var _react = _interopRequireWildcard(require("react"));
|
|
10
10
|
var _reactstrap = require("reactstrap");
|
|
11
|
+
var _isHotkey = _interopRequireDefault(require("is-hotkey"));
|
|
11
12
|
var _reactI18next = require("react-i18next");
|
|
12
13
|
var _context = _interopRequireDefault(require("../../../../context"));
|
|
13
14
|
var _localFiles = _interopRequireDefault(require("./local-files"));
|
|
@@ -27,6 +28,9 @@ const SelectSdocFileDialog = _ref => {
|
|
|
27
28
|
t
|
|
28
29
|
} = (0, _reactI18next.useTranslation)();
|
|
29
30
|
const [currentSelectedFile, setCurrentSelectedFile] = (0, _react.useState)(null);
|
|
31
|
+
const [temSearchContent, setTemSearchContent] = (0, _react.useState)('');
|
|
32
|
+
const [searchContent, setSearchContent] = (0, _react.useState)('');
|
|
33
|
+
const [isOpenSearch, setIsOpenSearch] = (0, _react.useState)(false);
|
|
30
34
|
const onSelectedFile = (0, _react.useCallback)(fileInfo => {
|
|
31
35
|
setCurrentSelectedFile(fileInfo);
|
|
32
36
|
}, []);
|
|
@@ -70,24 +74,83 @@ const SelectSdocFileDialog = _ref => {
|
|
|
70
74
|
closeDialog();
|
|
71
75
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
72
76
|
}, [currentSelectedFile]);
|
|
77
|
+
const toggleSearch = (0, _react.useCallback)(() => {
|
|
78
|
+
setIsOpenSearch(prev => !prev);
|
|
79
|
+
}, []);
|
|
80
|
+
const handleSearchInputChange = (0, _react.useCallback)(e => {
|
|
81
|
+
const keyword = e.target.value.toLowerCase();
|
|
82
|
+
setTemSearchContent(keyword);
|
|
83
|
+
}, []);
|
|
84
|
+
const executeSearch = (0, _react.useCallback)(() => {
|
|
85
|
+
if (!temSearchContent.trim()) {
|
|
86
|
+
setSearchContent('');
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
setSearchContent(temSearchContent);
|
|
90
|
+
}, [temSearchContent]);
|
|
91
|
+
const handleInputKeyDown = (0, _react.useCallback)(e => {
|
|
92
|
+
if ((0, _isHotkey.default)('enter', e)) {
|
|
93
|
+
e.preventDefault();
|
|
94
|
+
executeSearch();
|
|
95
|
+
}
|
|
96
|
+
if ((0, _isHotkey.default)('escape', e)) {
|
|
97
|
+
e.preventDefault();
|
|
98
|
+
e.stopPropagation();
|
|
99
|
+
setIsOpenSearch(!isOpenSearch);
|
|
100
|
+
}
|
|
101
|
+
}, [executeSearch, isOpenSearch]);
|
|
102
|
+
(0, _react.useEffect)(() => {
|
|
103
|
+
if (!isOpenSearch) {
|
|
104
|
+
setSearchContent('');
|
|
105
|
+
}
|
|
106
|
+
}, [isOpenSearch]);
|
|
73
107
|
return /*#__PURE__*/_react.default.createElement(_reactstrap.Modal, {
|
|
74
|
-
toggle: closeDialog,
|
|
75
108
|
isOpen: true,
|
|
76
109
|
autoFocus: false,
|
|
77
110
|
zIndex: 1071,
|
|
78
111
|
returnFocusAfterClose: false,
|
|
79
112
|
className: "sdoc-file-select-dialog",
|
|
80
113
|
contentClassName: "sdoc-file-select-modal"
|
|
81
|
-
}, /*#__PURE__*/_react.default.createElement(
|
|
82
|
-
|
|
83
|
-
},
|
|
114
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
115
|
+
className: "modal-header-container"
|
|
116
|
+
}, /*#__PURE__*/_react.default.createElement("h5", {
|
|
117
|
+
className: "modal-title-container"
|
|
118
|
+
}, t(modalTitle)), /*#__PURE__*/_react.default.createElement("div", {
|
|
119
|
+
className: "search-container"
|
|
120
|
+
}, !isOpenSearch && /*#__PURE__*/_react.default.createElement("div", {
|
|
121
|
+
className: "search-icon-container"
|
|
122
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
123
|
+
className: "sdocfont sdoc-find-replace sdoc-files-search-popover",
|
|
124
|
+
onClick: toggleSearch
|
|
125
|
+
})), isOpenSearch && /*#__PURE__*/_react.default.createElement("div", {
|
|
126
|
+
className: "sdoc-files-search-popover-container"
|
|
127
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
128
|
+
className: "sdoc-search-wrapper"
|
|
129
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
130
|
+
className: "sdocfont sdoc-find-replace sdoc-search"
|
|
131
|
+
}), /*#__PURE__*/_react.default.createElement(_reactstrap.Input, {
|
|
132
|
+
autoFocus: true,
|
|
133
|
+
className: "sdoc-search-input",
|
|
134
|
+
onKeyUp: handleInputKeyDown,
|
|
135
|
+
onChange: handleSearchInputChange,
|
|
136
|
+
id: "sdoc-search",
|
|
137
|
+
placeholder: t('Search')
|
|
138
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
139
|
+
className: "sdocfont sdoc-close1 sdoc-close",
|
|
140
|
+
onClick: toggleSearch
|
|
141
|
+
})))), /*#__PURE__*/_react.default.createElement("div", {
|
|
142
|
+
className: "sdocfont sdoc-close1 sdoc-close-dialog",
|
|
143
|
+
onClick: closeDialog
|
|
144
|
+
})), /*#__PURE__*/_react.default.createElement(_reactstrap.ModalBody, {
|
|
84
145
|
className: "p-0"
|
|
85
146
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
86
147
|
className: "sdoc-file-select-container"
|
|
87
148
|
}, /*#__PURE__*/_react.default.createElement(_localFiles.default, {
|
|
88
149
|
fileType: _constants.FILE_TYPE[dialogType],
|
|
89
150
|
onSelectedFile: onSelectedFile,
|
|
90
|
-
toggle: closeDialog
|
|
151
|
+
toggle: closeDialog,
|
|
152
|
+
searchContent: searchContent,
|
|
153
|
+
isOpenSearch: isOpenSearch
|
|
91
154
|
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
92
155
|
className: "sdoc-file-select-footer"
|
|
93
156
|
}, /*#__PURE__*/_react.default.createElement(_reactstrap.Button, {
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
white-space: nowrap;
|
|
18
18
|
position: relative;
|
|
19
19
|
padding-left: 2.8rem;
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-direction: column;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
.sdoc-files-tree .sdoc-file-info:hover {
|
|
@@ -34,6 +36,12 @@
|
|
|
34
36
|
left: 0;
|
|
35
37
|
}
|
|
36
38
|
|
|
39
|
+
.sdoc-file-icon-container .sdoc-file-img {
|
|
40
|
+
position: absolute;
|
|
41
|
+
width: 21.6px;
|
|
42
|
+
right: 1px;
|
|
43
|
+
}
|
|
44
|
+
|
|
37
45
|
.sdoc-files-tree .sdoc-file-info .sdoc-file-icon {
|
|
38
46
|
color: #9aa0ac;
|
|
39
47
|
}
|
|
@@ -69,3 +77,37 @@
|
|
|
69
77
|
color: #999;
|
|
70
78
|
padding: 4px 20px;
|
|
71
79
|
}
|
|
80
|
+
|
|
81
|
+
.sdoc-files-tree .sdoc-file-info .sdoc-search-folder-name {
|
|
82
|
+
font-size: 14px;
|
|
83
|
+
color: #7d7d7d;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.sdoc-folder-container.sdoc-folder-search-results .sdoc-file-info {
|
|
87
|
+
height: 59px;
|
|
88
|
+
width: 486px;
|
|
89
|
+
padding: 10px 50px;
|
|
90
|
+
flex-direction: column;
|
|
91
|
+
justify-content: center;
|
|
92
|
+
border-radius: 2px;
|
|
93
|
+
overflow: hidden;
|
|
94
|
+
text-overflow: ellipsis;
|
|
95
|
+
white-space: nowrap;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.sdoc-folder-container.sdoc-folder-search-results .sdoc-file-info .sdoc-file-icon-container .sdoc-file-img {
|
|
99
|
+
width: 36px;
|
|
100
|
+
height: 36px;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.sdoc-folder-container.sdoc-folder-search-results .sdoc-file-name,
|
|
104
|
+
.sdoc-search-folder-name {
|
|
105
|
+
height: 19.5px;
|
|
106
|
+
display: flex;
|
|
107
|
+
align-items: center;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.sdoc-files-tree .sdoc-file-search-no-result {
|
|
111
|
+
display: flex;
|
|
112
|
+
justify-content: center;
|
|
113
|
+
}
|
|
@@ -20,12 +20,16 @@ const LocalFiles = _ref => {
|
|
|
20
20
|
onSelectedFile,
|
|
21
21
|
toggle,
|
|
22
22
|
fileType,
|
|
23
|
-
t
|
|
23
|
+
t,
|
|
24
|
+
searchContent,
|
|
25
|
+
isOpenSearch
|
|
24
26
|
} = _ref;
|
|
25
27
|
const folderRef = (0, _react.useRef)(null);
|
|
26
28
|
const [expandedFolder, setExpandedFolder] = (0, _react.useState)(new Set([]));
|
|
27
29
|
const [currentActiveItem, setCurrentActiveItem] = (0, _react.useState)(null);
|
|
28
30
|
const [treeData, setTreeData] = (0, _react.useState)([]);
|
|
31
|
+
const [hasSearchResult, setHasSearchResult] = (0, _react.useState)(false);
|
|
32
|
+
const [isCurrentLibrary, setIsCurrentLibrary] = (0, _react.useState)(false);
|
|
29
33
|
const collapsedFolder = (0, _react.useCallback)((data, indexId) => {
|
|
30
34
|
for (let i = 0; i < data.length; i++) {
|
|
31
35
|
var _data$i;
|
|
@@ -45,6 +49,8 @@ const LocalFiles = _ref => {
|
|
|
45
49
|
res.data.forEach(item => {
|
|
46
50
|
item.indexId = _slugid.default.nice();
|
|
47
51
|
});
|
|
52
|
+
setHasSearchResult(false);
|
|
53
|
+
setIsCurrentLibrary(true);
|
|
48
54
|
// Open folder
|
|
49
55
|
if (indexId && treeData.length > 0) {
|
|
50
56
|
const newFileListData = (0, _helpers.addDataToTree)(treeData, indexId, res.data, p);
|
|
@@ -64,10 +70,15 @@ const LocalFiles = _ref => {
|
|
|
64
70
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
65
71
|
}, []);
|
|
66
72
|
(0, _react.useEffect)(() => {
|
|
67
|
-
|
|
68
|
-
|
|
73
|
+
if (searchContent.trim() && isOpenSearch) {
|
|
74
|
+
getSearchFiles(searchContent, fileType);
|
|
75
|
+
}
|
|
76
|
+
if (!isOpenSearch || !searchContent.trim()) {
|
|
77
|
+
const rootPath = '/';
|
|
78
|
+
getTreeData(rootPath);
|
|
79
|
+
}
|
|
69
80
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
70
|
-
}, []);
|
|
81
|
+
}, [isOpenSearch, searchContent, isOpenSearch]);
|
|
71
82
|
const onToggle = (0, _react.useCallback)(async (e, item, treeData) => {
|
|
72
83
|
e.stopPropagation();
|
|
73
84
|
if (expandedFolder.has(item.indexId)) {
|
|
@@ -88,20 +99,40 @@ const LocalFiles = _ref => {
|
|
|
88
99
|
onSelectedFile(file);
|
|
89
100
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
90
101
|
}, []);
|
|
102
|
+
const getSearchFiles = (0, _react.useCallback)((searchContent, fileType) => {
|
|
103
|
+
return _context.default.getSearchFilesByFilename(searchContent, 1, 100, fileType).then(res => {
|
|
104
|
+
res.data.results.forEach(item => {
|
|
105
|
+
item.indexId = _slugid.default.nice();
|
|
106
|
+
item.type = 'file';
|
|
107
|
+
item.file_uuid = item.doc_uuid;
|
|
108
|
+
});
|
|
109
|
+
if (res.data.results.length === 0) {
|
|
110
|
+
setHasSearchResult(false);
|
|
111
|
+
} else {
|
|
112
|
+
setHasSearchResult(true);
|
|
113
|
+
}
|
|
114
|
+
setTreeData(res.data.results);
|
|
115
|
+
});
|
|
116
|
+
}, []);
|
|
91
117
|
const renderFileTree = (0, _react.useCallback)(data => {
|
|
92
118
|
if (!Array.isArray(data) || data.length === 0) return null;
|
|
93
119
|
return data.map(item => {
|
|
94
|
-
var _item$children, _item$children2;
|
|
120
|
+
var _item$fullpath, _item$children, _item$children2;
|
|
95
121
|
if (!item) return null;
|
|
96
122
|
const {
|
|
97
123
|
type,
|
|
98
124
|
indexId,
|
|
99
125
|
name
|
|
100
126
|
} = item;
|
|
127
|
+
const result = (_item$fullpath = item.fullpath) === null || _item$fullpath === void 0 ? void 0 : _item$fullpath.split('/').filter(Boolean);
|
|
128
|
+
item.fullpath && result.pop();
|
|
129
|
+
const folderPath = item.fullpath && result.join('/');
|
|
101
130
|
const selected = (currentActiveItem === null || currentActiveItem === void 0 ? void 0 : currentActiveItem.indexId) === indexId;
|
|
102
131
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
103
132
|
key: indexId,
|
|
104
|
-
className:
|
|
133
|
+
className: (0, _classnames.default)('sdoc-folder-container', {
|
|
134
|
+
'sdoc-folder-search-results': hasSearchResult === true
|
|
135
|
+
})
|
|
105
136
|
}, type === 'dir' && /*#__PURE__*/_react.default.createElement("div", {
|
|
106
137
|
ref: folderRef,
|
|
107
138
|
className: "sdoc-folder"
|
|
@@ -133,19 +164,25 @@ const LocalFiles = _ref => {
|
|
|
133
164
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
134
165
|
className: "sdoc-file-icon-container"
|
|
135
166
|
}, /*#__PURE__*/_react.default.createElement("i", {
|
|
136
|
-
className: (0, _classnames.default)('sdoc-file-icon
|
|
137
|
-
'sdoc-
|
|
138
|
-
}, {
|
|
139
|
-
'sdoc-link-file': fileType === 'file'
|
|
167
|
+
className: (0, _classnames.default)('sdoc-file-icon', {
|
|
168
|
+
'sdocfont sdoc-link-file': fileType === 'file'
|
|
140
169
|
})
|
|
170
|
+
}), fileType === 'sdoc' && /*#__PURE__*/_react.default.createElement("img", {
|
|
171
|
+
className: "sdoc-file-img",
|
|
172
|
+
src: (0, _helpers.sdocFileIcon)(),
|
|
173
|
+
alt: ""
|
|
141
174
|
})), /*#__PURE__*/_react.default.createElement("span", {
|
|
142
175
|
className: "sdoc-file-name"
|
|
143
|
-
}, name)
|
|
176
|
+
}, name), item.fullpath && folderPath.length !== 0 && /*#__PURE__*/_react.default.createElement("span", {
|
|
177
|
+
className: "sdoc-search-folder-name"
|
|
178
|
+
}, folderPath)));
|
|
144
179
|
});
|
|
145
180
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
146
181
|
}, [treeData, currentActiveItem, expandedFolder]);
|
|
147
182
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
148
183
|
className: "sdoc-files-tree"
|
|
149
|
-
}, renderFileTree(treeData)
|
|
184
|
+
}, renderFileTree(treeData), isOpenSearch && !hasSearchResult && !isCurrentLibrary && /*#__PURE__*/_react.default.createElement("div", {
|
|
185
|
+
className: "sdoc-file-search-no-result"
|
|
186
|
+
}, t('No_results')));
|
|
150
187
|
};
|
|
151
188
|
var _default = exports.default = (0, _reactI18next.withTranslation)('sdoc-editor')(LocalFiles);
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.WIKI_LINK = exports.VIDEO = exports.UNORDERED_LIST = exports.TWO_COLUMN = exports.TOP_LEVEL_TYPES = exports.TITLE = exports.THREE_COLUMN = exports.TABLE_ROW = exports.TABLE_CELL = exports.TABLE = exports.SUBTITLE = exports.SEATABLE_TABLE = exports.SEATABLE_COLUMN = exports.SDOC_LINK = exports.QUICK_INSERT = exports.PARAGRAPH = exports.ORDERED_LIST = exports.MULTI_COLUMN = exports.MENTION_TEMP = exports.MENTION = exports.LIST_ITEM = exports.LINK = exports.INLINE_LEVEL_TYPES = exports.IMAGE_BLOCK = exports.IMAGE = exports.HEADER6 = exports.HEADER5 = exports.HEADER4 = exports.HEADER3 = exports.HEADER2 = exports.HEADER1 = exports.HEADER = exports.FOUR_COLUMN = exports.FONT_SIZE_REDUCE = exports.FONT_SIZE_INCREASE = exports.FONT_SIZE = exports.FIVE_COLUMN = exports.FILE_LINK_INSET_INPUT_TEMP = exports.FILE_LINK = exports.COLUMN = exports.CODE_LINE = exports.CODE_BLOCK = exports.CHECK_LIST_ITEM = exports.CALL_OUT = exports.BLOCKQUOTE = void 0;
|
|
6
|
+
exports.WIKI_LINK = exports.VIDEO = exports.UNORDERED_LIST = exports.TWO_COLUMN = exports.TOP_LEVEL_TYPES = exports.TITLE = exports.THREE_COLUMN = exports.TABLE_ROW = exports.TABLE_CELL = exports.TABLE = exports.SUBTITLE = exports.SEATABLE_TABLE = exports.SEATABLE_COLUMN = exports.SDOC_LINK = exports.QUICK_INSERT = exports.PARAGRAPH = exports.ORDERED_LIST = exports.MULTI_COLUMN = exports.MENTION_TEMP = exports.MENTION = exports.LIST_ITEM = exports.LINK = exports.INLINE_LEVEL_TYPES = exports.IMAGE_BLOCK = exports.IMAGE = exports.HEADER6 = exports.HEADER5 = exports.HEADER4 = exports.HEADER3 = exports.HEADER2 = exports.HEADER1 = exports.HEADER = exports.FOUR_COLUMN = exports.FONT_SIZE_REDUCE = exports.FONT_SIZE_INCREASE = exports.FONT_SIZE = exports.FIVE_COLUMN = exports.FILE_LINK_INSET_INPUT_TEMP = exports.FILE_LINK = exports.COLUMN = exports.CODE_LINE = exports.CODE_BLOCK = exports.CHECK_LIST_ITEM = exports.CALL_OUT = exports.BLOCKQUOTE = exports.ASK_AI = void 0;
|
|
7
7
|
const BLOCKQUOTE = exports.BLOCKQUOTE = 'blockquote';
|
|
8
8
|
const TITLE = exports.TITLE = 'title';
|
|
9
9
|
const SUBTITLE = exports.SUBTITLE = 'subtitle';
|
|
@@ -44,6 +44,7 @@ const FILE_LINK_INSET_INPUT_TEMP = exports.FILE_LINK_INSET_INPUT_TEMP = 'file_li
|
|
|
44
44
|
const QUICK_INSERT = exports.QUICK_INSERT = 'quick_insert';
|
|
45
45
|
const SEATABLE_COLUMN = exports.SEATABLE_COLUMN = 'seatable_column';
|
|
46
46
|
const SEATABLE_TABLE = exports.SEATABLE_TABLE = 'seatable_table';
|
|
47
|
+
const ASK_AI = exports.ASK_AI = 'ask_ai';
|
|
47
48
|
|
|
48
49
|
// font
|
|
49
50
|
const FONT_SIZE = exports.FONT_SIZE = 'font-size';
|