@atlaskit/editor-plugin-tasks-and-decisions 21.0.10 → 22.0.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 (33) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/cjs/pm-plugins/commands.js +1 -74
  3. package/dist/cjs/pm-plugins/helpers.js +1 -51
  4. package/dist/cjs/pm-plugins/keymaps.js +25 -39
  5. package/dist/cjs/pm-plugins/main.js +0 -20
  6. package/dist/cjs/pm-plugins/task-list-indentation.js +3 -34
  7. package/dist/cjs/tasksAndDecisionsPlugin.js +2 -5
  8. package/dist/cjs/ui/quick-insert/TasksAndDecisionsQuickInsertMenuItem.js +3 -1
  9. package/dist/cjs/ui/quick-insert/getTasksAndDecisionsQuickInsertComponents.js +12 -2
  10. package/dist/es2019/pm-plugins/commands.js +2 -80
  11. package/dist/es2019/pm-plugins/helpers.js +0 -48
  12. package/dist/es2019/pm-plugins/keymaps.js +28 -42
  13. package/dist/es2019/pm-plugins/main.js +0 -18
  14. package/dist/es2019/pm-plugins/task-list-indentation.js +3 -32
  15. package/dist/es2019/tasksAndDecisionsPlugin.js +3 -6
  16. package/dist/es2019/ui/quick-insert/TasksAndDecisionsQuickInsertMenuItem.js +3 -1
  17. package/dist/es2019/ui/quick-insert/getTasksAndDecisionsQuickInsertComponents.js +12 -2
  18. package/dist/esm/pm-plugins/commands.js +2 -74
  19. package/dist/esm/pm-plugins/helpers.js +0 -50
  20. package/dist/esm/pm-plugins/keymaps.js +26 -40
  21. package/dist/esm/pm-plugins/main.js +0 -20
  22. package/dist/esm/pm-plugins/task-list-indentation.js +3 -35
  23. package/dist/esm/tasksAndDecisionsPlugin.js +3 -6
  24. package/dist/esm/ui/quick-insert/TasksAndDecisionsQuickInsertMenuItem.js +3 -1
  25. package/dist/esm/ui/quick-insert/getTasksAndDecisionsQuickInsertComponents.js +12 -2
  26. package/dist/types/pm-plugins/commands.d.ts +0 -19
  27. package/dist/types/pm-plugins/helpers.d.ts +1 -14
  28. package/dist/types/ui/quick-insert/TasksAndDecisionsQuickInsertMenuItem.d.ts +3 -1
  29. package/package.json +17 -15
  30. package/dist/cjs/pm-plugins/transforms.js +0 -150
  31. package/dist/es2019/pm-plugins/transforms.js +0 -104
  32. package/dist/esm/pm-plugins/transforms.js +0 -143
  33. package/dist/types/pm-plugins/transforms.d.ts +0 -10
@@ -9,7 +9,8 @@ import FieldCheckboxGroupIcon from '@atlaskit/icon/core/field-checkbox-group';
9
9
  import { getListTypes, insertTaskDecisionAction } from '../../pm-plugins/insert-commands';
10
10
  export var TasksAndDecisionsQuickInsertMenuItem = function TasksAndDecisionsQuickInsertMenuItem(_ref) {
11
11
  var api = _ref.api,
12
- item = _ref.item;
12
+ item = _ref.item,
13
+ previewImageUrls = _ref.previewImageUrls;
13
14
  var _useIntl = useIntl(),
14
15
  formatMessage = _useIntl.formatMessage;
15
16
  var _useSharedPluginState = useSharedPluginStateWithSelector(api, ['contextIdentifier'], function (states) {
@@ -49,6 +50,7 @@ export var TasksAndDecisionsQuickInsertMenuItem = function TasksAndDecisionsQuic
49
50
  label: ""
50
51
  }),
51
52
  onSelect: onSelect,
53
+ previewImageUrls: previewImageUrls,
52
54
  shortcut: isAction ? '[]' : '<>',
53
55
  title: formatMessage(isAction ? messages.action : messages.decision)
54
56
  });
@@ -4,6 +4,14 @@ import { createQuickInsertMatcher } from '@atlaskit/editor-common/quick-insert/c
4
4
  import { ACTION_MENU_ITEM, DECISION_MENU_ITEM, STRUCTURE_SECTION } from '@atlaskit/editor-common/quick-insert/keys';
5
5
  import { STRUCTURE_SECTION_RANK } from '@atlaskit/editor-common/quick-insert/rank';
6
6
  import { TasksAndDecisionsQuickInsertMenuItem } from './TasksAndDecisionsQuickInsertMenuItem';
7
+ var taskPreviewImageUrls = {
8
+ light: 'https://dam-cdn.atl.orangelogic.com/AssetLink/y5ly4nr488m2m4k4esk1bu415k1gn4gn.png',
9
+ dark: 'https://dam-cdn.atl.orangelogic.com/AssetLink/t7loyl783j0qo1h45i828310rv4au3h8.png'
10
+ };
11
+ var decisionPreviewImageUrls = {
12
+ light: 'https://dam-cdn.atl.orangelogic.com/AssetLink/h5duy8s83312r7263jauu10mapc53383.png',
13
+ dark: 'https://dam-cdn.atl.orangelogic.com/AssetLink/70q22b8a03dep35ynbv8xigg82osw0rk.png'
14
+ };
7
15
  export var getTasksAndDecisionsQuickInsertComponents = function getTasksAndDecisionsQuickInsertComponents(_ref) {
8
16
  var api = _ref.api,
9
17
  quickInsertActionDescription = _ref.quickInsertActionDescription;
@@ -27,7 +35,8 @@ export var getTasksAndDecisionsQuickInsertComponents = function getTasksAndDecis
27
35
  component: function component() {
28
36
  return /*#__PURE__*/React.createElement(TasksAndDecisionsQuickInsertMenuItem, {
29
37
  api: api,
30
- item: "taskList"
38
+ item: "taskList",
39
+ previewImageUrls: taskPreviewImageUrls
31
40
  });
32
41
  }
33
42
  }, {
@@ -50,7 +59,8 @@ export var getTasksAndDecisionsQuickInsertComponents = function getTasksAndDecis
50
59
  component: function component() {
51
60
  return /*#__PURE__*/React.createElement(TasksAndDecisionsQuickInsertMenuItem, {
52
61
  api: api,
53
- item: "decisionList"
62
+ item: "decisionList",
63
+ previewImageUrls: decisionPreviewImageUrls
54
64
  });
55
65
  }
56
66
  }];
@@ -1,24 +1,5 @@
1
1
  import type { Command } from '@atlaskit/editor-common/types';
2
2
  import type { ResolvedPos } from '@atlaskit/editor-prosemirror/model';
3
- export declare const liftSelection: Command;
4
- /**
5
- * Wraps the current selection in a task list, respecting a maximum indentation depth of 6 levels.
6
- *
7
- * - Normalizes the selection to ensure it covers complete task items.
8
- * - Determines the maximum depth of task list nesting within the selection.
9
- * - If the selection is already nested at or beyond the maximum depth, the command does nothing.
10
- * - Calculates the block range to wrap, handling both regular and block task items.
11
- * - Wraps the block in a task list to increase indentation or create a new task list if necessary.
12
- *
13
- * @param state - The current editor state.
14
- * @param dispatch - The dispatch function to apply the transaction.
15
- * @returns `true` if the command was handled (even if no changes were made), otherwise `false`.
16
- * @example
17
- * ```typescript
18
- * autoJoin(wrapSelectionInTaskList, ['taskList']))(state, dispatch);
19
- * ```
20
- */
21
- export declare const wrapSelectionInTaskList: Command;
22
3
  /**
23
4
  * Tries to move the paragraph content near the given position into the taskItem or decisionItem
24
5
  * before it.
@@ -1,5 +1,5 @@
1
1
  import { NodeRange } from '@atlaskit/editor-prosemirror/model';
2
- import type { Node, NodeType, ResolvedPos } from '@atlaskit/editor-prosemirror/model';
2
+ import type { Node, ResolvedPos } from '@atlaskit/editor-prosemirror/model';
3
3
  import type { EditorState, Selection, Transaction } from '@atlaskit/editor-prosemirror/state';
4
4
  import type { EditorView } from '@atlaskit/editor-prosemirror/view';
5
5
  import type { TaskItemData } from './types';
@@ -43,19 +43,6 @@ export declare const getTaskItemIndex: (state: EditorState) => number;
43
43
  * @param $startPos Position to start walking from.
44
44
  */
45
45
  export declare const walkOut: ($startPos: ResolvedPos) => ResolvedPos;
46
- /**
47
- * Finds the height of a tree-like structure, given any position inside it.
48
- *
49
- * Traverses from the top of the tree to all leaf nodes, and returns the length
50
- * of the longest path.
51
- *
52
- * This means you can use it with things like taskList, which
53
- * do not nest themselves inside taskItems but rather as adjacent children.
54
- *
55
- * @param $pos Any position inside the tree.
56
- * @param types The node types to consider traversable
57
- */
58
- export declare const subtreeHeight: ($from: ResolvedPos, $to: ResolvedPos, types: NodeType[]) => number;
59
46
  /**
60
47
  * Determines if the current selection is inside an empty taskItem, decisionItem, or blockTaskItem.
61
48
  *
@@ -1,10 +1,12 @@
1
1
  import React from 'react';
2
+ import { type QuickInsertMenuItemProps } from '@atlaskit/editor-common/quick-insert/menu-item';
2
3
  import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
3
4
  import type { TasksAndDecisionsPlugin } from '../../tasksAndDecisionsPluginType';
4
5
  import type { TaskDecisionListType } from '../../types';
5
6
  type Props = {
6
7
  api: ExtractInjectionAPI<TasksAndDecisionsPlugin> | undefined;
7
8
  item: TaskDecisionListType;
9
+ previewImageUrls?: QuickInsertMenuItemProps['previewImageUrls'];
8
10
  };
9
- export declare const TasksAndDecisionsQuickInsertMenuItem: ({ api, item }: Props) => React.JSX.Element;
11
+ export declare const TasksAndDecisionsQuickInsertMenuItem: ({ api, item, previewImageUrls, }: Props) => React.JSX.Element;
10
12
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-tasks-and-decisions",
3
- "version": "21.0.10",
3
+ "version": "22.0.0",
4
4
  "description": "Tasks and decisions plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -8,6 +8,11 @@
8
8
  "registry": "https://registry.npmjs.org/"
9
9
  },
10
10
  "atlassian": {
11
+ "website": {
12
+ "tags": [
13
+ "platform-labs"
14
+ ]
15
+ },
11
16
  "team": "Editor: AI",
12
17
  "singleton": true
13
18
  },
@@ -24,14 +29,14 @@
24
29
  "@atlaskit/adf-schema": "^57.5.0",
25
30
  "@atlaskit/analytics-namespaced-context": "^8.2.0",
26
31
  "@atlaskit/css": "^1.1.0",
27
- "@atlaskit/editor-plugin-analytics": "^18.0.0",
28
- "@atlaskit/editor-plugin-block-menu": "^17.0.0",
29
- "@atlaskit/editor-plugin-context-identifier": "^18.0.0",
30
- "@atlaskit/editor-plugin-editor-viewmode": "^20.0.0",
31
- "@atlaskit/editor-plugin-selection": "^18.0.0",
32
- "@atlaskit/editor-plugin-toolbar": "^15.0.0",
33
- "@atlaskit/editor-plugin-type-ahead": "^19.0.0",
34
- "@atlaskit/editor-prosemirror": "^8.0.0",
32
+ "@atlaskit/editor-plugin-analytics": "^19.0.0",
33
+ "@atlaskit/editor-plugin-block-menu": "^18.0.0",
34
+ "@atlaskit/editor-plugin-context-identifier": "^19.0.0",
35
+ "@atlaskit/editor-plugin-editor-viewmode": "^21.0.0",
36
+ "@atlaskit/editor-plugin-selection": "^19.0.0",
37
+ "@atlaskit/editor-plugin-toolbar": "^16.0.0",
38
+ "@atlaskit/editor-plugin-type-ahead": "^20.0.0",
39
+ "@atlaskit/editor-prosemirror": "^9.0.0",
35
40
  "@atlaskit/editor-shared-styles": "^4.3.0",
36
41
  "@atlaskit/editor-toolbar": "^2.6.0",
37
42
  "@atlaskit/editor-toolbar-model": "^1.2.0",
@@ -42,14 +47,14 @@
42
47
  "@atlaskit/primitives": "^22.5.0",
43
48
  "@atlaskit/prosemirror-input-rules": "^4.1.0",
44
49
  "@atlaskit/task-decision": "^21.10.0",
45
- "@atlaskit/tmp-editor-statsig": "^198.0.0",
46
- "@atlaskit/tokens": "^17.0.0",
50
+ "@atlaskit/tmp-editor-statsig": "^199.0.0",
51
+ "@atlaskit/tokens": "^18.2.0",
47
52
  "@babel/runtime": "^7.0.0",
48
53
  "@compiled/react": "^1.0.2",
49
54
  "bind-event-listener": "^3.0.0"
50
55
  },
51
56
  "peerDependencies": {
52
- "@atlaskit/editor-common": "^122.10.0",
57
+ "@atlaskit/editor-common": "^123.0.0",
53
58
  "react": "^18.2.0 || ^19.2.0",
54
59
  "react-dom": "^18.2.0 || ^19.2.0",
55
60
  "react-intl": "^5.25.1 || ^6.0.0 || ^7.0.0"
@@ -71,9 +76,6 @@
71
76
  "platform_editor_element_browser_analytic": {
72
77
  "type": "boolean"
73
78
  },
74
- "platform_editor_flexible_list_normalization_fix": {
75
- "type": "boolean"
76
- },
77
79
  "platform_editor_markdown_compatible_toolbar": {
78
80
  "type": "boolean"
79
81
  }
@@ -1,150 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.applyTaskListNormalisationFixes = applyTaskListNormalisationFixes;
8
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
- var _transform = require("@atlaskit/editor-prosemirror/transform");
11
- var _expValEqualsNoExposure = require("@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure");
12
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
13
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
14
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
15
- function getAffectedTaskListsFromTransactions(transactions, doc, schema) {
16
- var taskList = schema.nodes.taskList;
17
- if (!taskList) {
18
- return new Map();
19
- }
20
- var result = new Map();
21
- var _iterator = _createForOfIteratorHelper(transactions),
22
- _step;
23
- try {
24
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
25
- var tr = _step.value;
26
- var _iterator2 = _createForOfIteratorHelper(tr.steps),
27
- _step2;
28
- try {
29
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
30
- var step = _step2.value;
31
- // ReplaceStep and ReplaceAroundStep both have from/to — other step types are skipped.
32
- if (!(step instanceof _transform.ReplaceStep) && !(step instanceof _transform.ReplaceAroundStep)) {
33
- continue;
34
- }
35
- // Check both the start and end of each changed range, mapped to post-transaction positions.
36
- for (var _i = 0, _arr = [step.from, step.to]; _i < _arr.length; _i++) {
37
- var rawPos = _arr[_i];
38
- var mappedPos = Math.min(tr.mapping.map(rawPos), doc.content.size - 1);
39
- var $pos = doc.resolve(mappedPos);
40
- // Walk ancestors from inner to outer, recording the outermost taskList node.
41
- // Once we find a taskList and then exit list structure (hit a non-taskList ancestor),
42
- // break early — prevents container nodes (e.g. panel) from causing us to
43
- // return an outer taskList in a different structural context.
44
- var rootTaskListPos = null;
45
- var rootTaskListNode = null;
46
- for (var depth = $pos.depth; depth >= 0; depth--) {
47
- var node = $pos.node(depth);
48
- if (node.type === taskList) {
49
- rootTaskListPos = $pos.before(depth);
50
- rootTaskListNode = node;
51
- } else if (rootTaskListNode !== null && node.type !== schema.nodes.taskItem) {
52
- // We've exited the taskList structure — stop walking.
53
- break;
54
- }
55
- }
56
- if (rootTaskListPos !== null && rootTaskListNode !== null) {
57
- result.set(rootTaskListPos, rootTaskListNode);
58
- }
59
- }
60
- }
61
- } catch (err) {
62
- _iterator2.e(err);
63
- } finally {
64
- _iterator2.f();
65
- }
66
- }
67
- } catch (err) {
68
- _iterator.e(err);
69
- } finally {
70
- _iterator.f();
71
- }
72
- return result;
73
- }
74
- function applyTaskListNormalisationFixes(_ref) {
75
- var doc = _ref.doc,
76
- schema = _ref.schema,
77
- tr = _ref.tr,
78
- transactions = _ref.transactions;
79
- var _schema$nodes = schema.nodes,
80
- taskList = _schema$nodes.taskList,
81
- taskItem = _schema$nodes.taskItem;
82
- if (!taskList || !taskItem) {
83
- return tr;
84
- }
85
- var affectedTaskLists = getAffectedTaskListsFromTransactions(transactions, doc, schema);
86
- if (affectedTaskLists.size === 0) {
87
- return tr;
88
- }
89
-
90
- // Sort by position descending so we process deeper/later positions first,
91
- // preventing earlier insertions from shifting later positions.
92
- var sortedEntries = (0, _toConsumableArray2.default)(affectedTaskLists.entries()).sort(function (_ref2, _ref3) {
93
- var _ref4 = (0, _slicedToArray2.default)(_ref2, 1),
94
- a = _ref4[0];
95
- var _ref5 = (0, _slicedToArray2.default)(_ref3, 1),
96
- b = _ref5[0];
97
- return b - a;
98
- });
99
- var _iterator3 = _createForOfIteratorHelper(sortedEntries),
100
- _step3;
101
- try {
102
- var _loop = function _loop() {
103
- var _step3$value = (0, _slicedToArray2.default)(_step3.value, 1),
104
- taskListPos = _step3$value[0];
105
- // Re-resolve the taskList node from the current transaction doc (post-operation state).
106
- var mappedTaskListPos = tr.mapping.map(taskListPos);
107
- var currentTaskListNode = tr.doc.nodeAt(mappedTaskListPos);
108
- if (!currentTaskListNode) {
109
- return 1; // continue
110
- }
111
- if (!(0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_flexible_list_indentation', 'isEnabled', true)) {
112
- // Collect positions of all taskList nodes (at any depth) whose direct children
113
- // include a taskList — this is the invalid structure. The taskList schema requires
114
- // taskItem as children, not nested taskLists directly.
115
- // Process in reverse order so higher-position insertions don't shift lower positions.
116
- var invalidTaskListPositions = [];
117
- currentTaskListNode.descendants(function (node, offsetPos) {
118
- if (node.type === taskList) {
119
- // A taskList as the FIRST child of another taskList is invalid — it means a
120
- // delete or paste removed the leading taskItem, leaving a bare nested list.
121
- // A taskList that follows a taskItem is valid (that's normal indentation).
122
- var firstChild = node.firstChild;
123
- if (firstChild && firstChild.type === taskList) {
124
- var pos = mappedTaskListPos + 1 + offsetPos + 1;
125
- invalidTaskListPositions.push(pos);
126
- }
127
- }
128
- return true;
129
- });
130
-
131
- // Process in reverse (highest positions first).
132
- for (var i = invalidTaskListPositions.length - 1; i >= 0; i--) {
133
- var remappedPos = tr.mapping.map(invalidTaskListPositions[i]);
134
- var emptyTaskItem = taskItem.createAndFill();
135
- if (emptyTaskItem) {
136
- tr.insert(remappedPos, emptyTaskItem);
137
- }
138
- }
139
- }
140
- };
141
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
142
- if (_loop()) continue;
143
- }
144
- } catch (err) {
145
- _iterator3.e(err);
146
- } finally {
147
- _iterator3.f();
148
- }
149
- return tr;
150
- }
@@ -1,104 +0,0 @@
1
- import { ReplaceAroundStep, ReplaceStep } from '@atlaskit/editor-prosemirror/transform';
2
- import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
3
- function getAffectedTaskListsFromTransactions(transactions, doc, schema) {
4
- const {
5
- taskList
6
- } = schema.nodes;
7
- if (!taskList) {
8
- return new Map();
9
- }
10
- const result = new Map();
11
- for (const tr of transactions) {
12
- for (const step of tr.steps) {
13
- // ReplaceStep and ReplaceAroundStep both have from/to — other step types are skipped.
14
- if (!(step instanceof ReplaceStep) && !(step instanceof ReplaceAroundStep)) {
15
- continue;
16
- }
17
- // Check both the start and end of each changed range, mapped to post-transaction positions.
18
- for (const rawPos of [step.from, step.to]) {
19
- const mappedPos = Math.min(tr.mapping.map(rawPos), doc.content.size - 1);
20
- const $pos = doc.resolve(mappedPos);
21
- // Walk ancestors from inner to outer, recording the outermost taskList node.
22
- // Once we find a taskList and then exit list structure (hit a non-taskList ancestor),
23
- // break early — prevents container nodes (e.g. panel) from causing us to
24
- // return an outer taskList in a different structural context.
25
- let rootTaskListPos = null;
26
- let rootTaskListNode = null;
27
- for (let depth = $pos.depth; depth >= 0; depth--) {
28
- const node = $pos.node(depth);
29
- if (node.type === taskList) {
30
- rootTaskListPos = $pos.before(depth);
31
- rootTaskListNode = node;
32
- } else if (rootTaskListNode !== null && node.type !== schema.nodes.taskItem) {
33
- // We've exited the taskList structure — stop walking.
34
- break;
35
- }
36
- }
37
- if (rootTaskListPos !== null && rootTaskListNode !== null) {
38
- result.set(rootTaskListPos, rootTaskListNode);
39
- }
40
- }
41
- }
42
- }
43
- return result;
44
- }
45
- export function applyTaskListNormalisationFixes({
46
- doc,
47
- schema,
48
- tr,
49
- transactions
50
- }) {
51
- const {
52
- taskList,
53
- taskItem
54
- } = schema.nodes;
55
- if (!taskList || !taskItem) {
56
- return tr;
57
- }
58
- const affectedTaskLists = getAffectedTaskListsFromTransactions(transactions, doc, schema);
59
- if (affectedTaskLists.size === 0) {
60
- return tr;
61
- }
62
-
63
- // Sort by position descending so we process deeper/later positions first,
64
- // preventing earlier insertions from shifting later positions.
65
- const sortedEntries = [...affectedTaskLists.entries()].sort(([a], [b]) => b - a);
66
- for (const [taskListPos] of sortedEntries) {
67
- // Re-resolve the taskList node from the current transaction doc (post-operation state).
68
- const mappedTaskListPos = tr.mapping.map(taskListPos);
69
- const currentTaskListNode = tr.doc.nodeAt(mappedTaskListPos);
70
- if (!currentTaskListNode) {
71
- continue;
72
- }
73
- if (!expValEqualsNoExposure('platform_editor_flexible_list_indentation', 'isEnabled', true)) {
74
- // Collect positions of all taskList nodes (at any depth) whose direct children
75
- // include a taskList — this is the invalid structure. The taskList schema requires
76
- // taskItem as children, not nested taskLists directly.
77
- // Process in reverse order so higher-position insertions don't shift lower positions.
78
- const invalidTaskListPositions = [];
79
- currentTaskListNode.descendants((node, offsetPos) => {
80
- if (node.type === taskList) {
81
- // A taskList as the FIRST child of another taskList is invalid — it means a
82
- // delete or paste removed the leading taskItem, leaving a bare nested list.
83
- // A taskList that follows a taskItem is valid (that's normal indentation).
84
- const firstChild = node.firstChild;
85
- if (firstChild && firstChild.type === taskList) {
86
- const pos = mappedTaskListPos + 1 + offsetPos + 1;
87
- invalidTaskListPositions.push(pos);
88
- }
89
- }
90
- return true;
91
- });
92
-
93
- // Process in reverse (highest positions first).
94
- for (let i = invalidTaskListPositions.length - 1; i >= 0; i--) {
95
- const remappedPos = tr.mapping.map(invalidTaskListPositions[i]);
96
- const emptyTaskItem = taskItem.createAndFill();
97
- if (emptyTaskItem) {
98
- tr.insert(remappedPos, emptyTaskItem);
99
- }
100
- }
101
- }
102
- }
103
- return tr;
104
- }
@@ -1,143 +0,0 @@
1
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
- import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
4
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
5
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
6
- import { ReplaceAroundStep, ReplaceStep } from '@atlaskit/editor-prosemirror/transform';
7
- import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
8
- function getAffectedTaskListsFromTransactions(transactions, doc, schema) {
9
- var taskList = schema.nodes.taskList;
10
- if (!taskList) {
11
- return new Map();
12
- }
13
- var result = new Map();
14
- var _iterator = _createForOfIteratorHelper(transactions),
15
- _step;
16
- try {
17
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
18
- var tr = _step.value;
19
- var _iterator2 = _createForOfIteratorHelper(tr.steps),
20
- _step2;
21
- try {
22
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
23
- var step = _step2.value;
24
- // ReplaceStep and ReplaceAroundStep both have from/to — other step types are skipped.
25
- if (!(step instanceof ReplaceStep) && !(step instanceof ReplaceAroundStep)) {
26
- continue;
27
- }
28
- // Check both the start and end of each changed range, mapped to post-transaction positions.
29
- for (var _i = 0, _arr = [step.from, step.to]; _i < _arr.length; _i++) {
30
- var rawPos = _arr[_i];
31
- var mappedPos = Math.min(tr.mapping.map(rawPos), doc.content.size - 1);
32
- var $pos = doc.resolve(mappedPos);
33
- // Walk ancestors from inner to outer, recording the outermost taskList node.
34
- // Once we find a taskList and then exit list structure (hit a non-taskList ancestor),
35
- // break early — prevents container nodes (e.g. panel) from causing us to
36
- // return an outer taskList in a different structural context.
37
- var rootTaskListPos = null;
38
- var rootTaskListNode = null;
39
- for (var depth = $pos.depth; depth >= 0; depth--) {
40
- var node = $pos.node(depth);
41
- if (node.type === taskList) {
42
- rootTaskListPos = $pos.before(depth);
43
- rootTaskListNode = node;
44
- } else if (rootTaskListNode !== null && node.type !== schema.nodes.taskItem) {
45
- // We've exited the taskList structure — stop walking.
46
- break;
47
- }
48
- }
49
- if (rootTaskListPos !== null && rootTaskListNode !== null) {
50
- result.set(rootTaskListPos, rootTaskListNode);
51
- }
52
- }
53
- }
54
- } catch (err) {
55
- _iterator2.e(err);
56
- } finally {
57
- _iterator2.f();
58
- }
59
- }
60
- } catch (err) {
61
- _iterator.e(err);
62
- } finally {
63
- _iterator.f();
64
- }
65
- return result;
66
- }
67
- export function applyTaskListNormalisationFixes(_ref) {
68
- var doc = _ref.doc,
69
- schema = _ref.schema,
70
- tr = _ref.tr,
71
- transactions = _ref.transactions;
72
- var _schema$nodes = schema.nodes,
73
- taskList = _schema$nodes.taskList,
74
- taskItem = _schema$nodes.taskItem;
75
- if (!taskList || !taskItem) {
76
- return tr;
77
- }
78
- var affectedTaskLists = getAffectedTaskListsFromTransactions(transactions, doc, schema);
79
- if (affectedTaskLists.size === 0) {
80
- return tr;
81
- }
82
-
83
- // Sort by position descending so we process deeper/later positions first,
84
- // preventing earlier insertions from shifting later positions.
85
- var sortedEntries = _toConsumableArray(affectedTaskLists.entries()).sort(function (_ref2, _ref3) {
86
- var _ref4 = _slicedToArray(_ref2, 1),
87
- a = _ref4[0];
88
- var _ref5 = _slicedToArray(_ref3, 1),
89
- b = _ref5[0];
90
- return b - a;
91
- });
92
- var _iterator3 = _createForOfIteratorHelper(sortedEntries),
93
- _step3;
94
- try {
95
- var _loop = function _loop() {
96
- var _step3$value = _slicedToArray(_step3.value, 1),
97
- taskListPos = _step3$value[0];
98
- // Re-resolve the taskList node from the current transaction doc (post-operation state).
99
- var mappedTaskListPos = tr.mapping.map(taskListPos);
100
- var currentTaskListNode = tr.doc.nodeAt(mappedTaskListPos);
101
- if (!currentTaskListNode) {
102
- return 1; // continue
103
- }
104
- if (!expValEqualsNoExposure('platform_editor_flexible_list_indentation', 'isEnabled', true)) {
105
- // Collect positions of all taskList nodes (at any depth) whose direct children
106
- // include a taskList — this is the invalid structure. The taskList schema requires
107
- // taskItem as children, not nested taskLists directly.
108
- // Process in reverse order so higher-position insertions don't shift lower positions.
109
- var invalidTaskListPositions = [];
110
- currentTaskListNode.descendants(function (node, offsetPos) {
111
- if (node.type === taskList) {
112
- // A taskList as the FIRST child of another taskList is invalid — it means a
113
- // delete or paste removed the leading taskItem, leaving a bare nested list.
114
- // A taskList that follows a taskItem is valid (that's normal indentation).
115
- var firstChild = node.firstChild;
116
- if (firstChild && firstChild.type === taskList) {
117
- var pos = mappedTaskListPos + 1 + offsetPos + 1;
118
- invalidTaskListPositions.push(pos);
119
- }
120
- }
121
- return true;
122
- });
123
-
124
- // Process in reverse (highest positions first).
125
- for (var i = invalidTaskListPositions.length - 1; i >= 0; i--) {
126
- var remappedPos = tr.mapping.map(invalidTaskListPositions[i]);
127
- var emptyTaskItem = taskItem.createAndFill();
128
- if (emptyTaskItem) {
129
- tr.insert(remappedPos, emptyTaskItem);
130
- }
131
- }
132
- }
133
- };
134
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
135
- if (_loop()) continue;
136
- }
137
- } catch (err) {
138
- _iterator3.e(err);
139
- } finally {
140
- _iterator3.f();
141
- }
142
- return tr;
143
- }
@@ -1,10 +0,0 @@
1
- import type { Node, Schema } from '@atlaskit/editor-prosemirror/model';
2
- import type { Transaction } from '@atlaskit/editor-prosemirror/state';
3
- interface ApplyTaskListNormalisationFixesOptions {
4
- doc: Node;
5
- schema: Schema;
6
- tr: Transaction;
7
- transactions: readonly Transaction[];
8
- }
9
- export declare function applyTaskListNormalisationFixes({ doc, schema, tr, transactions, }: ApplyTaskListNormalisationFixesOptions): Transaction;
10
- export {};