@atlaskit/editor-core 189.3.37 → 189.4.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 (55) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/cjs/plugins/extension/commands.js +9 -2
  3. package/dist/cjs/plugins/extension/index.js +15 -1
  4. package/dist/cjs/plugins/extension/pm-plugins/main.js +2 -1
  5. package/dist/cjs/plugins/extension/toolbar.js +1 -1
  6. package/dist/cjs/plugins/extension/ui/Extension/Extension/index.js +1 -8
  7. package/dist/cjs/plugins/extension/ui/Extension/ExtensionComponent.js +29 -10
  8. package/dist/cjs/plugins/extension/ui/Extension/ExtensionNodeWrapper.js +7 -0
  9. package/dist/cjs/plugins/extension/ui/Extension/MultiBodiedExtension/index.js +154 -0
  10. package/dist/cjs/plugins/extension/utils.js +6 -4
  11. package/dist/cjs/ui/ContentStyles/extension.js +2 -1
  12. package/dist/cjs/version-wrapper.js +1 -1
  13. package/dist/es2019/plugins/extension/commands.js +10 -3
  14. package/dist/es2019/plugins/extension/index.js +16 -2
  15. package/dist/es2019/plugins/extension/pm-plugins/main.js +2 -1
  16. package/dist/es2019/plugins/extension/toolbar.js +1 -1
  17. package/dist/es2019/plugins/extension/ui/Extension/Extension/index.js +1 -8
  18. package/dist/es2019/plugins/extension/ui/Extension/ExtensionComponent.js +29 -10
  19. package/dist/es2019/plugins/extension/ui/Extension/ExtensionNodeWrapper.js +7 -0
  20. package/dist/es2019/plugins/extension/ui/Extension/MultiBodiedExtension/index.js +159 -0
  21. package/dist/es2019/plugins/extension/utils.js +6 -4
  22. package/dist/es2019/ui/ContentStyles/extension.js +6 -0
  23. package/dist/es2019/version-wrapper.js +1 -1
  24. package/dist/esm/plugins/extension/commands.js +9 -2
  25. package/dist/esm/plugins/extension/index.js +16 -2
  26. package/dist/esm/plugins/extension/pm-plugins/main.js +2 -1
  27. package/dist/esm/plugins/extension/toolbar.js +1 -1
  28. package/dist/esm/plugins/extension/ui/Extension/Extension/index.js +1 -8
  29. package/dist/esm/plugins/extension/ui/Extension/ExtensionComponent.js +29 -10
  30. package/dist/esm/plugins/extension/ui/Extension/ExtensionNodeWrapper.js +7 -0
  31. package/dist/esm/plugins/extension/ui/Extension/MultiBodiedExtension/index.js +146 -0
  32. package/dist/esm/plugins/extension/utils.js +6 -4
  33. package/dist/esm/ui/ContentStyles/extension.js +2 -1
  34. package/dist/esm/version-wrapper.js +1 -1
  35. package/dist/types/plugins/avatar-group/index.d.ts +4 -1
  36. package/dist/types/plugins/collab-edit/index.d.ts +5 -2
  37. package/dist/types/plugins/extension/commands.d.ts +2 -0
  38. package/dist/types/plugins/extension/ui/Extension/ExtensionComponent.d.ts +1 -0
  39. package/dist/types/plugins/extension/ui/Extension/ExtensionNodeWrapper.d.ts +7 -0
  40. package/dist/types/plugins/extension/ui/Extension/MultiBodiedExtension/index.d.ts +16 -0
  41. package/dist/types/plugins/find-replace/index.d.ts +4 -1
  42. package/dist/types/plugins/insert-block/types.d.ts +1 -1
  43. package/dist/types/plugins/toolbar-lists-indentation/index.d.ts +1 -1
  44. package/dist/types/presets/default.d.ts +72 -72
  45. package/dist/types-ts4.5/plugins/avatar-group/index.d.ts +1 -1
  46. package/dist/types-ts4.5/plugins/collab-edit/index.d.ts +3 -3
  47. package/dist/types-ts4.5/plugins/extension/commands.d.ts +2 -0
  48. package/dist/types-ts4.5/plugins/extension/ui/Extension/ExtensionComponent.d.ts +1 -0
  49. package/dist/types-ts4.5/plugins/extension/ui/Extension/ExtensionNodeWrapper.d.ts +7 -0
  50. package/dist/types-ts4.5/plugins/extension/ui/Extension/MultiBodiedExtension/index.d.ts +16 -0
  51. package/dist/types-ts4.5/plugins/find-replace/index.d.ts +1 -1
  52. package/dist/types-ts4.5/plugins/insert-block/types.d.ts +1 -1
  53. package/dist/types-ts4.5/plugins/toolbar-lists-indentation/index.d.ts +1 -1
  54. package/dist/types-ts4.5/presets/default.d.ts +72 -72
  55. package/package.json +6 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # @atlaskit/editor-core
2
2
 
3
+ ## 189.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#43569](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/43569) [`8c40410ca78`](https://bitbucket.org/atlassian/atlassian-frontend/commits/8c40410ca78) - ED-20043: MultiBodied Extension changes
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+
13
+ ## 189.3.38
14
+
15
+ ### Patch Changes
16
+
17
+ - [#43646](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/43646) [`d43f8e9402f`](https://bitbucket.org/atlassian/atlassian-frontend/commits/d43f8e9402f) - Make feature flags plugin optional in all plugins including:
18
+
19
+ - analytics
20
+ - base
21
+ - card
22
+ - code-block
23
+ - expand
24
+ - extension
25
+ - floating-toolbar
26
+ - hyperlink
27
+ - insert-block
28
+ - layout
29
+ - layout
30
+ - list
31
+ - media
32
+ - paste
33
+ - rule
34
+ - table
35
+ - tasks-and-decisions
36
+
37
+ We already treat it as optional in the plugins, so this is just ensuring that the plugin is not mandatory to be added to the preset.
38
+
3
39
  ## 189.3.37
4
40
 
5
41
  ### Patch Changes
@@ -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.removeExtension = exports.removeDescendantNodes = exports.forceAutoSave = exports.clearEditingContext = void 0;
7
+ exports.removeExtension = exports.removeDescendantNodes = exports.forceAutoSave = exports.clearEditingContext = exports.checkAndRemoveExtensionNode = void 0;
8
8
  exports.setEditingContextToContextPanel = setEditingContextToContextPanel;
9
9
  exports.updateExtensionLayout = void 0;
10
10
  exports.updateState = updateState;
@@ -83,7 +83,7 @@ var removeExtension = exports.removeExtension = function removeExtension() {
83
83
  if ((0, _utils2.getSelectedExtension)(state)) {
84
84
  return (0, _utils.removeSelectedNode)(tr);
85
85
  } else {
86
- return (0, _utils.removeParentNodeOfType)(state.schema.nodes.bodiedExtension)(tr);
86
+ return checkAndRemoveExtensionNode(state, tr);
87
87
  }
88
88
  });
89
89
  };
@@ -96,4 +96,11 @@ var removeDescendantNodes = exports.removeDescendantNodes = function removeDesce
96
96
  }, function (tr, state) {
97
97
  return sourceNode ? (0, _utils3.removeConnectedNodes)(state, sourceNode) : tr;
98
98
  });
99
+ };
100
+ var checkAndRemoveExtensionNode = exports.checkAndRemoveExtensionNode = function checkAndRemoveExtensionNode(state, tr) {
101
+ var nodeType = state.schema.nodes.bodiedExtension;
102
+ if ((0, _utils.findParentNodeOfType)(state.schema.nodes.multiBodiedExtension)(state.selection)) {
103
+ nodeType = state.schema.nodes.multiBodiedExtension;
104
+ }
105
+ return (0, _utils.removeParentNodeOfType)(nodeType)(tr);
99
106
  };
@@ -16,6 +16,7 @@ var _toolbar = require("./toolbar");
16
16
  var _contextPanel = require("./context-panel");
17
17
  var _extensionApi = require("./extension-api");
18
18
  var _actions2 = require("./actions");
19
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
19
20
  var extensionPlugin = function extensionPlugin(_ref) {
20
21
  var _api$featureFlags, _api$analytics2, _api$analytics3, _api$contextPanel3, _api$analytics4, _api$contextPanel4;
21
22
  var _ref$config = _ref.config,
@@ -30,7 +31,7 @@ var extensionPlugin = function extensionPlugin(_ref) {
30
31
  return {
31
32
  name: 'extension',
32
33
  nodes: function nodes() {
33
- return [{
34
+ var extensionNodes = [{
34
35
  name: 'extension',
35
36
  node: _adfSchema.extension
36
37
  }, {
@@ -40,6 +41,19 @@ var extensionPlugin = function extensionPlugin(_ref) {
40
41
  name: 'inlineExtension',
41
42
  node: _adfSchema.inlineExtension
42
43
  }];
44
+
45
+ // Revert to returning all nodes without local variable, once FF is removed
46
+ if ((0, _platformFeatureFlags.getBooleanFF)('platform.editor.multi-bodied-extension_0rygg')) {
47
+ extensionNodes.push({
48
+ name: 'extensionFrame',
49
+ node: _adfSchema.extensionFrame
50
+ });
51
+ extensionNodes.push({
52
+ name: 'multiBodiedExtension',
53
+ node: _adfSchema.multiBodiedExtension
54
+ });
55
+ }
56
+ return extensionNodes;
43
57
  },
44
58
  pmPlugins: function pmPlugins() {
45
59
  return [{
@@ -310,7 +310,8 @@ var createPlugin = exports.createPlugin = function createPlugin(dispatch, provid
310
310
  // WARNING: referentiality-plugin also creates these nodeviews
311
311
  bodiedExtension: (0, _extension.default)(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi),
312
312
  // WARNING: referentiality-plugin also creates these nodeviews
313
- inlineExtension: (0, _extension.default)(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi)
313
+ inlineExtension: (0, _extension.default)(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi),
314
+ multiBodiedExtension: (0, _extension.default)(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi)
314
315
  },
315
316
  handleClickOn: (0, _selection.createSelectionClickHandler)(['extension', 'bodiedExtension'], function (target) {
316
317
  return !target.closest('.extension-content');
@@ -128,7 +128,7 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig(_ref
128
128
  var formatMessage = intl.formatMessage;
129
129
  var extensionState = (0, _main.getPluginState)(state);
130
130
  if (extensionState && !extensionState.showContextPanel && extensionState.element) {
131
- var nodeType = [state.schema.nodes.extension, state.schema.nodes.inlineExtension, state.schema.nodes.bodiedExtension];
131
+ var nodeType = [state.schema.nodes.extension, state.schema.nodes.inlineExtension, state.schema.nodes.bodiedExtension, state.schema.nodes.multiBodiedExtension];
132
132
  var editButtonArray = editButton(formatMessage, extensionState, applyChangeToContextPanel, editorAnalyticsAPI);
133
133
  var breakoutButtonArray = breakoutOptions(state, formatMessage, extensionState, breakoutEnabled);
134
134
  var extensionObj = (0, _utils2.getSelectedExtension)(state, true);
@@ -17,7 +17,6 @@ var _styles2 = require("../styles");
17
17
  var _Lozenge = _interopRequireDefault(require("../Lozenge"));
18
18
  var _classnames2 = _interopRequireDefault(require("classnames"));
19
19
  var _hooks = require("@atlaskit/editor-common/hooks");
20
- var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
21
20
  var _withPluginState = require("@atlaskit/editor-common/with-plugin-state");
22
21
  var _excluded = ["type"];
23
22
  /** @jsx jsx */
@@ -35,13 +34,7 @@ function ExtensionWithPluginState(props) {
35
34
  shadowClassNames = props.shadowClassNames,
36
35
  hideFrame = props.hideFrame,
37
36
  editorAppearance = props.editorAppearance;
38
- var isMultiBodiedExtension = false;
39
- if ((0, _platformFeatureFlags.getBooleanFF)('platform.editor.multi-bodied-extension_0rygg')) {
40
- isMultiBodiedExtension = true;
41
- }
42
-
43
- //TODO: clean-up after removing multi-bodied-extension FF
44
- var hasBody = node.type.name === 'bodiedExtension' || isMultiBodiedExtension && node.type.name === 'multiBodiedExtension';
37
+ var hasBody = ['bodiedExtension', 'multiBodiedExtension'].includes(node.type.name);
45
38
  var isMobile = editorAppearance === 'mobile';
46
39
  var hasChildren = !!children;
47
40
  var removeBorder = hideFrame && !isMobile && !hasBody || false;
@@ -21,6 +21,7 @@ var _extensions = require("@atlaskit/editor-common/extensions");
21
21
  var _utils = require("@atlaskit/editor-common/utils");
22
22
  var _Extension = _interopRequireDefault(require("./Extension"));
23
23
  var _InlineExtension = _interopRequireDefault(require("./InlineExtension"));
24
+ var _MultiBodiedExtension = _interopRequireDefault(require("./MultiBodiedExtension"));
24
25
  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); }
25
26
  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; }
26
27
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
@@ -96,7 +97,7 @@ var ExtensionComponent = exports.default = /*#__PURE__*/function (_Component) {
96
97
  }
97
98
  }, _callee, null, [[4, 11]]);
98
99
  })));
99
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleExtension", function (pmNode) {
100
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleExtension", function (pmNode, actions) {
100
101
  var _pmNode$marks;
101
102
  var _this$props = _this.props,
102
103
  extensionHandlers = _this$props.extensionHandlers,
@@ -125,16 +126,24 @@ var ExtensionComponent = exports.default = /*#__PURE__*/function (_Component) {
125
126
  var result;
126
127
  if (extensionHandlers && extensionHandlers[extensionType]) {
127
128
  var render = (0, _utils.getExtensionRenderer)(extensionHandlers[extensionType]);
128
- result = render(node, editorView.state.doc);
129
+ result = render(node, editorView.state.doc, actions);
129
130
  }
130
131
  if (!result) {
131
132
  var extensionHandlerFromProvider = _this.state.extensionProvider && _this.getNodeRenderer(_this.state.extensionProvider, extensionType, extensionKey);
132
133
  if (extensionHandlerFromProvider) {
133
134
  var NodeRenderer = extensionHandlerFromProvider;
134
- return /*#__PURE__*/_react.default.createElement(NodeRenderer, {
135
- node: node,
136
- references: _this.props.references
137
- });
135
+ if (node.type === 'multiBodiedExtension') {
136
+ return /*#__PURE__*/_react.default.createElement(NodeRenderer, {
137
+ node: node,
138
+ references: _this.props.references,
139
+ actions: actions
140
+ });
141
+ } else {
142
+ return /*#__PURE__*/_react.default.createElement(NodeRenderer, {
143
+ node: node,
144
+ references: _this.props.references
145
+ });
146
+ }
138
147
  }
139
148
  }
140
149
  return result;
@@ -182,8 +191,18 @@ var ExtensionComponent = exports.default = /*#__PURE__*/function (_Component) {
182
191
  editorView = _this$props2.editorView,
183
192
  references = _this$props2.references,
184
193
  editorAppearance = _this$props2.editorAppearance,
185
- pluginInjectionApi = _this$props2.pluginInjectionApi;
186
- var extensionHandlerResult = this.tryExtensionHandler();
194
+ pluginInjectionApi = _this$props2.pluginInjectionApi,
195
+ getPos = _this$props2.getPos;
196
+ if (node.type.name === 'multiBodiedExtension') {
197
+ return /*#__PURE__*/_react.default.createElement(_MultiBodiedExtension.default, {
198
+ node: node,
199
+ editorView: editorView,
200
+ getPos: getPos,
201
+ handleContentDOMRef: handleContentDOMRef,
202
+ tryExtensionHandler: this.tryExtensionHandler.bind(this)
203
+ });
204
+ }
205
+ var extensionHandlerResult = this.tryExtensionHandler(undefined);
187
206
  switch (node.type.name) {
188
207
  case 'extension':
189
208
  case 'bodiedExtension':
@@ -208,10 +227,10 @@ var ExtensionComponent = exports.default = /*#__PURE__*/function (_Component) {
208
227
  }
209
228
  }, {
210
229
  key: "tryExtensionHandler",
211
- value: function tryExtensionHandler() {
230
+ value: function tryExtensionHandler(actions) {
212
231
  var node = this.props.node;
213
232
  try {
214
- var extensionContent = this.handleExtension(node);
233
+ var extensionContent = this.handleExtension(node, actions);
215
234
  if (extensionContent && /*#__PURE__*/_react.default.isValidElement(extensionContent)) {
216
235
  return extensionContent;
217
236
  }
@@ -7,6 +7,13 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = void 0;
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
  var _utils = require("@atlaskit/editor-common/utils");
10
+ /**
11
+ * If inlineExtension, add zero width space to the end of the nodes and wrap with span;
12
+ * else wrap with a div (for multi bodied extensions)
13
+ *
14
+ * @param param0
15
+ * @returns
16
+ */
10
17
  var ExtensionNodeWrapper = function ExtensionNodeWrapper(_ref) {
11
18
  var children = _ref.children,
12
19
  nodeType = _ref.nodeType;
@@ -0,0 +1,154 @@
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.default = void 0;
9
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+ var _react = require("@emotion/react");
13
+ var _colors = require("@atlaskit/theme/colors");
14
+ var _react2 = _interopRequireWildcard(require("react"));
15
+ var _templateObject;
16
+ 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); }
17
+ 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; }
18
+ 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; }
19
+ 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; } /** @jsx jsx */
20
+ var useMultiBodiedExtensionActions = function useMultiBodiedExtensionActions(_ref) {
21
+ var updateActiveChild = _ref.updateActiveChild,
22
+ editorView = _ref.editorView,
23
+ getPos = _ref.getPos,
24
+ node = _ref.node;
25
+ var actions = _react2.default.useMemo(function () {
26
+ return {
27
+ changeActive: function changeActive(index) {
28
+ return updateActiveChild(index);
29
+ },
30
+ addChild: function addChild() {
31
+ var state = editorView.state,
32
+ dispatch = editorView.dispatch;
33
+ if (node.content.childCount >= node.attrs.maxFrames) {
34
+ // TODO: add proper log on this
35
+ return false;
36
+ }
37
+ var p = state.schema.nodes.paragraph.createAndFill({});
38
+ if (!p) {
39
+ return false;
40
+ }
41
+ var frame = state.schema.nodes.extensionFrame.createAndFill({}, [p]);
42
+ var pos = getPos();
43
+ if (typeof pos !== 'number' || !frame) {
44
+ return false;
45
+ }
46
+ var insertAt = Math.min((pos || 1) + node.content.size, state.doc.content.size);
47
+ dispatch(state.tr.insert(insertAt, frame));
48
+ return true;
49
+ },
50
+ getChildrenCount: function getChildrenCount() {
51
+ return node.content.childCount;
52
+ },
53
+ removeChild: function removeChild(index) {
54
+ var pos = getPos();
55
+ // TODO: Add child index validation here, don't trust this data
56
+ if (typeof pos !== 'number' || typeof index !== 'number') {
57
+ return false;
58
+ }
59
+ var state = editorView.state,
60
+ dispatch = editorView.dispatch;
61
+ if (node.content.childCount === 1) {
62
+ var _tr = state.tr;
63
+ _tr.deleteRange(pos, pos + node.content.size);
64
+ dispatch(_tr);
65
+ return true;
66
+ }
67
+ var $pos = state.doc.resolve(pos);
68
+ var $startNodePos = state.doc.resolve($pos.start($pos.depth + 1));
69
+ var startFramePosition = $startNodePos.posAtIndex(index);
70
+ var maybeFrameNode = state.doc.nodeAt(startFramePosition);
71
+ if (!maybeFrameNode) {
72
+ return false;
73
+ }
74
+ var endFramePosition = maybeFrameNode.content.size + startFramePosition;
75
+ var tr = state.tr;
76
+ tr.deleteRange(startFramePosition, endFramePosition);
77
+ dispatch(tr);
78
+ return true;
79
+ },
80
+ updateParameters: function updateParameters(parameters) {
81
+ var state = editorView.state,
82
+ dispatch = editorView.dispatch;
83
+ var pos = getPos();
84
+ if (typeof pos !== 'number') {
85
+ return false;
86
+ }
87
+ var tr = state.tr.setNodeMarkup(pos, undefined, _objectSpread(_objectSpread({}, node.attrs), {}, {
88
+ parameters: parameters
89
+ }));
90
+ dispatch(tr);
91
+ return true;
92
+ },
93
+ getChildren: function getChildren() {
94
+ var _state$doc$nodeAt;
95
+ var state = editorView.state;
96
+ var pos = getPos();
97
+ if (typeof pos !== 'number') {
98
+ return [];
99
+ }
100
+ var children = (_state$doc$nodeAt = state.doc.nodeAt(pos)) === null || _state$doc$nodeAt === void 0 ? void 0 : _state$doc$nodeAt.content;
101
+ return children ? children.toJSON() : [];
102
+ }
103
+ };
104
+ }, [node, editorView, getPos, updateActiveChild]);
105
+ return actions;
106
+ };
107
+ var MultiBodiedExtension = function MultiBodiedExtension(_ref2) {
108
+ var node = _ref2.node,
109
+ handleContentDOMRef = _ref2.handleContentDOMRef,
110
+ getPos = _ref2.getPos,
111
+ tryExtensionHandler = _ref2.tryExtensionHandler,
112
+ editorView = _ref2.editorView;
113
+ var _useState = (0, _react2.useState)(0),
114
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
115
+ activeChildIndex = _useState2[0],
116
+ setActiveChildIndex = _useState2[1];
117
+ // Adding to avoid aliasing `this` for the callbacks
118
+ var updateActiveChild = _react2.default.useCallback(function (index) {
119
+ if (typeof index !== 'number') {
120
+ // TODO: Make sure we log this somewhere if this happens
121
+ setActiveChildIndex(0);
122
+ return false;
123
+ }
124
+ setActiveChildIndex(index);
125
+ return true;
126
+ }, [setActiveChildIndex]);
127
+ var actions = useMultiBodiedExtensionActions({
128
+ updateActiveChild: updateActiveChild,
129
+ editorView: editorView,
130
+ getPos: getPos,
131
+ node: node
132
+ });
133
+ var extensionHandlerResult = _react2.default.useMemo(function () {
134
+ return tryExtensionHandler(actions);
135
+ }, [tryExtensionHandler, actions]);
136
+ var articleRef = _react2.default.useCallback(function (node) {
137
+ return handleContentDOMRef(node);
138
+ }, [handleContentDOMRef]);
139
+ var containerCss = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n border: 1px solid ", ";\n padding: ", ";\n .multiBodiedExtension-content-dom-wrapper > [data-extension-frame='true'] {\n display: none;\n }\n\n .multiBodiedExtension-content-dom-wrapper\n > [data-extension-frame='true']:nth-of-type(", ") {\n display: block;\n }\n "])), "var(--ds-border, ".concat(_colors.N30, ")"), "var(--ds-space-050, 4px)", activeChildIndex + 1);
140
+ return (0, _react.jsx)("section", {
141
+ className: "multiBodiedExtension--container",
142
+ css: containerCss,
143
+ "data-testid": "multiBodiedExtension--container",
144
+ "data-active-child-index": activeChildIndex
145
+ }, (0, _react.jsx)("nav", {
146
+ className: "multiBodiedExtension-navigation",
147
+ "data-testid": "multiBodiedExtension-navigation"
148
+ }, extensionHandlerResult), (0, _react.jsx)("article", {
149
+ className: "multiBodiedExtension--frames",
150
+ "data-testid": "multiBodiedExtension--frames",
151
+ ref: articleRef
152
+ }));
153
+ };
154
+ var _default = exports.default = MultiBodiedExtension;
@@ -11,8 +11,9 @@ var getSelectedExtension = exports.getSelectedExtension = function getSelectedEx
11
11
  var _state$schema$nodes = state.schema.nodes,
12
12
  inlineExtension = _state$schema$nodes.inlineExtension,
13
13
  extension = _state$schema$nodes.extension,
14
- bodiedExtension = _state$schema$nodes.bodiedExtension;
15
- var nodeTypes = [extension, bodiedExtension, inlineExtension];
14
+ bodiedExtension = _state$schema$nodes.bodiedExtension,
15
+ multiBodiedExtension = _state$schema$nodes.multiBodiedExtension;
16
+ var nodeTypes = [extension, bodiedExtension, inlineExtension, multiBodiedExtension];
16
17
  return (0, _utils.findSelectedNodeOfType)(nodeTypes)(state.selection) || searchParent && (0, _utils.findParentNodeOfType)(nodeTypes)(state.selection) || undefined;
17
18
  };
18
19
  var findExtensionWithLocalId = exports.findExtensionWithLocalId = function findExtensionWithLocalId(state, localId) {
@@ -26,8 +27,9 @@ var findExtensionWithLocalId = exports.findExtensionWithLocalId = function findE
26
27
  var _state$schema$nodes2 = state.schema.nodes,
27
28
  inlineExtension = _state$schema$nodes2.inlineExtension,
28
29
  extension = _state$schema$nodes2.extension,
29
- bodiedExtension = _state$schema$nodes2.bodiedExtension;
30
- var nodeTypes = [extension, bodiedExtension, inlineExtension];
30
+ bodiedExtension = _state$schema$nodes2.bodiedExtension,
31
+ multiBodiedExtension = _state$schema$nodes2.multiBodiedExtension;
32
+ var nodeTypes = [extension, bodiedExtension, inlineExtension, multiBodiedExtension];
31
33
  var matched;
32
34
  state.doc.descendants(function (node, pos) {
33
35
  if (nodeTypes.includes(node.type) && node.attrs.localId === localId) {
@@ -9,4 +9,5 @@ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/hel
9
9
  var _react = require("@emotion/react");
10
10
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
11
11
  var _templateObject;
12
- var extensionStyles = exports.extensionStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n .extensionView-content-wrap,\n .bodiedExtensionView-content-wrap {\n margin: ", " 0;\n\n &:first-of-type {\n margin-top: 0;\n }\n\n &:last-of-type {\n margin-bottom: 0;\n }\n\n &:not(.danger).", " {\n & > span > .extension-container {\n ", "\n }\n }\n\n &.danger > span > .extension-container {\n box-shadow: 0 0 0 ", "px\n ", ";\n background-color: ", ";\n }\n\n &.inline {\n word-wrap: break-all;\n }\n }\n\n .extensionView-content-wrap .extension-container {\n overflow: hidden;\n }\n\n .bodiedExtensionView-content-wrap\n .extensionView-content-wrap\n .extension-container {\n width: 100%;\n max-width: 100%; // ensure width can't go over 100%;\n }\n\n [data-mark-type='fragment'] {\n & > .extensionView-content-wrap,\n & > .bodiedExtensionView-content-wrap {\n margin: ", " 0;\n }\n\n & > [data-mark-type='dataConsumer'] {\n & > .extensionView-content-wrap,\n & > .bodiedExtensionView-content-wrap {\n margin: ", " 0;\n }\n }\n\n &:first-child {\n & > .extensionView-content-wrap,\n & > .bodiedExtensionView-content-wrap {\n margin-top: 0;\n }\n\n & > [data-mark-type='dataConsumer'] {\n & > .extensionView-content-wrap,\n & > .bodiedExtensionView-content-wrap {\n margin-top: 0;\n }\n }\n }\n\n &:nth-last-of-type(-n + 2):not(:first-of-type) {\n & > .extensionView-content-wrap,\n & > .bodiedExtensionView-content-wrap {\n margin-bottom: 0;\n }\n\n & > [data-mark-type='dataConsumer'] {\n & > .extensionView-content-wrap,\n & > .bodiedExtensionView-content-wrap {\n margin-bottom: 0;\n }\n }\n }\n }\n"])), _editorSharedStyles.blockNodesVerticalMargin, _editorSharedStyles.akEditorSelectedNodeClassName, (0, _editorSharedStyles.getSelectionStyles)([_editorSharedStyles.SelectionStyle.BoxShadow]), _editorSharedStyles.akEditorSelectedBorderSize, "var(--ds-border-danger, ".concat(_editorSharedStyles.akEditorDeleteBorder, ")"), "var(--ds-background-danger, ".concat(_editorSharedStyles.akEditorDeleteBackground, ")"), _editorSharedStyles.blockNodesVerticalMargin, _editorSharedStyles.blockNodesVerticalMargin);
12
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage
13
+ var extensionStyles = exports.extensionStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n .multiBodiedExtensionView-content-wrap.", ":not(.danger) {\n ", "\n }\n\n .extensionView-content-wrap,\n .multiBodiedExtensionView-content-wrap,\n .bodiedExtensionView-content-wrap {\n margin: ", " 0;\n\n &:first-of-type {\n margin-top: 0;\n }\n\n &:last-of-type {\n margin-bottom: 0;\n }\n\n &:not(.danger).", " {\n & > span > .extension-container {\n ", "\n }\n }\n\n &.danger > span > .extension-container {\n box-shadow: 0 0 0 ", "px\n ", ";\n background-color: ", ";\n }\n\n &.inline {\n word-wrap: break-all;\n }\n }\n\n .extensionView-content-wrap .extension-container {\n overflow: hidden;\n }\n\n .bodiedExtensionView-content-wrap\n .extensionView-content-wrap\n .extension-container {\n width: 100%;\n max-width: 100%; // ensure width can't go over 100%;\n }\n\n [data-mark-type='fragment'] {\n & > .extensionView-content-wrap,\n & > .bodiedExtensionView-content-wrap {\n margin: ", " 0;\n }\n\n & > [data-mark-type='dataConsumer'] {\n & > .extensionView-content-wrap,\n & > .bodiedExtensionView-content-wrap {\n margin: ", " 0;\n }\n }\n\n &:first-child {\n & > .extensionView-content-wrap,\n & > .bodiedExtensionView-content-wrap {\n margin-top: 0;\n }\n\n & > [data-mark-type='dataConsumer'] {\n & > .extensionView-content-wrap,\n & > .bodiedExtensionView-content-wrap {\n margin-top: 0;\n }\n }\n }\n\n &:nth-last-of-type(-n + 2):not(:first-of-type) {\n & > .extensionView-content-wrap,\n & > .bodiedExtensionView-content-wrap {\n margin-bottom: 0;\n }\n\n & > [data-mark-type='dataConsumer'] {\n & > .extensionView-content-wrap,\n & > .bodiedExtensionView-content-wrap {\n margin-bottom: 0;\n }\n }\n }\n }\n"])), _editorSharedStyles.akEditorSelectedNodeClassName, (0, _editorSharedStyles.getSelectionStyles)([_editorSharedStyles.SelectionStyle.BoxShadow, _editorSharedStyles.SelectionStyle.Blanket]), _editorSharedStyles.blockNodesVerticalMargin, _editorSharedStyles.akEditorSelectedNodeClassName, (0, _editorSharedStyles.getSelectionStyles)([_editorSharedStyles.SelectionStyle.BoxShadow]), _editorSharedStyles.akEditorSelectedBorderSize, "var(--ds-border-danger, ".concat(_editorSharedStyles.akEditorDeleteBorder, ")"), "var(--ds-background-danger, ".concat(_editorSharedStyles.akEditorDeleteBackground, ")"), _editorSharedStyles.blockNodesVerticalMargin, _editorSharedStyles.blockNodesVerticalMargin);
@@ -5,4 +5,4 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.version = exports.name = void 0;
7
7
  var name = exports.name = "@atlaskit/editor-core";
8
- var version = exports.version = "189.3.37";
8
+ var version = exports.version = "189.4.0";
@@ -1,4 +1,4 @@
1
- import { removeSelectedNode, removeParentNodeOfType } from '@atlaskit/editor-prosemirror/utils';
1
+ import { removeSelectedNode, removeParentNodeOfType, findParentNodeOfType } from '@atlaskit/editor-prosemirror/utils';
2
2
  import { createCommand } from './plugin-factory';
3
3
  import { getSelectedExtension } from './utils';
4
4
  import { removeConnectedNodes } from '@atlaskit/editor-common/utils';
@@ -61,7 +61,7 @@ export const removeExtension = () => createCommand({
61
61
  if (getSelectedExtension(state)) {
62
62
  return removeSelectedNode(tr);
63
63
  } else {
64
- return removeParentNodeOfType(state.schema.nodes.bodiedExtension)(tr);
64
+ return checkAndRemoveExtensionNode(state, tr);
65
65
  }
66
66
  });
67
67
  export const removeDescendantNodes = sourceNode => createCommand({
@@ -71,4 +71,11 @@ export const removeDescendantNodes = sourceNode => createCommand({
71
71
  }
72
72
  }, (tr, state) => {
73
73
  return sourceNode ? removeConnectedNodes(state, sourceNode) : tr;
74
- });
74
+ });
75
+ export const checkAndRemoveExtensionNode = (state, tr) => {
76
+ let nodeType = state.schema.nodes.bodiedExtension;
77
+ if (findParentNodeOfType(state.schema.nodes.multiBodiedExtension)(state.selection)) {
78
+ nodeType = state.schema.nodes.multiBodiedExtension;
79
+ }
80
+ return removeParentNodeOfType(nodeType)(tr);
81
+ };
@@ -1,4 +1,4 @@
1
- import { extension, bodiedExtension, inlineExtension } from '@atlaskit/adf-schema';
1
+ import { extension, bodiedExtension, inlineExtension, multiBodiedExtension, extensionFrame } from '@atlaskit/adf-schema';
2
2
  import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
3
3
  import { createPlugin } from './pm-plugins/main';
4
4
  import { createPlugin as createMacroPlugin } from './pm-plugins/macro';
@@ -9,6 +9,7 @@ import { getToolbarConfig } from './toolbar';
9
9
  import { getContextPanel } from './context-panel';
10
10
  import { createExtensionAPI } from './extension-api';
11
11
  import { createEditSelectedExtensionAction } from './actions';
12
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
12
13
  const extensionPlugin = ({
13
14
  config: options = {},
14
15
  api
@@ -23,7 +24,7 @@ const extensionPlugin = ({
23
24
  return {
24
25
  name: 'extension',
25
26
  nodes() {
26
- return [{
27
+ const extensionNodes = [{
27
28
  name: 'extension',
28
29
  node: extension
29
30
  }, {
@@ -33,6 +34,19 @@ const extensionPlugin = ({
33
34
  name: 'inlineExtension',
34
35
  node: inlineExtension
35
36
  }];
37
+
38
+ // Revert to returning all nodes without local variable, once FF is removed
39
+ if (getBooleanFF('platform.editor.multi-bodied-extension_0rygg')) {
40
+ extensionNodes.push({
41
+ name: 'extensionFrame',
42
+ node: extensionFrame
43
+ });
44
+ extensionNodes.push({
45
+ name: 'multiBodiedExtension',
46
+ node: multiBodiedExtension
47
+ });
48
+ }
49
+ return extensionNodes;
36
50
  },
37
51
  pmPlugins() {
38
52
  return [{
@@ -218,7 +218,8 @@ const createPlugin = (dispatch, providerFactory, extensionHandlers, portalProvid
218
218
  // WARNING: referentiality-plugin also creates these nodeviews
219
219
  bodiedExtension: ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi),
220
220
  // WARNING: referentiality-plugin also creates these nodeviews
221
- inlineExtension: ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi)
221
+ inlineExtension: ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi),
222
+ multiBodiedExtension: ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi)
222
223
  },
223
224
  handleClickOn: createSelectionClickHandler(['extension', 'bodiedExtension'], target => !target.closest('.extension-content'), {
224
225
  useLongPressSelection
@@ -129,7 +129,7 @@ export const getToolbarConfig = ({
129
129
  } = intl;
130
130
  const extensionState = getPluginState(state);
131
131
  if (extensionState && !extensionState.showContextPanel && extensionState.element) {
132
- const nodeType = [state.schema.nodes.extension, state.schema.nodes.inlineExtension, state.schema.nodes.bodiedExtension];
132
+ const nodeType = [state.schema.nodes.extension, state.schema.nodes.inlineExtension, state.schema.nodes.bodiedExtension, state.schema.nodes.multiBodiedExtension];
133
133
  const editButtonArray = editButton(formatMessage, extensionState, applyChangeToContextPanel, editorAnalyticsAPI);
134
134
  const breakoutButtonArray = breakoutOptions(state, formatMessage, extensionState, breakoutEnabled);
135
135
  const extensionObj = getSelectedExtension(state, true);
@@ -10,7 +10,6 @@ import { overlay } from '../styles';
10
10
  import ExtensionLozenge from '../Lozenge';
11
11
  import classnames from 'classnames';
12
12
  import { useSharedPluginState } from '@atlaskit/editor-common/hooks';
13
- import { getBooleanFF } from '@atlaskit/platform-feature-flags';
14
13
  function ExtensionWithPluginState(props) {
15
14
  const {
16
15
  node,
@@ -24,13 +23,7 @@ function ExtensionWithPluginState(props) {
24
23
  hideFrame,
25
24
  editorAppearance
26
25
  } = props;
27
- let isMultiBodiedExtension = false;
28
- if (getBooleanFF('platform.editor.multi-bodied-extension_0rygg')) {
29
- isMultiBodiedExtension = true;
30
- }
31
-
32
- //TODO: clean-up after removing multi-bodied-extension FF
33
- const hasBody = node.type.name === 'bodiedExtension' || isMultiBodiedExtension && node.type.name === 'multiBodiedExtension';
26
+ const hasBody = ['bodiedExtension', 'multiBodiedExtension'].includes(node.type.name);
34
27
  const isMobile = editorAppearance === 'mobile';
35
28
  const hasChildren = !!children;
36
29
  const removeBorder = hideFrame && !isMobile && !hasBody || false;