@seafile/sdoc-editor 3.0.71 → 3.0.72

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.
@@ -44,6 +44,7 @@ var getFileTypeIcon = exports.getFileTypeIcon = function getFileTypeIcon(fileTyp
44
44
  };
45
45
  var parcelFileTypeIcon = exports.parcelFileTypeIcon = function parcelFileTypeIcon(fileName) {
46
46
  var _Object$entries$find;
47
+ if (!fileName) return '';
47
48
  var newFileType = fileName.split('.').pop();
48
49
  var fileExtType = (_Object$entries$find = Object.entries(_constants.FILEEXT_TYPE).find(function (_ref) {
49
50
  var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
@@ -15,6 +15,7 @@ var _slateReact = require("@seafile/slate-react");
15
15
  var _classnames = _interopRequireDefault(require("classnames"));
16
16
  var _lodash = _interopRequireDefault(require("lodash.throttle"));
17
17
  var _constants = require("../../../constants");
18
+ var _context = _interopRequireDefault(require("../../../context"));
18
19
  var _commonUtils = require("../../../utils/common-utils");
19
20
  var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
20
21
  var _localStorageUtils = _interopRequireDefault(require("../../../utils/local-storage-utils"));
@@ -165,8 +166,8 @@ var WikiFileLinkInsertDialog = function WikiFileLinkInsertDialog(_ref) {
165
166
  getPosition();
166
167
  return;
167
168
  }
168
- var navConfig = window.wiki.config.navConfig;
169
- var pages = navConfig.pages;
169
+ var _context$getSetting = _context["default"].getSetting('navConfig'),
170
+ pages = _context$getSetting.pages;
170
171
  var newFiles = [];
171
172
  pages.forEach(function (page) {
172
173
  if (page.name.includes(searchText.trim())) {
@@ -111,12 +111,12 @@ var insertImage = exports.insertImage = function insertImage(editor, imgInfos, s
111
111
  at: validSelection
112
112
  });
113
113
 
114
- // BLOCKQUOTE and CALL_OUT use inline images
114
+ // BLOCKQUOTE, CALL_OUT, MULTI_COLUMN use inline images
115
115
  var imageType = _constants2.IMAGE_BLOCK;
116
116
  var _Editor$node = _slate.Editor.node(editor, [aboveNodeEntry[1][0]]),
117
117
  _Editor$node2 = (0, _slicedToArray2["default"])(_Editor$node, 1),
118
118
  topNode = _Editor$node2[0];
119
- if ([_constants2.BLOCKQUOTE, _constants2.CALL_OUT].includes(topNode === null || topNode === void 0 ? void 0 : topNode.type)) {
119
+ if ([_constants2.BLOCKQUOTE, _constants2.CALL_OUT, _constants2.MULTI_COLUMN].includes(topNode === null || topNode === void 0 ? void 0 : topNode.type)) {
120
120
  imageType = '';
121
121
  }
122
122
  if (imageType === _constants2.IMAGE_BLOCK) {
@@ -5,6 +5,7 @@
5
5
  }
6
6
 
7
7
  .select-btn .link-address-btn,
8
+ .select-btn .link-page-btn,
8
9
  .select-btn .link-block-btn {
9
10
  font-size: .875rem;
10
11
  font-weight: 600;
@@ -12,16 +13,19 @@
12
13
  }
13
14
 
14
15
  .select-btn .link-address-btn:hover,
16
+ .select-btn .link-page-btn:hover,
15
17
  .select-btn .link-block-btn:hover {
16
18
  cursor: pointer;
17
19
  }
18
20
 
21
+ .select-btn .link-page-btn.active,
19
22
  .select-btn .link-address-btn.active,
20
23
  .select-btn .link-block-btn.active {
21
24
  color: #ff9800;
22
25
  border-bottom: 2px solid #ff9800;
23
26
  }
24
27
 
28
+ .select-btn .link-page-btn,
25
29
  .select-btn .link-address-btn {
26
30
  margin-right: 40px;
27
31
  }
@@ -33,6 +37,7 @@
33
37
  .selected-linked-block-wrapper .form-control {
34
38
  display: flex;
35
39
  justify-content: space-between;
40
+ align-items: center;
36
41
  cursor: pointer;
37
42
  height: 36.39px;
38
43
  }
@@ -14,11 +14,13 @@ var _reactI18next = require("react-i18next");
14
14
  var _reactstrap = require("reactstrap");
15
15
  var _slate = require("@seafile/slate");
16
16
  var _classnames = _interopRequireDefault(require("classnames"));
17
+ var _constants = require("../../../../../constants");
17
18
  var _mdToHtml = require("../../../../../slate-convert/md-to-html");
18
19
  var _slateToMd = _interopRequireDefault(require("../../../../../slate-convert/slate-to-md"));
19
- var _constants = require("../../../../constants");
20
+ var _constants2 = require("../../../../constants");
20
21
  var _core = require("../../../../core");
21
22
  var _helpers = require("../../helpers");
23
+ var _linkedPage = _interopRequireDefault(require("./select-forms/linked-page"));
22
24
  require("./index.css");
23
25
  var AddLinkDialog = function AddLinkDialog(_ref) {
24
26
  var editor = _ref.editor,
@@ -43,7 +45,8 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
43
45
  href: ''
44
46
  },
45
47
  oldURL = _ref2.href,
46
- linked_id = _ref2.linked_id;
48
+ linked_id = _ref2.linked_id,
49
+ linked_wiki_page_id = _ref2.linked_wiki_page_id;
47
50
  var oldTitle = (element === null || element === void 0 ? void 0 : element.children[0].text) || linkTitle || '';
48
51
  var initTitle = (0, _react.useMemo)(function () {
49
52
  return oldTitle ? oldTitle : (0, _core.getEditorString)(editor, editor.selection);
@@ -52,50 +55,69 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
52
55
  _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
53
56
  title = _useState6[0],
54
57
  setTitle = _useState6[1];
55
- var _useState7 = (0, _react.useState)(linked_id ? '' : oldURL),
58
+ var _useState7 = (0, _react.useState)(''),
56
59
  _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
57
- url = _useState8[0],
58
- setURL = _useState8[1];
59
- var _useState9 = (0, _react.useState)(linked_id ? 'block' : 'url'),
60
+ selectedBlockId = _useState8[0],
61
+ setSelectedBlockId = _useState8[1];
62
+ var _useState9 = (0, _react.useState)(''),
60
63
  _useState0 = (0, _slicedToArray2["default"])(_useState9, 2),
61
- activeTab = _useState0[0],
62
- setActiveTab = _useState0[1];
63
- var _useState1 = (0, _react.useState)(''),
64
+ selectedPageId = _useState0[0],
65
+ setSelectedPageId = _useState0[1];
66
+ var _useState1 = (0, _react.useState)([]),
64
67
  _useState10 = (0, _slicedToArray2["default"])(_useState1, 2),
65
- selectedBlockId = _useState10[0],
66
- setSelectedBlockId = _useState10[1];
67
- var _useState11 = (0, _react.useState)([]),
68
+ headerList = _useState10[0],
69
+ setheaderList = _useState10[1];
70
+ var _useState11 = (0, _react.useState)(false),
68
71
  _useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
69
- headerList = _useState12[0],
70
- setheaderList = _useState12[1];
72
+ isOpenSelect = _useState12[0],
73
+ setIsOpenSelect = _useState12[1];
71
74
  var _useState13 = (0, _react.useState)(false),
72
75
  _useState14 = (0, _slicedToArray2["default"])(_useState13, 2),
73
- isOpenSelect = _useState14[0],
74
- setIsOpenSelect = _useState14[1];
76
+ isOpenSelectHeader = _useState14[0],
77
+ setIsOpenSelectHeader = _useState14[1];
75
78
  var _useState15 = (0, _react.useState)(false),
76
79
  _useState16 = (0, _slicedToArray2["default"])(_useState15, 2),
77
- isOpenSelectHeader = _useState16[0],
78
- setIsOpenSelectHeader = _useState16[1];
80
+ isOpenSelectImageBlock = _useState16[0],
81
+ setIsOpenSelectImageBlock = _useState16[1];
79
82
  var _useState17 = (0, _react.useState)(false),
80
83
  _useState18 = (0, _slicedToArray2["default"])(_useState17, 2),
81
- isOpenSelectImageBlock = _useState18[0],
82
- setIsOpenSelectImageBlock = _useState18[1];
84
+ isOpenSelectCodeBlock = _useState18[0],
85
+ setIsOpenSelectCodeBlock = _useState18[1];
83
86
  var _useState19 = (0, _react.useState)(false),
84
87
  _useState20 = (0, _slicedToArray2["default"])(_useState19, 2),
85
- isOpenSelectCodeBlock = _useState20[0],
86
- setIsOpenSelectCodeBlock = _useState20[1];
87
- var _useState21 = (0, _react.useState)(false),
88
+ isOpenSelectBlockquote = _useState20[0],
89
+ setIsOpenSelectBlockquote = _useState20[1];
90
+ var _useState21 = (0, _react.useState)(''),
88
91
  _useState22 = (0, _slicedToArray2["default"])(_useState21, 2),
89
- isOpenSelectBlockquote = _useState22[0],
90
- setIsOpenSelectBlockquote = _useState22[1];
91
- var _useState23 = (0, _react.useState)(''),
92
+ htmlString = _useState22[0],
93
+ setHtmlString = _useState22[1];
94
+ var initTab = (0, _react.useMemo)(function () {
95
+ if (linked_id) {
96
+ return 'block';
97
+ }
98
+ if (linked_wiki_page_id) {
99
+ return 'page';
100
+ }
101
+ return 'url';
102
+ }, [linked_id, linked_wiki_page_id]);
103
+ var _useState23 = (0, _react.useState)(initTab !== 'url' ? '' : oldURL),
92
104
  _useState24 = (0, _slicedToArray2["default"])(_useState23, 2),
93
- htmlString = _useState24[0],
94
- setHtmlString = _useState24[1];
105
+ url = _useState24[0],
106
+ setURL = _useState24[1];
107
+ var _useState25 = (0, _react.useState)(initTab),
108
+ _useState26 = (0, _slicedToArray2["default"])(_useState25, 2),
109
+ activeTab = _useState26[0],
110
+ setActiveTab = _useState26[1];
95
111
  var submit = (0, _react.useCallback)(function () {
96
112
  setLinkErrorMessage('');
97
113
  setTitleErrorMessage('');
98
- if (!url && !selectedBlockId) {
114
+ if (editor.editorType === _constants.WIKI_EDITOR) {
115
+ if (!url && !selectedBlockId && !selectedPageId) {
116
+ setLinkErrorMessage(t('The_link_address_or_link_page_or_link_block_is_required'));
117
+ return;
118
+ }
119
+ }
120
+ if (editor.editorType !== _constants.WIKI_EDITOR && !url && !selectedBlockId) {
99
121
  setLinkErrorMessage(t('The_link_address_or_link_block_is_required'));
100
122
  return;
101
123
  }
@@ -109,15 +131,15 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
109
131
  }
110
132
  var isEdit = oldURL || oldTitle;
111
133
  if (isEdit) {
112
- (0, _helpers.updateLink)(editor, title, url, selectedBlockId);
134
+ (0, _helpers.updateLink)(editor, title, url, selectedBlockId, selectedPageId);
113
135
  } else {
114
- (0, _helpers.insertLink)(editor, title, url, insertPosition, slateNode, selectedBlockId);
136
+ (0, _helpers.insertLink)(editor, title, url, insertPosition, slateNode, selectedBlockId, selectedPageId);
115
137
  }
116
138
  handleSubmit && handleSubmit();
117
139
  closeDialog();
118
140
 
119
141
  // eslint-disable-next-line react-hooks/exhaustive-deps
120
- }, [editor, url, title, oldTitle, oldURL, insertPosition, selectedBlockId]);
142
+ }, [editor, url, title, oldTitle, oldURL, insertPosition, selectedBlockId, selectedPageId]);
121
143
  var onKeyDown = (0, _react.useCallback)(function (event) {
122
144
  if (event.keyCode === 13) {
123
145
  event.preventDefault();
@@ -132,6 +154,7 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
132
154
  if (value === url) return;
133
155
  setURL(value);
134
156
  setSelectedBlockId('');
157
+ setSelectedPageId('');
135
158
  }, [url]);
136
159
  var handleTitleChange = (0, _react.useCallback)(function (event) {
137
160
  var value = event.target.value;
@@ -157,6 +180,7 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
157
180
  var nodeId = block.dataset.id;
158
181
  setSelectedBlockId(nodeId);
159
182
  setURL('');
183
+ setSelectedPageId('');
160
184
  setIsOpenSelect(false);
161
185
  }
162
186
  };
@@ -187,7 +211,7 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
187
211
  while (1) switch (_context.n) {
188
212
  case 0:
189
213
  list = editor.children.filter(function (node) {
190
- return _slate.Element.isElement(node) && !(0, _helpers.isEmptyNode)(node) && _constants.INTERNAL_LINKED_TYPE.includes(node.type);
214
+ return _slate.Element.isElement(node) && !(0, _helpers.isEmptyNode)(node) && _constants2.INTERNAL_LINKED_TYPE.includes(node.type);
191
215
  });
192
216
  mdValue = list.map(function (node) {
193
217
  return "<!--".concat(node.id, "-->\n").concat((0, _slateToMd["default"])([node]));
@@ -215,7 +239,7 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
215
239
  (0, _react.useEffect)(function () {
216
240
  // Get header node list
217
241
  var headerList = editor.children.filter(function (node) {
218
- return _slate.Element.isElement(node) && !(0, _helpers.isEmptyNode)(node) && _constants.HEADERS.includes(node.type);
242
+ return _slate.Element.isElement(node) && !(0, _helpers.isEmptyNode)(node) && _constants2.HEADERS.includes(node.type);
219
243
  });
220
244
  if (headerList.length > 0) {
221
245
  setheaderList(headerList);
@@ -256,7 +280,14 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
256
280
  onClick: function onClick() {
257
281
  return setActiveTab('url');
258
282
  }
259
- }, t('Link_address')), /*#__PURE__*/_react["default"].createElement("div", {
283
+ }, t('Link_address')), editor.editorType === _constants.WIKI_EDITOR && /*#__PURE__*/_react["default"].createElement("div", {
284
+ className: (0, _classnames["default"])('link-page-btn', {
285
+ 'active': activeTab === 'page'
286
+ }),
287
+ onClick: function onClick() {
288
+ return setActiveTab('page');
289
+ }
290
+ }, t('Link_page')), /*#__PURE__*/_react["default"].createElement("div", {
260
291
  className: (0, _classnames["default"])('link-block-btn', {
261
292
  'active': activeTab === 'block'
262
293
  }),
@@ -313,7 +344,7 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
313
344
  }
314
345
  }, /*#__PURE__*/_react["default"].createElement("div", {
315
346
  className: "heading-prefix"
316
- }, _constants.HEADER_TAG[header.type]), /*#__PURE__*/_react["default"].createElement("div", {
347
+ }, _constants2.HEADER_TAG[header.type]), /*#__PURE__*/_react["default"].createElement("div", {
317
348
  "data-id": header.id,
318
349
  className: "linked-header-block-item"
319
350
  }, headerContext));
@@ -374,7 +405,13 @@ var AddLinkDialog = function AddLinkDialog(_ref) {
374
405
  onClick: function onClick(e) {
375
406
  return handleOnChangeBlock(e);
376
407
  }
377
- }))))), /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalFooter, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
408
+ }))), editor.editorType === _constants.WIKI_EDITOR && activeTab === 'page' && /*#__PURE__*/_react["default"].createElement(_linkedPage["default"], {
409
+ editor: editor,
410
+ element: element,
411
+ setSelectedPageId: setSelectedPageId,
412
+ setSelectedBlockId: setSelectedBlockId,
413
+ setURL: setURL
414
+ }))), /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalFooter, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
378
415
  color: "secondary",
379
416
  onClick: closeDialog
380
417
  }, t('Cancel')), /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
@@ -0,0 +1,153 @@
1
+ .link-block-wrapper.sdoc-wiki-link-page {
2
+ padding: 12px 5px;
3
+ }
4
+
5
+ .sdoc-wiki-link-page-item-wrapper {
6
+ display: block;
7
+ width: 100%;
8
+ }
9
+
10
+ .sdoc-wiki-link-page-item {
11
+ display: flex;
12
+ width: auto;
13
+ height: 32px;
14
+ padding: 0 8px 0 0;
15
+ font-size: 14px;
16
+ align-items: center;
17
+ justify-content: flex-start;
18
+ border-radius: 3px;
19
+ margin-left: 20px;
20
+ cursor: pointer;
21
+ }
22
+
23
+ .sdoc-wiki-link-page-item.is-dir {
24
+ margin-left: 0;
25
+ }
26
+
27
+ .sdoc-wiki-link-page-item:hover {
28
+ background-color: #f5f5f5;
29
+ }
30
+
31
+ .sdoc-wiki-link-page-item .toggle-icon-container {
32
+ width: 22px;
33
+ height: 22px;
34
+ display: flex;
35
+ justify-content: center;
36
+ align-items: center;
37
+ color: #666;
38
+ font-size: 12px;
39
+ border-radius: 3px;
40
+ }
41
+
42
+ .sdoc-wiki-link-page-item .toggle-icon-container .sdoc-file-icon-toggle {
43
+ transform: rotate(270deg);
44
+ }
45
+
46
+ .sdoc-wiki-link-page-item .toggle-icon-container.opened .sdoc-file-icon-toggle {
47
+ transform: rotate(0deg);
48
+ }
49
+
50
+ .sdoc-wiki-link-page-item .page-icon {
51
+ width: 20px;
52
+ height: 20px;
53
+ border-radius: 3px;
54
+ display: flex;
55
+ justify-content: center;
56
+ align-items: center;
57
+ /* margin-left: 22px; */
58
+ margin-right: 6px;
59
+ }
60
+
61
+ .sdoc-wiki-link-page-main {
62
+ display: inline-flex;
63
+ align-items: center;
64
+ flex: 1 1;
65
+ }
66
+
67
+ .sdoc-wiki-link-page-item-wrapper .page-name {
68
+ height: 32px;
69
+ line-height: 32px;
70
+ flex: 1 1;
71
+ overflow: hidden;
72
+ text-overflow: ellipsis;
73
+ white-space: nowrap;
74
+ }
75
+
76
+ .sdoc-files-search-popover-container {
77
+ width: 100%;
78
+ padding: 0 5px 5px;
79
+ }
80
+
81
+ .selected-wiki-linked-page {
82
+ display: flex;
83
+ width: auto;
84
+ height: 32px;
85
+ padding: 0 8px 0 0;
86
+ font-size: 14px;
87
+ align-items: center;
88
+ justify-content: flex-start;
89
+ }
90
+
91
+ .selected-wiki-linked-page .page-icon {
92
+ width: 20px;
93
+ height: 20px;
94
+ border-radius: 3px;
95
+ display: flex;
96
+ justify-content: center;
97
+ align-items: center;
98
+ margin-right: 6px;
99
+ }
100
+
101
+ .selected-wiki-linked-page .page-name {
102
+ height: 32px;
103
+ line-height: 32px;
104
+ flex: 1 1;
105
+ overflow: hidden;
106
+ text-overflow: ellipsis;
107
+ white-space: nowrap;
108
+ }
109
+
110
+ .sdoc-page-search-container {
111
+ position: relative;
112
+ display: flex;
113
+ align-items: center;
114
+ width: 100%;
115
+ padding: 0 5px 5px;
116
+ }
117
+
118
+ .sdoc-page-search-container .sdoc-search {
119
+ position: absolute;
120
+ left: 10px;
121
+ display: flex;
122
+ align-items: center;
123
+ justify-content: center;
124
+ width: 20px;
125
+ color: #868E96 !important;
126
+ font-size: 14px;
127
+ }
128
+
129
+ .sdoc-page-search-container .sdoc-search-close-icon {
130
+ position: absolute;
131
+ right: 10px;
132
+ display: flex;
133
+ border-radius: 3px;
134
+ align-items: center;
135
+ justify-content: center;
136
+ height: 24px;
137
+ width: 24px;
138
+ }
139
+
140
+ .sdoc-search-close-icon:hover {
141
+ background-color: #efefef;
142
+ }
143
+
144
+ .sdoc-search-close-icon .sdocfont {
145
+ font-size: 16px;
146
+ color: #868E96;
147
+ cursor: pointer;
148
+ }
149
+
150
+ .no-search-result {
151
+ display: flex;
152
+ padding: 0 5px;
153
+ }
@@ -0,0 +1,222 @@
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/defineProperty"));
10
+ var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
11
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
12
+ var _react = _interopRequireWildcard(require("react"));
13
+ var _reactI18next = require("react-i18next");
14
+ var _reactstrap = require("reactstrap");
15
+ var _classnames = _interopRequireDefault(require("classnames"));
16
+ var _isHotkey = _interopRequireDefault(require("is-hotkey"));
17
+ var _constants = require("../../../../../../constants");
18
+ var _context = _interopRequireDefault(require("../../../../../../context"));
19
+ var _selectedPageDisplay = require("./selected-page-display");
20
+ require("./linked-page.css");
21
+ var LinkedPagesForm = function LinkedPagesForm(_ref) {
22
+ var editor = _ref.editor,
23
+ element = _ref.element,
24
+ setSelectedPageId = _ref.setSelectedPageId,
25
+ setSelectedBlockId = _ref.setSelectedBlockId,
26
+ setURL = _ref.setURL;
27
+ var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
28
+ t = _useTranslation.t;
29
+ var _useState = (0, _react.useState)(false),
30
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
31
+ isOpenSelect = _useState2[0],
32
+ setIsOpenSelect = _useState2[1];
33
+ var _useState3 = (0, _react.useState)({}),
34
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
35
+ collapsedMap = _useState4[0],
36
+ setCollapsedMap = _useState4[1];
37
+ var _useState5 = (0, _react.useState)(''),
38
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
39
+ temSearchContent = _useState6[0],
40
+ setTemSearchContent = _useState6[1];
41
+ var _useState7 = (0, _react.useState)(''),
42
+ _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
43
+ searchContent = _useState8[0],
44
+ setSearchContent = _useState8[1];
45
+ var _useState9 = (0, _react.useState)(false),
46
+ _useState0 = (0, _slicedToArray2["default"])(_useState9, 2),
47
+ isOpenSearch = _useState0[0],
48
+ setIsOpenSearch = _useState0[1];
49
+ var _useState1 = (0, _react.useState)([]),
50
+ _useState10 = (0, _slicedToArray2["default"])(_useState1, 2),
51
+ searchResult = _useState10[0],
52
+ setSearchResult = _useState10[1];
53
+ var searchRef = (0, _react.useRef)(null);
54
+ var _ref2 = editor.editorType === _constants.WIKI_EDITOR && _context["default"].getSetting('navConfig'),
55
+ wikiPageList = _ref2.pages,
56
+ wikiNavPages = _ref2.navigation;
57
+ var _ref3 = element || {},
58
+ linked_wiki_page_id = _ref3.linked_wiki_page_id;
59
+ var _useState11 = (0, _react.useState)(linked_wiki_page_id || ''),
60
+ _useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
61
+ displayedWikiPage = _useState12[0],
62
+ setDisplayedWikiPage = _useState12[1];
63
+ var isCollapsed = function isCollapsed(dirId) {
64
+ return !collapsedMap[dirId];
65
+ };
66
+ var toggleDir = function toggleDir(dirId) {
67
+ setCollapsedMap(function (prev) {
68
+ return (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, prev), {}, (0, _defineProperty2["default"])({}, dirId, !prev[dirId]));
69
+ });
70
+ };
71
+ var executeSearch = (0, _react.useCallback)(function () {
72
+ if (!temSearchContent.trim()) {
73
+ setSearchContent('');
74
+ setIsOpenSearch(false);
75
+ return;
76
+ }
77
+ setSearchContent(temSearchContent);
78
+ setIsOpenSearch(true);
79
+ }, [temSearchContent]);
80
+ var handleSearchInputChange = (0, _react.useCallback)(function (e) {
81
+ var keyword = e.target.value.toLowerCase();
82
+ setTemSearchContent(keyword);
83
+ }, []);
84
+ var handleInputKeyDown = (0, _react.useCallback)(function (e) {
85
+ if ((0, _isHotkey["default"])('enter', e)) {
86
+ e.preventDefault();
87
+ executeSearch();
88
+ }
89
+ if ((0, _isHotkey["default"])('escape', e)) {
90
+ e.preventDefault();
91
+ e.stopPropagation();
92
+ var el = searchRef.current;
93
+ if (!el) return;
94
+ el && el.blur();
95
+ el && (el.value = '');
96
+ setSearchContent('');
97
+ setIsOpenSearch(false);
98
+ }
99
+ // eslint-disable-next-line react-hooks/exhaustive-deps
100
+ }, [executeSearch, isOpenSearch]);
101
+ var getSearchPages = function getSearchPages(searchContent) {
102
+ var result = wikiPageList.filter(function (p) {
103
+ var _p$name;
104
+ return (_p$name = p.name) === null || _p$name === void 0 ? void 0 : _p$name.includes(searchContent);
105
+ });
106
+ result && setSearchResult(result);
107
+ };
108
+ var handleSelect = function handleSelect(e, pageId) {
109
+ e.stopPropagation();
110
+ setSelectedPageId(pageId);
111
+ setSelectedBlockId('');
112
+ setURL('');
113
+ setDisplayedWikiPage(pageId);
114
+ setIsOpenSelect(false);
115
+ setIsOpenSearch(false);
116
+ };
117
+ var handleOnClickClose = function handleOnClickClose(e) {
118
+ e.stopPropagation();
119
+ var el = searchRef.current;
120
+ if (!el) return;
121
+ el && el.blur();
122
+ el && (el.value = '');
123
+ setIsOpenSearch(false);
124
+ setSearchContent('');
125
+ };
126
+ (0, _react.useEffect)(function () {
127
+ if (searchContent.trim() && isOpenSearch) {
128
+ getSearchPages(searchContent);
129
+ }
130
+ // eslint-disable-next-line react-hooks/exhaustive-deps
131
+ }, [isOpenSearch, searchContent]);
132
+ var _renderPage = function renderPage(item, wikiPageList) {
133
+ var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
134
+ var isFromSearch = arguments.length > 3 ? arguments[3] : undefined;
135
+ var page = wikiPageList.find(function (p) {
136
+ return p.id === item.id;
137
+ });
138
+ if (isFromSearch) {
139
+ page.isDir = false;
140
+ }
141
+ return /*#__PURE__*/_react["default"].createElement("div", {
142
+ key: page.id,
143
+ className: "sdoc-wiki-link-page-item-wrapper",
144
+ style: {
145
+ paddingLeft: depth * 16
146
+ }
147
+ }, /*#__PURE__*/_react["default"].createElement("div", {
148
+ className: (0, _classnames["default"])('sdoc-wiki-link-page-item', {
149
+ 'is-dir': page.isDir
150
+ })
151
+ }, page.isDir && /*#__PURE__*/_react["default"].createElement("span", {
152
+ className: (0, _classnames["default"])('toggle-icon-container', {
153
+ 'opened': !isCollapsed(page.id)
154
+ }),
155
+ onClick: function onClick(e) {
156
+ e.stopPropagation();
157
+ toggleDir(page.id);
158
+ }
159
+ }, /*#__PURE__*/_react["default"].createElement("i", {
160
+ className: "sdoc-file-icon sdoc-file-icon-toggle sdocfont sdoc-arrow-down"
161
+ })), /*#__PURE__*/_react["default"].createElement("span", {
162
+ className: "sdoc-wiki-link-page-main",
163
+ onClick: function onClick(e) {
164
+ return handleSelect(e, page.id);
165
+ }
166
+ }, page.icon && /*#__PURE__*/_react["default"].createElement("span", {
167
+ className: "page-icon"
168
+ }, page.icon), !page.icon && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, page.isDir ? /*#__PURE__*/_react["default"].createElement("span", {
169
+ className: "page-icon sf3-font sf3-font-files2"
170
+ }) : /*#__PURE__*/_react["default"].createElement("span", {
171
+ className: "page-icon sf3-font sf3-font-file"
172
+ })), /*#__PURE__*/_react["default"].createElement("span", {
173
+ className: "page-name"
174
+ }, page.name))), page.isDir && !isCollapsed(page.id) && item.children.length > 0 && /*#__PURE__*/_react["default"].createElement("div", {
175
+ className: "sdoc-wiki-link-page-children"
176
+ }, item.children.map(function (child) {
177
+ return _renderPage(child, wikiPageList, depth + 1);
178
+ })));
179
+ };
180
+ return /*#__PURE__*/_react["default"].createElement("div", {
181
+ className: "form-group selected-linked-block-wrapper"
182
+ }, /*#__PURE__*/_react["default"].createElement("div", {
183
+ className: (0, _classnames["default"])('form-control', {
184
+ 'expanded': isOpenSelect
185
+ }),
186
+ onClick: function onClick() {
187
+ setIsOpenSelect(!isOpenSelect);
188
+ }
189
+ }, /*#__PURE__*/_react["default"].createElement("span", {
190
+ className: "selected-wiki-linked-page"
191
+ }, /*#__PURE__*/_react["default"].createElement(_selectedPageDisplay.PageDisplay, {
192
+ pageId: displayedWikiPage,
193
+ wikiPageList: wikiPageList
194
+ })), /*#__PURE__*/_react["default"].createElement("i", {
195
+ className: "sdoc-file-icon sdoc-file-icon-toggle sdocfont sdoc-arrow-down"
196
+ })), isOpenSelect && /*#__PURE__*/_react["default"].createElement("div", {
197
+ className: "link-block-wrapper sdoc-wiki-link-page"
198
+ }, /*#__PURE__*/_react["default"].createElement("div", {
199
+ className: "sdoc-page-search-container"
200
+ }, /*#__PURE__*/_react["default"].createElement("div", {
201
+ className: "sdocfont sdoc-find-replace sdoc-search"
202
+ }), /*#__PURE__*/_react["default"].createElement(_reactstrap.Input, {
203
+ innerRef: searchRef,
204
+ className: "sdoc-search-input",
205
+ onKeyUp: handleInputKeyDown,
206
+ onChange: handleSearchInputChange,
207
+ id: "sdoc-search",
208
+ placeholder: t('Search_page')
209
+ }), /*#__PURE__*/_react["default"].createElement("div", {
210
+ className: "sdoc-search-close-icon",
211
+ onClick: handleOnClickClose
212
+ }, /*#__PURE__*/_react["default"].createElement("i", {
213
+ className: "sdocfont sdoc-sm-close"
214
+ }))), !isOpenSearch && wikiNavPages && wikiNavPages.length > 0 && wikiNavPages.map(function (item) {
215
+ return _renderPage(item, wikiPageList, 0);
216
+ }), isOpenSearch && searchResult.length > 0 && searchResult.map(function (item) {
217
+ return _renderPage(item, wikiPageList, 0, true);
218
+ }), isOpenSearch && searchResult.length === 0 && /*#__PURE__*/_react["default"].createElement("div", {
219
+ className: "no-search-result"
220
+ }, t('No_page_results'))));
221
+ };
222
+ var _default = exports["default"] = LinkedPagesForm;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.PageDisplay = void 0;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var PageDisplay = exports.PageDisplay = function PageDisplay(_ref) {
10
+ var pageId = _ref.pageId,
11
+ wikiPageList = _ref.wikiPageList;
12
+ var page = wikiPageList.find(function (p) {
13
+ return p.id === pageId;
14
+ });
15
+ if (!page) return null;
16
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, page.icon && /*#__PURE__*/_react["default"].createElement("span", {
17
+ className: "page-icon"
18
+ }, page.icon), !page.icon && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, page.isDir ? /*#__PURE__*/_react["default"].createElement("span", {
19
+ className: "page-icon sf3-font sf3-font-files2"
20
+ }) : /*#__PURE__*/_react["default"].createElement("span", {
21
+ className: "page-icon sf3-font sf3-font-file"
22
+ })), /*#__PURE__*/_react["default"].createElement("span", {
23
+ className: "page-name"
24
+ }, page.name));
25
+ };
@@ -11,7 +11,8 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm
11
11
  var _slate = require("@seafile/slate");
12
12
  var _slateReact = require("@seafile/slate-react");
13
13
  var _slugid = _interopRequireDefault(require("slugid"));
14
- var _constants = require("../../constants");
14
+ var _constants = require("../../../constants");
15
+ var _constants2 = require("../../constants");
15
16
  var _core = require("../../core");
16
17
  var isMenuDisabled = exports.isMenuDisabled = function isMenuDisabled(editor, readonly) {
17
18
  if (readonly) return true;
@@ -20,7 +21,7 @@ var isMenuDisabled = exports.isMenuDisabled = function isMenuDisabled(editor, re
20
21
  var notMatch = selectedElems.some(function (elem) {
21
22
  var type = elem.type;
22
23
  if (editor.isVoid(elem)) return true;
23
- if ([_constants.CODE_BLOCK, _constants.CODE_LINE, _constants.LINK].includes(type)) return true;
24
+ if ([_constants2.CODE_BLOCK, _constants2.CODE_LINE, _constants2.LINK].includes(type)) return true;
24
25
  return false;
25
26
  });
26
27
  if (notMatch) return true; // disabled
@@ -32,13 +33,14 @@ var checkLink = exports.checkLink = function checkLink(url) {
32
33
  }
33
34
  return false;
34
35
  };
35
- var genLinkNode = exports.genLinkNode = function genLinkNode(url, text, nodeId) {
36
+ var genLinkNode = exports.genLinkNode = function genLinkNode(url, text, nodeId, pageId) {
36
37
  var linkNode = {
37
38
  id: _slugid["default"].nice(),
38
39
  type: 'link',
39
- href: url,
40
+ href: url || '',
40
41
  title: text,
41
42
  linked_id: nodeId || '',
43
+ linked_wiki_page_id: pageId || '',
42
44
  children: [{
43
45
  id: _slugid["default"].nice(),
44
46
  text: text || ''
@@ -49,30 +51,33 @@ var genLinkNode = exports.genLinkNode = function genLinkNode(url, text, nodeId)
49
51
  var getLinkType = exports.getLinkType = function getLinkType(editor) {
50
52
  var _Editor$nodes = _slate.Editor.nodes(editor, {
51
53
  match: function match(n) {
52
- return (0, _core.getNodeType)(n) === _constants.LINK;
54
+ return (0, _core.getNodeType)(n) === _constants2.LINK;
53
55
  },
54
56
  universal: true
55
57
  }),
56
58
  _Editor$nodes2 = (0, _slicedToArray2["default"])(_Editor$nodes, 1),
57
59
  match = _Editor$nodes2[0];
58
- if (!match) return _constants.PARAGRAPH;
60
+ if (!match) return _constants2.PARAGRAPH;
59
61
  var _match = (0, _slicedToArray2["default"])(match, 1),
60
62
  n = _match[0];
61
63
  return (0, _core.getNodeType)(n);
62
64
  };
63
65
  var insertLink = exports.insertLink = function insertLink(editor, title, url) {
64
- var position = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _constants.INSERT_POSITION.CURRENT;
66
+ var position = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _constants2.INSERT_POSITION.CURRENT;
65
67
  var slateNode = arguments.length > 4 ? arguments[4] : undefined;
66
68
  var linkedNodeId = arguments.length > 5 ? arguments[5] : undefined;
67
- if (position === _constants.INSERT_POSITION.CURRENT && isMenuDisabled(editor)) return;
68
- if (!title || !url && !linkedNodeId) return;
69
+ var selectedPageId = arguments.length > 6 ? arguments[6] : undefined;
70
+ if (position === _constants2.INSERT_POSITION.CURRENT && isMenuDisabled(editor)) return;
71
+ if (!title || !url && !linkedNodeId && !selectedPageId) return;
69
72
  var linkNode = genLinkNode(url, title);
70
73
  if (linkedNodeId) {
71
74
  linkNode = genLinkNode(url, title, linkedNodeId);
75
+ } else if (selectedPageId) {
76
+ linkNode = genLinkNode(url, title, '', selectedPageId);
72
77
  }
73
- if (position === _constants.INSERT_POSITION.AFTER) {
78
+ if (position === _constants2.INSERT_POSITION.AFTER) {
74
79
  var path = _slate.Editor.path(editor, editor.selection);
75
- if (slateNode && (slateNode === null || slateNode === void 0 ? void 0 : slateNode.type) === _constants.LIST_ITEM) {
80
+ if (slateNode && (slateNode === null || slateNode === void 0 ? void 0 : slateNode.type) === _constants2.LIST_ITEM) {
76
81
  path = _slateReact.ReactEditor.findPath(editor, slateNode);
77
82
  var nextPath = _slate.Path.next(path);
78
83
  _slate.Transforms.insertNodes(editor, linkNode, {
@@ -80,7 +85,7 @@ var insertLink = exports.insertLink = function insertLink(editor, title, url) {
80
85
  });
81
86
  return;
82
87
  }
83
- var p = (0, _core.generateEmptyElement)(_constants.ELEMENT_TYPE.PARAGRAPH);
88
+ var p = (0, _core.generateEmptyElement)(_constants2.ELEMENT_TYPE.PARAGRAPH);
84
89
  p.children[1] = linkNode;
85
90
  _slate.Transforms.insertNodes(editor, p, {
86
91
  at: [path[0] + 1]
@@ -113,23 +118,47 @@ var insertLink = exports.insertLink = function insertLink(editor, title, url) {
113
118
  edge: 'end'
114
119
  });
115
120
  };
116
- var updateLink = exports.updateLink = function updateLink(editor, newText, newUrl, linkedNodeId) {
121
+ var updateLink = exports.updateLink = function updateLink(editor, newText, newUrl, linkedNodeId, linkedPageId) {
117
122
  // Update children
118
123
  var linkAbove = (0, _core.getAboveNode)(editor, {
119
124
  match: {
120
- type: _constants.LINK
125
+ type: _constants2.LINK
121
126
  }
122
127
  });
123
128
  if (linkAbove) {
124
129
  var _ref = linkAbove[0] || {},
125
130
  oldUrl = _ref.href,
126
131
  oldText = _ref.title;
127
- if (linkedNodeId) {
128
- _slate.Transforms.setNodes(editor, {
129
- linked_id: linkedNodeId
130
- }, {
131
- at: linkAbove[1]
132
- });
132
+ if (linkedNodeId || linkedPageId) {
133
+ // In non-wiki link
134
+ if (editor.editorType !== _constants.WIKI_EDITOR && linkedNodeId) {
135
+ _slate.Transforms.setNodes(editor, {
136
+ linked_id: linkedNodeId
137
+ }, {
138
+ at: linkAbove[1]
139
+ });
140
+ }
141
+ // In wiki link
142
+ if (editor.editorType === _constants.WIKI_EDITOR) {
143
+ if (linkedNodeId) {
144
+ _slate.Transforms.setNodes(editor, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, linkedNodeId && {
145
+ linked_id: linkedNodeId
146
+ }), {
147
+ linked_wiki_page_id: ''
148
+ }), {
149
+ at: linkAbove[1]
150
+ });
151
+ }
152
+ if (linkedPageId) {
153
+ _slate.Transforms.setNodes(editor, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, linkedPageId && {
154
+ linked_wiki_page_id: linkedPageId
155
+ }), {
156
+ linked_id: ''
157
+ }), {
158
+ at: linkAbove[1]
159
+ });
160
+ }
161
+ }
133
162
  if (oldText !== newText) {
134
163
  _slate.Transforms.setNodes(editor, {
135
164
  title: newText
@@ -138,14 +167,25 @@ var updateLink = exports.updateLink = function updateLink(editor, newText, newUr
138
167
  });
139
168
  }
140
169
  }
141
- if (!linkedNodeId && (oldUrl !== newUrl || oldText !== newText)) {
142
- _slate.Transforms.setNodes(editor, {
143
- href: newUrl,
144
- title: newText,
145
- linked_id: ''
146
- }, {
147
- at: linkAbove[1]
148
- });
170
+ if (!linkedNodeId && !linkedPageId && (oldUrl !== newUrl || oldText !== newText)) {
171
+ if (editor.editorType === _constants.WIKI_EDITOR) {
172
+ _slate.Transforms.setNodes(editor, {
173
+ href: newUrl,
174
+ title: newText,
175
+ linked_id: '',
176
+ linked_wiki_page_id: ''
177
+ }, {
178
+ at: linkAbove[1]
179
+ });
180
+ } else {
181
+ _slate.Transforms.setNodes(editor, {
182
+ href: newUrl,
183
+ title: newText,
184
+ linked_id: ''
185
+ }, {
186
+ at: linkAbove[1]
187
+ });
188
+ }
149
189
  }
150
190
  upsertLinkText(editor, {
151
191
  text: newText
@@ -157,7 +197,7 @@ var upsertLinkText = exports.upsertLinkText = function upsertLinkText(editor, _r
157
197
  var text = _ref2.text;
158
198
  var newLink = (0, _core.getAboveNode)(editor, {
159
199
  match: {
160
- type: _constants.LINK
200
+ type: _constants2.LINK
161
201
  }
162
202
  });
163
203
  if (newLink) {
@@ -182,7 +222,7 @@ var unWrapLinkNode = exports.unWrapLinkNode = function unWrapLinkNode(editor) {
182
222
  if (editor.selection == null) return;
183
223
  var _Editor$nodes3 = _slate.Editor.nodes(editor, {
184
224
  match: function match(n) {
185
- return (0, _core.getNodeType)(n) === _constants.LINK;
225
+ return (0, _core.getNodeType)(n) === _constants2.LINK;
186
226
  }
187
227
  }),
188
228
  _Editor$nodes4 = (0, _slicedToArray2["default"])(_Editor$nodes3, 1),
@@ -194,7 +234,7 @@ var unWrapLinkNode = exports.unWrapLinkNode = function unWrapLinkNode(editor) {
194
234
  // unlink
195
235
  _slate.Transforms.unwrapNodes(editor, {
196
236
  match: function match(n) {
197
- return (0, _core.getNodeType)(n) === _constants.LINK;
237
+ return (0, _core.getNodeType)(n) === _constants2.LINK;
198
238
  }
199
239
  });
200
240
  };
@@ -220,7 +260,7 @@ var isCommonFile = exports.isCommonFile = function isCommonFile(res, url) {
220
260
  var _ref5 = fileInfo || {},
221
261
  is_dir = _ref5.is_dir,
222
262
  file_ext = _ref5.file_ext;
223
- return fileInfo && !is_dir && !['sdoc', 'exdraw', 'video'].includes(file_ext);
263
+ return fileInfo && !is_dir && file_ext && !['sdoc', 'exdraw', 'video'].includes(file_ext);
224
264
  };
225
265
  var isWeChat = exports.isWeChat = function isWeChat() {
226
266
  var ua = window.navigator.userAgent.toLowerCase();
@@ -250,7 +290,7 @@ var isLinkToolBarActive = exports.isLinkToolBarActive = function isLinkToolBarAc
250
290
  if (!editor.selection) return false;
251
291
  var _Editor$nodes5 = _slate.Editor.nodes(editor, {
252
292
  match: function match(n) {
253
- return (0, _core.getNodeType)(n) === _constants.LINK;
293
+ return (0, _core.getNodeType)(n) === _constants2.LINK;
254
294
  }
255
295
  }),
256
296
  _Editor$nodes6 = (0, _slicedToArray2["default"])(_Editor$nodes5, 1),
@@ -278,7 +318,7 @@ var parseHtmlString = exports.parseHtmlString = function parseHtmlString(htmlStr
278
318
  return resultHtml;
279
319
  };
280
320
  var isEmptyNode = exports.isEmptyNode = function isEmptyNode(node) {
281
- if (node.type === _constants.IMAGE_BLOCK) return false;
321
+ if (node.type === _constants2.IMAGE_BLOCK) return false;
282
322
  var text = _slate.Node.string(node);
283
323
  return text.trim() === '';
284
324
  };
@@ -13,6 +13,7 @@ var _reactI18next = require("react-i18next");
13
13
  var _slate = require("@seafile/slate");
14
14
  var _slateReact = require("@seafile/slate-react");
15
15
  var _tooltip = _interopRequireDefault(require("../../../../components/tooltip"));
16
+ var _eventBus = _interopRequireDefault(require("../../../../utils/event-bus"));
16
17
  var _helpers = require("../helpers");
17
18
  require("./index.css");
18
19
  var LinkHover = function LinkHover(_ref) {
@@ -24,7 +25,8 @@ var LinkHover = function LinkHover(_ref) {
24
25
  var readOnly = (0, _slateReact.useReadOnly)();
25
26
  var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
26
27
  t = _useTranslation.t;
27
- var linked_id = element.linked_id;
28
+ var linked_id = element.linked_id,
29
+ linked_wiki_page_id = element.linked_wiki_page_id;
28
30
  var _useState = (0, _react.useState)(false),
29
31
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
30
32
  isShowTooltip = _useState2[0],
@@ -43,7 +45,14 @@ var LinkHover = function LinkHover(_ref) {
43
45
  }, [element.href]);
44
46
  var handleOnClick = (0, _react.useCallback)(function (event) {
45
47
  event.stopPropagation();
46
- if (!linked_id) return;
48
+ if (!linked_id && !linked_wiki_page_id) return;
49
+ if (linked_wiki_page_id) {
50
+ var eventBus = _eventBus["default"].getInstance();
51
+ eventBus.dispatch('open_wiki_page_id_link', {
52
+ page_id: linked_wiki_page_id
53
+ });
54
+ return;
55
+ }
47
56
  var _Editor$nodes = _slate.Editor.nodes(editor, {
48
57
  at: [],
49
58
  match: function match(n) {
@@ -69,7 +78,7 @@ var LinkHover = function LinkHover(_ref) {
69
78
  id: "link-op-menu",
70
79
  className: "link-op-menu",
71
80
  style: menuPosition
72
- }, linked_id ? /*#__PURE__*/_react["default"].createElement("span", {
81
+ }, linked_id || linked_wiki_page_id ? /*#__PURE__*/_react["default"].createElement("span", {
73
82
  className: "link-op-menu-link",
74
83
  onClick: handleOnClick
75
84
  }, t('Go_to_link')) : /*#__PURE__*/_react["default"].createElement("span", {
@@ -22,7 +22,8 @@ var _utils = require("../../utils");
22
22
  var _helpers = require("../file-link/helpers");
23
23
  var _helpers2 = require("../sdoc-link/helpers");
24
24
  var _helper = require("../whiteboard/helper");
25
- var _helpers3 = require("./helpers");
25
+ var _helpers3 = require("../wiki-link/helpers");
26
+ var _helpers4 = require("./helpers");
26
27
  var withLink = function withLink(editor) {
27
28
  var normalizeNode = editor.normalizeNode,
28
29
  isInline = editor.isInline,
@@ -42,18 +43,18 @@ var withLink = function withLink(editor) {
42
43
  };
43
44
  newEditor.insertData = /*#__PURE__*/function () {
44
45
  var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/(0, _regenerator2["default"])().m(function _callee(data) {
45
- var text, res, fileName, fileUuid, _fileName, fileParentPath, filePath, _fileName2, _fileUuid, url, linkedNodeId, title, params, link, _link, _link2, _Editor$next, _Editor$next2, focusPath, focusPoint, _t;
46
+ var text, res, fileName, fileUuid, _fileName, fileParentPath, filePath, _fileName2, _fileUuid, url, pathname, _context$getSetting, parts, wikiPageId, title, wikiPageList, page, linkedNodeId, _title, params, link, _link, _link2, _Editor$next, _Editor$next2, focusPath, focusPoint, _t;
46
47
  return (0, _regenerator2["default"])().w(function (_context) {
47
48
  while (1) switch (_context.p = _context.n) {
48
49
  case 0:
49
50
  // Paste link content
50
51
  text = data.getData('text/plain'); // Internal link, insert sdoc file link
51
52
  if (!((0, _isUrl["default"])(text) && !(0, _utils.isImage)(text))) {
52
- _context.n = 12;
53
+ _context.n = 14;
53
54
  break;
54
55
  }
55
56
  if (!(0, _utils.isSameDomain)(text, _context2["default"].getSetting('serviceUrl'))) {
56
- _context.n = 10;
57
+ _context.n = 12;
57
58
  break;
58
59
  }
59
60
  _context.p = 1;
@@ -61,17 +62,17 @@ var withLink = function withLink(editor) {
61
62
  return _context2["default"].getLinkFilesInfo([text]);
62
63
  case 2:
63
64
  res = _context.v;
64
- if (!(0, _helpers3.isSdocFile)(res, text)) {
65
+ if (!(0, _helpers4.isSdocFile)(res, text)) {
65
66
  _context.n = 3;
66
67
  break;
67
68
  }
68
69
  fileName = res.data.files_info[text].name;
69
70
  fileUuid = res.data.files_info[text].file_uuid;
70
71
  (0, _helpers2.insertSdocFileLink)(editor, fileName, fileUuid);
71
- _context.n = 7;
72
+ _context.n = 9;
72
73
  break;
73
74
  case 3:
74
- if (!(0, _helpers3.isExdrawFile)(res, text)) {
75
+ if (!(0, _helpers4.isExdrawFile)(res, text)) {
75
76
  _context.n = 4;
76
77
  break;
77
78
  }
@@ -79,62 +80,85 @@ var withLink = function withLink(editor) {
79
80
  fileParentPath = res.data.files_info[text].parent_path;
80
81
  filePath = fileParentPath + '/' + _fileName;
81
82
  (0, _helper.insertWhiteboard)(editor, _fileName, filePath);
82
- _context.n = 7;
83
+ _context.n = 9;
83
84
  break;
84
85
  case 4:
85
- if (!(0, _helpers3.isCommonFile)(res, text)) {
86
+ if (!(0, _helpers4.isCommonFile)(res, text)) {
86
87
  _context.n = 5;
87
88
  break;
88
89
  }
89
90
  _fileName2 = res.data.files_info[text].name;
90
91
  _fileUuid = res.data.files_info[text].file_uuid;
91
92
  (0, _helpers.insertFileLink)(editor, _fileName2, _fileUuid);
92
- _context.n = 7;
93
+ _context.n = 9;
93
94
  break;
94
95
  case 5:
95
- url = new URL(text);
96
- linkedNodeId = url.hash.replace(/^#/, '');
96
+ url = new URL(text); // Insert wiki page as link in wiki
97
+ pathname = url.pathname;
98
+ if (!(editor.editorType === _constants.WIKI_EDITOR && pathname.includes('/wikis/'))) {
99
+ _context.n = 7;
100
+ break;
101
+ }
102
+ parts = pathname.split('/');
103
+ wikiPageId = parts[parts.length - 2];
97
104
  if (!(editor.selection && !_slate.Range.isCollapsed(editor.selection))) {
98
105
  _context.n = 6;
99
106
  break;
100
107
  }
101
108
  title = (0, _core.getEditorString)(editor, editor.selection);
102
- (0, _helpers3.insertLink)(editor, title, text, _constants2.INSERT_POSITION.CURRENT, null, linkedNodeId);
109
+ (0, _helpers4.insertLink)(editor, title, text, _constants2.INSERT_POSITION.CURRENT, null, '', wikiPageId);
103
110
  return _context.a(2);
104
111
  case 6:
112
+ wikiPageList = (_context$getSetting = _context2["default"].getSetting('navConfig')) === null || _context$getSetting === void 0 ? void 0 : _context$getSetting.pages;
113
+ page = wikiPageList === null || wikiPageList === void 0 ? void 0 : wikiPageList.find(function (p) {
114
+ return p.id === wikiPageId;
115
+ });
116
+ page && (0, _helpers3.insertWikiPageLink)(editor, page.name, page.wikiRepoId, page.id);
117
+ return _context.a(2);
118
+ case 7:
119
+ // Insert block element as link
120
+ linkedNodeId = url.hash.replace(/^#/, '');
121
+ if (!(editor.selection && !_slate.Range.isCollapsed(editor.selection))) {
122
+ _context.n = 8;
123
+ break;
124
+ }
125
+ _title = (0, _core.getEditorString)(editor, editor.selection);
126
+ (0, _helpers4.insertLink)(editor, _title, text, _constants2.INSERT_POSITION.CURRENT, null, linkedNodeId);
127
+ return _context.a(2);
128
+ case 8:
105
129
  params = new URLSearchParams(url.search);
106
130
  if (params.get('from') === 'copy-block') {
107
- link = (0, _helpers3.genLinkNode)(text, text, linkedNodeId);
131
+ link = (0, _helpers4.genLinkNode)(text, text, linkedNodeId);
108
132
  } else {
109
- link = (0, _helpers3.genLinkNode)(text, text);
133
+ link = (0, _helpers4.genLinkNode)(text, text);
110
134
  }
111
135
  _slate.Transforms.insertNodes(newEditor, link);
112
- case 7:
113
- _context.n = 9;
114
- break;
115
- case 8:
116
- _context.p = 8;
117
- _t = _context.v;
118
- _link = (0, _helpers3.genLinkNode)(text, text);
119
- _slate.Transforms.insertNodes(newEditor, _link);
120
136
  case 9:
121
137
  _context.n = 11;
122
138
  break;
123
139
  case 10:
124
- _link2 = (0, _helpers3.genLinkNode)(text, text);
125
- _slate.Transforms.insertNodes(newEditor, _link2);
140
+ _context.p = 10;
141
+ _t = _context.v;
142
+ _link = (0, _helpers4.genLinkNode)(text, text);
143
+ _slate.Transforms.insertNodes(newEditor, _link);
126
144
  case 11:
145
+ _context.n = 13;
146
+ break;
147
+ case 12:
148
+ _link2 = (0, _helpers4.genLinkNode)(text, text);
149
+ _slate.Transforms.insertNodes(newEditor, _link2);
150
+ case 13:
127
151
  // Void merging text from link
128
152
  _Editor$next = _slate.Editor.next(newEditor), _Editor$next2 = (0, _slicedToArray2["default"])(_Editor$next, 2), focusPath = _Editor$next2[1];
129
153
  focusPoint = _slate.Editor.start(newEditor, focusPath);
130
154
  _slate.Transforms.select(newEditor, focusPoint);
131
155
  return _context.a(2);
132
- case 12:
156
+ case 14:
133
157
  insertData(data);
134
- case 13:
158
+ case 15:
135
159
  return _context.a(2);
136
160
  }
137
- }, _callee, null, [[1, 8]]);
161
+ }, _callee, null, [[1, 10]]);
138
162
  }));
139
163
  return function (_x) {
140
164
  return _ref.apply(this, arguments);
@@ -80,9 +80,22 @@ var Link = /*#__PURE__*/function (_React$Component) {
80
80
  });
81
81
  (0, _defineProperty2["default"])(_this, "onLinkClick", function (e) {
82
82
  var isModClick = (0, _commonUtils.isMac)() ? e.metaKey : e.ctrlKey;
83
+ var _this$props$element = _this.props.element,
84
+ linked_id = _this$props$element.linked_id,
85
+ linked_wiki_page_id = _this$props$element.linked_wiki_page_id,
86
+ href = _this$props$element.href;
83
87
  // mod + click
84
- if (isModClick && !_this.props.element.linked_id) {
85
- window.open(_this.props.element.href, '_blank', 'noreferrer');
88
+ if (isModClick && !linked_id && !linked_wiki_page_id) {
89
+ window.open(href, '_blank', 'noreferrer');
90
+ return;
91
+ }
92
+ // mod + click on linked wiki page
93
+ if (isModClick && linked_wiki_page_id) {
94
+ var _href = window.location.href;
95
+ var parts = _href.split('/');
96
+ parts[parts.length - 2] = linked_wiki_page_id;
97
+ var newHref = parts.join('/');
98
+ window.open(newHref, '_blank', 'noreferrer');
86
99
  return;
87
100
  }
88
101
  _this.setPosition(e.target);
@@ -23,7 +23,7 @@
23
23
  width: calc(100% - 50px);
24
24
  max-width: 100%;
25
25
  position: relative;
26
- padding: 5px 5px 5px 0px;
26
+ padding: 5px 0px;
27
27
  box-sizing: border-box;
28
28
  word-wrap: break-word;
29
29
  white-space: pre-wrap;
@@ -45,7 +45,7 @@
45
45
  }
46
46
 
47
47
  .sdoc-multicolumn-container .column-resize-handler .column-width-just.active,
48
- .sdoc-multicolumn-container .column-resize-handler .column-width-just:hover {
48
+ .sdoc-multicolumn-container .column-resize-handler .column-width-just:hover {
49
49
  background-color: lightgray;
50
50
  cursor: col-resize;
51
51
  }
@@ -18,6 +18,7 @@ var _constants = require("../../../../constants");
18
18
  var _usePlugins2 = require("../../../../hooks/use-plugins");
19
19
  var _eventBus = _interopRequireDefault(require("../../../../utils/event-bus"));
20
20
  var _commons = require("../../../commons");
21
+ var _elementType = require("../../../constants/element-type");
21
22
  var _constants2 = require("../constants");
22
23
  var _helpers = require("../helpers");
23
24
  require("./index.css");
@@ -90,6 +91,16 @@ var SdocLinkHoverMenu = function SdocLinkHoverMenu(_ref) {
90
91
  }, 0);
91
92
  // eslint-disable-next-line react-hooks/exhaustive-deps
92
93
  }, [updateDisplayPlugin]);
94
+ var handleClickOpenLink = (0, _react.useCallback)(function (e) {
95
+ e.stopPropagation();
96
+ if (element.type === _elementType.WIKI_LINK && element.page_id) {
97
+ e.preventDefault();
98
+ var eventBus = _eventBus["default"].getInstance();
99
+ eventBus.dispatch('open_wiki_page_id_link', {
100
+ page_id: element.page_id
101
+ });
102
+ }
103
+ }, [element]);
93
104
  var selectedType = element.display_type || _constants2.SDOC_LINK_TYPE.TEXT_LINK;
94
105
  var newSdocFileTypes = _constants2.SDOC_LINK_TYPES.filter(function (sdocLinkType) {
95
106
  return (0, _helpers.isInTable)(editor, element) ? sdocLinkType !== _constants2.SDOC_LINK_TYPE.CARD_LINK : true;
@@ -111,9 +122,7 @@ var SdocLinkHoverMenu = function SdocLinkHoverMenu(_ref) {
111
122
  target: "_blank",
112
123
  rel: "noopener noreferrer",
113
124
  className: "link-op-menu-link",
114
- onClick: function onClick(e) {
115
- return e.stopPropagation();
116
- }
125
+ onClick: handleClickOpenLink
117
126
  }, t('Open_link')))), !readOnly && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("span", {
118
127
  className: "op-group-item"
119
128
  }, /*#__PURE__*/_react["default"].createElement("span", {
@@ -23,6 +23,10 @@ var insertWikiPageLink = exports.insertWikiPageLink = function insertWikiPageLin
23
23
  var wikiLinkNode = generateWikiFileNode(wikiRepoId, pageId, text, icon, isDir);
24
24
  if (isCollapsed) {
25
25
  _slate.Transforms.insertNodes(editor, wikiLinkNode);
26
+ var point = _slate.Editor.after(editor, editor.selection);
27
+ if (point) {
28
+ _slate.Transforms.select(editor, point);
29
+ }
26
30
  } else {
27
31
  var selectedText = _slate.Editor.string(editor, selection); // Selected text
28
32
  if (selectedText !== text) {
@@ -17,7 +17,6 @@
17
17
  .sdoc-side-toolbar-container .sdoc-side-op-icon {
18
18
  border-radius: 3px;
19
19
  padding: 0px 3px;
20
- height: 24px;
21
20
  color: #AFAFAD;
22
21
  margin-right: 1px;
23
22
  cursor: pointer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "3.0.71",
3
+ "version": "3.0.72",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "test": "jest",
@@ -72,5 +72,5 @@
72
72
  "publishConfig": {
73
73
  "access": "public"
74
74
  },
75
- "gitHead": "ccaa7f7243068772c89962fd7924278903e382be"
75
+ "gitHead": "4501139e3f681c75bb68f8a1a2b235788c7b2c9b"
76
76
  }