@atlaskit/editor-plugin-media 0.6.1 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/nodeviews/mediaInline.js +3 -1
  3. package/dist/cjs/pm-plugins/main.js +1 -1
  4. package/dist/cjs/toolbar/commands.js +15 -1
  5. package/dist/cjs/toolbar/index.js +1 -2
  6. package/dist/cjs/toolbar/mediaInline.js +38 -5
  7. package/dist/cjs/utils/is-type.js +2 -2
  8. package/dist/cjs/utils/media-files.js +3 -5
  9. package/dist/cjs/utils/media-single.js +64 -1
  10. package/dist/es2019/nodeviews/mediaInline.js +6 -2
  11. package/dist/es2019/pm-plugins/main.js +1 -1
  12. package/dist/es2019/toolbar/commands.js +14 -0
  13. package/dist/es2019/toolbar/index.js +1 -2
  14. package/dist/es2019/toolbar/mediaInline.js +36 -7
  15. package/dist/es2019/utils/is-type.js +2 -2
  16. package/dist/es2019/utils/media-files.js +3 -5
  17. package/dist/es2019/utils/media-single.js +70 -1
  18. package/dist/esm/nodeviews/mediaInline.js +4 -2
  19. package/dist/esm/pm-plugins/main.js +1 -1
  20. package/dist/esm/toolbar/commands.js +14 -0
  21. package/dist/esm/toolbar/index.js +1 -2
  22. package/dist/esm/toolbar/mediaInline.js +40 -7
  23. package/dist/esm/utils/is-type.js +2 -2
  24. package/dist/esm/utils/media-files.js +3 -5
  25. package/dist/esm/utils/media-single.js +64 -1
  26. package/dist/types/pm-plugins/types.d.ts +1 -0
  27. package/dist/types/toolbar/commands.d.ts +2 -0
  28. package/dist/types/toolbar/mediaInline.d.ts +5 -3
  29. package/dist/types/utils/is-type.d.ts +1 -1
  30. package/dist/types/utils/media-files.d.ts +2 -1
  31. package/dist/types/utils/media-single.d.ts +1 -0
  32. package/dist/types-ts4.5/pm-plugins/types.d.ts +1 -0
  33. package/dist/types-ts4.5/toolbar/commands.d.ts +2 -0
  34. package/dist/types-ts4.5/toolbar/mediaInline.d.ts +5 -3
  35. package/dist/types-ts4.5/utils/is-type.d.ts +1 -1
  36. package/dist/types-ts4.5/utils/media-files.d.ts +2 -1
  37. package/dist/types-ts4.5/utils/media-single.d.ts +1 -0
  38. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlaskit/editor-plugin-media
2
2
 
3
+ ## 0.6.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [#59409](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/59409) [`e37f95e368fd`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/e37f95e368fd) - Refactor code to use allowInlineImages plugin state instead of FF check
8
+
9
+ ## 0.6.2
10
+
11
+ ### Patch Changes
12
+
13
+ - [#59086](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/59086) [`8b5cbc397cfd`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/8b5cbc397cfd) - [ux] add convert media inline image to media single floating toolbar item
14
+
3
15
  ## 0.6.1
4
16
 
5
17
  ### Patch Changes
@@ -24,6 +24,7 @@ var _selectionBasedNodeView = require("@atlaskit/editor-common/selection-based-n
24
24
  var _mediaCard = require("@atlaskit/media-card");
25
25
  var _mediaClientReact = require("@atlaskit/media-client-react");
26
26
  var _mediaUi = require("@atlaskit/media-ui");
27
+ var _isType = require("../utils/is-type");
27
28
  var _mediaNodeUpdater = require("./mediaNodeUpdater");
28
29
  var _styles = require("./styles");
29
30
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -183,7 +184,8 @@ var MediaInline = exports.MediaInline = function MediaInline(props) {
183
184
  isSelected: false
184
185
  });
185
186
  }
186
- if ((0, _mediaInline.shouldShowInlineImage)(type)) {
187
+ var allowInlineImages = props.mediaPluginState.allowInlineImages;
188
+ if (allowInlineImages && (0, _isType.isImage)(type)) {
187
189
  return /*#__PURE__*/_react.default.createElement(_mediaInline.MediaInlineImageCard, {
188
190
  mediaClient: (0, _mediaClientReact.getMediaClient)(viewMediaClientConfig),
189
191
  identifier: identifier,
@@ -244,7 +244,7 @@ var MediaPluginStateImplementation = exports.MediaPluginStateImplementation = /*
244
244
  }
245
245
  switch ((0, _mediaInline.getMediaNodeInsertionType)(state, (_this$mediaOptions2 = _this.mediaOptions) === null || _this$mediaOptions2 === void 0 ? void 0 : _this$mediaOptions2.featureFlags, mediaStateWithContext.fileMimeType)) {
246
246
  case 'inline':
247
- (0, _mediaFiles.insertMediaInlineNode)(editorAnalyticsAPI)(_this.view, mediaStateWithContext, collection, _this.getInputMethod(pickerType));
247
+ (0, _mediaFiles.insertMediaInlineNode)(editorAnalyticsAPI)(_this.view, mediaStateWithContext, collection, _this.allowInlineImages, _this.getInputMethod(pickerType));
248
248
  break;
249
249
  case 'block':
250
250
  // read width state right before inserting to get up-to-date and define values
@@ -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.updateMediaSingleWidth = exports.toggleBorderMark = exports.setBorderMark = exports.removeInlineCard = exports.changeMediaCardToInline = exports.changeInlineToMediaCard = exports.DEFAULT_BORDER_SIZE = exports.DEFAULT_BORDER_COLOR = void 0;
7
+ exports.updateMediaSingleWidth = exports.toggleBorderMark = exports.setBorderMark = exports.removeInlineCard = exports.changeMediaInlineToMediaSingle = exports.changeMediaCardToInline = exports.changeInlineToMediaCard = exports.DEFAULT_BORDER_SIZE = exports.DEFAULT_BORDER_COLOR = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _analytics = require("@atlaskit/editor-common/analytics");
10
10
  var _model = require("@atlaskit/editor-prosemirror/model");
@@ -12,6 +12,7 @@ var _state = require("@atlaskit/editor-prosemirror/state");
12
12
  var _utils = require("@atlaskit/editor-prosemirror/utils");
13
13
  var _analytics2 = require("../utils/analytics");
14
14
  var _currentMediaNode = require("../utils/current-media-node");
15
+ var _mediaSingle = require("../utils/media-single");
15
16
  var _utils2 = require("./utils");
16
17
  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; }
17
18
  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; }
@@ -93,6 +94,19 @@ var changeMediaCardToInline = exports.changeMediaCardToInline = function changeM
93
94
  return true;
94
95
  };
95
96
  };
97
+ var changeMediaInlineToMediaSingle = exports.changeMediaInlineToMediaSingle = function changeMediaInlineToMediaSingle(editorAnalyticsAPI, widthPluginState) {
98
+ return function (state, dispatch, view) {
99
+ var mediaInline = state.schema.nodes.mediaInline;
100
+ var selectedNode = state.selection instanceof _state.NodeSelection && state.selection.node.type === mediaInline && state.selection.node;
101
+ if (!selectedNode) {
102
+ return false;
103
+ }
104
+ if (view) {
105
+ return (0, _mediaSingle.changeFromMediaInlineToMediaSingleNode)(view, selectedNode, widthPluginState, editorAnalyticsAPI);
106
+ }
107
+ return true;
108
+ };
109
+ };
96
110
  var removeInlineCard = exports.removeInlineCard = function removeInlineCard(state, dispatch) {
97
111
  if ((0, _utils.isNodeSelection)(state.selection)) {
98
112
  if (dispatch) {
@@ -470,13 +470,12 @@ var floatingToolbar = exports.floatingToolbar = function floatingToolbar(state,
470
470
  };
471
471
  items = generateMediaCardFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a7 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a7 === void 0 ? void 0 : _pluginInjectionApi$a7.actions);
472
472
  } else if (allowMediaInline && selectedNodeType && selectedNodeType === mediaInline) {
473
- var _pluginInjectionApi$a8;
474
473
  baseToolbar.getDomRef = function () {
475
474
  var _mediaPluginState$ele2;
476
475
  var element = (_mediaPluginState$ele2 = mediaPluginState.element) === null || _mediaPluginState$ele2 === void 0 ? void 0 : _mediaPluginState$ele2.querySelector(".".concat(_styles.MediaInlineNodeSelector));
477
476
  return element || mediaPluginState.element;
478
477
  };
479
- items = (0, _mediaInline.generateMediaInlineFloatingToolbar)(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a8 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a8 === void 0 ? void 0 : _pluginInjectionApi$a8.actions);
478
+ items = (0, _mediaInline.generateMediaInlineFloatingToolbar)(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi);
480
479
  } else {
481
480
  baseToolbar.getDomRef = function () {
482
481
  var _mediaPluginState$ele3;
@@ -7,22 +7,26 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.getMediaInlineImageToolbar = exports.generateMediaInlineFloatingToolbar = void 0;
9
9
  var _react = _interopRequireDefault(require("react"));
10
- var _mediaInline = require("@atlaskit/editor-common/media-inline");
10
+ var _card = require("@atlaskit/editor-common/card");
11
11
  var _messages = _interopRequireWildcard(require("@atlaskit/editor-common/messages"));
12
12
  var _state = require("@atlaskit/editor-prosemirror/state");
13
13
  var _download = _interopRequireDefault(require("@atlaskit/icon/glyph/download"));
14
14
  var _remove = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/remove"));
15
15
  var _mediaUi = require("@atlaskit/media-ui");
16
+ var _isType = require("../utils/is-type");
16
17
  var _commands = require("./commands");
17
18
  var _filePreviewItem = require("./filePreviewItem");
18
19
  var _utils = require("./utils");
19
20
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
20
21
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
21
- var generateMediaInlineFloatingToolbar = exports.generateMediaInlineFloatingToolbar = function generateMediaInlineFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI) {
22
+ var generateMediaInlineFloatingToolbar = exports.generateMediaInlineFloatingToolbar = function generateMediaInlineFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi) {
23
+ var _pluginInjectionApi$a, _pluginInjectionApi$w;
24
+ var editorAnalyticsAPI = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a === void 0 ? void 0 : _pluginInjectionApi$a.actions;
25
+ var widthPluginState = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$w = pluginInjectionApi.width) === null || _pluginInjectionApi$w === void 0 ? void 0 : _pluginInjectionApi$w.sharedState.currentState();
22
26
  var mediaInline = state.schema.nodes.mediaInline;
23
27
  var mediaType = state.selection instanceof _state.NodeSelection && state.selection.node.attrs.type;
24
- if ((0, _mediaInline.shouldShowInlineImage)(mediaType)) {
25
- return getMediaInlineImageToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI);
28
+ if (mediaPluginState.allowInlineImages && (0, _isType.isImage)(mediaType)) {
29
+ return getMediaInlineImageToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI, widthPluginState);
26
30
  }
27
31
  var items = [{
28
32
  id: 'editor.media.view.switcher',
@@ -95,12 +99,41 @@ var generateMediaInlineFloatingToolbar = exports.generateMediaInlineFloatingTool
95
99
  }];
96
100
  return items;
97
101
  };
98
- var getMediaInlineImageToolbar = exports.getMediaInlineImageToolbar = function getMediaInlineImageToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI) {
102
+ var getMediaInlineImageToolbar = exports.getMediaInlineImageToolbar = function getMediaInlineImageToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI, widthPluginState) {
99
103
  var mediaInline = state.schema.nodes.mediaInline;
104
+ var mediaInlineImageTitle = intl.formatMessage(_messages.mediaAndEmbedToolbarMessages.changeToMediaInlineImage);
105
+ var mediaSingleTitle = intl.formatMessage(_messages.mediaAndEmbedToolbarMessages.changeToMediaSingle);
100
106
  // if type is image, return inline image floating toolbar items
101
107
  var inlineImageItems = [
102
108
  // TODO: border marks, media single switcher, link, alt text, etc
103
109
  {
110
+ id: 'editor.media.convert.mediainline',
111
+ type: 'button',
112
+ title: mediaInlineImageTitle,
113
+ icon: function icon() {
114
+ return /*#__PURE__*/_react.default.createElement(_card.IconInline, {
115
+ size: "medium",
116
+ label: mediaInlineImageTitle
117
+ });
118
+ },
119
+ onClick: function onClick() {
120
+ return true;
121
+ },
122
+ selected: true
123
+ }, {
124
+ id: 'editor.media.convert.mediasingle',
125
+ type: 'button',
126
+ title: mediaSingleTitle,
127
+ icon: function icon() {
128
+ return /*#__PURE__*/_react.default.createElement(_card.IconEmbed, {
129
+ size: "medium",
130
+ label: mediaSingleTitle
131
+ });
132
+ },
133
+ onClick: (0, _commands.changeMediaInlineToMediaSingle)(editorAnalyticsAPI, widthPluginState)
134
+ }, {
135
+ type: 'separator'
136
+ }, {
104
137
  type: 'copy-button',
105
138
  items: [{
106
139
  state: state,
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.isVideo = exports.isImage = void 0;
7
- var isImage = exports.isImage = function isImage(fileType) {
8
- return !!fileType && (fileType.indexOf('image/') > -1 || fileType.indexOf('video/') > -1);
7
+ var isImage = exports.isImage = function isImage(type) {
8
+ return !!type && (type.indexOf('image/') > -1 || type.indexOf('video/') > -1 || type === 'image');
9
9
  };
10
10
  var isVideo = exports.isVideo = function isVideo(fileType) {
11
11
  return !!fileType && fileType.includes('video/');
@@ -10,7 +10,6 @@ var _selection = require("@atlaskit/editor-common/selection");
10
10
  var _utils = require("@atlaskit/editor-common/utils");
11
11
  var _model = require("@atlaskit/editor-prosemirror/model");
12
12
  var _utils2 = require("@atlaskit/editor-prosemirror/utils");
13
- var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
14
13
  var _isType = require("./is-type");
15
14
  var _mediaCommon = require("./media-common");
16
15
  var canInsertMediaInline = exports.canInsertMediaInline = function canInsertMediaInline(state) {
@@ -77,10 +76,11 @@ function shouldAppendParagraph(state, node) {
77
76
  * Create a new media inline to insert the new media.
78
77
  * @param view Editor view
79
78
  * @param mediaState Media file to be added to the editor
79
+ * @param allowInlineImages Configuration for allowing adding of inline images
80
80
  * @param collection Collection for the media to be added
81
81
  */
82
82
  var insertMediaInlineNode = exports.insertMediaInlineNode = function insertMediaInlineNode(editorAnalyticsAPI) {
83
- return function (view, mediaState, collection, inputMethod) {
83
+ return function (view, mediaState, collection, allowInlineImages, inputMethod) {
84
84
  var state = view.state,
85
85
  dispatch = view.dispatch;
86
86
  var schema = state.schema,
@@ -99,9 +99,7 @@ var insertMediaInlineNode = exports.insertMediaInlineNode = function insertMedia
99
99
  id: id,
100
100
  collection: collection
101
101
  };
102
- if (
103
- // TODO: replace it with new shouldShowInlineImage
104
- (0, _platformFeatureFlags.getBooleanFF)('platform.editor.media.inline-image.base-support') && (0, _isType.isImage)(mediaState.fileMimeType)) {
102
+ if (allowInlineImages && (0, _isType.isImage)(mediaState.fileMimeType)) {
105
103
  var _ref = dimensions || {
106
104
  width: undefined,
107
105
  height: undefined
@@ -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.insertMediaSingleNode = exports.insertMediaAsMediaSingle = exports.createMediaSingleNode = void 0;
7
+ exports.insertMediaSingleNode = exports.insertMediaAsMediaSingle = exports.createMediaSingleNode = exports.changeFromMediaInlineToMediaSingleNode = void 0;
8
8
  exports.isCaptionNode = isCaptionNode;
9
9
  exports.isVideo = exports.isMediaSingle = void 0;
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
@@ -86,6 +86,13 @@ var insertMediaAsMediaSingle = exports.insertMediaAsMediaSingle = function inser
86
86
  };
87
87
  return insertNodesWithOptionalParagraph(nodes, analyticsAttributes, editorAnalyticsAPI)(state, dispatch);
88
88
  };
89
+ var getFileExtension = function getFileExtension(fileName) {
90
+ if (fileName) {
91
+ var extensionIdx = fileName.lastIndexOf('.');
92
+ return extensionIdx >= 0 ? fileName.substring(extensionIdx + 1) : undefined;
93
+ }
94
+ return undefined;
95
+ };
89
96
  var insertMediaSingleNode = exports.insertMediaSingleNode = function insertMediaSingleNode(view, mediaState, inputMethod, collection, alignLeftOnInsert, newInsertionBehaviour, widthPluginState, editorAnalyticsAPI) {
90
97
  var _state$selection$$fro;
91
98
  if (collection === undefined) {
@@ -132,6 +139,46 @@ var insertMediaSingleNode = exports.insertMediaSingleNode = function insertMedia
132
139
  }
133
140
  return true;
134
141
  };
142
+ var changeFromMediaInlineToMediaSingleNode = exports.changeFromMediaInlineToMediaSingleNode = function changeFromMediaInlineToMediaSingleNode(view, fromNode, widthPluginState, editorAnalyticsAPI) {
143
+ var _state$selection$$fro2;
144
+ var state = view.state,
145
+ dispatch = view.dispatch;
146
+ var mediaInline = state.schema.nodes.mediaInline;
147
+ if (fromNode.type !== mediaInline) {
148
+ return false;
149
+ }
150
+ var grandParentNodeType = (_state$selection$$fro2 = state.selection.$from.node(-1)) === null || _state$selection$$fro2 === void 0 ? void 0 : _state$selection$$fro2.type;
151
+ var parentNodeType = state.selection.$from.parent.type;
152
+
153
+ // add undefined as fallback as we don't want media single width to have upper limit as 0
154
+ // if widthPluginState.width is 0, default 760 will be used
155
+ var contentWidth = (0, _mediaSingle.getMaxWidthForNestedNodeNext)(view, state.selection.$from.pos, true) || (widthPluginState === null || widthPluginState === void 0 ? void 0 : widthPluginState.lineLength) || (widthPluginState === null || widthPluginState === void 0 ? void 0 : widthPluginState.width) || undefined;
156
+ var node = replaceWithMediaSingleNode(state.schema, contentWidth, _mediaSingle.MEDIA_SINGLE_DEFAULT_MIN_PIXEL_WIDTH)(fromNode);
157
+ var fileExtension = getFileExtension(fromNode.attrs.__fileName);
158
+ // should split if media is valid content for the grandparent of the selected node
159
+ // and the parent node is a paragraph
160
+ if ((0, _insert.shouldSplitSelectedNodeOnNodeInsertion)({
161
+ parentNodeType: parentNodeType,
162
+ grandParentNodeType: grandParentNodeType,
163
+ content: node
164
+ })) {
165
+ return insertNodesWithOptionalParagraph([node], {
166
+ fileExtension: fileExtension
167
+ }, editorAnalyticsAPI)(state, dispatch);
168
+ } else {
169
+ var nodePos = state.tr.doc.resolve(state.selection.from).end();
170
+ var tr = null;
171
+ tr = (0, _utils2.removeSelectedNode)(state.tr);
172
+ tr = (0, _insert.safeInsert)(node, nodePos)(tr);
173
+ if (!tr) {
174
+ var content = shouldAddParagraph(view.state) ? _model.Fragment.fromArray([node, state.schema.nodes.paragraph.create()]) : node;
175
+ tr = (0, _utils2.safeInsert)(content, undefined, true)(state.tr);
176
+ }
177
+ // TODO: add analytics specifically for change mediaInline to mediaSingle later
178
+ dispatch(tr);
179
+ }
180
+ return true;
181
+ };
135
182
  var createMediaSingleNode = exports.createMediaSingleNode = function createMediaSingleNode(schema, collection, maxWidth, minWidth, alignLeftOnInsert) {
136
183
  return function (mediaState) {
137
184
  var id = mediaState.id,
@@ -172,6 +219,22 @@ var createMediaSingleNode = exports.createMediaSingleNode = function createMedia
172
219
  return mediaSingle.createChecked(extendedMediaSingleAttrs, mediaNode);
173
220
  };
174
221
  };
222
+ var replaceWithMediaSingleNode = function replaceWithMediaSingleNode(schema, maxWidth, minWidth) {
223
+ return function (mediaNode) {
224
+ var width = mediaNode.attrs.width;
225
+ var _schema$nodes2 = schema.nodes,
226
+ media = _schema$nodes2.media,
227
+ mediaSingle = _schema$nodes2.mediaSingle;
228
+ var copiedMediaNode = media.create(_objectSpread(_objectSpread({}, mediaNode.attrs), {}, {
229
+ type: 'file'
230
+ }), mediaNode.content, mediaNode.marks);
231
+ var extendedMediaSingleAttrs = (0, _platformFeatureFlags.getBooleanFF)('platform.editor.media.extended-resize-experience') ? {
232
+ width: (0, _mediaSingle.getMediaSingleInitialWidth)(width, maxWidth, minWidth),
233
+ widthType: 'pixel'
234
+ } : {};
235
+ return mediaSingle.createChecked(extendedMediaSingleAttrs, copiedMediaNode);
236
+ };
237
+ };
175
238
  function isCaptionNode(editorView) {
176
239
  var $from = editorView.state.selection.$from;
177
240
  var immediateWrapperParentNode = editorView.state.doc.nodeAt($from.before(Math.max($from.depth, 1)));
@@ -1,11 +1,12 @@
1
1
  import React, { useEffect, useState } from 'react';
2
2
  import { useSharedPluginState } from '@atlaskit/editor-common/hooks';
3
- import { MediaInlineImageCard, shouldShowInlineImage } from '@atlaskit/editor-common/media-inline';
3
+ import { MediaInlineImageCard } from '@atlaskit/editor-common/media-inline';
4
4
  import { WithProviders } from '@atlaskit/editor-common/provider-factory';
5
5
  import { SelectionBasedNodeView } from '@atlaskit/editor-common/selection-based-node-view';
6
6
  import { MediaInlineCard } from '@atlaskit/media-card';
7
7
  import { getMediaClient } from '@atlaskit/media-client-react';
8
8
  import { MediaInlineCardLoadingView } from '@atlaskit/media-ui';
9
+ import { isImage } from '../utils/is-type';
9
10
  import { MediaNodeUpdater } from './mediaNodeUpdater';
10
11
  import { MediaInlineNodeSelector } from './styles';
11
12
  export const createMediaNodeUpdater = props => {
@@ -110,7 +111,10 @@ export const MediaInline = props => {
110
111
  isSelected: false
111
112
  });
112
113
  }
113
- if (shouldShowInlineImage(type)) {
114
+ const {
115
+ allowInlineImages
116
+ } = props.mediaPluginState;
117
+ if (allowInlineImages && isImage(type)) {
114
118
  return /*#__PURE__*/React.createElement(MediaInlineImageCard, {
115
119
  mediaClient: getMediaClient(viewMediaClientConfig),
116
120
  identifier: identifier,
@@ -175,7 +175,7 @@ export class MediaPluginStateImplementation {
175
175
  }
176
176
  switch (getMediaNodeInsertionType(state, (_this$mediaOptions2 = this.mediaOptions) === null || _this$mediaOptions2 === void 0 ? void 0 : _this$mediaOptions2.featureFlags, mediaStateWithContext.fileMimeType)) {
177
177
  case 'inline':
178
- insertMediaInlineNode(editorAnalyticsAPI)(this.view, mediaStateWithContext, collection, this.getInputMethod(pickerType));
178
+ insertMediaInlineNode(editorAnalyticsAPI)(this.view, mediaStateWithContext, collection, this.allowInlineImages, this.getInputMethod(pickerType));
179
179
  break;
180
180
  case 'block':
181
181
  // read width state right before inserting to get up-to-date and define values
@@ -4,6 +4,7 @@ import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
4
4
  import { isNodeSelection, removeSelectedNode, safeInsert } from '@atlaskit/editor-prosemirror/utils';
5
5
  import { getMediaInputResizeAnalyticsEvent } from '../utils/analytics';
6
6
  import { currentMediaNodeWithPos } from '../utils/current-media-node';
7
+ import { changeFromMediaInlineToMediaSingleNode } from '../utils/media-single';
7
8
  import { getSelectedMediaSingle, removeMediaGroupNode } from './utils';
8
9
  export const DEFAULT_BORDER_COLOR = '#091e4224';
9
10
  export const DEFAULT_BORDER_SIZE = 2;
@@ -82,6 +83,19 @@ export const changeMediaCardToInline = editorAnalyticsAPI => (state, dispatch) =
82
83
  }
83
84
  return true;
84
85
  };
86
+ export const changeMediaInlineToMediaSingle = (editorAnalyticsAPI, widthPluginState) => (state, dispatch, view) => {
87
+ const {
88
+ mediaInline
89
+ } = state.schema.nodes;
90
+ const selectedNode = state.selection instanceof NodeSelection && state.selection.node.type === mediaInline && state.selection.node;
91
+ if (!selectedNode) {
92
+ return false;
93
+ }
94
+ if (view) {
95
+ return changeFromMediaInlineToMediaSingleNode(view, selectedNode, widthPluginState, editorAnalyticsAPI);
96
+ }
97
+ return true;
98
+ };
85
99
  export const removeInlineCard = (state, dispatch) => {
86
100
  if (isNodeSelection(state.selection)) {
87
101
  if (dispatch) {
@@ -477,13 +477,12 @@ export const floatingToolbar = (state, intl, options = {}, pluginInjectionApi) =
477
477
  };
478
478
  items = generateMediaCardFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : (_pluginInjectionApi$a7 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a7 === void 0 ? void 0 : _pluginInjectionApi$a7.actions);
479
479
  } else if (allowMediaInline && selectedNodeType && selectedNodeType === mediaInline) {
480
- var _pluginInjectionApi$a8;
481
480
  baseToolbar.getDomRef = () => {
482
481
  var _mediaPluginState$ele2;
483
482
  const element = (_mediaPluginState$ele2 = mediaPluginState.element) === null || _mediaPluginState$ele2 === void 0 ? void 0 : _mediaPluginState$ele2.querySelector(`.${MediaInlineNodeSelector}`);
484
483
  return element || mediaPluginState.element;
485
484
  };
486
- items = generateMediaInlineFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : (_pluginInjectionApi$a8 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a8 === void 0 ? void 0 : _pluginInjectionApi$a8.actions);
485
+ items = generateMediaInlineFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi);
487
486
  } else {
488
487
  baseToolbar.getDomRef = () => {
489
488
  var _mediaPluginState$ele3;
@@ -1,20 +1,24 @@
1
1
  import React from 'react';
2
- import { shouldShowInlineImage } from '@atlaskit/editor-common/media-inline';
3
- import commonMessages, { cardMessages } from '@atlaskit/editor-common/messages';
2
+ import { IconEmbed, IconInline } from '@atlaskit/editor-common/card';
3
+ import commonMessages, { cardMessages, mediaAndEmbedToolbarMessages } from '@atlaskit/editor-common/messages';
4
4
  import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
5
5
  import DownloadIcon from '@atlaskit/icon/glyph/download';
6
6
  import RemoveIcon from '@atlaskit/icon/glyph/editor/remove';
7
7
  import { messages } from '@atlaskit/media-ui';
8
- import { changeInlineToMediaCard, removeInlineCard } from './commands';
8
+ import { isImage } from '../utils/is-type';
9
+ import { changeInlineToMediaCard, changeMediaInlineToMediaSingle, removeInlineCard } from './commands';
9
10
  import { FilePreviewItem } from './filePreviewItem';
10
11
  import { downloadMedia } from './utils';
11
- export const generateMediaInlineFloatingToolbar = (state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI) => {
12
+ export const generateMediaInlineFloatingToolbar = (state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi) => {
13
+ var _pluginInjectionApi$a, _pluginInjectionApi$w;
14
+ const editorAnalyticsAPI = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : (_pluginInjectionApi$a = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a === void 0 ? void 0 : _pluginInjectionApi$a.actions;
15
+ const widthPluginState = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : (_pluginInjectionApi$w = pluginInjectionApi.width) === null || _pluginInjectionApi$w === void 0 ? void 0 : _pluginInjectionApi$w.sharedState.currentState();
12
16
  const {
13
17
  mediaInline
14
18
  } = state.schema.nodes;
15
19
  const mediaType = state.selection instanceof NodeSelection && state.selection.node.attrs.type;
16
- if (shouldShowInlineImage(mediaType)) {
17
- return getMediaInlineImageToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI);
20
+ if (mediaPluginState.allowInlineImages && isImage(mediaType)) {
21
+ return getMediaInlineImageToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI, widthPluginState);
18
22
  }
19
23
  const items = [{
20
24
  id: 'editor.media.view.switcher',
@@ -87,14 +91,39 @@ export const generateMediaInlineFloatingToolbar = (state, intl, mediaPluginState
87
91
  }];
88
92
  return items;
89
93
  };
90
- export const getMediaInlineImageToolbar = (state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI) => {
94
+ export const getMediaInlineImageToolbar = (state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI, widthPluginState) => {
91
95
  const {
92
96
  mediaInline
93
97
  } = state.schema.nodes;
98
+ const mediaInlineImageTitle = intl.formatMessage(mediaAndEmbedToolbarMessages.changeToMediaInlineImage);
99
+ const mediaSingleTitle = intl.formatMessage(mediaAndEmbedToolbarMessages.changeToMediaSingle);
94
100
  // if type is image, return inline image floating toolbar items
95
101
  const inlineImageItems = [
96
102
  // TODO: border marks, media single switcher, link, alt text, etc
97
103
  {
104
+ id: 'editor.media.convert.mediainline',
105
+ type: 'button',
106
+ title: mediaInlineImageTitle,
107
+ icon: () => /*#__PURE__*/React.createElement(IconInline, {
108
+ size: "medium",
109
+ label: mediaInlineImageTitle
110
+ }),
111
+ onClick: () => {
112
+ return true;
113
+ },
114
+ selected: true
115
+ }, {
116
+ id: 'editor.media.convert.mediasingle',
117
+ type: 'button',
118
+ title: mediaSingleTitle,
119
+ icon: () => /*#__PURE__*/React.createElement(IconEmbed, {
120
+ size: "medium",
121
+ label: mediaSingleTitle
122
+ }),
123
+ onClick: changeMediaInlineToMediaSingle(editorAnalyticsAPI, widthPluginState)
124
+ }, {
125
+ type: 'separator'
126
+ }, {
98
127
  type: 'copy-button',
99
128
  items: [{
100
129
  state,
@@ -1,5 +1,5 @@
1
- export const isImage = fileType => {
2
- return !!fileType && (fileType.indexOf('image/') > -1 || fileType.indexOf('video/') > -1);
1
+ export const isImage = type => {
2
+ return !!type && (type.indexOf('image/') > -1 || type.indexOf('video/') > -1 || type === 'image');
3
3
  };
4
4
  export const isVideo = fileType => {
5
5
  return !!fileType && fileType.includes('video/');
@@ -4,7 +4,6 @@ import { atTheBeginningOfBlock, atTheEndOfBlock, atTheEndOfDoc, endPositionOfPar
4
4
  import { findFarthestParentNode, insideTableCell, isInLayoutColumn, isInListItem, isSupportedInParent, setNodeSelection, setTextSelection } from '@atlaskit/editor-common/utils';
5
5
  import { Fragment } from '@atlaskit/editor-prosemirror/model';
6
6
  import { canInsert, hasParentNode, safeInsert } from '@atlaskit/editor-prosemirror/utils';
7
- import { getBooleanFF } from '@atlaskit/platform-feature-flags';
8
7
  import { isImage } from './is-type';
9
8
  import { copyOptionalAttrsFromMediaState, isInsidePotentialEmptyParagraph, isSelectionNonMediaBlockNode, posOfMediaGroupNearby, posOfParentMediaGroup, posOfPrecedingMediaGroup } from './media-common';
10
9
  export const canInsertMediaInline = state => {
@@ -79,9 +78,10 @@ function shouldAppendParagraph(state, node) {
79
78
  * Create a new media inline to insert the new media.
80
79
  * @param view Editor view
81
80
  * @param mediaState Media file to be added to the editor
81
+ * @param allowInlineImages Configuration for allowing adding of inline images
82
82
  * @param collection Collection for the media to be added
83
83
  */
84
- export const insertMediaInlineNode = editorAnalyticsAPI => (view, mediaState, collection, inputMethod) => {
84
+ export const insertMediaInlineNode = editorAnalyticsAPI => (view, mediaState, collection, allowInlineImages, inputMethod) => {
85
85
  const {
86
86
  state,
87
87
  dispatch
@@ -107,9 +107,7 @@ export const insertMediaInlineNode = editorAnalyticsAPI => (view, mediaState, co
107
107
  id,
108
108
  collection
109
109
  };
110
- if (
111
- // TODO: replace it with new shouldShowInlineImage
112
- getBooleanFF('platform.editor.media.inline-image.base-support') && isImage(mediaState.fileMimeType)) {
110
+ if (allowInlineImages && isImage(mediaState.fileMimeType)) {
113
111
  const {
114
112
  width,
115
113
  height
@@ -5,7 +5,7 @@ import { getMaxWidthForNestedNodeNext, getMediaSingleInitialWidth, MEDIA_SINGLE_
5
5
  import { atTheBeginningOfBlock } from '@atlaskit/editor-common/selection';
6
6
  import { checkNodeDown, isEmptyParagraph } from '@atlaskit/editor-common/utils';
7
7
  import { Fragment, Slice } from '@atlaskit/editor-prosemirror/model';
8
- import { safeInsert as pmSafeInsert } from '@atlaskit/editor-prosemirror/utils';
8
+ import { safeInsert as pmSafeInsert, removeSelectedNode } from '@atlaskit/editor-prosemirror/utils';
9
9
  import { getBooleanFF } from '@atlaskit/platform-feature-flags';
10
10
  import { copyOptionalAttrsFromMediaState } from '../utils/media-common';
11
11
  import { isImage } from './is-type';
@@ -77,6 +77,13 @@ export const insertMediaAsMediaSingle = (view, node, inputMethod, editorAnalytic
77
77
  };
78
78
  return insertNodesWithOptionalParagraph(nodes, analyticsAttributes, editorAnalyticsAPI)(state, dispatch);
79
79
  };
80
+ const getFileExtension = fileName => {
81
+ if (fileName) {
82
+ const extensionIdx = fileName.lastIndexOf('.');
83
+ return extensionIdx >= 0 ? fileName.substring(extensionIdx + 1) : undefined;
84
+ }
85
+ return undefined;
86
+ };
80
87
  export const insertMediaSingleNode = (view, mediaState, inputMethod, collection, alignLeftOnInsert, newInsertionBehaviour, widthPluginState, editorAnalyticsAPI) => {
81
88
  var _state$selection$$fro;
82
89
  if (collection === undefined) {
@@ -125,6 +132,50 @@ export const insertMediaSingleNode = (view, mediaState, inputMethod, collection,
125
132
  }
126
133
  return true;
127
134
  };
135
+ export const changeFromMediaInlineToMediaSingleNode = (view, fromNode, widthPluginState, editorAnalyticsAPI) => {
136
+ var _state$selection$$fro2;
137
+ const {
138
+ state,
139
+ dispatch
140
+ } = view;
141
+ const {
142
+ mediaInline
143
+ } = state.schema.nodes;
144
+ if (fromNode.type !== mediaInline) {
145
+ return false;
146
+ }
147
+ const grandParentNodeType = (_state$selection$$fro2 = state.selection.$from.node(-1)) === null || _state$selection$$fro2 === void 0 ? void 0 : _state$selection$$fro2.type;
148
+ const parentNodeType = state.selection.$from.parent.type;
149
+
150
+ // add undefined as fallback as we don't want media single width to have upper limit as 0
151
+ // if widthPluginState.width is 0, default 760 will be used
152
+ const contentWidth = getMaxWidthForNestedNodeNext(view, state.selection.$from.pos, true) || (widthPluginState === null || widthPluginState === void 0 ? void 0 : widthPluginState.lineLength) || (widthPluginState === null || widthPluginState === void 0 ? void 0 : widthPluginState.width) || undefined;
153
+ const node = replaceWithMediaSingleNode(state.schema, contentWidth, MEDIA_SINGLE_DEFAULT_MIN_PIXEL_WIDTH)(fromNode);
154
+ const fileExtension = getFileExtension(fromNode.attrs.__fileName);
155
+ // should split if media is valid content for the grandparent of the selected node
156
+ // and the parent node is a paragraph
157
+ if (shouldSplitSelectedNodeOnNodeInsertion({
158
+ parentNodeType,
159
+ grandParentNodeType,
160
+ content: node
161
+ })) {
162
+ return insertNodesWithOptionalParagraph([node], {
163
+ fileExtension
164
+ }, editorAnalyticsAPI)(state, dispatch);
165
+ } else {
166
+ const nodePos = state.tr.doc.resolve(state.selection.from).end();
167
+ let tr = null;
168
+ tr = removeSelectedNode(state.tr);
169
+ tr = safeInsert(node, nodePos)(tr);
170
+ if (!tr) {
171
+ const content = shouldAddParagraph(view.state) ? Fragment.fromArray([node, state.schema.nodes.paragraph.create()]) : node;
172
+ tr = pmSafeInsert(content, undefined, true)(state.tr);
173
+ }
174
+ // TODO: add analytics specifically for change mediaInline to mediaSingle later
175
+ dispatch(tr);
176
+ }
177
+ return true;
178
+ };
128
179
  export const createMediaSingleNode = (schema, collection, maxWidth, minWidth, alignLeftOnInsert) => mediaState => {
129
180
  const {
130
181
  id,
@@ -168,6 +219,24 @@ export const createMediaSingleNode = (schema, collection, maxWidth, minWidth, al
168
219
  copyOptionalAttrsFromMediaState(mediaState, mediaNode);
169
220
  return mediaSingle.createChecked(extendedMediaSingleAttrs, mediaNode);
170
221
  };
222
+ const replaceWithMediaSingleNode = (schema, maxWidth, minWidth) => mediaNode => {
223
+ const {
224
+ width
225
+ } = mediaNode.attrs;
226
+ const {
227
+ media,
228
+ mediaSingle
229
+ } = schema.nodes;
230
+ const copiedMediaNode = media.create({
231
+ ...mediaNode.attrs,
232
+ type: 'file'
233
+ }, mediaNode.content, mediaNode.marks);
234
+ const extendedMediaSingleAttrs = getBooleanFF('platform.editor.media.extended-resize-experience') ? {
235
+ width: getMediaSingleInitialWidth(width, maxWidth, minWidth),
236
+ widthType: 'pixel'
237
+ } : {};
238
+ return mediaSingle.createChecked(extendedMediaSingleAttrs, copiedMediaNode);
239
+ };
171
240
  export function isCaptionNode(editorView) {
172
241
  const {
173
242
  $from
@@ -14,12 +14,13 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
14
14
  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; }
15
15
  import React, { useEffect, useState } from 'react';
16
16
  import { useSharedPluginState } from '@atlaskit/editor-common/hooks';
17
- import { MediaInlineImageCard, shouldShowInlineImage } from '@atlaskit/editor-common/media-inline';
17
+ import { MediaInlineImageCard } from '@atlaskit/editor-common/media-inline';
18
18
  import { WithProviders } from '@atlaskit/editor-common/provider-factory';
19
19
  import { SelectionBasedNodeView } from '@atlaskit/editor-common/selection-based-node-view';
20
20
  import { MediaInlineCard } from '@atlaskit/media-card';
21
21
  import { getMediaClient } from '@atlaskit/media-client-react';
22
22
  import { MediaInlineCardLoadingView } from '@atlaskit/media-ui';
23
+ import { isImage } from '../utils/is-type';
23
24
  import { MediaNodeUpdater } from './mediaNodeUpdater';
24
25
  import { MediaInlineNodeSelector } from './styles';
25
26
  export var createMediaNodeUpdater = function createMediaNodeUpdater(props) {
@@ -173,7 +174,8 @@ export var MediaInline = function MediaInline(props) {
173
174
  isSelected: false
174
175
  });
175
176
  }
176
- if (shouldShowInlineImage(type)) {
177
+ var allowInlineImages = props.mediaPluginState.allowInlineImages;
178
+ if (allowInlineImages && isImage(type)) {
177
179
  return /*#__PURE__*/React.createElement(MediaInlineImageCard, {
178
180
  mediaClient: getMediaClient(viewMediaClientConfig),
179
181
  identifier: identifier,
@@ -229,7 +229,7 @@ export var MediaPluginStateImplementation = /*#__PURE__*/function () {
229
229
  }
230
230
  switch (getMediaNodeInsertionType(state, (_this$mediaOptions2 = _this.mediaOptions) === null || _this$mediaOptions2 === void 0 ? void 0 : _this$mediaOptions2.featureFlags, mediaStateWithContext.fileMimeType)) {
231
231
  case 'inline':
232
- insertMediaInlineNode(editorAnalyticsAPI)(_this.view, mediaStateWithContext, collection, _this.getInputMethod(pickerType));
232
+ insertMediaInlineNode(editorAnalyticsAPI)(_this.view, mediaStateWithContext, collection, _this.allowInlineImages, _this.getInputMethod(pickerType));
233
233
  break;
234
234
  case 'block':
235
235
  // read width state right before inserting to get up-to-date and define values
@@ -7,6 +7,7 @@ import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
7
7
  import { isNodeSelection, removeSelectedNode, safeInsert } from '@atlaskit/editor-prosemirror/utils';
8
8
  import { getMediaInputResizeAnalyticsEvent } from '../utils/analytics';
9
9
  import { currentMediaNodeWithPos } from '../utils/current-media-node';
10
+ import { changeFromMediaInlineToMediaSingleNode } from '../utils/media-single';
10
11
  import { getSelectedMediaSingle, removeMediaGroupNode } from './utils';
11
12
  export var DEFAULT_BORDER_COLOR = '#091e4224';
12
13
  export var DEFAULT_BORDER_SIZE = 2;
@@ -86,6 +87,19 @@ export var changeMediaCardToInline = function changeMediaCardToInline(editorAnal
86
87
  return true;
87
88
  };
88
89
  };
90
+ export var changeMediaInlineToMediaSingle = function changeMediaInlineToMediaSingle(editorAnalyticsAPI, widthPluginState) {
91
+ return function (state, dispatch, view) {
92
+ var mediaInline = state.schema.nodes.mediaInline;
93
+ var selectedNode = state.selection instanceof NodeSelection && state.selection.node.type === mediaInline && state.selection.node;
94
+ if (!selectedNode) {
95
+ return false;
96
+ }
97
+ if (view) {
98
+ return changeFromMediaInlineToMediaSingleNode(view, selectedNode, widthPluginState, editorAnalyticsAPI);
99
+ }
100
+ return true;
101
+ };
102
+ };
89
103
  export var removeInlineCard = function removeInlineCard(state, dispatch) {
90
104
  if (isNodeSelection(state.selection)) {
91
105
  if (dispatch) {
@@ -460,13 +460,12 @@ export var floatingToolbar = function floatingToolbar(state, intl) {
460
460
  };
461
461
  items = generateMediaCardFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a7 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a7 === void 0 ? void 0 : _pluginInjectionApi$a7.actions);
462
462
  } else if (allowMediaInline && selectedNodeType && selectedNodeType === mediaInline) {
463
- var _pluginInjectionApi$a8;
464
463
  baseToolbar.getDomRef = function () {
465
464
  var _mediaPluginState$ele2;
466
465
  var element = (_mediaPluginState$ele2 = mediaPluginState.element) === null || _mediaPluginState$ele2 === void 0 ? void 0 : _mediaPluginState$ele2.querySelector(".".concat(MediaInlineNodeSelector));
467
466
  return element || mediaPluginState.element;
468
467
  };
469
- items = generateMediaInlineFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a8 = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a8 === void 0 ? void 0 : _pluginInjectionApi$a8.actions);
468
+ items = generateMediaInlineFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi);
470
469
  } else {
471
470
  baseToolbar.getDomRef = function () {
472
471
  var _mediaPluginState$ele3;
@@ -1,18 +1,22 @@
1
1
  import React from 'react';
2
- import { shouldShowInlineImage } from '@atlaskit/editor-common/media-inline';
3
- import commonMessages, { cardMessages } from '@atlaskit/editor-common/messages';
2
+ import { IconEmbed, IconInline } from '@atlaskit/editor-common/card';
3
+ import commonMessages, { cardMessages, mediaAndEmbedToolbarMessages } from '@atlaskit/editor-common/messages';
4
4
  import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
5
5
  import DownloadIcon from '@atlaskit/icon/glyph/download';
6
6
  import RemoveIcon from '@atlaskit/icon/glyph/editor/remove';
7
7
  import { messages } from '@atlaskit/media-ui';
8
- import { changeInlineToMediaCard, removeInlineCard } from './commands';
8
+ import { isImage } from '../utils/is-type';
9
+ import { changeInlineToMediaCard, changeMediaInlineToMediaSingle, removeInlineCard } from './commands';
9
10
  import { FilePreviewItem } from './filePreviewItem';
10
11
  import { downloadMedia } from './utils';
11
- export var generateMediaInlineFloatingToolbar = function generateMediaInlineFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI) {
12
+ export var generateMediaInlineFloatingToolbar = function generateMediaInlineFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi) {
13
+ var _pluginInjectionApi$a, _pluginInjectionApi$w;
14
+ var editorAnalyticsAPI = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a === void 0 ? void 0 : _pluginInjectionApi$a.actions;
15
+ var widthPluginState = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$w = pluginInjectionApi.width) === null || _pluginInjectionApi$w === void 0 ? void 0 : _pluginInjectionApi$w.sharedState.currentState();
12
16
  var mediaInline = state.schema.nodes.mediaInline;
13
17
  var mediaType = state.selection instanceof NodeSelection && state.selection.node.attrs.type;
14
- if (shouldShowInlineImage(mediaType)) {
15
- return getMediaInlineImageToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI);
18
+ if (mediaPluginState.allowInlineImages && isImage(mediaType)) {
19
+ return getMediaInlineImageToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI, widthPluginState);
16
20
  }
17
21
  var items = [{
18
22
  id: 'editor.media.view.switcher',
@@ -85,12 +89,41 @@ export var generateMediaInlineFloatingToolbar = function generateMediaInlineFloa
85
89
  }];
86
90
  return items;
87
91
  };
88
- export var getMediaInlineImageToolbar = function getMediaInlineImageToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI) {
92
+ export var getMediaInlineImageToolbar = function getMediaInlineImageToolbar(state, intl, mediaPluginState, hoverDecoration, editorAnalyticsAPI, widthPluginState) {
89
93
  var mediaInline = state.schema.nodes.mediaInline;
94
+ var mediaInlineImageTitle = intl.formatMessage(mediaAndEmbedToolbarMessages.changeToMediaInlineImage);
95
+ var mediaSingleTitle = intl.formatMessage(mediaAndEmbedToolbarMessages.changeToMediaSingle);
90
96
  // if type is image, return inline image floating toolbar items
91
97
  var inlineImageItems = [
92
98
  // TODO: border marks, media single switcher, link, alt text, etc
93
99
  {
100
+ id: 'editor.media.convert.mediainline',
101
+ type: 'button',
102
+ title: mediaInlineImageTitle,
103
+ icon: function icon() {
104
+ return /*#__PURE__*/React.createElement(IconInline, {
105
+ size: "medium",
106
+ label: mediaInlineImageTitle
107
+ });
108
+ },
109
+ onClick: function onClick() {
110
+ return true;
111
+ },
112
+ selected: true
113
+ }, {
114
+ id: 'editor.media.convert.mediasingle',
115
+ type: 'button',
116
+ title: mediaSingleTitle,
117
+ icon: function icon() {
118
+ return /*#__PURE__*/React.createElement(IconEmbed, {
119
+ size: "medium",
120
+ label: mediaSingleTitle
121
+ });
122
+ },
123
+ onClick: changeMediaInlineToMediaSingle(editorAnalyticsAPI, widthPluginState)
124
+ }, {
125
+ type: 'separator'
126
+ }, {
94
127
  type: 'copy-button',
95
128
  items: [{
96
129
  state: state,
@@ -1,5 +1,5 @@
1
- export var isImage = function isImage(fileType) {
2
- return !!fileType && (fileType.indexOf('image/') > -1 || fileType.indexOf('video/') > -1);
1
+ export var isImage = function isImage(type) {
2
+ return !!type && (type.indexOf('image/') > -1 || type.indexOf('video/') > -1 || type === 'image');
3
3
  };
4
4
  export var isVideo = function isVideo(fileType) {
5
5
  return !!fileType && fileType.includes('video/');
@@ -4,7 +4,6 @@ import { atTheBeginningOfBlock, atTheEndOfBlock, atTheEndOfDoc, endPositionOfPar
4
4
  import { findFarthestParentNode, insideTableCell, isInLayoutColumn, isInListItem, isSupportedInParent, setNodeSelection, setTextSelection } from '@atlaskit/editor-common/utils';
5
5
  import { Fragment } from '@atlaskit/editor-prosemirror/model';
6
6
  import { canInsert, hasParentNode, safeInsert } from '@atlaskit/editor-prosemirror/utils';
7
- import { getBooleanFF } from '@atlaskit/platform-feature-flags';
8
7
  import { isImage } from './is-type';
9
8
  import { copyOptionalAttrsFromMediaState, isInsidePotentialEmptyParagraph, isSelectionNonMediaBlockNode, posOfMediaGroupNearby, posOfParentMediaGroup, posOfPrecedingMediaGroup } from './media-common';
10
9
  export var canInsertMediaInline = function canInsertMediaInline(state) {
@@ -71,10 +70,11 @@ function shouldAppendParagraph(state, node) {
71
70
  * Create a new media inline to insert the new media.
72
71
  * @param view Editor view
73
72
  * @param mediaState Media file to be added to the editor
73
+ * @param allowInlineImages Configuration for allowing adding of inline images
74
74
  * @param collection Collection for the media to be added
75
75
  */
76
76
  export var insertMediaInlineNode = function insertMediaInlineNode(editorAnalyticsAPI) {
77
- return function (view, mediaState, collection, inputMethod) {
77
+ return function (view, mediaState, collection, allowInlineImages, inputMethod) {
78
78
  var state = view.state,
79
79
  dispatch = view.dispatch;
80
80
  var schema = state.schema,
@@ -93,9 +93,7 @@ export var insertMediaInlineNode = function insertMediaInlineNode(editorAnalytic
93
93
  id: id,
94
94
  collection: collection
95
95
  };
96
- if (
97
- // TODO: replace it with new shouldShowInlineImage
98
- getBooleanFF('platform.editor.media.inline-image.base-support') && isImage(mediaState.fileMimeType)) {
96
+ if (allowInlineImages && isImage(mediaState.fileMimeType)) {
99
97
  var _ref = dimensions || {
100
98
  width: undefined,
101
99
  height: undefined
@@ -8,7 +8,7 @@ import { getMaxWidthForNestedNodeNext, getMediaSingleInitialWidth, MEDIA_SINGLE_
8
8
  import { atTheBeginningOfBlock } from '@atlaskit/editor-common/selection';
9
9
  import { checkNodeDown, isEmptyParagraph } from '@atlaskit/editor-common/utils';
10
10
  import { Fragment, Slice } from '@atlaskit/editor-prosemirror/model';
11
- import { safeInsert as pmSafeInsert } from '@atlaskit/editor-prosemirror/utils';
11
+ import { safeInsert as pmSafeInsert, removeSelectedNode } from '@atlaskit/editor-prosemirror/utils';
12
12
  import { getBooleanFF } from '@atlaskit/platform-feature-flags';
13
13
  import { copyOptionalAttrsFromMediaState } from '../utils/media-common';
14
14
  import { isImage } from './is-type';
@@ -77,6 +77,13 @@ export var insertMediaAsMediaSingle = function insertMediaAsMediaSingle(view, no
77
77
  };
78
78
  return insertNodesWithOptionalParagraph(nodes, analyticsAttributes, editorAnalyticsAPI)(state, dispatch);
79
79
  };
80
+ var getFileExtension = function getFileExtension(fileName) {
81
+ if (fileName) {
82
+ var extensionIdx = fileName.lastIndexOf('.');
83
+ return extensionIdx >= 0 ? fileName.substring(extensionIdx + 1) : undefined;
84
+ }
85
+ return undefined;
86
+ };
80
87
  export var insertMediaSingleNode = function insertMediaSingleNode(view, mediaState, inputMethod, collection, alignLeftOnInsert, newInsertionBehaviour, widthPluginState, editorAnalyticsAPI) {
81
88
  var _state$selection$$fro;
82
89
  if (collection === undefined) {
@@ -123,6 +130,46 @@ export var insertMediaSingleNode = function insertMediaSingleNode(view, mediaSta
123
130
  }
124
131
  return true;
125
132
  };
133
+ export var changeFromMediaInlineToMediaSingleNode = function changeFromMediaInlineToMediaSingleNode(view, fromNode, widthPluginState, editorAnalyticsAPI) {
134
+ var _state$selection$$fro2;
135
+ var state = view.state,
136
+ dispatch = view.dispatch;
137
+ var mediaInline = state.schema.nodes.mediaInline;
138
+ if (fromNode.type !== mediaInline) {
139
+ return false;
140
+ }
141
+ var grandParentNodeType = (_state$selection$$fro2 = state.selection.$from.node(-1)) === null || _state$selection$$fro2 === void 0 ? void 0 : _state$selection$$fro2.type;
142
+ var parentNodeType = state.selection.$from.parent.type;
143
+
144
+ // add undefined as fallback as we don't want media single width to have upper limit as 0
145
+ // if widthPluginState.width is 0, default 760 will be used
146
+ var contentWidth = getMaxWidthForNestedNodeNext(view, state.selection.$from.pos, true) || (widthPluginState === null || widthPluginState === void 0 ? void 0 : widthPluginState.lineLength) || (widthPluginState === null || widthPluginState === void 0 ? void 0 : widthPluginState.width) || undefined;
147
+ var node = replaceWithMediaSingleNode(state.schema, contentWidth, MEDIA_SINGLE_DEFAULT_MIN_PIXEL_WIDTH)(fromNode);
148
+ var fileExtension = getFileExtension(fromNode.attrs.__fileName);
149
+ // should split if media is valid content for the grandparent of the selected node
150
+ // and the parent node is a paragraph
151
+ if (shouldSplitSelectedNodeOnNodeInsertion({
152
+ parentNodeType: parentNodeType,
153
+ grandParentNodeType: grandParentNodeType,
154
+ content: node
155
+ })) {
156
+ return insertNodesWithOptionalParagraph([node], {
157
+ fileExtension: fileExtension
158
+ }, editorAnalyticsAPI)(state, dispatch);
159
+ } else {
160
+ var nodePos = state.tr.doc.resolve(state.selection.from).end();
161
+ var tr = null;
162
+ tr = removeSelectedNode(state.tr);
163
+ tr = safeInsert(node, nodePos)(tr);
164
+ if (!tr) {
165
+ var content = shouldAddParagraph(view.state) ? Fragment.fromArray([node, state.schema.nodes.paragraph.create()]) : node;
166
+ tr = pmSafeInsert(content, undefined, true)(state.tr);
167
+ }
168
+ // TODO: add analytics specifically for change mediaInline to mediaSingle later
169
+ dispatch(tr);
170
+ }
171
+ return true;
172
+ };
126
173
  export var createMediaSingleNode = function createMediaSingleNode(schema, collection, maxWidth, minWidth, alignLeftOnInsert) {
127
174
  return function (mediaState) {
128
175
  var id = mediaState.id,
@@ -163,6 +210,22 @@ export var createMediaSingleNode = function createMediaSingleNode(schema, collec
163
210
  return mediaSingle.createChecked(extendedMediaSingleAttrs, mediaNode);
164
211
  };
165
212
  };
213
+ var replaceWithMediaSingleNode = function replaceWithMediaSingleNode(schema, maxWidth, minWidth) {
214
+ return function (mediaNode) {
215
+ var width = mediaNode.attrs.width;
216
+ var _schema$nodes2 = schema.nodes,
217
+ media = _schema$nodes2.media,
218
+ mediaSingle = _schema$nodes2.mediaSingle;
219
+ var copiedMediaNode = media.create(_objectSpread(_objectSpread({}, mediaNode.attrs), {}, {
220
+ type: 'file'
221
+ }), mediaNode.content, mediaNode.marks);
222
+ var extendedMediaSingleAttrs = getBooleanFF('platform.editor.media.extended-resize-experience') ? {
223
+ width: getMediaSingleInitialWidth(width, maxWidth, minWidth),
224
+ widthType: 'pixel'
225
+ } : {};
226
+ return mediaSingle.createChecked(extendedMediaSingleAttrs, copiedMediaNode);
227
+ };
228
+ };
166
229
  export function isCaptionNode(editorView) {
167
230
  var $from = editorView.state.selection.$from;
168
231
  var immediateWrapperParentNode = editorView.state.doc.nodeAt($from.before(Math.max($from.depth, 1)));
@@ -34,6 +34,7 @@ export interface MediaPluginState {
34
34
  isResizing: boolean;
35
35
  resizingWidth: number;
36
36
  currentMaxWidth?: number;
37
+ allowInlineImages?: boolean;
37
38
  dispatch?: Dispatch;
38
39
  onContextIdentifierProvider: (_name: string, provider?: Promise<ContextIdentifierProvider>) => Promise<void>;
39
40
  setMediaProvider: (mediaProvider?: Promise<MediaProvider>) => Promise<void>;
@@ -1,12 +1,14 @@
1
1
  import type { BorderMarkAttributes, RichMediaLayout } from '@atlaskit/adf-schema';
2
2
  import type { EditorAnalyticsAPI } from '@atlaskit/editor-common/analytics';
3
3
  import type { Command } from '@atlaskit/editor-common/types';
4
+ import type { WidthPluginState } from '@atlaskit/editor-plugin-width';
4
5
  import type { EventInput } from '../pm-plugins/types';
5
6
  import type { PixelEntryValidation } from '../ui/PixelEntry/types';
6
7
  export declare const DEFAULT_BORDER_COLOR = "#091e4224";
7
8
  export declare const DEFAULT_BORDER_SIZE = 2;
8
9
  export declare const changeInlineToMediaCard: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
9
10
  export declare const changeMediaCardToInline: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
11
+ export declare const changeMediaInlineToMediaSingle: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined, widthPluginState: WidthPluginState | undefined) => Command;
10
12
  export declare const removeInlineCard: Command;
11
13
  export declare const toggleBorderMark: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
12
14
  export declare const setBorderMark: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (attrs: Partial<BorderMarkAttributes>) => Command;
@@ -1,8 +1,10 @@
1
1
  import type { IntlShape } from 'react-intl-next';
2
2
  import type { EditorAnalyticsAPI } from '@atlaskit/editor-common/analytics';
3
- import type { Command, FloatingToolbarItem } from '@atlaskit/editor-common/types';
3
+ import type { Command, ExtractInjectionAPI, FloatingToolbarItem } from '@atlaskit/editor-common/types';
4
4
  import type { HoverDecorationHandler } from '@atlaskit/editor-plugin-decorations';
5
+ import type { WidthPluginState } from '@atlaskit/editor-plugin-width';
5
6
  import type { EditorState } from '@atlaskit/editor-prosemirror/state';
7
+ import type { MediaNextEditorPluginType } from '../next-plugin-type';
6
8
  import type { MediaPluginState } from '../pm-plugins/types';
7
- export declare const generateMediaInlineFloatingToolbar: (state: EditorState, intl: IntlShape, mediaPluginState: MediaPluginState, hoverDecoration: HoverDecorationHandler | undefined, editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => FloatingToolbarItem<Command>[];
8
- export declare const getMediaInlineImageToolbar: (state: EditorState, intl: IntlShape, mediaPluginState: MediaPluginState, hoverDecoration: HoverDecorationHandler | undefined, editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => FloatingToolbarItem<Command>[];
9
+ export declare const generateMediaInlineFloatingToolbar: (state: EditorState, intl: IntlShape, mediaPluginState: MediaPluginState, hoverDecoration: HoverDecorationHandler | undefined, pluginInjectionApi: ExtractInjectionAPI<MediaNextEditorPluginType> | undefined) => FloatingToolbarItem<Command>[];
10
+ export declare const getMediaInlineImageToolbar: (state: EditorState, intl: IntlShape, mediaPluginState: MediaPluginState, hoverDecoration: HoverDecorationHandler | undefined, editorAnalyticsAPI: EditorAnalyticsAPI | undefined, widthPluginState: WidthPluginState | undefined) => FloatingToolbarItem<Command>[];
@@ -1,2 +1,2 @@
1
- export declare const isImage: (fileType?: string) => boolean;
1
+ export declare const isImage: (type?: string) => boolean;
2
2
  export declare const isVideo: (fileType?: string) => boolean;
@@ -11,9 +11,10 @@ export declare const canInsertMediaInline: (state: EditorState) => boolean;
11
11
  * Create a new media inline to insert the new media.
12
12
  * @param view Editor view
13
13
  * @param mediaState Media file to be added to the editor
14
+ * @param allowInlineImages Configuration for allowing adding of inline images
14
15
  * @param collection Collection for the media to be added
15
16
  */
16
- export declare const insertMediaInlineNode: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (view: EditorView, mediaState: MediaState, collection: string, inputMethod?: InputMethodInsertMedia) => boolean;
17
+ export declare const insertMediaInlineNode: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (view: EditorView, mediaState: MediaState, collection: string, allowInlineImages: boolean, inputMethod?: InputMethodInsertMedia) => boolean;
17
18
  /**
18
19
  * Insert a media into an existing media group
19
20
  * or create a new media group to insert the new media.
@@ -15,6 +15,7 @@ export declare const isMediaSingle: (schema: Schema, fileMimeType?: string) => b
15
15
  export type InsertMediaAsMediaSingle = (view: EditorView, node: PMNode, inputMethod: InputMethodInsertMedia) => boolean;
16
16
  export declare const insertMediaAsMediaSingle: (view: EditorView, node: PMNode, inputMethod: InputMethodInsertMedia, editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => boolean;
17
17
  export declare const insertMediaSingleNode: (view: EditorView, mediaState: MediaState, inputMethod?: InputMethodInsertMedia, collection?: string, alignLeftOnInsert?: boolean, newInsertionBehaviour?: boolean, widthPluginState?: WidthPluginState | undefined, editorAnalyticsAPI?: EditorAnalyticsAPI | undefined) => boolean;
18
+ export declare const changeFromMediaInlineToMediaSingleNode: (view: EditorView, fromNode: PMNode, widthPluginState?: WidthPluginState | undefined, editorAnalyticsAPI?: EditorAnalyticsAPI | undefined) => boolean;
18
19
  export declare const createMediaSingleNode: (schema: Schema, collection: string, maxWidth?: number, minWidth?: number, alignLeftOnInsert?: boolean) => (mediaState: MediaSingleState) => PMNode;
19
20
  export declare function isCaptionNode(editorView: EditorView): boolean;
20
21
  export declare const isVideo: import("memoize-one").MemoizedFn<(fileType?: string) => boolean>;
@@ -34,6 +34,7 @@ export interface MediaPluginState {
34
34
  isResizing: boolean;
35
35
  resizingWidth: number;
36
36
  currentMaxWidth?: number;
37
+ allowInlineImages?: boolean;
37
38
  dispatch?: Dispatch;
38
39
  onContextIdentifierProvider: (_name: string, provider?: Promise<ContextIdentifierProvider>) => Promise<void>;
39
40
  setMediaProvider: (mediaProvider?: Promise<MediaProvider>) => Promise<void>;
@@ -1,12 +1,14 @@
1
1
  import type { BorderMarkAttributes, RichMediaLayout } from '@atlaskit/adf-schema';
2
2
  import type { EditorAnalyticsAPI } from '@atlaskit/editor-common/analytics';
3
3
  import type { Command } from '@atlaskit/editor-common/types';
4
+ import type { WidthPluginState } from '@atlaskit/editor-plugin-width';
4
5
  import type { EventInput } from '../pm-plugins/types';
5
6
  import type { PixelEntryValidation } from '../ui/PixelEntry/types';
6
7
  export declare const DEFAULT_BORDER_COLOR = "#091e4224";
7
8
  export declare const DEFAULT_BORDER_SIZE = 2;
8
9
  export declare const changeInlineToMediaCard: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
9
10
  export declare const changeMediaCardToInline: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
11
+ export declare const changeMediaInlineToMediaSingle: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined, widthPluginState: WidthPluginState | undefined) => Command;
10
12
  export declare const removeInlineCard: Command;
11
13
  export declare const toggleBorderMark: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
12
14
  export declare const setBorderMark: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (attrs: Partial<BorderMarkAttributes>) => Command;
@@ -1,8 +1,10 @@
1
1
  import type { IntlShape } from 'react-intl-next';
2
2
  import type { EditorAnalyticsAPI } from '@atlaskit/editor-common/analytics';
3
- import type { Command, FloatingToolbarItem } from '@atlaskit/editor-common/types';
3
+ import type { Command, ExtractInjectionAPI, FloatingToolbarItem } from '@atlaskit/editor-common/types';
4
4
  import type { HoverDecorationHandler } from '@atlaskit/editor-plugin-decorations';
5
+ import type { WidthPluginState } from '@atlaskit/editor-plugin-width';
5
6
  import type { EditorState } from '@atlaskit/editor-prosemirror/state';
7
+ import type { MediaNextEditorPluginType } from '../next-plugin-type';
6
8
  import type { MediaPluginState } from '../pm-plugins/types';
7
- export declare const generateMediaInlineFloatingToolbar: (state: EditorState, intl: IntlShape, mediaPluginState: MediaPluginState, hoverDecoration: HoverDecorationHandler | undefined, editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => FloatingToolbarItem<Command>[];
8
- export declare const getMediaInlineImageToolbar: (state: EditorState, intl: IntlShape, mediaPluginState: MediaPluginState, hoverDecoration: HoverDecorationHandler | undefined, editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => FloatingToolbarItem<Command>[];
9
+ export declare const generateMediaInlineFloatingToolbar: (state: EditorState, intl: IntlShape, mediaPluginState: MediaPluginState, hoverDecoration: HoverDecorationHandler | undefined, pluginInjectionApi: ExtractInjectionAPI<MediaNextEditorPluginType> | undefined) => FloatingToolbarItem<Command>[];
10
+ export declare const getMediaInlineImageToolbar: (state: EditorState, intl: IntlShape, mediaPluginState: MediaPluginState, hoverDecoration: HoverDecorationHandler | undefined, editorAnalyticsAPI: EditorAnalyticsAPI | undefined, widthPluginState: WidthPluginState | undefined) => FloatingToolbarItem<Command>[];
@@ -1,2 +1,2 @@
1
- export declare const isImage: (fileType?: string) => boolean;
1
+ export declare const isImage: (type?: string) => boolean;
2
2
  export declare const isVideo: (fileType?: string) => boolean;
@@ -11,9 +11,10 @@ export declare const canInsertMediaInline: (state: EditorState) => boolean;
11
11
  * Create a new media inline to insert the new media.
12
12
  * @param view Editor view
13
13
  * @param mediaState Media file to be added to the editor
14
+ * @param allowInlineImages Configuration for allowing adding of inline images
14
15
  * @param collection Collection for the media to be added
15
16
  */
16
- export declare const insertMediaInlineNode: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (view: EditorView, mediaState: MediaState, collection: string, inputMethod?: InputMethodInsertMedia) => boolean;
17
+ export declare const insertMediaInlineNode: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (view: EditorView, mediaState: MediaState, collection: string, allowInlineImages: boolean, inputMethod?: InputMethodInsertMedia) => boolean;
17
18
  /**
18
19
  * Insert a media into an existing media group
19
20
  * or create a new media group to insert the new media.
@@ -15,6 +15,7 @@ export declare const isMediaSingle: (schema: Schema, fileMimeType?: string) => b
15
15
  export type InsertMediaAsMediaSingle = (view: EditorView, node: PMNode, inputMethod: InputMethodInsertMedia) => boolean;
16
16
  export declare const insertMediaAsMediaSingle: (view: EditorView, node: PMNode, inputMethod: InputMethodInsertMedia, editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => boolean;
17
17
  export declare const insertMediaSingleNode: (view: EditorView, mediaState: MediaState, inputMethod?: InputMethodInsertMedia, collection?: string, alignLeftOnInsert?: boolean, newInsertionBehaviour?: boolean, widthPluginState?: WidthPluginState | undefined, editorAnalyticsAPI?: EditorAnalyticsAPI | undefined) => boolean;
18
+ export declare const changeFromMediaInlineToMediaSingleNode: (view: EditorView, fromNode: PMNode, widthPluginState?: WidthPluginState | undefined, editorAnalyticsAPI?: EditorAnalyticsAPI | undefined) => boolean;
18
19
  export declare const createMediaSingleNode: (schema: Schema, collection: string, maxWidth?: number, minWidth?: number, alignLeftOnInsert?: boolean) => (mediaState: MediaSingleState) => PMNode;
19
20
  export declare function isCaptionNode(editorView: EditorView): boolean;
20
21
  export declare const isVideo: import("memoize-one").MemoizedFn<(fileType?: string) => boolean>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-media",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
4
4
  "description": "Media plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -53,7 +53,7 @@
53
53
  "@atlaskit/editor-tables": "^2.3.0",
54
54
  "@atlaskit/form": "^9.0.0",
55
55
  "@atlaskit/icon": "^22.0.0",
56
- "@atlaskit/media-card": "^77.4.0",
56
+ "@atlaskit/media-card": "^77.5.0",
57
57
  "@atlaskit/media-client": "^25.1.0",
58
58
  "@atlaskit/media-client-react": "^2.0.0",
59
59
  "@atlaskit/media-common": "^11.0.0",