@seafile/sdoc-editor 1.0.162-alpha.2 → 1.0.163-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -117,13 +117,13 @@ class SeafileAPI {
117
117
  }
118
118
 
119
119
  // local files
120
- getSdocFiles(docUuid, p, type, server) {
120
+ getSdocFiles(docUuid, p, type) {
121
121
  const url = 'api/v2.1/seadoc/dir/' + docUuid + '/?p=' + p + '&type=' + type + '&doc_uuid=' + docUuid;
122
- const url2 = 'api/v2.1/seadoc/dir/' + docUuid + '/?p=' + p + '&doc_uuid=' + docUuid;
123
- // const repoID = this.getSetting('repoID');
124
- // console.log(99, url, repoID);
125
- const url3 = 'api/v2.1/repos/';
126
- return this.req.get(url3);
122
+ return this.req.get(url);
123
+ }
124
+ getSearchByFilename(docUuid, query, page, per_page, search_type) {
125
+ const url = 'api/v2.1/seadoc/search-filename/' + docUuid + '/?query=' + query + '&page=' + page + '&per_page=' + per_page + '&search_type=' + search_type;
126
+ return this.req.get(url);
127
127
  }
128
128
  getSdocFileId(docUuid, p) {
129
129
  const url = 'api/v2.1/seadoc/file-uuid/' + docUuid + '/?p=' + p;
@@ -181,6 +181,7 @@ class SeafileAPI {
181
181
 
182
182
  // notification
183
183
  listUnseenNotifications(docUuid) {
184
+ console.log(11111);
184
185
  const url = `/api/v2.1/seadoc/notifications/${docUuid}/`;
185
186
  return this.req.get(url);
186
187
  }
@@ -1,5 +1,5 @@
1
1
  .sdoc-file-select-dialog {
2
- max-width: 650px;
2
+ max-width: 520px;
3
3
  }
4
4
 
5
5
  .sdoc-file-select-dialog .sdoc-file-select-modal {
@@ -18,3 +18,71 @@
18
18
  background-color: #FF8000;
19
19
  border-color: #FF8000;
20
20
  }
21
+
22
+ .modal-header-container {
23
+ display: flex;
24
+ position: relative;
25
+ justify-content: space-between;
26
+ align-items: center;
27
+ width: 100%;
28
+ height: 60px;
29
+ padding: 10px;
30
+ }
31
+
32
+ .modal-title-container {
33
+ flex: 1;
34
+ text-align: center;
35
+ }
36
+
37
+ .search-container {
38
+ display: flex;
39
+ align-items: center;
40
+ position: absolute;
41
+ right: 40px;
42
+ top: 55%;
43
+ transform: translateY(-50%);
44
+ gap: 8px;
45
+ }
46
+
47
+ .sdoc-files-search-popover{
48
+ font-size: 14px;
49
+ padding: 1.5px 5px;
50
+ }
51
+
52
+ .sdoc-files-search-popover:hover{
53
+ background-color: #F2F2F2;
54
+ border-radius: 2px;
55
+ }
56
+
57
+ .sdoc-files-search-popover-container {
58
+ display: flex;
59
+ justify-content: center;
60
+ align-items: center;
61
+ width: 200px;
62
+ margin-right: 10px;
63
+ }
64
+
65
+ .sdoc-search-wrapper{
66
+ position: relative;
67
+ display: flex;
68
+ align-items: center;
69
+ width: 100%;
70
+ height: 40px;
71
+ }
72
+
73
+ .sdoc-search-input{
74
+ flex: 1;
75
+ padding: 0 25px;
76
+ }
77
+
78
+ .sdoc-files-search-popover-container .sdoc-search{
79
+ position: absolute;
80
+ left: 6px;
81
+ font-size: 14px;
82
+ }
83
+
84
+ .sdoc-files-search-popover-container .sdoc-close{
85
+ position: absolute;
86
+ right: 10px;
87
+ font-size: 10px;
88
+ }
@@ -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"));
@@ -15,33 +16,21 @@ var _toast = _interopRequireDefault(require("../../../../components/toast"));
15
16
  var _utils = require("../../../../utils/");
16
17
  var _constants = require("../../constants");
17
18
  require("./index.css");
18
- const LibraryOption = _ref => {
19
- let {
20
- mode,
21
- label,
22
- currentMode,
23
- onUpdateMode
24
- } = _ref;
25
- return /*#__PURE__*/_react.default.createElement("div", {
26
- className: `repo-list-item ${mode === currentMode ? 'active' : ''}`,
27
- onClick: () => onUpdateMode(mode)
28
- }, /*#__PURE__*/_react.default.createElement("span", {
29
- className: "library"
30
- }, label));
31
- };
32
- const SelectSdocFileDialog = _ref2 => {
19
+ const SelectSdocFileDialog = _ref => {
33
20
  let {
34
21
  editor,
35
22
  dialogType,
36
23
  closeDialog,
37
24
  insertLinkCallback
38
- } = _ref2;
25
+ } = _ref;
39
26
  const modalTitle = dialogType === _constants.ELEMENT_TYPE.FILE_LINK ? 'Select_file' : 'Select_sdoc_document';
40
27
  const {
41
28
  t
42
29
  } = (0, _reactI18next.useTranslation)();
43
30
  const [currentSelectedFile, setCurrentSelectedFile] = (0, _react.useState)(null);
44
- const [mode, setMode] = (0, _react.useState)('only_current_library');
31
+ const [temSearchContent, setTemSearchContent] = (0, _react.useState)('');
32
+ const [searchContent, setSearchContent] = (0, _react.useState)('');
33
+ const [isOpenSearch, setIsOpenSearch] = (0, _react.useState)(false);
45
34
  const onSelectedFile = (0, _react.useCallback)(fileInfo => {
46
35
  setCurrentSelectedFile(fileInfo);
47
36
  }, []);
@@ -85,20 +74,31 @@ const SelectSdocFileDialog = _ref2 => {
85
74
  closeDialog();
86
75
  // eslint-disable-next-line react-hooks/exhaustive-deps
87
76
  }, [currentSelectedFile]);
88
- const selectMode = mode => {
89
- // onUpdateMode(mode);
90
- if (mode === _constants.MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY) {
91
- selectRepo(currentRepo);
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
+ return;
87
+ }
88
+ setSearchContent(temSearchContent);
89
+ }, [temSearchContent]);
90
+ const handleInputKeyDown = (0, _react.useCallback)(e => {
91
+ if ((0, _isHotkey.default)('enter', e)) {
92
+ e.preventDefault();
93
+ executeSearch();
94
+ }
95
+ if ((0, _isHotkey.default)('escape', e)) {
96
+ e.preventDefault();
97
+ e.stopPropagation();
98
+ setIsOpenSearch(!isOpenSearch);
92
99
  }
93
- // } else if (mode === MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES) {
94
- // selectRepo(repoList[0]);
95
- // } else if (mode === MODE_TYPE_MAP.RECENTLY_USED) {
96
- // selectRepo(null);
97
- // }
98
- // setSelectedPath('/');
99
- };
100
+ }, [executeSearch, isOpenSearch]);
100
101
  return /*#__PURE__*/_react.default.createElement(_reactstrap.Modal, {
101
- scrollable: true,
102
102
  toggle: closeDialog,
103
103
  isOpen: true,
104
104
  autoFocus: false,
@@ -107,31 +107,41 @@ const SelectSdocFileDialog = _ref2 => {
107
107
  className: "sdoc-file-select-dialog",
108
108
  contentClassName: "sdoc-file-select-modal"
109
109
  }, /*#__PURE__*/_react.default.createElement(_reactstrap.ModalHeader, {
110
+ className: "modal-header-container",
110
111
  toggle: closeDialog
111
- }, t(modalTitle)), /*#__PURE__*/_react.default.createElement(_reactstrap.ModalBody, {
112
+ }, /*#__PURE__*/_react.default.createElement("div", {
113
+ className: "modal-title-container"
114
+ }, t(modalTitle)), /*#__PURE__*/_react.default.createElement("div", {
115
+ className: "search-container"
116
+ }, !isOpenSearch && /*#__PURE__*/_react.default.createElement("div", {
117
+ className: "sdocfont sdoc-find-replace sdoc-files-search-popover",
118
+ onClick: toggleSearch
119
+ }), isOpenSearch && /*#__PURE__*/_react.default.createElement("div", {
120
+ className: "sdoc-files-search-popover-container"
121
+ }, /*#__PURE__*/_react.default.createElement("div", {
122
+ className: "sdoc-search-wrapper"
123
+ }, /*#__PURE__*/_react.default.createElement("div", {
124
+ className: "sdocfont sdoc-find-replace sdoc-search",
125
+ onClick: executeSearch
126
+ }), /*#__PURE__*/_react.default.createElement(_reactstrap.Input, {
127
+ autoFocus: true,
128
+ className: "sdoc-search-input",
129
+ onKeyUp: handleInputKeyDown,
130
+ onChange: handleSearchInputChange,
131
+ id: "sdoc-search",
132
+ placeholder: t('Search')
133
+ }), /*#__PURE__*/_react.default.createElement("div", {
134
+ className: "sdocfont sdoc-sm-close sdoc-close",
135
+ onClick: toggleSearch
136
+ }))))), /*#__PURE__*/_react.default.createElement(_reactstrap.ModalBody, {
112
137
  className: "p-0"
113
- }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", null, "left column"), /*#__PURE__*/_react.default.createElement(LibraryOption, {
114
- mode: _constants.MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY,
115
- label: t('Current Library'),
116
- currentMode: mode,
117
- onUpdateMode: selectMode
118
- }), true && /*#__PURE__*/_react.default.createElement(LibraryOption, {
119
- mode: _constants.MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES,
120
- label: t('Other Libraries'),
121
- currentMode: mode,
122
- onUpdateMode: selectMode
123
- }), /*#__PURE__*/_react.default.createElement(LibraryOption, {
124
- mode: _constants.MODE_TYPE_MAP.RECENTLY_USED,
125
- label: t('Recently Used')
126
- // currentMode={mode}
127
- ,
128
- onUpdateMode: selectMode
129
- })), /*#__PURE__*/_react.default.createElement("div", {
138
+ }, /*#__PURE__*/_react.default.createElement("div", {
130
139
  className: "sdoc-file-select-container"
131
140
  }, /*#__PURE__*/_react.default.createElement(_localFiles.default, {
132
141
  fileType: _constants.FILE_TYPE[dialogType],
133
142
  onSelectedFile: onSelectedFile,
134
- toggle: closeDialog
143
+ toggle: closeDialog,
144
+ searchContent: searchContent
135
145
  }), /*#__PURE__*/_react.default.createElement("div", {
136
146
  className: "sdoc-file-select-footer"
137
147
  }, /*#__PURE__*/_react.default.createElement(_reactstrap.Button, {
@@ -20,7 +20,8 @@ const LocalFiles = _ref => {
20
20
  onSelectedFile,
21
21
  toggle,
22
22
  fileType,
23
- t
23
+ t,
24
+ searchContent
24
25
  } = _ref;
25
26
  const folderRef = (0, _react.useRef)(null);
26
27
  const [expandedFolder, setExpandedFolder] = (0, _react.useState)(new Set([]));
@@ -41,12 +42,13 @@ const LocalFiles = _ref => {
41
42
  // eslint-disable-next-line react-hooks/exhaustive-deps
42
43
  }, []);
43
44
  const getTreeData = (0, _react.useCallback)((p, indexId, treeData) => {
44
- return _context.default.getSdocLocalFiles(p, fileType).then(res => {
45
+ // return context.getSdocLocalFiles(p, fileType).then(res => {
46
+ return _context.default.getSearchFilesByFilename('10', '1', '10', 'sdoc').then(res => {
45
47
  res.data.forEach(item => {
46
48
  item.indexId = _slugid.default.nice();
47
49
  });
48
50
  // Open folder
49
- console.log(3, res.data);
51
+ // console.log(3, res.data);
50
52
  if (indexId && treeData.length > 0) {
51
53
  const newFileListData = (0, _helpers.addDataToTree)(treeData, indexId, res.data, p);
52
54
  setTreeData([...newFileListData]);
@@ -70,6 +72,7 @@ const LocalFiles = _ref => {
70
72
  // eslint-disable-next-line react-hooks/exhaustive-deps
71
73
  }, []);
72
74
  const onToggle = (0, _react.useCallback)(async (e, item, treeData) => {
75
+ // console.log(2, e, item, treeData);
73
76
  e.stopPropagation();
74
77
  if (expandedFolder.has(item.indexId)) {
75
78
  collapsedFolder(treeData, item.indexId);
@@ -89,6 +92,37 @@ const LocalFiles = _ref => {
89
92
  onSelectedFile(file);
90
93
  // eslint-disable-next-line react-hooks/exhaustive-deps
91
94
  }, []);
95
+ const [filteredTreeData, setFilteredTreeData] = (0, _react.useState)([]);
96
+ (0, _react.useEffect)(() => {
97
+ const filterFiles = async data => {
98
+ const results = [];
99
+ for (const item of data) {
100
+ if (item.type === 'file' && item.name.includes(searchContent)) {
101
+ results.push(item);
102
+ } else if (item.type === 'dir') {
103
+ console.log(33, item);
104
+ const children = item.children || (await getTreeData(item.path, item.indexId, treeData));
105
+ if (children && Array.isArray(children)) {
106
+ const childResults = await filterFiles(children);
107
+ results.push({
108
+ ...item,
109
+ children: childResults
110
+ });
111
+ }
112
+ }
113
+ }
114
+ return results;
115
+ };
116
+ const updateFilteredData = async () => {
117
+ if (!searchContent.trim()) {
118
+ setFilteredTreeData(treeData);
119
+ } else {
120
+ const filtered = await filterFiles(treeData);
121
+ setFilteredTreeData(filtered);
122
+ }
123
+ };
124
+ updateFilteredData();
125
+ }, [searchContent, treeData]);
92
126
  const renderFileTree = (0, _react.useCallback)(data => {
93
127
  // console.log(2, data);
94
128
  if (!Array.isArray(data) || data.length === 0) return null;
@@ -100,6 +134,7 @@ const LocalFiles = _ref => {
100
134
  indexId,
101
135
  name
102
136
  } = item;
137
+ // console.log(12, data, type, indexId, name);
103
138
  const selected = (currentActiveItem === null || currentActiveItem === void 0 ? void 0 : currentActiveItem.indexId) === indexId;
104
139
  return /*#__PURE__*/_react.default.createElement("div", {
105
140
  key: indexId,
@@ -148,6 +183,6 @@ const LocalFiles = _ref => {
148
183
  }, [treeData, currentActiveItem, expandedFolder]);
149
184
  return /*#__PURE__*/_react.default.createElement("div", {
150
185
  className: "sdoc-files-tree"
151
- }, renderFileTree(treeData));
186
+ }, renderFileTree(filteredTreeData));
152
187
  };
153
188
  var _default = exports.default = (0, _reactI18next.withTranslation)('sdoc-editor')(LocalFiles);
@@ -263,7 +263,7 @@ Object.defineProperty(exports, "MENUS_CONFIG_MAP", {
263
263
  return _menusConfig.MENUS_CONFIG_MAP;
264
264
  }
265
265
  });
266
- exports.MOUSE_ENTER_EVENT_DISABLED_MAP = exports.MODE_TYPE_MAP = void 0;
266
+ exports.MOUSE_ENTER_EVENT_DISABLED_MAP = void 0;
267
267
  Object.defineProperty(exports, "MULTI_COLUMN", {
268
268
  enumerable: true,
269
269
  get: function () {
@@ -520,14 +520,6 @@ const INSERT_POSITION = exports.INSERT_POSITION = {
520
520
  };
521
521
  const LOCAL_IMAGE = exports.LOCAL_IMAGE = 'local-image';
522
522
  const LOCAL_VIDEO = exports.LOCAL_VIDEO = 'local-video';
523
- const MODE_TYPE_MAP = exports.MODE_TYPE_MAP = {
524
- CURRENT_AND_OTHER_REPOS: 'current_repo_and_other_repos',
525
- ONLY_CURRENT_LIBRARY: 'only_current_library',
526
- ONLY_ALL_REPOS: 'only_all_repos',
527
- ONLY_OTHER_LIBRARIES: 'only_other_libraries',
528
- RECENTLY_USED: 'recently_used',
529
- SEARCH_RESULTS: 'search_results'
530
- };
531
523
  const LIST_TYPE_ARRAY = exports.LIST_TYPE_ARRAY = [_elementType.UNORDERED_LIST, _elementType.ORDERED_LIST];
532
524
  const LIST_ITEM_CORRELATION_TYPE = exports.LIST_ITEM_CORRELATION_TYPE = [_elementType.UNORDERED_LIST, _elementType.ORDERED_LIST, _elementType.LIST_ITEM];
533
525
  const LIST_ITEM_SUPPORTED_TRANSFORMATION = exports.LIST_ITEM_SUPPORTED_TRANSFORMATION = [_elementType.UNORDERED_LIST, _elementType.ORDERED_LIST, 'left', 'center', 'right', _elementType.BLOCKQUOTE];
@@ -113,7 +113,9 @@ class Link extends _react.default.Component {
113
113
  className: className
114
114
  }, attributes), /*#__PURE__*/_react.default.createElement("a", {
115
115
  href: element.href,
116
- title: element.title
116
+ title: element.title,
117
+ target: "_blank",
118
+ rel: "noreferrer"
117
119
  }, children));
118
120
  }
119
121
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", Object.assign({
package/dist/context.js CHANGED
@@ -62,8 +62,8 @@ class Context {
62
62
  this.initSettings(); // lazy init context class
63
63
  const server = this.getSetting('serviceUrl');
64
64
  const token = this.getSetting('accessToken');
65
- // console.log(2, server, token)
66
65
  this.api = new _seafileApi.default(server, token);
66
+ console.log(2, server, token, this.api);
67
67
  const isOpenSocket = this.getSetting('isOpenSocket');
68
68
  if (isOpenSocket) {
69
69
  this.sdocServerApi = new _sdocServerApi.default(this.settings);
@@ -201,10 +201,12 @@ class Context {
201
201
  getSdocLocalFiles(p, type) {
202
202
  const docUuid = this.getSetting('docUuid');
203
203
  const repoID = this.getSetting('repoID');
204
- console.log(100, docUuid, repoID);
205
- console.log(100, p, type, docUuid);
206
204
  return this.api.getSdocFiles(docUuid, p, type, this.server);
207
205
  }
206
+ getSearchFilesByFilename(query, page, per_page, search_type) {
207
+ const docUuid = this.getSetting('docUuid');
208
+ return this.api.getSearchByFilename(docUuid, query, page, per_page, search_type);
209
+ }
208
210
  listRepos(options) {
209
211
  /*
210
212
  * options: `{type: 'shared'}`, `{type: ['mine', 'shared', ...]}`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "1.0.162-alpha.2",
3
+ "version": "1.0.163-alpha.1",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",