@seafile/sdoc-editor 3.0.219 → 3.0.220

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.
@@ -155,12 +155,82 @@
155
155
  margin: 0;
156
156
  }
157
157
 
158
+ .sdoc-editor__article .sdoc-image-visual {
159
+ position: relative;
160
+ display: inline-block;
161
+ }
162
+
163
+ .sdoc-editor__article .sdoc-image-readonly-link-indicator {
164
+ position: absolute;
165
+ z-index: 2;
166
+ opacity: 0;
167
+ visibility: hidden;
168
+ transition: opacity 0.15s ease;
169
+ }
170
+
171
+ .sdoc-editor__article .sdoc-image-readonly-link-indicator {
172
+ bottom: 8px;
173
+ left: 8px;
174
+ display: flex;
175
+ max-width: calc(100% - 16px);
176
+ color: #fff;
177
+ font-size: 14px;
178
+ line-height: 20px;
179
+ align-items: center;
180
+ gap: 6px;
181
+ pointer-events: none;
182
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.7);
183
+ }
184
+
185
+ .sdoc-editor__article .sdoc-image-readonly-link-indicator .sdocfont {
186
+ flex: 0 0 auto;
187
+ font-size: 18px;
188
+ }
189
+
190
+ .sdoc-editor__article .sdoc-image-readonly-link-name {
191
+ min-width: 0;
192
+ overflow: hidden;
193
+ text-overflow: ellipsis;
194
+ white-space: nowrap;
195
+ }
196
+
197
+ .sdoc-editor__article .sdoc-image-readonly-fullscreen-container {
198
+ top: -42px;
199
+ left: -3px;
200
+ z-index: auto;
201
+ opacity: 0;
202
+ visibility: hidden;
203
+ pointer-events: none;
204
+ }
205
+
206
+ .sdoc-editor__article .sdoc-image-visual:hover .sdoc-image-readonly-fullscreen-container,
207
+ .sdoc-editor__article .sdoc-image-readonly-fullscreen-container:focus-within {
208
+ opacity: 1;
209
+ visibility: visible;
210
+ pointer-events: auto;
211
+ }
212
+
213
+ .sdoc-editor__article .sdoc-image-visual:hover .sdoc-image-readonly-link-indicator {
214
+ opacity: 1;
215
+ visibility: visible;
216
+ }
217
+
158
218
  .sdoc-editor__article .sdoc-image-content {
159
219
  display: flex;
160
220
  flex-direction: column;
161
221
  align-items: center;
162
222
  }
163
223
 
224
+ .sdoc-editor__article .sdoc-image-page-link {
225
+ display: inline-block;
226
+ cursor: pointer;
227
+ }
228
+
229
+ .sdoc-editor__article .sdoc-image-page-link:focus-visible {
230
+ outline: 2px solid #1991eb;
231
+ outline-offset: 2px;
232
+ }
233
+
164
234
  .sdoc-editor__article .sdoc-image-content :first-child {
165
235
  position: relative;
166
236
  }
@@ -5,12 +5,52 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports["default"] = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
8
9
  var _slugid = _interopRequireDefault(require("slugid"));
9
10
  var _constants = require("../../../constants");
11
+ var _linkHelpers = require("../../image/link-helpers");
10
12
  var linkRule = function linkRule(element, parseChild) {
11
13
  var nodeName = element.nodeName;
12
14
  var content = element.textContent || element.getAttribute('title') || element.getAttribute('href');
13
15
  if (nodeName === 'A') {
16
+ var image = (0, _linkHelpers.getOnlyImageChild)(element);
17
+ if (image) {
18
+ var href = (0, _linkHelpers.normalizeWebUrl)(element.getAttribute('href'));
19
+ return {
20
+ id: _slugid["default"].nice(),
21
+ type: _constants.IMAGE,
22
+ data: (0, _objectSpread2["default"])({
23
+ src: image.getAttribute('src')
24
+ }, href && {
25
+ href: href
26
+ }),
27
+ children: [{
28
+ text: '',
29
+ id: _slugid["default"].nice()
30
+ }]
31
+ };
32
+ }
33
+ if (element.querySelector('img')) {
34
+ var _href = (0, _linkHelpers.normalizeWebUrl)(element.getAttribute('href'));
35
+ return parseChild(element.childNodes).map(function (child) {
36
+ if (!_href) return child;
37
+ if (child.type === _constants.IMAGE) return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, child), {}, {
38
+ data: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, child.data), {}, {
39
+ href: _href
40
+ })
41
+ });
42
+ if (typeof child.text === 'string') {
43
+ return {
44
+ id: _slugid["default"].nice(),
45
+ type: _constants.LINK,
46
+ href: _href,
47
+ title: element.getAttribute('title'),
48
+ children: [child]
49
+ };
50
+ }
51
+ return child;
52
+ });
53
+ }
14
54
  return {
15
55
  id: _slugid["default"].nice(),
16
56
  type: _constants.LINK,
@@ -4,8 +4,16 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.updateImage = exports.selectImageWhenSelectPartial = exports.resetCursor = exports.removeImageBlockNode = exports.queryCopyMoveProgressView = exports.isInsertImageMenuDisabled = exports.isImageUrlIsFromUpload = exports.isImageUrlIsFromCopy = exports.isCommentEditor = exports.insertImageFiles = exports.insertImage = exports.hasSdocImages = exports.handleBase64Image = exports.getSingleImageFromFragment = exports.getImageURL = exports.getImageData = exports.getDigitalSignImgUrl = exports.getColumnByKey = exports.generateImageNode = exports.generateImageInfos = void 0;
7
+ exports.getImageURL = exports.getImageData = exports.getDigitalSignImgUrl = exports.getColumnByKey = exports.generateImageNode = exports.generateImageInfos = void 0;
8
+ Object.defineProperty(exports, "getImageWikiPageUrl", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _linkHelpers.getImageWikiPageUrl;
12
+ }
13
+ });
14
+ exports.updateImage = exports.selectImageWhenSelectPartial = exports.resetCursor = exports.removeImageWikiPageLinks = exports.removeImageBlockNode = exports.queryCopyMoveProgressView = exports.isInsertImageMenuDisabled = exports.isImageUrlIsFromUpload = exports.isImageUrlIsFromCopy = exports.isCommentEditor = exports.insertImageFiles = exports.insertImage = exports.hasSdocImages = exports.handleBase64Image = exports.getSingleImageFromFragment = void 0;
8
15
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
16
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectWithoutProperties"));
9
17
  var _regenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/regenerator"));
10
18
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/asyncToGenerator"));
11
19
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
@@ -22,6 +30,8 @@ var _constants2 = require("../../constants");
22
30
  var _core = require("../../core");
23
31
  var _base64ToUnit8array = _interopRequireDefault(require("./base64-to-unit8array"));
24
32
  var _imageCache = _interopRequireDefault(require("./image-cache"));
33
+ var _linkHelpers = require("./link-helpers");
34
+ var _excluded = ["href", "linked_wiki_id", "linked_wiki_page_id"];
25
35
  // TODO: seatable_column
26
36
  var getDigitalSignImgUrl = exports.getDigitalSignImgUrl = function getDigitalSignImgUrl(partUrl) {
27
37
  var server = _context2["default"].getSetting('serviceUrl');
@@ -287,6 +297,28 @@ var getSingleImageFromFragment = exports.getSingleImageFromFragment = function g
287
297
  if (images.length !== 1) return null;
288
298
  return images[0];
289
299
  };
300
+ var _removeImageWikiPageLinks = exports.removeImageWikiPageLinks = function removeImageWikiPageLinks() {
301
+ var nodes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
302
+ return nodes.map(function (node) {
303
+ if ((node === null || node === void 0 ? void 0 : node.type) === _constants2.IMAGE) {
304
+ var _node$data, _node$data2;
305
+ var isWikiPageLink = Boolean(((_node$data = node.data) === null || _node$data === void 0 ? void 0 : _node$data.linked_wiki_id) || ((_node$data2 = node.data) === null || _node$data2 === void 0 ? void 0 : _node$data2.linked_wiki_page_id));
306
+ if (!isWikiPageLink) return node;
307
+ var _ref4 = node.data || {},
308
+ href = _ref4.href,
309
+ linked_wiki_id = _ref4.linked_wiki_id,
310
+ linked_wiki_page_id = _ref4.linked_wiki_page_id,
311
+ data = (0, _objectWithoutProperties2["default"])(_ref4, _excluded);
312
+ return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, node), {}, {
313
+ data: data
314
+ });
315
+ }
316
+ if (!Array.isArray(node === null || node === void 0 ? void 0 : node.children)) return node;
317
+ return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, node), {}, {
318
+ children: _removeImageWikiPageLinks(node.children)
319
+ });
320
+ });
321
+ };
290
322
  var insertImageFiles = exports.insertImageFiles = function insertImageFiles(files, editor, targetPath) {
291
323
  var imgInfos = generateImageInfos(files);
292
324
  insertImage(editor, imgInfos, targetPath, _constants2.INSERT_POSITION.AFTER);
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
4
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports["default"] = void 0;
9
9
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
10
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectWithoutProperties"));
10
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
11
12
  var _react = _interopRequireWildcard(require("react"));
12
13
  var _reactI18next = require("react-i18next");
@@ -14,15 +15,22 @@ var _slate = require("@seafile/slate");
14
15
  var _slateReact = require("@seafile/slate-react");
15
16
  var _classnames = _interopRequireDefault(require("classnames"));
16
17
  var _tooltip = _interopRequireDefault(require("../../../../components/tooltip"));
18
+ var _constants = require("../../../../constants");
17
19
  var _commons = require("../../../commons");
18
- var _constants = require("../../../constants");
20
+ var _constants2 = require("../../../constants");
19
21
  var _core = require("../../../core");
20
- var _constants2 = require("../constants");
22
+ var _constants3 = require("../constants");
21
23
  var _imagePreviewer = _interopRequireDefault(require("../dialogs/image-previewer"));
22
24
  var _helpers = require("../helpers");
25
+ var _linkHelpers = require("../link-helpers");
26
+ var _imageLinkPopover = _interopRequireDefault(require("../popover/image-link-popover"));
23
27
  require("./index.css");
28
+ var _excluded = ["href", "linked_wiki_id", "linked_wiki_page_id"],
29
+ _excluded2 = ["href", "linked_wiki_id", "linked_wiki_page_id"],
30
+ _excluded3 = ["href", "linked_wiki_id", "linked_wiki_page_id"];
24
31
  var ImageHoverMenu = function ImageHoverMenu(_ref) {
25
32
  var editor = _ref.editor,
33
+ menuRef = _ref.menuRef,
26
34
  menuPosition = _ref.menuPosition,
27
35
  element = _ref.element,
28
36
  parentNodeEntry = _ref.parentNodeEntry,
@@ -32,7 +40,7 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
32
40
  readonly = _ref.readonly;
33
41
  var data = element.data,
34
42
  _element$border_type = element.border_type,
35
- border_type = _element$border_type === void 0 ? _constants2.IMAGE_BORDER_TYPE[0].type : _element$border_type;
43
+ border_type = _element$border_type === void 0 ? _constants3.IMAGE_BORDER_TYPE[0].type : _element$border_type;
36
44
  var _parentNodeEntry$ = parentNodeEntry[0],
37
45
  _parentNodeEntry$$ali = _parentNodeEntry$.align,
38
46
  align = _parentNodeEntry$$ali === void 0 ? 'left' : _parentNodeEntry$$ali,
@@ -53,28 +61,82 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
53
61
  setIsShowImagePreview = _useState4[1];
54
62
  var _useState5 = (0, _react.useState)(false),
55
63
  _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
56
- isShowTooltip = _useState6[0],
57
- setIsShowTooltip = _useState6[1];
64
+ isShowImageLinkPopover = _useState6[0],
65
+ setIsShowImageLinkPopover = _useState6[1];
66
+ var _useState7 = (0, _react.useState)(false),
67
+ _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
68
+ isShowTooltip = _useState8[0],
69
+ setIsShowTooltip = _useState8[1];
70
+ var isWiki = editor.editorType === _constants.WIKI_EDITOR;
71
+ var currentHref = data.href;
58
72
  (0, _react.useEffect)(function () {
59
73
  setIsShowTooltip(true);
60
74
  }, []);
75
+ var updateImageLink = (0, _react.useCallback)(function (href) {
76
+ var path = _slateReact.ReactEditor.findPath(editor, element);
77
+ var oldHref = data.href,
78
+ linked_wiki_id = data.linked_wiki_id,
79
+ linked_wiki_page_id = data.linked_wiki_page_id,
80
+ newData = (0, _objectWithoutProperties2["default"])(data, _excluded);
81
+ var normalizedHref = (0, _linkHelpers.normalizeWebUrl)(href);
82
+ _slate.Transforms.setNodes(editor, {
83
+ data: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, newData), {}, {
84
+ href: normalizedHref
85
+ })
86
+ }, {
87
+ at: path
88
+ });
89
+ setIsShowImageLinkPopover(false);
90
+ onHideImageHoverMenu();
91
+ }, [data, editor, element, onHideImageHoverMenu]);
92
+ var updateImagePageLink = (0, _react.useCallback)(function (pageId, wikiId) {
93
+ var path = _slateReact.ReactEditor.findPath(editor, element);
94
+ var href = data.href,
95
+ linked_wiki_id = data.linked_wiki_id,
96
+ linked_wiki_page_id = data.linked_wiki_page_id,
97
+ newData = (0, _objectWithoutProperties2["default"])(data, _excluded2);
98
+ _slate.Transforms.setNodes(editor, {
99
+ data: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, newData), {}, {
100
+ href: (0, _linkHelpers.getImageWikiPageUrl)(wikiId, pageId),
101
+ linked_wiki_id: wikiId,
102
+ linked_wiki_page_id: pageId
103
+ })
104
+ }, {
105
+ at: path
106
+ });
107
+ setIsShowImageLinkPopover(false);
108
+ onHideImageHoverMenu();
109
+ }, [data, editor, element, onHideImageHoverMenu]);
110
+ var removeImageLink = (0, _react.useCallback)(function () {
111
+ var path = _slateReact.ReactEditor.findPath(editor, element);
112
+ var href = data.href,
113
+ linked_wiki_id = data.linked_wiki_id,
114
+ linked_wiki_page_id = data.linked_wiki_page_id,
115
+ newData = (0, _objectWithoutProperties2["default"])(data, _excluded3);
116
+ _slate.Transforms.setNodes(editor, {
117
+ data: newData
118
+ }, {
119
+ at: path
120
+ });
121
+ setIsShowImageLinkPopover(false);
122
+ onHideImageHoverMenu();
123
+ }, [data, editor, element, onHideImageHoverMenu]);
61
124
  var onShowProver = (0, _react.useCallback)(function (event, showProverKey) {
62
125
  event.stopPropagation();
63
- var newPopoverState = popoverState;
64
- for (var key in newPopoverState) {
65
- if (key === showProverKey) {
66
- newPopoverState[key] = !newPopoverState[key];
67
- } else {
68
- newPopoverState[key] = false;
126
+ setIsShowImageLinkPopover(false);
127
+ setPopoverState(function (prevState) {
128
+ var nextState = {};
129
+ for (var key in prevState) {
130
+ nextState[key] = key === showProverKey ? !prevState[key] : false;
69
131
  }
70
- }
71
- setPopoverState((0, _objectSpread2["default"])({}, newPopoverState));
72
- }, [popoverState]);
132
+ return nextState;
133
+ });
134
+ }, []);
73
135
  var onSelect = (0, _react.useCallback)(function (event, props) {
74
136
  event.stopPropagation();
75
137
  var path = _slateReact.ReactEditor.findPath(editor, element);
76
138
  if (path) {
77
- if (props['display_type'] === _constants.IMAGE_BLOCK && type === _constants.PARAGRAPH) {
139
+ if (props['display_type'] === _constants2.IMAGE_BLOCK && type === _constants2.PARAGRAPH) {
78
140
  // Remove old node
79
141
  var nodeEntry = _slate.Editor.node(editor, [path[0]]);
80
142
  var newNodeEntry = JSON.parse(JSON.stringify(nodeEntry.slice(0)));
@@ -96,14 +158,14 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
96
158
  var _item$text;
97
159
  return (item === null || item === void 0 ? void 0 : (_item$text = item.text) === null || _item$text === void 0 ? void 0 : _item$text.length) === 0;
98
160
  })) {
99
- beforeNode = (0, _core.generateEmptyElement)(_constants.PARAGRAPH);
161
+ beforeNode = (0, _core.generateEmptyElement)(_constants2.PARAGRAPH);
100
162
  beforeNode.children = beforeLeaf;
101
163
  _slate.Transforms.insertNodes(editor, beforeNode, {
102
164
  at: [p]
103
165
  });
104
166
  p = p + 1;
105
167
  }
106
- centerNode = (0, _core.generateEmptyElement)(_constants.IMAGE_BLOCK);
168
+ centerNode = (0, _core.generateEmptyElement)(_constants2.IMAGE_BLOCK);
107
169
  centerNode.children = imageLeaf;
108
170
  _slate.Transforms.insertNodes(editor, centerNode, {
109
171
  at: [p]
@@ -113,7 +175,7 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
113
175
  var _item$text2;
114
176
  return (item === null || item === void 0 ? void 0 : (_item$text2 = item.text) === null || _item$text2 === void 0 ? void 0 : _item$text2.length) === 0;
115
177
  })) {
116
- afterNode = (0, _core.generateEmptyElement)(_constants.PARAGRAPH);
178
+ afterNode = (0, _core.generateEmptyElement)(_constants2.PARAGRAPH);
117
179
  afterNode.children = afterLeaf;
118
180
  _slate.Transforms.insertNodes(editor, afterNode, {
119
181
  at: [p]
@@ -121,13 +183,13 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
121
183
  }
122
184
  return;
123
185
  }
124
- if (props['display_type'] === _constants.PARAGRAPH && type === _constants.IMAGE_BLOCK) {
186
+ if (props['display_type'] === _constants2.PARAGRAPH && type === _constants2.IMAGE_BLOCK) {
125
187
  var _nodeEntry = _slate.Editor.node(editor, [path[0]]);
126
188
  var _newNodeEntry = JSON.parse(JSON.stringify(_nodeEntry.slice(0)));
127
189
  _slate.Transforms.removeNodes(editor, {
128
190
  at: [path[0]]
129
191
  });
130
- var newNode = (0, _core.generateEmptyElement)(_constants.PARAGRAPH);
192
+ var newNode = (0, _core.generateEmptyElement)(_constants2.PARAGRAPH);
131
193
  newNode.children = _newNodeEntry[0].children;
132
194
  _slate.Transforms.insertNodes(editor, newNode, {
133
195
  at: [path[0]]
@@ -166,10 +228,11 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
166
228
  }, []);
167
229
  return /*#__PURE__*/_react["default"].createElement(_commons.ElementPopover, null, /*#__PURE__*/_react["default"].createElement("div", {
168
230
  className: "sdoc-image-hover-menu-container",
231
+ ref: menuRef,
169
232
  style: menuPosition
170
233
  }, /*#__PURE__*/_react["default"].createElement("div", {
171
234
  className: "hover-menu-container"
172
- }, ![_constants.TABLE, _constants.BLOCKQUOTE, _constants.CALL_OUT, _constants.MULTI_COLUMN].includes(type) && !readonly && /*#__PURE__*/_react["default"].createElement("span", {
235
+ }, ![_constants2.TABLE, _constants2.BLOCKQUOTE, _constants2.CALL_OUT, _constants2.MULTI_COLUMN].includes(type) && !readonly && /*#__PURE__*/_react["default"].createElement("span", {
173
236
  className: "op-group-item"
174
237
  }, /*#__PURE__*/_react["default"].createElement("span", {
175
238
  role: "button",
@@ -181,11 +244,11 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
181
244
  }
182
245
  }, /*#__PURE__*/_react["default"].createElement("span", {
183
246
  className: "mr-1"
184
- }, t(type === _constants.IMAGE_BLOCK ? 'Block' : 'Inline')), /*#__PURE__*/_react["default"].createElement("i", {
247
+ }, t(type === _constants2.IMAGE_BLOCK ? 'Block' : 'Inline')), /*#__PURE__*/_react["default"].createElement("i", {
185
248
  className: "sdocfont sdoc-arrow-down"
186
249
  }), popoverState.displayPopover && /*#__PURE__*/_react["default"].createElement("div", {
187
250
  className: "sdoc-image-popover sdoc-dropdown-menu"
188
- }, _constants2.IMAGE_DISPLAY_TYPE.map(function (item) {
251
+ }, _constants3.IMAGE_DISPLAY_TYPE.map(function (item) {
189
252
  return /*#__PURE__*/_react["default"].createElement("div", {
190
253
  key: item.value,
191
254
  className: (0, _classnames["default"])('sdoc-dropdown-menu-item', {
@@ -201,7 +264,7 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
201
264
  }));
202
265
  })))), !readonly && /*#__PURE__*/_react["default"].createElement("span", {
203
266
  className: "op-group-item"
204
- }, type === _constants.IMAGE_BLOCK && /*#__PURE__*/_react["default"].createElement("span", {
267
+ }, type === _constants2.IMAGE_BLOCK && /*#__PURE__*/_react["default"].createElement("span", {
205
268
  id: "sdoc_image_alignment",
206
269
  role: "button",
207
270
  className: (0, _classnames["default"])('op-item', {
@@ -216,7 +279,7 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
216
279
  className: "sdocfont sdoc-arrow-down"
217
280
  }), popoverState.alignPopover && /*#__PURE__*/_react["default"].createElement("div", {
218
281
  className: "sdoc-image-popover align-popover sdoc-dropdown-menu"
219
- }, _constants.MENUS_CONFIG_MAP[_constants.TEXT_ALIGN].map(function (item) {
282
+ }, _constants2.MENUS_CONFIG_MAP[_constants2.TEXT_ALIGN].map(function (item) {
220
283
  return /*#__PURE__*/_react["default"].createElement("div", {
221
284
  key: item.id,
222
285
  className: (0, _classnames["default"])('sdoc-dropdown-menu-item', {
@@ -241,7 +304,7 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
241
304
  role: "button",
242
305
  className: (0, _classnames["default"])('op-item', {
243
306
  'active': popoverState.borderPopover,
244
- 'ml-1': ![_constants.TABLE, _constants.BLOCKQUOTE, _constants.CALL_OUT, _constants.MULTI_COLUMN].includes(type)
307
+ 'ml-1': ![_constants2.TABLE, _constants2.BLOCKQUOTE, _constants2.CALL_OUT, _constants2.MULTI_COLUMN].includes(type)
245
308
  }),
246
309
  onClick: function onClick(e) {
247
310
  onShowProver(e, 'borderPopover');
@@ -252,7 +315,7 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
252
315
  className: "sdocfont sdoc-arrow-down"
253
316
  }), popoverState.borderPopover && /*#__PURE__*/_react["default"].createElement("div", {
254
317
  className: "sdoc-image-popover border-popover sdoc-dropdown-menu"
255
- }, _constants2.IMAGE_BORDER_TYPE.map(function (item) {
318
+ }, _constants3.IMAGE_BORDER_TYPE.map(function (item) {
256
319
  return /*#__PURE__*/_react["default"].createElement("div", {
257
320
  key: item.type,
258
321
  className: "sdoc-dropdown-menu-item sdoc-dropdown-item-with-left-icon pr-2",
@@ -274,7 +337,7 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
274
337
  target: "sdoc_image_border",
275
338
  placement: "top",
276
339
  fade: true
277
- }, t('Image_border'))), type === _constants.IMAGE_BLOCK && /*#__PURE__*/_react["default"].createElement("span", {
340
+ }, t('Image_border'))), type === _constants2.IMAGE_BLOCK && /*#__PURE__*/_react["default"].createElement("span", {
278
341
  id: "sdoc_image_caption",
279
342
  role: "button",
280
343
  className: (0, _classnames["default"])('op-item', 'ml-1', {
@@ -291,7 +354,36 @@ var ImageHoverMenu = function ImageHoverMenu(_ref) {
291
354
  target: "sdoc_image_caption",
292
355
  placement: "top",
293
356
  fade: true
294
- }, t('Caption')))), /*#__PURE__*/_react["default"].createElement("span", {
357
+ }, t('Caption'))), /*#__PURE__*/_react["default"].createElement("span", {
358
+ id: "sdoc_image_link",
359
+ role: "button",
360
+ className: (0, _classnames["default"])('op-item', 'ml-1', {
361
+ 'active': currentHref || isShowImageLinkPopover
362
+ }),
363
+ onClick: function onClick(event) {
364
+ event.stopPropagation();
365
+ setPopoverState({
366
+ displayPopover: false,
367
+ alignPopover: false,
368
+ borderPopover: false
369
+ });
370
+ setIsShowImageLinkPopover(!isShowImageLinkPopover);
371
+ }
372
+ }, /*#__PURE__*/_react["default"].createElement("i", {
373
+ className: "sdocfont sdoc-link"
374
+ }), isShowTooltip && !isShowImageLinkPopover && /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
375
+ target: "sdoc_image_link",
376
+ placement: "top",
377
+ fade: true
378
+ }, t(currentHref ? 'Edit_link' : 'Insert_link')), isShowImageLinkPopover && /*#__PURE__*/_react["default"].createElement(_imageLinkPopover["default"], {
379
+ editor: editor,
380
+ href: currentHref,
381
+ linkedPageId: isWiki ? data.linked_wiki_page_id : '',
382
+ linkedWikiId: isWiki ? data.linked_wiki_id : '',
383
+ onRemove: removeImageLink,
384
+ onSelectPage: updateImagePageLink,
385
+ onSubmit: updateImageLink
386
+ }))), /*#__PURE__*/_react["default"].createElement("span", {
295
387
  className: "op-group-item"
296
388
  }, /*#__PURE__*/_react["default"].createElement("span", {
297
389
  id: "sdoc_image_full_screen_mode",
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.normalizeWebUrl = exports.isValidWebUrl = exports.isInternalWebUrl = exports.isCurrentServerUrl = exports.getOnlyImageChild = exports.getImageWikiPageUrl = void 0;
8
+ var _context = _interopRequireDefault(require("../../../context"));
9
+ var _helpers = require("../wiki-link/helpers");
10
+ var normalizeWebUrl = exports.normalizeWebUrl = function normalizeWebUrl() {
11
+ var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
12
+ if (typeof value !== 'string') return '';
13
+ var url = value.trim();
14
+ if (!/^https?:\/\//i.test(url)) return '';
15
+ try {
16
+ var parsedUrl = new URL(url);
17
+ return ['http:', 'https:'].includes(parsedUrl.protocol) && parsedUrl.hostname ? url : '';
18
+ } catch (error) {
19
+ return '';
20
+ }
21
+ };
22
+ var isValidWebUrl = exports.isValidWebUrl = function isValidWebUrl() {
23
+ var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
24
+ return Boolean(normalizeWebUrl(value));
25
+ };
26
+ var isInternalWebUrl = exports.isInternalWebUrl = function isInternalWebUrl() {
27
+ var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
28
+ var url = normalizeWebUrl(value);
29
+ var serviceUrl = _context["default"].getSetting('serviceUrl');
30
+ if (!url || !serviceUrl) return false;
31
+ try {
32
+ return new URL(url).origin === new URL(serviceUrl).origin;
33
+ } catch (error) {
34
+ return false;
35
+ }
36
+ };
37
+ var isCurrentServerUrl = exports.isCurrentServerUrl = isInternalWebUrl;
38
+ var getOnlyImageChild = exports.getOnlyImageChild = function getOnlyImageChild(element) {
39
+ var _meaningfulChildren$;
40
+ var meaningfulChildren = Array.from((element === null || element === void 0 ? void 0 : element.childNodes) || []).filter(function (child) {
41
+ var _child$textContent;
42
+ if (child.nodeType === 8) return false;
43
+ return child.nodeType !== 3 || Boolean((_child$textContent = child.textContent) === null || _child$textContent === void 0 ? void 0 : _child$textContent.trim());
44
+ });
45
+ if (meaningfulChildren.length !== 1 || ((_meaningfulChildren$ = meaningfulChildren[0]) === null || _meaningfulChildren$ === void 0 ? void 0 : _meaningfulChildren$.nodeName) !== 'IMG') return null;
46
+ return meaningfulChildren[0];
47
+ };
48
+ var getImageWikiPageUrl = exports.getImageWikiPageUrl = function getImageWikiPageUrl(wikiId, pageId) {
49
+ if (!wikiId || !pageId) return '';
50
+ var wikiUrl = (0, _helpers.getWikiUrl)(wikiId, pageId, false);
51
+ var serviceUrl = _context["default"].getSetting('serviceUrl');
52
+ if (!serviceUrl) return wikiUrl;
53
+ try {
54
+ return new URL(wikiUrl, serviceUrl).toString();
55
+ } catch (error) {
56
+ return wikiUrl;
57
+ }
58
+ };
@@ -78,7 +78,8 @@ var withImage = function withImage(editor) {
78
78
  insertData(data);
79
79
  };
80
80
  newEditor.insertFragment = function (data) {
81
- var singleImage = (0, _helpers.getSingleImageFromFragment)(data);
81
+ var fragment = editor.editorType === _constants.WIKI_EDITOR ? data : (0, _helpers.removeImageWikiPageLinks)(data);
82
+ var singleImage = (0, _helpers.getSingleImageFromFragment)(fragment);
82
83
  if (singleImage && (0, _helpers.isInsertImageMenuDisabled)(editor)) {
83
84
  var path = _slate.Editor.path(editor, editor.selection);
84
85
  var nextPath = _slate.Path.next([path[0]]);
@@ -95,7 +96,7 @@ var withImage = function withImage(editor) {
95
96
  if (singleImage) {
96
97
  (0, _helpers.resetCursor)(newEditor);
97
98
  }
98
- return insertFragment(data);
99
+ return insertFragment(fragment);
99
100
  };
100
101
  newEditor.imageOnKeyDown = function (e) {
101
102
  if (e.keyCode === 13) {
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getWikiPageLinkOptions = exports.getFuzzyPageResults = void 0;
7
+ Object.defineProperty(exports, "isValidWebUrl", {
8
+ enumerable: true,
9
+ get: function get() {
10
+ return _linkHelpers.isValidWebUrl;
11
+ }
12
+ });
13
+ var _linkHelpers = require("../../link-helpers");
14
+ var normalizeText = function normalizeText() {
15
+ var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
16
+ return value.normalize('NFKC').toLocaleLowerCase().trim();
17
+ };
18
+ var getFuzzyScore = function getFuzzyScore(value, query) {
19
+ var normalizedValue = normalizeText(value);
20
+ var normalizedQuery = normalizeText(query);
21
+ if (!normalizedQuery) return 0;
22
+ if (normalizedValue === normalizedQuery) return 0;
23
+ if (normalizedValue.startsWith(normalizedQuery)) return 1;
24
+ var includedAt = normalizedValue.indexOf(normalizedQuery);
25
+ if (includedAt > -1) return 2 + includedAt;
26
+ var queryIndex = 0;
27
+ var firstMatchIndex = -1;
28
+ var previousMatchIndex = -1;
29
+ var gapScore = 0;
30
+ for (var valueIndex = 0; valueIndex < normalizedValue.length && queryIndex < normalizedQuery.length; valueIndex++) {
31
+ if (normalizedValue[valueIndex] !== normalizedQuery[queryIndex]) continue;
32
+ if (firstMatchIndex === -1) firstMatchIndex = valueIndex;
33
+ if (previousMatchIndex > -1) gapScore += valueIndex - previousMatchIndex - 1;
34
+ previousMatchIndex = valueIndex;
35
+ queryIndex++;
36
+ }
37
+ if (queryIndex !== normalizedQuery.length) return null;
38
+ return 100 + firstMatchIndex + gapScore;
39
+ };
40
+ var getFuzzyPageResults = exports.getFuzzyPageResults = function getFuzzyPageResults() {
41
+ var pages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
42
+ var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
43
+ var limit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 8;
44
+ return pages.map(function (page, index) {
45
+ var nameScore = getFuzzyScore(page === null || page === void 0 ? void 0 : page.name, query);
46
+ return {
47
+ page: page,
48
+ index: index,
49
+ score: nameScore
50
+ };
51
+ }).filter(function (item) {
52
+ var _item$page;
53
+ return ((_item$page = item.page) === null || _item$page === void 0 ? void 0 : _item$page.id) && item.score !== null;
54
+ }).sort(function (a, b) {
55
+ return a.score - b.score || a.index - b.index;
56
+ }).slice(0, limit).map(function (item) {
57
+ return item.page;
58
+ });
59
+ };
60
+ var getWikiPageLinkOptions = exports.getWikiPageLinkOptions = function getWikiPageLinkOptions() {
61
+ var pages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
62
+ var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
63
+ var linkedPageId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
64
+ var linkedWikiId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';
65
+ var limit = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 8;
66
+ var isLinkedPage = function isLinkedPage(page) {
67
+ return (page === null || page === void 0 ? void 0 : page.id) === linkedPageId && (!linkedWikiId || (page === null || page === void 0 ? void 0 : page.wikiRepoId) === linkedWikiId);
68
+ };
69
+ var linkedPage = pages.find(isLinkedPage) || null;
70
+ var searchablePages = linkedPage ? pages.filter(function (page) {
71
+ return !isLinkedPage(page);
72
+ }) : pages;
73
+ var pageResults = getFuzzyPageResults(searchablePages, query, limit);
74
+ var isLinkedPageMatched = Boolean(linkedPage && getFuzzyPageResults([linkedPage], query, 1).length);
75
+ return {
76
+ linkedPage: linkedPage,
77
+ pageResults: pageResults,
78
+ hasPageMatch: isLinkedPageMatched || pageResults.length > 0
79
+ };
80
+ };