@atlaskit/editor-plugin-block-menu 1.0.2 → 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.
Files changed (37) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/editor-commands/formatNode.js +2 -2
  3. package/dist/cjs/editor-commands/transforms/container-transforms.js +60 -4
  4. package/dist/cjs/editor-commands/transforms/list/transformBetweenListTypes.js +69 -71
  5. package/dist/cjs/editor-commands/transforms/list/transformToTaskList.js +44 -0
  6. package/dist/cjs/editor-commands/transforms/list-transforms.js +40 -30
  7. package/dist/cjs/editor-commands/transforms/utils.js +16 -2
  8. package/dist/cjs/ui/block-menu-components.js +2 -1
  9. package/dist/es2019/editor-commands/formatNode.js +2 -2
  10. package/dist/es2019/editor-commands/transforms/container-transforms.js +64 -4
  11. package/dist/es2019/editor-commands/transforms/list/transformBetweenListTypes.js +73 -70
  12. package/dist/es2019/editor-commands/transforms/list/transformToTaskList.js +38 -0
  13. package/dist/es2019/editor-commands/transforms/list-transforms.js +38 -28
  14. package/dist/es2019/editor-commands/transforms/utils.js +15 -1
  15. package/dist/es2019/ui/block-menu-components.js +2 -1
  16. package/dist/esm/editor-commands/formatNode.js +2 -2
  17. package/dist/esm/editor-commands/transforms/container-transforms.js +60 -4
  18. package/dist/esm/editor-commands/transforms/list/transformBetweenListTypes.js +70 -71
  19. package/dist/esm/editor-commands/transforms/list/transformToTaskList.js +37 -0
  20. package/dist/esm/editor-commands/transforms/list-transforms.js +37 -27
  21. package/dist/esm/editor-commands/transforms/utils.js +15 -1
  22. package/dist/esm/ui/block-menu-components.js +2 -1
  23. package/dist/types/editor-commands/transforms/container-transforms.d.ts +1 -1
  24. package/dist/types/editor-commands/transforms/list/transformBetweenListTypes.d.ts +3 -7
  25. package/dist/types/editor-commands/transforms/list/transformToTaskList.d.ts +10 -0
  26. package/dist/types/editor-commands/transforms/list-transforms.d.ts +1 -1
  27. package/dist/types/editor-commands/transforms/transformNodeToTargetType.d.ts +1 -1
  28. package/dist/types/editor-commands/transforms/types.d.ts +1 -1
  29. package/dist/types/editor-commands/transforms/utils.d.ts +4 -0
  30. package/dist/types-ts4.5/editor-commands/transforms/container-transforms.d.ts +1 -1
  31. package/dist/types-ts4.5/editor-commands/transforms/list/transformBetweenListTypes.d.ts +3 -7
  32. package/dist/types-ts4.5/editor-commands/transforms/list/transformToTaskList.d.ts +10 -0
  33. package/dist/types-ts4.5/editor-commands/transforms/list-transforms.d.ts +1 -1
  34. package/dist/types-ts4.5/editor-commands/transforms/transformNodeToTargetType.d.ts +1 -1
  35. package/dist/types-ts4.5/editor-commands/transforms/types.d.ts +1 -1
  36. package/dist/types-ts4.5/editor-commands/transforms/utils.d.ts +4 -0
  37. package/package.json +6 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @atlaskit/editor-plugin-block-menu
2
2
 
3
+ ## 1.0.4
4
+
5
+ ### Patch Changes
6
+
7
+ - [`30454d0f4baf2`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/30454d0f4baf2) -
8
+ Support multiple levels list to list transform
9
+ - [`cb4decb701766`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/cb4decb701766) -
10
+ [ux] Enable max height on block menu flyout menu
11
+ - Updated dependencies
12
+
13
+ ## 1.0.3
14
+
15
+ ### Patch Changes
16
+
17
+ - [`3db18eece6c2f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/3db18eece6c2f) -
18
+ [ux] Adds basic conversion from expand, panel, blockquote to bulled, numbered or task list.
19
+ - Updated dependencies
20
+
3
21
  ## 1.0.2
4
22
 
5
23
  ### Patch Changes
@@ -18,7 +18,7 @@ var formatNode = exports.formatNode = function formatNode(targetType) {
18
18
 
19
19
  // Find the node to format from the current selection
20
20
  var nodeToFormat;
21
- var nodePos = null;
21
+ var nodePos = selection.from;
22
22
 
23
23
  // Try to find the current node from selection
24
24
  var selectedNode = (0, _utils.findSelectedNodeOfType)([nodes.paragraph, nodes.heading, nodes.blockquote, nodes.panel, nodes.expand, nodes.codeBlock, nodes.bulletList, nodes.orderedList, nodes.taskList, nodes.layoutSection])(selection);
@@ -40,7 +40,7 @@ var formatNode = exports.formatNode = function formatNode(targetType) {
40
40
  nodeToFormat = listParent.node;
41
41
  nodePos = listParent.pos;
42
42
  }
43
- } else if (paragraphOrHeadingNode) {
43
+ } else if (parentNode.node.type !== nodes.blockquote && paragraphOrHeadingNode) {
44
44
  nodeToFormat = paragraphOrHeadingNode.node;
45
45
  nodePos = paragraphOrHeadingNode.pos;
46
46
  }
@@ -50,6 +50,7 @@ var transformToContainer = exports.transformToContainer = function transformToCo
50
50
  */
51
51
  var transformContainerNode = exports.transformContainerNode = function transformContainerNode(_ref2) {
52
52
  var tr = _ref2.tr,
53
+ sourceNode = _ref2.sourceNode,
53
54
  sourcePos = _ref2.sourcePos,
54
55
  targetNodeType = _ref2.targetNodeType,
55
56
  targetAttrs = _ref2.targetAttrs;
@@ -64,7 +65,13 @@ var transformContainerNode = exports.transformContainerNode = function transform
64
65
 
65
66
  // Transform container to list type
66
67
  if ((0, _utils.isListNodeType)(targetNodeType)) {
67
- return unwrapAndConvertToList();
68
+ return unwrapAndConvertToList({
69
+ tr: tr,
70
+ sourceNode: sourceNode,
71
+ sourcePos: sourcePos,
72
+ targetNodeType: targetNodeType,
73
+ targetAttrs: targetAttrs
74
+ });
68
75
  }
69
76
 
70
77
  // Transform between container types
@@ -86,7 +93,56 @@ var unwrapAndConvertToBlockType = exports.unwrapAndConvertToBlockType = function
86
93
  /**
87
94
  * Unwrap container node and convert content to list
88
95
  */
89
- var unwrapAndConvertToList = exports.unwrapAndConvertToList = function unwrapAndConvertToList() {
90
- // Convert to list directly
91
- return null;
96
+ var unwrapAndConvertToList = exports.unwrapAndConvertToList = function unwrapAndConvertToList(_ref3) {
97
+ var tr = _ref3.tr,
98
+ sourceNode = _ref3.sourceNode,
99
+ sourcePos = _ref3.sourcePos,
100
+ targetNodeType = _ref3.targetNodeType,
101
+ targetAttrs = _ref3.targetAttrs;
102
+ if (sourcePos === null) {
103
+ return tr;
104
+ }
105
+ var schema = tr.doc.type.schema;
106
+ var _schema$nodes = schema.nodes,
107
+ listItem = _schema$nodes.listItem,
108
+ paragraph = _schema$nodes.paragraph,
109
+ taskList = _schema$nodes.taskList,
110
+ taskItem = _schema$nodes.taskItem;
111
+ var isTargetTaskList = targetNodeType === taskList;
112
+ var createListItemFromInline = function createListItemFromInline(inlineFrag) {
113
+ return isTargetTaskList ? taskItem.create(null, inlineFrag) : listItem.create(null, paragraph.create(null, inlineFrag));
114
+ };
115
+ var getInlineContent = function getInlineContent(textblock) {
116
+ var inlineContent = [];
117
+ textblock.forEach(function (inline) {
118
+ inlineContent.push(inline);
119
+ });
120
+ return inlineContent;
121
+ };
122
+ var items = [];
123
+
124
+ // Expand's title should become the first item of the list
125
+ if (sourceNode.type.name === 'expand') {
126
+ var _sourceNode$attrs;
127
+ var title = (_sourceNode$attrs = sourceNode.attrs) === null || _sourceNode$attrs === void 0 ? void 0 : _sourceNode$attrs.title;
128
+ if (title) {
129
+ var titleContent = schema.text(title);
130
+ items.push(isTargetTaskList ? taskItem.create(null, titleContent) : listItem.create(null, paragraph.create(null, titleContent)));
131
+ }
132
+ }
133
+ for (var i = 0; i < sourceNode.childCount; i++) {
134
+ var node = sourceNode.child(i);
135
+
136
+ // Abort early if unsupported content (e.g. table) encounted inside of the container
137
+ if (!node.isTextblock) {
138
+ return tr;
139
+ }
140
+ var inline = _model.Fragment.from(getInlineContent(node));
141
+ items.push(createListItemFromInline(inline));
142
+ }
143
+ if (!items.length) {
144
+ return tr;
145
+ }
146
+ var list = targetNodeType.create(targetAttrs || null, _model.Fragment.from(items));
147
+ return tr.replaceWith(sourcePos, sourcePos + sourceNode.nodeSize, list);
92
148
  };
@@ -6,95 +6,93 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.transformListStructure = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _utils = require("../utils");
9
10
  /**
10
- * Extract all inline content from a node
11
+ * Convert a block node to inline content suitable for task items
11
12
  */
12
- var extractInlineContent = function extractInlineContent(node) {
13
- var inlineContent = [];
14
- for (var i = 0; i < node.childCount; i++) {
15
- inlineContent.push(node.child(i));
13
+ var convertBlockToInlineContent = function convertBlockToInlineContent(node, schema) {
14
+ var paragraph = schema.nodes.paragraph;
15
+ if (node.type === paragraph) {
16
+ return (0, _toConsumableArray2.default)(node.content.content);
16
17
  }
17
- return inlineContent;
18
+ if (node.isBlock) {
19
+ var textContent = node.textContent;
20
+ return textContent ? [schema.text(textContent)] : [];
21
+ }
22
+ return [node];
18
23
  };
19
24
 
20
25
  /**
21
- * Transform list structure
26
+ * Transform list structure between different list types
22
27
  */
23
- var transformListStructure = exports.transformListStructure = function transformListStructure(tr, listNode, targetNodeType, nodes) {
28
+ var transformListStructure = exports.transformListStructure = function transformListStructure(context) {
29
+ var tr = context.tr,
30
+ sourceNode = context.sourceNode,
31
+ sourcePos = context.sourcePos,
32
+ targetNodeType = context.targetNodeType;
33
+ var nodes = tr.doc.type.schema.nodes;
24
34
  try {
35
+ var listNode = {
36
+ node: sourceNode,
37
+ pos: sourcePos
38
+ };
25
39
  var sourceList = listNode.node,
26
40
  listPos = listNode.pos;
27
- var bulletList = nodes.bulletList,
28
- orderedList = nodes.orderedList,
29
- taskList = nodes.taskList,
41
+ var taskList = nodes.taskList,
30
42
  listItem = nodes.listItem,
31
43
  taskItem = nodes.taskItem,
32
44
  paragraph = nodes.paragraph;
33
- var isSourceBulletOrOrdered = sourceList.type === bulletList || sourceList.type === orderedList;
34
- var isTargetTask = targetNodeType === taskList;
35
- var isSourceTask = sourceList.type === taskList;
36
- var newListItems = [];
37
- var listStart = listPos;
38
- var listEnd = listPos + sourceList.nodeSize;
39
-
40
- // Use nodesBetween to efficiently traverse the list structure
41
- tr.doc.nodesBetween(listStart, listEnd, function (node, pos, parent) {
42
- // Only process direct children of the list (depth 1)
43
- if (parent !== sourceList) {
44
- return true; // Continue traversal
45
- }
46
- if (isSourceBulletOrOrdered && isTargetTask) {
47
- // Converting from bullet/ordered list to task list
48
- // Extract inline content from all children within listItem
49
- if (node.type === listItem) {
50
- var inlineContent = [];
51
-
52
- // Extract all inline content from all child nodes
53
- for (var i = 0; i < node.childCount; i++) {
54
- var child = node.child(i);
55
- if (child.type === paragraph) {
56
- // Extract inline content from paragraphs
57
- inlineContent.push.apply(inlineContent, (0, _toConsumableArray2.default)(extractInlineContent(child)));
58
- } else if (child.isBlock) {
59
- // For other block content types eg. codeBlock, extract their text content and create text nodes
60
- var textContent = child.textContent;
61
- if (textContent) {
62
- var textNode = tr.doc.type.schema.text(textContent);
63
- inlineContent.push(textNode);
45
+ var isSourceBulletOrOrdered = (0, _utils.isBulletOrOrderedList)(sourceList.type);
46
+ var isTargetTask = (0, _utils.isTaskList)(targetNodeType);
47
+ var isSourceTask = (0, _utils.isTaskList)(sourceList.type);
48
+ var isTargetBulletOrOrdered = (0, _utils.isBulletOrOrderedList)(targetNodeType);
49
+ var supportedListTypes = (0, _utils.getSupportedListTypesSet)(nodes);
50
+ var _transformListRecursively = function transformListRecursively(listNode) {
51
+ var transformedItems = [];
52
+ listNode.forEach(function (child) {
53
+ if (isSourceBulletOrOrdered && isTargetTask) {
54
+ // Convert bullet/ordered => task
55
+ if (child.type === listItem) {
56
+ var inlineContent = [];
57
+ var nestedTaskLists = [];
58
+ child.forEach(function (grandChild) {
59
+ if (supportedListTypes.has(grandChild.type) && grandChild.type !== taskList) {
60
+ nestedTaskLists.push(_transformListRecursively(grandChild));
61
+ } else {
62
+ inlineContent.push.apply(inlineContent, (0, _toConsumableArray2.default)(convertBlockToInlineContent(grandChild, tr.doc.type.schema)));
64
63
  }
65
- } else {
66
- // Already inline content, add directly
67
- inlineContent.push(child);
64
+ });
65
+ if (inlineContent.length > 0) {
66
+ transformedItems.push(taskItem.create(null, inlineContent));
68
67
  }
68
+ transformedItems.push.apply(transformedItems, nestedTaskLists);
69
69
  }
70
- if (inlineContent.length > 0) {
71
- var newItem = taskItem.create(null, inlineContent);
72
- newListItems.push(newItem);
73
- }
74
- }
75
- } else if (isSourceTask && !isTargetTask) {
76
- // Converting from task list to bullet/ordered list
77
- // Structure: taskItem > inline content -> listItem > paragraph > inline content
78
- if (node.type === taskItem) {
79
- var _inlineContent = extractInlineContent(node);
80
- if (_inlineContent.length > 0) {
81
- var paragraphNode = paragraph.create(null, _inlineContent);
82
- var newListItem = listItem.create(null, paragraphNode);
83
- newListItems.push(newListItem);
70
+ } else if (isSourceTask && isTargetBulletOrOrdered) {
71
+ // Convert task => bullet/ordered
72
+ if (child.type === taskItem) {
73
+ var _inlineContent = (0, _toConsumableArray2.default)(child.content.content);
74
+ if (_inlineContent.length > 0) {
75
+ var paragraphNode = paragraph.create(null, _inlineContent);
76
+ transformedItems.push(listItem.create(null, [paragraphNode]));
77
+ }
78
+ } else if (child.type === taskList) {
79
+ var transformedNestedList = _transformListRecursively(child);
80
+ var lastItem = transformedItems[transformedItems.length - 1];
81
+ if ((lastItem === null || lastItem === void 0 ? void 0 : lastItem.type) === listItem) {
82
+ // Attach nested list to previous item
83
+ var updatedContent = [].concat((0, _toConsumableArray2.default)(lastItem.content.content), [transformedNestedList]);
84
+ transformedItems[transformedItems.length - 1] = listItem.create(lastItem.attrs, updatedContent);
85
+ } else {
86
+ // No previous item, flatten nested items
87
+ transformedItems.push.apply(transformedItems, (0, _toConsumableArray2.default)(transformedNestedList.content.content));
88
+ }
84
89
  }
85
90
  }
86
- }
87
- return false; // Don't traverse into children of list items
88
- });
89
- if (newListItems.length === 0) {
90
- return tr;
91
- }
92
-
93
- // Create new list with transformed items
94
- var newList = targetNodeType.create(null, newListItems);
95
-
96
- // Replace the entire list
97
- tr.replaceWith(listStart, listEnd, newList);
91
+ });
92
+ return targetNodeType.create(null, transformedItems);
93
+ };
94
+ var newList = _transformListRecursively(sourceList);
95
+ tr.replaceWith(listPos, listPos + sourceList.nodeSize, newList);
98
96
  return tr;
99
97
  } catch (_unused) {
100
98
  return tr;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.transformToTaskList = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ /**
10
+ * Transform selection to task list
11
+ * Handles the special structure where taskItem contains text directly (no paragraph wrapper)
12
+ */
13
+ var transformToTaskList = exports.transformToTaskList = function transformToTaskList(tr, range, targetNodeType, targetAttrs, nodes) {
14
+ try {
15
+ var taskItem = nodes.taskItem;
16
+ var listItems = [];
17
+
18
+ // Process each block in the range
19
+ tr.doc.nodesBetween(range.start, range.end, function (node) {
20
+ if (node.isBlock) {
21
+ // For block nodes like paragraphs, directly use their inline content
22
+ var inlineContent = (0, _toConsumableArray2.default)(node.content.content);
23
+ if (inlineContent.length > 0) {
24
+ // Create task item with inline content directly
25
+ var listItem = taskItem.create(targetAttrs, inlineContent);
26
+ listItems.push(listItem);
27
+ }
28
+ }
29
+ return false; // Don't traverse into children
30
+ });
31
+ if (listItems.length === 0) {
32
+ return null;
33
+ }
34
+
35
+ // Create the new task list
36
+ var newList = targetNodeType.create(targetAttrs, listItems);
37
+
38
+ // Replace the range with the new list
39
+ tr.replaceWith(range.start, range.end, newList);
40
+ return tr;
41
+ } catch (_unused) {
42
+ return null;
43
+ }
44
+ };
@@ -5,16 +5,17 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.transformListToBlockNodes = exports.transformListNode = exports.transformBlockToList = exports.transformBetweenListTypes = exports.liftListToBlockType = void 0;
7
7
  var _transform = require("@atlaskit/editor-prosemirror/transform");
8
- var _utils = require("@atlaskit/editor-prosemirror/utils");
9
8
  var _transformBetweenListTypes = require("./list/transformBetweenListTypes");
10
9
  var _transformOrderedUnorderedListToBlockNodes = require("./list/transformOrderedUnorderedListToBlockNodes");
11
10
  var _transformTaskListToBlockNodes = require("./list/transformTaskListToBlockNodes");
12
- var _utils2 = require("./utils");
11
+ var _transformToTaskList = require("./list/transformToTaskList");
12
+ var _utils = require("./utils");
13
13
  /**
14
14
  * Transform selection to list type
15
15
  */
16
16
  var transformBlockToList = exports.transformBlockToList = function transformBlockToList(context) {
17
17
  var tr = context.tr,
18
+ sourceNode = context.sourceNode,
18
19
  targetNodeType = context.targetNodeType,
19
20
  targetAttrs = context.targetAttrs;
20
21
  var _tr$selection = tr.selection,
@@ -25,16 +26,14 @@ var transformBlockToList = exports.transformBlockToList = function transformBloc
25
26
  return null;
26
27
  }
27
28
  var nodes = tr.doc.type.schema.nodes;
28
- var isTargetTask = targetNodeType === nodes.taskList;
29
+ var isTargetTask = (0, _utils.isTaskList)(targetNodeType);
29
30
 
30
31
  // Handle task lists differently due to their structure
31
- // TODO: ED-29152 - Implement task list transformation
32
32
  if (isTargetTask) {
33
- return null;
33
+ return (0, _transformToTaskList.transformToTaskList)(tr, range, targetNodeType, targetAttrs, nodes);
34
34
  }
35
35
 
36
36
  // For headings, convert to paragraph first since headings cannot be direct children of list items
37
- var sourceNode = tr.doc.nodeAt(range.start);
38
37
  if (sourceNode && sourceNode.type.name.startsWith('heading')) {
39
38
  tr.setBlockType(range.start, range.end, nodes.paragraph);
40
39
  }
@@ -69,19 +68,19 @@ var transformListToBlockNodes = exports.transformListToBlockNodes = function tra
69
68
  var transformListNode = exports.transformListNode = function transformListNode(context) {
70
69
  var targetNodeType = context.targetNodeType;
71
70
  // Transform list to block type
72
- if ((0, _utils2.isBlockNodeType)(targetNodeType)) {
71
+ if ((0, _utils.isBlockNodeType)(targetNodeType)) {
73
72
  // Lift list items out of the list and convert to target block type
74
73
  return transformListToBlockNodes(context);
75
74
  }
76
75
 
77
76
  // Transform list to container type
78
- if ((0, _utils2.isContainerNodeType)(targetNodeType)) {
77
+ if ((0, _utils.isContainerNodeType)(targetNodeType)) {
79
78
  // Lift list items out of the list and convert to container type
80
79
  return null;
81
80
  }
82
81
 
83
82
  // Transform between list types
84
- if ((0, _utils2.isListNodeType)(targetNodeType)) {
83
+ if ((0, _utils.isListNodeType)(targetNodeType)) {
85
84
  return transformBetweenListTypes(context);
86
85
  }
87
86
  return null;
@@ -98,37 +97,48 @@ var liftListToBlockType = exports.liftListToBlockType = function liftListToBlock
98
97
  /**
99
98
  * Transform between different list types
100
99
  */
101
- var transformBetweenListTypes = exports.transformBetweenListTypes = function transformBetweenListTypes(_ref) {
102
- var tr = _ref.tr,
103
- targetNodeType = _ref.targetNodeType;
104
- var _tr = tr,
105
- selection = _tr.selection;
100
+ var transformBetweenListTypes = exports.transformBetweenListTypes = function transformBetweenListTypes(context) {
101
+ var tr = context.tr,
102
+ sourceNode = context.sourceNode,
103
+ sourcePos = context.sourcePos,
104
+ targetNodeType = context.targetNodeType;
106
105
  var nodes = tr.doc.type.schema.nodes;
107
-
108
- // Find the list node - support bullet lists, ordered lists, and task lists
109
- var supportedListTypes = [nodes.bulletList, nodes.orderedList, nodes.taskList].filter(Boolean); // Filter out undefined nodes in case some schemas don't have all types
110
-
111
- var listNode = (0, _utils.findParentNodeOfType)(supportedListTypes)(selection);
112
- if (!listNode) {
113
- return null;
114
- }
115
- var sourceListType = listNode.node.type;
116
- var isSourceBulletOrOrdered = sourceListType === nodes.bulletList || sourceListType === nodes.orderedList;
117
- var isTargetTask = targetNodeType === nodes.taskList;
118
- var isSourceTask = sourceListType === nodes.taskList;
119
- var isTargetBulletOrOrdered = targetNodeType === nodes.bulletList || targetNodeType === nodes.orderedList;
106
+ var sourceListType = sourceNode.type;
107
+ var isSourceBulletOrOrdered = (0, _utils.isBulletOrOrderedList)(sourceListType);
108
+ var isTargetTask = (0, _utils.isTaskList)(targetNodeType);
109
+ var isSourceTask = (0, _utils.isTaskList)(sourceListType);
110
+ var isTargetBulletOrOrdered = (0, _utils.isBulletOrOrderedList)(targetNodeType);
120
111
 
121
112
  // Check if we need structure transformation
122
113
  var needsStructureTransform = isSourceBulletOrOrdered && isTargetTask || isSourceTask && isTargetBulletOrOrdered;
123
114
  try {
124
115
  if (!needsStructureTransform) {
125
116
  // Simple type change for same structure lists (bullet <-> ordered)
126
- tr.setNodeMarkup(listNode.pos, targetNodeType);
117
+ // Apply to the main list
118
+ tr.setNodeMarkup(sourcePos, targetNodeType);
119
+
120
+ // Apply to nested lists
121
+ var listStart = sourcePos;
122
+ var listEnd = sourcePos + sourceNode.nodeSize;
123
+ var supportedListTypesSet = (0, _utils.getSupportedListTypesSet)(nodes);
124
+ tr.doc.nodesBetween(listStart, listEnd, function (node, pos, parent) {
125
+ // Only process nested lists (not the root list we already handled)
126
+ if (supportedListTypesSet.has(node.type) && pos !== sourcePos) {
127
+ var isNestedList = parent && (supportedListTypesSet.has(parent.type) || parent.type === nodes.listItem);
128
+ if (isNestedList) {
129
+ var shouldTransformNode = node.type === sourceListType || (0, _utils.isBulletOrOrderedList)(node.type) && isTargetBulletOrOrdered;
130
+ if (shouldTransformNode) {
131
+ tr.setNodeMarkup(pos, targetNodeType);
132
+ }
133
+ }
134
+ }
135
+ return true; // Continue traversing
136
+ });
137
+ return tr;
127
138
  } else {
128
- tr = (0, _transformBetweenListTypes.transformListStructure)(tr, listNode, targetNodeType, nodes);
139
+ return (0, _transformBetweenListTypes.transformListStructure)(context);
129
140
  }
130
141
  } catch (_unused) {
131
142
  return null;
132
143
  }
133
- return tr;
134
144
  };
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isListNodeType = exports.isListNode = exports.isContainerNodeType = exports.isContainerNode = exports.isBlockNodeType = exports.isBlockNode = exports.getTargetNodeInfo = void 0;
6
+ exports.isTaskList = exports.isListNodeType = exports.isListNode = exports.isContainerNodeType = exports.isContainerNode = exports.isBulletOrOrderedList = exports.isBlockNodeType = exports.isBlockNode = exports.getTargetNodeInfo = exports.getSupportedListTypesSet = exports.getSupportedListTypes = void 0;
7
7
  var getTargetNodeInfo = exports.getTargetNodeInfo = function getTargetNodeInfo(targetType, nodes) {
8
8
  switch (targetType) {
9
9
  case 'heading1':
@@ -93,7 +93,7 @@ var isBlockNode = exports.isBlockNode = function isBlockNode(node) {
93
93
  return ['paragraph', 'heading', 'codeBlock'].includes(node.type.name);
94
94
  };
95
95
  var isListNode = exports.isListNode = function isListNode(node) {
96
- return ['bulletList', 'orderedList', 'taskList', 'listItem'].includes(node.type.name);
96
+ return ['bulletList', 'orderedList', 'taskList'].includes(node.type.name);
97
97
  };
98
98
  var isContainerNode = exports.isContainerNode = function isContainerNode(node) {
99
99
  return ['panel', 'expand', 'blockquote'].includes(node.type.name);
@@ -106,4 +106,18 @@ var isListNodeType = exports.isListNodeType = function isListNodeType(nodeType)
106
106
  };
107
107
  var isContainerNodeType = exports.isContainerNodeType = function isContainerNodeType(nodeType) {
108
108
  return ['panel', 'expand', 'blockquote'].includes(nodeType.name);
109
+ };
110
+
111
+ // List type utilities
112
+ var isBulletOrOrderedList = exports.isBulletOrOrderedList = function isBulletOrOrderedList(nodeType) {
113
+ return nodeType.name === 'bulletList' || nodeType.name === 'orderedList';
114
+ };
115
+ var isTaskList = exports.isTaskList = function isTaskList(nodeType) {
116
+ return nodeType.name === 'taskList';
117
+ };
118
+ var getSupportedListTypes = exports.getSupportedListTypes = function getSupportedListTypes(nodes) {
119
+ return [nodes.bulletList, nodes.orderedList, nodes.taskList].filter(Boolean);
120
+ };
121
+ var getSupportedListTypesSet = exports.getSupportedListTypesSet = function getSupportedListTypesSet(nodes) {
122
+ return new Set(getSupportedListTypes(nodes));
109
123
  };
@@ -66,7 +66,8 @@ var getFormatMenuComponents = function getFormatMenuComponents() {
66
66
  }),
67
67
  elemAfter: /*#__PURE__*/_react.default.createElement(_chevronRight.default, {
68
68
  label: 'example nested menu'
69
- })
69
+ }),
70
+ enableMaxHeight: true
70
71
  }, children);
71
72
  }
72
73
  }, {
@@ -17,7 +17,7 @@ export const formatNode = targetType => {
17
17
 
18
18
  // Find the node to format from the current selection
19
19
  let nodeToFormat;
20
- let nodePos = null;
20
+ let nodePos = selection.from;
21
21
 
22
22
  // Try to find the current node from selection
23
23
  const selectedNode = findSelectedNodeOfType([nodes.paragraph, nodes.heading, nodes.blockquote, nodes.panel, nodes.expand, nodes.codeBlock, nodes.bulletList, nodes.orderedList, nodes.taskList, nodes.layoutSection])(selection);
@@ -39,7 +39,7 @@ export const formatNode = targetType => {
39
39
  nodeToFormat = listParent.node;
40
40
  nodePos = listParent.pos;
41
41
  }
42
- } else if (paragraphOrHeadingNode) {
42
+ } else if (parentNode.node.type !== nodes.blockquote && paragraphOrHeadingNode) {
43
43
  nodeToFormat = paragraphOrHeadingNode.node;
44
44
  nodePos = paragraphOrHeadingNode.pos;
45
45
  }
@@ -45,6 +45,7 @@ export const transformToContainer = ({
45
45
  */
46
46
  export const transformContainerNode = ({
47
47
  tr,
48
+ sourceNode,
48
49
  sourcePos,
49
50
  targetNodeType,
50
51
  targetAttrs
@@ -60,7 +61,13 @@ export const transformContainerNode = ({
60
61
 
61
62
  // Transform container to list type
62
63
  if (isListNodeType(targetNodeType)) {
63
- return unwrapAndConvertToList();
64
+ return unwrapAndConvertToList({
65
+ tr,
66
+ sourceNode,
67
+ sourcePos,
68
+ targetNodeType,
69
+ targetAttrs
70
+ });
64
71
  }
65
72
 
66
73
  // Transform between container types
@@ -82,7 +89,60 @@ export const unwrapAndConvertToBlockType = () => {
82
89
  /**
83
90
  * Unwrap container node and convert content to list
84
91
  */
85
- export const unwrapAndConvertToList = () => {
86
- // Convert to list directly
87
- return null;
92
+ export const unwrapAndConvertToList = ({
93
+ tr,
94
+ sourceNode,
95
+ sourcePos,
96
+ targetNodeType,
97
+ targetAttrs
98
+ }) => {
99
+ if (sourcePos === null) {
100
+ return tr;
101
+ }
102
+ const {
103
+ schema
104
+ } = tr.doc.type;
105
+ const {
106
+ listItem,
107
+ paragraph,
108
+ taskList,
109
+ taskItem
110
+ } = schema.nodes;
111
+ const isTargetTaskList = targetNodeType === taskList;
112
+ const createListItemFromInline = inlineFrag => {
113
+ return isTargetTaskList ? taskItem.create(null, inlineFrag) : listItem.create(null, paragraph.create(null, inlineFrag));
114
+ };
115
+ const getInlineContent = textblock => {
116
+ const inlineContent = [];
117
+ textblock.forEach(inline => {
118
+ inlineContent.push(inline);
119
+ });
120
+ return inlineContent;
121
+ };
122
+ const items = [];
123
+
124
+ // Expand's title should become the first item of the list
125
+ if (sourceNode.type.name === 'expand') {
126
+ var _sourceNode$attrs;
127
+ const title = (_sourceNode$attrs = sourceNode.attrs) === null || _sourceNode$attrs === void 0 ? void 0 : _sourceNode$attrs.title;
128
+ if (title) {
129
+ const titleContent = schema.text(title);
130
+ items.push(isTargetTaskList ? taskItem.create(null, titleContent) : listItem.create(null, paragraph.create(null, titleContent)));
131
+ }
132
+ }
133
+ for (let i = 0; i < sourceNode.childCount; i++) {
134
+ const node = sourceNode.child(i);
135
+
136
+ // Abort early if unsupported content (e.g. table) encounted inside of the container
137
+ if (!node.isTextblock) {
138
+ return tr;
139
+ }
140
+ const inline = Fragment.from(getInlineContent(node));
141
+ items.push(createListItemFromInline(inline));
142
+ }
143
+ if (!items.length) {
144
+ return tr;
145
+ }
146
+ const list = targetNodeType.create(targetAttrs || null, Fragment.from(items));
147
+ return tr.replaceWith(sourcePos, sourcePos + sourceNode.nodeSize, list);
88
148
  };