@atlaskit/editor-plugin-card 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +15 -0
- package/CHANGELOG.md +1 -0
- package/LICENSE.md +13 -0
- package/README.md +7 -0
- package/dist/cjs/index.js +12 -0
- package/dist/cjs/messages.js +20 -0
- package/dist/cjs/nodeviews/blockCard.js +164 -0
- package/dist/cjs/nodeviews/datasource.js +173 -0
- package/dist/cjs/nodeviews/embedCard.js +398 -0
- package/dist/cjs/nodeviews/genericCard.js +118 -0
- package/dist/cjs/nodeviews/inlineCard.js +132 -0
- package/dist/cjs/plugin.js +138 -0
- package/dist/cjs/pm-plugins/actions.js +122 -0
- package/dist/cjs/pm-plugins/analytics/create-analytics-queue.js +48 -0
- package/dist/cjs/pm-plugins/analytics/events-from-tr.js +359 -0
- package/dist/cjs/pm-plugins/analytics/index.js +19 -0
- package/dist/cjs/pm-plugins/analytics/types.js +5 -0
- package/dist/cjs/pm-plugins/analytics/utils.js +178 -0
- package/dist/cjs/pm-plugins/doc.js +479 -0
- package/dist/cjs/pm-plugins/keymap.js +64 -0
- package/dist/cjs/pm-plugins/main.js +212 -0
- package/dist/cjs/pm-plugins/mountHyperlink.js +47 -0
- package/dist/cjs/pm-plugins/plugin-key.js +9 -0
- package/dist/cjs/pm-plugins/reducers.js +111 -0
- package/dist/cjs/pm-plugins/shouldReplaceLink.js +35 -0
- package/dist/cjs/pm-plugins/util/resolve.js +59 -0
- package/dist/cjs/pm-plugins/util/state.js +49 -0
- package/dist/cjs/toolbar.js +364 -0
- package/dist/cjs/types.js +5 -0
- package/dist/cjs/ui/DatasourceModal/ModalWithState.js +25 -0
- package/dist/cjs/ui/DatasourceModal/index.js +60 -0
- package/dist/cjs/ui/EditLinkToolbar.js +258 -0
- package/dist/cjs/ui/EditorSmartCardEvents.js +21 -0
- package/dist/cjs/ui/EditorSmartCardEventsNext.js +215 -0
- package/dist/cjs/ui/HyperlinkToolbarAppearance.js +174 -0
- package/dist/cjs/ui/LayoutButton/index.js +121 -0
- package/dist/cjs/ui/LayoutButton/types.js +5 -0
- package/dist/cjs/ui/LayoutButton/utils.js +19 -0
- package/dist/cjs/ui/LinkToolbarAppearance.js +152 -0
- package/dist/cjs/ui/ResizableEmbedCard.js +364 -0
- package/dist/cjs/ui/SmallerEditIcon.js +22 -0
- package/dist/cjs/utils.js +60 -0
- package/dist/cjs/version.json +5 -0
- package/dist/es2019/index.js +1 -0
- package/dist/es2019/messages.js +13 -0
- package/dist/es2019/nodeviews/blockCard.js +131 -0
- package/dist/es2019/nodeviews/datasource.js +137 -0
- package/dist/es2019/nodeviews/embedCard.js +370 -0
- package/dist/es2019/nodeviews/genericCard.js +92 -0
- package/dist/es2019/nodeviews/inlineCard.js +113 -0
- package/dist/es2019/plugin.js +129 -0
- package/dist/es2019/pm-plugins/actions.js +57 -0
- package/dist/es2019/pm-plugins/analytics/create-analytics-queue.js +38 -0
- package/dist/es2019/pm-plugins/analytics/events-from-tr.js +339 -0
- package/dist/es2019/pm-plugins/analytics/index.js +2 -0
- package/dist/es2019/pm-plugins/analytics/types.js +1 -0
- package/dist/es2019/pm-plugins/analytics/utils.js +160 -0
- package/dist/es2019/pm-plugins/doc.js +451 -0
- package/dist/es2019/pm-plugins/keymap.js +59 -0
- package/dist/es2019/pm-plugins/main.js +208 -0
- package/dist/es2019/pm-plugins/mountHyperlink.js +37 -0
- package/dist/es2019/pm-plugins/plugin-key.js +2 -0
- package/dist/es2019/pm-plugins/reducers.js +110 -0
- package/dist/es2019/pm-plugins/shouldReplaceLink.js +25 -0
- package/dist/es2019/pm-plugins/util/resolve.js +50 -0
- package/dist/es2019/pm-plugins/util/state.js +26 -0
- package/dist/es2019/toolbar.js +359 -0
- package/dist/es2019/types.js +1 -0
- package/dist/es2019/ui/DatasourceModal/ModalWithState.js +19 -0
- package/dist/es2019/ui/DatasourceModal/index.js +48 -0
- package/dist/es2019/ui/EditLinkToolbar.js +226 -0
- package/dist/es2019/ui/EditorSmartCardEvents.js +15 -0
- package/dist/es2019/ui/EditorSmartCardEventsNext.js +199 -0
- package/dist/es2019/ui/HyperlinkToolbarAppearance.js +86 -0
- package/dist/es2019/ui/LayoutButton/index.js +114 -0
- package/dist/es2019/ui/LayoutButton/types.js +1 -0
- package/dist/es2019/ui/LayoutButton/utils.js +15 -0
- package/dist/es2019/ui/LinkToolbarAppearance.js +118 -0
- package/dist/es2019/ui/ResizableEmbedCard.js +335 -0
- package/dist/es2019/ui/SmallerEditIcon.js +14 -0
- package/dist/es2019/utils.js +46 -0
- package/dist/es2019/version.json +5 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/messages.js +13 -0
- package/dist/esm/nodeviews/blockCard.js +156 -0
- package/dist/esm/nodeviews/datasource.js +165 -0
- package/dist/esm/nodeviews/embedCard.js +389 -0
- package/dist/esm/nodeviews/genericCard.js +111 -0
- package/dist/esm/nodeviews/inlineCard.js +124 -0
- package/dist/esm/plugin.js +130 -0
- package/dist/esm/pm-plugins/actions.js +102 -0
- package/dist/esm/pm-plugins/analytics/create-analytics-queue.js +41 -0
- package/dist/esm/pm-plugins/analytics/events-from-tr.js +350 -0
- package/dist/esm/pm-plugins/analytics/index.js +2 -0
- package/dist/esm/pm-plugins/analytics/types.js +1 -0
- package/dist/esm/pm-plugins/analytics/utils.js +160 -0
- package/dist/esm/pm-plugins/doc.js +460 -0
- package/dist/esm/pm-plugins/keymap.js +58 -0
- package/dist/esm/pm-plugins/main.js +199 -0
- package/dist/esm/pm-plugins/mountHyperlink.js +39 -0
- package/dist/esm/pm-plugins/plugin-key.js +2 -0
- package/dist/esm/pm-plugins/reducers.js +103 -0
- package/dist/esm/pm-plugins/shouldReplaceLink.js +29 -0
- package/dist/esm/pm-plugins/util/resolve.js +52 -0
- package/dist/esm/pm-plugins/util/state.js +40 -0
- package/dist/esm/toolbar.js +350 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/ui/DatasourceModal/ModalWithState.js +17 -0
- package/dist/esm/ui/DatasourceModal/index.js +49 -0
- package/dist/esm/ui/EditLinkToolbar.js +244 -0
- package/dist/esm/ui/EditorSmartCardEvents.js +14 -0
- package/dist/esm/ui/EditorSmartCardEventsNext.js +203 -0
- package/dist/esm/ui/HyperlinkToolbarAppearance.js +163 -0
- package/dist/esm/ui/LayoutButton/index.js +110 -0
- package/dist/esm/ui/LayoutButton/types.js +1 -0
- package/dist/esm/ui/LayoutButton/utils.js +12 -0
- package/dist/esm/ui/LinkToolbarAppearance.js +141 -0
- package/dist/esm/ui/ResizableEmbedCard.js +358 -0
- package/dist/esm/ui/SmallerEditIcon.js +14 -0
- package/dist/esm/utils.js +48 -0
- package/dist/esm/version.json +5 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/messages.d.ts +12 -0
- package/dist/types/nodeviews/blockCard.d.ts +26 -0
- package/dist/types/nodeviews/datasource.d.ts +42 -0
- package/dist/types/nodeviews/embedCard.d.ts +46 -0
- package/dist/types/nodeviews/genericCard.d.ts +37 -0
- package/dist/types/nodeviews/inlineCard.d.ts +23 -0
- package/dist/types/plugin.d.ts +24 -0
- package/dist/types/pm-plugins/actions.d.ts +23 -0
- package/dist/types/pm-plugins/analytics/create-analytics-queue.d.ts +10 -0
- package/dist/types/pm-plugins/analytics/events-from-tr.d.ts +17 -0
- package/dist/types/pm-plugins/analytics/index.d.ts +2 -0
- package/dist/types/pm-plugins/analytics/types.d.ts +12 -0
- package/dist/types/pm-plugins/analytics/utils.d.ts +32 -0
- package/dist/types/pm-plugins/doc.d.ts +22 -0
- package/dist/types/pm-plugins/keymap.d.ts +3 -0
- package/dist/types/pm-plugins/main.d.ts +6 -0
- package/dist/types/pm-plugins/mountHyperlink.d.ts +5 -0
- package/dist/types/pm-plugins/plugin-key.d.ts +3 -0
- package/dist/types/pm-plugins/reducers.d.ts +3 -0
- package/dist/types/pm-plugins/shouldReplaceLink.d.ts +2 -0
- package/dist/types/pm-plugins/util/resolve.d.ts +8 -0
- package/dist/types/pm-plugins/util/state.d.ts +31 -0
- package/dist/types/toolbar.d.ts +9 -0
- package/dist/types/types.d.ts +163 -0
- package/dist/types/ui/DatasourceModal/ModalWithState.d.ts +9 -0
- package/dist/types/ui/DatasourceModal/index.d.ts +11 -0
- package/dist/types/ui/EditLinkToolbar.d.ts +47 -0
- package/dist/types/ui/EditorSmartCardEvents.d.ts +5 -0
- package/dist/types/ui/EditorSmartCardEventsNext.d.ts +18 -0
- package/dist/types/ui/HyperlinkToolbarAppearance.d.ts +32 -0
- package/dist/types/ui/LayoutButton/index.d.ts +9 -0
- package/dist/types/ui/LayoutButton/types.d.ts +19 -0
- package/dist/types/ui/LayoutButton/utils.d.ts +5 -0
- package/dist/types/ui/LinkToolbarAppearance.d.ts +29 -0
- package/dist/types/ui/ResizableEmbedCard.d.ts +61 -0
- package/dist/types/ui/SmallerEditIcon.d.ts +3 -0
- package/dist/types/utils.d.ts +19 -0
- package/dist/types-ts4.5/index.d.ts +2 -0
- package/dist/types-ts4.5/messages.d.ts +12 -0
- package/dist/types-ts4.5/nodeviews/blockCard.d.ts +26 -0
- package/dist/types-ts4.5/nodeviews/datasource.d.ts +42 -0
- package/dist/types-ts4.5/nodeviews/embedCard.d.ts +46 -0
- package/dist/types-ts4.5/nodeviews/genericCard.d.ts +37 -0
- package/dist/types-ts4.5/nodeviews/inlineCard.d.ts +23 -0
- package/dist/types-ts4.5/plugin.d.ts +24 -0
- package/dist/types-ts4.5/pm-plugins/actions.d.ts +23 -0
- package/dist/types-ts4.5/pm-plugins/analytics/create-analytics-queue.d.ts +10 -0
- package/dist/types-ts4.5/pm-plugins/analytics/events-from-tr.d.ts +17 -0
- package/dist/types-ts4.5/pm-plugins/analytics/index.d.ts +2 -0
- package/dist/types-ts4.5/pm-plugins/analytics/types.d.ts +12 -0
- package/dist/types-ts4.5/pm-plugins/analytics/utils.d.ts +32 -0
- package/dist/types-ts4.5/pm-plugins/doc.d.ts +22 -0
- package/dist/types-ts4.5/pm-plugins/keymap.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/main.d.ts +6 -0
- package/dist/types-ts4.5/pm-plugins/mountHyperlink.d.ts +5 -0
- package/dist/types-ts4.5/pm-plugins/plugin-key.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/reducers.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/shouldReplaceLink.d.ts +2 -0
- package/dist/types-ts4.5/pm-plugins/util/resolve.d.ts +8 -0
- package/dist/types-ts4.5/pm-plugins/util/state.d.ts +31 -0
- package/dist/types-ts4.5/toolbar.d.ts +9 -0
- package/dist/types-ts4.5/types.d.ts +163 -0
- package/dist/types-ts4.5/ui/DatasourceModal/ModalWithState.d.ts +9 -0
- package/dist/types-ts4.5/ui/DatasourceModal/index.d.ts +11 -0
- package/dist/types-ts4.5/ui/EditLinkToolbar.d.ts +47 -0
- package/dist/types-ts4.5/ui/EditorSmartCardEvents.d.ts +5 -0
- package/dist/types-ts4.5/ui/EditorSmartCardEventsNext.d.ts +18 -0
- package/dist/types-ts4.5/ui/HyperlinkToolbarAppearance.d.ts +32 -0
- package/dist/types-ts4.5/ui/LayoutButton/index.d.ts +9 -0
- package/dist/types-ts4.5/ui/LayoutButton/types.d.ts +19 -0
- package/dist/types-ts4.5/ui/LayoutButton/utils.d.ts +5 -0
- package/dist/types-ts4.5/ui/LinkToolbarAppearance.d.ts +29 -0
- package/dist/types-ts4.5/ui/ResizableEmbedCard.d.ts +61 -0
- package/dist/types-ts4.5/ui/SmallerEditIcon.d.ts +3 -0
- package/dist/types-ts4.5/utils.d.ts +19 -0
- package/package.json +126 -0
- package/report.api.md +146 -0
- package/tmp/api-report-tmp.d.ts +117 -0
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
4
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
5
|
+
import isEqual from 'lodash/isEqual';
|
|
6
|
+
import { closeHistory } from 'prosemirror-history';
|
|
7
|
+
import { NodeSelection, TextSelection } from 'prosemirror-state';
|
|
8
|
+
import { isSafeUrl } from '@atlaskit/adf-schema';
|
|
9
|
+
import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE, INPUT_METHOD, SMART_LINK_TYPE, unlinkPayload } from '@atlaskit/editor-common/analytics';
|
|
10
|
+
import { addLinkMetadata } from '@atlaskit/editor-common/card';
|
|
11
|
+
import { getLinkCreationAnalyticsEvent, isFromCurrentDomain, nodesBetweenChanged, processRawValue } from '@atlaskit/editor-common/utils';
|
|
12
|
+
import { appearanceForNodeType, selectedCardAppearance } from '../utils';
|
|
13
|
+
import { hideDatasourceModal, queueCards, resolveCard } from './actions';
|
|
14
|
+
import { pluginKey } from './plugin-key';
|
|
15
|
+
import { shouldReplaceLink } from './shouldReplaceLink';
|
|
16
|
+
/**
|
|
17
|
+
* Attempt to replace the link into the respective card.
|
|
18
|
+
*/
|
|
19
|
+
function replaceLinksToCards(tr, cardAdf, schema, request) {
|
|
20
|
+
var inlineCard = schema.nodes.inlineCard;
|
|
21
|
+
var url = request.url;
|
|
22
|
+
if (!isSafeUrl(url)) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// replace all the outstanding links with their cards
|
|
27
|
+
var pos = tr.mapping.map(request.pos);
|
|
28
|
+
var $pos = tr.doc.resolve(pos);
|
|
29
|
+
var node = tr.doc.nodeAt(pos);
|
|
30
|
+
if (!node || !node.type.isText) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
var replaceLink = request.shouldReplaceLink || shouldReplaceLink(node, request.compareLinkText, url);
|
|
34
|
+
if (!replaceLink) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ED-5638: add an extra space after inline cards to avoid re-rendering them
|
|
39
|
+
var nodes = [cardAdf];
|
|
40
|
+
if (cardAdf.type === inlineCard) {
|
|
41
|
+
nodes.push(schema.text(' '));
|
|
42
|
+
}
|
|
43
|
+
tr.replaceWith(pos, pos + (node.text || url).length, nodes);
|
|
44
|
+
return $pos.node($pos.depth - 1).type.name;
|
|
45
|
+
}
|
|
46
|
+
export var replaceQueuedUrlWithCard = function replaceQueuedUrlWithCard(url, cardData, analyticsAction, editorAnalyticsApi, createAnalyticsEvent) {
|
|
47
|
+
return function (editorState, dispatch) {
|
|
48
|
+
var state = pluginKey.getState(editorState);
|
|
49
|
+
if (!state) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// find the requests for this URL
|
|
54
|
+
var requests = state.requests.filter(function (req) {
|
|
55
|
+
return req.url === url;
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// try to transform response to ADF
|
|
59
|
+
var schema = editorState.schema;
|
|
60
|
+
var cardAdf = processRawValue(schema, cardData);
|
|
61
|
+
var tr = editorState.tr;
|
|
62
|
+
if (cardAdf) {
|
|
63
|
+
// Should prevent any other node than cards? [inlineCard, blockCard].includes(cardAdf.type)
|
|
64
|
+
var nodeContexts = requests.map(function (request) {
|
|
65
|
+
return replaceLinksToCards(tr, cardAdf, schema, request);
|
|
66
|
+
}).filter(function (context) {
|
|
67
|
+
return !!context;
|
|
68
|
+
}); // context exist
|
|
69
|
+
|
|
70
|
+
// Send analytics information
|
|
71
|
+
if (nodeContexts.length) {
|
|
72
|
+
var nodeContext = nodeContexts.every(function (context) {
|
|
73
|
+
return context === nodeContexts[0];
|
|
74
|
+
}) ? nodeContexts[0] : 'mixed';
|
|
75
|
+
|
|
76
|
+
/** For block links v1, default to inline links */
|
|
77
|
+
var nodeType = 'inlineCard';
|
|
78
|
+
var _url$split = url.split('/'),
|
|
79
|
+
_url$split2 = _slicedToArray(_url$split, 3),
|
|
80
|
+
domainName = _url$split2[2];
|
|
81
|
+
if (state.smartLinkEvents) {
|
|
82
|
+
state.smartLinkEvents.insertSmartLink(domainName, 'inline', createAnalyticsEvent);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* TODO:
|
|
87
|
+
* What if each request has a different source?
|
|
88
|
+
* Unlikely, but need to define behaviour.
|
|
89
|
+
* Ignore analytics event? take first? provide 'mixed' as well?
|
|
90
|
+
*/
|
|
91
|
+
var inputMethod = requests[0].source;
|
|
92
|
+
var sourceEvent = requests[0].sourceEvent;
|
|
93
|
+
editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent({
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
95
|
+
action: analyticsAction || ACTION.INSERTED,
|
|
96
|
+
actionSubject: ACTION_SUBJECT.DOCUMENT,
|
|
97
|
+
actionSubjectId: ACTION_SUBJECT_ID.SMART_LINK,
|
|
98
|
+
eventType: EVENT_TYPE.TRACK,
|
|
99
|
+
attributes: {
|
|
100
|
+
inputMethod: inputMethod,
|
|
101
|
+
nodeType: nodeType,
|
|
102
|
+
nodeContext: nodeContext,
|
|
103
|
+
fromCurrentDomain: isFromCurrentDomain(url)
|
|
104
|
+
},
|
|
105
|
+
nonPrivacySafeAttributes: {
|
|
106
|
+
domainName: domainName
|
|
107
|
+
}
|
|
108
|
+
})(tr);
|
|
109
|
+
addLinkMetadata(editorState.selection, tr, {
|
|
110
|
+
action: analyticsAction,
|
|
111
|
+
inputMethod: inputMethod,
|
|
112
|
+
cardAction: 'RESOLVE',
|
|
113
|
+
sourceEvent: sourceEvent
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (dispatch) {
|
|
118
|
+
dispatch(resolveCard(url)(closeHistory(tr)));
|
|
119
|
+
}
|
|
120
|
+
return true;
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
export var handleFallbackWithAnalytics = function handleFallbackWithAnalytics(request, editorAnalyticsApi) {
|
|
124
|
+
return function (state, dispatch) {
|
|
125
|
+
var cardState = pluginKey.getState(state);
|
|
126
|
+
if (!cardState) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
var tr = state.tr;
|
|
130
|
+
if (request.source !== INPUT_METHOD.FLOATING_TB) {
|
|
131
|
+
editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent(getLinkCreationAnalyticsEvent(request.source, request.url))(tr);
|
|
132
|
+
}
|
|
133
|
+
addLinkMetadata(state.selection, tr, {
|
|
134
|
+
action: request.analyticsAction,
|
|
135
|
+
inputMethod: request.source
|
|
136
|
+
});
|
|
137
|
+
if (dispatch) {
|
|
138
|
+
dispatch(resolveCard(request.url)(tr));
|
|
139
|
+
}
|
|
140
|
+
return true;
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
export var queueCardsFromChangedTr = function queueCardsFromChangedTr(state, tr, source, analyticsAction) {
|
|
144
|
+
var normalizeLinkText = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
|
|
145
|
+
var sourceEvent = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined;
|
|
146
|
+
var schema = state.schema;
|
|
147
|
+
var link = schema.marks.link;
|
|
148
|
+
var requests = [];
|
|
149
|
+
nodesBetweenChanged(tr, function (node, pos) {
|
|
150
|
+
if (!node.isText) {
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
var linkMark = node.marks.find(function (mark) {
|
|
154
|
+
return mark.type === link;
|
|
155
|
+
});
|
|
156
|
+
if (linkMark) {
|
|
157
|
+
if (!shouldReplaceLink(node, normalizeLinkText)) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
requests.push({
|
|
161
|
+
url: linkMark.attrs.href,
|
|
162
|
+
pos: pos,
|
|
163
|
+
appearance: 'inline',
|
|
164
|
+
compareLinkText: normalizeLinkText,
|
|
165
|
+
source: source,
|
|
166
|
+
analyticsAction: analyticsAction,
|
|
167
|
+
sourceEvent: sourceEvent
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return false;
|
|
171
|
+
});
|
|
172
|
+
if (analyticsAction) {
|
|
173
|
+
addLinkMetadata(state.selection, tr, {
|
|
174
|
+
action: analyticsAction
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return queueCards(requests)(tr);
|
|
178
|
+
};
|
|
179
|
+
export var queueCardFromChangedTr = function queueCardFromChangedTr(state, tr, source, analyticsAction) {
|
|
180
|
+
var normalizeLinkText = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
|
|
181
|
+
var sourceEvent = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined;
|
|
182
|
+
var previousAppearance = arguments.length > 6 ? arguments[6] : undefined;
|
|
183
|
+
var schema = state.schema;
|
|
184
|
+
var link = schema.marks.link;
|
|
185
|
+
var requests = [];
|
|
186
|
+
nodesBetweenChanged(tr, function (node, pos) {
|
|
187
|
+
if (!node.isText) {
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
var linkMark = node.marks.find(function (mark) {
|
|
191
|
+
return mark.type === link;
|
|
192
|
+
});
|
|
193
|
+
if (linkMark) {
|
|
194
|
+
if (!shouldReplaceLink(node, normalizeLinkText)) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
requests.push({
|
|
198
|
+
url: linkMark.attrs.href,
|
|
199
|
+
pos: pos,
|
|
200
|
+
appearance: 'inline',
|
|
201
|
+
previousAppearance: previousAppearance,
|
|
202
|
+
compareLinkText: normalizeLinkText,
|
|
203
|
+
source: source,
|
|
204
|
+
analyticsAction: analyticsAction,
|
|
205
|
+
sourceEvent: sourceEvent
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
return false;
|
|
209
|
+
});
|
|
210
|
+
addLinkMetadata(state.selection, tr, {
|
|
211
|
+
action: analyticsAction
|
|
212
|
+
});
|
|
213
|
+
return queueCards(requests)(tr);
|
|
214
|
+
};
|
|
215
|
+
export var convertHyperlinkToSmartCard = function convertHyperlinkToSmartCard(state, source, appearance) {
|
|
216
|
+
var normalizeLinkText = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
|
|
217
|
+
var schema = state.schema;
|
|
218
|
+
var link = schema.marks.link;
|
|
219
|
+
var requests = [];
|
|
220
|
+
state.tr.doc.nodesBetween(state.selection.from, state.selection.to, function (node, pos) {
|
|
221
|
+
var linkMark = node.marks.find(function (mark) {
|
|
222
|
+
return mark.type === link;
|
|
223
|
+
});
|
|
224
|
+
if (linkMark) {
|
|
225
|
+
requests.push({
|
|
226
|
+
url: linkMark.attrs.href,
|
|
227
|
+
pos: pos,
|
|
228
|
+
appearance: appearance,
|
|
229
|
+
previousAppearance: 'url',
|
|
230
|
+
compareLinkText: normalizeLinkText,
|
|
231
|
+
source: source,
|
|
232
|
+
analyticsAction: ACTION.CHANGED_TYPE,
|
|
233
|
+
shouldReplaceLink: true
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
addLinkMetadata(state.selection, state.tr, {
|
|
238
|
+
action: ACTION.CHANGED_TYPE
|
|
239
|
+
});
|
|
240
|
+
return queueCards(requests)(state.tr);
|
|
241
|
+
};
|
|
242
|
+
export var changeSelectedCardToLink = function changeSelectedCardToLink(text, href, sendAnalytics, node, pos, editorAnalyticsApi) {
|
|
243
|
+
return function (state, dispatch) {
|
|
244
|
+
var tr;
|
|
245
|
+
if (node && pos) {
|
|
246
|
+
tr = cardNodeToLinkWithTransaction(state, text, href, node, pos);
|
|
247
|
+
} else {
|
|
248
|
+
tr = cardToLinkWithTransaction(state, text, href);
|
|
249
|
+
}
|
|
250
|
+
var selectedNode = state.selection instanceof NodeSelection && state.selection.node;
|
|
251
|
+
if (sendAnalytics) {
|
|
252
|
+
if (selectedNode) {
|
|
253
|
+
editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent({
|
|
254
|
+
action: ACTION.CHANGED_TYPE,
|
|
255
|
+
actionSubject: ACTION_SUBJECT.SMART_LINK,
|
|
256
|
+
eventType: EVENT_TYPE.TRACK,
|
|
257
|
+
attributes: {
|
|
258
|
+
newType: SMART_LINK_TYPE.URL,
|
|
259
|
+
previousType: appearanceForNodeType(selectedNode.type)
|
|
260
|
+
}
|
|
261
|
+
})(tr);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (dispatch) {
|
|
265
|
+
dispatch(tr.scrollIntoView());
|
|
266
|
+
}
|
|
267
|
+
return true;
|
|
268
|
+
};
|
|
269
|
+
};
|
|
270
|
+
export var changeSelectedCardToLinkFallback = function changeSelectedCardToLinkFallback(text, href, sendAnalytics, node, pos, editorAnalyticsApi) {
|
|
271
|
+
return function (state, dispatch) {
|
|
272
|
+
var tr;
|
|
273
|
+
if (node && pos) {
|
|
274
|
+
tr = cardNodeToLinkWithTransaction(state, text, href, node, pos);
|
|
275
|
+
} else {
|
|
276
|
+
tr = cardToLinkWithTransaction(state, text, href);
|
|
277
|
+
}
|
|
278
|
+
if (sendAnalytics) {
|
|
279
|
+
editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent({
|
|
280
|
+
action: ACTION.ERRORED,
|
|
281
|
+
actionSubject: ACTION_SUBJECT.SMART_LINK,
|
|
282
|
+
eventType: EVENT_TYPE.OPERATIONAL,
|
|
283
|
+
attributes: {
|
|
284
|
+
error: 'Smart card falling back to link.'
|
|
285
|
+
}
|
|
286
|
+
})(tr);
|
|
287
|
+
}
|
|
288
|
+
if (dispatch) {
|
|
289
|
+
dispatch(tr.scrollIntoView());
|
|
290
|
+
}
|
|
291
|
+
return true;
|
|
292
|
+
};
|
|
293
|
+
};
|
|
294
|
+
export var updateCard = function updateCard(href, sourceEvent) {
|
|
295
|
+
return function (state, dispatch) {
|
|
296
|
+
var selectedNode = state.selection instanceof NodeSelection && state.selection.node;
|
|
297
|
+
if (!selectedNode) {
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
var cardAppearance = selectedCardAppearance(state);
|
|
301
|
+
var tr = cardToLinkWithTransaction(state, href, href);
|
|
302
|
+
queueCardFromChangedTr(state, tr, INPUT_METHOD.MANUAL, ACTION.UPDATED, undefined, sourceEvent, cardAppearance);
|
|
303
|
+
if (dispatch) {
|
|
304
|
+
dispatch(tr.scrollIntoView());
|
|
305
|
+
}
|
|
306
|
+
return true;
|
|
307
|
+
};
|
|
308
|
+
};
|
|
309
|
+
function cardToLinkWithTransaction(state, text, href) {
|
|
310
|
+
var selectedNode = state.selection instanceof NodeSelection && state.selection.node;
|
|
311
|
+
if (!selectedNode) {
|
|
312
|
+
return state.tr;
|
|
313
|
+
}
|
|
314
|
+
var link = state.schema.marks.link;
|
|
315
|
+
var url = selectedNode.attrs.url || selectedNode.attrs.data.url;
|
|
316
|
+
var tr = state.tr.replaceSelectionWith(state.schema.text(text || url, [link.create({
|
|
317
|
+
href: href || url
|
|
318
|
+
})]), false);
|
|
319
|
+
return tr;
|
|
320
|
+
}
|
|
321
|
+
function cardNodeToLinkWithTransaction(state, text, href, node, pos) {
|
|
322
|
+
var link = state.schema.marks.link;
|
|
323
|
+
var url = node.attrs.url || node.attrs.data.url;
|
|
324
|
+
return state.tr.replaceWith(pos, pos + node.nodeSize, state.schema.text(text || url, [link.create({
|
|
325
|
+
href: href || url
|
|
326
|
+
})]));
|
|
327
|
+
}
|
|
328
|
+
export var changeSelectedCardToText = function changeSelectedCardToText(text, editorAnalyticsApi) {
|
|
329
|
+
return function (state, dispatch) {
|
|
330
|
+
var selectedNode = state.selection instanceof NodeSelection && state.selection.node;
|
|
331
|
+
if (!selectedNode) {
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
var tr = state.tr.replaceSelectionWith(state.schema.text(text), false);
|
|
335
|
+
if (dispatch) {
|
|
336
|
+
addLinkMetadata(state.selection, tr, {
|
|
337
|
+
action: ACTION.UNLINK
|
|
338
|
+
});
|
|
339
|
+
tr.scrollIntoView();
|
|
340
|
+
editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent(unlinkPayload(ACTION_SUBJECT_ID.CARD_INLINE))(tr);
|
|
341
|
+
dispatch(tr);
|
|
342
|
+
}
|
|
343
|
+
return true;
|
|
344
|
+
};
|
|
345
|
+
};
|
|
346
|
+
export var setSelectedCardAppearance = function setSelectedCardAppearance(appearance, editorAnalyticsApi) {
|
|
347
|
+
return function (state, dispatch) {
|
|
348
|
+
var _previousNode$type;
|
|
349
|
+
var selectedNode = state.selection instanceof NodeSelection && state.selection.node;
|
|
350
|
+
if (!selectedNode) {
|
|
351
|
+
// When there is no selected node, we insert a new one
|
|
352
|
+
// and replace the existing blue link
|
|
353
|
+
var _tr = convertHyperlinkToSmartCard(state, INPUT_METHOD.FLOATING_TB, appearance);
|
|
354
|
+
if (dispatch) {
|
|
355
|
+
addLinkMetadata(state.selection, _tr, {
|
|
356
|
+
action: ACTION.CHANGED_TYPE
|
|
357
|
+
});
|
|
358
|
+
dispatch(_tr.scrollIntoView());
|
|
359
|
+
}
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
if (appearanceForNodeType(selectedNode.type) === appearance) {
|
|
363
|
+
return false;
|
|
364
|
+
}
|
|
365
|
+
var isEmbed = appearance === 'embed';
|
|
366
|
+
var attrs = isEmbed ? _objectSpread(_objectSpread({}, selectedNode.attrs), {}, {
|
|
367
|
+
layout: 'center'
|
|
368
|
+
}) : selectedNode.attrs;
|
|
369
|
+
var _state$selection = state.selection,
|
|
370
|
+
from = _state$selection.from,
|
|
371
|
+
to = _state$selection.to;
|
|
372
|
+
var nodeType = getLinkNodeType(appearance, state.schema.nodes);
|
|
373
|
+
var tr = state.tr.setNodeMarkup(from, nodeType, attrs, selectedNode.marks);
|
|
374
|
+
|
|
375
|
+
// When the selected card is the last element in the doc we add a new paragraph after it for consistent replacement
|
|
376
|
+
if (tr.doc.nodeSize - 2 === to) {
|
|
377
|
+
tr.insertText(' ', to);
|
|
378
|
+
}
|
|
379
|
+
tr.setSelection(TextSelection.create(tr.doc, to + 1));
|
|
380
|
+
var previousNodePos = from - 1 > 0 ? from - 1 : 0;
|
|
381
|
+
var previousNode = tr.doc.nodeAt(previousNodePos);
|
|
382
|
+
if ((previousNode === null || previousNode === void 0 ? void 0 : (_previousNode$type = previousNode.type) === null || _previousNode$type === void 0 ? void 0 : _previousNode$type.name) === 'paragraph') {
|
|
383
|
+
tr.delete(previousNodePos, from);
|
|
384
|
+
}
|
|
385
|
+
editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent({
|
|
386
|
+
action: ACTION.CHANGED_TYPE,
|
|
387
|
+
actionSubject: ACTION_SUBJECT.SMART_LINK,
|
|
388
|
+
eventType: EVENT_TYPE.TRACK,
|
|
389
|
+
attributes: {
|
|
390
|
+
newType: appearance,
|
|
391
|
+
previousType: appearanceForNodeType(selectedNode.type)
|
|
392
|
+
}
|
|
393
|
+
})(tr);
|
|
394
|
+
addLinkMetadata(state.selection, tr, {
|
|
395
|
+
action: ACTION.CHANGED_TYPE
|
|
396
|
+
});
|
|
397
|
+
if (dispatch) {
|
|
398
|
+
dispatch(tr.scrollIntoView());
|
|
399
|
+
}
|
|
400
|
+
return true;
|
|
401
|
+
};
|
|
402
|
+
};
|
|
403
|
+
var getLinkNodeType = function getLinkNodeType(appearance, linkNodes) {
|
|
404
|
+
switch (appearance) {
|
|
405
|
+
case 'inline':
|
|
406
|
+
return linkNodes.inlineCard;
|
|
407
|
+
case 'block':
|
|
408
|
+
return linkNodes.blockCard;
|
|
409
|
+
case 'embed':
|
|
410
|
+
return linkNodes.embedCard;
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
|
|
414
|
+
// Apply an update to a datasource (aka blockCard) node
|
|
415
|
+
export var updateExistingDatasource = function updateExistingDatasource(state, node, newAdf, view) {
|
|
416
|
+
var tr = state.tr,
|
|
417
|
+
from = state.selection.from,
|
|
418
|
+
schemaNodes = state.schema.nodes;
|
|
419
|
+
|
|
420
|
+
// datasource to datasource
|
|
421
|
+
if (newAdf.type === 'blockCard' && newAdf.attrs.datasource && node.attrs.datasource) {
|
|
422
|
+
var _ref3, _ref6, _newViews$properties, _oldViews$properties, _newAdf$attrs, _node$attrs;
|
|
423
|
+
var _ref = (_ref3 = newAdf.attrs.datasource.views) !== null && _ref3 !== void 0 ? _ref3 : [],
|
|
424
|
+
_ref2 = _slicedToArray(_ref, 1),
|
|
425
|
+
newViews = _ref2[0];
|
|
426
|
+
var _ref4 = (_ref6 = node.attrs.datasource.views) !== null && _ref6 !== void 0 ? _ref6 : [],
|
|
427
|
+
_ref5 = _slicedToArray(_ref4, 1),
|
|
428
|
+
oldViews = _ref5[0];
|
|
429
|
+
var newColumnKeys = newViews === null || newViews === void 0 ? void 0 : (_newViews$properties = newViews.properties) === null || _newViews$properties === void 0 ? void 0 : _newViews$properties.columns.map(function (column) {
|
|
430
|
+
return column.key;
|
|
431
|
+
});
|
|
432
|
+
var oldColumnKeys = oldViews === null || oldViews === void 0 ? void 0 : (_oldViews$properties = oldViews.properties) === null || _oldViews$properties === void 0 ? void 0 : _oldViews$properties.columns.map(function (column) {
|
|
433
|
+
return column.key;
|
|
434
|
+
});
|
|
435
|
+
var isColumnChange = !isEqual(oldColumnKeys, newColumnKeys);
|
|
436
|
+
var isUrlChange = ((_newAdf$attrs = newAdf.attrs) === null || _newAdf$attrs === void 0 ? void 0 : _newAdf$attrs.url) !== ((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.url);
|
|
437
|
+
if (isColumnChange || isUrlChange) {
|
|
438
|
+
tr.setNodeMarkup(from, schemaNodes.blockCard, _objectSpread(_objectSpread({}, node.attrs), newAdf.attrs));
|
|
439
|
+
}
|
|
440
|
+
} else if (newAdf.type === 'inlineCard') {
|
|
441
|
+
// datasource to inline
|
|
442
|
+
tr.setNodeMarkup(from, schemaNodes.inlineCard, newAdf.attrs);
|
|
443
|
+
}
|
|
444
|
+
hideDatasourceModal(tr);
|
|
445
|
+
view.dispatch(tr.scrollIntoView());
|
|
446
|
+
};
|
|
447
|
+
export var insertDatasource = function insertDatasource(state, adf, view) {
|
|
448
|
+
var tr = state.tr,
|
|
449
|
+
from = state.selection.from,
|
|
450
|
+
schemaNodes = state.schema.nodes;
|
|
451
|
+
var attrs = adf.attrs,
|
|
452
|
+
type = adf.type;
|
|
453
|
+
var schemaNode = type === 'inlineCard' ? schemaNodes.inlineCard : schemaNodes.blockCard;
|
|
454
|
+
var newNode = schemaNode.createChecked(attrs);
|
|
455
|
+
// in future, if we decide to do datasource insertion from the main toolbar, we should probably consider editor-plugin-content-insertion instead of tr.insert
|
|
456
|
+
// this will allow us to deal with insertions from multiple paths in a more consistent way
|
|
457
|
+
newNode && tr.insert(from, newNode);
|
|
458
|
+
hideDatasourceModal(tr);
|
|
459
|
+
view.dispatch(tr.scrollIntoView());
|
|
460
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { keymap } from 'prosemirror-keymap';
|
|
2
|
+
import { NodeSelection } from 'prosemirror-state';
|
|
3
|
+
import { findChildren, flatten } from 'prosemirror-utils';
|
|
4
|
+
import { bindKeymapWithCommand, moveDown, moveUp } from '@atlaskit/editor-common/keymaps';
|
|
5
|
+
import { browser } from '@atlaskit/editor-common/utils';
|
|
6
|
+
var lookupPixel = 10;
|
|
7
|
+
var getClosestInlineCardPos = function getClosestInlineCardPos(state, editorView, direction) {
|
|
8
|
+
var _editorView$posAtCoor;
|
|
9
|
+
var selection = state.selection;
|
|
10
|
+
var parent = selection.$from.parent;
|
|
11
|
+
var inlineCardType = state.schema.nodes.inlineCard;
|
|
12
|
+
if (!flatten(parent, false).some(function (_ref) {
|
|
13
|
+
var node = _ref.node;
|
|
14
|
+
return node.type === inlineCardType;
|
|
15
|
+
})) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
var coord = editorView.coordsAtPos(selection.$anchor.pos);
|
|
19
|
+
var nearPos = (_editorView$posAtCoor = editorView.posAtCoords({
|
|
20
|
+
left: coord.left,
|
|
21
|
+
top: direction === 'up' ? coord.top - lookupPixel : coord.bottom + lookupPixel
|
|
22
|
+
})) === null || _editorView$posAtCoor === void 0 ? void 0 : _editorView$posAtCoor.pos;
|
|
23
|
+
if (nearPos) {
|
|
24
|
+
var newNode = state.doc.nodeAt(nearPos);
|
|
25
|
+
if (newNode) {
|
|
26
|
+
if (newNode.type !== inlineCardType || findChildren(parent, function (node) {
|
|
27
|
+
return node === newNode;
|
|
28
|
+
}, false).length === 0 || newNode === selection.node) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return nearPos;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
};
|
|
36
|
+
var selectAboveBelowInlineCard = function selectAboveBelowInlineCard(direction) {
|
|
37
|
+
return function (state, dispatch, editorView) {
|
|
38
|
+
if (!editorView || !dispatch) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
var pos = getClosestInlineCardPos(state, editorView, direction);
|
|
42
|
+
if (pos) {
|
|
43
|
+
dispatch(state.tr.setSelection(new NodeSelection(state.doc.resolve(pos))));
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
export function cardKeymap(featureFlags) {
|
|
50
|
+
var list = {};
|
|
51
|
+
|
|
52
|
+
// https://bugs.chromium.org/p/chromium/issues/detail?id=1227468 introduced since Chrome 91
|
|
53
|
+
if (browser.chrome && browser.chrome_version > 90 && featureFlags.chromeCursorHandlerFixedVersion && browser.chrome_version < featureFlags.chromeCursorHandlerFixedVersion) {
|
|
54
|
+
bindKeymapWithCommand(moveUp.common, selectAboveBelowInlineCard('up'), list);
|
|
55
|
+
bindKeymapWithCommand(moveDown.common, selectAboveBelowInlineCard('down'), list);
|
|
56
|
+
}
|
|
57
|
+
return keymap(list);
|
|
58
|
+
}
|