@seafile/sdoc-editor 1.0.177 → 1.0.178

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.
Files changed (58) hide show
  1. package/dist/api/seafile-api.js +12 -0
  2. package/dist/basic-sdk/assets/images/sdoc-ask-ai.png +0 -0
  3. package/dist/basic-sdk/constants/index.js +2 -1
  4. package/dist/basic-sdk/extension/commons/file-insert-dialog/index.js +28 -18
  5. package/dist/basic-sdk/extension/commons/file-insert-dialog/style.css +12 -9
  6. package/dist/basic-sdk/extension/commons/insert-element-dialog/index.js +10 -0
  7. package/dist/basic-sdk/extension/commons/select-file-dialog/helpers.js +9 -2
  8. package/dist/basic-sdk/extension/commons/select-file-dialog/index.css +115 -0
  9. package/dist/basic-sdk/extension/commons/select-file-dialog/index.js +68 -5
  10. package/dist/basic-sdk/extension/commons/select-file-dialog/local-files/index.css +42 -0
  11. package/dist/basic-sdk/extension/commons/select-file-dialog/local-files/index.js +49 -12
  12. package/dist/basic-sdk/extension/constants/element-type.js +2 -1
  13. package/dist/basic-sdk/extension/constants/menus-config.js +1 -1
  14. package/dist/basic-sdk/extension/core/queries/index.js +12 -1
  15. package/dist/basic-sdk/extension/plugins/ai/ai-icon/index.js +26 -0
  16. package/dist/basic-sdk/extension/plugins/ai/ai-icon/style.css +22 -0
  17. package/dist/basic-sdk/extension/plugins/ai/ai-menu/ai-context-menu.js +39 -0
  18. package/dist/basic-sdk/extension/plugins/ai/ai-menu/ai-dropdown-menu.js +35 -0
  19. package/dist/basic-sdk/extension/plugins/ai/ai-menu/index.js +20 -0
  20. package/dist/basic-sdk/extension/plugins/ai/ai-menu/menu-item.js +62 -0
  21. package/dist/basic-sdk/extension/plugins/ai/ai-menu/style.css +3 -0
  22. package/dist/basic-sdk/extension/plugins/ai/ai-module/adjust-sub-menu.js +40 -0
  23. package/dist/basic-sdk/extension/plugins/ai/ai-module/index.js +452 -0
  24. package/dist/basic-sdk/extension/plugins/ai/ai-module/lang-sub-menu.js +55 -0
  25. package/dist/basic-sdk/extension/plugins/ai/ai-module/style.css +104 -0
  26. package/dist/basic-sdk/extension/plugins/ai/ai-module/tip-dialog.js +32 -0
  27. package/dist/basic-sdk/extension/plugins/ai/constants/index.js +128 -0
  28. package/dist/basic-sdk/extension/plugins/ai/index.js +1 -0
  29. package/dist/basic-sdk/extension/plugins/blockquote/plugin.js +2 -2
  30. package/dist/basic-sdk/extension/plugins/image/helpers.js +25 -16
  31. package/dist/basic-sdk/extension/plugins/image/hover-menu/index.js +1 -1
  32. package/dist/basic-sdk/extension/plugins/sdoc-link/helpers.js +7 -2
  33. package/dist/basic-sdk/extension/plugins/sdoc-link/render/render-elem.css +19 -3
  34. package/dist/basic-sdk/extension/plugins/sdoc-link/render/render-elem.js +8 -3
  35. package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +4 -1
  36. package/dist/basic-sdk/extension/plugins/video/helpers.js +1 -0
  37. package/dist/basic-sdk/extension/plugins/video/plugin.js +26 -1
  38. package/dist/basic-sdk/extension/toolbar/side-toolbar/index.js +7 -0
  39. package/dist/basic-sdk/extension/toolbar/side-toolbar/side-menu.js +4 -1
  40. package/dist/context.js +8 -0
  41. package/package.json +1 -1
  42. package/public/locales/cs/sdoc-editor.json +23 -1
  43. package/public/locales/de/sdoc-editor.json +23 -1
  44. package/public/locales/en/sdoc-editor.json +23 -1
  45. package/public/locales/es/sdoc-editor.json +23 -1
  46. package/public/locales/es_AR/sdoc-editor.json +23 -1
  47. package/public/locales/es_MX/sdoc-editor.json +23 -1
  48. package/public/locales/fr/sdoc-editor.json +23 -1
  49. package/public/locales/it/sdoc-editor.json +23 -1
  50. package/public/locales/ru/sdoc-editor.json +24 -2
  51. package/public/locales/zh_CN/sdoc-editor.json +23 -1
  52. package/public/media/sdoc-editor-font/iconfont.css +14 -8
  53. package/public/media/sdoc-editor-font/iconfont.eot +0 -0
  54. package/public/media/sdoc-editor-font/iconfont.svg +4 -2
  55. package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
  56. package/public/media/sdoc-editor-font/iconfont.woff +0 -0
  57. package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
  58. package/public/media/sdoc-editor-font.css +14 -10
@@ -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;
@@ -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.searchSdocFiles(searchText, 1, 10);
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
- if (newFiles.length === 0) {
169
- setHeader(t('The_document_does_not_exist'));
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 'Create_a_new_sdoc_file';
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("span", {
250
- className: "file-item-icon sdocfont sdoc-document"
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
- }, "...", t('More'))), /*#__PURE__*/_react.default.createElement("div", {
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 .sdoc-history-files-item .file-item-icon {
47
- font-size: 16px;
48
- margin-right: 8px;
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(_reactstrap.ModalHeader, {
82
- toggle: closeDialog
83
- }, t(modalTitle)), /*#__PURE__*/_react.default.createElement(_reactstrap.ModalBody, {
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
- const rootPath = '/';
68
- getTreeData(rootPath);
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: "sdoc-folder-container"
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 sdocfont', {
137
- 'sdoc-document': fileType === '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';