@atlaskit/editor-plugin-media 8.6.1 → 8.7.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.
Files changed (42) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/cjs/mediaPlugin.js +76 -43
  3. package/dist/cjs/pm-plugins/actions.js +3 -1
  4. package/dist/cjs/pm-plugins/commands.js +23 -1
  5. package/dist/cjs/pm-plugins/main.js +16 -0
  6. package/dist/cjs/ui/CaptionPlaceholder/index.js +2 -2
  7. package/dist/cjs/ui/ImageEditor/ModalWrapper.js +69 -0
  8. package/dist/cjs/ui/ImageEditor/index.js +62 -0
  9. package/dist/cjs/ui/toolbar/index.js +24 -11
  10. package/dist/es2019/mediaPlugin.js +38 -3
  11. package/dist/es2019/pm-plugins/actions.js +3 -1
  12. package/dist/es2019/pm-plugins/commands.js +22 -0
  13. package/dist/es2019/pm-plugins/main.js +14 -0
  14. package/dist/es2019/ui/CaptionPlaceholder/index.js +2 -2
  15. package/dist/es2019/ui/ImageEditor/ModalWrapper.js +58 -0
  16. package/dist/es2019/ui/ImageEditor/index.js +53 -0
  17. package/dist/es2019/ui/toolbar/index.js +20 -6
  18. package/dist/esm/mediaPlugin.js +77 -44
  19. package/dist/esm/pm-plugins/actions.js +3 -1
  20. package/dist/esm/pm-plugins/commands.js +22 -0
  21. package/dist/esm/pm-plugins/main.js +16 -0
  22. package/dist/esm/ui/CaptionPlaceholder/index.js +2 -2
  23. package/dist/esm/ui/ImageEditor/ModalWrapper.js +60 -0
  24. package/dist/esm/ui/ImageEditor/index.js +52 -0
  25. package/dist/esm/ui/toolbar/index.js +23 -10
  26. package/dist/types/mediaPluginType.d.ts +2 -0
  27. package/dist/types/pm-plugins/actions.d.ts +2 -0
  28. package/dist/types/pm-plugins/commands.d.ts +2 -0
  29. package/dist/types/pm-plugins/main.d.ts +4 -1
  30. package/dist/types/pm-plugins/types.d.ts +3 -0
  31. package/dist/types/ui/ImageEditor/ModalWrapper.d.ts +13 -0
  32. package/dist/types/ui/ImageEditor/index.d.ts +12 -0
  33. package/dist/types/ui/toolbar/index.d.ts +4 -0
  34. package/dist/types-ts4.5/mediaPluginType.d.ts +2 -0
  35. package/dist/types-ts4.5/pm-plugins/actions.d.ts +2 -0
  36. package/dist/types-ts4.5/pm-plugins/commands.d.ts +2 -0
  37. package/dist/types-ts4.5/pm-plugins/main.d.ts +4 -1
  38. package/dist/types-ts4.5/pm-plugins/types.d.ts +3 -0
  39. package/dist/types-ts4.5/ui/ImageEditor/ModalWrapper.d.ts +13 -0
  40. package/dist/types-ts4.5/ui/ImageEditor/index.d.ts +12 -0
  41. package/dist/types-ts4.5/ui/toolbar/index.d.ts +4 -0
  42. package/package.json +3 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @atlaskit/editor-plugin-media
2
2
 
3
+ ## 8.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`79b6f0fef0ecb`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/79b6f0fef0ecb) -
8
+ Added a modal upon clicking the image editing button
9
+
10
+ ### Patch Changes
11
+
12
+ - [`53aef9589ca55`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/53aef9589ca55) -
13
+ [EDITOR-3786] Make sure that for any check of `cc_editor_ai_content_mode` &&
14
+ `platform_editor_content_mode_button_mvp` in the code we are also checking
15
+ `confluence_compact_text_format`
16
+ - Updated dependencies
17
+
3
18
  ## 8.6.1
4
19
 
5
20
  ### Patch Changes
@@ -14,6 +14,7 @@ var _toolbarFlagCheck = require("@atlaskit/editor-common/toolbar-flag-check");
14
14
  var _state = require("@atlaskit/editor-prosemirror/state");
15
15
  var _mediaCommon = require("@atlaskit/media-common");
16
16
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
17
+ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
17
18
  var _lazyMedia = require("./nodeviews/lazy-media");
18
19
  var _lazyMediaGroup = require("./nodeviews/lazy-media-group");
19
20
  var _lazyMediaInline = require("./nodeviews/lazy-media-inline");
@@ -34,6 +35,7 @@ var _pixelResizing = require("./pm-plugins/pixel-resizing");
34
35
  var _pluginKey = require("./pm-plugins/plugin-key");
35
36
  var _mediaCommon2 = require("./pm-plugins/utils/media-common");
36
37
  var _mediaSingle2 = require("./pm-plugins/utils/media-single");
38
+ var _ModalWrapper = require("./ui/ImageEditor/ModalWrapper");
37
39
  var _MediaPicker = require("./ui/MediaPicker");
38
40
  var _PortalWrapper = require("./ui/MediaViewer/PortalWrapper");
39
41
  var _toolbar = require("./ui/toolbar");
@@ -104,10 +106,36 @@ var MediaViewerFunctionalComponent = function MediaViewerFunctionalComponent(_re
104
106
  items: mediaItems
105
107
  });
106
108
  };
107
- var mediaPlugin = exports.mediaPlugin = function mediaPlugin(_ref3) {
108
- var _ref3$config = _ref3.config,
109
- options = _ref3$config === void 0 ? {} : _ref3$config,
110
- api = _ref3.api;
109
+ var imageEditorStateSelector = function imageEditorStateSelector(states) {
110
+ var _states$mediaState6, _states$mediaState7, _states$mediaState8;
111
+ return {
112
+ isImageEditorVisible: (_states$mediaState6 = states.mediaState) === null || _states$mediaState6 === void 0 ? void 0 : _states$mediaState6.isImageEditorVisible,
113
+ imageEditorSelectedMedia: (_states$mediaState7 = states.mediaState) === null || _states$mediaState7 === void 0 ? void 0 : _states$mediaState7.imageEditorSelectedMedia,
114
+ mediaClientConfig: (_states$mediaState8 = states.mediaState) === null || _states$mediaState8 === void 0 ? void 0 : _states$mediaState8.mediaClientConfig
115
+ };
116
+ };
117
+ var ImageEditorFunctionalComponent = function ImageEditorFunctionalComponent(_ref3) {
118
+ var api = _ref3.api;
119
+ var _useSharedPluginState3 = (0, _hooks.useSharedPluginStateWithSelector)(api, ['media'], imageEditorStateSelector),
120
+ isImageEditorVisible = _useSharedPluginState3.isImageEditorVisible,
121
+ imageEditorSelectedMedia = _useSharedPluginState3.imageEditorSelectedMedia,
122
+ mediaClientConfig = _useSharedPluginState3.mediaClientConfig;
123
+ if (!isImageEditorVisible || !imageEditorSelectedMedia || !mediaClientConfig) {
124
+ return null;
125
+ }
126
+ var handleOnClose = function handleOnClose() {
127
+ api === null || api === void 0 || api.core.actions.execute(api === null || api === void 0 ? void 0 : api.media.commands.hideImageEditor);
128
+ };
129
+ return /*#__PURE__*/_react.default.createElement(_ModalWrapper.RenderImageEditor, {
130
+ mediaClientConfig: mediaClientConfig,
131
+ onClose: handleOnClose,
132
+ selectedNodeAttrs: imageEditorSelectedMedia
133
+ });
134
+ };
135
+ var mediaPlugin = exports.mediaPlugin = function mediaPlugin(_ref4) {
136
+ var _ref4$config = _ref4.config,
137
+ options = _ref4$config === void 0 ? {} : _ref4$config,
138
+ api = _ref4.api;
111
139
  var previousMediaProvider;
112
140
  var mediaErrorLocalIds = new Set();
113
141
  return {
@@ -148,8 +176,8 @@ var mediaPlugin = exports.mediaPlugin = function mediaPlugin(_ref3) {
148
176
  return false;
149
177
  }
150
178
  previousMediaProvider = provider;
151
- return (_api$core$actions$exe = api === null || api === void 0 ? void 0 : api.core.actions.execute(function (_ref4) {
152
- var tr = _ref4.tr;
179
+ return (_api$core$actions$exe = api === null || api === void 0 ? void 0 : api.core.actions.execute(function (_ref5) {
180
+ var tr = _ref5.tr;
153
181
  return tr.setMeta(_pluginKey.stateKey, {
154
182
  mediaProvider: provider
155
183
  });
@@ -159,19 +187,21 @@ var mediaPlugin = exports.mediaPlugin = function mediaPlugin(_ref3) {
159
187
  commands: {
160
188
  showMediaViewer: _commands.showMediaViewer,
161
189
  hideMediaViewer: _commands.hideMediaViewer,
162
- trackMediaPaste: _commands.trackMediaPaste
190
+ trackMediaPaste: _commands.trackMediaPaste,
191
+ showImageEditor: _commands.showImageEditor,
192
+ hideImageEditor: _commands.hideImageEditor
163
193
  },
164
194
  nodes: function nodes() {
165
- var _ref5 = options || {},
166
- _ref5$allowMediaGroup = _ref5.allowMediaGroup,
167
- allowMediaGroup = _ref5$allowMediaGroup === void 0 ? true : _ref5$allowMediaGroup,
168
- _ref5$allowMediaSingl = _ref5.allowMediaSingle,
169
- allowMediaSingle = _ref5$allowMediaSingl === void 0 ? false : _ref5$allowMediaSingl,
170
- _ref5$allowPixelResiz = _ref5.allowPixelResizing,
171
- allowPixelResizing = _ref5$allowPixelResiz === void 0 ? false : _ref5$allowPixelResiz,
172
- allowCaptions = _ref5.allowCaptions,
173
- allowMediaInlineImages = _ref5.allowMediaInlineImages,
174
- mediaFeatureFlags = _ref5.featureFlags;
195
+ var _ref6 = options || {},
196
+ _ref6$allowMediaGroup = _ref6.allowMediaGroup,
197
+ allowMediaGroup = _ref6$allowMediaGroup === void 0 ? true : _ref6$allowMediaGroup,
198
+ _ref6$allowMediaSingl = _ref6.allowMediaSingle,
199
+ allowMediaSingle = _ref6$allowMediaSingl === void 0 ? false : _ref6$allowMediaSingl,
200
+ _ref6$allowPixelResiz = _ref6.allowPixelResizing,
201
+ allowPixelResizing = _ref6$allowPixelResiz === void 0 ? false : _ref6$allowPixelResiz,
202
+ allowCaptions = _ref6.allowCaptions,
203
+ allowMediaInlineImages = _ref6.allowMediaInlineImages,
204
+ mediaFeatureFlags = _ref6.featureFlags;
175
205
  var allowMediaInline = (0, _platformFeatureFlags.fg)('platform_editor_remove_media_inline_feature_flag') ? allowMediaInlineImages : (0, _mediaCommon.getMediaFeatureFlag)('mediaInline', mediaFeatureFlags);
176
206
  var mediaSingleOption = {
177
207
  withCaption: allowCaptions,
@@ -205,16 +235,16 @@ var mediaPlugin = exports.mediaPlugin = function mediaPlugin(_ref3) {
205
235
  pmPlugins: function pmPlugins() {
206
236
  var pmPlugins = [{
207
237
  name: 'media',
208
- plugin: function plugin(_ref6) {
209
- var schema = _ref6.schema,
210
- dispatch = _ref6.dispatch,
211
- getIntl = _ref6.getIntl,
212
- eventDispatcher = _ref6.eventDispatcher,
213
- providerFactory = _ref6.providerFactory,
214
- errorReporter = _ref6.errorReporter,
215
- portalProviderAPI = _ref6.portalProviderAPI,
216
- dispatchAnalyticsEvent = _ref6.dispatchAnalyticsEvent,
217
- nodeViewPortalProviderAPI = _ref6.nodeViewPortalProviderAPI;
238
+ plugin: function plugin(_ref7) {
239
+ var schema = _ref7.schema,
240
+ dispatch = _ref7.dispatch,
241
+ getIntl = _ref7.getIntl,
242
+ eventDispatcher = _ref7.eventDispatcher,
243
+ providerFactory = _ref7.providerFactory,
244
+ errorReporter = _ref7.errorReporter,
245
+ portalProviderAPI = _ref7.portalProviderAPI,
246
+ dispatchAnalyticsEvent = _ref7.dispatchAnalyticsEvent,
247
+ nodeViewPortalProviderAPI = _ref7.nodeViewPortalProviderAPI;
218
248
  return (0, _main.createPlugin)(schema, {
219
249
  providerFactory: providerFactory,
220
250
  nodeViews: {
@@ -233,17 +263,17 @@ var mediaPlugin = exports.mediaPlugin = function mediaPlugin(_ref3) {
233
263
  }
234
264
  }, {
235
265
  name: 'mediaKeymap',
236
- plugin: function plugin(_ref7) {
266
+ plugin: function plugin(_ref8) {
237
267
  var _api$analytics3, _api$selection;
238
- var getIntl = _ref7.getIntl;
268
+ var getIntl = _ref8.getIntl;
239
269
  return (0, _keymap2.default)(options, api === null || api === void 0 || (_api$analytics3 = api.analytics) === null || _api$analytics3 === void 0 ? void 0 : _api$analytics3.actions, api === null || api === void 0 || (_api$selection = api.selection) === null || _api$selection === void 0 ? void 0 : _api$selection.actions, api === null || api === void 0 ? void 0 : api.width, getIntl);
240
270
  }
241
271
  }];
242
272
  if (options && options.allowMediaSingle) {
243
273
  pmPlugins.push({
244
274
  name: 'mediaSingleKeymap',
245
- plugin: function plugin(_ref8) {
246
- var schema = _ref8.schema;
275
+ plugin: function plugin(_ref9) {
276
+ var schema = _ref9.schema;
247
277
  return (0, _keymapMedia.default)(schema);
248
278
  }
249
279
  });
@@ -255,9 +285,9 @@ var mediaPlugin = exports.mediaPlugin = function mediaPlugin(_ref3) {
255
285
  });
256
286
  pmPlugins.push({
257
287
  name: 'mediaAltTextKeymap',
258
- plugin: function plugin(_ref9) {
288
+ plugin: function plugin(_ref0) {
259
289
  var _api$analytics4;
260
- var schema = _ref9.schema;
290
+ var schema = _ref0.schema;
261
291
  return (0, _keymap.default)(schema, api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 ? void 0 : _api$analytics4.actions);
262
292
  }
263
293
  });
@@ -265,15 +295,15 @@ var mediaPlugin = exports.mediaPlugin = function mediaPlugin(_ref3) {
265
295
  if (options && options.allowLinking) {
266
296
  pmPlugins.push({
267
297
  name: 'mediaLinking',
268
- plugin: function plugin(_ref0) {
269
- var dispatch = _ref0.dispatch;
298
+ plugin: function plugin(_ref1) {
299
+ var dispatch = _ref1.dispatch;
270
300
  return (0, _linking.default)(dispatch);
271
301
  }
272
302
  });
273
303
  pmPlugins.push({
274
304
  name: 'mediaLinkingKeymap',
275
- plugin: function plugin(_ref1) {
276
- var schema = _ref1.schema;
305
+ plugin: function plugin(_ref10) {
306
+ var schema = _ref10.schema;
277
307
  return (0, _keymap3.default)(schema);
278
308
  }
279
309
  });
@@ -315,13 +345,16 @@ var mediaPlugin = exports.mediaPlugin = function mediaPlugin(_ref3) {
315
345
  });
316
346
  return pmPlugins;
317
347
  },
318
- contentComponent: function contentComponent(_ref10) {
319
- var editorView = _ref10.editorView,
320
- appearance = _ref10.appearance;
348
+ contentComponent: function contentComponent(_ref11) {
349
+ var editorView = _ref11.editorView,
350
+ appearance = _ref11.appearance;
321
351
  if (!editorView) {
322
352
  return null;
323
353
  }
324
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(MediaViewerFunctionalComponent, {
354
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (options === null || options === void 0 ? void 0 : options.allowImageEditing) && (0, _expValEquals.expValEquals)('platform_editor_add_image_editing', 'isEnabled', true) && /*#__PURE__*/_react.default.createElement(ImageEditorFunctionalComponent, {
355
+ api: api,
356
+ editorView: editorView
357
+ }), /*#__PURE__*/_react.default.createElement(MediaViewerFunctionalComponent, {
325
358
  api: api,
326
359
  editorView: editorView
327
360
  }), /*#__PURE__*/_react.default.createElement(MediaPickerFunctionalComponent, {
@@ -330,8 +363,8 @@ var mediaPlugin = exports.mediaPlugin = function mediaPlugin(_ref3) {
330
363
  api: api
331
364
  }));
332
365
  },
333
- secondaryToolbarComponent: function secondaryToolbarComponent(_ref11) {
334
- var disabled = _ref11.disabled;
366
+ secondaryToolbarComponent: function secondaryToolbarComponent(_ref12) {
367
+ var disabled = _ref12.disabled;
335
368
  return /*#__PURE__*/_react.default.createElement(_ToolbarMedia.default, {
336
369
  isDisabled: disabled,
337
370
  isReducedSpacing: true,
@@ -7,5 +7,7 @@ exports.ACTIONS = void 0;
7
7
  var ACTIONS = exports.ACTIONS = {
8
8
  SHOW_MEDIA_VIEWER: 'SHOW_MEDIA_VIEWER',
9
9
  HIDE_MEDIA_VIEWER: 'HIDE_MEDIA_VIEWER',
10
- TRACK_MEDIA_PASTE: 'TRACK_MEDIA_PASTE'
10
+ TRACK_MEDIA_PASTE: 'TRACK_MEDIA_PASTE',
11
+ SHOW_IMAGE_EDITOR: 'SHOW_IMAGE_EDITOR',
12
+ HIDE_IMAGE_EDITOR: 'HIDE_IMAGE_EDITOR'
11
13
  };
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.trackMediaPaste = exports.showMediaViewer = exports.hideMediaViewer = void 0;
6
+ exports.trackMediaPaste = exports.showMediaViewer = exports.showImageEditor = exports.hideMediaViewer = exports.hideImageEditor = void 0;
7
7
  var _actions = require("../pm-plugins/actions");
8
8
  var _pluginKey = require("../pm-plugins/plugin-key");
9
9
  var _mediaCommon = require("../pm-plugins/utils/media-common");
@@ -37,4 +37,26 @@ var trackMediaPaste = exports.trackMediaPaste = function trackMediaPaste(attrs)
37
37
  });
38
38
  return tr;
39
39
  };
40
+ };
41
+ var showImageEditor = exports.showImageEditor = function showImageEditor(media) {
42
+ return function (_ref4) {
43
+ var tr = _ref4.tr;
44
+ tr.setMeta(_pluginKey.stateKey, {
45
+ type: _actions.ACTIONS.SHOW_IMAGE_EDITOR,
46
+ imageEditorSelectedMedia: media,
47
+ isImageEditorVisible: true
48
+ });
49
+ tr.setMeta('addToHistory', false);
50
+ return tr;
51
+ };
52
+ };
53
+ var hideImageEditor = exports.hideImageEditor = function hideImageEditor(_ref5) {
54
+ var tr = _ref5.tr;
55
+ tr.setMeta(_pluginKey.stateKey, {
56
+ type: _actions.ACTIONS.HIDE_IMAGE_EDITOR,
57
+ imageEditorSelectedMedia: null,
58
+ isImageEditorVisible: false
59
+ });
60
+ tr.setMeta('addToHistory', false);
61
+ return tr;
40
62
  };
@@ -90,6 +90,7 @@ var MediaPluginStateImplementation = exports.MediaPluginStateImplementation = /*
90
90
  (0, _defineProperty2.default)(this, "allowInlineImages", false);
91
91
  (0, _defineProperty2.default)(this, "uploadInProgressSubscriptions", []);
92
92
  (0, _defineProperty2.default)(this, "uploadInProgressSubscriptionsNotified", false);
93
+ (0, _defineProperty2.default)(this, "isImageEditorVisible", false);
93
94
  // this is only a temporary variable, which gets cleared after the last inserted node has been selected
94
95
  (0, _defineProperty2.default)(this, "lastAddedMediaSingleFileIds", []);
95
96
  (0, _defineProperty2.default)(this, "destroyed", false);
@@ -637,6 +638,11 @@ var MediaPluginStateImplementation = exports.MediaPluginStateImplementation = /*
637
638
  value: function setResizingWidth(width) {
638
639
  this.resizingWidth = width;
639
640
  }
641
+ }, {
642
+ key: "setImageEditorVisibility",
643
+ value: function setImageEditorVisibility(isVisible) {
644
+ this.isImageEditorVisible = isVisible;
645
+ }
640
646
  }, {
641
647
  key: "updateElement",
642
648
  value: function updateElement() {
@@ -878,6 +884,16 @@ var createPlugin = exports.createPlugin = function createPlugin(_schema, options
878
884
  nextPluginState = pluginState.clone();
879
885
  }
880
886
  break;
887
+ case _actions.ACTIONS.SHOW_IMAGE_EDITOR:
888
+ pluginState.imageEditorSelectedMedia = meta.imageEditorSelectedMedia;
889
+ pluginState.isImageEditorVisible = meta.isImageEditorVisible;
890
+ nextPluginState = nextPluginState.clone();
891
+ break;
892
+ case _actions.ACTIONS.HIDE_IMAGE_EDITOR:
893
+ pluginState.imageEditorSelectedMedia = undefined;
894
+ pluginState.isImageEditorVisible = meta.isImageEditorVisible;
895
+ nextPluginState = nextPluginState.clone();
896
+ break;
881
897
  }
882
898
 
883
899
  // NOTE: We're not calling passing new state to the Editor, because we depend on the view.state reference
@@ -55,7 +55,7 @@ var CaptionPlaceholder = exports.CaptionPlaceholder = /*#__PURE__*/_react.defaul
55
55
  // This id is just used for setting styles at the moment, if it's needed for anything more specific
56
56
  // It may need to be generated to avoid overlap
57
57
  ,
58
- id: (0, _expValEquals.expValEquals)('cc_editor_ai_content_mode', 'variant', 'test') && (0, _platformFeatureFlags.fg)('platform_editor_content_mode_button_mvp') ? _mediaSingle.CAPTION_PLACEHOLDER_ID : undefined,
58
+ id: (0, _expValEquals.expValEquals)('confluence_compact_text_format', 'isEnabled', true) || (0, _expValEquals.expValEquals)('cc_editor_ai_content_mode', 'variant', 'test') && (0, _platformFeatureFlags.fg)('platform_editor_content_mode_button_mvp') ? _mediaSingle.CAPTION_PLACEHOLDER_ID : undefined,
59
59
  "data-id": _mediaSingle.CAPTION_PLACEHOLDER_ID,
60
60
  "data-testid": "caption-placeholder"
61
61
  }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage
@@ -83,7 +83,7 @@ var CaptionPlaceholderButton = exports.CaptionPlaceholderButton = /*#__PURE__*/_
83
83
  testId: "caption-placeholder",
84
84
  padding: "space.0",
85
85
  xcss: placeholderButton
86
- }, (0, _expValEquals.expValEquals)('cc_editor_ai_content_mode', 'variant', 'test') && (0, _platformFeatureFlags.fg)('platform_editor_content_mode_button_mvp') ?
86
+ }, (0, _expValEquals.expValEquals)('confluence_compact_text_format', 'isEnabled', true) || (0, _expValEquals.expValEquals)('cc_editor_ai_content_mode', 'variant', 'test') && (0, _platformFeatureFlags.fg)('platform_editor_content_mode_button_mvp') ?
87
87
  // This id is just used for setting styles at the moment, if it's needed for anything more specific
88
88
  // It may need to be generated to avoid overlap
89
89
  // eslint-disable-next-line @atlaskit/design-system/use-primitives-text
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.RenderImageEditor = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _mediaClient = require("@atlaskit/media-client");
12
+ var _utils = require("../toolbar/utils");
13
+ var _index = require("./index");
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
15
+ var RenderImageEditor = exports.RenderImageEditor = function RenderImageEditor(_ref) {
16
+ var mediaClientConfig = _ref.mediaClientConfig,
17
+ onClose = _ref.onClose,
18
+ selectedNodeAttrs = _ref.selectedNodeAttrs,
19
+ errorReporter = _ref.errorReporter,
20
+ onSave = _ref.onSave;
21
+ var _useState = (0, _react.useState)(''),
22
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
23
+ imageUrl = _useState2[0],
24
+ setImageUrl = _useState2[1];
25
+ (0, _react.useEffect)(function () {
26
+ var getImageUrl = function getImageUrl() {
27
+ if ((0, _utils.isExternalMedia)(selectedNodeAttrs)) {
28
+ // External image - use the URL directly
29
+ setImageUrl(selectedNodeAttrs.url || '');
30
+ } else {
31
+ // File media - use MediaClient to get the image URL
32
+ var id = selectedNodeAttrs.id,
33
+ _selectedNodeAttrs$co = selectedNodeAttrs.collection,
34
+ collection = _selectedNodeAttrs$co === void 0 ? '' : _selectedNodeAttrs$co;
35
+ try {
36
+ var mediaClient = new _mediaClient.MediaClient(mediaClientConfig);
37
+
38
+ // Subscribe to file state to get file information
39
+ var subscription = mediaClient.file.getFileState(id, {
40
+ collectionName: collection
41
+ }).subscribe(function (fileState) {
42
+ if (fileState.status === 'processed' || fileState.status === 'processing') {
43
+ // Get the image URL from the processed file
44
+ mediaClient.file.getFileBinaryURL(id, collection).then(function (url) {
45
+ setImageUrl(url);
46
+ });
47
+ }
48
+ });
49
+
50
+ // Cleanup subscription on unmount
51
+ return function () {
52
+ return subscription.unsubscribe();
53
+ };
54
+ } catch (error) {
55
+ if (errorReporter) {
56
+ errorReporter.captureException(error instanceof Error ? error : new Error(String(error)));
57
+ }
58
+ setImageUrl('');
59
+ }
60
+ }
61
+ };
62
+ getImageUrl();
63
+ }, [selectedNodeAttrs, mediaClientConfig, errorReporter]);
64
+ return /*#__PURE__*/_react.default.createElement(_index.ImageEditor, {
65
+ isOpen: true,
66
+ onClose: onClose,
67
+ imageUrl: imageUrl
68
+ });
69
+ };
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ImageEditor = void 0;
9
+ var _react = require("@emotion/react");
10
+ var _reactIntlNext = require("react-intl-next");
11
+ var _new = _interopRequireDefault(require("@atlaskit/button/new"));
12
+ var _modalDialog = _interopRequireWildcard(require("@atlaskit/modal-dialog"));
13
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
14
+ /**
15
+ * @jsxRuntime classic
16
+ * @jsx jsx
17
+ */
18
+
19
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
20
+
21
+ var imageWrapper = (0, _react.css)({
22
+ maxHeight: 'calc(100vh - 250px)',
23
+ width: '100%',
24
+ overflow: 'hidden',
25
+ display: 'flex',
26
+ justifyContent: 'center',
27
+ alignItems: 'center'
28
+ });
29
+ var imageStyle = (0, _react.css)({
30
+ maxWidth: '100%',
31
+ maxHeight: 'calc(100vh - 250px)',
32
+ width: 'auto',
33
+ height: 'auto',
34
+ objectFit: 'contain'
35
+ });
36
+ var ImageEditor = exports.ImageEditor = function ImageEditor(_ref) {
37
+ var isOpen = _ref.isOpen,
38
+ onClose = _ref.onClose,
39
+ imageUrl = _ref.imageUrl;
40
+ return (0, _react.jsx)(_modalDialog.ModalTransition, null, isOpen && (0, _react.jsx)(_modalDialog.default, {
41
+ onClose: onClose,
42
+ width: 1800
43
+ }, (0, _react.jsx)("br", null), (0, _react.jsx)(_modalDialog.ModalBody, null, (0, _react.jsx)("div", {
44
+ css: imageWrapper
45
+ }, imageUrl && (0, _react.jsx)("img", {
46
+ src: imageUrl,
47
+ alt: "Edit preview",
48
+ css: imageStyle
49
+ }))), (0, _react.jsx)(_modalDialog.ModalFooter, null, (0, _react.jsx)(_new.default, {
50
+ appearance: "subtle",
51
+ onClick: onClose
52
+ }, (0, _react.jsx)(_reactIntlNext.FormattedMessage, {
53
+ id: "editor.imageEditor.cancel",
54
+ defaultMessage: "Cancel"
55
+ })), (0, _react.jsx)(_new.default, {
56
+ appearance: "primary",
57
+ onClick: onClose
58
+ }, (0, _react.jsx)(_reactIntlNext.FormattedMessage, {
59
+ id: "editor.imageEditor.done",
60
+ defaultMessage: "Done"
61
+ })))));
62
+ };
@@ -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.overflowDropdwonBtnTriggerTestId = exports.handleShowMediaViewer = exports.floatingToolbar = void 0;
8
+ exports.overflowDropdwonBtnTriggerTestId = exports.handleShowMediaViewer = exports.handleShowImageEditor = exports.floatingToolbar = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
11
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
@@ -121,6 +121,15 @@ var handleShowMediaViewer = exports.handleShowMediaViewer = function handleShowM
121
121
  }
122
122
  api === null || api === void 0 || api.core.actions.execute(api === null || api === void 0 ? void 0 : api.media.commands.showMediaViewer(selectedNodeAttrs));
123
123
  };
124
+ var handleShowImageEditor = exports.handleShowImageEditor = function handleShowImageEditor(_ref2) {
125
+ var api = _ref2.api,
126
+ mediaPluginState = _ref2.mediaPluginState;
127
+ var selectedNodeAttrs = (0, _utils2.getSelectedNearestMediaContainerNodeAttrs)(mediaPluginState);
128
+ if (!selectedNodeAttrs) {
129
+ return false;
130
+ }
131
+ api === null || api === void 0 || api.core.actions.execute(api === null || api === void 0 ? void 0 : api.media.commands.showImageEditor(selectedNodeAttrs));
132
+ };
124
133
  var generateMediaCardFloatingToolbar = function generateMediaCardFloatingToolbar(state, intl, mediaPluginState, hoverDecoration, pluginInjectionApi, editorAnalyticsAPI, forceFocusSelector, isViewOnly) {
125
134
  var _pluginInjectionApi$c;
126
135
  var disableDownloadButton = (0, _utils2.getIsDownloadDisabledByDataSecurityPolicy)(mediaPluginState);
@@ -278,8 +287,8 @@ var generateMediaSingleFloatingToolbar = function generateMediaSingleFloatingToo
278
287
  allowPixelResizing = options.allowPixelResizing,
279
288
  onCommentButtonMount = options.onCommentButtonMount;
280
289
  var toolbarButtons = [];
281
- var _ref2 = (_pluginInjectionApi$d = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$d2 = pluginInjectionApi.decorations) === null || _pluginInjectionApi$d2 === void 0 ? void 0 : _pluginInjectionApi$d2.actions) !== null && _pluginInjectionApi$d !== void 0 ? _pluginInjectionApi$d : {},
282
- hoverDecoration = _ref2.hoverDecoration;
290
+ var _ref3 = (_pluginInjectionApi$d = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$d2 = pluginInjectionApi.decorations) === null || _pluginInjectionApi$d2 === void 0 ? void 0 : _pluginInjectionApi$d2.actions) !== null && _pluginInjectionApi$d !== void 0 ? _pluginInjectionApi$d : {},
291
+ hoverDecoration = _ref3.hoverDecoration;
283
292
  var areAnyNewToolbarFlagsEnabled = (0, _toolbarFlagCheck.areToolbarFlagsEnabled)(Boolean(pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : pluginInjectionApi.toolbar));
284
293
  var disableDownloadButton = (0, _utils2.getIsDownloadDisabledByDataSecurityPolicy)(pluginState);
285
294
  if ((0, _imageBorder.shouldShowImageBorder)(state)) {
@@ -565,9 +574,11 @@ var generateMediaSingleFloatingToolbar = function generateMediaSingleFloatingToo
565
574
  icon: _imageCrop.default,
566
575
  title: intl.formatMessage(_messages.default.imageEdit),
567
576
  onClick: function onClick() {
568
- // TODO: EDITOR-3716 - Implement image editing logic
569
- // console.log('Image editing clicked');
570
- return true;
577
+ var _handleShowImageEdito;
578
+ return (_handleShowImageEdito = handleShowImageEditor({
579
+ api: pluginInjectionApi,
580
+ mediaPluginState: pluginState
581
+ })) !== null && _handleShowImageEdito !== void 0 ? _handleShowImageEdito : false;
571
582
  },
572
583
  supportsViewMode: false
573
584
  });
@@ -723,9 +734,11 @@ var generateMediaSingleFloatingToolbar = function generateMediaSingleFloatingToo
723
734
  icon: _imageCrop.default,
724
735
  title: intl.formatMessage(_messages.default.imageEdit),
725
736
  onClick: function onClick() {
726
- // TODO: EDITOR-3716 - Implement image editing logic
727
- // console.log('Image editing clicked');
728
- return true;
737
+ var _handleShowImageEdito2;
738
+ return (_handleShowImageEdito2 = handleShowImageEditor({
739
+ api: pluginInjectionApi,
740
+ mediaPluginState: pluginState
741
+ })) !== null && _handleShowImageEdito2 !== void 0 ? _handleShowImageEdito2 : false;
729
742
  },
730
743
  supportsViewMode: false
731
744
  }, {
@@ -773,8 +786,8 @@ var floatingToolbar = exports.floatingToolbar = function floatingToolbar(state,
773
786
  allowMediaInline = (0, _platformFeatureFlags.fg)('platform_editor_remove_media_inline_feature_flag') ? allowMediaInlineImages : allowMediaInline;
774
787
  var mediaPluginState = _pluginKey.stateKey.getState(state);
775
788
  var mediaLinkingState = (0, _linking2.getMediaLinkingState)(state);
776
- var _ref3 = (_pluginInjectionApi$d3 = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$d4 = pluginInjectionApi.decorations) === null || _pluginInjectionApi$d4 === void 0 ? void 0 : _pluginInjectionApi$d4.actions) !== null && _pluginInjectionApi$d3 !== void 0 ? _pluginInjectionApi$d3 : {},
777
- hoverDecoration = _ref3.hoverDecoration;
789
+ var _ref4 = (_pluginInjectionApi$d3 = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$d4 = pluginInjectionApi.decorations) === null || _pluginInjectionApi$d4 === void 0 ? void 0 : _pluginInjectionApi$d4.actions) !== null && _pluginInjectionApi$d3 !== void 0 ? _pluginInjectionApi$d3 : {},
790
+ hoverDecoration = _ref4.hoverDecoration;
778
791
  if (!mediaPluginState) {
779
792
  return;
780
793
  }
@@ -6,6 +6,7 @@ import { areToolbarFlagsEnabled } from '@atlaskit/editor-common/toolbar-flag-che
6
6
  import { NodeSelection, PluginKey } from '@atlaskit/editor-prosemirror/state';
7
7
  import { getMediaFeatureFlag } from '@atlaskit/media-common';
8
8
  import { fg } from '@atlaskit/platform-feature-flags';
9
+ import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
9
10
  import { lazyMediaView } from './nodeviews/lazy-media';
10
11
  import { lazyMediaGroupView } from './nodeviews/lazy-media-group';
11
12
  import { lazyMediaInlineView } from './nodeviews/lazy-media-inline';
@@ -16,7 +17,7 @@ import { mediaInlineSpecWithFixedToDOM } from './nodeviews/toDOM-fixes/mediaInli
16
17
  import { mediaSingleSpecWithFixedToDOM } from './nodeviews/toDOM-fixes/mediaSingle';
17
18
  import { createPlugin as createMediaAltTextPlugin } from './pm-plugins/alt-text';
18
19
  import keymapMediaAltTextPlugin from './pm-plugins/alt-text/keymap';
19
- import { hideMediaViewer, showMediaViewer, trackMediaPaste } from './pm-plugins/commands';
20
+ import { hideMediaViewer, showMediaViewer, trackMediaPaste, hideImageEditor, showImageEditor } from './pm-plugins/commands';
20
21
  import keymapPlugin from './pm-plugins/keymap';
21
22
  import keymapMediaSinglePlugin from './pm-plugins/keymap-media';
22
23
  import linkingPlugin from './pm-plugins/linking';
@@ -26,6 +27,7 @@ import { createPlugin as createMediaPixelResizingPlugin } from './pm-plugins/pix
26
27
  import { stateKey } from './pm-plugins/plugin-key';
27
28
  import { createMediaIdentifierArray, extractMediaNodes } from './pm-plugins/utils/media-common';
28
29
  import { insertMediaAsMediaSingle } from './pm-plugins/utils/media-single';
30
+ import { RenderImageEditor } from './ui/ImageEditor/ModalWrapper';
29
31
  import { MediaPickerComponents } from './ui/MediaPicker';
30
32
  import { RenderMediaViewer } from './ui/MediaViewer/PortalWrapper';
31
33
  import { floatingToolbar } from './ui/toolbar';
@@ -99,6 +101,34 @@ const MediaViewerFunctionalComponent = ({
99
101
  items: mediaItems
100
102
  });
101
103
  };
104
+ const imageEditorStateSelector = states => {
105
+ var _states$mediaState6, _states$mediaState7, _states$mediaState8;
106
+ return {
107
+ isImageEditorVisible: (_states$mediaState6 = states.mediaState) === null || _states$mediaState6 === void 0 ? void 0 : _states$mediaState6.isImageEditorVisible,
108
+ imageEditorSelectedMedia: (_states$mediaState7 = states.mediaState) === null || _states$mediaState7 === void 0 ? void 0 : _states$mediaState7.imageEditorSelectedMedia,
109
+ mediaClientConfig: (_states$mediaState8 = states.mediaState) === null || _states$mediaState8 === void 0 ? void 0 : _states$mediaState8.mediaClientConfig
110
+ };
111
+ };
112
+ const ImageEditorFunctionalComponent = ({
113
+ api
114
+ }) => {
115
+ const {
116
+ isImageEditorVisible,
117
+ imageEditorSelectedMedia,
118
+ mediaClientConfig
119
+ } = useSharedPluginStateWithSelector(api, ['media'], imageEditorStateSelector);
120
+ if (!isImageEditorVisible || !imageEditorSelectedMedia || !mediaClientConfig) {
121
+ return null;
122
+ }
123
+ const handleOnClose = () => {
124
+ api === null || api === void 0 ? void 0 : api.core.actions.execute(api === null || api === void 0 ? void 0 : api.media.commands.hideImageEditor);
125
+ };
126
+ return /*#__PURE__*/React.createElement(RenderImageEditor, {
127
+ mediaClientConfig: mediaClientConfig,
128
+ onClose: handleOnClose,
129
+ selectedNodeAttrs: imageEditorSelectedMedia
130
+ });
131
+ };
102
132
  export const mediaPlugin = ({
103
133
  config: options = {},
104
134
  api
@@ -153,7 +183,9 @@ export const mediaPlugin = ({
153
183
  commands: {
154
184
  showMediaViewer,
155
185
  hideMediaViewer,
156
- trackMediaPaste
186
+ trackMediaPaste,
187
+ showImageEditor,
188
+ hideImageEditor
157
189
  },
158
190
  nodes() {
159
191
  const {
@@ -319,7 +351,10 @@ export const mediaPlugin = ({
319
351
  if (!editorView) {
320
352
  return null;
321
353
  }
322
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(MediaViewerFunctionalComponent, {
354
+ return /*#__PURE__*/React.createElement(React.Fragment, null, (options === null || options === void 0 ? void 0 : options.allowImageEditing) && expValEquals('platform_editor_add_image_editing', 'isEnabled', true) && /*#__PURE__*/React.createElement(ImageEditorFunctionalComponent, {
355
+ api: api,
356
+ editorView: editorView
357
+ }), /*#__PURE__*/React.createElement(MediaViewerFunctionalComponent, {
323
358
  api: api,
324
359
  editorView: editorView
325
360
  }), /*#__PURE__*/React.createElement(MediaPickerFunctionalComponent, {
@@ -1,5 +1,7 @@
1
1
  export const ACTIONS = {
2
2
  SHOW_MEDIA_VIEWER: 'SHOW_MEDIA_VIEWER',
3
3
  HIDE_MEDIA_VIEWER: 'HIDE_MEDIA_VIEWER',
4
- TRACK_MEDIA_PASTE: 'TRACK_MEDIA_PASTE'
4
+ TRACK_MEDIA_PASTE: 'TRACK_MEDIA_PASTE',
5
+ SHOW_IMAGE_EDITOR: 'SHOW_IMAGE_EDITOR',
6
+ HIDE_IMAGE_EDITOR: 'HIDE_IMAGE_EDITOR'
5
7
  };