@atlaskit/editor-plugin-media 1.28.4 → 1.29.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,26 @@
1
1
  # @atlaskit/editor-plugin-media
2
2
 
3
+ ## 1.29.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#130065](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/130065)
8
+ [`e71a357ea40dd`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/e71a357ea40dd) -
9
+ [ux] [ED-24323] Add external image badge for externally hosted images
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies
14
+
15
+ ## 1.28.5
16
+
17
+ ### Patch Changes
18
+
19
+ - [#129804](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/129804)
20
+ [`790a6fe6bc9e8`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/790a6fe6bc9e8) -
21
+ [ED-24516] Fix VR test helpers for fallback LazyNodeViews
22
+ - Updated dependencies
23
+
3
24
  ## 1.28.4
4
25
 
5
26
  ### Patch Changes
@@ -72,6 +72,7 @@ var MediaSingleNode = exports.default = /*#__PURE__*/function (_Component) {
72
72
  });
73
73
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mediaSingleWrapperRef", /*#__PURE__*/_react.default.createRef());
74
74
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "captionPlaceHolderRef", /*#__PURE__*/_react.default.createRef());
75
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "commentBadgeRef", /*#__PURE__*/_react.default.createRef());
75
76
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "createOrUpdateMediaNodeUpdater", function (props) {
76
77
  var node = _this.props.node.firstChild;
77
78
  var updaterProps = _objectSpread(_objectSpread({}, props), {}, {
@@ -331,7 +332,12 @@ var MediaSingleNode = exports.default = /*#__PURE__*/function (_Component) {
331
332
  }, {
332
333
  key: "render",
333
334
  value: function render() {
334
- var _mediaOptions$getEdit, _pluginInjectionApi$m, _node$firstChild, _mediaOptions$getEdit2;
335
+ var _mediaOptions$getEdit,
336
+ _pluginInjectionApi$m,
337
+ _node$firstChild,
338
+ _this2 = this,
339
+ _mediaOptions$getEdit3,
340
+ _mediaOptions$getEdit4;
335
341
  var _this$props2 = this.props,
336
342
  selected = _this$props2.selected,
337
343
  getPos = _this$props2.getPos,
@@ -448,6 +454,34 @@ var MediaSingleNode = exports.default = /*#__PURE__*/function (_Component) {
448
454
  shouldShowPlaceholder = !editorDisabled && shouldShowPlaceholder;
449
455
  }
450
456
  var isCurrentNodeDrafting = (annotationPluginState === null || annotationPluginState === void 0 ? void 0 : annotationPluginState.isDrafting) && (annotationPluginState === null || annotationPluginState === void 0 ? void 0 : annotationPluginState.targetNodeId) === (node === null || node === void 0 || (_node$firstChild = node.firstChild) === null || _node$firstChild === void 0 ? void 0 : _node$firstChild.attrs.id);
457
+ var insertMediaPluginPhaseOneFeatureFlag = (0, _platformFeatureFlags.fg)('platform_editor_insert_media_plugin_phase_one');
458
+ var shouldShowExternalMediaBadge = attrs.type === 'external' && attrs.__external && insertMediaPluginPhaseOneFeatureFlag;
459
+ var commentBadgeOffset = function commentBadgeOffset() {
460
+ if (_this2.commentBadgeRef.current) {
461
+ var _mediaOptions$getEdit2;
462
+ var commentsOnMediaBugFixEnabled = mediaOptions === null || mediaOptions === void 0 || (_mediaOptions$getEdit2 = mediaOptions.getEditorFeatureFlags) === null || _mediaOptions$getEdit2 === void 0 || (_mediaOptions$getEdit2 = _mediaOptions$getEdit2.call(mediaOptions)) === null || _mediaOptions$getEdit2 === void 0 ? void 0 : _mediaOptions$getEdit2.commentsOnMediaBugFix;
463
+ var commentBadgeWidth = _this2.commentBadgeRef.current.offsetWidth;
464
+ var isMediaInsideTable = function isMediaInsideTable() {
465
+ var pos = getPos();
466
+ if (pos !== undefined) {
467
+ var _$pos2 = view.state.doc.resolve(pos);
468
+ var _table2 = view.state.schema.nodes.table;
469
+ var foundTableNode = (0, _utils2.findParentNodeOfTypeClosestToPos)(_$pos2, [_table2]);
470
+ return Boolean(foundTableNode);
471
+ }
472
+ return false;
473
+ };
474
+ if (commentsOnMediaBugFixEnabled && isMediaInsideTable()) {
475
+ return commentBadgeWidth + 2;
476
+ }
477
+ return commentBadgeWidth + 14;
478
+ }
479
+ return 0;
480
+ };
481
+ var currentMediaElement = function currentMediaElement() {
482
+ var pos = getPos();
483
+ return view.domAtPos(pos + 1).node;
484
+ };
451
485
  var MediaChildren = (0, _react2.jsx)("figure", {
452
486
  ref: this.mediaSingleWrapperRef,
453
487
  css: figureWrapperStyles
@@ -455,15 +489,29 @@ var MediaSingleNode = exports.default = /*#__PURE__*/function (_Component) {
455
489
  ,
456
490
  className: _styles.MediaSingleNodeSelector,
457
491
  onClick: this.onMediaSingleClicked
458
- }, commentsOnMedia && (0, _react2.jsx)(_CommentBadge.CommentBadge, {
459
- commentsOnMediaBugFixEnabled: mediaOptions === null || mediaOptions === void 0 || (_mediaOptions$getEdit2 = mediaOptions.getEditorFeatureFlags) === null || _mediaOptions$getEdit2 === void 0 || (_mediaOptions$getEdit2 = _mediaOptions$getEdit2.call(mediaOptions)) === null || _mediaOptions$getEdit2 === void 0 ? void 0 : _mediaOptions$getEdit2.commentsOnMediaBugFix,
492
+ }, shouldShowExternalMediaBadge && (0, _react2.jsx)(_mediaSingle.ExternalImageBadge, {
493
+ commentBadgeRightOffset: commentBadgeOffset(),
494
+ mediaElement: currentMediaElement(),
495
+ mediaHeight: height,
496
+ mediaWidth: width
497
+ }), commentsOnMedia && (insertMediaPluginPhaseOneFeatureFlag ? (0, _react2.jsx)(_CommentBadge.CommentBadgeWithRef, {
498
+ ref: this.commentBadgeRef,
499
+ commentsOnMediaBugFixEnabled: mediaOptions === null || mediaOptions === void 0 || (_mediaOptions$getEdit3 = mediaOptions.getEditorFeatureFlags) === null || _mediaOptions$getEdit3 === void 0 || (_mediaOptions$getEdit3 = _mediaOptions$getEdit3.call(mediaOptions)) === null || _mediaOptions$getEdit3 === void 0 ? void 0 : _mediaOptions$getEdit3.commentsOnMediaBugFix,
460
500
  view: view,
461
501
  api: pluginInjectionApi,
462
502
  mediaNode: node === null || node === void 0 ? void 0 : node.firstChild,
463
503
  badgeOffsetRight: badgeOffsetRight,
464
504
  getPos: getPos,
465
505
  isDrafting: isCurrentNodeDrafting
466
- }), (0, _react2.jsx)("div", {
506
+ }) : (0, _react2.jsx)(_CommentBadge.CommentBadge, {
507
+ commentsOnMediaBugFixEnabled: mediaOptions === null || mediaOptions === void 0 || (_mediaOptions$getEdit4 = mediaOptions.getEditorFeatureFlags) === null || _mediaOptions$getEdit4 === void 0 || (_mediaOptions$getEdit4 = _mediaOptions$getEdit4.call(mediaOptions)) === null || _mediaOptions$getEdit4 === void 0 ? void 0 : _mediaOptions$getEdit4.commentsOnMediaBugFix,
508
+ view: view,
509
+ api: pluginInjectionApi,
510
+ mediaNode: node === null || node === void 0 ? void 0 : node.firstChild,
511
+ badgeOffsetRight: badgeOffsetRight,
512
+ getPos: getPos,
513
+ isDrafting: isCurrentNodeDrafting
514
+ })), (0, _react2.jsx)("div", {
467
515
  ref: this.props.forwardRef
468
516
  }), shouldShowPlaceholder && (0, _react2.jsx)(_CaptionPlaceholder.default, {
469
517
  ref: this.captionPlaceHolderRef,
@@ -538,18 +586,18 @@ var MediaSingleNodeView = /*#__PURE__*/function (_ReactNodeView) {
538
586
  (0, _inherits2.default)(MediaSingleNodeView, _ReactNodeView);
539
587
  var _super2 = _createSuper(MediaSingleNodeView);
540
588
  function MediaSingleNodeView() {
541
- var _this2;
589
+ var _this3;
542
590
  (0, _classCallCheck2.default)(this, MediaSingleNodeView);
543
591
  for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
544
592
  args[_key2] = arguments[_key2];
545
593
  }
546
- _this2 = _super2.call.apply(_super2, [this].concat(args));
547
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this2), "lastOffsetLeft", 0);
548
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this2), "forceViewUpdate", false);
549
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this2), "selectionType", null);
550
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this2), "checkAndUpdateSelectionType", function () {
551
- var getPos = _this2.getPos;
552
- var selection = _this2.view.state.selection;
594
+ _this3 = _super2.call.apply(_super2, [this].concat(args));
595
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this3), "lastOffsetLeft", 0);
596
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this3), "forceViewUpdate", false);
597
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this3), "selectionType", null);
598
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this3), "checkAndUpdateSelectionType", function () {
599
+ var getPos = _this3.getPos;
600
+ var selection = _this3.view.state.selection;
553
601
 
554
602
  /**
555
603
  * ED-19831
@@ -562,15 +610,15 @@ var MediaSingleNodeView = /*#__PURE__*/function (_ReactNodeView) {
562
610
  } catch (e) {
563
611
  pos = undefined;
564
612
  }
565
- var isNodeSelected = (0, _utils.isNodeSelectedOrInRange)(selection.$anchor.pos, selection.$head.pos, pos, _this2.node.nodeSize);
566
- _this2.selectionType = isNodeSelected;
613
+ var isNodeSelected = (0, _utils.isNodeSelectedOrInRange)(selection.$anchor.pos, selection.$head.pos, pos, _this3.node.nodeSize);
614
+ _this3.selectionType = isNodeSelected;
567
615
  return isNodeSelected;
568
616
  });
569
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this2), "isNodeSelected", function () {
570
- _this2.checkAndUpdateSelectionType();
571
- return _this2.selectionType !== null;
617
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this3), "isNodeSelected", function () {
618
+ _this3.checkAndUpdateSelectionType();
619
+ return _this3.selectionType !== null;
572
620
  });
573
- return _this2;
621
+ return _this3;
574
622
  }
575
623
  (0, _createClass2.default)(MediaSingleNodeView, [{
576
624
  key: "createDomRef",
@@ -635,10 +683,10 @@ var MediaSingleNodeView = /*#__PURE__*/function (_ReactNodeView) {
635
683
  }, {
636
684
  key: "update",
637
685
  value: function update(node, decorations, _innerDecorations, isValidUpdate) {
638
- var _this3 = this;
686
+ var _this4 = this;
639
687
  if (!isValidUpdate) {
640
688
  isValidUpdate = function isValidUpdate(currentNode, newNode) {
641
- return _this3.getNodeMediaId(currentNode) === _this3.getNodeMediaId(newNode);
689
+ return _this4.getNodeMediaId(currentNode) === _this4.getNodeMediaId(newNode);
642
690
  };
643
691
  }
644
692
  return (0, _get2.default)((0, _getPrototypeOf2.default)(MediaSingleNodeView.prototype), "update", this).call(this, node, decorations, _innerDecorations, isValidUpdate);
@@ -646,7 +694,7 @@ var MediaSingleNodeView = /*#__PURE__*/function (_ReactNodeView) {
646
694
  }, {
647
695
  key: "render",
648
696
  value: function render(props, forwardRef) {
649
- var _this4 = this;
697
+ var _this5 = this;
650
698
  var _this$reactComponentP = this.reactComponentProps,
651
699
  eventDispatcher = _this$reactComponentP.eventDispatcher,
652
700
  fullWidthMode = _this$reactComponentP.fullWidthMode,
@@ -671,12 +719,12 @@ var MediaSingleNodeView = /*#__PURE__*/function (_ReactNodeView) {
671
719
  pluginInjectionApi: pluginInjectionApi,
672
720
  mediaProvider: mediaProvider,
673
721
  contextIdentifierProvider: contextIdentifierProvider,
674
- node: _this4.node,
722
+ node: _this5.node,
675
723
  getPos: getPos,
676
724
  mediaOptions: mediaOptions,
677
- view: _this4.view,
725
+ view: _this5.view,
678
726
  fullWidthMode: fullWidthMode,
679
- selected: _this4.isNodeSelected,
727
+ selected: _this5.isNodeSelected,
680
728
  eventDispatcher: eventDispatcher,
681
729
  dispatchAnalyticsEvent: dispatchAnalyticsEvent,
682
730
  forwardRef: forwardRef,
@@ -4,13 +4,31 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.mediaSpecWithFixedToDOM = void 0;
7
+ exports.mediaSpecWithFixedToDOM = exports.defaultImageCardDimensions = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _adfSchema = require("@atlaskit/adf-schema");
10
10
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
11
  var _toDOMAttrs = require("./toDOMAttrs");
12
12
  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; }
13
13
  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) { (0, _defineProperty2.default)(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; }
14
+ var skeletonStyling = "background: ".concat("var(--ds-background-neutral, #091E420F)", "; outline: none;");
15
+
16
+ /**
17
+ * Duplicate consts from `media-card`.
18
+ * `packages/media/media-card/src/utils/cardDimensions.ts`
19
+ *
20
+ * WHY?
21
+ * This will eventually move to `@atlaskit/adf-schema` and we cannot reference
22
+ * `media-card` from here or it will cause dependency issues.
23
+ *
24
+ * In the long term likely `toDOM` will move back out of `adf-schema` in which
25
+ * case we can consolidate them.
26
+ */
27
+ var defaultImageCardDimensions = exports.defaultImageCardDimensions = {
28
+ width: 156,
29
+ height: 125
30
+ };
31
+
14
32
  // @nodeSpecException:toDOM patch
15
33
  var mediaSpecWithFixedToDOM = exports.mediaSpecWithFixedToDOM = function mediaSpecWithFixedToDOM() {
16
34
  if (!(0, _platformFeatureFlags.fg)('platform_editor_lazy-node-views')) {
@@ -19,7 +37,29 @@ var mediaSpecWithFixedToDOM = exports.mediaSpecWithFixedToDOM = function mediaSp
19
37
  return _objectSpread(_objectSpread({}, _adfSchema.media), {}, {
20
38
  toDOM: function toDOM(node) {
21
39
  var attrs = (0, _toDOMAttrs.getMediaAttrs)('media', node);
22
- return ['div', attrs];
40
+ var styles = skeletonStyling;
41
+ if (node.attrs.type === 'external') {
42
+ return ['img', _objectSpread(_objectSpread({}, attrs), {}, {
43
+ src: node.attrs.url,
44
+ styles: styles
45
+ })];
46
+ }
47
+ if (node.attrs.type === 'file') {
48
+ var dataUrl = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
49
+ var width = defaultImageCardDimensions.width;
50
+ var height = defaultImageCardDimensions.height;
51
+ return ['div', _objectSpread(_objectSpread({
52
+ width: width,
53
+ height: height
54
+ }, attrs), {}, {
55
+ // Manually kept in sync with the style of media cards. The goal is to render a plain gray
56
+ // rectangle that provides an affordance for media.
57
+ style: "\n\t\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\t\tbackground-image: url(\"".concat(dataUrl, "\");\n\t\t\t\t\t\tmargin-left: 0;\n\t\t\t\t\t\tmargin-right: 4px;\n\t\t\t\t\t\tborder-radius: ").concat(skeletonStyling, ";\n\n\t\t\t\t\t\tflex-basis: ").concat(defaultImageCardDimensions.width, "px;\n\t\t\t\t\t\tbackground-color: var(--media-card-background-color, unset);\n\t\t\t\t\t\twidth: var(--media-card-width, 0);\n\t\t\t\t\t\theight: var(--media-card-height, 0);\n\t\t\t\t\t\t")
58
+ })];
59
+ }
60
+ return ['div', _objectSpread(_objectSpread({}, attrs), {}, {
61
+ styles: styles
62
+ })];
23
63
  }
24
64
  });
25
65
  };
@@ -10,8 +10,6 @@ var _adfSchema = require("@atlaskit/adf-schema");
10
10
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
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; }
12
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) { (0, _defineProperty2.default)(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; }
13
- var skeletonStyling = "background: ".concat("var(--ds-background-neutral, #091E420F)", ";");
14
-
15
13
  /**
16
14
  * Duplicate consts from `media-card`.
17
15
  * `packages/media/media-card/src/utils/cardDimensions.ts`
@@ -68,27 +66,11 @@ var mediaGroupSpecWithFixedToDOM = exports.mediaGroupSpecWithFixedToDOM = functi
68
66
  }
69
67
  return _objectSpread(_objectSpread({}, _adfSchema.mediaGroup), {}, {
70
68
  toDOM: function toDOM(node) {
71
- var childNodes = [];
72
- for (var i = 0; i < node.childCount; i++) {
73
- var _getDefaultCardDimens = getDefaultCardDimensions(),
74
- width = _getDefaultCardDimens.width,
75
- height = _getDefaultCardDimens.height;
76
- var nodeHolder = ['img', {
77
- width: width,
78
- height: height,
79
- // Transparent image workaround to control styling
80
- src: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
81
- style: "margin-left: ".concat(i !== 0 ? "4px" : '0', "; margin-right: 4px; border-radius: ", "var(--ds-border-radius, 3px)", "; ").concat(skeletonStyling)
82
- }];
83
- childNodes.push(nodeHolder);
84
- }
85
-
86
69
  // Margin margin that consolidates the margin in the
87
70
  return ['div', {
88
- style: 'margin: "3px 5px";',
89
- // From adf-schema
71
+ style: "\n\t\t\t\t\t\tmargin: 3px 5px;\n\t\t\t\t\t\tdisplay: flex;\n\t\t\t\t\t\tgap: 8px;\n\t\t\t\t\t\t--media-card-background-color: #EBECF0;\n\t\t\t\t\t\t--media-card-width: ".concat(defaultImageCardDimensions.width, "px;\n\t\t\t\t\t\t--media-card-height: ").concat(defaultImageCardDimensions.height, "px;\n\t\t\t\t\t"),
90
72
  'data-node-type': 'mediaGroup'
91
- }].concat(childNodes);
73
+ }, 0];
92
74
  }
93
75
  });
94
76
  };
@@ -67,11 +67,8 @@ function getMediaSinglePixelWidth(width, editorWidth) {
67
67
  function computeMediaSingleDimensions(_ref) {
68
68
  var childNode = _ref.childNode,
69
69
  mediaSingleWidth = _ref.mediaSingleWidth,
70
- widthType = _ref.widthType;
71
- // TODO: We can't retrieve the editor width from here easily.
72
- // For now we're using the default line length here, but this will be
73
- // incorrect on smaller devices.
74
- var editorWidth = 760;
70
+ widthType = _ref.widthType,
71
+ editorWidth = _ref.editorWidth;
75
72
  var width = childNode === null || childNode === void 0 ? void 0 : childNode.attrs.width;
76
73
  var height = childNode === null || childNode === void 0 ? void 0 : childNode.attrs.height;
77
74
  if (!mediaSingleWidth && shouldAddDefaultWrappedWidth(childNode === null || childNode === void 0 ? void 0 : childNode.attrs.layout, width, editorWidth)) {
@@ -127,36 +124,44 @@ var mediaSingleSpecWithFixedToDOM = exports.mediaSingleSpecWithFixedToDOM = func
127
124
  return mediaSingleNode;
128
125
  }
129
126
  return _objectSpread(_objectSpread({}, mediaSingleNode), {}, {
130
- toDOM: function toDOM(node) {
127
+ toDOM: function toDOM(node, lazyNodeViewOptions) {
131
128
  var _mediaSingleAttrs$lay;
132
- var childNode = node.firstChild;
133
129
  var mediaSingleAttrs = node.attrs;
134
130
  var layout = (_mediaSingleAttrs$lay = mediaSingleAttrs === null || mediaSingleAttrs === void 0 ? void 0 : mediaSingleAttrs.layout) !== null && _mediaSingleAttrs$lay !== void 0 ? _mediaSingleAttrs$lay : 'center';
135
131
  var mediaSingleWidth = mediaSingleAttrs === null || mediaSingleAttrs === void 0 ? void 0 : mediaSingleAttrs.width;
136
132
  var widthType = mediaSingleAttrs === null || mediaSingleAttrs === void 0 ? void 0 : mediaSingleAttrs.widthType;
133
+ var childNode = node.firstChild;
137
134
  var dataAttrs = (0, _toDOMAttrs.getAttrsFromNodeMediaSingle)(mediaSingleOption.withExtendedWidthTypes, node);
138
135
  var _computeMediaSingleDi = computeMediaSingleDimensions({
139
136
  childNode: childNode,
140
137
  widthType: widthType,
141
- mediaSingleWidth: mediaSingleWidth
138
+ mediaSingleWidth: mediaSingleWidth,
139
+ editorWidth: (lazyNodeViewOptions === null || lazyNodeViewOptions === void 0 ? void 0 : lazyNodeViewOptions.editorLineWidth) || 760
142
140
  }),
143
141
  width = _computeMediaSingleDi.width,
144
142
  height = _computeMediaSingleDi.height;
145
- var layoutStyles = computeLayoutStyles(width, layout);
143
+ var sizes = width && height ? "width: ".concat(width, "px; height: ").concat(height, "px; ").concat(skeletonStyling) : '';
144
+ var layoutStyles = computeLayoutStyles(mediaSingleWidth, layout);
146
145
  var style = "display: block; margin-top: ".concat("var(--ds-space-300, 24px)", "; margin-bottom: ", "var(--ds-space-300, 24px)", "; ", layoutStyles);
146
+ var layoutClass = "image-".concat(layout);
147
+ var centerLayout = "display: flex; justify-content: center;";
148
+ var endLayout = "display: flex; justify-content: end;";
149
+ var startLayout = "display: flex; justify-content: start;";
150
+ var layoutStyle = layout === 'align-end' ? endLayout : layout === 'align-start' ? startLayout : centerLayout;
147
151
  var content = ['div', _objectSpread({
148
- class: 'rich-media-item mediaSingleView-content-wrap image-center'
152
+ class: "rich-media-item mediaSingleView-content-wrap ".concat(layoutClass)
149
153
  }, dataAttrs), ['div', {
150
- class: 'css-13f4nzt-MediaWrapper',
151
154
  // Transparent image workaround to control styling
152
- style: "width: ".concat(width, "px; height: ").concat(height, "px; ").concat(style, " ").concat(skeletonStyling, " border-radius: ", "var(--ds-border-radius, 3px)", ";")
155
+ style: "".concat(sizes, "; ").concat(style, "; max-width: 100%; border-radius: ", "var(--ds-border-radius, 3px)", "; ").concat(layoutStyle)
153
156
  }, ['figure', {
154
- class: 'media-single-node'
157
+ class: 'media-single-node',
158
+ style: 'margin: 0px'
155
159
  }, ['div', {}, ['div', {
156
160
  class: 'media-content-wrap'
157
161
  }, 0]]]]];
158
162
  return ['div', {
159
- class: 'mediaSingleView-content-wrap'
163
+ class: 'mediaSingleView-content-wrap',
164
+ layout: layout
160
165
  }, content];
161
166
  }
162
167
  });
@@ -5,7 +5,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.CommentBadge = void 0;
8
+ exports.CommentBadgeWithRef = exports.CommentBadge = void 0;
9
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
10
  var _react = _interopRequireWildcard(require("react"));
11
11
  var _reactIntlNext = require("react-intl-next");
@@ -75,4 +75,69 @@ var CommentBadgeWrapper = function CommentBadgeWrapper(_ref) {
75
75
  }
76
76
  });
77
77
  };
78
- var CommentBadge = exports.CommentBadge = (0, _reactIntlNext.injectIntl)(CommentBadgeWrapper);
78
+ var CommentBadge = exports.CommentBadge = (0, _reactIntlNext.injectIntl)(CommentBadgeWrapper);
79
+
80
+ // This is a copy of above component with adding forwardRef.
81
+ // Clean this up when removing fg('platform_editor_insert_media_plugin_phase_one') flag.
82
+ var CommentBadgeWithRef = exports.CommentBadgeWithRef = /*#__PURE__*/(0, _react.forwardRef)(function (_ref2, ref) {
83
+ var api = _ref2.api,
84
+ mediaNode = _ref2.mediaNode,
85
+ view = _ref2.view,
86
+ getPos = _ref2.getPos,
87
+ isDrafting = _ref2.isDrafting,
88
+ badgeOffsetRight = _ref2.badgeOffsetRight,
89
+ commentsOnMediaBugFixEnabled = _ref2.commentsOnMediaBugFixEnabled;
90
+ var intl = (0, _reactIntlNext.useIntl)();
91
+ var _useState3 = (0, _react.useState)(false),
92
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
93
+ entered = _useState4[0],
94
+ setEntered = _useState4[1];
95
+ var _useSharedPluginState2 = (0, _hooks.useSharedPluginState)(api, ['annotation']),
96
+ annotationState = _useSharedPluginState2.annotationState;
97
+ var _view$state$schema2 = view.state.schema,
98
+ media = _view$state$schema2.nodes.media,
99
+ annotation = _view$state$schema2.marks.annotation,
100
+ state = view.state,
101
+ dispatch = view.dispatch;
102
+ var status = (0, _react.useMemo)(function () {
103
+ if (!(annotationState !== null && annotationState !== void 0 && annotationState.selectedAnnotations) || !mediaNode) {
104
+ return 'default';
105
+ }
106
+ return annotationState.selectedAnnotations.some(function (annotation) {
107
+ return !!mediaNode.marks.find(function (mark) {
108
+ return mark.attrs.id === annotation.id;
109
+ });
110
+ }) && !annotationState.isInlineCommentViewClosed ? 'active' : 'default';
111
+ }, [annotationState, mediaNode]);
112
+ var onClick = (0, _react.useCallback)(function () {
113
+ if (api.annotation && mediaNode) {
114
+ var showCommentForBlockNode = api.annotation.actions.showCommentForBlockNode;
115
+ showCommentForBlockNode(mediaNode, _analytics.VIEW_METHOD.BADGE)(state, dispatch);
116
+ }
117
+ }, [api.annotation, dispatch, mediaNode, state]);
118
+ var pos = getPos();
119
+ var hasNoComments = !Number.isFinite(pos) || !(annotationState !== null && annotationState !== void 0 && annotationState.annotations) || !mediaNode || mediaNode.type !== media || mediaNode.marks.every(function (maybeAnnotation) {
120
+ return maybeAnnotation.type !== annotation || !(maybeAnnotation.attrs.id in annotationState.annotations) || annotationState.annotations[maybeAnnotation.attrs.id];
121
+ });
122
+ if (!isDrafting && hasNoComments || !mediaNode) {
123
+ return null;
124
+ }
125
+ var mediaSingleElement = view.domAtPos(pos + 1).node;
126
+ return /*#__PURE__*/_react.default.createElement(_mediaSingle.CommentBadge, {
127
+ ref: ref,
128
+ commentsOnMediaBugFixEnabled: commentsOnMediaBugFixEnabled,
129
+ badgeOffsetRight: badgeOffsetRight,
130
+ width: mediaNode.attrs.width,
131
+ height: mediaNode.attrs.height,
132
+ onClick: onClick,
133
+ mediaSingleElement: mediaSingleElement,
134
+ intl: intl,
135
+ status: entered ? 'entered' : status,
136
+ onMouseEnter: function onMouseEnter() {
137
+ return setEntered(true);
138
+ },
139
+ onMouseLeave: function onMouseLeave() {
140
+ return setEntered(false);
141
+ }
142
+ });
143
+ });
@@ -11,6 +11,7 @@ import React, { Component, Fragment, useMemo } from 'react';
11
11
  import { css, jsx } from '@emotion/react';
12
12
  import { useSharedPluginState } from '@atlaskit/editor-common/hooks';
13
13
  import { calcMediaSinglePixelWidth, DEFAULT_IMAGE_HEIGHT, DEFAULT_IMAGE_WIDTH, getMaxWidthForNestedNode, MEDIA_SINGLE_GUTTER_SIZE } from '@atlaskit/editor-common/media-single';
14
+ import { ExternalImageBadge } from '@atlaskit/editor-common/media-single';
14
15
  import { WithProviders } from '@atlaskit/editor-common/provider-factory';
15
16
  import ReactNodeView from '@atlaskit/editor-common/react-node-view';
16
17
  import { MediaSingle } from '@atlaskit/editor-common/ui';
@@ -23,7 +24,7 @@ import { fg } from '@atlaskit/platform-feature-flags';
23
24
  import { insertAndSelectCaptionFromMediaSinglePos } from '../commands/captions';
24
25
  import { MEDIA_CONTENT_WRAP_CLASS_NAME } from '../pm-plugins/main';
25
26
  import CaptionPlaceholder from '../ui/CaptionPlaceholder';
26
- import { CommentBadge } from '../ui/CommentBadge';
27
+ import { CommentBadge, CommentBadgeWithRef } from '../ui/CommentBadge';
27
28
  import ResizableMediaSingle from '../ui/ResizableMediaSingle';
28
29
  import ResizableMediaSingleNext from '../ui/ResizableMediaSingle/ResizableMediaSingleNext';
29
30
  import { isMediaBlobUrlFromAttrs } from '../utils/media-common';
@@ -46,6 +47,7 @@ export default class MediaSingleNode extends Component {
46
47
  });
47
48
  _defineProperty(this, "mediaSingleWrapperRef", /*#__PURE__*/React.createRef());
48
49
  _defineProperty(this, "captionPlaceHolderRef", /*#__PURE__*/React.createRef());
50
+ _defineProperty(this, "commentBadgeRef", /*#__PURE__*/React.createRef());
49
51
  _defineProperty(this, "createOrUpdateMediaNodeUpdater", props => {
50
52
  const node = this.props.node.firstChild;
51
53
  const updaterProps = {
@@ -234,7 +236,7 @@ export default class MediaSingleNode extends Component {
234
236
  });
235
237
  }
236
238
  render() {
237
- var _mediaOptions$getEdit, _pluginInjectionApi$m, _pluginInjectionApi$m2, _node$firstChild, _mediaOptions$getEdit2, _mediaOptions$getEdit3;
239
+ var _mediaOptions$getEdit, _pluginInjectionApi$m, _pluginInjectionApi$m2, _node$firstChild, _mediaOptions$getEdit4, _mediaOptions$getEdit5, _mediaOptions$getEdit6, _mediaOptions$getEdit7;
238
240
  const {
239
241
  selected,
240
242
  getPos,
@@ -365,6 +367,36 @@ export default class MediaSingleNode extends Component {
365
367
  shouldShowPlaceholder = !editorDisabled && shouldShowPlaceholder;
366
368
  }
367
369
  const isCurrentNodeDrafting = (annotationPluginState === null || annotationPluginState === void 0 ? void 0 : annotationPluginState.isDrafting) && (annotationPluginState === null || annotationPluginState === void 0 ? void 0 : annotationPluginState.targetNodeId) === (node === null || node === void 0 ? void 0 : (_node$firstChild = node.firstChild) === null || _node$firstChild === void 0 ? void 0 : _node$firstChild.attrs.id);
370
+ const insertMediaPluginPhaseOneFeatureFlag = fg('platform_editor_insert_media_plugin_phase_one');
371
+ const shouldShowExternalMediaBadge = attrs.type === 'external' && attrs.__external && insertMediaPluginPhaseOneFeatureFlag;
372
+ const commentBadgeOffset = () => {
373
+ if (this.commentBadgeRef.current) {
374
+ var _mediaOptions$getEdit2, _mediaOptions$getEdit3;
375
+ const commentsOnMediaBugFixEnabled = mediaOptions === null || mediaOptions === void 0 ? void 0 : (_mediaOptions$getEdit2 = mediaOptions.getEditorFeatureFlags) === null || _mediaOptions$getEdit2 === void 0 ? void 0 : (_mediaOptions$getEdit3 = _mediaOptions$getEdit2.call(mediaOptions)) === null || _mediaOptions$getEdit3 === void 0 ? void 0 : _mediaOptions$getEdit3.commentsOnMediaBugFix;
376
+ const commentBadgeWidth = this.commentBadgeRef.current.offsetWidth;
377
+ const isMediaInsideTable = () => {
378
+ const pos = getPos();
379
+ if (pos !== undefined) {
380
+ const $pos = view.state.doc.resolve(pos);
381
+ const {
382
+ table
383
+ } = view.state.schema.nodes;
384
+ const foundTableNode = findParentNodeOfTypeClosestToPos($pos, [table]);
385
+ return Boolean(foundTableNode);
386
+ }
387
+ return false;
388
+ };
389
+ if (commentsOnMediaBugFixEnabled && isMediaInsideTable()) {
390
+ return commentBadgeWidth + 2;
391
+ }
392
+ return commentBadgeWidth + 14;
393
+ }
394
+ return 0;
395
+ };
396
+ const currentMediaElement = () => {
397
+ const pos = getPos();
398
+ return view.domAtPos(pos + 1).node;
399
+ };
368
400
  const MediaChildren = jsx("figure", {
369
401
  ref: this.mediaSingleWrapperRef,
370
402
  css: figureWrapperStyles
@@ -372,15 +404,29 @@ export default class MediaSingleNode extends Component {
372
404
  ,
373
405
  className: MediaSingleNodeSelector,
374
406
  onClick: this.onMediaSingleClicked
375
- }, commentsOnMedia && jsx(CommentBadge, {
376
- commentsOnMediaBugFixEnabled: mediaOptions === null || mediaOptions === void 0 ? void 0 : (_mediaOptions$getEdit2 = mediaOptions.getEditorFeatureFlags) === null || _mediaOptions$getEdit2 === void 0 ? void 0 : (_mediaOptions$getEdit3 = _mediaOptions$getEdit2.call(mediaOptions)) === null || _mediaOptions$getEdit3 === void 0 ? void 0 : _mediaOptions$getEdit3.commentsOnMediaBugFix,
407
+ }, shouldShowExternalMediaBadge && jsx(ExternalImageBadge, {
408
+ commentBadgeRightOffset: commentBadgeOffset(),
409
+ mediaElement: currentMediaElement(),
410
+ mediaHeight: height,
411
+ mediaWidth: width
412
+ }), commentsOnMedia && (insertMediaPluginPhaseOneFeatureFlag ? jsx(CommentBadgeWithRef, {
413
+ ref: this.commentBadgeRef,
414
+ commentsOnMediaBugFixEnabled: mediaOptions === null || mediaOptions === void 0 ? void 0 : (_mediaOptions$getEdit4 = mediaOptions.getEditorFeatureFlags) === null || _mediaOptions$getEdit4 === void 0 ? void 0 : (_mediaOptions$getEdit5 = _mediaOptions$getEdit4.call(mediaOptions)) === null || _mediaOptions$getEdit5 === void 0 ? void 0 : _mediaOptions$getEdit5.commentsOnMediaBugFix,
415
+ view: view,
416
+ api: pluginInjectionApi,
417
+ mediaNode: node === null || node === void 0 ? void 0 : node.firstChild,
418
+ badgeOffsetRight: badgeOffsetRight,
419
+ getPos: getPos,
420
+ isDrafting: isCurrentNodeDrafting
421
+ }) : jsx(CommentBadge, {
422
+ commentsOnMediaBugFixEnabled: mediaOptions === null || mediaOptions === void 0 ? void 0 : (_mediaOptions$getEdit6 = mediaOptions.getEditorFeatureFlags) === null || _mediaOptions$getEdit6 === void 0 ? void 0 : (_mediaOptions$getEdit7 = _mediaOptions$getEdit6.call(mediaOptions)) === null || _mediaOptions$getEdit7 === void 0 ? void 0 : _mediaOptions$getEdit7.commentsOnMediaBugFix,
377
423
  view: view,
378
424
  api: pluginInjectionApi,
379
425
  mediaNode: node === null || node === void 0 ? void 0 : node.firstChild,
380
426
  badgeOffsetRight: badgeOffsetRight,
381
427
  getPos: getPos,
382
428
  isDrafting: isCurrentNodeDrafting
383
- }), jsx("div", {
429
+ })), jsx("div", {
384
430
  ref: this.props.forwardRef
385
431
  }), shouldShowPlaceholder && jsx(CaptionPlaceholder, {
386
432
  ref: this.captionPlaceHolderRef,
@@ -1,6 +1,23 @@
1
1
  import { media } from '@atlaskit/adf-schema';
2
2
  import { fg } from '@atlaskit/platform-feature-flags';
3
3
  import { getMediaAttrs } from './toDOMAttrs';
4
+ const skeletonStyling = `background: ${"var(--ds-background-neutral, #091E420F)"}; outline: none;`;
5
+
6
+ /**
7
+ * Duplicate consts from `media-card`.
8
+ * `packages/media/media-card/src/utils/cardDimensions.ts`
9
+ *
10
+ * WHY?
11
+ * This will eventually move to `@atlaskit/adf-schema` and we cannot reference
12
+ * `media-card` from here or it will cause dependency issues.
13
+ *
14
+ * In the long term likely `toDOM` will move back out of `adf-schema` in which
15
+ * case we can consolidate them.
16
+ */
17
+ export const defaultImageCardDimensions = {
18
+ width: 156,
19
+ height: 125
20
+ };
4
21
 
5
22
  // @nodeSpecException:toDOM patch
6
23
  export const mediaSpecWithFixedToDOM = () => {
@@ -11,7 +28,42 @@ export const mediaSpecWithFixedToDOM = () => {
11
28
  ...media,
12
29
  toDOM: node => {
13
30
  const attrs = getMediaAttrs('media', node);
14
- return ['div', attrs];
31
+ const styles = skeletonStyling;
32
+ if (node.attrs.type === 'external') {
33
+ return ['img', {
34
+ ...attrs,
35
+ src: node.attrs.url,
36
+ styles
37
+ }];
38
+ }
39
+ if (node.attrs.type === 'file') {
40
+ const dataUrl = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
41
+ const width = defaultImageCardDimensions.width;
42
+ const height = defaultImageCardDimensions.height;
43
+ return ['div', {
44
+ width,
45
+ height,
46
+ ...attrs,
47
+ // Manually kept in sync with the style of media cards. The goal is to render a plain gray
48
+ // rectangle that provides an affordance for media.
49
+ style: `
50
+ display: inline-block;
51
+ background-image: url("${dataUrl}");
52
+ margin-left: 0;
53
+ margin-right: 4px;
54
+ border-radius: ${skeletonStyling};
55
+
56
+ flex-basis: ${defaultImageCardDimensions.width}px;
57
+ background-color: var(--media-card-background-color, unset);
58
+ width: var(--media-card-width, 0);
59
+ height: var(--media-card-height, 0);
60
+ `
61
+ }];
62
+ }
63
+ return ['div', {
64
+ ...attrs,
65
+ styles
66
+ }];
15
67
  }
16
68
  };
17
69
  };