@atlaskit/editor-plugin-card 18.1.6 → 18.2.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/editor-plugin-card
2
2
 
3
+ ## 18.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`06c7a1c8b9f35`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/06c7a1c8b9f35) -
8
+ Fix Ask Rovo context for pasted Smart Links and hide single-link AI actions in comments
9
+
10
+ ## 18.1.7
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies
15
+
3
16
  ## 18.1.6
4
17
 
5
18
  ### Patch Changes
@@ -220,6 +220,7 @@ var PasteDisplayAsMenuHorizontalView = function PasteDisplayAsMenuHorizontalView
220
220
  var currentAppearance = editorView && pasteRange ? (_getCardAtPasteRange$ = (_getCardAtPasteRange = (0, _pasteDisplayAsUtils.getCardAtPasteRange)(editorView.state, pasteRange.pasteStartPos, pasteRange.pasteEndPos)) === null || _getCardAtPasteRange === void 0 ? void 0 : _getCardAtPasteRange.appearance) !== null && _getCardAtPasteRange$ !== void 0 ? _getCardAtPasteRange$ : 'url' : undefined;
221
221
  var handleClick = (0, _react.useCallback)(function (appearance) {
222
222
  return function () {
223
+ var _state$doc$nodeAt2, _targetNodeAttrs$url, _targetNodeAttrs$data;
223
224
  if (!editorView || !pasteRange || !pastedLinkUrl || !currentAppearance || isApplyingRef.current) {
224
225
  return;
225
226
  }
@@ -239,7 +240,10 @@ var PasteDisplayAsMenuHorizontalView = function PasteDisplayAsMenuHorizontalView
239
240
  return;
240
241
  }
241
242
  var targetPos = cardAtPasteRange === null || cardAtPasteRange === void 0 ? void 0 : cardAtPasteRange.pos;
242
- if (targetPos !== undefined && targetPos < pasteStartPos) {
243
+ var targetNodeAttrs = targetPos === undefined ? undefined : (_state$doc$nodeAt2 = state.doc.nodeAt(targetPos)) === null || _state$doc$nodeAt2 === void 0 ? void 0 : _state$doc$nodeAt2.attrs;
244
+ var targetNodeUrl = (_targetNodeAttrs$url = targetNodeAttrs === null || targetNodeAttrs === void 0 ? void 0 : targetNodeAttrs.url) !== null && _targetNodeAttrs$url !== void 0 ? _targetNodeAttrs$url : targetNodeAttrs === null || targetNodeAttrs === void 0 || (_targetNodeAttrs$data = targetNodeAttrs.data) === null || _targetNodeAttrs$data === void 0 ? void 0 : _targetNodeAttrs$data.url;
245
+ var isRecoveredAdjacentPastedCard = (0, _expValEqualsNoExposure.expValEqualsNoExposure)('confluence_editor_paste_3p_link_actions_menu', 'isEnabled', true) && targetPos === pasteStartPos - 1 && pasteStartPos === pasteEndPos && targetNodeUrl === pastedLinkUrl;
246
+ if (targetPos !== undefined && targetPos < pasteStartPos && !isRecoveredAdjacentPastedCard) {
243
247
  isApplyingRef.current = false;
244
248
  return;
245
249
  }
@@ -406,6 +410,10 @@ var getPasteDisplayAsMenuComponents = exports.getPasteDisplayAsMenuComponents =
406
410
  if (!rules || rules.notSingleLinkRule()) {
407
411
  return true;
408
412
  }
413
+ var urlFromSlice = (0, _currentPastedSmartLink.getSingleSmartLinkUrlFromSlice)(getCurrentPastedSlice(api));
414
+ if (urlFromSlice) {
415
+ return false;
416
+ }
409
417
 
410
418
  // Fallback: plain-text URL paste that the card plugin already resolved into a card node in the doc.
411
419
  var urlFromCard = getCardUrlAtPasteRange({
@@ -12,12 +12,12 @@ var getUrlFromTextLinkNode = function getUrlFromTextLinkNode(node) {
12
12
  var href = (_node$marks$0$attrs = node.marks[0].attrs) === null || _node$marks$0$attrs === void 0 ? void 0 : _node$marks$0$attrs.href;
13
13
  return typeof href === 'string' && node.text === href ? href : undefined;
14
14
  };
15
- var getUrlFromInlineCardNode = function getUrlFromInlineCardNode(node) {
16
- var _node$attrs;
17
- if (node.type.name !== 'inlineCard') {
15
+ var getUrlFromCardNode = function getUrlFromCardNode(node) {
16
+ var _node$attrs$url, _node$attrs, _node$attrs2;
17
+ if (node.type.name !== 'inlineCard' && node.type.name !== 'blockCard' && node.type.name !== 'embedCard') {
18
18
  return undefined;
19
19
  }
20
- var url = (_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.url;
20
+ var url = (_node$attrs$url = (_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.url) !== null && _node$attrs$url !== void 0 ? _node$attrs$url : (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 || (_node$attrs2 = _node$attrs2.data) === null || _node$attrs2 === void 0 ? void 0 : _node$attrs2.url;
21
21
  return typeof url === 'string' ? url : undefined;
22
22
  };
23
23
  var significantChildren = function significantChildren(fragment) {
@@ -37,7 +37,7 @@ var getSingleSmartLinkUrlFromSlice = exports.getSingleSmartLinkUrlFromSlice = fu
37
37
  return undefined;
38
38
  }
39
39
  var topNode = slice.content.child(0);
40
- var topNodeUrl = (_getUrlFromTextLinkNo = getUrlFromTextLinkNode(topNode)) !== null && _getUrlFromTextLinkNo !== void 0 ? _getUrlFromTextLinkNo : getUrlFromInlineCardNode(topNode);
40
+ var topNodeUrl = (_getUrlFromTextLinkNo = getUrlFromTextLinkNode(topNode)) !== null && _getUrlFromTextLinkNo !== void 0 ? _getUrlFromTextLinkNo : getUrlFromCardNode(topNode);
41
41
  if (topNodeUrl) {
42
42
  return topNodeUrl;
43
43
  }
@@ -48,5 +48,5 @@ var getSingleSmartLinkUrlFromSlice = exports.getSingleSmartLinkUrlFromSlice = fu
48
48
  if (children.length !== 1) {
49
49
  return undefined;
50
50
  }
51
- return (_getUrlFromTextLinkNo2 = getUrlFromTextLinkNode(children[0])) !== null && _getUrlFromTextLinkNo2 !== void 0 ? _getUrlFromTextLinkNo2 : getUrlFromInlineCardNode(children[0]);
51
+ return (_getUrlFromTextLinkNo2 = getUrlFromTextLinkNode(children[0])) !== null && _getUrlFromTextLinkNo2 !== void 0 ? _getUrlFromTextLinkNo2 : getUrlFromCardNode(children[0]);
52
52
  };
@@ -13,6 +13,21 @@ var getCardAtPasteRange = exports.getCardAtPasteRange = function getCardAtPasteR
13
13
  var from = Math.min(clampedStart, clampedEnd);
14
14
  var to = Math.max(clampedStart, clampedEnd);
15
15
  try {
16
+ if (from === to) {
17
+ for (var _i = 0, _arr = [from - 1, from]; _i < _arr.length; _i++) {
18
+ var pos = _arr[_i];
19
+ if (pos < 0 || pos >= docContentSize) {
20
+ continue;
21
+ }
22
+ var node = state.doc.nodeAt(pos);
23
+ if ((node === null || node === void 0 ? void 0 : node.type.name) === 'inlineCard' || (node === null || node === void 0 ? void 0 : node.type.name) === 'blockCard' || (node === null || node === void 0 ? void 0 : node.type.name) === 'embedCard') {
24
+ return {
25
+ appearance: node.type.name === 'inlineCard' ? 'inline' : node.type.name === 'blockCard' ? 'block' : 'embed',
26
+ pos: pos
27
+ };
28
+ }
29
+ }
30
+ }
16
31
  state.doc.nodesBetween(from, to, function (node, pos) {
17
32
  if (node.type.name === 'inlineCard' || node.type.name === 'blockCard' || node.type.name === 'embedCard') {
18
33
  result = {
@@ -215,6 +215,7 @@ const PasteDisplayAsMenuHorizontalView = ({
215
215
  const hasResolvedSmartLinkData = Boolean(pastedLinkUrlState === null || pastedLinkUrlState === void 0 ? void 0 : pastedLinkUrlState.details);
216
216
  const currentAppearance = editorView && pasteRange ? (_getCardAtPasteRange$ = (_getCardAtPasteRange = getCardAtPasteRange(editorView.state, pasteRange.pasteStartPos, pasteRange.pasteEndPos)) === null || _getCardAtPasteRange === void 0 ? void 0 : _getCardAtPasteRange.appearance) !== null && _getCardAtPasteRange$ !== void 0 ? _getCardAtPasteRange$ : 'url' : undefined;
217
217
  const handleClick = useCallback(appearance => () => {
218
+ var _state$doc$nodeAt2, _targetNodeAttrs$url, _targetNodeAttrs$data;
218
219
  if (!editorView || !pasteRange || !pastedLinkUrl || !currentAppearance || isApplyingRef.current) {
219
220
  return;
220
221
  }
@@ -238,7 +239,10 @@ const PasteDisplayAsMenuHorizontalView = ({
238
239
  return;
239
240
  }
240
241
  const targetPos = cardAtPasteRange === null || cardAtPasteRange === void 0 ? void 0 : cardAtPasteRange.pos;
241
- if (targetPos !== undefined && targetPos < pasteStartPos) {
242
+ const targetNodeAttrs = targetPos === undefined ? undefined : (_state$doc$nodeAt2 = state.doc.nodeAt(targetPos)) === null || _state$doc$nodeAt2 === void 0 ? void 0 : _state$doc$nodeAt2.attrs;
243
+ const targetNodeUrl = (_targetNodeAttrs$url = targetNodeAttrs === null || targetNodeAttrs === void 0 ? void 0 : targetNodeAttrs.url) !== null && _targetNodeAttrs$url !== void 0 ? _targetNodeAttrs$url : targetNodeAttrs === null || targetNodeAttrs === void 0 ? void 0 : (_targetNodeAttrs$data = targetNodeAttrs.data) === null || _targetNodeAttrs$data === void 0 ? void 0 : _targetNodeAttrs$data.url;
244
+ const isRecoveredAdjacentPastedCard = expValEqualsNoExposure('confluence_editor_paste_3p_link_actions_menu', 'isEnabled', true) && targetPos === pasteStartPos - 1 && pasteStartPos === pasteEndPos && targetNodeUrl === pastedLinkUrl;
245
+ if (targetPos !== undefined && targetPos < pasteStartPos && !isRecoveredAdjacentPastedCard) {
242
246
  isApplyingRef.current = false;
243
247
  return;
244
248
  }
@@ -386,6 +390,10 @@ export const getPasteDisplayAsMenuComponents = ({
386
390
  if (!rules || rules.notSingleLinkRule()) {
387
391
  return true;
388
392
  }
393
+ const urlFromSlice = getSingleSmartLinkUrlFromSlice(getCurrentPastedSlice(api));
394
+ if (urlFromSlice) {
395
+ return false;
396
+ }
389
397
 
390
398
  // Fallback: plain-text URL paste that the card plugin already resolved into a card node in the doc.
391
399
  const urlFromCard = getCardUrlAtPasteRange({
@@ -6,12 +6,12 @@ const getUrlFromTextLinkNode = node => {
6
6
  const href = (_node$marks$0$attrs = node.marks[0].attrs) === null || _node$marks$0$attrs === void 0 ? void 0 : _node$marks$0$attrs.href;
7
7
  return typeof href === 'string' && node.text === href ? href : undefined;
8
8
  };
9
- const getUrlFromInlineCardNode = node => {
10
- var _node$attrs;
11
- if (node.type.name !== 'inlineCard') {
9
+ const getUrlFromCardNode = node => {
10
+ var _node$attrs$url, _node$attrs, _node$attrs2, _node$attrs2$data;
11
+ if (node.type.name !== 'inlineCard' && node.type.name !== 'blockCard' && node.type.name !== 'embedCard') {
12
12
  return undefined;
13
13
  }
14
- const url = (_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.url;
14
+ const url = (_node$attrs$url = (_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.url) !== null && _node$attrs$url !== void 0 ? _node$attrs$url : (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 ? void 0 : (_node$attrs2$data = _node$attrs2.data) === null || _node$attrs2$data === void 0 ? void 0 : _node$attrs2$data.url;
15
15
  return typeof url === 'string' ? url : undefined;
16
16
  };
17
17
  const significantChildren = fragment => {
@@ -31,7 +31,7 @@ export const getSingleSmartLinkUrlFromSlice = slice => {
31
31
  return undefined;
32
32
  }
33
33
  const topNode = slice.content.child(0);
34
- const topNodeUrl = (_getUrlFromTextLinkNo = getUrlFromTextLinkNode(topNode)) !== null && _getUrlFromTextLinkNo !== void 0 ? _getUrlFromTextLinkNo : getUrlFromInlineCardNode(topNode);
34
+ const topNodeUrl = (_getUrlFromTextLinkNo = getUrlFromTextLinkNode(topNode)) !== null && _getUrlFromTextLinkNo !== void 0 ? _getUrlFromTextLinkNo : getUrlFromCardNode(topNode);
35
35
  if (topNodeUrl) {
36
36
  return topNodeUrl;
37
37
  }
@@ -42,5 +42,5 @@ export const getSingleSmartLinkUrlFromSlice = slice => {
42
42
  if (children.length !== 1) {
43
43
  return undefined;
44
44
  }
45
- return (_getUrlFromTextLinkNo2 = getUrlFromTextLinkNode(children[0])) !== null && _getUrlFromTextLinkNo2 !== void 0 ? _getUrlFromTextLinkNo2 : getUrlFromInlineCardNode(children[0]);
45
+ return (_getUrlFromTextLinkNo2 = getUrlFromTextLinkNode(children[0])) !== null && _getUrlFromTextLinkNo2 !== void 0 ? _getUrlFromTextLinkNo2 : getUrlFromCardNode(children[0]);
46
46
  };
@@ -7,6 +7,20 @@ export const getCardAtPasteRange = (state, pasteStartPos, pasteEndPos) => {
7
7
  const from = Math.min(clampedStart, clampedEnd);
8
8
  const to = Math.max(clampedStart, clampedEnd);
9
9
  try {
10
+ if (from === to) {
11
+ for (const pos of [from - 1, from]) {
12
+ if (pos < 0 || pos >= docContentSize) {
13
+ continue;
14
+ }
15
+ const node = state.doc.nodeAt(pos);
16
+ if ((node === null || node === void 0 ? void 0 : node.type.name) === 'inlineCard' || (node === null || node === void 0 ? void 0 : node.type.name) === 'blockCard' || (node === null || node === void 0 ? void 0 : node.type.name) === 'embedCard') {
17
+ return {
18
+ appearance: node.type.name === 'inlineCard' ? 'inline' : node.type.name === 'blockCard' ? 'block' : 'embed',
19
+ pos
20
+ };
21
+ }
22
+ }
23
+ }
10
24
  state.doc.nodesBetween(from, to, (node, pos) => {
11
25
  if (node.type.name === 'inlineCard' || node.type.name === 'blockCard' || node.type.name === 'embedCard') {
12
26
  result = {
@@ -211,6 +211,7 @@ var PasteDisplayAsMenuHorizontalView = function PasteDisplayAsMenuHorizontalView
211
211
  var currentAppearance = editorView && pasteRange ? (_getCardAtPasteRange$ = (_getCardAtPasteRange = getCardAtPasteRange(editorView.state, pasteRange.pasteStartPos, pasteRange.pasteEndPos)) === null || _getCardAtPasteRange === void 0 ? void 0 : _getCardAtPasteRange.appearance) !== null && _getCardAtPasteRange$ !== void 0 ? _getCardAtPasteRange$ : 'url' : undefined;
212
212
  var handleClick = useCallback(function (appearance) {
213
213
  return function () {
214
+ var _state$doc$nodeAt2, _targetNodeAttrs$url, _targetNodeAttrs$data;
214
215
  if (!editorView || !pasteRange || !pastedLinkUrl || !currentAppearance || isApplyingRef.current) {
215
216
  return;
216
217
  }
@@ -230,7 +231,10 @@ var PasteDisplayAsMenuHorizontalView = function PasteDisplayAsMenuHorizontalView
230
231
  return;
231
232
  }
232
233
  var targetPos = cardAtPasteRange === null || cardAtPasteRange === void 0 ? void 0 : cardAtPasteRange.pos;
233
- if (targetPos !== undefined && targetPos < pasteStartPos) {
234
+ var targetNodeAttrs = targetPos === undefined ? undefined : (_state$doc$nodeAt2 = state.doc.nodeAt(targetPos)) === null || _state$doc$nodeAt2 === void 0 ? void 0 : _state$doc$nodeAt2.attrs;
235
+ var targetNodeUrl = (_targetNodeAttrs$url = targetNodeAttrs === null || targetNodeAttrs === void 0 ? void 0 : targetNodeAttrs.url) !== null && _targetNodeAttrs$url !== void 0 ? _targetNodeAttrs$url : targetNodeAttrs === null || targetNodeAttrs === void 0 || (_targetNodeAttrs$data = targetNodeAttrs.data) === null || _targetNodeAttrs$data === void 0 ? void 0 : _targetNodeAttrs$data.url;
236
+ var isRecoveredAdjacentPastedCard = expValEqualsNoExposure('confluence_editor_paste_3p_link_actions_menu', 'isEnabled', true) && targetPos === pasteStartPos - 1 && pasteStartPos === pasteEndPos && targetNodeUrl === pastedLinkUrl;
237
+ if (targetPos !== undefined && targetPos < pasteStartPos && !isRecoveredAdjacentPastedCard) {
234
238
  isApplyingRef.current = false;
235
239
  return;
236
240
  }
@@ -397,6 +401,10 @@ export var getPasteDisplayAsMenuComponents = function getPasteDisplayAsMenuCompo
397
401
  if (!rules || rules.notSingleLinkRule()) {
398
402
  return true;
399
403
  }
404
+ var urlFromSlice = getSingleSmartLinkUrlFromSlice(getCurrentPastedSlice(api));
405
+ if (urlFromSlice) {
406
+ return false;
407
+ }
400
408
 
401
409
  // Fallback: plain-text URL paste that the card plugin already resolved into a card node in the doc.
402
410
  var urlFromCard = getCardUrlAtPasteRange({
@@ -6,12 +6,12 @@ var getUrlFromTextLinkNode = function getUrlFromTextLinkNode(node) {
6
6
  var href = (_node$marks$0$attrs = node.marks[0].attrs) === null || _node$marks$0$attrs === void 0 ? void 0 : _node$marks$0$attrs.href;
7
7
  return typeof href === 'string' && node.text === href ? href : undefined;
8
8
  };
9
- var getUrlFromInlineCardNode = function getUrlFromInlineCardNode(node) {
10
- var _node$attrs;
11
- if (node.type.name !== 'inlineCard') {
9
+ var getUrlFromCardNode = function getUrlFromCardNode(node) {
10
+ var _node$attrs$url, _node$attrs, _node$attrs2;
11
+ if (node.type.name !== 'inlineCard' && node.type.name !== 'blockCard' && node.type.name !== 'embedCard') {
12
12
  return undefined;
13
13
  }
14
- var url = (_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.url;
14
+ var url = (_node$attrs$url = (_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.url) !== null && _node$attrs$url !== void 0 ? _node$attrs$url : (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 || (_node$attrs2 = _node$attrs2.data) === null || _node$attrs2 === void 0 ? void 0 : _node$attrs2.url;
15
15
  return typeof url === 'string' ? url : undefined;
16
16
  };
17
17
  var significantChildren = function significantChildren(fragment) {
@@ -31,7 +31,7 @@ export var getSingleSmartLinkUrlFromSlice = function getSingleSmartLinkUrlFromSl
31
31
  return undefined;
32
32
  }
33
33
  var topNode = slice.content.child(0);
34
- var topNodeUrl = (_getUrlFromTextLinkNo = getUrlFromTextLinkNode(topNode)) !== null && _getUrlFromTextLinkNo !== void 0 ? _getUrlFromTextLinkNo : getUrlFromInlineCardNode(topNode);
34
+ var topNodeUrl = (_getUrlFromTextLinkNo = getUrlFromTextLinkNode(topNode)) !== null && _getUrlFromTextLinkNo !== void 0 ? _getUrlFromTextLinkNo : getUrlFromCardNode(topNode);
35
35
  if (topNodeUrl) {
36
36
  return topNodeUrl;
37
37
  }
@@ -42,5 +42,5 @@ export var getSingleSmartLinkUrlFromSlice = function getSingleSmartLinkUrlFromSl
42
42
  if (children.length !== 1) {
43
43
  return undefined;
44
44
  }
45
- return (_getUrlFromTextLinkNo2 = getUrlFromTextLinkNode(children[0])) !== null && _getUrlFromTextLinkNo2 !== void 0 ? _getUrlFromTextLinkNo2 : getUrlFromInlineCardNode(children[0]);
45
+ return (_getUrlFromTextLinkNo2 = getUrlFromTextLinkNode(children[0])) !== null && _getUrlFromTextLinkNo2 !== void 0 ? _getUrlFromTextLinkNo2 : getUrlFromCardNode(children[0]);
46
46
  };
@@ -7,6 +7,21 @@ export var getCardAtPasteRange = function getCardAtPasteRange(state, pasteStartP
7
7
  var from = Math.min(clampedStart, clampedEnd);
8
8
  var to = Math.max(clampedStart, clampedEnd);
9
9
  try {
10
+ if (from === to) {
11
+ for (var _i = 0, _arr = [from - 1, from]; _i < _arr.length; _i++) {
12
+ var pos = _arr[_i];
13
+ if (pos < 0 || pos >= docContentSize) {
14
+ continue;
15
+ }
16
+ var node = state.doc.nodeAt(pos);
17
+ if ((node === null || node === void 0 ? void 0 : node.type.name) === 'inlineCard' || (node === null || node === void 0 ? void 0 : node.type.name) === 'blockCard' || (node === null || node === void 0 ? void 0 : node.type.name) === 'embedCard') {
18
+ return {
19
+ appearance: node.type.name === 'inlineCard' ? 'inline' : node.type.name === 'blockCard' ? 'block' : 'embed',
20
+ pos: pos
21
+ };
22
+ }
23
+ }
24
+ }
10
25
  state.doc.nodesBetween(from, to, function (node, pos) {
11
26
  if (node.type.name === 'inlineCard' || node.type.name === 'blockCard' || node.type.name === 'embedCard') {
12
27
  result = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-card",
3
- "version": "18.1.6",
3
+ "version": "18.2.0",
4
4
  "description": "Card plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -59,7 +59,7 @@
59
59
  "@atlaskit/primitives": "^21.0.0",
60
60
  "@atlaskit/prosemirror-history": "^1.0.0",
61
61
  "@atlaskit/smart-card": "^45.9.0",
62
- "@atlaskit/tmp-editor-statsig": "^125.2.0",
62
+ "@atlaskit/tmp-editor-statsig": "^126.1.0",
63
63
  "@atlaskit/tokens": "^15.8.0",
64
64
  "@babel/runtime": "^7.0.0",
65
65
  "@emotion/react": "^11.7.1",