@seafile/sdoc-editor 2.0.182 → 2.0.184

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.
@@ -305,6 +305,12 @@ var SeafileAPI = /*#__PURE__*/function () {
305
305
  var url = "/api/v2.1/seadoc/access-token-by-uuid/".concat(docUuid, "/");
306
306
  return this.req.get(url);
307
307
  }
308
+ }, {
309
+ key: "getFileMetadataInfo",
310
+ value: function getFileMetadataInfo(docUuid, fileType) {
311
+ var url = '/api/v2.1/seadoc/search-metadata-records/' + docUuid + '/?search_type=' + fileType;
312
+ return this.req.get(url);
313
+ }
308
314
  }]);
309
315
  }();
310
316
  var _default = exports["default"] = SeafileAPI;
@@ -11,22 +11,54 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
11
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
  var _reactI18next = require("react-i18next");
14
+ var _reactstrap = require("reactstrap");
14
15
  var _tooltip = _interopRequireDefault(require("../../../components/tooltip"));
15
16
  var _constants = require("../../../constants");
16
17
  var _context2 = _interopRequireDefault(require("../../../context"));
17
18
  var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
18
19
  var _mouseEvent = require("../../../utils/mouse-event");
19
- var GlobalCommentHeader = function GlobalCommentHeader(_ref) {
20
- var toggle = _ref.toggle,
21
- activeCommentGroup = _ref.activeCommentGroup,
22
- setCurrentCommentGroup = _ref.setCurrentCommentGroup;
20
+ var _constants2 = require("../../constants");
21
+ var CommentTypeDropdownItem = function CommentTypeDropdownItem(_ref) {
22
+ var type = _ref.type,
23
+ setCommentType = _ref.setCommentType,
24
+ commentType = _ref.commentType;
23
25
  var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
24
26
  t = _useTranslation.t;
27
+ var handleCommentTypeChanged = (0, _react.useCallback)(function (event, type) {
28
+ (0, _mouseEvent.eventStopPropagation)(event);
29
+ setCommentType(type);
30
+
31
+ // eslint-disable-next-line react-hooks/exhaustive-deps
32
+ }, []);
33
+ var isSelected = commentType === type;
34
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownItem, {
35
+ className: "sdoc-dropdown-menu-item",
36
+ tag: 'div',
37
+ onClick: function onClick(event) {
38
+ return handleCommentTypeChanged(event, type);
39
+ }
40
+ }, isSelected && /*#__PURE__*/_react["default"].createElement("i", {
41
+ className: "sdoc-file-checked sdocfont sdoc-check-mark"
42
+ }), t(type));
43
+ };
44
+ var GlobalCommentHeader = function GlobalCommentHeader(_ref2) {
45
+ var toggle = _ref2.toggle,
46
+ activeCommentGroup = _ref2.activeCommentGroup,
47
+ setCurrentCommentGroup = _ref2.setCurrentCommentGroup,
48
+ commentType = _ref2.commentType,
49
+ setCommentType = _ref2.setCommentType,
50
+ commentList = _ref2.commentList;
51
+ var _useTranslation2 = (0, _reactI18next.useTranslation)('sdoc-editor'),
52
+ t = _useTranslation2.t;
25
53
  var panelHeaderRef = (0, _react.useRef)(null);
26
54
  var _useState = (0, _react.useState)(false),
27
55
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
28
56
  isMounted = _useState2[0],
29
57
  setIsMounted = _useState2[1];
58
+ var _useState3 = (0, _react.useState)(false),
59
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
60
+ isDropdownOpen = _useState4[0],
61
+ setDropdownOpen = _useState4[1];
30
62
  (0, _react.useEffect)(function () {
31
63
  if (panelHeaderRef.current) {
32
64
  setIsMounted(true);
@@ -37,7 +69,7 @@ var GlobalCommentHeader = function GlobalCommentHeader(_ref) {
37
69
  setCurrentCommentGroup(null);
38
70
  }, [setCurrentCommentGroup]);
39
71
  var toggleReadAll = (0, _react.useCallback)(/*#__PURE__*/function () {
40
- var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regenerator2["default"])().m(function _callee(event) {
72
+ var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regenerator2["default"])().m(function _callee(event) {
41
73
  var res, notifications, eventBus, _t;
42
74
  return (0, _regenerator2["default"])().w(function (_context) {
43
75
  while (1) switch (_context.p = _context.n) {
@@ -67,7 +99,7 @@ var GlobalCommentHeader = function GlobalCommentHeader(_ref) {
67
99
  }, _callee, null, [[1, 4]]);
68
100
  }));
69
101
  return function (_x) {
70
- return _ref2.apply(this, arguments);
102
+ return _ref3.apply(this, arguments);
71
103
  };
72
104
  }(), []);
73
105
  return /*#__PURE__*/_react["default"].createElement("div", {
@@ -84,10 +116,40 @@ var GlobalCommentHeader = function GlobalCommentHeader(_ref) {
84
116
  }
85
117
  })), /*#__PURE__*/_react["default"].createElement("span", {
86
118
  className: "title"
87
- }, activeCommentGroup ? t('Comment_details') : t('Comments'))), /*#__PURE__*/_react["default"].createElement("div", {
119
+ }, activeCommentGroup ? t('Comment_details') : "".concat(t(commentType)).concat(commentList.length > 0 ? " (".concat(commentList.length, ")") : ''))), /*#__PURE__*/_react["default"].createElement("div", {
88
120
  ref: panelHeaderRef,
89
121
  className: "comments-panel-header-right"
90
122
  }, !activeCommentGroup && /*#__PURE__*/_react["default"].createElement("div", {
123
+ id: "comment-types",
124
+ className: "sdoc-icon-btn",
125
+ onClick: function onClick() {
126
+ return setDropdownOpen(!isDropdownOpen);
127
+ }
128
+ }, /*#__PURE__*/_react["default"].createElement("i", {
129
+ className: "sdocfont sdoc-filter1"
130
+ }), isMounted && /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
131
+ target: "comment-types"
132
+ }, t('Comment_filter')), /*#__PURE__*/_react["default"].createElement(_reactstrap.Dropdown, {
133
+ isOpen: isDropdownOpen,
134
+ toggle: function toggle() {
135
+ return setDropdownOpen(!isDropdownOpen);
136
+ }
137
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownMenu, {
138
+ className: "sdoc-dropdown-menu sdoc-comment-filter-dropdown",
139
+ container: "comment-types"
140
+ }, /*#__PURE__*/_react["default"].createElement(CommentTypeDropdownItem, {
141
+ type: _constants2.COMMENT_TYPES.ALL,
142
+ setCommentType: setCommentType,
143
+ commentType: commentType
144
+ }), /*#__PURE__*/_react["default"].createElement(CommentTypeDropdownItem, {
145
+ type: _constants2.COMMENT_TYPES.RESOLVED,
146
+ setCommentType: setCommentType,
147
+ commentType: commentType
148
+ }), /*#__PURE__*/_react["default"].createElement(CommentTypeDropdownItem, {
149
+ type: _constants2.COMMENT_TYPES.UNRESOLVED,
150
+ setCommentType: setCommentType,
151
+ commentType: commentType
152
+ })))), !activeCommentGroup && /*#__PURE__*/_react["default"].createElement("div", {
91
153
  id: "sdoc-read-all-btn",
92
154
  className: "sdoc-icon-btn",
93
155
  onClick: toggleReadAll
@@ -64,6 +64,26 @@
64
64
  display: flex;
65
65
  }
66
66
 
67
+ .comments-panel-header-right .sdoc-comment-filter-dropdown {
68
+ position: absolute;
69
+ right: 72px;
70
+ top: 36px !important;
71
+ left: unset !important;
72
+ box-shadow: 0 4px 10px #eee;
73
+ }
74
+
75
+ .comments-panel-header-right .sdoc-dropdown-menu-item {
76
+ position: relative;
77
+ }
78
+
79
+ .comments-panel-header-right .sdoc-file-checked {
80
+ position: absolute;
81
+ left: 7px;
82
+ color: #798d99;
83
+ font-size: 12px;
84
+ font-weight: 400;
85
+ }
86
+
67
87
  .sdoc-comment-drawer .comments-panel-header-right .sdoc-icon-btn:not(:last-child) {
68
88
  margin-right: 4px;
69
89
  }
@@ -22,7 +22,6 @@ var _constants = require("../../constants");
22
22
  var _useCommentList2 = _interopRequireDefault(require("../../hooks/comment-hooks/use-comment-list"));
23
23
  var _commentItemCollapseWrapper = _interopRequireDefault(require("../comment-item-collapse-wrapper"));
24
24
  var _commentItemWrapper = _interopRequireDefault(require("../comment-item-wrapper"));
25
- var _globalCommentBodyHeader = _interopRequireDefault(require("./global-comment-body-header"));
26
25
  var _globalCommentEditor = _interopRequireDefault(require("./global-comment-editor"));
27
26
  var _globalCommentHeader = _interopRequireDefault(require("./global-comment-header"));
28
27
  require("./index.css");
@@ -190,14 +189,13 @@ var GlobalComment = function GlobalComment(_ref) {
190
189
  }, /*#__PURE__*/_react["default"].createElement(_globalCommentHeader["default"], {
191
190
  toggle: closePlugin,
192
191
  activeCommentGroup: activeCommentGroup,
193
- setCurrentCommentGroup: setCurrentCommentGroup
194
- }), /*#__PURE__*/_react["default"].createElement("div", {
195
- className: "comments-panel-body"
196
- }, !activeCommentGroup && /*#__PURE__*/_react["default"].createElement(_globalCommentBodyHeader["default"], {
197
- commentList: commentList,
192
+ setCurrentCommentGroup: setCurrentCommentGroup,
198
193
  commentType: commentType,
199
- setCommentType: setCommentType
194
+ setCommentType: setCommentType,
195
+ commentList: commentList
200
196
  }), /*#__PURE__*/_react["default"].createElement("div", {
197
+ className: "comments-panel-body"
198
+ }, /*#__PURE__*/_react["default"].createElement("div", {
201
199
  ref: contentRef,
202
200
  className: "comments-panel-body__content"
203
201
  }, /*#__PURE__*/_react["default"].createElement("div", {
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.UP = exports.POPOVER_ADDING_HEIGHT = exports.LINE_HEIGHT = exports.FONT_SIZE_WIDTH = exports.DOWN = exports.DOC_NOTIFICATION_REDUCER_TYPE = exports.DOC_COMMENT_ELEMENT_ID = exports.COMMENT_URL_CLASSNAME = exports.COMMENT_TYPES = void 0;
7
7
  var COMMENT_TYPES = exports.COMMENT_TYPES = {
8
- DOC: 'Doc_comments',
9
8
  ALL: 'All_comments',
10
9
  RESOLVED: 'Resolved_comments',
11
10
  UNRESOLVED: 'Unresolved_comments'
@@ -42,11 +42,6 @@ var useCommentList = function useCommentList() {
42
42
  return !item.resolved;
43
43
  });
44
44
  setCommentList(_commentList3);
45
- } else if (commentType === _constants.COMMENT_TYPES.DOC) {
46
- var _commentList4 = comment_list.filter(function (comment) {
47
- return comment.detail.element_id === _constants.DOC_COMMENT_ELEMENT_ID;
48
- });
49
- setCommentList(_commentList4);
50
45
  }
51
46
  }, [commentType, comment_list]);
52
47
  return {
@@ -77,7 +77,8 @@ var INTERNAL_EVENT = exports.INTERNAL_EVENT = {
77
77
  IMAGE_COLUMN_TOGGLE: 'Image_column_toggle',
78
78
  CREATE_WHITEBOARD_FILE: 'create_whiteboard_file',
79
79
  GENERATE_EXDRAW_READ_ONLY_LINK: 'generate_exdraw_read_only_link',
80
- TRANSFER_PREVIEW_FILE_ID: 'transfer_preview_file_id'
80
+ TRANSFER_PREVIEW_FILE_ID: 'transfer_preview_file_id',
81
+ FILE_METADATA_COMPONENT: 'file_metadata_component'
81
82
  };
82
83
  var PAGE_EDIT_AREA_WIDTH = exports.PAGE_EDIT_AREA_WIDTH = 672; // 672 = 794 - 2[borderLeft + borderRight] - 120[paddingLeft + paddingRight]
83
84
  var COMMENT_EDITOR_EDIT_AREA_WIDTH = exports.COMMENT_EDITOR_EDIT_AREA_WIDTH = 364;
package/dist/context.js CHANGED
@@ -384,6 +384,12 @@ var Context = /*#__PURE__*/function () {
384
384
  value: function getTokenByDocUuid(docUuid) {
385
385
  return this.api.getTokenByDocUuid(docUuid);
386
386
  }
387
+ }, {
388
+ key: "getFileMetadataInfo",
389
+ value: function getFileMetadataInfo(fileType) {
390
+ var docUuid = this.getDocUuid();
391
+ return this.api.getFileMetadataInfo(docUuid, fileType);
392
+ }
387
393
  }]);
388
394
  }();
389
395
  var context = new Context();
@@ -1,9 +1,9 @@
1
1
  .sdoc-file-select-dialog {
2
- max-width: 520px;
2
+ max-width: 700px;
3
3
  }
4
4
 
5
5
  .sdoc-file-select-dialog .sdoc-file-select-modal {
6
- width: 520px;
6
+ width: 700px;
7
7
  }
8
8
 
9
9
  .sdoc-file-select-dialog .sdoc-file-select-footer {
@@ -37,7 +37,7 @@
37
37
  display: flex;
38
38
  align-items: center;
39
39
  justify-content: center;
40
- margin: auto;
40
+ margin: auto 0;
41
41
  }
42
42
 
43
43
  .search-container {
@@ -78,13 +78,6 @@
78
78
  cursor: pointer;
79
79
  }
80
80
 
81
- .sdoc-files-search-popover-container {
82
- display: flex;
83
- justify-content: center;
84
- align-items: center;
85
- width: 200px;
86
- }
87
-
88
81
  .sdoc-search-wrapper {
89
82
  position: relative;
90
83
  display: flex;
@@ -94,10 +87,9 @@
94
87
 
95
88
  .sdoc-search-input {
96
89
  flex: 1;
97
- height: 28px;
98
- padding: 0 25px;
90
+ height: 38px;
91
+ padding: 0 35px;
99
92
  line-height: 28px;
100
-
101
93
  }
102
94
 
103
95
  .sdoc-search-input::placeholder {
@@ -128,10 +120,68 @@
128
120
 
129
121
  .sdoc-files-search-popover-container .sdoc-search-wrapper .sdoc-search {
130
122
  position: absolute;
131
- left: 4px;
123
+ left: 10px;
132
124
  }
133
125
 
134
126
  .sdoc-files-search-popover-container .sdoc-search-wrapper .sdoc-close {
135
127
  position: absolute;
136
- right: 4px;
128
+ right: 9px;
129
+ }
130
+
131
+ .sdoc-file-select-container .sdoc-file-select-wrapper {
132
+ display: flex;
133
+ }
134
+
135
+ .sdoc-file-select-wrapper .sdoc-file-metadata-wrapper {
136
+ display: flex;
137
+ }
138
+
139
+ .sdoc-file-left-panel {
140
+ width: 100%;
141
+ }
142
+
143
+ .sdoc-file-left-panel .sdoc-files-search-popover-container {
144
+ padding: 8px 16px 0 16px;
145
+ display: flex;
146
+ justify-content: center;
147
+ align-items: center;
148
+ width: 100%;
149
+ }
150
+
151
+ .modal-header-container .modal-operation-container {
152
+ display: flex;
153
+ align-items: center;
154
+ }
155
+
156
+ .toggle-view {
157
+ display: flex;
158
+ margin-right: 0.5rem;
159
+ border: 1px solid #eee;
160
+ border-radius: 3px;
161
+ height: 36px;
162
+ padding: 3px;
163
+ }
164
+
165
+ .toggle-view-container {
166
+ display: flex;
167
+ }
168
+
169
+ .toggle-view .sdoc-tree-view,
170
+ .toggle-view .sdoc-list-view {
171
+ min-width: 66px;
172
+ width: fit-content;
173
+ border-radius: 2px;
174
+ display: flex;
175
+ justify-content: center;
176
+ align-items: center;
177
+ }
178
+
179
+ .toggle-view .sdoc-tree-view.active,
180
+ .toggle-view .sdoc-list-view.active {
181
+ background-color: #f5f5f5;
182
+ }
183
+
184
+ .toggle-view .sdoc-tree-view:hover,
185
+ .toggle-view .sdoc-list-view:hover {
186
+ background-color: #f0f0f0;
137
187
  }
@@ -11,12 +11,17 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
  var _reactI18next = require("react-i18next");
13
13
  var _reactstrap = require("reactstrap");
14
+ var _classnames = _interopRequireDefault(require("classnames"));
14
15
  var _isHotkey = _interopRequireDefault(require("is-hotkey"));
15
16
  var _toast = _interopRequireDefault(require("../../../components/toast"));
17
+ var _constants = require("../../../constants");
16
18
  var _context = _interopRequireDefault(require("../../../context"));
19
+ var _useCollaborators = require("../../../hooks/use-collaborators");
17
20
  var _commonUtils = require("../../../utils/common-utils");
18
- var _constants = require("../../constants");
19
- var _localFiles = _interopRequireDefault(require("./local-files"));
21
+ var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
22
+ var _constants2 = require("../../constants");
23
+ var _listView = _interopRequireDefault(require("./list-view"));
24
+ var _treeView = _interopRequireDefault(require("./tree-view"));
20
25
  require("./index.css");
21
26
  var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
22
27
  var editor = _ref.editor,
@@ -43,18 +48,29 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
43
48
  _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
44
49
  isOpenSearch = _useState8[0],
45
50
  setIsOpenSearch = _useState8[1];
51
+ var _useState9 = (0, _react.useState)(null),
52
+ _useState0 = (0, _slicedToArray2["default"])(_useState9, 2),
53
+ FileMetadataComponent = _useState0[0],
54
+ setFileMetadataComponent = _useState0[1];
55
+ var _useState1 = (0, _react.useState)(true),
56
+ _useState10 = (0, _slicedToArray2["default"])(_useState1, 2),
57
+ isTreeView = _useState10[0],
58
+ setIsTreeView = _useState10[1];
59
+ var searchRef = (0, _react.useRef)(null);
60
+ var repoID = _context["default"].getSetting('repoID');
61
+ var enableMetadata = _context["default"].getSetting('enableMetadata');
46
62
  var modalTitle;
47
63
  switch (dialogType) {
48
- case _constants.ELEMENT_TYPE.FILE_LINK:
64
+ case _constants2.ELEMENT_TYPE.FILE_LINK:
49
65
  modalTitle = 'Select_file';
50
66
  break;
51
- case _constants.ELEMENT_TYPE.SDOC_LINK:
67
+ case _constants2.ELEMENT_TYPE.SDOC_LINK:
52
68
  modalTitle = 'Select_sdoc_document';
53
69
  break;
54
- case _constants.ELEMENT_TYPE.VIDEO:
70
+ case _constants2.ELEMENT_TYPE.VIDEO:
55
71
  modalTitle = 'Select_video_file';
56
72
  break;
57
- case _constants.ELEMENT_TYPE.WHITEBOARD:
73
+ case _constants2.ELEMENT_TYPE.WHITEBOARD:
58
74
  modalTitle = 'Link_Excalidraw_file';
59
75
  break;
60
76
  default:
@@ -72,23 +88,23 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
72
88
  var _ref4 = insertWhiteboardFile || {},
73
89
  insertWhiteboard = _ref4.insertWhiteboard;
74
90
  switch (dialogType) {
75
- case _constants.ELEMENT_TYPE.FILE_LINK:
91
+ case _constants2.ELEMENT_TYPE.FILE_LINK:
76
92
  insertFileLinkCallback && insertFileLinkCallback(editor, fileInfo.name, fileInfo.file_uuid);
77
93
  break;
78
- case _constants.ELEMENT_TYPE.SDOC_LINK:
94
+ case _constants2.ELEMENT_TYPE.SDOC_LINK:
79
95
  insertSdocFileLinkCallback && insertSdocFileLinkCallback(editor, fileInfo.name, fileInfo.file_uuid);
80
96
  break;
81
- case _constants.ELEMENT_TYPE.VIDEO:
82
- var repoID = _context["default"].getSetting('repoID');
97
+ case _constants2.ELEMENT_TYPE.VIDEO:
98
+ var _repoID = _context["default"].getSetting('repoID');
83
99
  var fileServerRoot = _context["default"].getSetting('fileServerRoot');
84
100
  // Get seafile's video download url as src
85
- var url = "".concat(fileServerRoot, "repos/").concat(repoID, "/files").concat(fileInfo.path, "/?op=download");
101
+ var url = "".concat(fileServerRoot, "repos/").concat(_repoID, "/files").concat(fileInfo.path, "/?op=download");
86
102
  var encodedUrl = encodeURI(url);
87
103
  insertVideo && insertVideo(editor, [{
88
104
  name: fileInfo.name
89
105
  }], [encodedUrl]);
90
106
  break;
91
- case _constants.ELEMENT_TYPE.WHITEBOARD:
107
+ case _constants2.ELEMENT_TYPE.WHITEBOARD:
92
108
  insertWhiteboard && insertWhiteboard(editor, fileInfo.name, fileInfo.path);
93
109
  break;
94
110
  default:
@@ -101,14 +117,14 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
101
117
  var fileInfo = (0, _objectSpread2["default"])({}, currentSelectedFile);
102
118
 
103
119
  // Insert video element in sdoc
104
- if (dialogType === _constants.ELEMENT_TYPE.VIDEO) {
120
+ if (dialogType === _constants2.ELEMENT_TYPE.VIDEO) {
105
121
  insertFile(fileInfo);
106
122
  closeDialog();
107
123
  return;
108
124
  }
109
125
 
110
126
  // Insert whiteboard file in sdoc
111
- if (dialogType === _constants.ELEMENT_TYPE.WHITEBOARD) {
127
+ if (dialogType === _constants2.ELEMENT_TYPE.WHITEBOARD) {
112
128
  insertFile(fileInfo);
113
129
  closeDialog();
114
130
  return;
@@ -134,11 +150,6 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
134
150
  closeDialog();
135
151
  // eslint-disable-next-line react-hooks/exhaustive-deps
136
152
  }, [currentSelectedFile]);
137
- var toggleSearch = (0, _react.useCallback)(function () {
138
- setIsOpenSearch(function (prev) {
139
- return !prev;
140
- });
141
- }, []);
142
153
  var handleSearchInputChange = (0, _react.useCallback)(function (e) {
143
154
  var keyword = e.target.value.toLowerCase();
144
155
  setTemSearchContent(keyword);
@@ -146,9 +157,12 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
146
157
  var executeSearch = (0, _react.useCallback)(function () {
147
158
  if (!temSearchContent.trim()) {
148
159
  setSearchContent('');
160
+ setIsOpenSearch(false);
149
161
  return;
150
162
  }
163
+ setCurrentSelectedFile(null);
151
164
  setSearchContent(temSearchContent);
165
+ setIsOpenSearch(true);
152
166
  }, [temSearchContent]);
153
167
  var handleInputKeyDown = (0, _react.useCallback)(function (e) {
154
168
  if ((0, _isHotkey["default"])('enter', e)) {
@@ -158,14 +172,52 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
158
172
  if ((0, _isHotkey["default"])('escape', e)) {
159
173
  e.preventDefault();
160
174
  e.stopPropagation();
161
- setIsOpenSearch(!isOpenSearch);
175
+ var el = searchRef.current;
176
+ if (!el) return;
177
+ el && el.blur();
178
+ el && (el.value = '');
179
+ setSearchContent('');
180
+ setIsOpenSearch(false);
162
181
  }
182
+ // eslint-disable-next-line react-hooks/exhaustive-deps
163
183
  }, [executeSearch, isOpenSearch]);
164
184
  (0, _react.useEffect)(function () {
165
185
  if (!isOpenSearch) {
166
186
  setSearchContent('');
187
+ var el = searchRef.current;
188
+ el && (el.value = '');
167
189
  }
168
190
  }, [isOpenSearch]);
191
+ var dirent = (0, _react.useMemo)(function () {
192
+ return {
193
+ name: currentSelectedFile === null || currentSelectedFile === void 0 ? void 0 : currentSelectedFile.name,
194
+ type: currentSelectedFile ? 'file' : 'dir',
195
+ isLib: (currentSelectedFile === null || currentSelectedFile === void 0 ? void 0 : currentSelectedFile.path) === '/',
196
+ file_tags: [],
197
+ path: currentSelectedFile === null || currentSelectedFile === void 0 ? void 0 : currentSelectedFile.path
198
+ };
199
+ }, [currentSelectedFile]);
200
+ (0, _react.useEffect)(function () {
201
+ if (!repoID || !currentSelectedFile) return;
202
+ var eventBus = _eventBus["default"].getInstance();
203
+ eventBus.dispatch(_constants.INTERNAL_EVENT.FILE_METADATA_COMPONENT, function (component) {
204
+ setFileMetadataComponent(function () {
205
+ return component;
206
+ });
207
+ });
208
+ }, [repoID, currentSelectedFile, dirent]);
209
+ var onClickTreeView = (0, _react.useCallback)(function () {
210
+ setIsTreeView(true);
211
+ setIsOpenSearch(false);
212
+ setSearchContent('');
213
+ setCurrentSelectedFile(null);
214
+ }, []);
215
+ var onClickListView = (0, _react.useCallback)(function () {
216
+ setIsTreeView(false);
217
+ setIsOpenSearch(false);
218
+ setSearchContent('');
219
+ setCurrentSelectedFile(null);
220
+ }, []);
169
221
  return /*#__PURE__*/_react["default"].createElement(_reactstrap.Modal, {
170
222
  isOpen: true,
171
223
  autoFocus: true,
@@ -179,42 +231,63 @@ var SelectSdocFileDialog = function SelectSdocFileDialog(_ref) {
179
231
  }, /*#__PURE__*/_react["default"].createElement("h5", {
180
232
  className: "modal-title-container"
181
233
  }, t(modalTitle)), /*#__PURE__*/_react["default"].createElement("div", {
182
- className: "search-container"
183
- }, !isOpenSearch && /*#__PURE__*/_react["default"].createElement("div", {
184
- className: "search-icon-container"
234
+ className: "modal-operation-container"
235
+ }, enableMetadata && /*#__PURE__*/_react["default"].createElement("div", {
236
+ className: "toggle-view"
237
+ }, /*#__PURE__*/_react["default"].createElement("div", {
238
+ className: (0, _classnames["default"])('sdocfont sdoc-tree-view', {
239
+ 'active': isTreeView
240
+ }),
241
+ onClick: onClickTreeView
242
+ }), /*#__PURE__*/_react["default"].createElement("div", {
243
+ className: (0, _classnames["default"])('sdocfont sdoc-list-ul sdoc-list-view', {
244
+ 'active': !isTreeView
245
+ }),
246
+ onClick: onClickListView
247
+ })), /*#__PURE__*/_react["default"].createElement("div", {
248
+ className: "sdocfont sdoc-close1 sdoc-close-dialog",
249
+ onClick: closeDialog
250
+ }))), /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalBody, {
251
+ className: "p-0"
252
+ }, /*#__PURE__*/_react["default"].createElement("div", {
253
+ className: "sdoc-file-select-container"
254
+ }, /*#__PURE__*/_react["default"].createElement("div", {
255
+ className: "sdoc-file-select-wrapper"
256
+ }, /*#__PURE__*/_react["default"].createElement("div", {
257
+ className: "sdoc-file-left-panel"
185
258
  }, /*#__PURE__*/_react["default"].createElement("div", {
186
- className: "sdocfont sdoc-find-replace sdoc-files-search-popover",
187
- onClick: toggleSearch
188
- })), isOpenSearch && /*#__PURE__*/_react["default"].createElement("div", {
189
259
  className: "sdoc-files-search-popover-container"
190
260
  }, /*#__PURE__*/_react["default"].createElement("div", {
191
261
  className: "sdoc-search-wrapper"
192
262
  }, /*#__PURE__*/_react["default"].createElement("div", {
193
263
  className: "sdocfont sdoc-find-replace sdoc-search"
194
264
  }), /*#__PURE__*/_react["default"].createElement(_reactstrap.Input, {
195
- autoFocus: true,
265
+ innerRef: searchRef,
196
266
  className: "sdoc-search-input",
197
267
  onKeyUp: handleInputKeyDown,
198
268
  onChange: handleSearchInputChange,
199
269
  id: "sdoc-search",
200
270
  placeholder: t('Search')
201
- }), /*#__PURE__*/_react["default"].createElement("div", {
202
- className: "sdocfont sdoc-close1 sdoc-close",
203
- onClick: toggleSearch
204
- })))), /*#__PURE__*/_react["default"].createElement("div", {
205
- className: "sdocfont sdoc-close1 sdoc-close-dialog",
206
- onClick: closeDialog
207
- })), /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalBody, {
208
- className: "p-0"
209
- }, /*#__PURE__*/_react["default"].createElement("div", {
210
- className: "sdoc-file-select-container"
211
- }, /*#__PURE__*/_react["default"].createElement(_localFiles["default"], {
212
- fileType: _constants.FILE_TYPE[dialogType],
271
+ }))), isTreeView ? /*#__PURE__*/_react["default"].createElement(_treeView["default"], {
272
+ fileType: _constants2.FILE_TYPE[dialogType],
213
273
  onSelectedFile: onSelectedFile,
214
274
  toggle: closeDialog,
215
275
  searchContent: searchContent,
216
276
  isOpenSearch: isOpenSearch
217
- }), /*#__PURE__*/_react["default"].createElement("div", {
277
+ }) : /*#__PURE__*/_react["default"].createElement(_listView["default"], {
278
+ fileType: _constants2.FILE_TYPE[dialogType],
279
+ onSelectedFile: onSelectedFile,
280
+ searchContent: searchContent,
281
+ isOpenSearch: isOpenSearch
282
+ })), /*#__PURE__*/_react["default"].createElement("div", {
283
+ className: "sdoc-file-metadata-wrapper"
284
+ }, FileMetadataComponent && repoID && currentSelectedFile && /*#__PURE__*/_react["default"].createElement(_useCollaborators.CollaboratorsProvider, {
285
+ repoID: repoID
286
+ }, /*#__PURE__*/_react["default"].createElement(FileMetadataComponent, {
287
+ repoID: repoID,
288
+ path: currentSelectedFile === null || currentSelectedFile === void 0 ? void 0 : currentSelectedFile.path,
289
+ dirent: dirent
290
+ })))), /*#__PURE__*/_react["default"].createElement("div", {
218
291
  className: "sdoc-file-select-footer"
219
292
  }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
220
293
  color: "secondary",
@@ -0,0 +1,71 @@
1
+ .sdoc-files-list {
2
+ flex: 1;
3
+ padding: 8px 16px;
4
+ width: 100%;
5
+ height: 400px;
6
+ overflow-y: auto;
7
+ display: flex;
8
+ flex-direction: column;
9
+ }
10
+
11
+ .sdoc-file-wrapper {
12
+ border-radius: 4px;
13
+ cursor: pointer;
14
+ display: flex;
15
+ font-size: .8125rem;
16
+ height: auto;
17
+ padding: 10px 0 10px 8px;
18
+ position: relative;
19
+ }
20
+
21
+ .sdoc-file-wrapper:hover {
22
+ background-color: #f5f5f5;
23
+ }
24
+
25
+ .sdoc-file-wrapper .file-icon {
26
+ height: 36px;
27
+ width: 36px;
28
+ }
29
+
30
+ .sdoc-item-content {
31
+ display: flex;
32
+ flex-direction: column;
33
+ flex: 1 1;
34
+ margin-left: .25rem;
35
+ overflow: hidden;
36
+ }
37
+
38
+ .sdoc-item-name {
39
+ white-space: nowrap;
40
+ overflow: hidden;
41
+ text-overflow: ellipsis;
42
+ font-size: 14px;
43
+ }
44
+
45
+ .sdoc-item-path {
46
+ color: #666;
47
+ }
48
+
49
+ .sdoc-item-user-container {
50
+ display: flex;
51
+ color: #666;
52
+ }
53
+
54
+ .sdoc-item-user-container .item-divide {
55
+ margin: 0 5px;
56
+ transform: translateY(-1px);
57
+ }
58
+
59
+ .sdoc-files-list .sdoc-file-checked {
60
+ position: absolute;
61
+ right: 10px;
62
+ top: 30px;
63
+ color: #798d99;
64
+ font-size: 12px;
65
+ font-weight: 400;
66
+ }
67
+
68
+ .sdoc-files-list .sdoc-file-search-no-result {
69
+ display: flex;
70
+ justify-content: center;
71
+ }
@@ -0,0 +1,146 @@
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 _regenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/regenerator"));
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/asyncToGenerator"));
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
13
+ var _react = _interopRequireWildcard(require("react"));
14
+ var _reactI18next = require("react-i18next");
15
+ var _context2 = _interopRequireDefault(require("../../../../context"));
16
+ var _helpers = require("../helpers");
17
+ require("./index.css");
18
+ var ListView = function ListView(_ref) {
19
+ var onSelectedFile = _ref.onSelectedFile,
20
+ fileType = _ref.fileType,
21
+ t = _ref.t,
22
+ searchContent = _ref.searchContent,
23
+ isOpenSearch = _ref.isOpenSearch;
24
+ var _useState = (0, _react.useState)(null),
25
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
26
+ currentActiveItem = _useState2[0],
27
+ setCurrentActiveItem = _useState2[1];
28
+ var _useState3 = (0, _react.useState)([]),
29
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
30
+ allFileList = _useState4[0],
31
+ setAllFileList = _useState4[1];
32
+ var _useState5 = (0, _react.useState)([]),
33
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
34
+ fileList = _useState6[0],
35
+ setFileList = _useState6[1];
36
+ var _useState7 = (0, _react.useState)(''),
37
+ _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
38
+ repoName = _useState8[0],
39
+ setRepoName = _useState8[1];
40
+ var onSelectFile = (0, _react.useCallback)(function (e, file) {
41
+ e && e.stopPropagation();
42
+ setCurrentActiveItem(file);
43
+ onSelectedFile(file);
44
+ // eslint-disable-next-line react-hooks/exhaustive-deps
45
+ }, []);
46
+ (0, _react.useEffect)(function () {
47
+ var getFileMetadata = /*#__PURE__*/function () {
48
+ var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regenerator2["default"])().m(function _callee() {
49
+ var res, sortedRecords, firstFile, filePath;
50
+ return (0, _regenerator2["default"])().w(function (_context) {
51
+ while (1) switch (_context.n) {
52
+ case 0:
53
+ _context.n = 1;
54
+ return _context2["default"].getFileMetadataInfo(fileType);
55
+ case 1:
56
+ res = _context.v;
57
+ setRepoName(res.data.repo_name);
58
+ sortedRecords = (0, _toConsumableArray2["default"])(res.data.records).sort(function (a, b) {
59
+ return new Date(b._mtime) - new Date(a._mtime);
60
+ });
61
+ setAllFileList(sortedRecords);
62
+ setFileList(sortedRecords);
63
+ firstFile = sortedRecords[0];
64
+ if (firstFile) {
65
+ filePath = (firstFile._parent_dir === '/' ? '' : firstFile._parent_dir) + '/' + firstFile._name;
66
+ onSelectFile(null, {
67
+ id: firstFile._id,
68
+ name: firstFile._name,
69
+ path: filePath
70
+ });
71
+ }
72
+ case 2:
73
+ return _context.a(2);
74
+ }
75
+ }, _callee);
76
+ }));
77
+ return function getFileMetadata() {
78
+ return _ref2.apply(this, arguments);
79
+ };
80
+ }();
81
+ getFileMetadata();
82
+ // eslint-disable-next-line react-hooks/exhaustive-deps
83
+ }, []);
84
+ (0, _react.useEffect)(function () {
85
+ if (!isOpenSearch || !searchContent.trim()) {
86
+ setFileList(allFileList);
87
+ }
88
+ if (searchContent.trim() && isOpenSearch) {
89
+ var keyword = searchContent.trim().toLowerCase();
90
+ var result = allFileList.filter(function (file) {
91
+ var _file$_name, _file$_parent_dir, _file$file_creator_ni;
92
+ var mtimeStr = new Date(file._mtime).toLocaleString().toLowerCase();
93
+ return ((_file$_name = file._name) === null || _file$_name === void 0 ? void 0 : _file$_name.toLowerCase().includes(keyword)) || ((_file$_parent_dir = file._parent_dir) === null || _file$_parent_dir === void 0 ? void 0 : _file$_parent_dir.toLowerCase().includes(keyword)) || mtimeStr.includes(keyword) || ((_file$file_creator_ni = file.file_creator_nickname) === null || _file$file_creator_ni === void 0 ? void 0 : _file$file_creator_ni.toLowerCase().includes(keyword)) || (repoName === null || repoName === void 0 ? void 0 : repoName.toLowerCase().includes(keyword));
94
+ });
95
+ setFileList(result);
96
+ }
97
+ // eslint-disable-next-line react-hooks/exhaustive-deps
98
+ }, [isOpenSearch, searchContent]);
99
+ return /*#__PURE__*/_react["default"].createElement("div", {
100
+ className: "sdoc-files-list"
101
+ }, fileList.map(function (file) {
102
+ var fileTypeIcon = (0, _helpers.parcelFileTypeIcon)(file._name);
103
+ var dirPath = repoName + (file._parent_dir === '/' ? '' : file._parent_dir);
104
+ var date = new Date(file._mtime);
105
+ var fileAdjustTime = date.toLocaleString();
106
+ var username = file.file_creator_nickname;
107
+ var selected = (currentActiveItem === null || currentActiveItem === void 0 ? void 0 : currentActiveItem.id) === file._id;
108
+ var filePath = (file._parent_dir === '/' ? '' : file._parent_dir) + '/' + file._name;
109
+ return /*#__PURE__*/_react["default"].createElement("div", {
110
+ key: file._id,
111
+ className: "sdoc-file-wrapper",
112
+ onClick: function onClick(e) {
113
+ return onSelectFile(e, {
114
+ id: file._id,
115
+ name: file._name,
116
+ path: filePath
117
+ });
118
+ }
119
+ }, /*#__PURE__*/_react["default"].createElement("img", {
120
+ className: "file-icon",
121
+ src: fileTypeIcon,
122
+ alt: ""
123
+ }), /*#__PURE__*/_react["default"].createElement("div", {
124
+ className: "sdoc-item-content"
125
+ }, /*#__PURE__*/_react["default"].createElement("div", {
126
+ className: "sdoc-item-name ellipsis",
127
+ title: file._name
128
+ }, file._name), /*#__PURE__*/_react["default"].createElement("div", {
129
+ className: "sdoc-item-path ellipsis",
130
+ title: dirPath
131
+ }, dirPath), /*#__PURE__*/_react["default"].createElement("div", {
132
+ className: "sdoc-item-user-container ellipsis"
133
+ }, /*#__PURE__*/_react["default"].createElement("div", {
134
+ className: "item-user"
135
+ }, username), /*#__PURE__*/_react["default"].createElement("div", {
136
+ className: "item-divide"
137
+ }, "|"), /*#__PURE__*/_react["default"].createElement("div", {
138
+ className: "item-adjust-time"
139
+ }, fileAdjustTime))), selected && /*#__PURE__*/_react["default"].createElement("i", {
140
+ className: "sdoc-file-checked sdocfont sdoc-check-mark"
141
+ }));
142
+ }), isOpenSearch && fileList.length === 0 && /*#__PURE__*/_react["default"].createElement("div", {
143
+ className: "sdoc-file-search-no-result"
144
+ }, t('No_results')));
145
+ };
146
+ var _default = exports["default"] = (0, _reactI18next.withTranslation)('sdoc-editor')(ListView);
@@ -44,7 +44,7 @@
44
44
  right: 1px;
45
45
  }
46
46
 
47
- .sdoc-file-checked {
47
+ .sdoc-files-tree .sdoc-file-checked {
48
48
  position: absolute;
49
49
  right: 10px;
50
50
  color: #798d99;
@@ -94,7 +94,6 @@
94
94
 
95
95
  .sdoc-folder-container.sdoc-folder-search-results .sdoc-file-info {
96
96
  height: 59px;
97
- width: 486px;
98
97
  padding: 10px 50px;
99
98
  flex-direction: column;
100
99
  justify-content: center;
@@ -6,6 +6,7 @@ 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"));
9
10
  var _regeneratorValues2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/regeneratorValues"));
10
11
  var _regenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/regenerator"));
11
12
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/asyncToGenerator"));
@@ -19,7 +20,7 @@ var _context4 = _interopRequireDefault(require("../../../../context"));
19
20
  var _commonUtils = require("../../../../utils/common-utils");
20
21
  var _helpers = require("../helpers");
21
22
  require("./index.css");
22
- var LocalFiles = function LocalFiles(_ref) {
23
+ var TreeView = function TreeView(_ref) {
23
24
  var onSelectedFile = _ref.onSelectedFile,
24
25
  toggle = _ref.toggle,
25
26
  fileType = _ref.fileType,
@@ -171,32 +172,38 @@ var LocalFiles = function LocalFiles(_ref) {
171
172
  getTreeData(rootPath);
172
173
  }
173
174
  // eslint-disable-next-line react-hooks/exhaustive-deps
174
- }, [isOpenSearch, searchContent, isOpenSearch]);
175
+ }, [isOpenSearch, searchContent]);
175
176
  var onToggle = (0, _react.useCallback)(/*#__PURE__*/function () {
176
177
  var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regenerator2["default"])().m(function _callee2(e, item, treeData) {
177
178
  return (0, _regenerator2["default"])().w(function (_context3) {
178
179
  while (1) switch (_context3.n) {
179
180
  case 0:
180
181
  e && e.stopPropagation();
181
- if (!expandedFolder.has(item.indexId)) {
182
+ if (!isOpenSearch) {
182
183
  _context3.n = 1;
183
184
  break;
184
185
  }
186
+ return _context3.a(2);
187
+ case 1:
188
+ if (!expandedFolder.has(item.indexId)) {
189
+ _context3.n = 2;
190
+ break;
191
+ }
185
192
  collapsedFolder(treeData, item.indexId);
186
193
  expandedFolder["delete"](item.indexId);
187
- _context3.n = 3;
194
+ _context3.n = 4;
188
195
  break;
189
- case 1:
190
- _context3.n = 2;
191
- return getTreeData(item.path, item.indexId, treeData);
192
196
  case 2:
193
- expandedFolder.add(item.indexId);
197
+ _context3.n = 3;
198
+ return getTreeData(item.path, item.indexId, treeData);
194
199
  case 3:
200
+ expandedFolder.add(item.indexId);
201
+ case 4:
195
202
  onSelectedFile(null);
196
203
  setCurrentActiveItem(item);
197
204
  setExpandedFolder(new Set(Array.from(expandedFolder)));
198
205
  // eslint-disable-next-line react-hooks/exhaustive-deps
199
- case 4:
206
+ case 5:
200
207
  return _context3.a(2);
201
208
  }
202
209
  }, _callee2);
@@ -207,8 +214,11 @@ var LocalFiles = function LocalFiles(_ref) {
207
214
  }(), [expandedFolder]);
208
215
  var onSelectFile = (0, _react.useCallback)(function (e, file) {
209
216
  e.stopPropagation();
210
- setCurrentActiveItem(file);
211
- onSelectedFile(file);
217
+ var newFile = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, file), {}, {
218
+ path: file.path || file.fullpath
219
+ });
220
+ setCurrentActiveItem(newFile);
221
+ onSelectedFile(newFile);
212
222
  // eslint-disable-next-line react-hooks/exhaustive-deps
213
223
  }, []);
214
224
  var getSearchFiles = (0, _react.useCallback)(function (searchContent, fileType) {
@@ -229,20 +239,24 @@ var LocalFiles = function LocalFiles(_ref) {
229
239
  }, []);
230
240
  var renderFileTree = (0, _react.useCallback)(function (data) {
231
241
  if (!Array.isArray(data) || data.length === 0) return null;
242
+ if (isOpenSearch && !hasSearchResult) return null;
232
243
  return data.map(function (item) {
233
244
  var _item$fullpath, _item$children, _item$children2;
234
245
  if (!item) return null;
235
246
  var type = item.type,
236
247
  indexId = item.indexId,
237
- name = item.name;
248
+ name = item.name,
249
+ file_uuid = item.file_uuid,
250
+ path = item.path,
251
+ fullpath = item.fullpath;
238
252
  // Get file type icon
239
253
  var fileTypeIcon = (0, _helpers.parcelFileTypeIcon)(name);
240
254
  var result = (_item$fullpath = item.fullpath) === null || _item$fullpath === void 0 ? void 0 : _item$fullpath.split('/').filter(Boolean);
241
255
  item.fullpath && result.pop();
242
256
  var folderPath = item.fullpath && result.join('/');
243
- var selected = (currentActiveItem === null || currentActiveItem === void 0 ? void 0 : currentActiveItem.indexId) === indexId;
257
+ var selected = (currentActiveItem === null || currentActiveItem === void 0 ? void 0 : currentActiveItem.path) === (path || fullpath);
244
258
  return /*#__PURE__*/_react["default"].createElement("div", {
245
- key: indexId,
259
+ key: indexId || file_uuid,
246
260
  className: (0, _classnames["default"])('sdoc-folder-container', {
247
261
  'sdoc-folder-search-results': hasSearchResult === true
248
262
  })
@@ -292,11 +306,11 @@ var LocalFiles = function LocalFiles(_ref) {
292
306
  })));
293
307
  });
294
308
  // eslint-disable-next-line react-hooks/exhaustive-deps
295
- }, [treeData, currentActiveItem, expandedFolder]);
309
+ }, [treeData, currentActiveItem, expandedFolder, isOpenSearch, hasSearchResult]);
296
310
  return /*#__PURE__*/_react["default"].createElement("div", {
297
311
  className: "sdoc-files-tree"
298
312
  }, renderFileTree(treeData), isOpenSearch && !hasSearchResult && !isCurrentLibrary && /*#__PURE__*/_react["default"].createElement("div", {
299
313
  className: "sdoc-file-search-no-result"
300
314
  }, t('No_results')));
301
315
  };
302
- var _default = exports["default"] = (0, _reactI18next.withTranslation)('sdoc-editor')(LocalFiles);
316
+ var _default = exports["default"] = (0, _reactI18next.withTranslation)('sdoc-editor')(TreeView);
@@ -19,7 +19,7 @@
19
19
  .select-btn .link-address-btn.active,
20
20
  .select-btn .link-block-btn.active {
21
21
  color: #ff9800;
22
- border-bottom: 1.5px solid #ff9800;
22
+ border-bottom: 2px solid #ff9800;
23
23
  }
24
24
 
25
25
  .select-btn .link-address-btn {
@@ -56,6 +56,7 @@
56
56
 
57
57
  .selected-linked-block-wrapper .selected-linked-block .linked-block-item {
58
58
  margin-bottom: 0 !important;
59
+ cursor: pointer;
59
60
  }
60
61
 
61
62
  .selected-linked-block-wrapper .linked-block-item:not(img) {
@@ -63,10 +64,12 @@
63
64
  overflow-y: auto;
64
65
  padding-top: 3px;
65
66
  padding-bottom: 3px;
67
+ cursor: pointer;
66
68
  }
67
69
 
68
70
  .selected-linked-block-wrapper .linked-block-item:has(img) {
69
71
  max-height: none !important;
72
+ cursor: pointer;
70
73
  }
71
74
 
72
75
  .selected-linked-block-wrapper .link-block-wrapper {
@@ -74,7 +77,7 @@
74
77
  max-height: 400px;
75
78
  width: 100%;
76
79
  height: fit-content;
77
- padding: 0.75rem;
80
+ padding: 0.75rem 0;
78
81
  margin-top: 3px;
79
82
  overflow-y: auto;
80
83
  box-sizing: border-box;
@@ -83,6 +86,8 @@
83
86
  display: flex;
84
87
  flex-direction: column;
85
88
  align-items: flex-start;
89
+ box-shadow: 0 0 6px rgba(0, 0, 0, 0.12);
90
+ border-radius: 3px;
86
91
  }
87
92
 
88
93
  .link-block-wrapper .select-block-wrapper {
@@ -91,6 +96,7 @@
91
96
  align-items: center;
92
97
  justify-content: center;
93
98
  cursor: pointer;
99
+ margin: 0 0.75rem;
94
100
  }
95
101
 
96
102
  .link-block-wrapper .select-block-wrapper .title {
@@ -106,6 +112,19 @@
106
112
 
107
113
  .link-block-wrapper .link-block-container .linked-block-item {
108
114
  margin-bottom: 5px !important;
115
+ cursor: pointer;
116
+ display: block;
117
+ padding-left: 0.75rem;
118
+ }
119
+
120
+ .link-block-wrapper .select-block-wrapper blockquote,
121
+ .link-block-wrapper .link-block-container blockquote {
122
+ border-left: 4px solid #ddd;
123
+ }
124
+
125
+ .link-block-wrapper .select-block-wrapper blockquote p,
126
+ .link-block-wrapper .link-block-container blockquote p {
127
+ margin: 5px 0 !important;
109
128
  }
110
129
 
111
130
  .selected-linked-block-wrapper img {
@@ -183,7 +183,7 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
183
183
  while (1) switch (_context.n) {
184
184
  case 0:
185
185
  list = editor.children.filter(function (node) {
186
- return _slate.Element.isElement(node) && _constants.INTERNAL_LINKED_TYPE.includes(node.type);
186
+ return _slate.Element.isElement(node) && !(0, _helpers.isEmptyNode)(node) && _constants.INTERNAL_LINKED_TYPE.includes(node.type);
187
187
  });
188
188
  mdValue = list.map(function (node) {
189
189
  return "<!--".concat(node.id, "-->\n").concat((0, _slateToMd["default"])([node]));
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.upsertLinkText = exports.updateLink = exports.unWrapLinkNode = exports.parseHtmlString = exports.isWeChat = exports.isSdocFile = exports.isNodeInCurrentView = exports.isMenuDisabled = exports.isLinkToolBarActive = exports.insertLink = exports.getMenuPosition = exports.getLinkType = exports.genLinkNode = exports.checkLink = void 0;
7
+ exports.upsertLinkText = exports.updateLink = exports.unWrapLinkNode = exports.parseHtmlString = exports.isWeChat = exports.isSdocFile = exports.isNodeInCurrentView = exports.isMenuDisabled = exports.isLinkToolBarActive = exports.isEmptyNode = exports.insertLink = exports.getMenuPosition = exports.getLinkType = exports.genLinkNode = exports.checkLink = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
9
9
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
10
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
@@ -262,4 +262,8 @@ var parseHtmlString = exports.parseHtmlString = function parseHtmlString(htmlStr
262
262
  }).join('');
263
263
  }
264
264
  return resultHtml;
265
+ };
266
+ var isEmptyNode = exports.isEmptyNode = function isEmptyNode(node) {
267
+ var text = _slate.Node.string(node);
268
+ return text.trim() === '';
265
269
  };
@@ -154,7 +154,7 @@ var SdocLinkHoverMenu = function SdocLinkHoverMenu(_ref) {
154
154
  return handleOpenLinkPreview('sdoc-file-preview');
155
155
  }
156
156
  }, /*#__PURE__*/_react["default"].createElement("i", {
157
- className: "sdocfont eye icon-font"
157
+ className: "sdocfont sodc-eye icon-font"
158
158
  })), isShowTooltip && /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
159
159
  target: "sdoc_link_preview",
160
160
  placement: "top",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "2.0.182",
3
+ "version": "2.0.184",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "test": "jest",
@@ -71,5 +71,5 @@
71
71
  "publishConfig": {
72
72
  "access": "public"
73
73
  },
74
- "gitHead": "66343e00bc56ccd16080bb5c0a1d69d8de792c44"
74
+ "gitHead": "876d97d3d9f951c33d536e976e8a8543218c9e73"
75
75
  }
@@ -1,91 +0,0 @@
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 _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
10
- var _react = _interopRequireWildcard(require("react"));
11
- var _reactI18next = require("react-i18next");
12
- var _reactstrap = require("reactstrap");
13
- var _mouseEvent = require("../../../utils/mouse-event");
14
- var _constants = require("../../constants");
15
- var CommentTypeDropdownItem = function CommentTypeDropdownItem(_ref) {
16
- var type = _ref.type,
17
- setCommentType = _ref.setCommentType;
18
- var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
19
- t = _useTranslation.t;
20
- var handleCommentTypeChanged = (0, _react.useCallback)(function (event, type) {
21
- (0, _mouseEvent.eventStopPropagation)(event);
22
- setCommentType(type);
23
-
24
- // eslint-disable-next-line react-hooks/exhaustive-deps
25
- }, []);
26
- return /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownItem, {
27
- className: "sdoc-dropdown-menu-item",
28
- tag: 'div',
29
- onClick: function onClick(event) {
30
- return handleCommentTypeChanged(event, type);
31
- }
32
- }, t(type));
33
- };
34
- var GlobalCommentBodyHeader = function GlobalCommentBodyHeader(_ref2) {
35
- var _ref2$commentList = _ref2.commentList,
36
- commentList = _ref2$commentList === void 0 ? [] : _ref2$commentList,
37
- commentType = _ref2.commentType,
38
- setCommentType = _ref2.setCommentType;
39
- var _useTranslation2 = (0, _reactI18next.useTranslation)('sdoc-editor'),
40
- t = _useTranslation2.t;
41
- var _useState = (0, _react.useState)(false),
42
- _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
43
- isDropdownOpen = _useState2[0],
44
- setDropdownOpen = _useState2[1];
45
- var commentTip = null;
46
- if (commentList.length === 1) {
47
- commentTip = t('Total_1_comment');
48
- } else if (commentList.length > 1) {
49
- commentTip = t('Total_count_comments', {
50
- count: commentList.length
51
- });
52
- }
53
- var id = 'comment-type-controller';
54
- return /*#__PURE__*/_react["default"].createElement("div", {
55
- className: "comments-panel-body__header"
56
- }, /*#__PURE__*/_react["default"].createElement("div", {
57
- className: "comments-types-count"
58
- }, /*#__PURE__*/_react["default"].createElement("div", {
59
- id: "comment-types",
60
- className: "comment-type"
61
- }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Dropdown, {
62
- isOpen: isDropdownOpen,
63
- toggle: function toggle() {
64
- return setDropdownOpen(!isDropdownOpen);
65
- }
66
- }, /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownToggle, {
67
- tag: 'div',
68
- caret: true,
69
- className: "d-flex align-items-center justify-content-center"
70
- }, /*#__PURE__*/_react["default"].createElement("div", {
71
- id: id
72
- }, t(commentType))), /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownMenu, {
73
- className: "sdoc-dropdown-menu sdoc-comment-filter-dropdown",
74
- container: "comment-types"
75
- }, /*#__PURE__*/_react["default"].createElement(CommentTypeDropdownItem, {
76
- type: _constants.COMMENT_TYPES.ALL,
77
- setCommentType: setCommentType
78
- }), /*#__PURE__*/_react["default"].createElement(CommentTypeDropdownItem, {
79
- type: _constants.COMMENT_TYPES.DOC,
80
- setCommentType: setCommentType
81
- }), /*#__PURE__*/_react["default"].createElement(CommentTypeDropdownItem, {
82
- type: _constants.COMMENT_TYPES.RESOLVED,
83
- setCommentType: setCommentType
84
- }), /*#__PURE__*/_react["default"].createElement(CommentTypeDropdownItem, {
85
- type: _constants.COMMENT_TYPES.UNRESOLVED,
86
- setCommentType: setCommentType
87
- })))), /*#__PURE__*/_react["default"].createElement("div", {
88
- className: "comment-count-tip"
89
- }, commentTip)));
90
- };
91
- var _default = exports["default"] = GlobalCommentBodyHeader;