@atlaskit/editor-common 119.2.1 → 119.5.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 +94 -0
- package/block-controls-suppression/package.json +10 -0
- package/collab-agent-review-slice-compare/package.json +10 -0
- package/dist/cjs/block-controls-suppression.js +20 -0
- package/dist/cjs/collab/agent-review-slice-compare.js +99 -0
- package/dist/cjs/extensibility/MultiBodiedExtension/index.js +1 -1
- package/dist/cjs/monitoring/error.js +1 -1
- package/dist/cjs/toolbar/EditorToolbarUIProvider.js +4 -0
- package/dist/cjs/ui/DropList/index.js +1 -1
- package/dist/cjs/utils/validate-using-spec.js +6 -3
- package/dist/es2019/block-controls-suppression.js +12 -0
- package/dist/es2019/collab/agent-review-slice-compare.js +85 -0
- package/dist/es2019/extensibility/MultiBodiedExtension/index.js +1 -1
- package/dist/es2019/monitoring/error.js +1 -1
- package/dist/es2019/toolbar/EditorToolbarUIProvider.js +4 -0
- package/dist/es2019/ui/DropList/index.js +1 -1
- package/dist/es2019/utils/validate-using-spec.js +6 -3
- package/dist/esm/block-controls-suppression.js +13 -0
- package/dist/esm/collab/agent-review-slice-compare.js +92 -0
- package/dist/esm/extensibility/MultiBodiedExtension/index.js +1 -1
- package/dist/esm/monitoring/error.js +1 -1
- package/dist/esm/toolbar/EditorToolbarUIProvider.js +4 -0
- package/dist/esm/ui/DropList/index.js +1 -1
- package/dist/esm/utils/validate-using-spec.js +6 -3
- package/dist/types/block-controls-suppression.d.ts +9 -0
- package/dist/types/collab/agent-review-slice-compare.d.ts +19 -0
- package/dist/types/utils/validate-using-spec.d.ts +1 -1
- package/package.json +10 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,99 @@
|
|
|
1
1
|
# @atlaskit/editor-common
|
|
2
2
|
|
|
3
|
+
## 119.5.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`b5b6cb8261481`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/b5b6cb8261481) -
|
|
8
|
+
[CCI-18813] Fix the Post Stream Review modal anchoring far from the real edit (e.g. at an
|
|
9
|
+
unrelated panel) during backend AI streaming, when the only change to that node was a layout
|
|
10
|
+
`breakout` mark (e.g. a width change). The collab-edit segment producer recorded it as a
|
|
11
|
+
reviewable segment while the AI-plugin filter dropped it, leaving the modal anchored to a node
|
|
12
|
+
with no visible diff.
|
|
13
|
+
|
|
14
|
+
The layout-mark-aware slice comparison is now shared from `@atlaskit/editor-common` (new
|
|
15
|
+
`./collab-agent-review-slice-compare` entry point exporting `slicesEqualIgnoringLocalId`) and used
|
|
16
|
+
by both sides, so a `localId`-only or `breakout`-only difference is consistently treated as no
|
|
17
|
+
change. Real content and formatting edits are still recorded.
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- Updated dependencies
|
|
22
|
+
|
|
23
|
+
## 119.4.0
|
|
24
|
+
|
|
25
|
+
### Minor Changes
|
|
26
|
+
|
|
27
|
+
- [`710e3d9ec4c65`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/710e3d9ec4c65) -
|
|
28
|
+
Allow a table nested inside a panel, but only at the document root, inside a synced block, or
|
|
29
|
+
inside a layout column (the `panel_c1` variant).
|
|
30
|
+
|
|
31
|
+
`panel_c1` is now marked `stage0` and emitted as a standalone JSON Schema definition (via
|
|
32
|
+
`noExtend`), so table-in-panel validates in the stage-0 schema at those positions only — a plain
|
|
33
|
+
`panel` elsewhere still rejects a table.
|
|
34
|
+
|
|
35
|
+
The runtime `@atlaskit/adf-utils` validator can now accept table-in-panel via the `panel_c1` spec
|
|
36
|
+
directly, gated behind the `platform_editor_table_in_panel_patch_1` feature gate. Three validator
|
|
37
|
+
fixes make this work (all gated — when the gate is off, the validator behaves exactly as before):
|
|
38
|
+
1. A variant tuple's overridden content-item names are resolved to their base specs the same way
|
|
39
|
+
base-spec content is (e.g. `paragraph_with_no_marks` → `paragraph`). Previously they stayed
|
|
40
|
+
raw, so `panel_c1` matched only plainly-named children (`table`) and rejected variant-named
|
|
41
|
+
ones (a normal `paragraph`).
|
|
42
|
+
2. `createSpec` retains a variant whose overridden content is a nested `$or` list (e.g.
|
|
43
|
+
`panel_c1`) when the validator is built from an explicit node list (as `validateADFEntity`
|
|
44
|
+
does).
|
|
45
|
+
3. When a stored node matches several candidate specs, the multi-branch matcher prefers a branch
|
|
46
|
+
that validates cleanly over one that only "succeeds" by wrapping otherwise-valid content as
|
|
47
|
+
`unsupportedBlock` — so `panel_c1` is chosen instead of the base `panel` repairing the table
|
|
48
|
+
away.
|
|
49
|
+
|
|
50
|
+
The `allowTableInPanel` override in `@atlaskit/editor-common` is retained but gated by the same
|
|
51
|
+
feature gate: when `platform_editor_table_in_panel_patch_1` is on the override is skipped (the
|
|
52
|
+
validator fixes handle table-in-panel); when it is off the override runs as before. So the single
|
|
53
|
+
gate flips between the new validator behaviour (on) and the previous override behaviour (off).
|
|
54
|
+
|
|
55
|
+
Also adds `panel-with-nested-table` validation fixtures.
|
|
56
|
+
|
|
57
|
+
**BREAKING (`@atlaskit/adf-schema`):** marking `panel_c1` as `stage0` (correcting an earlier
|
|
58
|
+
omission) renames its generated `schema-next` exports: `panelC1` → `panelC1Stage0`, `PanelC1Node`
|
|
59
|
+
→ `PanelC1Stage0Node`, `PanelC1Definition` → `PanelC1Stage0Definition`.
|
|
60
|
+
|
|
61
|
+
Migration — update imports from `@atlaskit/adf-schema/schema-next`:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
// Before
|
|
65
|
+
import {
|
|
66
|
+
panelC1,
|
|
67
|
+
type PanelC1Node,
|
|
68
|
+
type PanelC1Definition,
|
|
69
|
+
} from '@atlaskit/adf-schema/schema-next';
|
|
70
|
+
|
|
71
|
+
// After
|
|
72
|
+
import {
|
|
73
|
+
panelC1Stage0,
|
|
74
|
+
type PanelC1Stage0Node,
|
|
75
|
+
type PanelC1Stage0Definition,
|
|
76
|
+
} from '@atlaskit/adf-schema/schema-next';
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Patch Changes
|
|
80
|
+
|
|
81
|
+
- [`eec66a5b383e5`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/eec66a5b383e5) -
|
|
82
|
+
Scope selection toolbar interactions and dropdown refocus behavior to their owning editor behind
|
|
83
|
+
the `platform_editor_toolbar_multi_editor_fix` experiment.
|
|
84
|
+
- [`07a24b62d9f86`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/07a24b62d9f86) -
|
|
85
|
+
Fix MBE empty frame placeholder styling to tolerate ProseMirror selection marker elements.
|
|
86
|
+
- Updated dependencies
|
|
87
|
+
|
|
88
|
+
## 119.3.0
|
|
89
|
+
|
|
90
|
+
### Minor Changes
|
|
91
|
+
|
|
92
|
+
- [`47b2ae576b031`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/47b2ae576b031) -
|
|
93
|
+
[ux] Under the `cc_maui_remix_button_hover_corridor` experiment, replace the Remix button's
|
|
94
|
+
rendered hover corridor and fixed right-margin exclusion with the existing click-wrapper hover
|
|
95
|
+
tracking. Hide block controls over the marked object sidebar container and its control surfaces.
|
|
96
|
+
|
|
3
97
|
## 119.2.1
|
|
4
98
|
|
|
5
99
|
### Patch Changes
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@atlaskit/editor-common/block-controls-suppression",
|
|
3
|
+
"main": "../dist/cjs/block-controls-suppression.js",
|
|
4
|
+
"module": "../dist/esm/block-controls-suppression.js",
|
|
5
|
+
"module:es2019": "../dist/es2019/block-controls-suppression.js",
|
|
6
|
+
"sideEffects": [
|
|
7
|
+
"**/*.compiled.css"
|
|
8
|
+
],
|
|
9
|
+
"types": "../dist/types/block-controls-suppression.d.ts"
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@atlaskit/editor-common/collab-agent-review-slice-compare",
|
|
3
|
+
"main": "../dist/cjs/collab/agent-review-slice-compare.js",
|
|
4
|
+
"module": "../dist/esm/collab/agent-review-slice-compare.js",
|
|
5
|
+
"module:es2019": "../dist/es2019/collab/agent-review-slice-compare.js",
|
|
6
|
+
"sideEffects": [
|
|
7
|
+
"**/*.compiled.css"
|
|
8
|
+
],
|
|
9
|
+
"types": "../dist/types/collab/agent-review-slice-compare.d.ts"
|
|
10
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.isBlockControlsSuppressionTarget = exports.blockControlsSuppressionProps = void 0;
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var BLOCK_CONTROLS_SUPPRESSION_ATTRIBUTE = 'data-block-controls-suppression';
|
|
10
|
+
var BLOCK_CONTROLS_SUPPRESSION_SELECTOR = "[".concat(BLOCK_CONTROLS_SUPPRESSION_ATTRIBUTE, "]");
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Marks external control surfaces where editor or renderer block controls must be hidden. This
|
|
14
|
+
* prevents controls such as Remix and comment buttons from appearing underneath Rovo or the object
|
|
15
|
+
* sidebar while those controls are being used.
|
|
16
|
+
*/
|
|
17
|
+
var blockControlsSuppressionProps = exports.blockControlsSuppressionProps = (0, _defineProperty2.default)({}, BLOCK_CONTROLS_SUPPRESSION_ATTRIBUTE, 'true');
|
|
18
|
+
var isBlockControlsSuppressionTarget = exports.isBlockControlsSuppressionTarget = function isBlockControlsSuppressionTarget(target) {
|
|
19
|
+
return target instanceof Element && target.closest(BLOCK_CONTROLS_SUPPRESSION_SELECTOR) !== null;
|
|
20
|
+
};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.slicesEqualIgnoringLocalId = void 0;
|
|
8
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
10
|
+
/**
|
|
11
|
+
* ADF mark types ignored when deciding whether agent-edited content changed:
|
|
12
|
+
*
|
|
13
|
+
* - `breakout` — a layout-width mark (`mode: wide | full-width`) that a
|
|
14
|
+
* whole-node/whole-doc replace (e.g. `replaceDoc`) can drop, re-add or
|
|
15
|
+
* re-value without the reviewable *content* changing.
|
|
16
|
+
*
|
|
17
|
+
* Module-private (not exported) so this file has a single public runtime export
|
|
18
|
+
* (Volt strict-mode rule), and so callers cannot diverge from the one comparison
|
|
19
|
+
* definition below.
|
|
20
|
+
*/
|
|
21
|
+
var IGNORED_MARK_TYPES = new Set(['breakout']);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Deep-normalise ADF JSON for change comparison so two structures that differ
|
|
25
|
+
* ONLY by ignorable metadata compare equal. Specifically it:
|
|
26
|
+
*
|
|
27
|
+
* - strips every `localId` (at any nesting): an ephemeral, per-node identity
|
|
28
|
+
* stamp that lives both as a node attribute (`attrs.localId`) and as a
|
|
29
|
+
* `fragment` mark attribute. A whole-node/whole-doc replace (e.g.
|
|
30
|
+
* `replaceDoc`) re-emits content with FRESH localIds, so content that is
|
|
31
|
+
* otherwise identical legitimately carries different localIds.
|
|
32
|
+
* - drops ignorable marks (`IGNORED_MARK_TYPES`, e.g. `breakout`) from every
|
|
33
|
+
* `marks` array, and removes a `marks` key that becomes empty so `marks: []`
|
|
34
|
+
* and an absent `marks` compare equal.
|
|
35
|
+
*
|
|
36
|
+
* Removing these regardless of nesting handles all carriers without needing to
|
|
37
|
+
* know the schema.
|
|
38
|
+
*/
|
|
39
|
+
var _normaliseForChangeCompare = function normaliseForChangeCompare(value) {
|
|
40
|
+
if (Array.isArray(value)) {
|
|
41
|
+
return value.map(_normaliseForChangeCompare);
|
|
42
|
+
}
|
|
43
|
+
if (value && (0, _typeof2.default)(value) === 'object') {
|
|
44
|
+
var result = {};
|
|
45
|
+
for (var _i = 0, _Object$entries = Object.entries(value); _i < _Object$entries.length; _i++) {
|
|
46
|
+
var _Object$entries$_i = (0, _slicedToArray2.default)(_Object$entries[_i], 2),
|
|
47
|
+
key = _Object$entries$_i[0],
|
|
48
|
+
child = _Object$entries$_i[1];
|
|
49
|
+
if (key === 'localId') {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (key === 'marks' && Array.isArray(child)) {
|
|
53
|
+
var kept = child.filter(function (mark) {
|
|
54
|
+
return !(mark && (0, _typeof2.default)(mark) === 'object' && IGNORED_MARK_TYPES.has(mark.type));
|
|
55
|
+
});
|
|
56
|
+
// Drop an empty `marks` array so `marks: []` == absent `marks`.
|
|
57
|
+
if (kept.length > 0) {
|
|
58
|
+
result[key] = kept.map(_normaliseForChangeCompare);
|
|
59
|
+
}
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
result[key] = _normaliseForChangeCompare(child);
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
return value;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* We cannot use `Slice.eq` here: it delegates to `Node.eq` → `Node.sameMarkup`,
|
|
71
|
+
* which `compareDeep`s ALL attributes and marks — so two paragraphs with
|
|
72
|
+
* identical text but different `localId`s (or a dropped/re-valued `breakout`) are
|
|
73
|
+
* reported as different. That would leak unchanged segments into the review
|
|
74
|
+
* whenever the AI re-stamps localIds or re-flows layout (the `replaceDoc` case).
|
|
75
|
+
* We instead compare the normalised JSON, plus the open depths (`openStart` /
|
|
76
|
+
* `openEnd`) that `Slice.eq` also considers.
|
|
77
|
+
*
|
|
78
|
+
* Shared here in `@atlaskit/editor-common` so the two sides of the Review
|
|
79
|
+
* pipeline agree on what counts as a change: the collab-edit COARSE segment
|
|
80
|
+
* producer (`getAgentEditSegments`) and the AI-plugin FINE filter
|
|
81
|
+
* (`entryHasNoChange`). If they disagreed, an edit whose only delta is a
|
|
82
|
+
* `breakout` change could be recorded as a segment (anchoring the modal) yet
|
|
83
|
+
* dropped by the filter (no diff). A breakout-only difference is not reviewable;
|
|
84
|
+
* both sides consume this to honour that consistently.
|
|
85
|
+
*/
|
|
86
|
+
var slicesEqualIgnoringLocalId = exports.slicesEqualIgnoringLocalId = function slicesEqualIgnoringLocalId(a, b) {
|
|
87
|
+
var _a$content$toJSON, _b$content$toJSON;
|
|
88
|
+
if (a === b) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
if (a.openStart !== b.openStart || a.openEnd !== b.openEnd) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
// `Fragment.toJSON()` returns `null` for empty content; normalise so two
|
|
95
|
+
// empty slices (whatever their provenance) still compare equal.
|
|
96
|
+
var aContent = _normaliseForChangeCompare((_a$content$toJSON = a.content.toJSON()) !== null && _a$content$toJSON !== void 0 ? _a$content$toJSON : null);
|
|
97
|
+
var bContent = _normaliseForChangeCompare((_b$content$toJSON = b.content.toJSON()) !== null && _b$content$toJSON !== void 0 ? _b$content$toJSON : null);
|
|
98
|
+
return JSON.stringify(aContent) === JSON.stringify(bContent);
|
|
99
|
+
};
|
|
@@ -53,7 +53,7 @@ var getContainerCssExtendedStyles = function getContainerCssExtendedStyles(activ
|
|
|
53
53
|
var getEmptyFramePlaceholderStyles = function getEmptyFramePlaceholderStyles(activeChildIndex, placeholderText) {
|
|
54
54
|
return (0, _react2.css)((0, _defineProperty2.default)({}, "& .multiBodiedExtension-content-dom-wrapper > [data-extension-frame='true']:nth-of-type(".concat(activeChildIndex + 1
|
|
55
55
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-selectors, @atlaskit/ui-styling-standard/no-unsafe-values -- Ignored via go/DSP-18766
|
|
56
|
-
, ") > p:only-child:has(.ProseMirror-trailingBreak:
|
|
56
|
+
, ") > p:only-child:has(> .ProseMirror-trailingBreak):not(:has(> :not(.ProseMirror-widget):not(.ProseMirror-separator):not(.ProseMirror-trailingBreak)))::before"), {
|
|
57
57
|
color: "var(--ds-text-subtlest, #6B6E76)",
|
|
58
58
|
// JSON.stringify produces a quoted and escaped CSS string.
|
|
59
59
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-unsafe-values -- Ignored via go/DSP-18766
|
|
@@ -28,7 +28,7 @@ var NETWORK_FAILURE_REGEX = /^network failure/i;
|
|
|
28
28
|
var RESIZE_OBSERVER_LOOP_REGEX = /ResizeObserver loop completed with undelivered notifications/;
|
|
29
29
|
var SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
|
|
30
30
|
var packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
|
|
31
|
-
var packageVersion = "119.
|
|
31
|
+
var packageVersion = "119.4.0";
|
|
32
32
|
var sanitiseSentryEvents = function sanitiseSentryEvents(data, _hint) {
|
|
33
33
|
// Remove URL as it has UGC
|
|
34
34
|
// Ignored via go/ees007
|
|
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.EditorToolbarUIProvider = void 0;
|
|
8
8
|
var _react = _interopRequireWildcard(require("react"));
|
|
9
9
|
var _editorToolbar = require("@atlaskit/editor-toolbar");
|
|
10
|
+
var _isExperimentEnabled = require("@atlaskit/platform-feature-experiments/is-experiment-enabled");
|
|
10
11
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
11
12
|
var EditorToolbarUIProvider = exports.EditorToolbarUIProvider = function EditorToolbarUIProvider(_ref) {
|
|
12
13
|
var children = _ref.children,
|
|
@@ -26,6 +27,9 @@ var EditorToolbarUIProvider = exports.EditorToolbarUIProvider = function EditorT
|
|
|
26
27
|
// When closed via keyboard Escape, keep focus on the trigger for better keyboard UX.
|
|
27
28
|
var isKeyboardEscape = event instanceof KeyboardEvent && event.key === 'Escape';
|
|
28
29
|
var shouldFocusEditor = !isKeyboardEscape;
|
|
30
|
+
if ((0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_toolbar_multi_editor_fix') && event instanceof MouseEvent && event.target instanceof Element && !event.target.closest('[role="menu"]')) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
29
33
|
if (shouldFocusEditor) {
|
|
30
34
|
// On Dropdown closed, focus is returned to trigger button by default in requestAnimationFrame
|
|
31
35
|
// Hence, `.focus()` should also be called in requestAnimationFrame
|
|
@@ -24,7 +24,7 @@ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.
|
|
|
24
24
|
* @jsx jsx
|
|
25
25
|
*/ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
|
|
26
26
|
var packageName = "@atlaskit/editor-common";
|
|
27
|
-
var packageVersion = "119.
|
|
27
|
+
var packageVersion = "119.4.0";
|
|
28
28
|
var halfFocusRing = 1;
|
|
29
29
|
var dropOffset = '0, 8';
|
|
30
30
|
var fadeIn = (0, _react2.keyframes)({
|
|
@@ -13,6 +13,7 @@ Object.defineProperty(exports, "wrapWithUnsupported", {
|
|
|
13
13
|
});
|
|
14
14
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
15
|
var _validator = require("@atlaskit/adf-utils/validator");
|
|
16
|
+
var _fg = require("@atlaskit/platform-feature-flags/fg");
|
|
16
17
|
var _analytics = require("../analytics");
|
|
17
18
|
var _trackUnsupportedContent = require("./track-unsupported-content");
|
|
18
19
|
var _wrapWithUnsupported = require("./wrapWithUnsupported");
|
|
@@ -94,9 +95,11 @@ var validationErrorHandler = exports.validationErrorHandler = function validatio
|
|
|
94
95
|
|
|
95
96
|
// panel_c1 is a ProseMirror-only variant: on save, table-in-panel documents are stored as
|
|
96
97
|
// plain ADF `panel` nodes containing a `table`. The base validator-spec does not permit
|
|
97
|
-
// `table` inside `panel
|
|
98
|
-
//
|
|
99
|
-
|
|
98
|
+
// `table` inside `panel`, so suppress the INVALID_CONTENT error when the experiment is active.
|
|
99
|
+
// Only while platform_editor_table_in_panel_patch_1 is OFF: with the patch on, the adf-utils
|
|
100
|
+
// validator accepts table-in-panel positionally (doc / layout column / synced block only), and
|
|
101
|
+
// this blunt suppression would wrongly allow it in every panel.
|
|
102
|
+
if (options.allowTableInPanel && !(0, _fg.fg)('platform_editor_table_in_panel_patch_1')) {
|
|
100
103
|
var _meta = error.meta;
|
|
101
104
|
if ((_meta === null || _meta === void 0 ? void 0 : _meta.parentType) === 'panel' && error.code === 'INVALID_CONTENT' && entity.type === 'table') {
|
|
102
105
|
return entity;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const BLOCK_CONTROLS_SUPPRESSION_ATTRIBUTE = 'data-block-controls-suppression';
|
|
2
|
+
const BLOCK_CONTROLS_SUPPRESSION_SELECTOR = `[${BLOCK_CONTROLS_SUPPRESSION_ATTRIBUTE}]`;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Marks external control surfaces where editor or renderer block controls must be hidden. This
|
|
6
|
+
* prevents controls such as Remix and comment buttons from appearing underneath Rovo or the object
|
|
7
|
+
* sidebar while those controls are being used.
|
|
8
|
+
*/
|
|
9
|
+
export const blockControlsSuppressionProps = {
|
|
10
|
+
[BLOCK_CONTROLS_SUPPRESSION_ATTRIBUTE]: 'true'
|
|
11
|
+
};
|
|
12
|
+
export const isBlockControlsSuppressionTarget = target => target instanceof Element && target.closest(BLOCK_CONTROLS_SUPPRESSION_SELECTOR) !== null;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADF mark types ignored when deciding whether agent-edited content changed:
|
|
3
|
+
*
|
|
4
|
+
* - `breakout` — a layout-width mark (`mode: wide | full-width`) that a
|
|
5
|
+
* whole-node/whole-doc replace (e.g. `replaceDoc`) can drop, re-add or
|
|
6
|
+
* re-value without the reviewable *content* changing.
|
|
7
|
+
*
|
|
8
|
+
* Module-private (not exported) so this file has a single public runtime export
|
|
9
|
+
* (Volt strict-mode rule), and so callers cannot diverge from the one comparison
|
|
10
|
+
* definition below.
|
|
11
|
+
*/
|
|
12
|
+
const IGNORED_MARK_TYPES = new Set(['breakout']);
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Deep-normalise ADF JSON for change comparison so two structures that differ
|
|
16
|
+
* ONLY by ignorable metadata compare equal. Specifically it:
|
|
17
|
+
*
|
|
18
|
+
* - strips every `localId` (at any nesting): an ephemeral, per-node identity
|
|
19
|
+
* stamp that lives both as a node attribute (`attrs.localId`) and as a
|
|
20
|
+
* `fragment` mark attribute. A whole-node/whole-doc replace (e.g.
|
|
21
|
+
* `replaceDoc`) re-emits content with FRESH localIds, so content that is
|
|
22
|
+
* otherwise identical legitimately carries different localIds.
|
|
23
|
+
* - drops ignorable marks (`IGNORED_MARK_TYPES`, e.g. `breakout`) from every
|
|
24
|
+
* `marks` array, and removes a `marks` key that becomes empty so `marks: []`
|
|
25
|
+
* and an absent `marks` compare equal.
|
|
26
|
+
*
|
|
27
|
+
* Removing these regardless of nesting handles all carriers without needing to
|
|
28
|
+
* know the schema.
|
|
29
|
+
*/
|
|
30
|
+
const normaliseForChangeCompare = value => {
|
|
31
|
+
if (Array.isArray(value)) {
|
|
32
|
+
return value.map(normaliseForChangeCompare);
|
|
33
|
+
}
|
|
34
|
+
if (value && typeof value === 'object') {
|
|
35
|
+
const result = {};
|
|
36
|
+
for (const [key, child] of Object.entries(value)) {
|
|
37
|
+
if (key === 'localId') {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (key === 'marks' && Array.isArray(child)) {
|
|
41
|
+
const kept = child.filter(mark => !(mark && typeof mark === 'object' && IGNORED_MARK_TYPES.has(mark.type)));
|
|
42
|
+
// Drop an empty `marks` array so `marks: []` == absent `marks`.
|
|
43
|
+
if (kept.length > 0) {
|
|
44
|
+
result[key] = kept.map(normaliseForChangeCompare);
|
|
45
|
+
}
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
result[key] = normaliseForChangeCompare(child);
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* We cannot use `Slice.eq` here: it delegates to `Node.eq` → `Node.sameMarkup`,
|
|
57
|
+
* which `compareDeep`s ALL attributes and marks — so two paragraphs with
|
|
58
|
+
* identical text but different `localId`s (or a dropped/re-valued `breakout`) are
|
|
59
|
+
* reported as different. That would leak unchanged segments into the review
|
|
60
|
+
* whenever the AI re-stamps localIds or re-flows layout (the `replaceDoc` case).
|
|
61
|
+
* We instead compare the normalised JSON, plus the open depths (`openStart` /
|
|
62
|
+
* `openEnd`) that `Slice.eq` also considers.
|
|
63
|
+
*
|
|
64
|
+
* Shared here in `@atlaskit/editor-common` so the two sides of the Review
|
|
65
|
+
* pipeline agree on what counts as a change: the collab-edit COARSE segment
|
|
66
|
+
* producer (`getAgentEditSegments`) and the AI-plugin FINE filter
|
|
67
|
+
* (`entryHasNoChange`). If they disagreed, an edit whose only delta is a
|
|
68
|
+
* `breakout` change could be recorded as a segment (anchoring the modal) yet
|
|
69
|
+
* dropped by the filter (no diff). A breakout-only difference is not reviewable;
|
|
70
|
+
* both sides consume this to honour that consistently.
|
|
71
|
+
*/
|
|
72
|
+
export const slicesEqualIgnoringLocalId = (a, b) => {
|
|
73
|
+
var _a$content$toJSON, _b$content$toJSON;
|
|
74
|
+
if (a === b) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
if (a.openStart !== b.openStart || a.openEnd !== b.openEnd) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
// `Fragment.toJSON()` returns `null` for empty content; normalise so two
|
|
81
|
+
// empty slices (whatever their provenance) still compare equal.
|
|
82
|
+
const aContent = normaliseForChangeCompare((_a$content$toJSON = a.content.toJSON()) !== null && _a$content$toJSON !== void 0 ? _a$content$toJSON : null);
|
|
83
|
+
const bContent = normaliseForChangeCompare((_b$content$toJSON = b.content.toJSON()) !== null && _b$content$toJSON !== void 0 ? _b$content$toJSON : null);
|
|
84
|
+
return JSON.stringify(aContent) === JSON.stringify(bContent);
|
|
85
|
+
};
|
|
@@ -42,7 +42,7 @@ const getEmptyFramePlaceholderStyles = (activeChildIndex, placeholderText) => cs
|
|
|
42
42
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-selectors, @atlaskit/ui-styling-standard/no-unsafe-values -- Ignored via go/DSP-18766
|
|
43
43
|
[`& .multiBodiedExtension-content-dom-wrapper > [data-extension-frame='true']:nth-of-type(${activeChildIndex + 1
|
|
44
44
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-selectors, @atlaskit/ui-styling-standard/no-unsafe-values -- Ignored via go/DSP-18766
|
|
45
|
-
}) > p:only-child:has(.ProseMirror-trailingBreak:
|
|
45
|
+
}) > p:only-child:has(> .ProseMirror-trailingBreak):not(:has(> :not(.ProseMirror-widget):not(.ProseMirror-separator):not(.ProseMirror-trailingBreak)))::before`]: {
|
|
46
46
|
color: "var(--ds-text-subtlest, #6B6E76)",
|
|
47
47
|
// JSON.stringify produces a quoted and escaped CSS string.
|
|
48
48
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-unsafe-values -- Ignored via go/DSP-18766
|
|
@@ -14,7 +14,7 @@ const NETWORK_FAILURE_REGEX = /^network failure/i;
|
|
|
14
14
|
const RESIZE_OBSERVER_LOOP_REGEX = /ResizeObserver loop completed with undelivered notifications/;
|
|
15
15
|
const SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
|
|
16
16
|
const packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
|
|
17
|
-
const packageVersion = "119.
|
|
17
|
+
const packageVersion = "119.4.0";
|
|
18
18
|
const sanitiseSentryEvents = (data, _hint) => {
|
|
19
19
|
// Remove URL as it has UGC
|
|
20
20
|
// Ignored via go/ees007
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useCallback } from 'react';
|
|
2
2
|
import { ToolbarUIProvider } from '@atlaskit/editor-toolbar';
|
|
3
|
+
import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
|
|
3
4
|
export const EditorToolbarUIProvider = ({
|
|
4
5
|
children,
|
|
5
6
|
api,
|
|
@@ -20,6 +21,9 @@ export const EditorToolbarUIProvider = ({
|
|
|
20
21
|
// When closed via keyboard Escape, keep focus on the trigger for better keyboard UX.
|
|
21
22
|
const isKeyboardEscape = event instanceof KeyboardEvent && event.key === 'Escape';
|
|
22
23
|
const shouldFocusEditor = !isKeyboardEscape;
|
|
24
|
+
if (isExperimentEnabled('platform_editor_toolbar_multi_editor_fix') && event instanceof MouseEvent && event.target instanceof Element && !event.target.closest('[role="menu"]')) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
23
27
|
if (shouldFocusEditor) {
|
|
24
28
|
// On Dropdown closed, focus is returned to trigger button by default in requestAnimationFrame
|
|
25
29
|
// Hence, `.focus()` should also be called in requestAnimationFrame
|
|
@@ -14,7 +14,7 @@ import withAnalyticsEvents from '@atlaskit/analytics-next/withAnalyticsEvents';
|
|
|
14
14
|
import { fg } from '@atlaskit/platform-feature-flags';
|
|
15
15
|
import Layer from '../Layer';
|
|
16
16
|
const packageName = "@atlaskit/editor-common";
|
|
17
|
-
const packageVersion = "119.
|
|
17
|
+
const packageVersion = "119.4.0";
|
|
18
18
|
const halfFocusRing = 1;
|
|
19
19
|
const dropOffset = '0, 8';
|
|
20
20
|
const fadeIn = keyframes({
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { validator } from '@atlaskit/adf-utils/validator';
|
|
2
|
+
import { fg } from '@atlaskit/platform-feature-flags/fg';
|
|
2
3
|
import { ACTION_SUBJECT_ID } from '../analytics';
|
|
3
4
|
export const UNSUPPORTED_NODE_ATTRIBUTE = 'unsupportedNodeAttribute';
|
|
4
5
|
import { fireUnsupportedEvent } from './track-unsupported-content';
|
|
@@ -79,9 +80,11 @@ export const validationErrorHandler = (entity, error, options, marks, validate,
|
|
|
79
80
|
|
|
80
81
|
// panel_c1 is a ProseMirror-only variant: on save, table-in-panel documents are stored as
|
|
81
82
|
// plain ADF `panel` nodes containing a `table`. The base validator-spec does not permit
|
|
82
|
-
// `table` inside `panel
|
|
83
|
-
//
|
|
84
|
-
|
|
83
|
+
// `table` inside `panel`, so suppress the INVALID_CONTENT error when the experiment is active.
|
|
84
|
+
// Only while platform_editor_table_in_panel_patch_1 is OFF: with the patch on, the adf-utils
|
|
85
|
+
// validator accepts table-in-panel positionally (doc / layout column / synced block only), and
|
|
86
|
+
// this blunt suppression would wrongly allow it in every panel.
|
|
87
|
+
if (options.allowTableInPanel && !fg('platform_editor_table_in_panel_patch_1')) {
|
|
85
88
|
const meta = error.meta;
|
|
86
89
|
if ((meta === null || meta === void 0 ? void 0 : meta.parentType) === 'panel' && error.code === 'INVALID_CONTENT' && entity.type === 'table') {
|
|
87
90
|
return entity;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
var BLOCK_CONTROLS_SUPPRESSION_ATTRIBUTE = 'data-block-controls-suppression';
|
|
3
|
+
var BLOCK_CONTROLS_SUPPRESSION_SELECTOR = "[".concat(BLOCK_CONTROLS_SUPPRESSION_ATTRIBUTE, "]");
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Marks external control surfaces where editor or renderer block controls must be hidden. This
|
|
7
|
+
* prevents controls such as Remix and comment buttons from appearing underneath Rovo or the object
|
|
8
|
+
* sidebar while those controls are being used.
|
|
9
|
+
*/
|
|
10
|
+
export var blockControlsSuppressionProps = _defineProperty({}, BLOCK_CONTROLS_SUPPRESSION_ATTRIBUTE, 'true');
|
|
11
|
+
export var isBlockControlsSuppressionTarget = function isBlockControlsSuppressionTarget(target) {
|
|
12
|
+
return target instanceof Element && target.closest(BLOCK_CONTROLS_SUPPRESSION_SELECTOR) !== null;
|
|
13
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
import _typeof from "@babel/runtime/helpers/typeof";
|
|
3
|
+
/**
|
|
4
|
+
* ADF mark types ignored when deciding whether agent-edited content changed:
|
|
5
|
+
*
|
|
6
|
+
* - `breakout` — a layout-width mark (`mode: wide | full-width`) that a
|
|
7
|
+
* whole-node/whole-doc replace (e.g. `replaceDoc`) can drop, re-add or
|
|
8
|
+
* re-value without the reviewable *content* changing.
|
|
9
|
+
*
|
|
10
|
+
* Module-private (not exported) so this file has a single public runtime export
|
|
11
|
+
* (Volt strict-mode rule), and so callers cannot diverge from the one comparison
|
|
12
|
+
* definition below.
|
|
13
|
+
*/
|
|
14
|
+
var IGNORED_MARK_TYPES = new Set(['breakout']);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Deep-normalise ADF JSON for change comparison so two structures that differ
|
|
18
|
+
* ONLY by ignorable metadata compare equal. Specifically it:
|
|
19
|
+
*
|
|
20
|
+
* - strips every `localId` (at any nesting): an ephemeral, per-node identity
|
|
21
|
+
* stamp that lives both as a node attribute (`attrs.localId`) and as a
|
|
22
|
+
* `fragment` mark attribute. A whole-node/whole-doc replace (e.g.
|
|
23
|
+
* `replaceDoc`) re-emits content with FRESH localIds, so content that is
|
|
24
|
+
* otherwise identical legitimately carries different localIds.
|
|
25
|
+
* - drops ignorable marks (`IGNORED_MARK_TYPES`, e.g. `breakout`) from every
|
|
26
|
+
* `marks` array, and removes a `marks` key that becomes empty so `marks: []`
|
|
27
|
+
* and an absent `marks` compare equal.
|
|
28
|
+
*
|
|
29
|
+
* Removing these regardless of nesting handles all carriers without needing to
|
|
30
|
+
* know the schema.
|
|
31
|
+
*/
|
|
32
|
+
var _normaliseForChangeCompare = function normaliseForChangeCompare(value) {
|
|
33
|
+
if (Array.isArray(value)) {
|
|
34
|
+
return value.map(_normaliseForChangeCompare);
|
|
35
|
+
}
|
|
36
|
+
if (value && _typeof(value) === 'object') {
|
|
37
|
+
var result = {};
|
|
38
|
+
for (var _i = 0, _Object$entries = Object.entries(value); _i < _Object$entries.length; _i++) {
|
|
39
|
+
var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
|
|
40
|
+
key = _Object$entries$_i[0],
|
|
41
|
+
child = _Object$entries$_i[1];
|
|
42
|
+
if (key === 'localId') {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (key === 'marks' && Array.isArray(child)) {
|
|
46
|
+
var kept = child.filter(function (mark) {
|
|
47
|
+
return !(mark && _typeof(mark) === 'object' && IGNORED_MARK_TYPES.has(mark.type));
|
|
48
|
+
});
|
|
49
|
+
// Drop an empty `marks` array so `marks: []` == absent `marks`.
|
|
50
|
+
if (kept.length > 0) {
|
|
51
|
+
result[key] = kept.map(_normaliseForChangeCompare);
|
|
52
|
+
}
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
result[key] = _normaliseForChangeCompare(child);
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
return value;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* We cannot use `Slice.eq` here: it delegates to `Node.eq` → `Node.sameMarkup`,
|
|
64
|
+
* which `compareDeep`s ALL attributes and marks — so two paragraphs with
|
|
65
|
+
* identical text but different `localId`s (or a dropped/re-valued `breakout`) are
|
|
66
|
+
* reported as different. That would leak unchanged segments into the review
|
|
67
|
+
* whenever the AI re-stamps localIds or re-flows layout (the `replaceDoc` case).
|
|
68
|
+
* We instead compare the normalised JSON, plus the open depths (`openStart` /
|
|
69
|
+
* `openEnd`) that `Slice.eq` also considers.
|
|
70
|
+
*
|
|
71
|
+
* Shared here in `@atlaskit/editor-common` so the two sides of the Review
|
|
72
|
+
* pipeline agree on what counts as a change: the collab-edit COARSE segment
|
|
73
|
+
* producer (`getAgentEditSegments`) and the AI-plugin FINE filter
|
|
74
|
+
* (`entryHasNoChange`). If they disagreed, an edit whose only delta is a
|
|
75
|
+
* `breakout` change could be recorded as a segment (anchoring the modal) yet
|
|
76
|
+
* dropped by the filter (no diff). A breakout-only difference is not reviewable;
|
|
77
|
+
* both sides consume this to honour that consistently.
|
|
78
|
+
*/
|
|
79
|
+
export var slicesEqualIgnoringLocalId = function slicesEqualIgnoringLocalId(a, b) {
|
|
80
|
+
var _a$content$toJSON, _b$content$toJSON;
|
|
81
|
+
if (a === b) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
if (a.openStart !== b.openStart || a.openEnd !== b.openEnd) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
// `Fragment.toJSON()` returns `null` for empty content; normalise so two
|
|
88
|
+
// empty slices (whatever their provenance) still compare equal.
|
|
89
|
+
var aContent = _normaliseForChangeCompare((_a$content$toJSON = a.content.toJSON()) !== null && _a$content$toJSON !== void 0 ? _a$content$toJSON : null);
|
|
90
|
+
var bContent = _normaliseForChangeCompare((_b$content$toJSON = b.content.toJSON()) !== null && _b$content$toJSON !== void 0 ? _b$content$toJSON : null);
|
|
91
|
+
return JSON.stringify(aContent) === JSON.stringify(bContent);
|
|
92
|
+
};
|
|
@@ -46,7 +46,7 @@ var getContainerCssExtendedStyles = function getContainerCssExtendedStyles(activ
|
|
|
46
46
|
var getEmptyFramePlaceholderStyles = function getEmptyFramePlaceholderStyles(activeChildIndex, placeholderText) {
|
|
47
47
|
return css(_defineProperty({}, "& .multiBodiedExtension-content-dom-wrapper > [data-extension-frame='true']:nth-of-type(".concat(activeChildIndex + 1
|
|
48
48
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-selectors, @atlaskit/ui-styling-standard/no-unsafe-values -- Ignored via go/DSP-18766
|
|
49
|
-
, ") > p:only-child:has(.ProseMirror-trailingBreak:
|
|
49
|
+
, ") > p:only-child:has(> .ProseMirror-trailingBreak):not(:has(> :not(.ProseMirror-widget):not(.ProseMirror-separator):not(.ProseMirror-trailingBreak)))::before"), {
|
|
50
50
|
color: "var(--ds-text-subtlest, #6B6E76)",
|
|
51
51
|
// JSON.stringify produces a quoted and escaped CSS string.
|
|
52
52
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-unsafe-values -- Ignored via go/DSP-18766
|
|
@@ -20,7 +20,7 @@ var NETWORK_FAILURE_REGEX = /^network failure/i;
|
|
|
20
20
|
var RESIZE_OBSERVER_LOOP_REGEX = /ResizeObserver loop completed with undelivered notifications/;
|
|
21
21
|
var SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
|
|
22
22
|
var packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
|
|
23
|
-
var packageVersion = "119.
|
|
23
|
+
var packageVersion = "119.4.0";
|
|
24
24
|
var sanitiseSentryEvents = function sanitiseSentryEvents(data, _hint) {
|
|
25
25
|
// Remove URL as it has UGC
|
|
26
26
|
// Ignored via go/ees007
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useCallback } from 'react';
|
|
2
2
|
import { ToolbarUIProvider } from '@atlaskit/editor-toolbar';
|
|
3
|
+
import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
|
|
3
4
|
export var EditorToolbarUIProvider = function EditorToolbarUIProvider(_ref) {
|
|
4
5
|
var children = _ref.children,
|
|
5
6
|
api = _ref.api,
|
|
@@ -18,6 +19,9 @@ export var EditorToolbarUIProvider = function EditorToolbarUIProvider(_ref) {
|
|
|
18
19
|
// When closed via keyboard Escape, keep focus on the trigger for better keyboard UX.
|
|
19
20
|
var isKeyboardEscape = event instanceof KeyboardEvent && event.key === 'Escape';
|
|
20
21
|
var shouldFocusEditor = !isKeyboardEscape;
|
|
22
|
+
if (isExperimentEnabled('platform_editor_toolbar_multi_editor_fix') && event instanceof MouseEvent && event.target instanceof Element && !event.target.closest('[role="menu"]')) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
21
25
|
if (shouldFocusEditor) {
|
|
22
26
|
// On Dropdown closed, focus is returned to trigger button by default in requestAnimationFrame
|
|
23
27
|
// Hence, `.focus()` should also be called in requestAnimationFrame
|
|
@@ -21,7 +21,7 @@ import withAnalyticsEvents from '@atlaskit/analytics-next/withAnalyticsEvents';
|
|
|
21
21
|
import { fg } from '@atlaskit/platform-feature-flags';
|
|
22
22
|
import Layer from '../Layer';
|
|
23
23
|
var packageName = "@atlaskit/editor-common";
|
|
24
|
-
var packageVersion = "119.
|
|
24
|
+
var packageVersion = "119.4.0";
|
|
25
25
|
var halfFocusRing = 1;
|
|
26
26
|
var dropOffset = '0, 8';
|
|
27
27
|
var fadeIn = keyframes({
|
|
@@ -2,6 +2,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
|
2
2
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
3
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
4
|
import { validator } from '@atlaskit/adf-utils/validator';
|
|
5
|
+
import { fg } from '@atlaskit/platform-feature-flags/fg';
|
|
5
6
|
import { ACTION_SUBJECT_ID } from '../analytics';
|
|
6
7
|
export var UNSUPPORTED_NODE_ATTRIBUTE = 'unsupportedNodeAttribute';
|
|
7
8
|
import { fireUnsupportedEvent } from './track-unsupported-content';
|
|
@@ -81,9 +82,11 @@ export var validationErrorHandler = function validationErrorHandler(entity, erro
|
|
|
81
82
|
|
|
82
83
|
// panel_c1 is a ProseMirror-only variant: on save, table-in-panel documents are stored as
|
|
83
84
|
// plain ADF `panel` nodes containing a `table`. The base validator-spec does not permit
|
|
84
|
-
// `table` inside `panel
|
|
85
|
-
//
|
|
86
|
-
|
|
85
|
+
// `table` inside `panel`, so suppress the INVALID_CONTENT error when the experiment is active.
|
|
86
|
+
// Only while platform_editor_table_in_panel_patch_1 is OFF: with the patch on, the adf-utils
|
|
87
|
+
// validator accepts table-in-panel positionally (doc / layout column / synced block only), and
|
|
88
|
+
// this blunt suppression would wrongly allow it in every panel.
|
|
89
|
+
if (options.allowTableInPanel && !fg('platform_editor_table_in_panel_patch_1')) {
|
|
87
90
|
var _meta = error.meta;
|
|
88
91
|
if ((_meta === null || _meta === void 0 ? void 0 : _meta.parentType) === 'panel' && error.code === 'INVALID_CONTENT' && entity.type === 'table') {
|
|
89
92
|
return entity;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marks external control surfaces where editor or renderer block controls must be hidden. This
|
|
3
|
+
* prevents controls such as Remix and comment buttons from appearing underneath Rovo or the object
|
|
4
|
+
* sidebar while those controls are being used.
|
|
5
|
+
*/
|
|
6
|
+
export declare const blockControlsSuppressionProps: {
|
|
7
|
+
readonly 'data-block-controls-suppression': 'true';
|
|
8
|
+
};
|
|
9
|
+
export declare const isBlockControlsSuppressionTarget: (target: EventTarget | null) => boolean;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Slice } from '@atlaskit/editor-prosemirror/model';
|
|
2
|
+
/**
|
|
3
|
+
* We cannot use `Slice.eq` here: it delegates to `Node.eq` → `Node.sameMarkup`,
|
|
4
|
+
* which `compareDeep`s ALL attributes and marks — so two paragraphs with
|
|
5
|
+
* identical text but different `localId`s (or a dropped/re-valued `breakout`) are
|
|
6
|
+
* reported as different. That would leak unchanged segments into the review
|
|
7
|
+
* whenever the AI re-stamps localIds or re-flows layout (the `replaceDoc` case).
|
|
8
|
+
* We instead compare the normalised JSON, plus the open depths (`openStart` /
|
|
9
|
+
* `openEnd`) that `Slice.eq` also considers.
|
|
10
|
+
*
|
|
11
|
+
* Shared here in `@atlaskit/editor-common` so the two sides of the Review
|
|
12
|
+
* pipeline agree on what counts as a change: the collab-edit COARSE segment
|
|
13
|
+
* producer (`getAgentEditSegments`) and the AI-plugin FINE filter
|
|
14
|
+
* (`entryHasNoChange`). If they disagreed, an edit whose only delta is a
|
|
15
|
+
* `breakout` change could be recorded as a segment (anchoring the modal) yet
|
|
16
|
+
* dropped by the filter (no diff). A breakout-only difference is not reviewable;
|
|
17
|
+
* both sides consume this to honour that consistently.
|
|
18
|
+
*/
|
|
19
|
+
export declare const slicesEqualIgnoringLocalId: (a: Slice, b: Slice) => boolean;
|
|
@@ -11,8 +11,8 @@ export declare const validationErrorHandler: (entity: ADFEntity, error: Validati
|
|
|
11
11
|
type: string;
|
|
12
12
|
} | undefined;
|
|
13
13
|
export declare const validateADFEntity: (schema: Schema, node: ADFEntity, dispatchAnalyticsEvent?: DispatchAnalyticsEvent, validationOverrides?: {
|
|
14
|
+
allowExpandInPanel?: boolean;
|
|
14
15
|
allowNestedTables?: boolean;
|
|
15
16
|
allowTableInPanel?: boolean;
|
|
16
|
-
allowExpandInPanel?: boolean;
|
|
17
17
|
}) => ADFEntity;
|
|
18
18
|
export { wrapWithUnsupported } from './wrapWithUnsupported';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/editor-common",
|
|
3
|
-
"version": "119.
|
|
3
|
+
"version": "119.5.0",
|
|
4
4
|
"description": "A package that contains common classes and components for editor and renderer",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@atlaskit/activity-provider": "^3.0.0",
|
|
32
|
-
"@atlaskit/adf-schema": "^
|
|
33
|
-
"@atlaskit/adf-utils": "^20.
|
|
32
|
+
"@atlaskit/adf-schema": "^57.0.0",
|
|
33
|
+
"@atlaskit/adf-utils": "^20.6.0",
|
|
34
34
|
"@atlaskit/afm-i18n-platform-editor-editor-common": "2.200.0",
|
|
35
35
|
"@atlaskit/analytics-listeners": "^11.1.0",
|
|
36
36
|
"@atlaskit/analytics-namespaced-context": "^8.1.0",
|
|
@@ -42,14 +42,14 @@
|
|
|
42
42
|
"@atlaskit/css": "^1.0.0",
|
|
43
43
|
"@atlaskit/custom-steps": "^1.0.0",
|
|
44
44
|
"@atlaskit/dropdown-menu": "^18.0.0",
|
|
45
|
-
"@atlaskit/editor-json-transformer": "^9.
|
|
45
|
+
"@atlaskit/editor-json-transformer": "^9.4.0",
|
|
46
46
|
"@atlaskit/editor-palette": "^3.4.0",
|
|
47
47
|
"@atlaskit/editor-prosemirror": "^8.0.0",
|
|
48
48
|
"@atlaskit/editor-shared-styles": "^4.0.0",
|
|
49
49
|
"@atlaskit/editor-tables": "^3.0.0",
|
|
50
50
|
"@atlaskit/editor-toolbar": "^2.4.0",
|
|
51
51
|
"@atlaskit/editor-toolbar-model": "^1.2.0",
|
|
52
|
-
"@atlaskit/editor-ui-control-model": "^2.
|
|
52
|
+
"@atlaskit/editor-ui-control-model": "^2.7.0",
|
|
53
53
|
"@atlaskit/emoji": "^71.17.0",
|
|
54
54
|
"@atlaskit/feature-gate-js-client": "^6.0.0",
|
|
55
55
|
"@atlaskit/icon": "^37.3.0",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"@atlaskit/task-decision": "^21.8.0",
|
|
85
85
|
"@atlaskit/teams-app-config": "^2.2.0",
|
|
86
86
|
"@atlaskit/textfield": "^10.0.0",
|
|
87
|
-
"@atlaskit/tmp-editor-statsig": "^
|
|
87
|
+
"@atlaskit/tmp-editor-statsig": "^148.0.0",
|
|
88
88
|
"@atlaskit/tokens": "^16.7.0",
|
|
89
89
|
"@atlaskit/tooltip": "^24.0.0",
|
|
90
90
|
"@atlaskit/width-detector": "^7.0.0",
|
|
@@ -168,6 +168,10 @@
|
|
|
168
168
|
"platform_editor_use_new_experiments_api": {
|
|
169
169
|
"type": "boolean"
|
|
170
170
|
},
|
|
171
|
+
"platform_editor_table_in_panel_patch_1": {
|
|
172
|
+
"type": "boolean",
|
|
173
|
+
"referenceOnly": true
|
|
174
|
+
},
|
|
171
175
|
"platform-dst-popper-consolidation": {
|
|
172
176
|
"type": "boolean",
|
|
173
177
|
"referenceOnly": true
|