@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.
- package/CHANGELOG.md +19 -0
- package/dist/cjs/editor-commands/transforms/inline-node-transforms.js +1 -1
- package/dist/cjs/editor-commands/transforms/layout/utils.js +102 -52
- package/dist/cjs/editor-commands/transforms/list-transforms.js +5 -52
- package/dist/cjs/editor-commands/transforms/utils.js +3 -14
- package/dist/es2019/editor-commands/transforms/inline-node-transforms.js +1 -1
- package/dist/es2019/editor-commands/transforms/layout/utils.js +93 -47
- package/dist/es2019/editor-commands/transforms/list-transforms.js +3 -54
- package/dist/es2019/editor-commands/transforms/utils.js +2 -13
- package/dist/esm/editor-commands/transforms/inline-node-transforms.js +1 -1
- package/dist/esm/editor-commands/transforms/layout/utils.js +96 -46
- package/dist/esm/editor-commands/transforms/list-transforms.js +3 -50
- package/dist/esm/editor-commands/transforms/utils.js +2 -13
- package/dist/types/editor-commands/transforms/container-transforms.d.ts +2 -1
- package/dist/types/editor-commands/transforms/layout/utils.d.ts +1 -1
- package/dist/types/editor-commands/transforms/layout-transforms.d.ts +1 -1
- package/dist/types/editor-commands/transforms/list/transformOrderedUnorderedListToBlockNodes.d.ts +1 -1
- package/dist/types/editor-commands/transforms/list/transformTaskListToBlockNodes.d.ts +1 -1
- package/dist/types/editor-commands/transforms/list-transforms.d.ts +2 -5
- package/dist/types/editor-commands/transforms/types.d.ts +1 -8
- package/dist/types/editor-commands/transforms/utils.d.ts +0 -4
- package/dist/types-ts4.5/editor-commands/transforms/container-transforms.d.ts +2 -1
- package/dist/types-ts4.5/editor-commands/transforms/layout/utils.d.ts +1 -1
- package/dist/types-ts4.5/editor-commands/transforms/layout-transforms.d.ts +1 -1
- package/dist/types-ts4.5/editor-commands/transforms/list/transformOrderedUnorderedListToBlockNodes.d.ts +1 -1
- package/dist/types-ts4.5/editor-commands/transforms/list/transformTaskListToBlockNodes.d.ts +1 -1
- package/dist/types-ts4.5/editor-commands/transforms/list-transforms.d.ts +2 -5
- package/dist/types-ts4.5/editor-commands/transforms/types.d.ts +1 -8
- package/dist/types-ts4.5/editor-commands/transforms/utils.d.ts +0 -4
- package/package.json +3 -3
- package/dist/cjs/editor-commands/transforms/list/transformBetweenListTypes.js +0 -142
- package/dist/es2019/editor-commands/transforms/list/transformBetweenListTypes.js +0 -144
- package/dist/esm/editor-commands/transforms/list/transformBetweenListTypes.js +0 -137
- package/dist/types/editor-commands/transforms/list/transformBetweenListTypes.d.ts +0 -18
- 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
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
115
|
-
|
|
101
|
+
content: content,
|
|
102
|
+
canBeTransformed: true
|
|
116
103
|
});
|
|
117
104
|
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
210
|
-
var _isTargetTask = (0,
|
|
211
|
-
var isSourceTask = (0,
|
|
212
|
-
var isTargetBulletOrOrdered = (0,
|
|
213
|
-
var supportedListTypes = (0,
|
|
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,
|
|
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.
|
|
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,
|
|
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.
|
|
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
|
-
|
|
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 {
|
|
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
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
97
|
-
|
|
83
|
+
content,
|
|
84
|
+
canBeTransformed: true
|
|
98
85
|
});
|
|
99
86
|
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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;
|