@atlaskit/editor-common 88.10.0 → 88.12.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 +41 -0
- package/count-nodes/package.json +15 -0
- package/dist/cjs/analytics/types/enums.js +1 -0
- package/dist/cjs/insert/index.js +27 -1
- package/dist/cjs/media-single/CommentBadgeNext.js +61 -0
- package/dist/cjs/media-single/ExternalImageBadge.js +5 -48
- package/dist/cjs/media-single/MediaBadges.js +76 -0
- package/dist/cjs/media-single/index.js +15 -1
- package/dist/cjs/messages/insert-block.js +10 -0
- package/dist/cjs/monitoring/error.js +1 -1
- package/dist/cjs/styles/shared/blockquote.js +6 -0
- package/dist/cjs/styles/shared/media-single.js +1 -1
- package/dist/cjs/styles/shared/table.js +9 -2
- package/dist/cjs/ui/DropList/index.js +1 -1
- package/dist/cjs/ui/Emoji/index.js +1 -0
- package/dist/cjs/ui/MediaSingle/styled.js +1 -1
- package/dist/cjs/utils/document.js +0 -180
- package/dist/cjs/utils/index.js +32 -1
- package/dist/cjs/utils/processRawValue.js +185 -0
- package/dist/es2019/analytics/types/enums.js +1 -0
- package/dist/es2019/insert/index.js +30 -1
- package/dist/es2019/media-single/CommentBadgeNext.js +51 -0
- package/dist/es2019/media-single/ExternalImageBadge.js +5 -40
- package/dist/es2019/media-single/MediaBadges.js +63 -0
- package/dist/es2019/media-single/index.js +3 -1
- package/dist/es2019/messages/insert-block.js +10 -0
- package/dist/es2019/monitoring/error.js +1 -1
- package/dist/es2019/styles/shared/blockquote.js +6 -0
- package/dist/es2019/styles/shared/media-single.js +1 -1
- package/dist/es2019/styles/shared/table.js +27 -14
- package/dist/es2019/ui/DropList/index.js +1 -1
- package/dist/es2019/ui/Emoji/index.js +1 -0
- package/dist/es2019/ui/MediaSingle/styled.js +2 -1
- package/dist/es2019/utils/document.js +0 -183
- package/dist/es2019/utils/index.js +44 -2
- package/dist/es2019/utils/processRawValue.js +183 -0
- package/dist/esm/analytics/types/enums.js +1 -0
- package/dist/esm/insert/index.js +27 -1
- package/dist/esm/media-single/CommentBadgeNext.js +51 -0
- package/dist/esm/media-single/ExternalImageBadge.js +5 -45
- package/dist/esm/media-single/MediaBadges.js +66 -0
- package/dist/esm/media-single/index.js +3 -1
- package/dist/esm/messages/insert-block.js +10 -0
- package/dist/esm/monitoring/error.js +1 -1
- package/dist/esm/styles/shared/blockquote.js +6 -0
- package/dist/esm/styles/shared/media-single.js +1 -1
- package/dist/esm/styles/shared/table.js +9 -2
- package/dist/esm/ui/DropList/index.js +1 -1
- package/dist/esm/ui/Emoji/index.js +1 -0
- package/dist/esm/ui/MediaSingle/styled.js +1 -1
- package/dist/esm/utils/document.js +0 -179
- package/dist/esm/utils/index.js +44 -2
- package/dist/esm/utils/processRawValue.js +179 -0
- package/dist/types/analytics/types/enums.d.ts +1 -0
- package/dist/types/media-single/CommentBadgeNext.d.ts +11 -0
- package/dist/types/media-single/ExternalImageBadge.d.ts +2 -5
- package/dist/types/media-single/MediaBadges.d.ts +12 -0
- package/dist/types/media-single/index.d.ts +2 -0
- package/dist/types/messages/insert-block.d.ts +10 -0
- package/dist/types/utils/document.d.ts +2 -6
- package/dist/types/utils/index.d.ts +42 -2
- package/dist/types/utils/processRawValue.d.ts +6 -0
- package/dist/types-ts4.5/analytics/types/enums.d.ts +1 -0
- package/dist/types-ts4.5/media-single/CommentBadgeNext.d.ts +11 -0
- package/dist/types-ts4.5/media-single/ExternalImageBadge.d.ts +2 -5
- package/dist/types-ts4.5/media-single/MediaBadges.d.ts +12 -0
- package/dist/types-ts4.5/media-single/index.d.ts +2 -0
- package/dist/types-ts4.5/messages/insert-block.d.ts +10 -0
- package/dist/types-ts4.5/utils/document.d.ts +2 -6
- package/dist/types-ts4.5/utils/index.d.ts +42 -2
- package/dist/types-ts4.5/utils/processRawValue.d.ts +6 -0
- package/is-performance-api-available/package.json +15 -0
- package/package.json +9 -4
- package/performance/measure-render/package.json +15 -0
- package/performance/navigation/package.json +15 -0
- package/process-raw-value/package.json +15 -0
|
@@ -11,14 +11,7 @@ exports.hasVisibleContent = hasVisibleContent;
|
|
|
11
11
|
exports.isEmptyDocument = isEmptyDocument;
|
|
12
12
|
exports.isSelectionEndOfParagraph = void 0;
|
|
13
13
|
exports.nodesBetweenChanged = nodesBetweenChanged;
|
|
14
|
-
exports.processRawValue = processRawValue;
|
|
15
|
-
var _transforms = require("@atlaskit/adf-utils/transforms");
|
|
16
|
-
var _model = require("@atlaskit/editor-prosemirror/model");
|
|
17
|
-
var _analytics = require("../analytics");
|
|
18
14
|
var _editorCoreUtils = require("./editor-core-utils");
|
|
19
|
-
var _privacyFilter = require("./filter/privacy-filter");
|
|
20
|
-
var _trackUnsupportedContent = require("./track-unsupported-content");
|
|
21
|
-
var _validateUsingSpec = require("./validate-using-spec");
|
|
22
15
|
var getStepRange = exports.getStepRange = function getStepRange(transaction) {
|
|
23
16
|
var from = -1;
|
|
24
17
|
var to = -1;
|
|
@@ -79,179 +72,6 @@ function nodesBetweenChanged(tr, f, startPos) {
|
|
|
79
72
|
}
|
|
80
73
|
tr.doc.nodesBetween(stepRange.from, stepRange.to, f, startPos);
|
|
81
74
|
}
|
|
82
|
-
function processRawValue(schema, value, providerFactory, sanitizePrivateContent, contentTransformer, dispatchAnalyticsEvent) {
|
|
83
|
-
if (!value) {
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
var node;
|
|
87
|
-
if (typeof value === 'string') {
|
|
88
|
-
try {
|
|
89
|
-
if (contentTransformer) {
|
|
90
|
-
var doc = contentTransformer.parse(value);
|
|
91
|
-
node = doc.toJSON();
|
|
92
|
-
} else {
|
|
93
|
-
node = JSON.parse(value);
|
|
94
|
-
}
|
|
95
|
-
} catch (e) {
|
|
96
|
-
// eslint-disable-next-line no-console
|
|
97
|
-
console.error("Error processing value: ".concat(value, " isn't a valid JSON"));
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
} else {
|
|
101
|
-
node = value;
|
|
102
|
-
}
|
|
103
|
-
if (Array.isArray(node)) {
|
|
104
|
-
// eslint-disable-next-line no-console
|
|
105
|
-
console.error("Error processing value: ".concat(node, " is an array, but it must be an object."));
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
try {
|
|
109
|
-
// ProseMirror always require a child under doc
|
|
110
|
-
if (node.type === 'doc') {
|
|
111
|
-
if (Array.isArray(node.content) && node.content.length === 0) {
|
|
112
|
-
node.content.push({
|
|
113
|
-
type: 'paragraph',
|
|
114
|
-
content: []
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
// Just making sure doc is always valid
|
|
118
|
-
if (!node.version) {
|
|
119
|
-
node.version = 1;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
if (contentTransformer) {
|
|
123
|
-
return _model.Node.fromJSON(schema, node);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// link mark on mediaSingle is deprecated, need to move link mark to child media node
|
|
127
|
-
// https://product-fabric.atlassian.net/browse/ED-14043
|
|
128
|
-
var _transformMediaLinkMa = (0, _transforms.transformMediaLinkMarks)(node),
|
|
129
|
-
transformedAdf = _transformMediaLinkMa.transformedAdf,
|
|
130
|
-
isTransformed = _transformMediaLinkMa.isTransformed;
|
|
131
|
-
if (isTransformed && dispatchAnalyticsEvent) {
|
|
132
|
-
dispatchAnalyticsEvent({
|
|
133
|
-
action: _analytics.ACTION.MEDIA_LINK_TRANSFORMED,
|
|
134
|
-
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
135
|
-
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// See: HOT-97965 https://product-fabric.atlassian.net/browse/ED-14400
|
|
140
|
-
// We declared in code mark spec that links and marks should not co-exist on
|
|
141
|
-
// text nodes. This util strips code marks from bad text nodes and preserves links.
|
|
142
|
-
// Otherwise, prosemirror will try to repair the invalid document by stripping links
|
|
143
|
-
// and preserving code marks during content changes.
|
|
144
|
-
var _transformTextLinkCod = (0, _transforms.transformTextLinkCodeMarks)(transformedAdf);
|
|
145
|
-
transformedAdf = _transformTextLinkCod.transformedAdf;
|
|
146
|
-
isTransformed = _transformTextLinkCod.isTransformed;
|
|
147
|
-
if (isTransformed && dispatchAnalyticsEvent) {
|
|
148
|
-
dispatchAnalyticsEvent({
|
|
149
|
-
action: _analytics.ACTION.TEXT_LINK_MARK_TRANSFORMED,
|
|
150
|
-
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
151
|
-
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
var discardedMarks = [];
|
|
155
|
-
var _transformDedupeMarks = (0, _transforms.transformDedupeMarks)(transformedAdf);
|
|
156
|
-
transformedAdf = _transformDedupeMarks.transformedAdf;
|
|
157
|
-
isTransformed = _transformDedupeMarks.isTransformed;
|
|
158
|
-
discardedMarks = _transformDedupeMarks.discardedMarks;
|
|
159
|
-
if (isTransformed && dispatchAnalyticsEvent) {
|
|
160
|
-
dispatchAnalyticsEvent({
|
|
161
|
-
action: _analytics.ACTION.DEDUPE_MARKS_TRANSFORMED_V2,
|
|
162
|
-
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
163
|
-
eventType: _analytics.EVENT_TYPE.OPERATIONAL,
|
|
164
|
-
attributes: {
|
|
165
|
-
/** UGC WARNING
|
|
166
|
-
*
|
|
167
|
-
* DO NOT include the `mark` attributes inside, we map here to only
|
|
168
|
-
* extract the mark type as that is the only non-UGC safe information
|
|
169
|
-
* that we can add to event-attributes
|
|
170
|
-
*
|
|
171
|
-
*/
|
|
172
|
-
discardedMarkTypes: discardedMarks.map(function (mark) {
|
|
173
|
-
return mark.type;
|
|
174
|
-
})
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
var _transformNodesMissin = (0, _transforms.transformNodesMissingContent)(transformedAdf);
|
|
179
|
-
transformedAdf = _transformNodesMissin.transformedAdf;
|
|
180
|
-
isTransformed = _transformNodesMissin.isTransformed;
|
|
181
|
-
if (isTransformed && dispatchAnalyticsEvent) {
|
|
182
|
-
dispatchAnalyticsEvent({
|
|
183
|
-
action: _analytics.ACTION.NODES_MISSING_CONTENT_TRANSFORMED,
|
|
184
|
-
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
185
|
-
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
var _transformIndentation = (0, _transforms.transformIndentationMarks)(transformedAdf);
|
|
189
|
-
transformedAdf = _transformIndentation.transformedAdf;
|
|
190
|
-
isTransformed = _transformIndentation.isTransformed;
|
|
191
|
-
if (isTransformed && dispatchAnalyticsEvent) {
|
|
192
|
-
dispatchAnalyticsEvent({
|
|
193
|
-
action: _analytics.ACTION.INDENTATION_MARKS_TRANSFORMED,
|
|
194
|
-
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
195
|
-
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
var _transformInvalidMedi = (0, _transforms.transformInvalidMediaContent)(transformedAdf);
|
|
199
|
-
transformedAdf = _transformInvalidMedi.transformedAdf;
|
|
200
|
-
isTransformed = _transformInvalidMedi.isTransformed;
|
|
201
|
-
if (isTransformed && dispatchAnalyticsEvent) {
|
|
202
|
-
dispatchAnalyticsEvent({
|
|
203
|
-
action: _analytics.ACTION.INVALID_MEDIA_CONTENT_TRANSFORMED,
|
|
204
|
-
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
205
|
-
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
var entity = (0, _validateUsingSpec.validateADFEntity)(schema, transformedAdf || node, dispatchAnalyticsEvent);
|
|
209
|
-
var newEntity = maySanitizePrivateContent(entity, providerFactory, sanitizePrivateContent);
|
|
210
|
-
var parsedDoc = _model.Node.fromJSON(schema, newEntity);
|
|
211
|
-
|
|
212
|
-
// throws an error if the document is invalid
|
|
213
|
-
try {
|
|
214
|
-
parsedDoc.check();
|
|
215
|
-
} catch (err) {
|
|
216
|
-
if (dispatchAnalyticsEvent) {
|
|
217
|
-
dispatchAnalyticsEvent({
|
|
218
|
-
action: _analytics.ACTION.INVALID_PROSEMIRROR_DOCUMENT,
|
|
219
|
-
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
220
|
-
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
throw err;
|
|
224
|
-
}
|
|
225
|
-
if (dispatchAnalyticsEvent) {
|
|
226
|
-
(0, _trackUnsupportedContent.findAndTrackUnsupportedContentNodes)(parsedDoc, schema, dispatchAnalyticsEvent);
|
|
227
|
-
}
|
|
228
|
-
return parsedDoc;
|
|
229
|
-
} catch (e) {
|
|
230
|
-
if (dispatchAnalyticsEvent) {
|
|
231
|
-
dispatchAnalyticsEvent({
|
|
232
|
-
action: _analytics.ACTION.DOCUMENT_PROCESSING_ERROR,
|
|
233
|
-
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
234
|
-
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// eslint-disable-next-line no-console
|
|
239
|
-
console.error("Error processing document:\n".concat(e instanceof Error ? e.message : String(e), "\n\n"), JSON.stringify(node));
|
|
240
|
-
if (isProseMirrorSchemaCheckError(e)) {
|
|
241
|
-
throw e;
|
|
242
|
-
}
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
function isProseMirrorSchemaCheckError(error) {
|
|
247
|
-
return error instanceof RangeError && (!!error.message.match(/^Invalid collection of marks for node/) || !!error.message.match(/^Invalid content for node/));
|
|
248
|
-
}
|
|
249
|
-
var maySanitizePrivateContent = function maySanitizePrivateContent(entity, providerFactory, sanitizePrivateContent) {
|
|
250
|
-
if (sanitizePrivateContent && providerFactory) {
|
|
251
|
-
return (0, _privacyFilter.sanitizeNodeForPrivacy)(entity, providerFactory);
|
|
252
|
-
}
|
|
253
|
-
return entity;
|
|
254
|
-
};
|
|
255
75
|
|
|
256
76
|
/**
|
|
257
77
|
* Returns false if node contains only empty inline nodes and hardBreaks.
|
package/dist/cjs/utils/index.js
CHANGED
|
@@ -922,7 +922,7 @@ exports.pmHistoryPluginKey = void 0;
|
|
|
922
922
|
Object.defineProperty(exports, "processRawValue", {
|
|
923
923
|
enumerable: true,
|
|
924
924
|
get: function get() {
|
|
925
|
-
return
|
|
925
|
+
return _processRawValue.processRawValue;
|
|
926
926
|
}
|
|
927
927
|
});
|
|
928
928
|
Object.defineProperty(exports, "removeBlockMarks", {
|
|
@@ -1186,6 +1186,7 @@ var _referentiality = require("./referentiality");
|
|
|
1186
1186
|
var _list = require("./list");
|
|
1187
1187
|
var _hyperlink = require("./hyperlink");
|
|
1188
1188
|
var _grid = require("./grid");
|
|
1189
|
+
var _processRawValue = require("./processRawValue");
|
|
1189
1190
|
var _richMediaUtils = require("./rich-media-utils");
|
|
1190
1191
|
var _privacyFilter = require("./filter/privacy-filter");
|
|
1191
1192
|
var _datasource = require("./datasource");
|
|
@@ -1208,6 +1209,21 @@ var _pageElementCounts = require("./page-element-counts");
|
|
|
1208
1209
|
* Use entry-point `@atlaskit/editor-common/utils/analytics` instead
|
|
1209
1210
|
*/
|
|
1210
1211
|
|
|
1212
|
+
/**
|
|
1213
|
+
* @private
|
|
1214
|
+
* @deprecated
|
|
1215
|
+
*
|
|
1216
|
+
* Private API - should not be used. Use `@atlaskit/editor-common/is-performance-api-available` if required.
|
|
1217
|
+
*
|
|
1218
|
+
*/
|
|
1219
|
+
|
|
1220
|
+
/**
|
|
1221
|
+
* @private
|
|
1222
|
+
* @deprecated
|
|
1223
|
+
*
|
|
1224
|
+
* Private API - should not be used. Use `@atlaskit/editor-common/performance/navigation` if required.
|
|
1225
|
+
*/
|
|
1226
|
+
|
|
1211
1227
|
/**
|
|
1212
1228
|
* @deprecated - [ED-23844] moving to own entry point @atlaskit/editor-common/whitespace
|
|
1213
1229
|
*/
|
|
@@ -1221,6 +1237,21 @@ var _pageElementCounts = require("./page-element-counts");
|
|
|
1221
1237
|
|
|
1222
1238
|
// prosemirror-history does not export its plugin key
|
|
1223
1239
|
var pmHistoryPluginKey = exports.pmHistoryPluginKey = 'history$';
|
|
1240
|
+
|
|
1241
|
+
/**
|
|
1242
|
+
* @private
|
|
1243
|
+
* @deprecated
|
|
1244
|
+
*
|
|
1245
|
+
* Use `@atlaskit/editor-common/process-raw-value` entry-point instead.
|
|
1246
|
+
*/
|
|
1247
|
+
|
|
1248
|
+
/**
|
|
1249
|
+
* @private
|
|
1250
|
+
* @deprecated
|
|
1251
|
+
*
|
|
1252
|
+
* Private API - do not use.
|
|
1253
|
+
*/
|
|
1254
|
+
|
|
1224
1255
|
function shallowEqual() {
|
|
1225
1256
|
var obj1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1226
1257
|
var obj2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.processRawValue = processRawValue;
|
|
7
|
+
var _transforms = require("@atlaskit/adf-utils/transforms");
|
|
8
|
+
var _model = require("@atlaskit/editor-prosemirror/model");
|
|
9
|
+
var _analytics = require("../analytics");
|
|
10
|
+
var _privacyFilter = require("./filter/privacy-filter");
|
|
11
|
+
var _trackUnsupportedContent = require("./track-unsupported-content");
|
|
12
|
+
var _validateUsingSpec = require("./validate-using-spec");
|
|
13
|
+
function processRawValue(schema, value, providerFactory, sanitizePrivateContent, contentTransformer, dispatchAnalyticsEvent) {
|
|
14
|
+
if (!value) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
var node;
|
|
18
|
+
if (typeof value === 'string') {
|
|
19
|
+
try {
|
|
20
|
+
if (contentTransformer) {
|
|
21
|
+
var doc = contentTransformer.parse(value);
|
|
22
|
+
node = doc.toJSON();
|
|
23
|
+
} else {
|
|
24
|
+
node = JSON.parse(value);
|
|
25
|
+
}
|
|
26
|
+
} catch (e) {
|
|
27
|
+
// eslint-disable-next-line no-console
|
|
28
|
+
console.error("Error processing value: ".concat(value, " isn't a valid JSON"));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
} else {
|
|
32
|
+
node = value;
|
|
33
|
+
}
|
|
34
|
+
if (Array.isArray(node)) {
|
|
35
|
+
// eslint-disable-next-line no-console
|
|
36
|
+
console.error("Error processing value: ".concat(node, " is an array, but it must be an object."));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
// ProseMirror always require a child under doc
|
|
41
|
+
if (node.type === 'doc') {
|
|
42
|
+
if (Array.isArray(node.content) && node.content.length === 0) {
|
|
43
|
+
node.content.push({
|
|
44
|
+
type: 'paragraph',
|
|
45
|
+
content: []
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Just making sure doc is always valid
|
|
49
|
+
if (!node.version) {
|
|
50
|
+
node.version = 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (contentTransformer) {
|
|
54
|
+
return _model.Node.fromJSON(schema, node);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// link mark on mediaSingle is deprecated, need to move link mark to child media node
|
|
58
|
+
// https://product-fabric.atlassian.net/browse/ED-14043
|
|
59
|
+
var _transformMediaLinkMa = (0, _transforms.transformMediaLinkMarks)(node),
|
|
60
|
+
transformedAdf = _transformMediaLinkMa.transformedAdf,
|
|
61
|
+
isTransformed = _transformMediaLinkMa.isTransformed;
|
|
62
|
+
if (isTransformed && dispatchAnalyticsEvent) {
|
|
63
|
+
dispatchAnalyticsEvent({
|
|
64
|
+
action: _analytics.ACTION.MEDIA_LINK_TRANSFORMED,
|
|
65
|
+
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
66
|
+
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// See: HOT-97965 https://product-fabric.atlassian.net/browse/ED-14400
|
|
71
|
+
// We declared in code mark spec that links and marks should not co-exist on
|
|
72
|
+
// text nodes. This util strips code marks from bad text nodes and preserves links.
|
|
73
|
+
// Otherwise, prosemirror will try to repair the invalid document by stripping links
|
|
74
|
+
// and preserving code marks during content changes.
|
|
75
|
+
var _transformTextLinkCod = (0, _transforms.transformTextLinkCodeMarks)(transformedAdf);
|
|
76
|
+
transformedAdf = _transformTextLinkCod.transformedAdf;
|
|
77
|
+
isTransformed = _transformTextLinkCod.isTransformed;
|
|
78
|
+
if (isTransformed && dispatchAnalyticsEvent) {
|
|
79
|
+
dispatchAnalyticsEvent({
|
|
80
|
+
action: _analytics.ACTION.TEXT_LINK_MARK_TRANSFORMED,
|
|
81
|
+
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
82
|
+
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
var discardedMarks = [];
|
|
86
|
+
var _transformDedupeMarks = (0, _transforms.transformDedupeMarks)(transformedAdf);
|
|
87
|
+
transformedAdf = _transformDedupeMarks.transformedAdf;
|
|
88
|
+
isTransformed = _transformDedupeMarks.isTransformed;
|
|
89
|
+
discardedMarks = _transformDedupeMarks.discardedMarks;
|
|
90
|
+
if (isTransformed && dispatchAnalyticsEvent) {
|
|
91
|
+
dispatchAnalyticsEvent({
|
|
92
|
+
action: _analytics.ACTION.DEDUPE_MARKS_TRANSFORMED_V2,
|
|
93
|
+
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
94
|
+
eventType: _analytics.EVENT_TYPE.OPERATIONAL,
|
|
95
|
+
attributes: {
|
|
96
|
+
/** UGC WARNING
|
|
97
|
+
*
|
|
98
|
+
* DO NOT include the `mark` attributes inside, we map here to only
|
|
99
|
+
* extract the mark type as that is the only non-UGC safe information
|
|
100
|
+
* that we can add to event-attributes
|
|
101
|
+
*
|
|
102
|
+
*/
|
|
103
|
+
discardedMarkTypes: discardedMarks.map(function (mark) {
|
|
104
|
+
return mark.type;
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
var _transformNodesMissin = (0, _transforms.transformNodesMissingContent)(transformedAdf);
|
|
110
|
+
transformedAdf = _transformNodesMissin.transformedAdf;
|
|
111
|
+
isTransformed = _transformNodesMissin.isTransformed;
|
|
112
|
+
if (isTransformed && dispatchAnalyticsEvent) {
|
|
113
|
+
dispatchAnalyticsEvent({
|
|
114
|
+
action: _analytics.ACTION.NODES_MISSING_CONTENT_TRANSFORMED,
|
|
115
|
+
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
116
|
+
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
var _transformIndentation = (0, _transforms.transformIndentationMarks)(transformedAdf);
|
|
120
|
+
transformedAdf = _transformIndentation.transformedAdf;
|
|
121
|
+
isTransformed = _transformIndentation.isTransformed;
|
|
122
|
+
if (isTransformed && dispatchAnalyticsEvent) {
|
|
123
|
+
dispatchAnalyticsEvent({
|
|
124
|
+
action: _analytics.ACTION.INDENTATION_MARKS_TRANSFORMED,
|
|
125
|
+
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
126
|
+
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
var _transformInvalidMedi = (0, _transforms.transformInvalidMediaContent)(transformedAdf);
|
|
130
|
+
transformedAdf = _transformInvalidMedi.transformedAdf;
|
|
131
|
+
isTransformed = _transformInvalidMedi.isTransformed;
|
|
132
|
+
if (isTransformed && dispatchAnalyticsEvent) {
|
|
133
|
+
dispatchAnalyticsEvent({
|
|
134
|
+
action: _analytics.ACTION.INVALID_MEDIA_CONTENT_TRANSFORMED,
|
|
135
|
+
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
136
|
+
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
var entity = (0, _validateUsingSpec.validateADFEntity)(schema, transformedAdf || node, dispatchAnalyticsEvent);
|
|
140
|
+
var newEntity = maySanitizePrivateContent(entity, providerFactory, sanitizePrivateContent);
|
|
141
|
+
var parsedDoc = _model.Node.fromJSON(schema, newEntity);
|
|
142
|
+
|
|
143
|
+
// throws an error if the document is invalid
|
|
144
|
+
try {
|
|
145
|
+
parsedDoc.check();
|
|
146
|
+
} catch (err) {
|
|
147
|
+
if (dispatchAnalyticsEvent) {
|
|
148
|
+
dispatchAnalyticsEvent({
|
|
149
|
+
action: _analytics.ACTION.INVALID_PROSEMIRROR_DOCUMENT,
|
|
150
|
+
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
151
|
+
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
throw err;
|
|
155
|
+
}
|
|
156
|
+
if (dispatchAnalyticsEvent) {
|
|
157
|
+
(0, _trackUnsupportedContent.findAndTrackUnsupportedContentNodes)(parsedDoc, schema, dispatchAnalyticsEvent);
|
|
158
|
+
}
|
|
159
|
+
return parsedDoc;
|
|
160
|
+
} catch (e) {
|
|
161
|
+
if (dispatchAnalyticsEvent) {
|
|
162
|
+
dispatchAnalyticsEvent({
|
|
163
|
+
action: _analytics.ACTION.DOCUMENT_PROCESSING_ERROR,
|
|
164
|
+
actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
|
|
165
|
+
eventType: _analytics.EVENT_TYPE.OPERATIONAL
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// eslint-disable-next-line no-console
|
|
170
|
+
console.error("Error processing document:\n".concat(e instanceof Error ? e.message : String(e), "\n\n"), JSON.stringify(node));
|
|
171
|
+
if (isProseMirrorSchemaCheckError(e)) {
|
|
172
|
+
throw e;
|
|
173
|
+
}
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function isProseMirrorSchemaCheckError(error) {
|
|
178
|
+
return error instanceof RangeError && (!!error.message.match(/^Invalid collection of marks for node/) || !!error.message.match(/^Invalid content for node/));
|
|
179
|
+
}
|
|
180
|
+
var maySanitizePrivateContent = function maySanitizePrivateContent(entity, providerFactory, sanitizePrivateContent) {
|
|
181
|
+
if (sanitizePrivateContent && providerFactory) {
|
|
182
|
+
return (0, _privacyFilter.sanitizeNodeForPrivacy)(entity, providerFactory);
|
|
183
|
+
}
|
|
184
|
+
return entity;
|
|
185
|
+
};
|
|
@@ -163,6 +163,7 @@ export let INPUT_METHOD = /*#__PURE__*/function (INPUT_METHOD) {
|
|
|
163
163
|
INPUT_METHOD["FLOATING_TB"] = "floatingToolbar";
|
|
164
164
|
INPUT_METHOD["FORMATTING"] = "autoformatting";
|
|
165
165
|
INPUT_METHOD["INSERT_MENU"] = "insertMenu";
|
|
166
|
+
INPUT_METHOD["INSERT_MENU_RIGHT_RAIL"] = "insertMenuRightRail";
|
|
166
167
|
INPUT_METHOD["KEYBOARD"] = "keyboard";
|
|
167
168
|
INPUT_METHOD["MEDIA_PICKER"] = "mediaPicker";
|
|
168
169
|
INPUT_METHOD["MACRO_BROWSER"] = "macroBrowser";
|
|
@@ -239,6 +239,20 @@ export const insertSelectedItem = (maybeNode, opts = {}) => (state, tr, start) =
|
|
|
239
239
|
*/
|
|
240
240
|
} else if (node instanceof Node && node.isInline || isInputFragment) {
|
|
241
241
|
const fragment = isInputFragment ? node : Fragment.fromArray([node, state.schema.text(' ')]);
|
|
242
|
+
|
|
243
|
+
// For platform_editor_element_level_templates experiment only
|
|
244
|
+
// clean up ticket ED-24873
|
|
245
|
+
// @ts-ignore
|
|
246
|
+
if (opts.isTemplate) {
|
|
247
|
+
return insertTemplateFragment({
|
|
248
|
+
fragment,
|
|
249
|
+
tr,
|
|
250
|
+
position: {
|
|
251
|
+
start,
|
|
252
|
+
end: start
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
242
256
|
tr = tr.replaceWith(start, start, fragment);
|
|
243
257
|
if (opts.selectInlineNode) {
|
|
244
258
|
// Select inserted node
|
|
@@ -285,4 +299,19 @@ export function contentAllowedInCodeBlock(state) {
|
|
|
285
299
|
return isAllowedChild = node.type === state.schema.nodes.listItem || node.type === state.schema.nodes.bulletList || node.type === state.schema.nodes.orderedList || node.type === state.schema.nodes.paragraph || node.isInline || node.type === state.schema.nodes.panel || node.isText;
|
|
286
300
|
});
|
|
287
301
|
return isAllowedChild;
|
|
288
|
-
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// For platform_editor_element_level_templates experiment only
|
|
305
|
+
// clean up ticket ED-24873
|
|
306
|
+
const insertTemplateFragment = ({
|
|
307
|
+
fragment,
|
|
308
|
+
tr,
|
|
309
|
+
position
|
|
310
|
+
}) => {
|
|
311
|
+
const {
|
|
312
|
+
start
|
|
313
|
+
} = position;
|
|
314
|
+
const trWithInsert = pmSafeInsert(fragment, start)(tr);
|
|
315
|
+
tr.setSelection(trWithInsert.selection);
|
|
316
|
+
return tr;
|
|
317
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
2
|
+
import { useIntl } from 'react-intl-next';
|
|
3
|
+
import CommentIcon from '@atlaskit/icon/glyph/comment';
|
|
4
|
+
import { Pressable, xcss } from '@atlaskit/primitives';
|
|
5
|
+
import Tooltip from '@atlaskit/tooltip';
|
|
6
|
+
import { commentMessages as messages } from '../media';
|
|
7
|
+
const baseStyles = xcss({
|
|
8
|
+
borderRadius: 'border.radius'
|
|
9
|
+
});
|
|
10
|
+
const smallBadgeStyles = xcss({
|
|
11
|
+
height: 'space.200',
|
|
12
|
+
width: 'space.200'
|
|
13
|
+
});
|
|
14
|
+
const mediumBadgeStyles = xcss({
|
|
15
|
+
height: 'space.300',
|
|
16
|
+
width: 'space.300'
|
|
17
|
+
});
|
|
18
|
+
export const CommentBadgeNext = ({
|
|
19
|
+
status = 'default',
|
|
20
|
+
onClick,
|
|
21
|
+
onMouseEnter,
|
|
22
|
+
onMouseLeave,
|
|
23
|
+
badgeSize
|
|
24
|
+
}) => {
|
|
25
|
+
const intl = useIntl();
|
|
26
|
+
const title = intl.formatMessage(messages.viewCommentsOnMedia);
|
|
27
|
+
const colourToken = useMemo(() => {
|
|
28
|
+
switch (status) {
|
|
29
|
+
case 'active':
|
|
30
|
+
return 'color.background.accent.yellow.subtlest.pressed';
|
|
31
|
+
case 'entered':
|
|
32
|
+
return 'color.background.accent.yellow.subtlest.hovered';
|
|
33
|
+
default:
|
|
34
|
+
return 'color.background.accent.yellow.subtlest';
|
|
35
|
+
}
|
|
36
|
+
}, [status]);
|
|
37
|
+
return /*#__PURE__*/React.createElement(Tooltip, {
|
|
38
|
+
position: "top",
|
|
39
|
+
content: title
|
|
40
|
+
}, /*#__PURE__*/React.createElement(Pressable, {
|
|
41
|
+
xcss: [baseStyles, badgeSize === 'medium' ? mediumBadgeStyles : smallBadgeStyles],
|
|
42
|
+
padding: "space.0",
|
|
43
|
+
onClick: onClick,
|
|
44
|
+
onMouseEnter: onMouseEnter,
|
|
45
|
+
onMouseLeave: onMouseLeave,
|
|
46
|
+
backgroundColor: colourToken
|
|
47
|
+
}, /*#__PURE__*/React.createElement(CommentIcon, {
|
|
48
|
+
label: title,
|
|
49
|
+
size: badgeSize
|
|
50
|
+
})));
|
|
51
|
+
};
|
|
@@ -1,62 +1,27 @@
|
|
|
1
|
-
import React
|
|
2
|
-
import debounce from 'lodash/debounce';
|
|
1
|
+
import React from 'react';
|
|
3
2
|
import { useIntl } from 'react-intl-next';
|
|
4
3
|
import InfoIcon from '@atlaskit/icon/glyph/info';
|
|
5
4
|
import { Box, xcss } from '@atlaskit/primitives';
|
|
6
5
|
import Tooltip from '@atlaskit/tooltip';
|
|
7
6
|
import { externalMediaMessages } from '../media';
|
|
8
|
-
import { getBadgeSize } from './CommentBadge';
|
|
9
7
|
const baseStyles = xcss({
|
|
10
|
-
position: 'absolute',
|
|
11
|
-
top: 'space.025',
|
|
12
8
|
borderRadius: 'border.radius',
|
|
13
9
|
backgroundColor: 'elevation.surface',
|
|
14
|
-
zIndex: 'tooltip',
|
|
15
10
|
lineHeight: "var(--ds-space-200, 16px)",
|
|
16
|
-
right: 'var(--right-offset)',
|
|
17
11
|
cursor: 'pointer'
|
|
18
12
|
});
|
|
19
13
|
export const ExternalImageBadge = ({
|
|
20
|
-
|
|
21
|
-
mediaHeight,
|
|
22
|
-
commentBadgeRightOffset = 0,
|
|
23
|
-
mediaElement
|
|
14
|
+
badgeSize
|
|
24
15
|
}) => {
|
|
25
16
|
const intl = useIntl();
|
|
26
17
|
const message = intl.formatMessage(externalMediaMessages.externalMediaFile);
|
|
27
|
-
|
|
28
|
-
// detect resize of media element to adjust badge size
|
|
29
|
-
// will combine with the comment badge resize observer when refactoring in the future to avoid multiple resize observers
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
const observer = new ResizeObserver(debounce(entries => {
|
|
32
|
-
const [entry] = entries;
|
|
33
|
-
const {
|
|
34
|
-
width,
|
|
35
|
-
height
|
|
36
|
-
} = entry.contentRect;
|
|
37
|
-
setBadgeSize(getBadgeSize(width, height));
|
|
38
|
-
}));
|
|
39
|
-
if (mediaElement) {
|
|
40
|
-
observer.observe(mediaElement);
|
|
41
|
-
}
|
|
42
|
-
return () => {
|
|
43
|
-
observer.disconnect();
|
|
44
|
-
};
|
|
45
|
-
}, [mediaElement]);
|
|
46
|
-
const baseRightOffset = badgeSize === 'medium' ? 4 : 2;
|
|
47
|
-
const rightOffset = baseRightOffset + commentBadgeRightOffset;
|
|
48
|
-
return /*#__PURE__*/React.createElement(Box
|
|
49
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop
|
|
50
|
-
, {
|
|
51
|
-
style: {
|
|
52
|
-
'--right-offset': `${rightOffset}px`
|
|
53
|
-
},
|
|
18
|
+
return /*#__PURE__*/React.createElement(Box, {
|
|
54
19
|
padding: badgeSize === 'medium' ? 'space.050' : 'space.0',
|
|
55
|
-
"data-external-image-badge": "true",
|
|
56
20
|
xcss: baseStyles,
|
|
57
21
|
tabIndex: 0
|
|
58
22
|
}, /*#__PURE__*/React.createElement(Tooltip, {
|
|
59
|
-
content: message
|
|
23
|
+
content: message,
|
|
24
|
+
position: "top"
|
|
60
25
|
}, /*#__PURE__*/React.createElement(InfoIcon, {
|
|
61
26
|
size: "small",
|
|
62
27
|
label: message
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import debounce from 'lodash/debounce';
|
|
3
|
+
import { Box, xcss } from '@atlaskit/primitives';
|
|
4
|
+
const containerStyles = xcss({
|
|
5
|
+
display: 'flex',
|
|
6
|
+
position: 'absolute',
|
|
7
|
+
top: 'space.0',
|
|
8
|
+
right: 'space.0',
|
|
9
|
+
lineHeight: "var(--ds-space-200, 16px)",
|
|
10
|
+
gap: 'space.025',
|
|
11
|
+
zIndex: 'card',
|
|
12
|
+
height: 'fit-content',
|
|
13
|
+
width: 'fit-content',
|
|
14
|
+
margin: 'space.075'
|
|
15
|
+
});
|
|
16
|
+
const resizeOffsetStyles = xcss({
|
|
17
|
+
right: 'space.150'
|
|
18
|
+
});
|
|
19
|
+
const smallBadgeStyles = xcss({
|
|
20
|
+
margin: 'space.025'
|
|
21
|
+
});
|
|
22
|
+
const getBadgeSize = (width, height) => {
|
|
23
|
+
// width is the original width of image, not resized or currently rendered to user. Defaulting to medium for now
|
|
24
|
+
return width && width < 70 || height && height < 70 ? 'small' : 'medium';
|
|
25
|
+
};
|
|
26
|
+
export const MediaBadges = ({
|
|
27
|
+
children,
|
|
28
|
+
mediaElement,
|
|
29
|
+
mediaWidth,
|
|
30
|
+
mediaHeight,
|
|
31
|
+
extendedResizeOffset
|
|
32
|
+
}) => {
|
|
33
|
+
const [badgeSize, setBadgeSize] = useState(getBadgeSize(mediaWidth, mediaHeight));
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
const observer = new ResizeObserver(debounce(entries => {
|
|
36
|
+
const [entry] = entries;
|
|
37
|
+
const {
|
|
38
|
+
width,
|
|
39
|
+
height
|
|
40
|
+
} = entry.contentRect;
|
|
41
|
+
setBadgeSize(getBadgeSize(width, height));
|
|
42
|
+
}));
|
|
43
|
+
if (mediaElement) {
|
|
44
|
+
observer.observe(mediaElement);
|
|
45
|
+
}
|
|
46
|
+
return () => {
|
|
47
|
+
observer.disconnect();
|
|
48
|
+
};
|
|
49
|
+
}, [mediaElement]);
|
|
50
|
+
if (typeof children === 'function') {
|
|
51
|
+
children = children({
|
|
52
|
+
badgeSize
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (!mediaElement || React.Children.count(children) === 0) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return /*#__PURE__*/React.createElement(Box, {
|
|
59
|
+
testId: "media-badges",
|
|
60
|
+
"data-media-badges": "true",
|
|
61
|
+
xcss: [containerStyles, extendedResizeOffset && resizeOffsetStyles, badgeSize === 'small' && smallBadgeStyles]
|
|
62
|
+
}, children);
|
|
63
|
+
};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { MEDIA_SINGLE_DEFAULT_MIN_PIXEL_WIDTH, MEDIA_SINGLE_VIDEO_MIN_PIXEL_WIDTH, MEDIA_SINGLE_SNAP_GAP, MEDIA_SINGLE_HIGHLIGHT_GAP, MEDIA_SINGLE_GUTTER_SIZE, MEDIA_SINGLE_RESIZE_THROTTLE_TIME, Layout as MediaSingleLayout, DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT, wrappedLayouts, CAPTION_PLACEHOLDER_ID } from './constants';
|
|
2
2
|
export { getMediaSinglePixelWidth, calcMediaSinglePixelWidth, calcMediaSingleMaxWidth, getMediaSingleInitialWidth, calculateOffsetLeft, roundToNearest, calcMinWidth, getMaxWidthForNestedNode, getMaxWidthForNestedNodeNext, currentMediaNodeWithPos } from './utils';
|
|
3
3
|
export { CommentBadge } from './CommentBadge';
|
|
4
|
-
export {
|
|
4
|
+
export { CommentBadgeNext } from './CommentBadgeNext';
|
|
5
|
+
export { ExternalImageBadge } from './ExternalImageBadge';
|
|
6
|
+
export { MediaBadges } from './MediaBadges';
|