@atlaskit/editor-plugin-card 16.5.3 → 16.6.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,22 @@
1
1
  # @atlaskit/editor-plugin-card
2
2
 
3
+ ## 16.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`a94026f1bcd86`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/a94026f1bcd86) -
8
+ [ux] fix: scope card queue to inserted range when inserting MAUI embed via Add to Doc
9
+
10
+ ### Patch Changes
11
+
12
+ - Updated dependencies
13
+
14
+ ## 16.5.4
15
+
16
+ ### Patch Changes
17
+
18
+ - Updated dependencies
19
+
3
20
  ## 16.5.3
4
21
 
5
22
  ### Patch Changes
@@ -135,6 +135,19 @@ var cardPlugin = exports.cardPlugin = function cardPlugin(_ref) {
135
135
  editorView: editorView
136
136
  }));
137
137
  },
138
+ commands: {
139
+ queueCardsFromRange: function queueCardsFromRange(from, to, source, analyticsAction, normalizeLinkText, sourceEvent, appearance) {
140
+ return function (_ref5) {
141
+ var tr = _ref5.tr;
142
+ return (0, _doc.queueCardsFromRange)(
143
+ // Synthesise the minimal EditorState shape the impl actually reads.
144
+ {
145
+ schema: tr.doc.type.schema,
146
+ selection: tr.selection
147
+ }, tr, from, to, source, analyticsAction, normalizeLinkText, sourceEvent, appearance);
148
+ };
149
+ }
150
+ },
138
151
  actions: {
139
152
  setProvider: function () {
140
153
  var _setProvider2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(providerPromise) {
@@ -154,8 +167,8 @@ var cardPlugin = exports.cardPlugin = function cardPlugin(_ref) {
154
167
  return _context.abrupt("return", false);
155
168
  case 5:
156
169
  previousCardProvider = provider;
157
- return _context.abrupt("return", (_api$core$actions$exe = api === null || api === void 0 ? void 0 : api.core.actions.execute(function (_ref5) {
158
- var tr = _ref5.tr;
170
+ return _context.abrupt("return", (_api$core$actions$exe = api === null || api === void 0 ? void 0 : api.core.actions.execute(function (_ref6) {
171
+ var tr = _ref6.tr;
159
172
  return (0, _actions.setProvider)(provider)(tr);
160
173
  })) !== null && _api$core$actions$exe !== void 0 ? _api$core$actions$exe : false);
161
174
  case 7:
@@ -171,6 +184,7 @@ var cardPlugin = exports.cardPlugin = function cardPlugin(_ref) {
171
184
  }(),
172
185
  hideLinkToolbar: _actions.hideLinkToolbar,
173
186
  queueCardsFromChangedTr: _doc.queueCardsFromChangedTr,
187
+ queueCardsFromRange: _doc.queueCardsFromRange,
174
188
  registerEmbedCardTransformer: function registerEmbedCardTransformer(transformers) {
175
189
  instanceEmbedCardTransformers = transformers;
176
190
  },
@@ -262,8 +276,8 @@ var cardPlugin = exports.cardPlugin = function cardPlugin(_ref) {
262
276
  },
263
277
  pluginsOptions: {
264
278
  floatingToolbar: (0, _toolbar.floatingToolbar)(options, (_options$lpLinkPicker = options.lpLinkPicker) !== null && _options$lpLinkPicker !== void 0 ? _options$lpLinkPicker : false, options.linkPicker, api, options.disableFloatingToolbar),
265
- quickInsert: function quickInsert(_ref6) {
266
- var formatMessage = _ref6.formatMessage;
279
+ quickInsert: function quickInsert(_ref7) {
280
+ var formatMessage = _ref7.formatMessage;
267
281
  var quickInsertArray = [];
268
282
  if (!options.allowDatasource) {
269
283
  return quickInsertArray;
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.updateCardViaDatasource = exports.updateCard = exports.setSelectedCardAppearance = exports.replaceQueuedUrlWithCard = exports.queueCardsFromChangedTr = exports.queueCardFromChangedTr = exports.insertDatasource = exports.handleFallbackWithAnalytics = exports.getLinkNodeType = exports.getAttrsForAppearance = exports.convertHyperlinkToSmartCard = exports.changeSelectedCardToText = exports.changeSelectedCardToLinkFallback = exports.changeSelectedCardToLink = void 0;
7
+ exports.updateCardViaDatasource = exports.updateCard = exports.setSelectedCardAppearance = exports.replaceQueuedUrlWithCard = exports.queueCardsFromRange = exports.queueCardsFromChangedTr = exports.queueCardFromChangedTr = exports.insertDatasource = exports.handleFallbackWithAnalytics = exports.getLinkNodeType = exports.getAttrsForAppearance = exports.convertHyperlinkToSmartCard = exports.changeSelectedCardToText = exports.changeSelectedCardToLinkFallback = exports.changeSelectedCardToLink = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
@@ -199,6 +199,45 @@ var handleFallbackWithAnalytics = exports.handleFallbackWithAnalytics = function
199
199
  return true;
200
200
  };
201
201
  };
202
+
203
+ /**
204
+ * Shared options used by both `queueCardsFromChangedTr` and
205
+ * `queueCardsFromRange` to build smart-link resolution requests for text
206
+ * nodes carrying a `link` mark.
207
+ */
208
+
209
+ /**
210
+ * Per-node walker shared by `queueCardsFromChangedTr` and
211
+ * `queueCardsFromRange`. Pushes a smart-link resolution request for every
212
+ * text node carrying a qualifying `link` mark.
213
+ *
214
+ * Returning `true`/`false` follows the ProseMirror `nodesBetween`/
215
+ * `nodesBetweenChanged` walker contract: `true` to descend into children,
216
+ * `false` to skip subtree.
217
+ */
218
+ var collectLinkRequest = function collectLinkRequest(requests, node, pos, options) {
219
+ if (!node.isText) {
220
+ return true;
221
+ }
222
+ var linkMark = node.marks.find(function (mark) {
223
+ return mark.type === options.linkMarkType;
224
+ });
225
+ if (linkMark) {
226
+ if (!(0, _shouldReplaceLink.shouldReplaceLink)(node, options.normalizeLinkText)) {
227
+ return false;
228
+ }
229
+ requests.push({
230
+ url: linkMark.attrs.href,
231
+ pos: pos,
232
+ appearance: options.appearance,
233
+ compareLinkText: options.normalizeLinkText,
234
+ source: options.source,
235
+ analyticsAction: options.analyticsAction,
236
+ sourceEvent: options.sourceEvent
237
+ });
238
+ }
239
+ return false;
240
+ };
202
241
  var queueCardsFromChangedTr = exports.queueCardsFromChangedTr = function queueCardsFromChangedTr(state, tr, source, analyticsAction) {
203
242
  var normalizeLinkText = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
204
243
  var sourceEvent = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined;
@@ -206,28 +245,16 @@ var queueCardsFromChangedTr = exports.queueCardsFromChangedTr = function queueCa
206
245
  var schema = state.schema;
207
246
  var link = schema.marks.link;
208
247
  var requests = [];
248
+ var options = {
249
+ analyticsAction: analyticsAction,
250
+ appearance: appearance,
251
+ linkMarkType: link,
252
+ normalizeLinkText: normalizeLinkText,
253
+ source: source,
254
+ sourceEvent: sourceEvent
255
+ };
209
256
  (0, _utils.nodesBetweenChanged)(tr, function (node, pos) {
210
- if (!node.isText) {
211
- return true;
212
- }
213
- var linkMark = node.marks.find(function (mark) {
214
- return mark.type === link;
215
- });
216
- if (linkMark) {
217
- if (!(0, _shouldReplaceLink.shouldReplaceLink)(node, normalizeLinkText)) {
218
- return false;
219
- }
220
- requests.push({
221
- url: linkMark.attrs.href,
222
- pos: pos,
223
- appearance: appearance,
224
- compareLinkText: normalizeLinkText,
225
- source: source,
226
- analyticsAction: analyticsAction,
227
- sourceEvent: sourceEvent
228
- });
229
- }
230
- return false;
257
+ return collectLinkRequest(requests, node, pos, options);
231
258
  });
232
259
  if (analyticsAction) {
233
260
  (0, _card.addLinkMetadata)(state.selection, tr, {
@@ -236,6 +263,44 @@ var queueCardsFromChangedTr = exports.queueCardsFromChangedTr = function queueCa
236
263
  }
237
264
  return (0, _actions.queueCards)(requests)(tr);
238
265
  };
266
+
267
+ /**
268
+ * Queue link-mark → smart-link resolution for text nodes within an explicit
269
+ * document range, rather than the entire step range of the transaction.
270
+ *
271
+ * Use this instead of `queueCardsFromChangedTr` when you know the exact range
272
+ * that was inserted/modified and want to avoid accidentally queuing pre-existing
273
+ * links that happen to fall within the broader step range.
274
+ */
275
+ var queueCardsFromRange = exports.queueCardsFromRange = function queueCardsFromRange(state, tr, from, to, source, analyticsAction) {
276
+ var normalizeLinkText = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
277
+ var sourceEvent = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : undefined;
278
+ var appearance = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 'inline';
279
+ var schema = state.schema;
280
+ var link = schema.marks.link;
281
+ var requests = [];
282
+ var options = {
283
+ analyticsAction: analyticsAction,
284
+ appearance: appearance,
285
+ linkMarkType: link,
286
+ normalizeLinkText: normalizeLinkText,
287
+ source: source,
288
+ sourceEvent: sourceEvent
289
+ };
290
+ var clampedFrom = Math.max(0, from);
291
+ var clampedTo = Math.min(tr.doc.content.size, to);
292
+ if (clampedFrom < clampedTo) {
293
+ tr.doc.nodesBetween(clampedFrom, clampedTo, function (node, pos) {
294
+ return collectLinkRequest(requests, node, pos, options);
295
+ });
296
+ }
297
+ if (analyticsAction) {
298
+ (0, _card.addLinkMetadata)(state.selection, tr, {
299
+ action: analyticsAction
300
+ });
301
+ }
302
+ return (0, _actions.queueCards)(requests)(tr);
303
+ };
239
304
  var queueCardFromChangedTr = exports.queueCardFromChangedTr = function queueCardFromChangedTr(state, tr, source, analyticsAction) {
240
305
  var normalizeLinkText = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
241
306
  var sourceEvent = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined;
@@ -8,7 +8,7 @@ import { blockCardSpecWithFixedToDOM } from './nodeviews/toDOM-fixes/blockCard';
8
8
  import { embedCardSpecWithFixedToDOM } from './nodeviews/toDOM-fixes/embedCard';
9
9
  import { inlineCardSpecWithFixedToDOM } from './nodeviews/toDOM-fixes/inlineCard';
10
10
  import { hideLinkToolbar, setProvider, showDatasourceModal } from './pm-plugins/actions';
11
- import { queueCardsFromChangedTr } from './pm-plugins/doc';
11
+ import { queueCardsFromChangedTr, queueCardsFromRange } from './pm-plugins/doc';
12
12
  import { cardKeymap } from './pm-plugins/keymap';
13
13
  import { createPlugin } from './pm-plugins/main';
14
14
  import { pluginKey } from './pm-plugins/plugin-key';
@@ -133,6 +133,16 @@ export const cardPlugin = ({
133
133
  editorView: editorView
134
134
  }));
135
135
  },
136
+ commands: {
137
+ queueCardsFromRange: (from, to, source, analyticsAction, normalizeLinkText, sourceEvent, appearance) => ({
138
+ tr
139
+ }) => queueCardsFromRange(
140
+ // Synthesise the minimal EditorState shape the impl actually reads.
141
+ {
142
+ schema: tr.doc.type.schema,
143
+ selection: tr.selection
144
+ }, tr, from, to, source, analyticsAction, normalizeLinkText, sourceEvent, appearance)
145
+ },
136
146
  actions: {
137
147
  setProvider: async providerPromise => {
138
148
  var _api$core$actions$exe;
@@ -148,6 +158,7 @@ export const cardPlugin = ({
148
158
  },
149
159
  hideLinkToolbar,
150
160
  queueCardsFromChangedTr,
161
+ queueCardsFromRange,
151
162
  registerEmbedCardTransformer: transformers => {
152
163
  instanceEmbedCardTransformers = transformers;
153
164
  },
@@ -176,6 +176,43 @@ export const handleFallbackWithAnalytics = (request, editorAnalyticsApi) => (sta
176
176
  }
177
177
  return true;
178
178
  };
179
+
180
+ /**
181
+ * Shared options used by both `queueCardsFromChangedTr` and
182
+ * `queueCardsFromRange` to build smart-link resolution requests for text
183
+ * nodes carrying a `link` mark.
184
+ */
185
+
186
+ /**
187
+ * Per-node walker shared by `queueCardsFromChangedTr` and
188
+ * `queueCardsFromRange`. Pushes a smart-link resolution request for every
189
+ * text node carrying a qualifying `link` mark.
190
+ *
191
+ * Returning `true`/`false` follows the ProseMirror `nodesBetween`/
192
+ * `nodesBetweenChanged` walker contract: `true` to descend into children,
193
+ * `false` to skip subtree.
194
+ */
195
+ const collectLinkRequest = (requests, node, pos, options) => {
196
+ if (!node.isText) {
197
+ return true;
198
+ }
199
+ const linkMark = node.marks.find(mark => mark.type === options.linkMarkType);
200
+ if (linkMark) {
201
+ if (!shouldReplaceLink(node, options.normalizeLinkText)) {
202
+ return false;
203
+ }
204
+ requests.push({
205
+ url: linkMark.attrs.href,
206
+ pos,
207
+ appearance: options.appearance,
208
+ compareLinkText: options.normalizeLinkText,
209
+ source: options.source,
210
+ analyticsAction: options.analyticsAction,
211
+ sourceEvent: options.sourceEvent
212
+ });
213
+ }
214
+ return false;
215
+ };
179
216
  export const queueCardsFromChangedTr = (state, tr, source, analyticsAction, normalizeLinkText = true, sourceEvent = undefined, appearance = 'inline') => {
180
217
  const {
181
218
  schema
@@ -184,27 +221,52 @@ export const queueCardsFromChangedTr = (state, tr, source, analyticsAction, norm
184
221
  link
185
222
  } = schema.marks;
186
223
  const requests = [];
187
- nodesBetweenChanged(tr, (node, pos) => {
188
- if (!node.isText) {
189
- return true;
190
- }
191
- const linkMark = node.marks.find(mark => mark.type === link);
192
- if (linkMark) {
193
- if (!shouldReplaceLink(node, normalizeLinkText)) {
194
- return false;
195
- }
196
- requests.push({
197
- url: linkMark.attrs.href,
198
- pos,
199
- appearance,
200
- compareLinkText: normalizeLinkText,
201
- source,
202
- analyticsAction,
203
- sourceEvent
204
- });
205
- }
206
- return false;
207
- });
224
+ const options = {
225
+ analyticsAction,
226
+ appearance,
227
+ linkMarkType: link,
228
+ normalizeLinkText,
229
+ source,
230
+ sourceEvent
231
+ };
232
+ nodesBetweenChanged(tr, (node, pos) => collectLinkRequest(requests, node, pos, options));
233
+ if (analyticsAction) {
234
+ addLinkMetadata(state.selection, tr, {
235
+ action: analyticsAction
236
+ });
237
+ }
238
+ return queueCards(requests)(tr);
239
+ };
240
+
241
+ /**
242
+ * Queue link-mark → smart-link resolution for text nodes within an explicit
243
+ * document range, rather than the entire step range of the transaction.
244
+ *
245
+ * Use this instead of `queueCardsFromChangedTr` when you know the exact range
246
+ * that was inserted/modified and want to avoid accidentally queuing pre-existing
247
+ * links that happen to fall within the broader step range.
248
+ */
249
+ export const queueCardsFromRange = (state, tr, from, to, source, analyticsAction, normalizeLinkText = true, sourceEvent = undefined, appearance = 'inline') => {
250
+ const {
251
+ schema
252
+ } = state;
253
+ const {
254
+ link
255
+ } = schema.marks;
256
+ const requests = [];
257
+ const options = {
258
+ analyticsAction,
259
+ appearance,
260
+ linkMarkType: link,
261
+ normalizeLinkText,
262
+ source,
263
+ sourceEvent
264
+ };
265
+ const clampedFrom = Math.max(0, from);
266
+ const clampedTo = Math.min(tr.doc.content.size, to);
267
+ if (clampedFrom < clampedTo) {
268
+ tr.doc.nodesBetween(clampedFrom, clampedTo, (node, pos) => collectLinkRequest(requests, node, pos, options));
269
+ }
208
270
  if (analyticsAction) {
209
271
  addLinkMetadata(state.selection, tr, {
210
272
  action: analyticsAction
@@ -14,7 +14,7 @@ import { blockCardSpecWithFixedToDOM } from './nodeviews/toDOM-fixes/blockCard';
14
14
  import { embedCardSpecWithFixedToDOM } from './nodeviews/toDOM-fixes/embedCard';
15
15
  import { inlineCardSpecWithFixedToDOM } from './nodeviews/toDOM-fixes/inlineCard';
16
16
  import { hideLinkToolbar, setProvider as _setProvider, showDatasourceModal } from './pm-plugins/actions';
17
- import { queueCardsFromChangedTr } from './pm-plugins/doc';
17
+ import { queueCardsFromChangedTr, queueCardsFromRange as _queueCardsFromRange } from './pm-plugins/doc';
18
18
  import { cardKeymap } from './pm-plugins/keymap';
19
19
  import { createPlugin } from './pm-plugins/main';
20
20
  import { pluginKey } from './pm-plugins/plugin-key';
@@ -129,6 +129,19 @@ export var cardPlugin = function cardPlugin(_ref) {
129
129
  editorView: editorView
130
130
  }));
131
131
  },
132
+ commands: {
133
+ queueCardsFromRange: function queueCardsFromRange(from, to, source, analyticsAction, normalizeLinkText, sourceEvent, appearance) {
134
+ return function (_ref5) {
135
+ var tr = _ref5.tr;
136
+ return _queueCardsFromRange(
137
+ // Synthesise the minimal EditorState shape the impl actually reads.
138
+ {
139
+ schema: tr.doc.type.schema,
140
+ selection: tr.selection
141
+ }, tr, from, to, source, analyticsAction, normalizeLinkText, sourceEvent, appearance);
142
+ };
143
+ }
144
+ },
132
145
  actions: {
133
146
  setProvider: function () {
134
147
  var _setProvider2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(providerPromise) {
@@ -148,8 +161,8 @@ export var cardPlugin = function cardPlugin(_ref) {
148
161
  return _context.abrupt("return", false);
149
162
  case 5:
150
163
  previousCardProvider = provider;
151
- return _context.abrupt("return", (_api$core$actions$exe = api === null || api === void 0 ? void 0 : api.core.actions.execute(function (_ref5) {
152
- var tr = _ref5.tr;
164
+ return _context.abrupt("return", (_api$core$actions$exe = api === null || api === void 0 ? void 0 : api.core.actions.execute(function (_ref6) {
165
+ var tr = _ref6.tr;
153
166
  return _setProvider(provider)(tr);
154
167
  })) !== null && _api$core$actions$exe !== void 0 ? _api$core$actions$exe : false);
155
168
  case 7:
@@ -165,6 +178,7 @@ export var cardPlugin = function cardPlugin(_ref) {
165
178
  }(),
166
179
  hideLinkToolbar: hideLinkToolbar,
167
180
  queueCardsFromChangedTr: queueCardsFromChangedTr,
181
+ queueCardsFromRange: _queueCardsFromRange,
168
182
  registerEmbedCardTransformer: function registerEmbedCardTransformer(transformers) {
169
183
  instanceEmbedCardTransformers = transformers;
170
184
  },
@@ -256,8 +270,8 @@ export var cardPlugin = function cardPlugin(_ref) {
256
270
  },
257
271
  pluginsOptions: {
258
272
  floatingToolbar: floatingToolbar(options, (_options$lpLinkPicker = options.lpLinkPicker) !== null && _options$lpLinkPicker !== void 0 ? _options$lpLinkPicker : false, options.linkPicker, api, options.disableFloatingToolbar),
259
- quickInsert: function quickInsert(_ref6) {
260
- var formatMessage = _ref6.formatMessage;
273
+ quickInsert: function quickInsert(_ref7) {
274
+ var formatMessage = _ref7.formatMessage;
261
275
  var quickInsertArray = [];
262
276
  if (!options.allowDatasource) {
263
277
  return quickInsertArray;
@@ -193,6 +193,45 @@ export var handleFallbackWithAnalytics = function handleFallbackWithAnalytics(re
193
193
  return true;
194
194
  };
195
195
  };
196
+
197
+ /**
198
+ * Shared options used by both `queueCardsFromChangedTr` and
199
+ * `queueCardsFromRange` to build smart-link resolution requests for text
200
+ * nodes carrying a `link` mark.
201
+ */
202
+
203
+ /**
204
+ * Per-node walker shared by `queueCardsFromChangedTr` and
205
+ * `queueCardsFromRange`. Pushes a smart-link resolution request for every
206
+ * text node carrying a qualifying `link` mark.
207
+ *
208
+ * Returning `true`/`false` follows the ProseMirror `nodesBetween`/
209
+ * `nodesBetweenChanged` walker contract: `true` to descend into children,
210
+ * `false` to skip subtree.
211
+ */
212
+ var collectLinkRequest = function collectLinkRequest(requests, node, pos, options) {
213
+ if (!node.isText) {
214
+ return true;
215
+ }
216
+ var linkMark = node.marks.find(function (mark) {
217
+ return mark.type === options.linkMarkType;
218
+ });
219
+ if (linkMark) {
220
+ if (!shouldReplaceLink(node, options.normalizeLinkText)) {
221
+ return false;
222
+ }
223
+ requests.push({
224
+ url: linkMark.attrs.href,
225
+ pos: pos,
226
+ appearance: options.appearance,
227
+ compareLinkText: options.normalizeLinkText,
228
+ source: options.source,
229
+ analyticsAction: options.analyticsAction,
230
+ sourceEvent: options.sourceEvent
231
+ });
232
+ }
233
+ return false;
234
+ };
196
235
  export var queueCardsFromChangedTr = function queueCardsFromChangedTr(state, tr, source, analyticsAction) {
197
236
  var normalizeLinkText = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
198
237
  var sourceEvent = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined;
@@ -200,28 +239,16 @@ export var queueCardsFromChangedTr = function queueCardsFromChangedTr(state, tr,
200
239
  var schema = state.schema;
201
240
  var link = schema.marks.link;
202
241
  var requests = [];
242
+ var options = {
243
+ analyticsAction: analyticsAction,
244
+ appearance: appearance,
245
+ linkMarkType: link,
246
+ normalizeLinkText: normalizeLinkText,
247
+ source: source,
248
+ sourceEvent: sourceEvent
249
+ };
203
250
  nodesBetweenChanged(tr, function (node, pos) {
204
- if (!node.isText) {
205
- return true;
206
- }
207
- var linkMark = node.marks.find(function (mark) {
208
- return mark.type === link;
209
- });
210
- if (linkMark) {
211
- if (!shouldReplaceLink(node, normalizeLinkText)) {
212
- return false;
213
- }
214
- requests.push({
215
- url: linkMark.attrs.href,
216
- pos: pos,
217
- appearance: appearance,
218
- compareLinkText: normalizeLinkText,
219
- source: source,
220
- analyticsAction: analyticsAction,
221
- sourceEvent: sourceEvent
222
- });
223
- }
224
- return false;
251
+ return collectLinkRequest(requests, node, pos, options);
225
252
  });
226
253
  if (analyticsAction) {
227
254
  addLinkMetadata(state.selection, tr, {
@@ -230,6 +257,44 @@ export var queueCardsFromChangedTr = function queueCardsFromChangedTr(state, tr,
230
257
  }
231
258
  return queueCards(requests)(tr);
232
259
  };
260
+
261
+ /**
262
+ * Queue link-mark → smart-link resolution for text nodes within an explicit
263
+ * document range, rather than the entire step range of the transaction.
264
+ *
265
+ * Use this instead of `queueCardsFromChangedTr` when you know the exact range
266
+ * that was inserted/modified and want to avoid accidentally queuing pre-existing
267
+ * links that happen to fall within the broader step range.
268
+ */
269
+ export var queueCardsFromRange = function queueCardsFromRange(state, tr, from, to, source, analyticsAction) {
270
+ var normalizeLinkText = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
271
+ var sourceEvent = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : undefined;
272
+ var appearance = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 'inline';
273
+ var schema = state.schema;
274
+ var link = schema.marks.link;
275
+ var requests = [];
276
+ var options = {
277
+ analyticsAction: analyticsAction,
278
+ appearance: appearance,
279
+ linkMarkType: link,
280
+ normalizeLinkText: normalizeLinkText,
281
+ source: source,
282
+ sourceEvent: sourceEvent
283
+ };
284
+ var clampedFrom = Math.max(0, from);
285
+ var clampedTo = Math.min(tr.doc.content.size, to);
286
+ if (clampedFrom < clampedTo) {
287
+ tr.doc.nodesBetween(clampedFrom, clampedTo, function (node, pos) {
288
+ return collectLinkRequest(requests, node, pos, options);
289
+ });
290
+ }
291
+ if (analyticsAction) {
292
+ addLinkMetadata(state.selection, tr, {
293
+ action: analyticsAction
294
+ });
295
+ }
296
+ return queueCards(requests)(tr);
297
+ };
233
298
  export var queueCardFromChangedTr = function queueCardFromChangedTr(state, tr, source, analyticsAction) {
234
299
  var normalizeLinkText = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
235
300
  var sourceEvent = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined;
@@ -1,6 +1,8 @@
1
- import type { INPUT_METHOD } from '@atlaskit/editor-common/analytics';
2
- import type { CardPluginActions } from '@atlaskit/editor-common/card';
3
- import type { NextEditorPlugin, OptionalPlugin, Command } from '@atlaskit/editor-common/types';
1
+ import type { UIAnalyticsEvent } from '@atlaskit/analytics-next';
2
+ import type { ACTION, INPUT_METHOD } from '@atlaskit/editor-common/analytics';
3
+ import type { CardPluginActions, CardReplacementInputMethod } from '@atlaskit/editor-common/card';
4
+ import type { CardAppearance } from '@atlaskit/editor-common/provider-factory';
5
+ import type { Command, EditorCommand, NextEditorPlugin, OptionalPlugin } from '@atlaskit/editor-common/types';
4
6
  import type { AnalyticsPlugin } from '@atlaskit/editor-plugin-analytics';
5
7
  import type { InlineCommentPluginState } from '@atlaskit/editor-plugin-annotation';
6
8
  import type { BasePlugin } from '@atlaskit/editor-plugin-base';
@@ -38,6 +40,10 @@ export type CardPluginDependencies = [
38
40
  ];
39
41
  export type CardPlugin = NextEditorPlugin<'card', {
40
42
  actions: CardPluginActions;
43
+ commands: {
44
+ /** EditorCommand form of `queueCardsFromRange`. Prefer over the action. */
45
+ queueCardsFromRange: (from: number, to: number, source: CardReplacementInputMethod, analyticsAction?: ACTION, normalizeLinkText?: boolean, sourceEvent?: UIAnalyticsEvent | null, appearance?: CardAppearance) => EditorCommand;
46
+ };
41
47
  dependencies: CardPluginDependencies;
42
48
  pluginConfiguration: CardPluginOptions | undefined;
43
49
  sharedState: CardPluginState | null;
@@ -12,6 +12,15 @@ import type { Request } from '../types';
12
12
  export declare const replaceQueuedUrlWithCard: (url: string, cardData: CardAdf | DatasourceAdf, analyticsAction?: ACTION, editorAnalyticsApi?: EditorAnalyticsAPI, createAnalyticsEvent?: CreateUIAnalyticsEvent, embedCardNodeTransformer?: EmbedCardNodeTransformer) => Command;
13
13
  export declare const handleFallbackWithAnalytics: (request: Request, editorAnalyticsApi: EditorAnalyticsAPI | undefined) => Command;
14
14
  export declare const queueCardsFromChangedTr: (state: EditorState, tr: Transaction, source: CardReplacementInputMethod, analyticsAction?: ACTION, normalizeLinkText?: boolean, sourceEvent?: UIAnalyticsEvent | null | undefined, appearance?: CardAppearance) => Transaction;
15
+ /**
16
+ * Queue link-mark → smart-link resolution for text nodes within an explicit
17
+ * document range, rather than the entire step range of the transaction.
18
+ *
19
+ * Use this instead of `queueCardsFromChangedTr` when you know the exact range
20
+ * that was inserted/modified and want to avoid accidentally queuing pre-existing
21
+ * links that happen to fall within the broader step range.
22
+ */
23
+ export declare const queueCardsFromRange: (state: EditorState, tr: Transaction, from: number, to: number, source: CardReplacementInputMethod, analyticsAction?: ACTION, normalizeLinkText?: boolean, sourceEvent?: UIAnalyticsEvent | null | undefined, appearance?: CardAppearance) => Transaction;
15
24
  export declare const queueCardFromChangedTr: (state: EditorState, tr: Transaction, source: CardReplacementInputMethod, analyticsAction: ACTION, normalizeLinkText?: boolean, sourceEvent?: UIAnalyticsEvent | null | undefined, previousAppearance?: CardAppearance | "url") => Transaction;
16
25
  export declare const convertHyperlinkToSmartCard: (state: EditorState, source: CardReplacementInputMethod, appearance: CardAppearance, normalizeLinkText?: boolean) => Transaction;
17
26
  export declare const changeSelectedCardToLink: (text?: string, href?: string, sendAnalytics?: boolean, node?: Node, pos?: number, editorAnalyticsApi?: EditorAnalyticsAPI) => Command;
@@ -1,6 +1,8 @@
1
- import type { INPUT_METHOD } from '@atlaskit/editor-common/analytics';
2
- import type { CardPluginActions } from '@atlaskit/editor-common/card';
3
- import type { NextEditorPlugin, OptionalPlugin, Command } from '@atlaskit/editor-common/types';
1
+ import type { UIAnalyticsEvent } from '@atlaskit/analytics-next';
2
+ import type { ACTION, INPUT_METHOD } from '@atlaskit/editor-common/analytics';
3
+ import type { CardPluginActions, CardReplacementInputMethod } from '@atlaskit/editor-common/card';
4
+ import type { CardAppearance } from '@atlaskit/editor-common/provider-factory';
5
+ import type { Command, EditorCommand, NextEditorPlugin, OptionalPlugin } from '@atlaskit/editor-common/types';
4
6
  import type { AnalyticsPlugin } from '@atlaskit/editor-plugin-analytics';
5
7
  import type { InlineCommentPluginState } from '@atlaskit/editor-plugin-annotation';
6
8
  import type { BasePlugin } from '@atlaskit/editor-plugin-base';
@@ -38,6 +40,10 @@ export type CardPluginDependencies = [
38
40
  ];
39
41
  export type CardPlugin = NextEditorPlugin<'card', {
40
42
  actions: CardPluginActions;
43
+ commands: {
44
+ /** EditorCommand form of `queueCardsFromRange`. Prefer over the action. */
45
+ queueCardsFromRange: (from: number, to: number, source: CardReplacementInputMethod, analyticsAction?: ACTION, normalizeLinkText?: boolean, sourceEvent?: UIAnalyticsEvent | null, appearance?: CardAppearance) => EditorCommand;
46
+ };
41
47
  dependencies: CardPluginDependencies;
42
48
  pluginConfiguration: CardPluginOptions | undefined;
43
49
  sharedState: CardPluginState | null;
@@ -12,6 +12,15 @@ import type { Request } from '../types';
12
12
  export declare const replaceQueuedUrlWithCard: (url: string, cardData: CardAdf | DatasourceAdf, analyticsAction?: ACTION, editorAnalyticsApi?: EditorAnalyticsAPI, createAnalyticsEvent?: CreateUIAnalyticsEvent, embedCardNodeTransformer?: EmbedCardNodeTransformer) => Command;
13
13
  export declare const handleFallbackWithAnalytics: (request: Request, editorAnalyticsApi: EditorAnalyticsAPI | undefined) => Command;
14
14
  export declare const queueCardsFromChangedTr: (state: EditorState, tr: Transaction, source: CardReplacementInputMethod, analyticsAction?: ACTION, normalizeLinkText?: boolean, sourceEvent?: UIAnalyticsEvent | null | undefined, appearance?: CardAppearance) => Transaction;
15
+ /**
16
+ * Queue link-mark → smart-link resolution for text nodes within an explicit
17
+ * document range, rather than the entire step range of the transaction.
18
+ *
19
+ * Use this instead of `queueCardsFromChangedTr` when you know the exact range
20
+ * that was inserted/modified and want to avoid accidentally queuing pre-existing
21
+ * links that happen to fall within the broader step range.
22
+ */
23
+ export declare const queueCardsFromRange: (state: EditorState, tr: Transaction, from: number, to: number, source: CardReplacementInputMethod, analyticsAction?: ACTION, normalizeLinkText?: boolean, sourceEvent?: UIAnalyticsEvent | null | undefined, appearance?: CardAppearance) => Transaction;
15
24
  export declare const queueCardFromChangedTr: (state: EditorState, tr: Transaction, source: CardReplacementInputMethod, analyticsAction: ACTION, normalizeLinkText?: boolean, sourceEvent?: UIAnalyticsEvent | null | undefined, previousAppearance?: CardAppearance | "url") => Transaction;
16
25
  export declare const convertHyperlinkToSmartCard: (state: EditorState, source: CardReplacementInputMethod, appearance: CardAppearance, normalizeLinkText?: boolean) => Transaction;
17
26
  export declare const changeSelectedCardToLink: (text?: string, href?: string, sendAnalytics?: boolean, node?: Node, pos?: number, editorAnalyticsApi?: EditorAnalyticsAPI) => Command;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-card",
3
- "version": "16.5.3",
3
+ "version": "16.6.0",
4
4
  "description": "Card plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -29,7 +29,7 @@
29
29
  ],
30
30
  "atlaskit:src": "src/index.ts",
31
31
  "dependencies": {
32
- "@atlaskit/adf-schema": "^52.9.0",
32
+ "@atlaskit/adf-schema": "^52.11.0",
33
33
  "@atlaskit/analytics-next": "^11.2.0",
34
34
  "@atlaskit/custom-steps": "^0.16.0",
35
35
  "@atlaskit/editor-card-provider": "^6.7.0",
@@ -42,13 +42,13 @@
42
42
  "@atlaskit/editor-plugin-feature-flags": "^9.0.0",
43
43
  "@atlaskit/editor-plugin-floating-toolbar": "^12.0.0",
44
44
  "@atlaskit/editor-plugin-grid": "^10.1.0",
45
- "@atlaskit/editor-plugin-toolbar": "^7.0.0",
45
+ "@atlaskit/editor-plugin-toolbar": "^7.1.0",
46
46
  "@atlaskit/editor-plugin-width": "^11.0.0",
47
47
  "@atlaskit/editor-prosemirror": "^7.3.0",
48
48
  "@atlaskit/editor-shared-styles": "^3.10.0",
49
49
  "@atlaskit/editor-smart-link-draggable": "^0.5.0",
50
50
  "@atlaskit/frontend-utilities": "^3.2.0",
51
- "@atlaskit/icon": "^34.4.0",
51
+ "@atlaskit/icon": "^34.5.0",
52
52
  "@atlaskit/link": "^3.4.0",
53
53
  "@atlaskit/link-analytics": "^11.0.0",
54
54
  "@atlaskit/link-client-extension": "^6.0.0",
@@ -61,8 +61,8 @@
61
61
  "@atlaskit/platform-feature-flags-react": "^0.4.0",
62
62
  "@atlaskit/primitives": "^19.0.0",
63
63
  "@atlaskit/prosemirror-history": "^0.2.0",
64
- "@atlaskit/smart-card": "^44.7.0",
65
- "@atlaskit/tmp-editor-statsig": "^77.0.0",
64
+ "@atlaskit/smart-card": "^44.9.0",
65
+ "@atlaskit/tmp-editor-statsig": "^79.0.0",
66
66
  "@atlaskit/tokens": "^13.0.0",
67
67
  "@babel/runtime": "^7.0.0",
68
68
  "@emotion/react": "^11.7.1",
@@ -72,8 +72,8 @@
72
72
  "uuid": "^3.1.0"
73
73
  },
74
74
  "peerDependencies": {
75
- "@atlaskit/editor-common": "^114.20.0",
76
- "@atlaskit/link-provider": "^4.3.0",
75
+ "@atlaskit/editor-common": "^114.29.0",
76
+ "@atlaskit/link-provider": "^4.4.0",
77
77
  "react": "^18.2.0",
78
78
  "react-intl": "^5.25.1 || ^6.0.0 || ^7.0.0"
79
79
  },