@atlaskit/editor-plugin-paste 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @atlaskit/editor-plugin-paste
2
2
 
3
+ ## 1.0.4
4
+
5
+ ### Patch Changes
6
+
7
+ - [#74662](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/74662) [`03889d5b1256`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/03889d5b1256) - ED-22244 Allow copy paste of action within a panel into a panel
8
+ - Updated dependencies
9
+
3
10
  ## 1.0.3
4
11
 
5
12
  ### Patch Changes
@@ -40,6 +40,7 @@ var _utils3 = require("@atlaskit/editor-tables/utils");
40
40
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
41
41
  var _commands = require("./commands");
42
42
  var _edgeCases = require("./edge-cases");
43
+ var _lists = require("./edge-cases/lists");
43
44
  var _pluginFactory = require("./pm-plugins/plugin-factory");
44
45
  var _util = require("./util");
45
46
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
@@ -83,7 +84,7 @@ function handleMention(slice, schema) {
83
84
  }
84
85
  function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChangedTr) {
85
86
  return function (state, dispatch) {
86
- var _slice$content$firstC, _transformedSlice$con;
87
+ var _slice$content$firstC, _slice$content$firstC2, _transformedSlice$con;
87
88
  var schema = state.schema,
88
89
  selection = state.tr.selection;
89
90
  var codeMark = schema.marks.code,
@@ -105,8 +106,9 @@ function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChangedTr) {
105
106
  codeBlock = _schema$nodes.codeBlock;
106
107
  var selectionIsValidNode = state.selection instanceof _state.NodeSelection && ['decisionList', 'decisionItem', 'taskList', 'taskItem'].includes(state.selection.node.type.name);
107
108
  var selectionHasValidParentNode = (0, _utils2.hasParentNodeOfType)([decisionItem, taskItem, panel])(state.selection);
108
- var selectionIsPanel = (0, _utils2.hasParentNodeOfType)([panel])(state.selection);
109
109
  var selectionIsCodeBlock = (0, _utils2.hasParentNodeOfType)([codeBlock])(state.selection);
110
+ var panelNode = (0, _util.isSelectionInsidePanel)(selection);
111
+ var selectionIsPanel = Boolean(panelNode);
110
112
 
111
113
  // we avoid handling codeBlock-in-panel use case in this function
112
114
  // returning false will allow code to flow into `handleCodeBlock` function
@@ -117,15 +119,15 @@ function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChangedTr) {
117
119
  // Some types of content should be handled by the default handler, not this function.
118
120
  // Check through slice content to see if it contains an invalid node.
119
121
  var sliceIsInvalid = false;
122
+ var sliceHasTask = false;
120
123
  slice.content.nodesBetween(0, slice.content.size, function (node) {
121
124
  if (node.type === bulletList || node.type === orderedList || node.type === expand || node.type === heading || node.type === listItem) {
122
125
  sliceIsInvalid = true;
123
126
  }
124
127
  if (selectionIsPanel && node.type === taskList) {
125
- sliceIsInvalid = true;
128
+ sliceHasTask = true;
126
129
  }
127
130
  });
128
-
129
131
  // If the selection is a panel,
130
132
  // and the slice's first node is a paragraph
131
133
  // and it is not from a depth that would indicate it being from inside from another node (e.g. text from a decision)
@@ -143,6 +145,12 @@ function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChangedTr) {
143
145
  var transformedSlice = compose.apply(null, filters)(slice);
144
146
  var isFirstChildTaskNode = transformedSlice.content.firstChild.type === taskList || transformedSlice.content.firstChild.type === taskItem;
145
147
  var tr = (0, _history.closeHistory)(state.tr);
148
+ if (panelNode && sliceHasTask && ((_slice$content$firstC2 = slice.content.firstChild) === null || _slice$content$firstC2 === void 0 ? void 0 : _slice$content$firstC2.type) === panel && (0, _platformFeatureFlags.getBooleanFF)('platform.editor.handle-paste-for-action-in-panel') && (0, _util.isEmptyNode)(panelNode) && selection.$from.node() === selection.$to.node()) {
149
+ return Boolean((0, _lists.insertSliceInsideOfPanelNodeSelected)(panelNode)({
150
+ tr: tr,
151
+ slice: slice
152
+ }));
153
+ }
146
154
  var transformedSliceIsValidNode = (transformedSlice.content.firstChild.type.inlineContent || ['decisionList', 'decisionItem', 'taskItem', 'taskList', 'panel'].includes(transformedSlice.content.firstChild.type.name)) && (!(0, _utils.isInListItem)(state) || (0, _utils.isInListItem)(state) && isFirstChildTaskNode);
147
155
  // If the slice or the selection are valid nodes to handle,
148
156
  // and the slice is not a whole node (i.e. openStart is 1 and openEnd is 0)
@@ -197,7 +205,7 @@ function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChangedTr) {
197
205
  }
198
206
  function handlePasteNonNestableBlockNodesIntoList(slice) {
199
207
  return function (state, dispatch) {
200
- var _tr$doc$nodeAt, _slice$content$firstC2, _sliceContent$firstCh, _findParentNodeOfType;
208
+ var _tr$doc$nodeAt, _slice$content$firstC3, _sliceContent$firstCh, _findParentNodeOfType;
201
209
  var tr = state.tr;
202
210
  var selection = tr.selection;
203
211
  var $from = selection.$from,
@@ -272,7 +280,7 @@ function handlePasteNonNestableBlockNodesIntoList(slice) {
272
280
  }
273
281
 
274
282
  // handle the insertion of the slice
275
- if (((_slice$content$firstC2 = slice.content.firstChild) === null || _slice$content$firstC2 === void 0 ? void 0 : _slice$content$firstC2.type.name) === 'blockquote' && (0, _utils2.contains)(slice.content.firstChild, state.schema.nodes.listItem)) {
283
+ if (((_slice$content$firstC3 = slice.content.firstChild) === null || _slice$content$firstC3 === void 0 ? void 0 : _slice$content$firstC3.type.name) === 'blockquote' && (0, _utils2.contains)(slice.content.firstChild, state.schema.nodes.listItem)) {
276
284
  (0, _edgeCases.insertSliceForListsInsideBlockquote)({
277
285
  tr: tr,
278
286
  slice: slice
@@ -991,6 +999,6 @@ var handleSelectedTable = exports.handleSelectedTable = function handleSelectedT
991
999
  };
992
1000
  };
993
1001
  function checkTaskListInList(state, slice) {
994
- var _slice$content$firstC3;
995
- return Boolean((0, _utils.isInListItem)(state) && (0, _platformFeatureFlags.getBooleanFF)('platform.editor.allow-action-in-list') && ['taskList', 'taskItem'].includes(((_slice$content$firstC3 = slice.content.firstChild) === null || _slice$content$firstC3 === void 0 || (_slice$content$firstC3 = _slice$content$firstC3.type) === null || _slice$content$firstC3 === void 0 ? void 0 : _slice$content$firstC3.name) || ''));
1002
+ var _slice$content$firstC4;
1003
+ return Boolean((0, _utils.isInListItem)(state) && (0, _platformFeatureFlags.getBooleanFF)('platform.editor.allow-action-in-list') && ['taskList', 'taskItem'].includes(((_slice$content$firstC4 = slice.content.firstChild) === null || _slice$content$firstC4 === void 0 || (_slice$content$firstC4 = _slice$content$firstC4.type) === null || _slice$content$firstC4 === void 0 ? void 0 : _slice$content$firstC4.name) || ''));
996
1004
  }
@@ -14,8 +14,9 @@ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
14
14
 
15
15
  import { startTrackingPastedMacroPositions, stopTrackingPastedMacroPositions } from './commands';
16
16
  import { insertSliceForLists, insertSliceForListsInsideBlockquote, insertSliceForTaskInsideList } from './edge-cases';
17
+ import { insertSliceInsideOfPanelNodeSelected } from './edge-cases/lists';
17
18
  import { getPluginState as getPastePluginState } from './pm-plugins/plugin-factory';
18
- import { addReplaceSelectedTableAnalytics, applyTextMarksToSlice, hasOnlyNodesOfType } from './util';
19
+ import { addReplaceSelectedTableAnalytics, applyTextMarksToSlice, hasOnlyNodesOfType, isEmptyNode, isSelectionInsidePanel } from './util';
19
20
 
20
21
  /** Helper type for single arg function */
21
22
 
@@ -49,7 +50,7 @@ export function handleMention(slice, schema) {
49
50
  }
50
51
  export function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChangedTr) {
51
52
  return (state, dispatch) => {
52
- var _slice$content$firstC, _transformedSlice$con;
53
+ var _slice$content$firstC, _slice$content$firstC2, _transformedSlice$con;
53
54
  const {
54
55
  schema,
55
56
  tr: {
@@ -80,8 +81,9 @@ export function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChange
80
81
  } = schema;
81
82
  const selectionIsValidNode = state.selection instanceof NodeSelection && ['decisionList', 'decisionItem', 'taskList', 'taskItem'].includes(state.selection.node.type.name);
82
83
  const selectionHasValidParentNode = hasParentNodeOfType([decisionItem, taskItem, panel])(state.selection);
83
- const selectionIsPanel = hasParentNodeOfType([panel])(state.selection);
84
84
  const selectionIsCodeBlock = hasParentNodeOfType([codeBlock])(state.selection);
85
+ const panelNode = isSelectionInsidePanel(selection);
86
+ const selectionIsPanel = Boolean(panelNode);
85
87
 
86
88
  // we avoid handling codeBlock-in-panel use case in this function
87
89
  // returning false will allow code to flow into `handleCodeBlock` function
@@ -92,15 +94,15 @@ export function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChange
92
94
  // Some types of content should be handled by the default handler, not this function.
93
95
  // Check through slice content to see if it contains an invalid node.
94
96
  let sliceIsInvalid = false;
97
+ let sliceHasTask = false;
95
98
  slice.content.nodesBetween(0, slice.content.size, node => {
96
99
  if (node.type === bulletList || node.type === orderedList || node.type === expand || node.type === heading || node.type === listItem) {
97
100
  sliceIsInvalid = true;
98
101
  }
99
102
  if (selectionIsPanel && node.type === taskList) {
100
- sliceIsInvalid = true;
103
+ sliceHasTask = true;
101
104
  }
102
105
  });
103
-
104
106
  // If the selection is a panel,
105
107
  // and the slice's first node is a paragraph
106
108
  // and it is not from a depth that would indicate it being from inside from another node (e.g. text from a decision)
@@ -118,6 +120,12 @@ export function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChange
118
120
  const transformedSlice = compose.apply(null, filters)(slice);
119
121
  const isFirstChildTaskNode = transformedSlice.content.firstChild.type === taskList || transformedSlice.content.firstChild.type === taskItem;
120
122
  const tr = closeHistory(state.tr);
123
+ if (panelNode && sliceHasTask && ((_slice$content$firstC2 = slice.content.firstChild) === null || _slice$content$firstC2 === void 0 ? void 0 : _slice$content$firstC2.type) === panel && getBooleanFF('platform.editor.handle-paste-for-action-in-panel') && isEmptyNode(panelNode) && selection.$from.node() === selection.$to.node()) {
124
+ return Boolean(insertSliceInsideOfPanelNodeSelected(panelNode)({
125
+ tr,
126
+ slice
127
+ }));
128
+ }
121
129
  const transformedSliceIsValidNode = (transformedSlice.content.firstChild.type.inlineContent || ['decisionList', 'decisionItem', 'taskItem', 'taskList', 'panel'].includes(transformedSlice.content.firstChild.type.name)) && (!isInListItem(state) || isInListItem(state) && isFirstChildTaskNode);
122
130
  // If the slice or the selection are valid nodes to handle,
123
131
  // and the slice is not a whole node (i.e. openStart is 1 and openEnd is 0)
@@ -172,7 +180,7 @@ export function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChange
172
180
  }
173
181
  export function handlePasteNonNestableBlockNodesIntoList(slice) {
174
182
  return (state, dispatch) => {
175
- var _tr$doc$nodeAt, _slice$content$firstC2, _sliceContent$firstCh, _findParentNodeOfType;
183
+ var _tr$doc$nodeAt, _slice$content$firstC3, _sliceContent$firstCh, _findParentNodeOfType;
176
184
  const {
177
185
  tr
178
186
  } = state;
@@ -254,7 +262,7 @@ export function handlePasteNonNestableBlockNodesIntoList(slice) {
254
262
  }
255
263
 
256
264
  // handle the insertion of the slice
257
- if (((_slice$content$firstC2 = slice.content.firstChild) === null || _slice$content$firstC2 === void 0 ? void 0 : _slice$content$firstC2.type.name) === 'blockquote' && contains(slice.content.firstChild, state.schema.nodes.listItem)) {
265
+ if (((_slice$content$firstC3 = slice.content.firstChild) === null || _slice$content$firstC3 === void 0 ? void 0 : _slice$content$firstC3.type.name) === 'blockquote' && contains(slice.content.firstChild, state.schema.nodes.listItem)) {
258
266
  insertSliceForListsInsideBlockquote({
259
267
  tr,
260
268
  slice
@@ -970,6 +978,6 @@ export const handleSelectedTable = editorAnalyticsAPI => slice => (state, dispat
970
978
  return false;
971
979
  };
972
980
  export function checkTaskListInList(state, slice) {
973
- var _slice$content$firstC3, _slice$content$firstC4;
974
- return Boolean(isInListItem(state) && getBooleanFF('platform.editor.allow-action-in-list') && ['taskList', 'taskItem'].includes(((_slice$content$firstC3 = slice.content.firstChild) === null || _slice$content$firstC3 === void 0 ? void 0 : (_slice$content$firstC4 = _slice$content$firstC3.type) === null || _slice$content$firstC4 === void 0 ? void 0 : _slice$content$firstC4.name) || ''));
981
+ var _slice$content$firstC4, _slice$content$firstC5;
982
+ return Boolean(isInListItem(state) && getBooleanFF('platform.editor.allow-action-in-list') && ['taskList', 'taskItem'].includes(((_slice$content$firstC4 = slice.content.firstChild) === null || _slice$content$firstC4 === void 0 ? void 0 : (_slice$content$firstC5 = _slice$content$firstC4.type) === null || _slice$content$firstC5 === void 0 ? void 0 : _slice$content$firstC5.name) || ''));
975
983
  }
@@ -22,8 +22,9 @@ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
22
22
 
23
23
  import { startTrackingPastedMacroPositions, stopTrackingPastedMacroPositions } from './commands';
24
24
  import { insertSliceForLists, insertSliceForListsInsideBlockquote, insertSliceForTaskInsideList } from './edge-cases';
25
+ import { insertSliceInsideOfPanelNodeSelected } from './edge-cases/lists';
25
26
  import { getPluginState as getPastePluginState } from './pm-plugins/plugin-factory';
26
- import { addReplaceSelectedTableAnalytics, applyTextMarksToSlice, hasOnlyNodesOfType } from './util';
27
+ import { addReplaceSelectedTableAnalytics, applyTextMarksToSlice, hasOnlyNodesOfType, isEmptyNode, isSelectionInsidePanel } from './util';
27
28
 
28
29
  /** Helper type for single arg function */
29
30
 
@@ -61,7 +62,7 @@ export function handleMention(slice, schema) {
61
62
  }
62
63
  export function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChangedTr) {
63
64
  return function (state, dispatch) {
64
- var _slice$content$firstC, _transformedSlice$con;
65
+ var _slice$content$firstC, _slice$content$firstC2, _transformedSlice$con;
65
66
  var schema = state.schema,
66
67
  selection = state.tr.selection;
67
68
  var codeMark = schema.marks.code,
@@ -83,8 +84,9 @@ export function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChange
83
84
  codeBlock = _schema$nodes.codeBlock;
84
85
  var selectionIsValidNode = state.selection instanceof NodeSelection && ['decisionList', 'decisionItem', 'taskList', 'taskItem'].includes(state.selection.node.type.name);
85
86
  var selectionHasValidParentNode = hasParentNodeOfType([decisionItem, taskItem, panel])(state.selection);
86
- var selectionIsPanel = hasParentNodeOfType([panel])(state.selection);
87
87
  var selectionIsCodeBlock = hasParentNodeOfType([codeBlock])(state.selection);
88
+ var panelNode = isSelectionInsidePanel(selection);
89
+ var selectionIsPanel = Boolean(panelNode);
88
90
 
89
91
  // we avoid handling codeBlock-in-panel use case in this function
90
92
  // returning false will allow code to flow into `handleCodeBlock` function
@@ -95,15 +97,15 @@ export function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChange
95
97
  // Some types of content should be handled by the default handler, not this function.
96
98
  // Check through slice content to see if it contains an invalid node.
97
99
  var sliceIsInvalid = false;
100
+ var sliceHasTask = false;
98
101
  slice.content.nodesBetween(0, slice.content.size, function (node) {
99
102
  if (node.type === bulletList || node.type === orderedList || node.type === expand || node.type === heading || node.type === listItem) {
100
103
  sliceIsInvalid = true;
101
104
  }
102
105
  if (selectionIsPanel && node.type === taskList) {
103
- sliceIsInvalid = true;
106
+ sliceHasTask = true;
104
107
  }
105
108
  });
106
-
107
109
  // If the selection is a panel,
108
110
  // and the slice's first node is a paragraph
109
111
  // and it is not from a depth that would indicate it being from inside from another node (e.g. text from a decision)
@@ -121,6 +123,12 @@ export function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChange
121
123
  var transformedSlice = compose.apply(null, filters)(slice);
122
124
  var isFirstChildTaskNode = transformedSlice.content.firstChild.type === taskList || transformedSlice.content.firstChild.type === taskItem;
123
125
  var tr = closeHistory(state.tr);
126
+ if (panelNode && sliceHasTask && ((_slice$content$firstC2 = slice.content.firstChild) === null || _slice$content$firstC2 === void 0 ? void 0 : _slice$content$firstC2.type) === panel && getBooleanFF('platform.editor.handle-paste-for-action-in-panel') && isEmptyNode(panelNode) && selection.$from.node() === selection.$to.node()) {
127
+ return Boolean(insertSliceInsideOfPanelNodeSelected(panelNode)({
128
+ tr: tr,
129
+ slice: slice
130
+ }));
131
+ }
124
132
  var transformedSliceIsValidNode = (transformedSlice.content.firstChild.type.inlineContent || ['decisionList', 'decisionItem', 'taskItem', 'taskList', 'panel'].includes(transformedSlice.content.firstChild.type.name)) && (!isInListItem(state) || isInListItem(state) && isFirstChildTaskNode);
125
133
  // If the slice or the selection are valid nodes to handle,
126
134
  // and the slice is not a whole node (i.e. openStart is 1 and openEnd is 0)
@@ -175,7 +183,7 @@ export function handlePasteIntoTaskOrDecisionOrPanel(slice, queueCardsFromChange
175
183
  }
176
184
  export function handlePasteNonNestableBlockNodesIntoList(slice) {
177
185
  return function (state, dispatch) {
178
- var _tr$doc$nodeAt, _slice$content$firstC2, _sliceContent$firstCh, _findParentNodeOfType;
186
+ var _tr$doc$nodeAt, _slice$content$firstC3, _sliceContent$firstCh, _findParentNodeOfType;
179
187
  var tr = state.tr;
180
188
  var selection = tr.selection;
181
189
  var $from = selection.$from,
@@ -250,7 +258,7 @@ export function handlePasteNonNestableBlockNodesIntoList(slice) {
250
258
  }
251
259
 
252
260
  // handle the insertion of the slice
253
- if (((_slice$content$firstC2 = slice.content.firstChild) === null || _slice$content$firstC2 === void 0 ? void 0 : _slice$content$firstC2.type.name) === 'blockquote' && contains(slice.content.firstChild, state.schema.nodes.listItem)) {
261
+ if (((_slice$content$firstC3 = slice.content.firstChild) === null || _slice$content$firstC3 === void 0 ? void 0 : _slice$content$firstC3.type.name) === 'blockquote' && contains(slice.content.firstChild, state.schema.nodes.listItem)) {
254
262
  insertSliceForListsInsideBlockquote({
255
263
  tr: tr,
256
264
  slice: slice
@@ -969,6 +977,6 @@ export var handleSelectedTable = function handleSelectedTable(editorAnalyticsAPI
969
977
  };
970
978
  };
971
979
  export function checkTaskListInList(state, slice) {
972
- var _slice$content$firstC3;
973
- return Boolean(isInListItem(state) && getBooleanFF('platform.editor.allow-action-in-list') && ['taskList', 'taskItem'].includes(((_slice$content$firstC3 = slice.content.firstChild) === null || _slice$content$firstC3 === void 0 || (_slice$content$firstC3 = _slice$content$firstC3.type) === null || _slice$content$firstC3 === void 0 ? void 0 : _slice$content$firstC3.name) || ''));
980
+ var _slice$content$firstC4;
981
+ return Boolean(isInListItem(state) && getBooleanFF('platform.editor.allow-action-in-list') && ['taskList', 'taskItem'].includes(((_slice$content$firstC4 = slice.content.firstChild) === null || _slice$content$firstC4 === void 0 || (_slice$content$firstC4 = _slice$content$firstC4.type) === null || _slice$content$firstC4 === void 0 ? void 0 : _slice$content$firstC4.name) || ''));
974
982
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-paste",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Paste plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -33,7 +33,7 @@
33
33
  ".": "./src/index.ts"
34
34
  },
35
35
  "dependencies": {
36
- "@atlaskit/editor-common": "^78.3.0",
36
+ "@atlaskit/editor-common": "^78.4.0",
37
37
  "@atlaskit/editor-markdown-transformer": "^5.3.0",
38
38
  "@atlaskit/editor-plugin-analytics": "^1.0.0",
39
39
  "@atlaskit/editor-plugin-annotation": "^1.0.0",
@@ -125,6 +125,9 @@
125
125
  },
126
126
  "platform.editor.media.fix-copy-paste-excel_62g4s": {
127
127
  "type": "boolean"
128
+ },
129
+ "platform.editor.handle-paste-for-action-in-panel": {
130
+ "type": "boolean"
128
131
  }
129
132
  }
130
133
  }