@atlaskit/editor-plugin-block-menu 3.0.1 → 3.1.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 (35) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/cjs/editor-commands/transforms/inline-node-transforms.js +1 -1
  3. package/dist/cjs/editor-commands/transforms/layout/utils.js +102 -52
  4. package/dist/cjs/editor-commands/transforms/list-transforms.js +5 -52
  5. package/dist/cjs/editor-commands/transforms/utils.js +3 -14
  6. package/dist/es2019/editor-commands/transforms/inline-node-transforms.js +1 -1
  7. package/dist/es2019/editor-commands/transforms/layout/utils.js +93 -47
  8. package/dist/es2019/editor-commands/transforms/list-transforms.js +3 -54
  9. package/dist/es2019/editor-commands/transforms/utils.js +2 -13
  10. package/dist/esm/editor-commands/transforms/inline-node-transforms.js +1 -1
  11. package/dist/esm/editor-commands/transforms/layout/utils.js +96 -46
  12. package/dist/esm/editor-commands/transforms/list-transforms.js +3 -50
  13. package/dist/esm/editor-commands/transforms/utils.js +2 -13
  14. package/dist/types/editor-commands/transforms/container-transforms.d.ts +2 -1
  15. package/dist/types/editor-commands/transforms/layout/utils.d.ts +1 -1
  16. package/dist/types/editor-commands/transforms/layout-transforms.d.ts +1 -1
  17. package/dist/types/editor-commands/transforms/list/transformOrderedUnorderedListToBlockNodes.d.ts +1 -1
  18. package/dist/types/editor-commands/transforms/list/transformTaskListToBlockNodes.d.ts +1 -1
  19. package/dist/types/editor-commands/transforms/list-transforms.d.ts +2 -5
  20. package/dist/types/editor-commands/transforms/types.d.ts +1 -8
  21. package/dist/types/editor-commands/transforms/utils.d.ts +0 -4
  22. package/dist/types-ts4.5/editor-commands/transforms/container-transforms.d.ts +2 -1
  23. package/dist/types-ts4.5/editor-commands/transforms/layout/utils.d.ts +1 -1
  24. package/dist/types-ts4.5/editor-commands/transforms/layout-transforms.d.ts +1 -1
  25. package/dist/types-ts4.5/editor-commands/transforms/list/transformOrderedUnorderedListToBlockNodes.d.ts +1 -1
  26. package/dist/types-ts4.5/editor-commands/transforms/list/transformTaskListToBlockNodes.d.ts +1 -1
  27. package/dist/types-ts4.5/editor-commands/transforms/list-transforms.d.ts +2 -5
  28. package/dist/types-ts4.5/editor-commands/transforms/types.d.ts +1 -8
  29. package/dist/types-ts4.5/editor-commands/transforms/utils.d.ts +0 -4
  30. package/package.json +3 -3
  31. package/dist/cjs/editor-commands/transforms/list/transformBetweenListTypes.js +0 -142
  32. package/dist/es2019/editor-commands/transforms/list/transformBetweenListTypes.js +0 -144
  33. package/dist/esm/editor-commands/transforms/list/transformBetweenListTypes.js +0 -137
  34. package/dist/types/editor-commands/transforms/list/transformBetweenListTypes.d.ts +0 -18
  35. package/dist/types-ts4.5/editor-commands/transforms/list/transformBetweenListTypes.d.ts +0 -18
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @atlaskit/editor-plugin-block-menu
2
2
 
3
+ ## 3.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`cebd8f9171426`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/cebd8f9171426) -
8
+ [ux] ED-29159 Implement transform task inside lists - handle logic
9
+
10
+ ### Patch Changes
11
+
12
+ - Updated dependencies
13
+
14
+ ## 3.0.2
15
+
16
+ ### Patch Changes
17
+
18
+ - [`d6f3f3b09ebff`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/d6f3f3b09ebff) -
19
+ [ux] ED-29255 Fix layout transformation when column is empty, transform nested lists to match
20
+ container to list transformations and fix task list transforms when task item is empty
21
+
3
22
  ## 3.0.1
4
23
 
5
24
  ### Patch Changes
@@ -11,7 +11,7 @@ var getInlineNodeTextContent = exports.getInlineNodeTextContent = function getIn
11
11
  }
12
12
  // Headings are not valid inside headings so convert heading nodes to paragraphs
13
13
  sourceContent.forEach(function (node) {
14
- if (['paragraph', 'heading'].includes(node.type.name)) {
14
+ if (['paragraph', 'heading', 'taskItem'].includes(node.type.name)) {
15
15
  node.content.forEach(function (inlineNode) {
16
16
  if (inlineNode.type.name === 'status') {
17
17
  validTransformedContent += inlineNode.attrs.text;
@@ -6,10 +6,10 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.unwrapLayoutNodesToTextNodes = exports.transformToListNode = exports.convertUnwrappedLayoutContent = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _transforms = require("@atlaskit/editor-common/transforms");
9
10
  var _model = require("@atlaskit/editor-prosemirror/model");
10
11
  var _utils = require("@atlaskit/editor-prosemirror/utils");
11
12
  var _inlineNodeTransforms = require("../inline-node-transforms");
12
- var _transformBetweenListTypes = require("../list/transformBetweenListTypes");
13
13
  var _utils2 = require("../utils");
14
14
  var unwrapLayoutNodesToTextNodes = exports.unwrapLayoutNodesToTextNodes = function unwrapLayoutNodesToTextNodes(context, finalTargetNodeType) {
15
15
  var tr = context.tr,
@@ -80,57 +80,104 @@ var unwrapLayoutNodesToTextNodes = exports.unwrapLayoutNodesToTextNodes = functi
80
80
  }
81
81
  return [sourceNode];
82
82
  };
83
- var transformToBlockNode = function transformToBlockNode(nodes, targetNodeType, schema) {
84
- if (targetNodeType === schema.nodes.codeBlock) {
85
- var newNodes = [];
86
- nodes.forEach(function (node) {
87
- if (node.isTextblock) {
88
- var inlineTextContent = node.type === schema.nodes.codeBlock ? node.textContent : (0, _inlineNodeTransforms.getInlineNodeTextContent)(_model.Fragment.from(node));
89
-
90
- // For first node, add directly
91
- if (newNodes.length === 0) {
92
- newNodes.push({
93
- canBeTransformed: true,
94
- content: [inlineTextContent]
95
- });
96
- } else {
97
- // Check if last node can also be transformed, if yes then append content
98
- var lastItem = newNodes[newNodes.length - 1];
99
- if (lastItem.canBeTransformed) {
100
- newNodes[newNodes.length - 1] = {
101
- content: [].concat((0, _toConsumableArray2.default)(lastItem.content), [inlineTextContent]),
102
- canBeTransformed: true
103
- };
104
- } else {
105
- newNodes.push({
106
- content: [inlineTextContent],
107
- canBeTransformed: true
108
- });
109
- }
110
- }
83
+ var transformToCodeBlock = function transformToCodeBlock(nodes, schema) {
84
+ var newNodes = [];
85
+ var addToNewNodes = function addToNewNodes(content) {
86
+ if (newNodes.length === 0) {
87
+ newNodes.push({
88
+ canBeTransformed: true,
89
+ content: content
90
+ });
91
+ } else {
92
+ // Check if last node can also be transformed, if yes then append content
93
+ var lastItem = newNodes[newNodes.length - 1];
94
+ if (lastItem.canBeTransformed) {
95
+ newNodes[newNodes.length - 1] = {
96
+ content: [].concat((0, _toConsumableArray2.default)(lastItem.content), (0, _toConsumableArray2.default)(content)),
97
+ canBeTransformed: true
98
+ };
111
99
  } else {
112
- // If not text block, then cannot be transformed
113
100
  newNodes.push({
114
- canBeTransformed: false,
115
- content: node
101
+ content: content,
102
+ canBeTransformed: true
116
103
  });
117
104
  }
118
- });
119
- return newNodes.map(function (_ref) {
120
- var canBeTransformed = _ref.canBeTransformed,
121
- content = _ref.content;
122
- if (canBeTransformed) {
123
- var text = content.join('\n');
124
- if (text === '') {
125
- return undefined;
105
+ }
106
+ };
107
+ nodes.forEach(function (node) {
108
+ if (node.isTextblock) {
109
+ var inlineTextContent = node.type === schema.nodes.codeBlock ? node.textContent : (0, _inlineNodeTransforms.getInlineNodeTextContent)(_model.Fragment.from(node));
110
+
111
+ // For first node, add directly
112
+ addToNewNodes([inlineTextContent]);
113
+ } else if ((0, _utils2.isListNode)(node)) {
114
+ var textContent = [];
115
+ var listItemType = node.type === schema.nodes.taskList ? schema.nodes.taskItem : schema.nodes.listItem;
116
+ var listItems = (0, _utils.findChildrenByType)(node, listItemType).map(function (item) {
117
+ return item.node;
118
+ });
119
+ listItems.forEach(function (listItem) {
120
+ if (listItem.type === schema.nodes.taskItem) {
121
+ var _inlineTextContent = (0, _inlineNodeTransforms.getInlineNodeTextContent)(_model.Fragment.from(listItem));
122
+ textContent.push(_inlineTextContent);
123
+ } else {
124
+ var _inlineTextContent2 = (0, _inlineNodeTransforms.getInlineNodeTextContent)(listItem.content);
125
+ textContent.push(_inlineTextContent2);
126
126
  }
127
- return targetNodeType.createChecked(null, schema.text(text));
128
- } else {
129
- return content;
127
+ });
128
+ addToNewNodes(textContent);
129
+ } else {
130
+ // If not text block or list node, then cannot be transformed
131
+ newNodes.push({
132
+ canBeTransformed: false,
133
+ content: node
134
+ });
135
+ }
136
+ });
137
+ return newNodes.map(function (_ref) {
138
+ var canBeTransformed = _ref.canBeTransformed,
139
+ content = _ref.content;
140
+ if (canBeTransformed) {
141
+ var text = content.join('\n');
142
+ if (text === '') {
143
+ return undefined;
130
144
  }
131
- }).filter(Boolean);
145
+ return schema.nodes.codeBlock.createChecked(null, schema.text(text));
146
+ } else {
147
+ return content;
148
+ }
149
+ }).filter(Boolean);
150
+ };
151
+ var transformToBlockNode = function transformToBlockNode(nodes, targetNodeType, schema) {
152
+ if (targetNodeType === schema.nodes.codeBlock) {
153
+ return transformToCodeBlock(nodes, schema);
132
154
  }
133
- return nodes;
155
+ var newNodes = [];
156
+ nodes.forEach(function (node) {
157
+ if ((0, _utils2.isListNode)(node)) {
158
+ var listItemType = node.type === schema.nodes.taskList ? schema.nodes.taskItem : schema.nodes.listItem;
159
+ var listItems = (0, _utils.findChildrenByType)(node, listItemType).map(function (item) {
160
+ return item.node;
161
+ });
162
+ listItems.forEach(function (listItem) {
163
+ if (listItem.type === schema.nodes.taskItem) {
164
+ var inlineContent = (0, _toConsumableArray2.default)(listItem.content.content);
165
+ if (inlineContent.length > 0) {
166
+ newNodes.push(targetNodeType.createChecked(null, inlineContent));
167
+ }
168
+ } else {
169
+ listItem.forEach(function (child) {
170
+ if ((0, _utils2.isHeadingOrParagraphNode)(child)) {
171
+ newNodes.push(targetNodeType.createChecked(null, (0, _toConsumableArray2.default)(child.content.content)));
172
+ }
173
+ });
174
+ }
175
+ });
176
+ } else {
177
+ newNodes.push(node);
178
+ }
179
+ });
180
+ return newNodes;
134
181
  };
135
182
  var transformToContainerNode = function transformToContainerNode(nodes, targetNodeType) {
136
183
  var newNodes = [];
@@ -190,7 +237,7 @@ var transformToContainerNode = function transformToContainerNode(nodes, targetNo
190
237
  });
191
238
  };
192
239
  var transformToListNode = exports.transformToListNode = function transformToListNode(nodes, targetNodeType, schema) {
193
- var isTargetTask = (0, _utils2.isTaskList)(targetNodeType);
240
+ var isTargetTask = (0, _transforms.isTaskList)(targetNodeType);
194
241
  var listItems = [];
195
242
  var listItemType = isTargetTask ? schema.nodes.taskItem : schema.nodes.listItem;
196
243
  var isValid = (0, _utils2.getContentSupportChecker)(listItemType);
@@ -206,16 +253,16 @@ var transformToListNode = exports.transformToListNode = function transformToList
206
253
 
207
254
  // If the node is a list, we may need to transform it
208
255
  if ((0, _utils2.isListNode)(node)) {
209
- var isSourceBulletOrOrdered = (0, _utils2.isBulletOrOrderedList)(node.type);
210
- var _isTargetTask = (0, _utils2.isTaskList)(targetNodeType);
211
- var isSourceTask = (0, _utils2.isTaskList)(node.type);
212
- var isTargetBulletOrOrdered = (0, _utils2.isBulletOrOrderedList)(targetNodeType);
213
- var supportedListTypes = (0, _utils2.getSupportedListTypesSet)(schema.nodes);
256
+ var isSourceBulletOrOrdered = (0, _transforms.isBulletOrOrderedList)(node.type);
257
+ var _isTargetTask = (0, _transforms.isTaskList)(targetNodeType);
258
+ var isSourceTask = (0, _transforms.isTaskList)(node.type);
259
+ var isTargetBulletOrOrdered = (0, _transforms.isBulletOrOrderedList)(targetNodeType);
260
+ var supportedListTypes = (0, _transforms.getSupportedListTypesSet)(schema.nodes);
214
261
  if (node.type === targetNodeType) {
215
262
  // For the same list type, we can keep the structure
216
263
  newListItems = node.content.content;
217
264
  } else {
218
- var newList = (0, _transformBetweenListTypes.transformListRecursively)({
265
+ var newList = (0, _transforms.transformListRecursively)({
219
266
  isSourceBulletOrOrdered: isSourceBulletOrOrdered,
220
267
  isSourceTask: isSourceTask,
221
268
  isTargetBulletOrOrdered: isTargetBulletOrOrdered,
@@ -276,6 +323,9 @@ var transformToListNode = exports.transformToListNode = function transformToList
276
323
  });
277
324
  };
278
325
  var convertUnwrappedLayoutContent = exports.convertUnwrappedLayoutContent = function convertUnwrappedLayoutContent(nodes, targetNodeType, schema) {
326
+ if (nodes.length === 1 && nodes[0].content.size === 0) {
327
+ return nodes;
328
+ }
279
329
  if ((0, _utils2.isBlockNodeType)(targetNodeType)) {
280
330
  return transformToBlockNode(nodes, targetNodeType, schema);
281
331
  }
@@ -4,11 +4,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.transformListToContainer = exports.transformListToBlockNodes = exports.transformListNode = exports.transformBlockToList = exports.transformBetweenListTypes = exports.liftListToBlockType = void 0;
7
+ exports.transformListToContainer = exports.transformListToBlockNodes = exports.transformListNode = exports.transformBlockToList = exports.liftListToBlockType = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _transforms = require("@atlaskit/editor-common/transforms");
9
10
  var _model = require("@atlaskit/editor-prosemirror/model");
10
11
  var _transform = require("@atlaskit/editor-prosemirror/transform");
11
- var _transformBetweenListTypes = require("./list/transformBetweenListTypes");
12
12
  var _transformOrderedUnorderedListToBlockNodes = require("./list/transformOrderedUnorderedListToBlockNodes");
13
13
  var _transformTaskListToBlockNodes = require("./list/transformTaskListToBlockNodes");
14
14
  var _transformToTaskList = require("./list/transformToTaskList");
@@ -30,7 +30,7 @@ var transformBlockToList = exports.transformBlockToList = function transformBloc
30
30
  return null;
31
31
  }
32
32
  var nodes = tr.doc.type.schema.nodes;
33
- var isTargetTask = (0, _utils.isTaskList)(targetNodeType);
33
+ var isTargetTask = (0, _transforms.isTaskList)(targetNodeType);
34
34
 
35
35
  // Handle task lists differently due to their structure
36
36
  if (isTargetTask) {
@@ -145,7 +145,7 @@ var transformListNode = exports.transformListNode = function transformListNode(c
145
145
 
146
146
  // Transform between list types
147
147
  if ((0, _utils.isListNodeType)(targetNodeType)) {
148
- return transformBetweenListTypes(context);
148
+ return (0, _transforms.transformBetweenListTypes)(context);
149
149
  }
150
150
  return null;
151
151
  };
@@ -158,51 +158,4 @@ var liftListToBlockType = exports.liftListToBlockType = function liftListToBlock
158
158
  return null;
159
159
  };
160
160
 
161
- /**
162
- * Transform between different list types
163
- */
164
- var transformBetweenListTypes = exports.transformBetweenListTypes = function transformBetweenListTypes(context) {
165
- var tr = context.tr,
166
- sourceNode = context.sourceNode,
167
- sourcePos = context.sourcePos,
168
- targetNodeType = context.targetNodeType;
169
- var nodes = tr.doc.type.schema.nodes;
170
- var sourceListType = sourceNode.type;
171
- var isSourceBulletOrOrdered = (0, _utils.isBulletOrOrderedList)(sourceListType);
172
- var isTargetTask = (0, _utils.isTaskList)(targetNodeType);
173
- var isSourceTask = (0, _utils.isTaskList)(sourceListType);
174
- var isTargetBulletOrOrdered = (0, _utils.isBulletOrOrderedList)(targetNodeType);
175
-
176
- // Check if we need structure transformation
177
- var needsStructureTransform = isSourceBulletOrOrdered && isTargetTask || isSourceTask && isTargetBulletOrOrdered;
178
- try {
179
- if (!needsStructureTransform) {
180
- // Simple type change for same structure lists (bullet <-> ordered)
181
- // Apply to the main list
182
- tr.setNodeMarkup(sourcePos, targetNodeType);
183
-
184
- // Apply to nested lists
185
- var listStart = sourcePos;
186
- var listEnd = sourcePos + sourceNode.nodeSize;
187
- var supportedListTypesSet = (0, _utils.getSupportedListTypesSet)(nodes);
188
- tr.doc.nodesBetween(listStart, listEnd, function (node, pos, parent) {
189
- // Only process nested lists (not the root list we already handled)
190
- if (supportedListTypesSet.has(node.type) && pos !== sourcePos) {
191
- var isNestedList = parent && (supportedListTypesSet.has(parent.type) || parent.type === nodes.listItem);
192
- if (isNestedList) {
193
- var shouldTransformNode = node.type === sourceListType || (0, _utils.isBulletOrOrderedList)(node.type) && isTargetBulletOrOrdered;
194
- if (shouldTransformNode) {
195
- tr.setNodeMarkup(pos, targetNodeType);
196
- }
197
- }
198
- }
199
- return true; // Continue traversing
200
- });
201
- return tr;
202
- } else {
203
- return (0, _transformBetweenListTypes.transformListStructure)(context);
204
- }
205
- } catch (_unused) {
206
- return null;
207
- }
208
- };
161
+ // transformBetweenListTypes is now imported from @atlaskit/editor-common/transforms
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isTaskList = exports.isListNodeType = exports.isListNode = exports.isLayoutNodeType = exports.isLayoutNode = exports.isHeadingOrParagraphNode = exports.isContainerNodeType = exports.isContainerNode = exports.isBulletOrOrderedList = exports.isBlockNodeType = exports.isBlockNodeForExtraction = exports.isBlockNode = exports.getTargetNodeInfo = exports.getSupportedListTypesSet = exports.getSupportedListTypes = exports.getContentSupportChecker = exports.filterMarksForTargetNodeType = exports.convertNodeToInlineContent = exports.convertCodeBlockContentToParagraphs = void 0;
6
+ exports.isListNodeType = exports.isListNode = exports.isLayoutNodeType = exports.isLayoutNode = exports.isHeadingOrParagraphNode = exports.isContainerNodeType = exports.isContainerNode = exports.isBlockNodeType = exports.isBlockNodeForExtraction = exports.isBlockNode = exports.getTargetNodeInfo = exports.getContentSupportChecker = exports.filterMarksForTargetNodeType = exports.convertNodeToInlineContent = exports.convertCodeBlockContentToParagraphs = void 0;
7
7
  var _model = require("@atlaskit/editor-prosemirror/model");
8
8
  var getTargetNodeInfo = exports.getTargetNodeInfo = function getTargetNodeInfo(targetType, nodes) {
9
9
  switch (targetType) {
@@ -116,19 +116,8 @@ var isContainerNodeType = exports.isContainerNodeType = function isContainerNode
116
116
  return ['panel', 'expand', 'blockquote'].includes(nodeType.name);
117
117
  };
118
118
 
119
- // List type utilities
120
- var isBulletOrOrderedList = exports.isBulletOrOrderedList = function isBulletOrOrderedList(nodeType) {
121
- return nodeType.name === 'bulletList' || nodeType.name === 'orderedList';
122
- };
123
- var isTaskList = exports.isTaskList = function isTaskList(nodeType) {
124
- return nodeType.name === 'taskList';
125
- };
126
- var getSupportedListTypes = exports.getSupportedListTypes = function getSupportedListTypes(nodes) {
127
- return [nodes.bulletList, nodes.orderedList, nodes.taskList].filter(Boolean);
128
- };
129
- var getSupportedListTypesSet = exports.getSupportedListTypesSet = function getSupportedListTypesSet(nodes) {
130
- return new Set(getSupportedListTypes(nodes));
131
- };
119
+ // List type utilities moved to @atlaskit/editor-common/transforms
120
+
132
121
  var isLayoutNodeType = exports.isLayoutNodeType = function isLayoutNodeType(nodeType) {
133
122
  return nodeType.name === 'layoutSection';
134
123
  };
@@ -5,7 +5,7 @@ export const getInlineNodeTextContent = sourceContent => {
5
5
  }
6
6
  // Headings are not valid inside headings so convert heading nodes to paragraphs
7
7
  sourceContent.forEach(node => {
8
- if (['paragraph', 'heading'].includes(node.type.name)) {
8
+ if (['paragraph', 'heading', 'taskItem'].includes(node.type.name)) {
9
9
  node.content.forEach(inlineNode => {
10
10
  if (inlineNode.type.name === 'status') {
11
11
  validTransformedContent += inlineNode.attrs.text;
@@ -1,8 +1,8 @@
1
+ import { transformListRecursively, isBulletOrOrderedList, isTaskList, getSupportedListTypesSet } from '@atlaskit/editor-common/transforms';
1
2
  import { Fragment } from '@atlaskit/editor-prosemirror/model';
2
3
  import { findChildrenByType } from '@atlaskit/editor-prosemirror/utils';
3
4
  import { getInlineNodeTextContent } from '../inline-node-transforms';
4
- import { transformListRecursively } from '../list/transformBetweenListTypes';
5
- import { getContentSupportChecker, getSupportedListTypesSet, isBlockNode, isBlockNodeForExtraction, isBlockNodeType, isBulletOrOrderedList, isContainerNode, isContainerNodeType, isHeadingOrParagraphNode, isListNode, isListNodeType, isTaskList } from '../utils';
5
+ import { getContentSupportChecker, isBlockNode, isBlockNodeForExtraction, isBlockNodeType, isContainerNode, isContainerNodeType, isHeadingOrParagraphNode, isListNode, isListNodeType } from '../utils';
6
6
  export const unwrapLayoutNodesToTextNodes = (context, finalTargetNodeType) => {
7
7
  const {
8
8
  tr,
@@ -62,58 +62,101 @@ export const unwrapLayoutNodesToTextNodes = (context, finalTargetNodeType) => {
62
62
  }
63
63
  return [sourceNode];
64
64
  };
65
- const transformToBlockNode = (nodes, targetNodeType, schema) => {
66
- if (targetNodeType === schema.nodes.codeBlock) {
67
- const newNodes = [];
68
- nodes.forEach(node => {
69
- if (node.isTextblock) {
70
- const inlineTextContent = node.type === schema.nodes.codeBlock ? node.textContent : getInlineNodeTextContent(Fragment.from(node));
71
-
72
- // For first node, add directly
73
- if (newNodes.length === 0) {
74
- newNodes.push({
75
- canBeTransformed: true,
76
- content: [inlineTextContent]
77
- });
78
- } else {
79
- // Check if last node can also be transformed, if yes then append content
80
- const lastItem = newNodes[newNodes.length - 1];
81
- if (lastItem.canBeTransformed) {
82
- newNodes[newNodes.length - 1] = {
83
- content: [...lastItem.content, inlineTextContent],
84
- canBeTransformed: true
85
- };
86
- } else {
87
- newNodes.push({
88
- content: [inlineTextContent],
89
- canBeTransformed: true
90
- });
91
- }
92
- }
65
+ const transformToCodeBlock = (nodes, schema) => {
66
+ const newNodes = [];
67
+ const addToNewNodes = content => {
68
+ if (newNodes.length === 0) {
69
+ newNodes.push({
70
+ canBeTransformed: true,
71
+ content
72
+ });
73
+ } else {
74
+ // Check if last node can also be transformed, if yes then append content
75
+ const lastItem = newNodes[newNodes.length - 1];
76
+ if (lastItem.canBeTransformed) {
77
+ newNodes[newNodes.length - 1] = {
78
+ content: [...lastItem.content, ...content],
79
+ canBeTransformed: true
80
+ };
93
81
  } else {
94
- // If not text block, then cannot be transformed
95
82
  newNodes.push({
96
- canBeTransformed: false,
97
- content: node
83
+ content,
84
+ canBeTransformed: true
98
85
  });
99
86
  }
100
- });
101
- return newNodes.map(({
102
- canBeTransformed,
103
- content
104
- }) => {
105
- if (canBeTransformed) {
106
- const text = content.join('\n');
107
- if (text === '') {
108
- return undefined;
87
+ }
88
+ };
89
+ nodes.forEach(node => {
90
+ if (node.isTextblock) {
91
+ const inlineTextContent = node.type === schema.nodes.codeBlock ? node.textContent : getInlineNodeTextContent(Fragment.from(node));
92
+
93
+ // For first node, add directly
94
+ addToNewNodes([inlineTextContent]);
95
+ } else if (isListNode(node)) {
96
+ const textContent = [];
97
+ const listItemType = node.type === schema.nodes.taskList ? schema.nodes.taskItem : schema.nodes.listItem;
98
+ const listItems = findChildrenByType(node, listItemType).map(item => item.node);
99
+ listItems.forEach(listItem => {
100
+ if (listItem.type === schema.nodes.taskItem) {
101
+ const inlineTextContent = getInlineNodeTextContent(Fragment.from(listItem));
102
+ textContent.push(inlineTextContent);
103
+ } else {
104
+ const inlineTextContent = getInlineNodeTextContent(listItem.content);
105
+ textContent.push(inlineTextContent);
109
106
  }
110
- return targetNodeType.createChecked(null, schema.text(text));
111
- } else {
112
- return content;
107
+ });
108
+ addToNewNodes(textContent);
109
+ } else {
110
+ // If not text block or list node, then cannot be transformed
111
+ newNodes.push({
112
+ canBeTransformed: false,
113
+ content: node
114
+ });
115
+ }
116
+ });
117
+ return newNodes.map(({
118
+ canBeTransformed,
119
+ content
120
+ }) => {
121
+ if (canBeTransformed) {
122
+ const text = content.join('\n');
123
+ if (text === '') {
124
+ return undefined;
113
125
  }
114
- }).filter(Boolean);
126
+ return schema.nodes.codeBlock.createChecked(null, schema.text(text));
127
+ } else {
128
+ return content;
129
+ }
130
+ }).filter(Boolean);
131
+ };
132
+ const transformToBlockNode = (nodes, targetNodeType, schema) => {
133
+ if (targetNodeType === schema.nodes.codeBlock) {
134
+ return transformToCodeBlock(nodes, schema);
115
135
  }
116
- return nodes;
136
+ const newNodes = [];
137
+ nodes.forEach(node => {
138
+ if (isListNode(node)) {
139
+ const listItemType = node.type === schema.nodes.taskList ? schema.nodes.taskItem : schema.nodes.listItem;
140
+ const listItems = findChildrenByType(node, listItemType).map(item => item.node);
141
+ listItems.forEach(listItem => {
142
+ if (listItem.type === schema.nodes.taskItem) {
143
+ const inlineContent = [...listItem.content.content];
144
+ if (inlineContent.length > 0) {
145
+ newNodes.push(targetNodeType.createChecked(null, inlineContent));
146
+ }
147
+ } else {
148
+ listItem.forEach(child => {
149
+ if (isHeadingOrParagraphNode(child)) {
150
+ newNodes.push(targetNodeType.createChecked(null, [...child.content.content]));
151
+ }
152
+ });
153
+ }
154
+ });
155
+ } else {
156
+ newNodes.push(node);
157
+ }
158
+ });
159
+ return newNodes;
117
160
  };
118
161
  const transformToContainerNode = (nodes, targetNodeType) => {
119
162
  const newNodes = [];
@@ -259,6 +302,9 @@ export const transformToListNode = (nodes, targetNodeType, schema) => {
259
302
  });
260
303
  };
261
304
  export const convertUnwrappedLayoutContent = (nodes, targetNodeType, schema) => {
305
+ if (nodes.length === 1 && nodes[0].content.size === 0) {
306
+ return nodes;
307
+ }
262
308
  if (isBlockNodeType(targetNodeType)) {
263
309
  return transformToBlockNode(nodes, targetNodeType, schema);
264
310
  }
@@ -1,10 +1,10 @@
1
+ import { transformBetweenListTypes, isTaskList } from '@atlaskit/editor-common/transforms';
1
2
  import { Fragment } from '@atlaskit/editor-prosemirror/model';
2
3
  import { findWrapping } from '@atlaskit/editor-prosemirror/transform';
3
- import { transformListStructure } from './list/transformBetweenListTypes';
4
4
  import { transformOrderedUnorderedListToBlockNodes } from './list/transformOrderedUnorderedListToBlockNodes';
5
5
  import { transformTaskListToBlockNodes } from './list/transformTaskListToBlockNodes';
6
6
  import { transformToTaskList } from './list/transformToTaskList';
7
- import { getSupportedListTypesSet, isBulletOrOrderedList, isBlockNodeType, isContainerNodeType, isListNodeType, isTaskList } from './utils';
7
+ import { isBlockNodeType, isContainerNodeType, isListNodeType } from './utils';
8
8
 
9
9
  /**
10
10
  * Transform selection to list type
@@ -165,55 +165,4 @@ export const liftListToBlockType = () => {
165
165
  return null;
166
166
  };
167
167
 
168
- /**
169
- * Transform between different list types
170
- */
171
- export const transformBetweenListTypes = context => {
172
- const {
173
- tr,
174
- sourceNode,
175
- sourcePos,
176
- targetNodeType
177
- } = context;
178
- const {
179
- nodes
180
- } = tr.doc.type.schema;
181
- const sourceListType = sourceNode.type;
182
- const isSourceBulletOrOrdered = isBulletOrOrderedList(sourceListType);
183
- const isTargetTask = isTaskList(targetNodeType);
184
- const isSourceTask = isTaskList(sourceListType);
185
- const isTargetBulletOrOrdered = isBulletOrOrderedList(targetNodeType);
186
-
187
- // Check if we need structure transformation
188
- const needsStructureTransform = isSourceBulletOrOrdered && isTargetTask || isSourceTask && isTargetBulletOrOrdered;
189
- try {
190
- if (!needsStructureTransform) {
191
- // Simple type change for same structure lists (bullet <-> ordered)
192
- // Apply to the main list
193
- tr.setNodeMarkup(sourcePos, targetNodeType);
194
-
195
- // Apply to nested lists
196
- const listStart = sourcePos;
197
- const listEnd = sourcePos + sourceNode.nodeSize;
198
- const supportedListTypesSet = getSupportedListTypesSet(nodes);
199
- tr.doc.nodesBetween(listStart, listEnd, (node, pos, parent) => {
200
- // Only process nested lists (not the root list we already handled)
201
- if (supportedListTypesSet.has(node.type) && pos !== sourcePos) {
202
- const isNestedList = parent && (supportedListTypesSet.has(parent.type) || parent.type === nodes.listItem);
203
- if (isNestedList) {
204
- const shouldTransformNode = node.type === sourceListType || isBulletOrOrderedList(node.type) && isTargetBulletOrOrdered;
205
- if (shouldTransformNode) {
206
- tr.setNodeMarkup(pos, targetNodeType);
207
- }
208
- }
209
- }
210
- return true; // Continue traversing
211
- });
212
- return tr;
213
- } else {
214
- return transformListStructure(context);
215
- }
216
- } catch {
217
- return null;
218
- }
219
- };
168
+ // transformBetweenListTypes is now imported from @atlaskit/editor-common/transforms
@@ -110,19 +110,8 @@ export const isContainerNodeType = nodeType => {
110
110
  return ['panel', 'expand', 'blockquote'].includes(nodeType.name);
111
111
  };
112
112
 
113
- // List type utilities
114
- export const isBulletOrOrderedList = nodeType => {
115
- return nodeType.name === 'bulletList' || nodeType.name === 'orderedList';
116
- };
117
- export const isTaskList = nodeType => {
118
- return nodeType.name === 'taskList';
119
- };
120
- export const getSupportedListTypes = nodes => {
121
- return [nodes.bulletList, nodes.orderedList, nodes.taskList].filter(Boolean);
122
- };
123
- export const getSupportedListTypesSet = nodes => {
124
- return new Set(getSupportedListTypes(nodes));
125
- };
113
+ // List type utilities moved to @atlaskit/editor-common/transforms
114
+
126
115
  export const isLayoutNodeType = nodeType => {
127
116
  return nodeType.name === 'layoutSection';
128
117
  };
@@ -5,7 +5,7 @@ export var getInlineNodeTextContent = function getInlineNodeTextContent(sourceCo
5
5
  }
6
6
  // Headings are not valid inside headings so convert heading nodes to paragraphs
7
7
  sourceContent.forEach(function (node) {
8
- if (['paragraph', 'heading'].includes(node.type.name)) {
8
+ if (['paragraph', 'heading', 'taskItem'].includes(node.type.name)) {
9
9
  node.content.forEach(function (inlineNode) {
10
10
  if (inlineNode.type.name === 'status') {
11
11
  validTransformedContent += inlineNode.attrs.text;