@atlaskit/editor-plugin-card 3.0.1 → 3.0.3

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,24 @@
1
1
  # @atlaskit/editor-plugin-card
2
2
 
3
+ ## 3.0.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [#142202](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/142202)
8
+ [`bd97acf1388d4`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/bd97acf1388d4) -
9
+ Fix edit datasource option not available on links with empty result or invalid jql
10
+
11
+ ## 3.0.2
12
+
13
+ ### Patch Changes
14
+
15
+ - [#139456](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/139456)
16
+ [`a788f5ceac7a2`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/a788f5ceac7a2) -
17
+ [ux] When FF hardcoded-embeds-only-on-new-line is true pasting of some urls (like youtube or jira
18
+ dashboard or conny whiteboards) will only become embed right away if pasted on a new line in a
19
+ root of the document
20
+ - Updated dependencies
21
+
3
22
  ## 3.0.1
4
23
 
5
24
  ### Patch Changes
@@ -5,21 +5,45 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.resolveWithProvider = exports.handleProvider = void 0;
7
7
  var _utils = require("@atlaskit/editor-common/utils");
8
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
8
9
  var _actions = require("../actions");
9
10
  var _doc = require("../doc");
11
+ var isFreshlyPastedOnNewLine = function isFreshlyPastedOnNewLine(view) {
12
+ var selection = view.state.selection;
13
+ var _ref = selection,
14
+ $cursor = _ref.$cursor,
15
+ $anchor = _ref.$anchor;
16
+ if (!$cursor) {
17
+ return false;
18
+ }
19
+ if (!(0, _utils.hasDocAsParent)($anchor)) {
20
+ return false;
21
+ }
22
+ var node = $cursor.node();
23
+ if (!node) {
24
+ return false;
25
+ }
26
+ if (node.type.name !== 'paragraph') {
27
+ return false;
28
+ }
29
+ return node.childCount === 1; // The pasted blue link itself
30
+ };
31
+
10
32
  // ============================================================================ //
11
33
  // ============================== PROVIDER UTILS ============================== //
12
34
  // ============================================================================ //
13
35
  // Used for all interactions with the EditorCardProvider.
14
36
  // ============================================================================ //
15
37
  var resolveWithProvider = exports.resolveWithProvider = function resolveWithProvider(view, provider, request, options, editorAnalyticsApi, createAnalyticsEvent) {
38
+ var isEmbedFriendlyLocation = (0, _platformFeatureFlags.fg)('hardcoded-embeds-only-on-new-line') ? isFreshlyPastedOnNewLine(view) : true;
39
+
16
40
  // When user manually changes appearance from blue link to smart link, we should respect that,
17
41
  var shouldForceAppearance =
18
42
  // This flag is set to true only in one place atm:
19
43
  // packages/editor/editor-core/src/plugins/card/pm-plugins/doc.ts @ convertHyperlinkToSmartCard
20
44
  // Which is used when user switching from URL to smart link appearance.
21
45
  !!request.shouldReplaceLink;
22
- var handleResolve = provider.resolve(request.url, request.appearance, shouldForceAppearance).then(handleResolved(view, request, editorAnalyticsApi, createAnalyticsEvent, options), handleRejected(view, request, editorAnalyticsApi));
46
+ var handleResolve = provider.resolve(request.url, request.appearance, shouldForceAppearance, isEmbedFriendlyLocation).then(handleResolved(view, request, editorAnalyticsApi, createAnalyticsEvent, options), handleRejected(view, request, editorAnalyticsApi));
23
47
  return handleResolve;
24
48
  };
25
49
  var updateCardType = function updateCardType(resolvedCard, options) {
@@ -188,7 +188,7 @@ var getToolbarViewedItem = function getToolbarViewedItem(url, display) {
188
188
  };
189
189
  var generateToolbarItems = function generateToolbarItems(state, intl, providerFactory, cardOptions, lpLinkPicker, linkPicker, pluginInjectionApi) {
190
190
  return function (node) {
191
- var _pluginInjectionApi$a, _pluginInjectionApi$d, _pluginInjectionApi$d2, _node$attrs;
191
+ var _pluginInjectionApi$a, _pluginInjectionApi$d, _pluginInjectionApi$d2, _node$attrs, _node$attrs2;
192
192
  var _titleUrlPairFromNode2 = (0, _utils3.titleUrlPairFromNode)(node),
193
193
  url = _titleUrlPairFromNode2.url;
194
194
  var _ref = (_pluginInjectionApi$a = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : pluginInjectionApi.analytics) !== null && _pluginInjectionApi$a !== void 0 ? _pluginInjectionApi$a : {},
@@ -208,8 +208,9 @@ var generateToolbarItems = function generateToolbarItems(state, intl, providerFa
208
208
  var _ref2 = (_pluginInjectionApi$d = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$d2 = pluginInjectionApi.decorations) === null || _pluginInjectionApi$d2 === void 0 ? void 0 : _pluginInjectionApi$d2.actions) !== null && _pluginInjectionApi$d !== void 0 ? _pluginInjectionApi$d : {},
209
209
  hoverDecoration = _ref2.hoverDecoration;
210
210
  var isDatasource = (0, _utils3.isDatasourceNode)(node);
211
+ var datasourceId = node === null || node === void 0 || (_node$attrs = node.attrs) === null || _node$attrs === void 0 || (_node$attrs = _node$attrs.datasource) === null || _node$attrs === void 0 ? void 0 : _node$attrs.id;
211
212
  var pluginState = _main.pluginKey.getState(state);
212
- var shouldRenderDatasourceToolbar = isDatasource && cardOptions.allowDatasource && (0, _utils.canRenderDatasource)(node === null || node === void 0 || (_node$attrs = node.attrs) === null || _node$attrs === void 0 || (_node$attrs = _node$attrs.datasource) === null || _node$attrs === void 0 ? void 0 : _node$attrs.id);
213
+ var shouldRenderDatasourceToolbar = isDatasource && cardOptions.allowDatasource && (0, _utils.canRenderDatasource)(node === null || node === void 0 || (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 || (_node$attrs2 = _node$attrs2.datasource) === null || _node$attrs2 === void 0 ? void 0 : _node$attrs2.id);
213
214
  if (pluginState !== null && pluginState !== void 0 && pluginState.showLinkingToolbar) {
214
215
  return [(0, _EditLinkToolbar.buildEditLinkToolbar)({
215
216
  providerFactory: providerFactory,
@@ -341,6 +342,7 @@ var generateToolbarItems = function generateToolbarItems(state, intl, providerFa
341
342
  fallback: [],
342
343
  render: function render(editorView) {
343
344
  return /*#__PURE__*/_react.default.createElement(_EditDatasourceButton.EditDatasourceButton, {
345
+ datasourceId: datasourceId,
344
346
  intl: intl,
345
347
  editorAnalyticsApi: editorAnalyticsApi,
346
348
  url: url,
@@ -392,7 +394,7 @@ var getSettingsButtonGroup = exports.getSettingsButtonGroup = function getSettin
392
394
  }];
393
395
  };
394
396
  var getDatasourceButtonGroup = function getDatasourceButtonGroup(metadata, intl, editorAnalyticsApi, node, hoverDecoration, datasourceId, state, cardOptions, currentAppearance) {
395
- var _node$attrs2;
397
+ var _node$attrs3;
396
398
  var toolbarItems = [];
397
399
  if ((0, _utils3.isDatasourceConfigEditable)(datasourceId) && !(0, _platformFeatureFlags.fg)('platform.linking-platform.enable-datasource-edit-dropdown-toolbar')) {
398
400
  toolbarItems.push({
@@ -477,7 +479,7 @@ var getDatasourceButtonGroup = function getDatasourceButtonGroup(metadata, intl,
477
479
  }
478
480
  });
479
481
  }
480
- if (node !== null && node !== void 0 && (_node$attrs2 = node.attrs) !== null && _node$attrs2 !== void 0 && _node$attrs2.url) {
482
+ if (node !== null && node !== void 0 && (_node$attrs3 = node.attrs) !== null && _node$attrs3 !== void 0 && _node$attrs3.url) {
481
483
  toolbarItems.push({
482
484
  id: 'editor.link.openLink',
483
485
  type: 'button',
@@ -30,6 +30,7 @@ var buttonStyles = (0, _react2.css)({
30
30
  // if they can resolve into a datasource.
31
31
  var EditDatasourceButtonWithCardContext = function EditDatasourceButtonWithCardContext(_ref) {
32
32
  var cardContext = _ref.cardContext,
33
+ datasourceIdFromAdf = _ref.datasourceId,
33
34
  intl = _ref.intl,
34
35
  editorAnalyticsApi = _ref.editorAnalyticsApi,
35
36
  url = _ref.url,
@@ -40,8 +41,9 @@ var EditDatasourceButtonWithCardContext = function EditDatasourceButtonWithCardC
40
41
  url: url,
41
42
  cardContext: cardContext
42
43
  }),
43
- datasourceId = _useFetchDatasourceIn.datasourceId,
44
+ datasourceIdFromUrl = _useFetchDatasourceIn.datasourceId,
44
45
  extensionKey = _useFetchDatasourceIn.extensionKey;
46
+ var datasourceId = datasourceIdFromUrl !== null && datasourceIdFromUrl !== void 0 ? datasourceIdFromUrl : datasourceIdFromAdf;
45
47
  var onEditDatasource = (0, _react.useCallback)(function () {
46
48
  if (editorView && datasourceId) {
47
49
  editDatasource(datasourceId, editorAnalyticsApi, currentAppearance, extensionKey)(editorView.state, editorView.dispatch);
@@ -68,7 +70,8 @@ var EditDatasourceButtonWithCardContext = function EditDatasourceButtonWithCardC
68
70
  }), (0, _react2.jsx)(_ui.FloatingToolbarSeparator, null));
69
71
  };
70
72
  var EditDatasourceButton = exports.EditDatasourceButton = function EditDatasourceButton(_ref2) {
71
- var intl = _ref2.intl,
73
+ var datasourceId = _ref2.datasourceId,
74
+ intl = _ref2.intl,
72
75
  editorAnalyticsApi = _ref2.editorAnalyticsApi,
73
76
  url = _ref2.url,
74
77
  editorView = _ref2.editorView,
@@ -76,6 +79,7 @@ var EditDatasourceButton = exports.EditDatasourceButton = function EditDatasourc
76
79
  return (0, _react2.jsx)(_CardContextProvider.CardContextProvider, null, function (_ref3) {
77
80
  var cardContext = _ref3.cardContext;
78
81
  return (0, _react2.jsx)(EditDatasourceButtonWithCardContext, {
82
+ datasourceId: datasourceId,
79
83
  url: url,
80
84
  intl: intl,
81
85
  editorAnalyticsApi: editorAnalyticsApi,
@@ -159,6 +159,7 @@ var EditToolbarButtonWithCardContext = function EditToolbarButtonWithCardContext
159
159
  var EditToolbarButtonWithUrl = function EditToolbarButtonWithUrl(props) {
160
160
  var cardContext = props.cardContext,
161
161
  currentAppearance = props.currentAppearance,
162
+ datasourceIdFromAdf = props.datasourceId,
162
163
  editorAnalyticsApi = props.editorAnalyticsApi,
163
164
  editorView = props.editorView,
164
165
  intl = props.intl,
@@ -170,7 +171,8 @@ var EditToolbarButtonWithUrl = function EditToolbarButtonWithUrl(props) {
170
171
  cardContext: cardContext
171
172
  }),
172
173
  extensionKey = _useFetchDatasourceIn2.extensionKey,
173
- datasourceId = _useFetchDatasourceIn2.datasourceId;
174
+ datasourceIdFromUrl = _useFetchDatasourceIn2.datasourceId;
175
+ var datasourceId = datasourceIdFromUrl !== null && datasourceIdFromUrl !== void 0 ? datasourceIdFromUrl : datasourceIdFromAdf;
174
176
  var editVariant = (0, _react.useMemo)(function () {
175
177
  var _cardContext$store2, _urlState$error2;
176
178
  if (!datasourceId || !(0, _utils.isDatasourceConfigEditable)(datasourceId)) {
@@ -254,6 +256,7 @@ var EditToolbarButton = exports.EditToolbarButton = function EditToolbarButton(p
254
256
  if ((0, _platformFeatureFlags.fg)('enable_datasource_nourl_edit_dropdown_datafetch')) {
255
257
  if (props.url) {
256
258
  return (0, _react2.jsx)(EditToolbarButtonWithUrl, {
259
+ datasourceId: datasourceId,
257
260
  url: props.url,
258
261
  intl: intl,
259
262
  editorAnalyticsApi: editorAnalyticsApi,
@@ -1,6 +1,30 @@
1
- import { canRenderDatasource } from '@atlaskit/editor-common/utils';
1
+ import { canRenderDatasource, hasDocAsParent } from '@atlaskit/editor-common/utils';
2
+ import { fg } from '@atlaskit/platform-feature-flags';
2
3
  import { setProvider } from '../actions';
3
4
  import { handleFallbackWithAnalytics, replaceQueuedUrlWithCard } from '../doc';
5
+ const isFreshlyPastedOnNewLine = view => {
6
+ const {
7
+ selection
8
+ } = view.state;
9
+ const {
10
+ $cursor,
11
+ $anchor
12
+ } = selection;
13
+ if (!$cursor) {
14
+ return false;
15
+ }
16
+ if (!hasDocAsParent($anchor)) {
17
+ return false;
18
+ }
19
+ const node = $cursor.node();
20
+ if (!node) {
21
+ return false;
22
+ }
23
+ if (node.type.name !== 'paragraph') {
24
+ return false;
25
+ }
26
+ return node.childCount === 1; // The pasted blue link itself
27
+ };
4
28
 
5
29
  // ============================================================================ //
6
30
  // ============================== PROVIDER UTILS ============================== //
@@ -8,13 +32,15 @@ import { handleFallbackWithAnalytics, replaceQueuedUrlWithCard } from '../doc';
8
32
  // Used for all interactions with the EditorCardProvider.
9
33
  // ============================================================================ //
10
34
  export const resolveWithProvider = (view, provider, request, options, editorAnalyticsApi, createAnalyticsEvent) => {
35
+ const isEmbedFriendlyLocation = fg('hardcoded-embeds-only-on-new-line') ? isFreshlyPastedOnNewLine(view) : true;
36
+
11
37
  // When user manually changes appearance from blue link to smart link, we should respect that,
12
38
  let shouldForceAppearance =
13
39
  // This flag is set to true only in one place atm:
14
40
  // packages/editor/editor-core/src/plugins/card/pm-plugins/doc.ts @ convertHyperlinkToSmartCard
15
41
  // Which is used when user switching from URL to smart link appearance.
16
42
  !!request.shouldReplaceLink;
17
- const handleResolve = provider.resolve(request.url, request.appearance, shouldForceAppearance).then(handleResolved(view, request, editorAnalyticsApi, createAnalyticsEvent, options), handleRejected(view, request, editorAnalyticsApi));
43
+ const handleResolve = provider.resolve(request.url, request.appearance, shouldForceAppearance, isEmbedFriendlyLocation).then(handleResolved(view, request, editorAnalyticsApi, createAnalyticsEvent, options), handleRejected(view, request, editorAnalyticsApi));
18
44
  return handleResolve;
19
45
  };
20
46
  const updateCardType = (resolvedCard, options) => {
@@ -176,7 +176,7 @@ const getToolbarViewedItem = (url, display) => {
176
176
  }];
177
177
  };
178
178
  const generateToolbarItems = (state, intl, providerFactory, cardOptions, lpLinkPicker, linkPicker, pluginInjectionApi) => node => {
179
- var _pluginInjectionApi$a, _pluginInjectionApi$d, _pluginInjectionApi$d2, _node$attrs, _node$attrs$datasourc;
179
+ var _pluginInjectionApi$a, _pluginInjectionApi$d, _pluginInjectionApi$d2, _node$attrs, _node$attrs$datasourc, _node$attrs2, _node$attrs2$datasour;
180
180
  const {
181
181
  url
182
182
  } = titleUrlPairFromNode(node);
@@ -200,8 +200,9 @@ const generateToolbarItems = (state, intl, providerFactory, cardOptions, lpLinkP
200
200
  hoverDecoration
201
201
  } = (_pluginInjectionApi$d = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : (_pluginInjectionApi$d2 = pluginInjectionApi.decorations) === null || _pluginInjectionApi$d2 === void 0 ? void 0 : _pluginInjectionApi$d2.actions) !== null && _pluginInjectionApi$d !== void 0 ? _pluginInjectionApi$d : {};
202
202
  const isDatasource = isDatasourceNode(node);
203
+ const datasourceId = node === null || node === void 0 ? void 0 : (_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : (_node$attrs$datasourc = _node$attrs.datasource) === null || _node$attrs$datasourc === void 0 ? void 0 : _node$attrs$datasourc.id;
203
204
  const pluginState = pluginKey.getState(state);
204
- const shouldRenderDatasourceToolbar = isDatasource && cardOptions.allowDatasource && canRenderDatasource(node === null || node === void 0 ? void 0 : (_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : (_node$attrs$datasourc = _node$attrs.datasource) === null || _node$attrs$datasourc === void 0 ? void 0 : _node$attrs$datasourc.id);
205
+ const shouldRenderDatasourceToolbar = isDatasource && cardOptions.allowDatasource && canRenderDatasource(node === null || node === void 0 ? void 0 : (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 ? void 0 : (_node$attrs2$datasour = _node$attrs2.datasource) === null || _node$attrs2$datasour === void 0 ? void 0 : _node$attrs2$datasour.id);
205
206
  if (pluginState !== null && pluginState !== void 0 && pluginState.showLinkingToolbar) {
206
207
  return [buildEditLinkToolbar({
207
208
  providerFactory,
@@ -330,6 +331,7 @@ const generateToolbarItems = (state, intl, providerFactory, cardOptions, lpLinkP
330
331
  type: 'custom',
331
332
  fallback: [],
332
333
  render: editorView => /*#__PURE__*/React.createElement(EditDatasourceButton, {
334
+ datasourceId: datasourceId,
333
335
  intl: intl,
334
336
  editorAnalyticsApi: editorAnalyticsApi,
335
337
  url: url,
@@ -379,7 +381,7 @@ export const getSettingsButtonGroup = (intl, editorAnalyticsApi, userPreferences
379
381
  }];
380
382
  };
381
383
  const getDatasourceButtonGroup = (metadata, intl, editorAnalyticsApi, node, hoverDecoration, datasourceId, state, cardOptions, currentAppearance) => {
382
- var _node$attrs2;
384
+ var _node$attrs3;
383
385
  const toolbarItems = [];
384
386
  if (isDatasourceConfigEditable(datasourceId) && !fg('platform.linking-platform.enable-datasource-edit-dropdown-toolbar')) {
385
387
  toolbarItems.push({
@@ -464,7 +466,7 @@ const getDatasourceButtonGroup = (metadata, intl, editorAnalyticsApi, node, hove
464
466
  })
465
467
  });
466
468
  }
467
- if (node !== null && node !== void 0 && (_node$attrs2 = node.attrs) !== null && _node$attrs2 !== void 0 && _node$attrs2.url) {
469
+ if (node !== null && node !== void 0 && (_node$attrs3 = node.attrs) !== null && _node$attrs3 !== void 0 && _node$attrs3.url) {
468
470
  toolbarItems.push({
469
471
  id: 'editor.link.openLink',
470
472
  type: 'button',
@@ -23,6 +23,7 @@ const buttonStyles = css({
23
23
  // if they can resolve into a datasource.
24
24
  const EditDatasourceButtonWithCardContext = ({
25
25
  cardContext,
26
+ datasourceId: datasourceIdFromAdf,
26
27
  intl,
27
28
  editorAnalyticsApi,
28
29
  url,
@@ -30,13 +31,14 @@ const EditDatasourceButtonWithCardContext = ({
30
31
  currentAppearance
31
32
  }) => {
32
33
  const {
33
- datasourceId,
34
+ datasourceId: datasourceIdFromUrl,
34
35
  extensionKey
35
36
  } = useFetchDatasourceInfo({
36
37
  isRegularCardNode: true,
37
38
  url,
38
39
  cardContext
39
40
  });
41
+ const datasourceId = datasourceIdFromUrl !== null && datasourceIdFromUrl !== void 0 ? datasourceIdFromUrl : datasourceIdFromAdf;
40
42
  const onEditDatasource = useCallback(() => {
41
43
  if (editorView && datasourceId) {
42
44
  editDatasource(datasourceId, editorAnalyticsApi, currentAppearance, extensionKey)(editorView.state, editorView.dispatch);
@@ -63,6 +65,7 @@ const EditDatasourceButtonWithCardContext = ({
63
65
  }), jsx(Separator, null));
64
66
  };
65
67
  export const EditDatasourceButton = ({
68
+ datasourceId,
66
69
  intl,
67
70
  editorAnalyticsApi,
68
71
  url,
@@ -72,6 +75,7 @@ export const EditDatasourceButton = ({
72
75
  return jsx(CardContextProvider, null, ({
73
76
  cardContext
74
77
  }) => jsx(EditDatasourceButtonWithCardContext, {
78
+ datasourceId: datasourceId,
75
79
  url: url,
76
80
  intl: intl,
77
81
  editorAnalyticsApi: editorAnalyticsApi,
@@ -145,6 +145,7 @@ const EditToolbarButtonWithUrl = props => {
145
145
  const {
146
146
  cardContext,
147
147
  currentAppearance,
148
+ datasourceId: datasourceIdFromAdf,
148
149
  editorAnalyticsApi,
149
150
  editorView,
150
151
  intl,
@@ -153,12 +154,13 @@ const EditToolbarButtonWithUrl = props => {
153
154
  } = props;
154
155
  const {
155
156
  extensionKey,
156
- datasourceId
157
+ datasourceId: datasourceIdFromUrl
157
158
  } = useFetchDatasourceInfo({
158
159
  isRegularCardNode: true,
159
160
  url,
160
161
  cardContext
161
162
  });
163
+ const datasourceId = datasourceIdFromUrl !== null && datasourceIdFromUrl !== void 0 ? datasourceIdFromUrl : datasourceIdFromAdf;
162
164
  const editVariant = useMemo(() => {
163
165
  var _cardContext$store2, _urlState$error2;
164
166
  if (!datasourceId || !isDatasourceConfigEditable(datasourceId)) {
@@ -246,6 +248,7 @@ export const EditToolbarButton = props => {
246
248
  if (fg('enable_datasource_nourl_edit_dropdown_datafetch')) {
247
249
  if (props.url) {
248
250
  return jsx(EditToolbarButtonWithUrl, {
251
+ datasourceId: datasourceId,
249
252
  url: props.url,
250
253
  intl: intl,
251
254
  editorAnalyticsApi: editorAnalyticsApi,
@@ -1,6 +1,27 @@
1
- import { canRenderDatasource } from '@atlaskit/editor-common/utils';
1
+ import { canRenderDatasource, hasDocAsParent } from '@atlaskit/editor-common/utils';
2
+ import { fg } from '@atlaskit/platform-feature-flags';
2
3
  import { setProvider } from '../actions';
3
4
  import { handleFallbackWithAnalytics, replaceQueuedUrlWithCard } from '../doc';
5
+ var isFreshlyPastedOnNewLine = function isFreshlyPastedOnNewLine(view) {
6
+ var selection = view.state.selection;
7
+ var _ref = selection,
8
+ $cursor = _ref.$cursor,
9
+ $anchor = _ref.$anchor;
10
+ if (!$cursor) {
11
+ return false;
12
+ }
13
+ if (!hasDocAsParent($anchor)) {
14
+ return false;
15
+ }
16
+ var node = $cursor.node();
17
+ if (!node) {
18
+ return false;
19
+ }
20
+ if (node.type.name !== 'paragraph') {
21
+ return false;
22
+ }
23
+ return node.childCount === 1; // The pasted blue link itself
24
+ };
4
25
 
5
26
  // ============================================================================ //
6
27
  // ============================== PROVIDER UTILS ============================== //
@@ -8,13 +29,15 @@ import { handleFallbackWithAnalytics, replaceQueuedUrlWithCard } from '../doc';
8
29
  // Used for all interactions with the EditorCardProvider.
9
30
  // ============================================================================ //
10
31
  export var resolveWithProvider = function resolveWithProvider(view, provider, request, options, editorAnalyticsApi, createAnalyticsEvent) {
32
+ var isEmbedFriendlyLocation = fg('hardcoded-embeds-only-on-new-line') ? isFreshlyPastedOnNewLine(view) : true;
33
+
11
34
  // When user manually changes appearance from blue link to smart link, we should respect that,
12
35
  var shouldForceAppearance =
13
36
  // This flag is set to true only in one place atm:
14
37
  // packages/editor/editor-core/src/plugins/card/pm-plugins/doc.ts @ convertHyperlinkToSmartCard
15
38
  // Which is used when user switching from URL to smart link appearance.
16
39
  !!request.shouldReplaceLink;
17
- var handleResolve = provider.resolve(request.url, request.appearance, shouldForceAppearance).then(handleResolved(view, request, editorAnalyticsApi, createAnalyticsEvent, options), handleRejected(view, request, editorAnalyticsApi));
40
+ var handleResolve = provider.resolve(request.url, request.appearance, shouldForceAppearance, isEmbedFriendlyLocation).then(handleResolved(view, request, editorAnalyticsApi, createAnalyticsEvent, options), handleRejected(view, request, editorAnalyticsApi));
18
41
  return handleResolve;
19
42
  };
20
43
  var updateCardType = function updateCardType(resolvedCard, options) {
@@ -178,7 +178,7 @@ var getToolbarViewedItem = function getToolbarViewedItem(url, display) {
178
178
  };
179
179
  var generateToolbarItems = function generateToolbarItems(state, intl, providerFactory, cardOptions, lpLinkPicker, linkPicker, pluginInjectionApi) {
180
180
  return function (node) {
181
- var _pluginInjectionApi$a, _pluginInjectionApi$d, _pluginInjectionApi$d2, _node$attrs;
181
+ var _pluginInjectionApi$a, _pluginInjectionApi$d, _pluginInjectionApi$d2, _node$attrs, _node$attrs2;
182
182
  var _titleUrlPairFromNode2 = titleUrlPairFromNode(node),
183
183
  url = _titleUrlPairFromNode2.url;
184
184
  var _ref = (_pluginInjectionApi$a = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : pluginInjectionApi.analytics) !== null && _pluginInjectionApi$a !== void 0 ? _pluginInjectionApi$a : {},
@@ -198,8 +198,9 @@ var generateToolbarItems = function generateToolbarItems(state, intl, providerFa
198
198
  var _ref2 = (_pluginInjectionApi$d = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$d2 = pluginInjectionApi.decorations) === null || _pluginInjectionApi$d2 === void 0 ? void 0 : _pluginInjectionApi$d2.actions) !== null && _pluginInjectionApi$d !== void 0 ? _pluginInjectionApi$d : {},
199
199
  hoverDecoration = _ref2.hoverDecoration;
200
200
  var isDatasource = isDatasourceNode(node);
201
+ var datasourceId = node === null || node === void 0 || (_node$attrs = node.attrs) === null || _node$attrs === void 0 || (_node$attrs = _node$attrs.datasource) === null || _node$attrs === void 0 ? void 0 : _node$attrs.id;
201
202
  var pluginState = pluginKey.getState(state);
202
- var shouldRenderDatasourceToolbar = isDatasource && cardOptions.allowDatasource && canRenderDatasource(node === null || node === void 0 || (_node$attrs = node.attrs) === null || _node$attrs === void 0 || (_node$attrs = _node$attrs.datasource) === null || _node$attrs === void 0 ? void 0 : _node$attrs.id);
203
+ var shouldRenderDatasourceToolbar = isDatasource && cardOptions.allowDatasource && canRenderDatasource(node === null || node === void 0 || (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 || (_node$attrs2 = _node$attrs2.datasource) === null || _node$attrs2 === void 0 ? void 0 : _node$attrs2.id);
203
204
  if (pluginState !== null && pluginState !== void 0 && pluginState.showLinkingToolbar) {
204
205
  return [buildEditLinkToolbar({
205
206
  providerFactory: providerFactory,
@@ -331,6 +332,7 @@ var generateToolbarItems = function generateToolbarItems(state, intl, providerFa
331
332
  fallback: [],
332
333
  render: function render(editorView) {
333
334
  return /*#__PURE__*/React.createElement(EditDatasourceButton, {
335
+ datasourceId: datasourceId,
334
336
  intl: intl,
335
337
  editorAnalyticsApi: editorAnalyticsApi,
336
338
  url: url,
@@ -382,7 +384,7 @@ export var getSettingsButtonGroup = function getSettingsButtonGroup(intl, editor
382
384
  }];
383
385
  };
384
386
  var getDatasourceButtonGroup = function getDatasourceButtonGroup(metadata, intl, editorAnalyticsApi, node, hoverDecoration, datasourceId, state, cardOptions, currentAppearance) {
385
- var _node$attrs2;
387
+ var _node$attrs3;
386
388
  var toolbarItems = [];
387
389
  if (isDatasourceConfigEditable(datasourceId) && !fg('platform.linking-platform.enable-datasource-edit-dropdown-toolbar')) {
388
390
  toolbarItems.push({
@@ -467,7 +469,7 @@ var getDatasourceButtonGroup = function getDatasourceButtonGroup(metadata, intl,
467
469
  }
468
470
  });
469
471
  }
470
- if (node !== null && node !== void 0 && (_node$attrs2 = node.attrs) !== null && _node$attrs2 !== void 0 && _node$attrs2.url) {
472
+ if (node !== null && node !== void 0 && (_node$attrs3 = node.attrs) !== null && _node$attrs3 !== void 0 && _node$attrs3.url) {
471
473
  toolbarItems.push({
472
474
  id: 'editor.link.openLink',
473
475
  type: 'button',
@@ -23,6 +23,7 @@ var buttonStyles = css({
23
23
  // if they can resolve into a datasource.
24
24
  var EditDatasourceButtonWithCardContext = function EditDatasourceButtonWithCardContext(_ref) {
25
25
  var cardContext = _ref.cardContext,
26
+ datasourceIdFromAdf = _ref.datasourceId,
26
27
  intl = _ref.intl,
27
28
  editorAnalyticsApi = _ref.editorAnalyticsApi,
28
29
  url = _ref.url,
@@ -33,8 +34,9 @@ var EditDatasourceButtonWithCardContext = function EditDatasourceButtonWithCardC
33
34
  url: url,
34
35
  cardContext: cardContext
35
36
  }),
36
- datasourceId = _useFetchDatasourceIn.datasourceId,
37
+ datasourceIdFromUrl = _useFetchDatasourceIn.datasourceId,
37
38
  extensionKey = _useFetchDatasourceIn.extensionKey;
39
+ var datasourceId = datasourceIdFromUrl !== null && datasourceIdFromUrl !== void 0 ? datasourceIdFromUrl : datasourceIdFromAdf;
38
40
  var onEditDatasource = useCallback(function () {
39
41
  if (editorView && datasourceId) {
40
42
  editDatasource(datasourceId, editorAnalyticsApi, currentAppearance, extensionKey)(editorView.state, editorView.dispatch);
@@ -61,7 +63,8 @@ var EditDatasourceButtonWithCardContext = function EditDatasourceButtonWithCardC
61
63
  }), jsx(Separator, null));
62
64
  };
63
65
  export var EditDatasourceButton = function EditDatasourceButton(_ref2) {
64
- var intl = _ref2.intl,
66
+ var datasourceId = _ref2.datasourceId,
67
+ intl = _ref2.intl,
65
68
  editorAnalyticsApi = _ref2.editorAnalyticsApi,
66
69
  url = _ref2.url,
67
70
  editorView = _ref2.editorView,
@@ -69,6 +72,7 @@ export var EditDatasourceButton = function EditDatasourceButton(_ref2) {
69
72
  return jsx(CardContextProvider, null, function (_ref3) {
70
73
  var cardContext = _ref3.cardContext;
71
74
  return jsx(EditDatasourceButtonWithCardContext, {
75
+ datasourceId: datasourceId,
72
76
  url: url,
73
77
  intl: intl,
74
78
  editorAnalyticsApi: editorAnalyticsApi,
@@ -153,6 +153,7 @@ var EditToolbarButtonWithCardContext = function EditToolbarButtonWithCardContext
153
153
  var EditToolbarButtonWithUrl = function EditToolbarButtonWithUrl(props) {
154
154
  var cardContext = props.cardContext,
155
155
  currentAppearance = props.currentAppearance,
156
+ datasourceIdFromAdf = props.datasourceId,
156
157
  editorAnalyticsApi = props.editorAnalyticsApi,
157
158
  editorView = props.editorView,
158
159
  intl = props.intl,
@@ -164,7 +165,8 @@ var EditToolbarButtonWithUrl = function EditToolbarButtonWithUrl(props) {
164
165
  cardContext: cardContext
165
166
  }),
166
167
  extensionKey = _useFetchDatasourceIn2.extensionKey,
167
- datasourceId = _useFetchDatasourceIn2.datasourceId;
168
+ datasourceIdFromUrl = _useFetchDatasourceIn2.datasourceId;
169
+ var datasourceId = datasourceIdFromUrl !== null && datasourceIdFromUrl !== void 0 ? datasourceIdFromUrl : datasourceIdFromAdf;
168
170
  var editVariant = useMemo(function () {
169
171
  var _cardContext$store2, _urlState$error2;
170
172
  if (!datasourceId || !isDatasourceConfigEditable(datasourceId)) {
@@ -248,6 +250,7 @@ export var EditToolbarButton = function EditToolbarButton(props) {
248
250
  if (fg('enable_datasource_nourl_edit_dropdown_datafetch')) {
249
251
  if (props.url) {
250
252
  return jsx(EditToolbarButtonWithUrl, {
253
+ datasourceId: datasourceId,
251
254
  url: props.url,
252
255
  intl: intl,
253
256
  editorAnalyticsApi: editorAnalyticsApi,
@@ -6,6 +6,7 @@ import type { EditorView } from '@atlaskit/editor-prosemirror/view';
6
6
  import type { CardContext } from '@atlaskit/link-provider';
7
7
  import { type CardType } from '../types';
8
8
  export interface EditDatasourceButtonProps {
9
+ datasourceId?: string;
9
10
  intl: IntlShape;
10
11
  editorAnalyticsApi?: EditorAnalyticsAPI;
11
12
  url?: string;
@@ -13,5 +14,5 @@ export interface EditDatasourceButtonProps {
13
14
  cardContext?: CardContext;
14
15
  currentAppearance?: CardType;
15
16
  }
16
- export declare const EditDatasourceButton: ({ intl, editorAnalyticsApi, url, editorView, currentAppearance, }: EditDatasourceButtonProps) => jsx.JSX.Element;
17
+ export declare const EditDatasourceButton: ({ datasourceId, intl, editorAnalyticsApi, url, editorView, currentAppearance, }: EditDatasourceButtonProps) => jsx.JSX.Element;
17
18
  export declare const editDatasource: (datasourceId: string, editorAnalyticsApi?: EditorAnalyticsAPI, appearance?: CardType, extensionKey?: string) => Command;
@@ -15,6 +15,7 @@ export interface EditDatasourceToolbarButtonWithCommonProps {
15
15
  }
16
16
  export interface EditDatasourceToolbarButtonWithUrlProps extends EditDatasourceToolbarButtonWithCommonProps {
17
17
  cardContext?: CardContext;
18
+ datasourceId?: string;
18
19
  url: string;
19
20
  }
20
21
  export interface EditDatasourceToolbarButtonWithDatasourceIdProps extends EditDatasourceToolbarButtonWithCommonProps {
@@ -6,6 +6,7 @@ import type { EditorView } from '@atlaskit/editor-prosemirror/view';
6
6
  import type { CardContext } from '@atlaskit/link-provider';
7
7
  import { type CardType } from '../types';
8
8
  export interface EditDatasourceButtonProps {
9
+ datasourceId?: string;
9
10
  intl: IntlShape;
10
11
  editorAnalyticsApi?: EditorAnalyticsAPI;
11
12
  url?: string;
@@ -13,5 +14,5 @@ export interface EditDatasourceButtonProps {
13
14
  cardContext?: CardContext;
14
15
  currentAppearance?: CardType;
15
16
  }
16
- export declare const EditDatasourceButton: ({ intl, editorAnalyticsApi, url, editorView, currentAppearance, }: EditDatasourceButtonProps) => jsx.JSX.Element;
17
+ export declare const EditDatasourceButton: ({ datasourceId, intl, editorAnalyticsApi, url, editorView, currentAppearance, }: EditDatasourceButtonProps) => jsx.JSX.Element;
17
18
  export declare const editDatasource: (datasourceId: string, editorAnalyticsApi?: EditorAnalyticsAPI, appearance?: CardType, extensionKey?: string) => Command;
@@ -15,6 +15,7 @@ export interface EditDatasourceToolbarButtonWithCommonProps {
15
15
  }
16
16
  export interface EditDatasourceToolbarButtonWithUrlProps extends EditDatasourceToolbarButtonWithCommonProps {
17
17
  cardContext?: CardContext;
18
+ datasourceId?: string;
18
19
  url: string;
19
20
  }
20
21
  export interface EditDatasourceToolbarButtonWithDatasourceIdProps extends EditDatasourceToolbarButtonWithCommonProps {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-card",
3
- "version": "3.0.1",
3
+ "version": "3.0.3",
4
4
  "description": "Card plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -34,21 +34,21 @@
34
34
  "@atlaskit/adf-schema": "^40.9.0",
35
35
  "@atlaskit/analytics-next": "^10.1.0",
36
36
  "@atlaskit/custom-steps": "^0.7.0",
37
- "@atlaskit/editor-common": "^89.0.0",
37
+ "@atlaskit/editor-common": "^89.3.0",
38
38
  "@atlaskit/editor-plugin-analytics": "^1.8.0",
39
39
  "@atlaskit/editor-plugin-decorations": "^1.3.0",
40
40
  "@atlaskit/editor-plugin-editor-disabled": "^1.3.0",
41
41
  "@atlaskit/editor-plugin-editor-viewmode": "^2.1.0",
42
42
  "@atlaskit/editor-plugin-feature-flags": "^1.2.0",
43
- "@atlaskit/editor-plugin-floating-toolbar": "^1.12.0",
43
+ "@atlaskit/editor-plugin-floating-toolbar": "^1.13.0",
44
44
  "@atlaskit/editor-plugin-grid": "^1.2.0",
45
45
  "@atlaskit/editor-plugin-width": "^1.3.0",
46
46
  "@atlaskit/editor-prosemirror": "6.0.0",
47
47
  "@atlaskit/editor-shared-styles": "^2.13.0",
48
48
  "@atlaskit/frontend-utilities": "^2.7.0",
49
- "@atlaskit/icon": "^22.16.0",
49
+ "@atlaskit/icon": "^22.18.0",
50
50
  "@atlaskit/link-analytics": "^8.5.0",
51
- "@atlaskit/link-client-extension": "^2.3.0",
51
+ "@atlaskit/link-client-extension": "^2.4.0",
52
52
  "@atlaskit/link-datasource": "^3.0.0",
53
53
  "@atlaskit/linking-common": "^5.11.0",
54
54
  "@atlaskit/linking-types": "^9.0.0",
@@ -58,7 +58,7 @@
58
58
  "@atlaskit/smart-card": "^28.1.0",
59
59
  "@atlaskit/theme": "^13.0.0",
60
60
  "@atlaskit/tmp-editor-statsig": "^2.1.8",
61
- "@atlaskit/tokens": "^1.59.0",
61
+ "@atlaskit/tokens": "^1.60.0",
62
62
  "@babel/runtime": "^7.0.0",
63
63
  "@emotion/react": "^11.7.1",
64
64
  "lodash": "^4.17.21",
@@ -66,7 +66,7 @@
66
66
  "raf-schd": "^4.0.3"
67
67
  },
68
68
  "peerDependencies": {
69
- "@atlaskit/link-provider": "^1.14.0",
69
+ "@atlaskit/link-provider": "^1.16.0",
70
70
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
71
71
  "react-intl-next": "npm:react-intl@^5.18.1"
72
72
  },
@@ -134,6 +134,9 @@
134
134
  },
135
135
  "editor_inline_comments_paste_insert_nodes": {
136
136
  "type": "boolean"
137
+ },
138
+ "hardcoded-embeds-only-on-new-line": {
139
+ "type": "boolean"
137
140
  }
138
141
  },
139
142
  "stricter": {