@atlaskit/renderer 142.0.1 → 142.1.1

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,27 @@
1
1
  # @atlaskit/renderer
2
2
 
3
+ ## 142.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+
9
+ ## 142.1.0
10
+
11
+ ### Minor Changes
12
+
13
+ - [`1c57152f89627`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/1c57152f89627) -
14
+ Add `RendererActions.getMediaNodeContext`, which resolves a media file id and optional occurrence
15
+ key to the matching file media node in the rendered document, returning its inline-comment
16
+ annotation ids, document position, display text and occurrence key. Also threads the existing
17
+ `mediaViewerExtensions` media option through the media node to the media card, and — behind the
18
+ `cc_comments_media_viewer_sidebar` experiment — keeps the media identifier map in document order
19
+ so the Media Viewer's previous/next list stays stable when a media card remounts.
20
+
21
+ ### Patch Changes
22
+
23
+ - Updated dependencies
24
+
3
25
  ## 142.0.1
4
26
 
5
27
  ### Patch Changes
@@ -286,6 +286,53 @@ var RendererActions = exports.default = /*#__PURE__*/function () {
286
286
  });
287
287
  return Array.from(uniqueMarks.values());
288
288
  }
289
+ }, {
290
+ key: "getMediaNodeContext",
291
+ value: function getMediaNodeContext(identifier) {
292
+ if (!this.doc) {
293
+ return {
294
+ status: 'missing'
295
+ };
296
+ }
297
+ var candidates = [];
298
+ this.doc.descendants(function (node, position) {
299
+ if (node.type.name !== 'media' || node.attrs.type !== 'file' || node.attrs.id !== identifier.id) {
300
+ return true;
301
+ }
302
+ candidates.push({
303
+ fileId: identifier.id,
304
+ annotationIds: node.marks.filter(function (mark) {
305
+ return mark.type.name === 'annotation' && mark.attrs.annotationType === _annotation.AnnotationTypes.INLINE_COMMENT;
306
+ }).map(function (mark) {
307
+ return mark.attrs.id;
308
+ }).filter(function (id) {
309
+ return typeof id === 'string';
310
+ }),
311
+ position: position,
312
+ displayText: node.attrs.alt || node.attrs.__fileName || node.attrs.fileName || node.attrs.name,
313
+ occurrenceKey: typeof node.attrs.occurrenceKey === 'string' ? node.attrs.occurrenceKey : undefined
314
+ });
315
+ return false;
316
+ });
317
+ var exactMatches = identifier.occurrenceKey ? candidates.filter(function (candidate) {
318
+ return candidate.occurrenceKey === identifier.occurrenceKey;
319
+ }) : [];
320
+ var matches = exactMatches.length > 0 ? exactMatches : candidates;
321
+ if (matches.length === 0) {
322
+ return {
323
+ status: 'missing'
324
+ };
325
+ }
326
+ if (matches.length > 1) {
327
+ return {
328
+ status: 'ambiguous'
329
+ };
330
+ }
331
+ return {
332
+ status: 'resolved',
333
+ context: matches[0]
334
+ };
335
+ }
289
336
  }, {
290
337
  key: "getAnnotationsByPosition",
291
338
  value: function getAnnotationsByPosition(range) {
@@ -298,7 +298,8 @@ var Media = /*#__PURE__*/function (_PureComponent) {
298
298
  height = _this$props3.height,
299
299
  mediaSingleElement = _this$props3.mediaSingleElement,
300
300
  _this$props3$isDrafti = _this$props3.isDrafting,
301
- isDrafting = _this$props3$isDrafti === void 0 ? false : _this$props3$isDrafti;
301
+ isDrafting = _this$props3$isDrafti === void 0 ? false : _this$props3$isDrafti,
302
+ mediaViewerExtensions = _this$props3.mediaViewerExtensions;
302
303
  var annotationMarks = _this.props.isAnnotationMark ? _this.props.marks.filter(_this.props.isAnnotationMark) : undefined;
303
304
  var borderMark = _this.props.marks.find(_this.props.isBorderMark);
304
305
  var dataConsumerMark = _this.getDataConsumerMark();
@@ -352,7 +353,8 @@ var Media = /*#__PURE__*/function (_PureComponent) {
352
353
  shouldEnableDownloadButton: enableDownloadButton,
353
354
  ssr: ssr,
354
355
  onError: _this.props.onMediaRenderEvent || _this.props.onError ? _this.onError : undefined,
355
- onPreviewRender: _this.props.onMediaRenderEvent || _this.props.onPreviewRender ? _this.onPreviewRender : undefined
356
+ onPreviewRender: _this.props.onMediaRenderEvent || _this.props.onPreviewRender ? _this.onPreviewRender : undefined,
357
+ mediaViewerExtensions: mediaViewerExtensions
356
358
  }))))));
357
359
  });
358
360
  (0, _defineProperty2.default)(_this, "handleMediaLinkClick", function (event) {
@@ -15,6 +15,8 @@ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime
15
15
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
16
16
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
17
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
18
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
19
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
18
20
  var _react = _interopRequireWildcard(require("react"));
19
21
  var _traverse = require("@atlaskit/adf-utils/traverse");
20
22
  var _analytics = require("@atlaskit/editor-common/analytics");
@@ -24,6 +26,7 @@ var _cardLoader = _interopRequireDefault(require("@atlaskit/media-card/cardLoade
24
26
  var _cardLoading = require("@atlaskit/media-card/cardLoading");
25
27
  var _cardSync = _interopRequireDefault(require("@atlaskit/media-card/cardSync"));
26
28
  var _mediaClientProvider = require("@atlaskit/media-client-react/media-client-provider");
29
+ var _isExperimentEnabled = require("@atlaskit/platform-feature-experiments/is-experiment-enabled");
27
30
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
28
31
  var _analyticsContext = _interopRequireDefault(require("../analytics/analyticsContext"));
29
32
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t4 in e) "default" !== _t4 && {}.hasOwnProperty.call(e, _t4) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t4)) && (i.get || i.set) ? o(f, _t4, i) : f[_t4] = e[_t4]); return f; })(e, t); }
@@ -61,6 +64,38 @@ var getListOfIdentifiersFromDoc = exports.getListOfIdentifiersFromDoc = function
61
64
  }, []);
62
65
  };
63
66
 
67
+ /**
68
+ * `mediaIdentifierMap` is the Media Viewer's nav list, but a `Map` can only append —
69
+ * a card that unmounts and re-registers lands last, scrambling nav order. Rebuild it
70
+ * in document order; entries from other renderers on the page keep their old order.
71
+ */
72
+ var restoreDocumentOrder = function restoreDocumentOrder(docIdentifiers) {
73
+ var documentKeys = new Set(docIdentifiers.map(function (identifier) {
74
+ return identifier.mediaItemType === 'file' ? identifier.id : identifier.dataURI;
75
+ }).filter(function (key) {
76
+ return mediaIdentifierMap.has(key);
77
+ }));
78
+ var currentKeys = Array.from(mediaIdentifierMap.keys());
79
+ var orderedKeys = [].concat((0, _toConsumableArray2.default)(documentKeys), (0, _toConsumableArray2.default)(currentKeys.filter(function (key) {
80
+ return !documentKeys.has(key);
81
+ })));
82
+ if (orderedKeys.every(function (key, index) {
83
+ return key === currentKeys[index];
84
+ })) {
85
+ return;
86
+ }
87
+ var orderedEntries = orderedKeys.map(function (key) {
88
+ return [key, mediaIdentifierMap.get(key)];
89
+ });
90
+ mediaIdentifierMap.clear();
91
+ orderedEntries.forEach(function (_ref) {
92
+ var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
93
+ key = _ref2[0],
94
+ identifier = _ref2[1];
95
+ mediaIdentifierMap.set(key, identifier);
96
+ });
97
+ };
98
+
64
99
  // Ignored via go/ees005
65
100
  // eslint-disable-next-line @repo/internal/react/no-class-components
66
101
  var MediaCardView = exports.MediaCardView = /*#__PURE__*/function (_Component) {
@@ -73,7 +108,7 @@ var MediaCardView = exports.MediaCardView = /*#__PURE__*/function (_Component) {
73
108
  _this = _callSuper(this, MediaCardView, [].concat(args));
74
109
  (0, _defineProperty2.default)(_this, "state", {});
75
110
  (0, _defineProperty2.default)(_this, "saveFileState", /*#__PURE__*/function () {
76
- var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(id) {
111
+ var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(id) {
77
112
  var _this$props, collectionName, mediaClient, options, fileState, _t;
78
113
  return _regenerator.default.wrap(function (_context) {
79
114
  while (1) switch (_context.prev = _context.next) {
@@ -107,7 +142,7 @@ var MediaCardView = exports.MediaCardView = /*#__PURE__*/function (_Component) {
107
142
  }, _callee, null, [[1, 4]]);
108
143
  }));
109
144
  return function (_x) {
110
- return _ref.apply(this, arguments);
145
+ return _ref3.apply(this, arguments);
111
146
  };
112
147
  }());
113
148
  (0, _defineProperty2.default)(_this, "onError", function (reason) {
@@ -174,7 +209,7 @@ var MediaCardView = exports.MediaCardView = /*#__PURE__*/function (_Component) {
174
209
  key: "componentDidMount",
175
210
  value: function () {
176
211
  var _componentDidMount = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
177
- var _this$props6, rendererContext, contextIdentifierProvider, id, url, collectionName, nodeIsInCache, _t2, _t3;
212
+ var _this$props6, rendererContext, contextIdentifierProvider, id, url, collectionName, nodeIsInCache, docIdentifiers, _t2, _t3;
178
213
  return _regenerator.default.wrap(function (_context2) {
179
214
  while (1) switch (_context2.prev = _context2.next) {
180
215
  case 0:
@@ -194,7 +229,8 @@ var MediaCardView = exports.MediaCardView = /*#__PURE__*/function (_Component) {
194
229
  case 2:
195
230
  nodeIsInCache = id && mediaIdentifierMap.has(id) || url && mediaIdentifierMap.has(url);
196
231
  if (rendererContext && rendererContext.adDoc && !nodeIsInCache) {
197
- getListOfIdentifiersFromDoc(rendererContext.adDoc).forEach(function (identifier) {
232
+ docIdentifiers = getListOfIdentifiersFromDoc(rendererContext.adDoc);
233
+ docIdentifiers.forEach(function (identifier) {
198
234
  if (identifier.mediaItemType === 'file' && identifier.id === id) {
199
235
  mediaIdentifierMap.set(identifier.id, _objectSpread(_objectSpread({}, identifier), {}, {
200
236
  collectionName: collectionName
@@ -203,6 +239,11 @@ var MediaCardView = exports.MediaCardView = /*#__PURE__*/function (_Component) {
203
239
  mediaIdentifierMap.set(identifier.dataURI, identifier);
204
240
  }
205
241
  });
242
+ // Reordering affects prev/next nav in every overlay viewer on the page, so gate it
243
+ // to the media-comments sidebar experiment that needs it; otherwise keep legacy order.
244
+ if ((0, _isExperimentEnabled.isExperimentEnabled)('cc_comments_media_viewer_sidebar')) {
245
+ restoreDocumentOrder(docIdentifiers);
246
+ }
206
247
  }
207
248
  if (id) {
208
249
  this.saveFileState(id);
@@ -400,13 +441,13 @@ var MediaCardView = exports.MediaCardView = /*#__PURE__*/function (_Component) {
400
441
  }]);
401
442
  }(_react.Component);
402
443
  // Needed for copy & paste
403
- var getClipboardAttrs = exports.getClipboardAttrs = function getClipboardAttrs(_ref2) {
404
- var id = _ref2.id,
405
- alt = _ref2.alt,
406
- collection = _ref2.collection,
407
- contextIdentifierProvider = _ref2.contextIdentifierProvider,
408
- originalDimensions = _ref2.originalDimensions,
409
- fileState = _ref2.fileState;
444
+ var getClipboardAttrs = exports.getClipboardAttrs = function getClipboardAttrs(_ref4) {
445
+ var id = _ref4.id,
446
+ alt = _ref4.alt,
447
+ collection = _ref4.collection,
448
+ contextIdentifierProvider = _ref4.contextIdentifierProvider,
449
+ originalDimensions = _ref4.originalDimensions,
450
+ fileState = _ref4.fileState;
410
451
  var contextId = contextIdentifierProvider && contextIdentifierProvider.objectId;
411
452
  var width = originalDimensions && originalDimensions.width;
412
453
  var height = originalDimensions && originalDimensions.height;
@@ -434,8 +475,8 @@ var getClipboardAttrs = exports.getClipboardAttrs = function getClipboardAttrs(_
434
475
  };
435
476
  var MediaCardInternal = exports.MediaCardInternal = function MediaCardInternal(props) {
436
477
  var mediaClient = (0, _react.useContext)(_mediaClientProvider.MediaClientContext);
437
- return /*#__PURE__*/_react.default.createElement(_analyticsContext.default.Consumer, null, function (_ref3) {
438
- var fireAnalyticsEvent = _ref3.fireAnalyticsEvent;
478
+ return /*#__PURE__*/_react.default.createElement(_analyticsContext.default.Consumer, null, function (_ref5) {
479
+ var fireAnalyticsEvent = _ref5.fireAnalyticsEvent;
439
480
  return /*#__PURE__*/_react.default.createElement(MediaCardView
440
481
  // Ignored via go/ees005
441
482
  // eslint-disable-next-line react/jsx-props-no-spreading
@@ -71,7 +71,7 @@ var DEGRADED_SEVERITY_THRESHOLD = exports.DEGRADED_SEVERITY_THRESHOLD = 3000;
71
71
  var TABLE_INFO_TIMEOUT = 10000;
72
72
  var RENDER_EVENT_SAMPLE_RATE = 0.1;
73
73
  var packageName = "@atlaskit/renderer";
74
- var packageVersion = "142.0.0";
74
+ var packageVersion = "142.1.0";
75
75
  var setAsQueryContainerStyles = (0, _react2.css)({
76
76
  containerName: 'ak-renderer-wrapper',
77
77
  containerType: 'inline-size'
@@ -262,6 +262,43 @@ export default class RendererActions {
262
262
  });
263
263
  return Array.from(uniqueMarks.values());
264
264
  }
265
+ getMediaNodeContext(identifier) {
266
+ if (!this.doc) {
267
+ return {
268
+ status: 'missing'
269
+ };
270
+ }
271
+ const candidates = [];
272
+ this.doc.descendants((node, position) => {
273
+ if (node.type.name !== 'media' || node.attrs.type !== 'file' || node.attrs.id !== identifier.id) {
274
+ return true;
275
+ }
276
+ candidates.push({
277
+ fileId: identifier.id,
278
+ annotationIds: node.marks.filter(mark => mark.type.name === 'annotation' && mark.attrs.annotationType === AnnotationTypes.INLINE_COMMENT).map(mark => mark.attrs.id).filter(id => typeof id === 'string'),
279
+ position,
280
+ displayText: node.attrs.alt || node.attrs.__fileName || node.attrs.fileName || node.attrs.name,
281
+ occurrenceKey: typeof node.attrs.occurrenceKey === 'string' ? node.attrs.occurrenceKey : undefined
282
+ });
283
+ return false;
284
+ });
285
+ const exactMatches = identifier.occurrenceKey ? candidates.filter(candidate => candidate.occurrenceKey === identifier.occurrenceKey) : [];
286
+ const matches = exactMatches.length > 0 ? exactMatches : candidates;
287
+ if (matches.length === 0) {
288
+ return {
289
+ status: 'missing'
290
+ };
291
+ }
292
+ if (matches.length > 1) {
293
+ return {
294
+ status: 'ambiguous'
295
+ };
296
+ }
297
+ return {
298
+ status: 'resolved',
299
+ context: matches[0]
300
+ };
301
+ }
265
302
  getAnnotationsByPosition(range) {
266
303
  if (!this.doc || !this.schema) {
267
304
  return [];
@@ -261,7 +261,8 @@ class Media extends PureComponent {
261
261
  width,
262
262
  height,
263
263
  mediaSingleElement,
264
- isDrafting = false
264
+ isDrafting = false,
265
+ mediaViewerExtensions
265
266
  } = this.props;
266
267
  const annotationMarks = this.props.isAnnotationMark ? this.props.marks.filter(this.props.isAnnotationMark) : undefined;
267
268
  const borderMark = this.props.marks.find(this.props.isBorderMark);
@@ -317,7 +318,8 @@ class Media extends PureComponent {
317
318
  shouldEnableDownloadButton: enableDownloadButton,
318
319
  ssr: ssr,
319
320
  onError: this.props.onMediaRenderEvent || this.props.onError ? this.onError : undefined,
320
- onPreviewRender: this.props.onMediaRenderEvent || this.props.onPreviewRender ? this.onPreviewRender : undefined
321
+ onPreviewRender: this.props.onMediaRenderEvent || this.props.onPreviewRender ? this.onPreviewRender : undefined,
322
+ mediaViewerExtensions: mediaViewerExtensions
321
323
  }))))));
322
324
  });
323
325
  _defineProperty(this, "handleMediaLinkClick", event => {
@@ -9,6 +9,7 @@ import CardAsync from '@atlaskit/media-card/cardLoader';
9
9
  import { CardLoading } from '@atlaskit/media-card/cardLoading';
10
10
  import CardSync from '@atlaskit/media-card/cardSync';
11
11
  import { MediaClientContext } from '@atlaskit/media-client-react/media-client-provider';
12
+ import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
12
13
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
13
14
  import AnalyticsContext from '../analytics/analyticsContext';
14
15
  export const mediaIdentifierMap = new Map();
@@ -40,6 +41,25 @@ export const getListOfIdentifiersFromDoc = doc => {
40
41
  }, []);
41
42
  };
42
43
 
44
+ /**
45
+ * `mediaIdentifierMap` is the Media Viewer's nav list, but a `Map` can only append —
46
+ * a card that unmounts and re-registers lands last, scrambling nav order. Rebuild it
47
+ * in document order; entries from other renderers on the page keep their old order.
48
+ */
49
+ const restoreDocumentOrder = docIdentifiers => {
50
+ const documentKeys = new Set(docIdentifiers.map(identifier => identifier.mediaItemType === 'file' ? identifier.id : identifier.dataURI).filter(key => mediaIdentifierMap.has(key)));
51
+ const currentKeys = Array.from(mediaIdentifierMap.keys());
52
+ const orderedKeys = [...documentKeys, ...currentKeys.filter(key => !documentKeys.has(key))];
53
+ if (orderedKeys.every((key, index) => key === currentKeys[index])) {
54
+ return;
55
+ }
56
+ const orderedEntries = orderedKeys.map(key => [key, mediaIdentifierMap.get(key)]);
57
+ mediaIdentifierMap.clear();
58
+ orderedEntries.forEach(([key, identifier]) => {
59
+ mediaIdentifierMap.set(key, identifier);
60
+ });
61
+ };
62
+
43
63
  // Ignored via go/ees005
44
64
  // eslint-disable-next-line @repo/internal/react/no-class-components
45
65
  export class MediaCardView extends Component {
@@ -145,7 +165,8 @@ export class MediaCardView extends Component {
145
165
  }
146
166
  const nodeIsInCache = id && mediaIdentifierMap.has(id) || url && mediaIdentifierMap.has(url);
147
167
  if (rendererContext && rendererContext.adDoc && !nodeIsInCache) {
148
- getListOfIdentifiersFromDoc(rendererContext.adDoc).forEach(identifier => {
168
+ const docIdentifiers = getListOfIdentifiersFromDoc(rendererContext.adDoc);
169
+ docIdentifiers.forEach(identifier => {
149
170
  if (identifier.mediaItemType === 'file' && identifier.id === id) {
150
171
  mediaIdentifierMap.set(identifier.id, {
151
172
  ...identifier,
@@ -155,6 +176,11 @@ export class MediaCardView extends Component {
155
176
  mediaIdentifierMap.set(identifier.dataURI, identifier);
156
177
  }
157
178
  });
179
+ // Reordering affects prev/next nav in every overlay viewer on the page, so gate it
180
+ // to the media-comments sidebar experiment that needs it; otherwise keep legacy order.
181
+ if (isExperimentEnabled('cc_comments_media_viewer_sidebar')) {
182
+ restoreDocumentOrder(docIdentifiers);
183
+ }
158
184
  }
159
185
  if (id) {
160
186
  this.saveFileState(id);
@@ -56,7 +56,7 @@ export const DEGRADED_SEVERITY_THRESHOLD = 3000;
56
56
  const TABLE_INFO_TIMEOUT = 10000;
57
57
  const RENDER_EVENT_SAMPLE_RATE = 0.1;
58
58
  const packageName = "@atlaskit/renderer";
59
- const packageVersion = "142.0.0";
59
+ const packageVersion = "142.1.0";
60
60
  const setAsQueryContainerStyles = css({
61
61
  containerName: 'ak-renderer-wrapper',
62
62
  containerType: 'inline-size'
@@ -279,6 +279,53 @@ var RendererActions = /*#__PURE__*/function () {
279
279
  });
280
280
  return Array.from(uniqueMarks.values());
281
281
  }
282
+ }, {
283
+ key: "getMediaNodeContext",
284
+ value: function getMediaNodeContext(identifier) {
285
+ if (!this.doc) {
286
+ return {
287
+ status: 'missing'
288
+ };
289
+ }
290
+ var candidates = [];
291
+ this.doc.descendants(function (node, position) {
292
+ if (node.type.name !== 'media' || node.attrs.type !== 'file' || node.attrs.id !== identifier.id) {
293
+ return true;
294
+ }
295
+ candidates.push({
296
+ fileId: identifier.id,
297
+ annotationIds: node.marks.filter(function (mark) {
298
+ return mark.type.name === 'annotation' && mark.attrs.annotationType === AnnotationTypes.INLINE_COMMENT;
299
+ }).map(function (mark) {
300
+ return mark.attrs.id;
301
+ }).filter(function (id) {
302
+ return typeof id === 'string';
303
+ }),
304
+ position: position,
305
+ displayText: node.attrs.alt || node.attrs.__fileName || node.attrs.fileName || node.attrs.name,
306
+ occurrenceKey: typeof node.attrs.occurrenceKey === 'string' ? node.attrs.occurrenceKey : undefined
307
+ });
308
+ return false;
309
+ });
310
+ var exactMatches = identifier.occurrenceKey ? candidates.filter(function (candidate) {
311
+ return candidate.occurrenceKey === identifier.occurrenceKey;
312
+ }) : [];
313
+ var matches = exactMatches.length > 0 ? exactMatches : candidates;
314
+ if (matches.length === 0) {
315
+ return {
316
+ status: 'missing'
317
+ };
318
+ }
319
+ if (matches.length > 1) {
320
+ return {
321
+ status: 'ambiguous'
322
+ };
323
+ }
324
+ return {
325
+ status: 'resolved',
326
+ context: matches[0]
327
+ };
328
+ }
282
329
  }, {
283
330
  key: "getAnnotationsByPosition",
284
331
  value: function getAnnotationsByPosition(range) {
@@ -291,7 +291,8 @@ var Media = /*#__PURE__*/function (_PureComponent) {
291
291
  height = _this$props3.height,
292
292
  mediaSingleElement = _this$props3.mediaSingleElement,
293
293
  _this$props3$isDrafti = _this$props3.isDrafting,
294
- isDrafting = _this$props3$isDrafti === void 0 ? false : _this$props3$isDrafti;
294
+ isDrafting = _this$props3$isDrafti === void 0 ? false : _this$props3$isDrafti,
295
+ mediaViewerExtensions = _this$props3.mediaViewerExtensions;
295
296
  var annotationMarks = _this.props.isAnnotationMark ? _this.props.marks.filter(_this.props.isAnnotationMark) : undefined;
296
297
  var borderMark = _this.props.marks.find(_this.props.isBorderMark);
297
298
  var dataConsumerMark = _this.getDataConsumerMark();
@@ -345,7 +346,8 @@ var Media = /*#__PURE__*/function (_PureComponent) {
345
346
  shouldEnableDownloadButton: enableDownloadButton,
346
347
  ssr: ssr,
347
348
  onError: _this.props.onMediaRenderEvent || _this.props.onError ? _this.onError : undefined,
348
- onPreviewRender: _this.props.onMediaRenderEvent || _this.props.onPreviewRender ? _this.onPreviewRender : undefined
349
+ onPreviewRender: _this.props.onMediaRenderEvent || _this.props.onPreviewRender ? _this.onPreviewRender : undefined,
350
+ mediaViewerExtensions: mediaViewerExtensions
349
351
  }))))));
350
352
  });
351
353
  _defineProperty(_this, "handleMediaLinkClick", function (event) {
@@ -6,6 +6,8 @@ import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstruct
6
6
  import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
7
7
  import _inherits from "@babel/runtime/helpers/inherits";
8
8
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
9
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
10
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
9
11
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
12
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
13
  import _regeneratorRuntime from "@babel/runtime/regenerator";
@@ -20,6 +22,7 @@ import CardAsync from '@atlaskit/media-card/cardLoader';
20
22
  import { CardLoading } from '@atlaskit/media-card/cardLoading';
21
23
  import CardSync from '@atlaskit/media-card/cardSync';
22
24
  import { MediaClientContext } from '@atlaskit/media-client-react/media-client-provider';
25
+ import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
23
26
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
24
27
  import AnalyticsContext from '../analytics/analyticsContext';
25
28
  export var mediaIdentifierMap = new Map();
@@ -52,6 +55,38 @@ export var getListOfIdentifiersFromDoc = function getListOfIdentifiersFromDoc(do
52
55
  }, []);
53
56
  };
54
57
 
58
+ /**
59
+ * `mediaIdentifierMap` is the Media Viewer's nav list, but a `Map` can only append —
60
+ * a card that unmounts and re-registers lands last, scrambling nav order. Rebuild it
61
+ * in document order; entries from other renderers on the page keep their old order.
62
+ */
63
+ var restoreDocumentOrder = function restoreDocumentOrder(docIdentifiers) {
64
+ var documentKeys = new Set(docIdentifiers.map(function (identifier) {
65
+ return identifier.mediaItemType === 'file' ? identifier.id : identifier.dataURI;
66
+ }).filter(function (key) {
67
+ return mediaIdentifierMap.has(key);
68
+ }));
69
+ var currentKeys = Array.from(mediaIdentifierMap.keys());
70
+ var orderedKeys = [].concat(_toConsumableArray(documentKeys), _toConsumableArray(currentKeys.filter(function (key) {
71
+ return !documentKeys.has(key);
72
+ })));
73
+ if (orderedKeys.every(function (key, index) {
74
+ return key === currentKeys[index];
75
+ })) {
76
+ return;
77
+ }
78
+ var orderedEntries = orderedKeys.map(function (key) {
79
+ return [key, mediaIdentifierMap.get(key)];
80
+ });
81
+ mediaIdentifierMap.clear();
82
+ orderedEntries.forEach(function (_ref) {
83
+ var _ref2 = _slicedToArray(_ref, 2),
84
+ key = _ref2[0],
85
+ identifier = _ref2[1];
86
+ mediaIdentifierMap.set(key, identifier);
87
+ });
88
+ };
89
+
55
90
  // Ignored via go/ees005
56
91
  // eslint-disable-next-line @repo/internal/react/no-class-components
57
92
  export var MediaCardView = /*#__PURE__*/function (_Component) {
@@ -64,7 +99,7 @@ export var MediaCardView = /*#__PURE__*/function (_Component) {
64
99
  _this = _callSuper(this, MediaCardView, [].concat(args));
65
100
  _defineProperty(_this, "state", {});
66
101
  _defineProperty(_this, "saveFileState", /*#__PURE__*/function () {
67
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(id) {
102
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(id) {
68
103
  var _this$props, collectionName, mediaClient, options, fileState, _t;
69
104
  return _regeneratorRuntime.wrap(function (_context) {
70
105
  while (1) switch (_context.prev = _context.next) {
@@ -98,7 +133,7 @@ export var MediaCardView = /*#__PURE__*/function (_Component) {
98
133
  }, _callee, null, [[1, 4]]);
99
134
  }));
100
135
  return function (_x) {
101
- return _ref.apply(this, arguments);
136
+ return _ref3.apply(this, arguments);
102
137
  };
103
138
  }());
104
139
  _defineProperty(_this, "onError", function (reason) {
@@ -165,7 +200,7 @@ export var MediaCardView = /*#__PURE__*/function (_Component) {
165
200
  key: "componentDidMount",
166
201
  value: function () {
167
202
  var _componentDidMount = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
168
- var _this$props6, rendererContext, contextIdentifierProvider, id, url, collectionName, nodeIsInCache, _t2, _t3;
203
+ var _this$props6, rendererContext, contextIdentifierProvider, id, url, collectionName, nodeIsInCache, docIdentifiers, _t2, _t3;
169
204
  return _regeneratorRuntime.wrap(function (_context2) {
170
205
  while (1) switch (_context2.prev = _context2.next) {
171
206
  case 0:
@@ -185,7 +220,8 @@ export var MediaCardView = /*#__PURE__*/function (_Component) {
185
220
  case 2:
186
221
  nodeIsInCache = id && mediaIdentifierMap.has(id) || url && mediaIdentifierMap.has(url);
187
222
  if (rendererContext && rendererContext.adDoc && !nodeIsInCache) {
188
- getListOfIdentifiersFromDoc(rendererContext.adDoc).forEach(function (identifier) {
223
+ docIdentifiers = getListOfIdentifiersFromDoc(rendererContext.adDoc);
224
+ docIdentifiers.forEach(function (identifier) {
189
225
  if (identifier.mediaItemType === 'file' && identifier.id === id) {
190
226
  mediaIdentifierMap.set(identifier.id, _objectSpread(_objectSpread({}, identifier), {}, {
191
227
  collectionName: collectionName
@@ -194,6 +230,11 @@ export var MediaCardView = /*#__PURE__*/function (_Component) {
194
230
  mediaIdentifierMap.set(identifier.dataURI, identifier);
195
231
  }
196
232
  });
233
+ // Reordering affects prev/next nav in every overlay viewer on the page, so gate it
234
+ // to the media-comments sidebar experiment that needs it; otherwise keep legacy order.
235
+ if (isExperimentEnabled('cc_comments_media_viewer_sidebar')) {
236
+ restoreDocumentOrder(docIdentifiers);
237
+ }
197
238
  }
198
239
  if (id) {
199
240
  this.saveFileState(id);
@@ -391,13 +432,13 @@ export var MediaCardView = /*#__PURE__*/function (_Component) {
391
432
  }]);
392
433
  }(Component);
393
434
  // Needed for copy & paste
394
- export var getClipboardAttrs = function getClipboardAttrs(_ref2) {
395
- var id = _ref2.id,
396
- alt = _ref2.alt,
397
- collection = _ref2.collection,
398
- contextIdentifierProvider = _ref2.contextIdentifierProvider,
399
- originalDimensions = _ref2.originalDimensions,
400
- fileState = _ref2.fileState;
435
+ export var getClipboardAttrs = function getClipboardAttrs(_ref4) {
436
+ var id = _ref4.id,
437
+ alt = _ref4.alt,
438
+ collection = _ref4.collection,
439
+ contextIdentifierProvider = _ref4.contextIdentifierProvider,
440
+ originalDimensions = _ref4.originalDimensions,
441
+ fileState = _ref4.fileState;
401
442
  var contextId = contextIdentifierProvider && contextIdentifierProvider.objectId;
402
443
  var width = originalDimensions && originalDimensions.width;
403
444
  var height = originalDimensions && originalDimensions.height;
@@ -425,8 +466,8 @@ export var getClipboardAttrs = function getClipboardAttrs(_ref2) {
425
466
  };
426
467
  export var MediaCardInternal = function MediaCardInternal(props) {
427
468
  var mediaClient = useContext(MediaClientContext);
428
- return /*#__PURE__*/React.createElement(AnalyticsContext.Consumer, null, function (_ref3) {
429
- var fireAnalyticsEvent = _ref3.fireAnalyticsEvent;
469
+ return /*#__PURE__*/React.createElement(AnalyticsContext.Consumer, null, function (_ref5) {
470
+ var fireAnalyticsEvent = _ref5.fireAnalyticsEvent;
430
471
  return /*#__PURE__*/React.createElement(MediaCardView
431
472
  // Ignored via go/ees005
432
473
  // eslint-disable-next-line react/jsx-props-no-spreading
@@ -61,7 +61,7 @@ export var DEGRADED_SEVERITY_THRESHOLD = 3000;
61
61
  var TABLE_INFO_TIMEOUT = 10000;
62
62
  var RENDER_EVENT_SAMPLE_RATE = 0.1;
63
63
  var packageName = "@atlaskit/renderer";
64
- var packageVersion = "142.0.0";
64
+ var packageVersion = "142.1.0";
65
65
  var setAsQueryContainerStyles = css({
66
66
  containerName: 'ak-renderer-wrapper',
67
67
  containerType: 'inline-size'
@@ -1,3 +1,4 @@
1
+ import type { AnnotationId } from '@atlaskit/adf-schema/annotation';
1
2
  import { AnnotationTypes } from '@atlaskit/adf-schema/annotation';
2
3
  import type { AnnotationActionResult, AnnotationByMatches, SelectionContext } from '@atlaskit/editor-common/types';
3
4
  import type { JSONDocNode } from '@atlaskit/editor-json-transformer/types';
@@ -17,6 +18,21 @@ type Annotation = {
17
18
  annotationId: string;
18
19
  annotationType: AnnotationTypes;
19
20
  };
21
+ export type MediaNodeContext = {
22
+ annotationIds: AnnotationId[];
23
+ displayText?: string;
24
+ fileId: string;
25
+ occurrenceKey?: string;
26
+ position: number;
27
+ };
28
+ export type MediaNodeContextResult = {
29
+ context: MediaNodeContext;
30
+ status: 'resolved';
31
+ } | {
32
+ status: 'missing';
33
+ } | {
34
+ status: 'ambiguous';
35
+ };
20
36
  interface RendererActionsOptions {
21
37
  annotate: (range: Range, annotationId: string, annotationType: 'inlineComment') => ActionResult;
22
38
  deleteAnnotation: (annotationId: string, annotationType: 'inlineComment') => ActionResult;
@@ -68,6 +84,10 @@ export default class RendererActions implements RendererActionsOptions, Annotati
68
84
  getPositionFromRange(range: Range | null): Position | false;
69
85
  getSelectionContext(): SelectionContext | null;
70
86
  getAnnotationMarks(): Mark[];
87
+ getMediaNodeContext(identifier: {
88
+ id: string;
89
+ occurrenceKey?: string;
90
+ }): MediaNodeContextResult;
71
91
  getAnnotationsByPosition(range: Range): string[];
72
92
  applyAnnotation(pos: Position, annotation: Annotation): AnnotationActionResult;
73
93
  generateAnnotationIndexMatch(pos: Position): AnnotationByMatches | false;
@@ -12,6 +12,7 @@ import type { LinkDefinition } from '@atlaskit/adf-schema/link';
12
12
  import type { ProviderFactory } from '@atlaskit/editor-common/provider-factory';
13
13
  import type { EventHandlers } from '@atlaskit/editor-common/ui';
14
14
  import type { MediaFeatureFlags } from '@atlaskit/media-common';
15
+ import type { MediaViewerExtensions } from '@atlaskit/media-viewer/types';
15
16
  import type { AnalyticsEventPayload } from '../../../analytics/events';
16
17
  import type { MediaRenderEvent } from '../../../types/mediaOptions';
17
18
  import type { MediaCardProps } from '../../../ui/MediaCard';
@@ -31,6 +32,8 @@ export type MediaProps = MediaCardProps & {
31
32
  isLinkMark: () => boolean;
32
33
  marks: Array<LinkDefinition | BorderMarkDefinition | AnnotationMarkDefinition | DataConsumerDefinition>;
33
34
  mediaSingleElement?: HTMLElement | null;
35
+ /** Extensions for the media viewer (e.g. sidebar with comment indicator). */
36
+ mediaViewerExtensions?: MediaViewerExtensions;
34
37
  onMediaRenderEvent?: (event: MediaRenderEvent) => void;
35
38
  providers?: ProviderFactory;
36
39
  width?: number;
@@ -39,7 +39,9 @@ export interface MediaOptions {
39
39
  */
40
40
  fallbackMediaNameFetcher?: (id: string) => Promise<string>;
41
41
  featureFlags?: MediaFeatureFlags;
42
- /** Extensions for the media viewer header (e.g. comment navigation button). */
42
+ /** Extensions for the media viewer (e.g. header action buttons, sidebar with comment indicator).
43
+ * When provided, the media viewer will use these extensions for all media items.
44
+ * Use headerActions.isVisible to control per-item header action visibility. */
43
45
  mediaViewerExtensions?: MediaViewerExtensions;
44
46
  /** Receives lifecycle events for each rendered media node. */
45
47
  onMediaRenderEvent?: (event: MediaRenderEvent) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/renderer",
3
- "version": "142.0.1",
3
+ "version": "142.1.1",
4
4
  "description": "Renderer component",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -53,7 +53,7 @@
53
53
  "@atlaskit/feature-gate-js-client": "^6.0.0",
54
54
  "@atlaskit/icon": "^37.7.0",
55
55
  "@atlaskit/link": "^5.1.0",
56
- "@atlaskit/link-datasource": "^6.13.0",
56
+ "@atlaskit/link-datasource": "^6.14.0",
57
57
  "@atlaskit/link-extractors": "^4.2.0",
58
58
  "@atlaskit/linking-common": "^12.3.0",
59
59
  "@atlaskit/media-card": "^81.12.0",
@@ -69,12 +69,12 @@
69
69
  "@atlaskit/pragmatic-drag-and-drop": "^3.1.0",
70
70
  "@atlaskit/react-compiler-gating": "^0.2.0",
71
71
  "@atlaskit/react-ufo": "^7.13.0",
72
- "@atlaskit/smart-card": "^45.26.0",
72
+ "@atlaskit/smart-card": "^45.28.0",
73
73
  "@atlaskit/status": "^5.12.0",
74
74
  "@atlaskit/task-decision": "^21.10.0",
75
75
  "@atlaskit/theme": "^28.2.0",
76
76
  "@atlaskit/tmp-editor-statsig": "^202.0.0",
77
- "@atlaskit/tokens": "^18.2.0",
77
+ "@atlaskit/tokens": "^19.0.0",
78
78
  "@atlaskit/tooltip": "^24.3.0",
79
79
  "@atlaskit/visually-hidden": "^4.4.0",
80
80
  "@babel/runtime": "^7.0.0",