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