@atlaskit/editor-plugin-hyperlink 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +6 -0
- package/CHANGELOG.md +1 -0
- package/LICENSE.md +13 -0
- package/README.md +7 -0
- package/dist/cjs/Toolbar.js +280 -0
- package/dist/cjs/commands.js +242 -0
- package/dist/cjs/index.js +12 -0
- package/dist/cjs/plugin.js +122 -0
- package/dist/cjs/pm-plugins/fake-curor-for-toolbar-plugin-key.js +9 -0
- package/dist/cjs/pm-plugins/fake-cursor-for-toolbar.js +68 -0
- package/dist/cjs/pm-plugins/input-rule.js +95 -0
- package/dist/cjs/pm-plugins/keymap.js +75 -0
- package/dist/cjs/pm-plugins/main.js +257 -0
- package/dist/cjs/pm-plugins/toolbar-buttons.js +43 -0
- package/dist/cjs/version.json +5 -0
- package/dist/es2019/Toolbar.js +260 -0
- package/dist/es2019/commands.js +225 -0
- package/dist/es2019/index.js +1 -0
- package/dist/es2019/plugin.js +106 -0
- package/dist/es2019/pm-plugins/fake-curor-for-toolbar-plugin-key.js +2 -0
- package/dist/es2019/pm-plugins/fake-cursor-for-toolbar.js +63 -0
- package/dist/es2019/pm-plugins/input-rule.js +80 -0
- package/dist/es2019/pm-plugins/keymap.js +65 -0
- package/dist/es2019/pm-plugins/main.js +261 -0
- package/dist/es2019/pm-plugins/toolbar-buttons.js +39 -0
- package/dist/es2019/version.json +5 -0
- package/dist/esm/Toolbar.js +271 -0
- package/dist/esm/commands.js +222 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/plugin.js +114 -0
- package/dist/esm/pm-plugins/fake-curor-for-toolbar-plugin-key.js +2 -0
- package/dist/esm/pm-plugins/fake-cursor-for-toolbar.js +61 -0
- package/dist/esm/pm-plugins/input-rule.js +85 -0
- package/dist/esm/pm-plugins/keymap.js +67 -0
- package/dist/esm/pm-plugins/main.js +248 -0
- package/dist/esm/pm-plugins/toolbar-buttons.js +34 -0
- package/dist/esm/version.json +5 -0
- package/dist/types/Toolbar.d.ts +8 -0
- package/dist/types/commands.d.ts +20 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/plugin.d.ts +38 -0
- package/dist/types/pm-plugins/fake-curor-for-toolbar-plugin-key.d.ts +2 -0
- package/dist/types/pm-plugins/fake-cursor-for-toolbar.d.ts +3 -0
- package/dist/types/pm-plugins/input-rule.d.ts +8 -0
- package/dist/types/pm-plugins/keymap.d.ts +4 -0
- package/dist/types/pm-plugins/main.d.ts +7 -0
- package/dist/types/pm-plugins/toolbar-buttons.d.ts +21 -0
- package/dist/types-ts4.5/Toolbar.d.ts +8 -0
- package/dist/types-ts4.5/commands.d.ts +20 -0
- package/dist/types-ts4.5/index.d.ts +3 -0
- package/dist/types-ts4.5/plugin.d.ts +38 -0
- package/dist/types-ts4.5/pm-plugins/fake-curor-for-toolbar-plugin-key.d.ts +2 -0
- package/dist/types-ts4.5/pm-plugins/fake-cursor-for-toolbar.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/input-rule.d.ts +8 -0
- package/dist/types-ts4.5/pm-plugins/keymap.d.ts +4 -0
- package/dist/types-ts4.5/pm-plugins/main.d.ts +7 -0
- package/dist/types-ts4.5/pm-plugins/toolbar-buttons.d.ts +21 -0
- package/package.json +107 -0
- package/tmp/api-report-tmp.d.ts +68 -0
package/.eslintrc.js
ADDED
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# @atlaskit/editor-plugin-hyperlink
|
package/LICENSE.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright 2023 Atlassian Pty Ltd
|
|
2
|
+
|
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License.
|
|
5
|
+
You may obtain a copy of the License at
|
|
6
|
+
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
See the License for the specific language governing permissions and
|
|
13
|
+
limitations under the License.
|
package/README.md
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.HyperlinkAddToolbarWithState = HyperlinkAddToolbarWithState;
|
|
8
|
+
exports.getToolbarConfig = void 0;
|
|
9
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
var _react = _interopRequireDefault(require("react"));
|
|
12
|
+
var _adfSchema = require("@atlaskit/adf-schema");
|
|
13
|
+
var _analytics = require("@atlaskit/editor-common/analytics");
|
|
14
|
+
var _card = require("@atlaskit/editor-common/card");
|
|
15
|
+
var _hooks = require("@atlaskit/editor-common/hooks");
|
|
16
|
+
var _link2 = require("@atlaskit/editor-common/link");
|
|
17
|
+
var _messages = require("@atlaskit/editor-common/messages");
|
|
18
|
+
var _ui = require("@atlaskit/editor-common/ui");
|
|
19
|
+
var _utils = require("@atlaskit/editor-common/utils");
|
|
20
|
+
var _settings = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/settings"));
|
|
21
|
+
var _unlink = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/unlink"));
|
|
22
|
+
var _shortcut = _interopRequireDefault(require("@atlaskit/icon/glyph/shortcut"));
|
|
23
|
+
var _commands = require("./commands");
|
|
24
|
+
var _main = require("./pm-plugins/main");
|
|
25
|
+
var _toolbarButtons = require("./pm-plugins/toolbar-buttons");
|
|
26
|
+
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; }
|
|
27
|
+
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; }
|
|
28
|
+
/* type guard for edit links */
|
|
29
|
+
function isEditLink(linkMark) {
|
|
30
|
+
return linkMark.pos !== undefined;
|
|
31
|
+
}
|
|
32
|
+
var dispatchAnalytics = function dispatchAnalytics(dispatch, state, analyticsBuilder, editorAnalyticsApi) {
|
|
33
|
+
if (dispatch) {
|
|
34
|
+
var tr = state.tr;
|
|
35
|
+
editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent(analyticsBuilder(_analytics.ACTION_SUBJECT_ID.HYPERLINK))(tr);
|
|
36
|
+
dispatch(tr);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
var visitHyperlink = function visitHyperlink(editorAnalyticsApi) {
|
|
40
|
+
return function (state, dispatch) {
|
|
41
|
+
dispatchAnalytics(dispatch, state, _analytics.buildVisitedLinkPayload, editorAnalyticsApi);
|
|
42
|
+
return true;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
var openLinkSettings = function openLinkSettings(editorAnalyticsApi) {
|
|
46
|
+
return function (state, dispatch) {
|
|
47
|
+
dispatchAnalytics(dispatch, state, _analytics.buildOpenedSettingsPayload, editorAnalyticsApi);
|
|
48
|
+
return true;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
function getLinkText(activeLinkMark, state) {
|
|
52
|
+
if (!activeLinkMark.node) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
var textToUrl = (0, _utils.normalizeUrl)(activeLinkMark.node.text);
|
|
56
|
+
var linkMark = activeLinkMark.node.marks.find(function (mark) {
|
|
57
|
+
return mark.type === state.schema.marks.link;
|
|
58
|
+
});
|
|
59
|
+
var linkHref = linkMark && linkMark.attrs.href;
|
|
60
|
+
if (textToUrl === linkHref) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
return activeLinkMark.node.text;
|
|
64
|
+
}
|
|
65
|
+
function HyperlinkAddToolbarWithState(_ref) {
|
|
66
|
+
var _ref$linkPickerOption = _ref.linkPickerOptions,
|
|
67
|
+
linkPickerOptions = _ref$linkPickerOption === void 0 ? {} : _ref$linkPickerOption,
|
|
68
|
+
onSubmit = _ref.onSubmit,
|
|
69
|
+
displayText = _ref.displayText,
|
|
70
|
+
displayUrl = _ref.displayUrl,
|
|
71
|
+
providerFactory = _ref.providerFactory,
|
|
72
|
+
view = _ref.view,
|
|
73
|
+
onCancel = _ref.onCancel,
|
|
74
|
+
invokeMethod = _ref.invokeMethod,
|
|
75
|
+
featureFlags = _ref.featureFlags,
|
|
76
|
+
onClose = _ref.onClose,
|
|
77
|
+
onEscapeCallback = _ref.onEscapeCallback,
|
|
78
|
+
onClickAwayCallback = _ref.onClickAwayCallback,
|
|
79
|
+
pluginInjectionApi = _ref.pluginInjectionApi;
|
|
80
|
+
var _useSharedPluginState = (0, _hooks.useSharedPluginState)(pluginInjectionApi, ['hyperlink']),
|
|
81
|
+
hyperlinkState = _useSharedPluginState.hyperlinkState;
|
|
82
|
+
return /*#__PURE__*/_react.default.createElement(_link2.HyperlinkAddToolbar, {
|
|
83
|
+
linkPickerOptions: linkPickerOptions,
|
|
84
|
+
onSubmit: onSubmit,
|
|
85
|
+
displayText: displayText,
|
|
86
|
+
displayUrl: displayUrl,
|
|
87
|
+
providerFactory: providerFactory,
|
|
88
|
+
view: view,
|
|
89
|
+
onCancel: onCancel,
|
|
90
|
+
invokeMethod: invokeMethod,
|
|
91
|
+
featureFlags: featureFlags,
|
|
92
|
+
onClose: onClose,
|
|
93
|
+
onEscapeCallback: onEscapeCallback,
|
|
94
|
+
onClickAwayCallback: onClickAwayCallback,
|
|
95
|
+
hyperlinkPluginState: hyperlinkState
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
var getSettingsButtonGroup = function getSettingsButtonGroup(state, intl, featureFlags, editorAnalyticsApi) {
|
|
99
|
+
var floatingToolbarLinkSettingsButton = featureFlags.floatingToolbarLinkSettingsButton;
|
|
100
|
+
return floatingToolbarLinkSettingsButton === 'true' ? [{
|
|
101
|
+
type: 'separator'
|
|
102
|
+
}, {
|
|
103
|
+
id: 'editor.link.settings',
|
|
104
|
+
type: 'button',
|
|
105
|
+
icon: _settings.default,
|
|
106
|
+
title: intl.formatMessage(_messages.linkToolbarMessages.settingsLink),
|
|
107
|
+
onClick: openLinkSettings(editorAnalyticsApi),
|
|
108
|
+
href: 'https://id.atlassian.com/manage-profile/link-preferences',
|
|
109
|
+
target: '_blank'
|
|
110
|
+
}] : [];
|
|
111
|
+
};
|
|
112
|
+
var getToolbarConfig = function getToolbarConfig(options, featureFlags, pluginInjectionApi) {
|
|
113
|
+
return function (state, intl, providerFactory) {
|
|
114
|
+
var _pluginInjectionApi$d;
|
|
115
|
+
var formatMessage = intl.formatMessage;
|
|
116
|
+
var linkState = _main.stateKey.getState(state);
|
|
117
|
+
var editorAnalyticsApi = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : (_pluginInjectionApi$d = pluginInjectionApi.dependencies.analytics) === null || _pluginInjectionApi$d === void 0 ? void 0 : _pluginInjectionApi$d.actions;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Enable focus trap only if feature flag is enabled AND for the new version of the picker
|
|
121
|
+
*/
|
|
122
|
+
var lpLinkPicker = featureFlags.lpLinkPicker,
|
|
123
|
+
lpLinkPickerFocusTrap = featureFlags.lpLinkPickerFocusTrap,
|
|
124
|
+
preventPopupOverflow = featureFlags.preventPopupOverflow;
|
|
125
|
+
var shouldEnableFocusTrap = Boolean(lpLinkPicker && lpLinkPickerFocusTrap);
|
|
126
|
+
if (linkState && linkState.activeLinkMark) {
|
|
127
|
+
var activeLinkMark = linkState.activeLinkMark;
|
|
128
|
+
var hyperLinkToolbar = {
|
|
129
|
+
title: 'Hyperlink floating controls',
|
|
130
|
+
nodeType: [state.schema.nodes.text, state.schema.nodes.paragraph, state.schema.nodes.heading, state.schema.nodes.taskItem, state.schema.nodes.decisionItem, state.schema.nodes.caption].filter(function (nodeType) {
|
|
131
|
+
return !!nodeType;
|
|
132
|
+
}),
|
|
133
|
+
// Use only the node types existing in the schema ED-6745
|
|
134
|
+
align: 'left',
|
|
135
|
+
className: activeLinkMark.type.match('INSERT|EDIT_INSERTED') ? 'hyperlink-floating-toolbar' : ''
|
|
136
|
+
};
|
|
137
|
+
switch (activeLinkMark.type) {
|
|
138
|
+
case 'EDIT':
|
|
139
|
+
{
|
|
140
|
+
var _toolbarKey$getState$, _toolbarKey$getState;
|
|
141
|
+
var pos = activeLinkMark.pos,
|
|
142
|
+
node = activeLinkMark.node;
|
|
143
|
+
var linkMark = node.marks.filter(function (mark) {
|
|
144
|
+
return mark.type === state.schema.marks.link;
|
|
145
|
+
});
|
|
146
|
+
var link = linkMark[0] && linkMark[0].attrs.href;
|
|
147
|
+
var isValidUrl = (0, _adfSchema.isSafeUrl)(link);
|
|
148
|
+
var labelOpenLink = formatMessage(isValidUrl ? _messages.linkMessages.openLink : _messages.linkToolbarMessages.unableToOpenLink);
|
|
149
|
+
// TODO: ED-14403 investigate why these are not translating?
|
|
150
|
+
var labelUnlink = formatMessage(_messages.linkToolbarMessages.unlink);
|
|
151
|
+
var editLink = formatMessage(_messages.linkToolbarMessages.editLink);
|
|
152
|
+
var metadata = {
|
|
153
|
+
url: link,
|
|
154
|
+
title: ''
|
|
155
|
+
};
|
|
156
|
+
if (activeLinkMark.node.text) {
|
|
157
|
+
metadata.title = activeLinkMark.node.text;
|
|
158
|
+
}
|
|
159
|
+
return _objectSpread(_objectSpread({}, hyperLinkToolbar), {}, {
|
|
160
|
+
height: 32,
|
|
161
|
+
width: 250,
|
|
162
|
+
items: [].concat((0, _toConsumableArray2.default)((_toolbarKey$getState$ = (_toolbarKey$getState = _toolbarButtons.toolbarKey.getState(state)) === null || _toolbarKey$getState === void 0 ? void 0 : _toolbarKey$getState.items(state, intl, providerFactory, link)) !== null && _toolbarKey$getState$ !== void 0 ? _toolbarKey$getState$ : []), [{
|
|
163
|
+
id: 'editor.link.edit',
|
|
164
|
+
type: 'button',
|
|
165
|
+
onClick: (0, _commands.editInsertedLink)(editorAnalyticsApi),
|
|
166
|
+
selected: false,
|
|
167
|
+
title: editLink,
|
|
168
|
+
showTitle: true,
|
|
169
|
+
metadata: metadata
|
|
170
|
+
}, {
|
|
171
|
+
type: 'separator'
|
|
172
|
+
}, {
|
|
173
|
+
id: 'editor.link.openLink',
|
|
174
|
+
type: 'button',
|
|
175
|
+
disabled: !isValidUrl,
|
|
176
|
+
target: '_blank',
|
|
177
|
+
href: isValidUrl ? link : undefined,
|
|
178
|
+
onClick: visitHyperlink(editorAnalyticsApi),
|
|
179
|
+
selected: false,
|
|
180
|
+
title: labelOpenLink,
|
|
181
|
+
icon: _shortcut.default,
|
|
182
|
+
className: 'hyperlink-open-link',
|
|
183
|
+
metadata: metadata,
|
|
184
|
+
tabIndex: null
|
|
185
|
+
}, {
|
|
186
|
+
type: 'separator'
|
|
187
|
+
}, {
|
|
188
|
+
id: 'editor.link.unlink',
|
|
189
|
+
type: 'button',
|
|
190
|
+
onClick: (0, _card.commandWithMetadata)((0, _commands.removeLink)(pos, editorAnalyticsApi), {
|
|
191
|
+
inputMethod: _analytics.INPUT_METHOD.FLOATING_TB
|
|
192
|
+
}),
|
|
193
|
+
selected: false,
|
|
194
|
+
title: labelUnlink,
|
|
195
|
+
icon: _unlink.default,
|
|
196
|
+
tabIndex: null
|
|
197
|
+
}, {
|
|
198
|
+
type: 'copy-button',
|
|
199
|
+
items: [{
|
|
200
|
+
type: 'separator'
|
|
201
|
+
}, {
|
|
202
|
+
state: state,
|
|
203
|
+
formatMessage: formatMessage,
|
|
204
|
+
markType: state.schema.marks.link
|
|
205
|
+
}]
|
|
206
|
+
}], (0, _toConsumableArray2.default)(getSettingsButtonGroup(state, intl, featureFlags, editorAnalyticsApi))),
|
|
207
|
+
scrollable: true
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
case 'EDIT_INSERTED':
|
|
211
|
+
case 'INSERT':
|
|
212
|
+
{
|
|
213
|
+
var _link;
|
|
214
|
+
if (isEditLink(activeLinkMark) && activeLinkMark.node) {
|
|
215
|
+
var _linkMark = activeLinkMark.node.marks.filter(function (mark) {
|
|
216
|
+
return mark.type === state.schema.marks.link;
|
|
217
|
+
});
|
|
218
|
+
_link = _linkMark[0] && _linkMark[0].attrs.href;
|
|
219
|
+
}
|
|
220
|
+
var displayText = isEditLink(activeLinkMark) ? getLinkText(activeLinkMark, state) : linkState.activeText;
|
|
221
|
+
var popupHeight = lpLinkPicker ? _ui.LINKPICKER_HEIGHT_IN_PX : _ui.RECENT_SEARCH_HEIGHT_IN_PX;
|
|
222
|
+
return _objectSpread(_objectSpread({}, hyperLinkToolbar), {}, {
|
|
223
|
+
preventPopupOverflow: preventPopupOverflow,
|
|
224
|
+
height: popupHeight,
|
|
225
|
+
width: _ui.RECENT_SEARCH_WIDTH_IN_PX,
|
|
226
|
+
focusTrap: shouldEnableFocusTrap,
|
|
227
|
+
items: [{
|
|
228
|
+
type: 'custom',
|
|
229
|
+
fallback: [],
|
|
230
|
+
disableArrowNavigation: true,
|
|
231
|
+
render: function render(view, idx) {
|
|
232
|
+
if (!view) {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
return /*#__PURE__*/_react.default.createElement(HyperlinkAddToolbarWithState, {
|
|
236
|
+
pluginInjectionApi: pluginInjectionApi,
|
|
237
|
+
view: view,
|
|
238
|
+
key: idx,
|
|
239
|
+
linkPickerOptions: options === null || options === void 0 ? void 0 : options.linkPicker,
|
|
240
|
+
featureFlags: featureFlags,
|
|
241
|
+
displayUrl: _link,
|
|
242
|
+
displayText: displayText || '',
|
|
243
|
+
providerFactory: providerFactory,
|
|
244
|
+
onCancel: function onCancel() {
|
|
245
|
+
return view.focus();
|
|
246
|
+
},
|
|
247
|
+
onClose: lpLinkPickerFocusTrap ? function () {
|
|
248
|
+
return view.focus();
|
|
249
|
+
} : undefined,
|
|
250
|
+
onEscapeCallback: _commands.onEscapeCallback,
|
|
251
|
+
onClickAwayCallback: _commands.onClickAwayCallback,
|
|
252
|
+
onSubmit: function onSubmit(href) {
|
|
253
|
+
var _options$cardOptions;
|
|
254
|
+
var title = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
255
|
+
var displayText = arguments.length > 2 ? arguments[2] : undefined;
|
|
256
|
+
var inputMethod = arguments.length > 3 ? arguments[3] : undefined;
|
|
257
|
+
var analytic = arguments.length > 4 ? arguments[4] : undefined;
|
|
258
|
+
var isEdit = isEditLink(activeLinkMark);
|
|
259
|
+
var action = isEdit ? _analytics.ACTION.UPDATED : _analytics.ACTION.INSERTED;
|
|
260
|
+
var command = isEdit ? (0, _card.commandWithMetadata)((0, _commands.updateLink)(href, displayText || title, activeLinkMark.pos), {
|
|
261
|
+
action: action,
|
|
262
|
+
inputMethod: inputMethod,
|
|
263
|
+
sourceEvent: analytic
|
|
264
|
+
}) : (0, _commands.insertLinkWithAnalytics)(inputMethod, activeLinkMark.from, activeLinkMark.to, href, editorAnalyticsApi, title, displayText, !!(options !== null && options !== void 0 && (_options$cardOptions = options.cardOptions) !== null && _options$cardOptions !== void 0 && _options$cardOptions.provider), analytic);
|
|
265
|
+
command(view.state, view.dispatch, view);
|
|
266
|
+
if (!lpLinkPickerFocusTrap) {
|
|
267
|
+
view.focus();
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
}]
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return;
|
|
278
|
+
};
|
|
279
|
+
};
|
|
280
|
+
exports.getToolbarConfig = getToolbarConfig;
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.editInsertedLink = editInsertedLink;
|
|
8
|
+
exports.hideLinkToolbar = hideLinkToolbar;
|
|
9
|
+
exports.hideLinkToolbarSetMeta = void 0;
|
|
10
|
+
exports.insertLink = insertLink;
|
|
11
|
+
exports.onEscapeCallback = exports.onClickAwayCallback = exports.insertLinkWithAnalyticsMobileNative = exports.insertLinkWithAnalytics = void 0;
|
|
12
|
+
exports.removeLink = removeLink;
|
|
13
|
+
exports.setLinkHref = setLinkHref;
|
|
14
|
+
exports.showLinkToolbar = showLinkToolbar;
|
|
15
|
+
exports.updateLink = updateLink;
|
|
16
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
+
var _prosemirrorState = require("prosemirror-state");
|
|
18
|
+
var _analytics = require("@atlaskit/editor-common/analytics");
|
|
19
|
+
var _card = require("@atlaskit/editor-common/card");
|
|
20
|
+
var _editorAnalytics = require("@atlaskit/editor-common/editor-analytics");
|
|
21
|
+
var _link = require("@atlaskit/editor-common/link");
|
|
22
|
+
var _utils = require("@atlaskit/editor-common/utils");
|
|
23
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
24
|
+
var _main = require("./pm-plugins/main");
|
|
25
|
+
var _toolbarButtons = require("./pm-plugins/toolbar-buttons");
|
|
26
|
+
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; }
|
|
27
|
+
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; }
|
|
28
|
+
function setLinkHref(href, pos, editorAnalyticsApi, to, isTabPressed) {
|
|
29
|
+
return (0, _utils.filterCommands)((0, _link.isTextAtPos)(pos), function (state, dispatch) {
|
|
30
|
+
var $pos = state.doc.resolve(pos);
|
|
31
|
+
var node = state.doc.nodeAt(pos);
|
|
32
|
+
var linkMark = state.schema.marks.link;
|
|
33
|
+
var mark = linkMark.isInSet(node.marks);
|
|
34
|
+
var url = (0, _utils.normalizeUrl)(href);
|
|
35
|
+
if (mark && mark.attrs.href === url) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
var rightBound = to && pos !== to ? to : pos - $pos.textOffset + node.nodeSize;
|
|
39
|
+
var tr = state.tr.removeMark(pos, rightBound, linkMark);
|
|
40
|
+
if (href.trim()) {
|
|
41
|
+
tr.addMark(pos, rightBound, linkMark.create(_objectSpread(_objectSpread({}, mark && mark.attrs || {}), {}, {
|
|
42
|
+
href: url
|
|
43
|
+
})));
|
|
44
|
+
} else {
|
|
45
|
+
editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent((0, _analytics.unlinkPayload)(_analytics.ACTION_SUBJECT_ID.HYPERLINK))(tr);
|
|
46
|
+
}
|
|
47
|
+
if (!isTabPressed) {
|
|
48
|
+
tr.setMeta(_main.stateKey, {
|
|
49
|
+
type: _link.LinkAction.HIDE_TOOLBAR
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (dispatch) {
|
|
53
|
+
dispatch(tr);
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function updateLink(href, text, pos, to) {
|
|
59
|
+
return function (state, dispatch) {
|
|
60
|
+
var $pos = state.doc.resolve(pos);
|
|
61
|
+
var node = state.doc.nodeAt(pos);
|
|
62
|
+
if (!node) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
var url = (0, _utils.normalizeUrl)(href);
|
|
66
|
+
var mark = state.schema.marks.link.isInSet(node.marks);
|
|
67
|
+
var linkMark = state.schema.marks.link;
|
|
68
|
+
var rightBound = to && pos !== to ? to : pos - $pos.textOffset + node.nodeSize;
|
|
69
|
+
var tr = state.tr;
|
|
70
|
+
if (!url && text) {
|
|
71
|
+
tr.removeMark(pos, rightBound, linkMark);
|
|
72
|
+
tr.insertText(text, pos, rightBound);
|
|
73
|
+
} else if (!url) {
|
|
74
|
+
return false;
|
|
75
|
+
} else {
|
|
76
|
+
tr.insertText(text, pos, rightBound);
|
|
77
|
+
// Casting to LinkAttributes to prevent wrong attributes been passed (Example ED-7951)
|
|
78
|
+
var linkAttrs = _objectSpread(_objectSpread({}, mark && mark.attrs || {}), {}, {
|
|
79
|
+
href: url
|
|
80
|
+
});
|
|
81
|
+
tr.addMark(pos, pos + text.length, linkMark.create(linkAttrs));
|
|
82
|
+
tr.setMeta(_main.stateKey, {
|
|
83
|
+
type: _link.LinkAction.HIDE_TOOLBAR
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (dispatch) {
|
|
87
|
+
dispatch(tr);
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function insertLink(from, to, incomingHref, incomingTitle, displayText, source, sourceEvent) {
|
|
93
|
+
return function (state, dispatch) {
|
|
94
|
+
var link = state.schema.marks.link;
|
|
95
|
+
var tr = state.tr;
|
|
96
|
+
if (incomingHref.trim()) {
|
|
97
|
+
var _stateKey$getState;
|
|
98
|
+
var normalizedUrl = (0, _utils.normalizeUrl)(incomingHref);
|
|
99
|
+
// NB: in this context, `currentText` represents text which has been
|
|
100
|
+
// highlighted in the Editor, upon which a link is is being added.
|
|
101
|
+
var currentText = (_stateKey$getState = _main.stateKey.getState(state)) === null || _stateKey$getState === void 0 ? void 0 : _stateKey$getState.activeText;
|
|
102
|
+
var markEnd = to;
|
|
103
|
+
var text = displayText || incomingTitle || incomingHref;
|
|
104
|
+
if (!displayText || displayText !== currentText) {
|
|
105
|
+
tr.insertText(text, from, to);
|
|
106
|
+
if (!(0, _link.isTextAtPos)(from)(state)) {
|
|
107
|
+
markEnd = from + text.length + 1;
|
|
108
|
+
} else {
|
|
109
|
+
markEnd = from + text.length;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
tr.addMark(from, markEnd, link.create({
|
|
113
|
+
href: normalizedUrl
|
|
114
|
+
}));
|
|
115
|
+
tr.setSelection(_prosemirrorState.Selection.near(tr.doc.resolve(markEnd)));
|
|
116
|
+
if (!displayText || displayText === incomingHref) {
|
|
117
|
+
var _toolbarKey$getState;
|
|
118
|
+
var queueCardsFromChangedTr = (_toolbarKey$getState = _toolbarButtons.toolbarKey.getState(state)) === null || _toolbarKey$getState === void 0 ? void 0 : _toolbarKey$getState.onInsertLinkCallback;
|
|
119
|
+
if (queueCardsFromChangedTr) {
|
|
120
|
+
queueCardsFromChangedTr === null || queueCardsFromChangedTr === void 0 ? void 0 : queueCardsFromChangedTr(state, tr, source, _analytics.ACTION.INSERTED, false, sourceEvent);
|
|
121
|
+
} else {
|
|
122
|
+
(0, _card.addLinkMetadata)(state.selection, tr, {
|
|
123
|
+
action: _analytics.ACTION.INSERTED,
|
|
124
|
+
inputMethod: source,
|
|
125
|
+
sourceEvent: sourceEvent
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
} else if ((0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.editor.fix-link-insert-analytics')) {
|
|
129
|
+
/**
|
|
130
|
+
* Add link metadata because queue cards would have otherwise handled this for us
|
|
131
|
+
*/
|
|
132
|
+
(0, _card.addLinkMetadata)(state.selection, tr, {
|
|
133
|
+
action: _analytics.ACTION.INSERTED,
|
|
134
|
+
inputMethod: source,
|
|
135
|
+
sourceEvent: sourceEvent
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
tr.setMeta(_main.stateKey, {
|
|
139
|
+
type: _link.LinkAction.HIDE_TOOLBAR
|
|
140
|
+
});
|
|
141
|
+
if (dispatch) {
|
|
142
|
+
dispatch(tr);
|
|
143
|
+
}
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
tr.setMeta(_main.stateKey, {
|
|
147
|
+
type: _link.LinkAction.HIDE_TOOLBAR
|
|
148
|
+
});
|
|
149
|
+
if (dispatch) {
|
|
150
|
+
dispatch(tr);
|
|
151
|
+
}
|
|
152
|
+
return false;
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
var insertLinkWithAnalytics = function insertLinkWithAnalytics(inputMethod, from, to, href, editorAnalyticsApi, title, displayText) {
|
|
156
|
+
var cardsAvailable = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : false;
|
|
157
|
+
var sourceEvent = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : undefined;
|
|
158
|
+
// If smart cards are available, we send analytics for hyperlinks when a smart link is rejected.
|
|
159
|
+
if (cardsAvailable && !title && !displayText) {
|
|
160
|
+
return insertLink(from, to, href, title, displayText, inputMethod, sourceEvent);
|
|
161
|
+
}
|
|
162
|
+
return (0, _editorAnalytics.withAnalytics)(editorAnalyticsApi, (0, _utils.getLinkCreationAnalyticsEvent)(inputMethod, href))(insertLink(from, to, href, title, displayText, inputMethod, sourceEvent));
|
|
163
|
+
};
|
|
164
|
+
exports.insertLinkWithAnalytics = insertLinkWithAnalytics;
|
|
165
|
+
var insertLinkWithAnalyticsMobileNative = function insertLinkWithAnalyticsMobileNative(inputMethod, from, to, href, editorAnalyticsApi, title, displayText) {
|
|
166
|
+
return (0, _editorAnalytics.withAnalytics)(editorAnalyticsApi, (0, _utils.getLinkCreationAnalyticsEvent)(inputMethod, href))(insertLink(from, to, href, title, displayText, inputMethod));
|
|
167
|
+
};
|
|
168
|
+
exports.insertLinkWithAnalyticsMobileNative = insertLinkWithAnalyticsMobileNative;
|
|
169
|
+
function removeLink(pos, editorAnalyticsApi) {
|
|
170
|
+
return (0, _card.commandWithMetadata)(setLinkHref('', pos, editorAnalyticsApi), {
|
|
171
|
+
action: _analytics.ACTION.UNLINK
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
function editInsertedLink(editorAnalyticsApi) {
|
|
175
|
+
return function (state, dispatch) {
|
|
176
|
+
if (dispatch) {
|
|
177
|
+
var _tr = state.tr;
|
|
178
|
+
_tr.setMeta(_main.stateKey, {
|
|
179
|
+
type: _link.LinkAction.EDIT_INSERTED_TOOLBAR,
|
|
180
|
+
inputMethod: _analytics.INPUT_METHOD.FLOATING_TB
|
|
181
|
+
});
|
|
182
|
+
editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent((0, _analytics.buildEditLinkPayload)(_analytics.ACTION_SUBJECT_ID.HYPERLINK))(_tr);
|
|
183
|
+
dispatch(_tr);
|
|
184
|
+
}
|
|
185
|
+
return true;
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function showLinkToolbar(inputMethod, editorAnalyticsApi) {
|
|
189
|
+
return function (state, dispatch) {
|
|
190
|
+
if (dispatch) {
|
|
191
|
+
var _tr2 = state.tr.setMeta(_main.stateKey, {
|
|
192
|
+
type: _link.LinkAction.SHOW_INSERT_TOOLBAR,
|
|
193
|
+
inputMethod: inputMethod
|
|
194
|
+
});
|
|
195
|
+
editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent({
|
|
196
|
+
action: _analytics.ACTION.INVOKED,
|
|
197
|
+
actionSubject: _analytics.ACTION_SUBJECT.TYPEAHEAD,
|
|
198
|
+
actionSubjectId: _analytics.ACTION_SUBJECT_ID.TYPEAHEAD_LINK,
|
|
199
|
+
attributes: {
|
|
200
|
+
inputMethod: inputMethod
|
|
201
|
+
},
|
|
202
|
+
eventType: _analytics.EVENT_TYPE.UI
|
|
203
|
+
})(_tr2);
|
|
204
|
+
dispatch(_tr2);
|
|
205
|
+
}
|
|
206
|
+
return true;
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function hideLinkToolbar() {
|
|
210
|
+
return function (state, dispatch) {
|
|
211
|
+
if (dispatch) {
|
|
212
|
+
dispatch(hideLinkToolbarSetMeta(state.tr));
|
|
213
|
+
}
|
|
214
|
+
return true;
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
var hideLinkToolbarSetMeta = function hideLinkToolbarSetMeta(tr) {
|
|
218
|
+
return tr.setMeta(_main.stateKey, {
|
|
219
|
+
type: _link.LinkAction.HIDE_TOOLBAR
|
|
220
|
+
});
|
|
221
|
+
};
|
|
222
|
+
exports.hideLinkToolbarSetMeta = hideLinkToolbarSetMeta;
|
|
223
|
+
var onEscapeCallback = function onEscapeCallback(state, dispatch) {
|
|
224
|
+
var _toolbarKey$getState2, _toolbarKey$getState3;
|
|
225
|
+
var tr = state.tr;
|
|
226
|
+
hideLinkToolbarSetMeta(tr);
|
|
227
|
+
(_toolbarKey$getState2 = _toolbarButtons.toolbarKey.getState(state)) === null || _toolbarKey$getState2 === void 0 ? void 0 : (_toolbarKey$getState3 = _toolbarKey$getState2.onEscapeCallback) === null || _toolbarKey$getState3 === void 0 ? void 0 : _toolbarKey$getState3.call(_toolbarKey$getState2, tr);
|
|
228
|
+
if (dispatch) {
|
|
229
|
+
dispatch(tr);
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
return false;
|
|
233
|
+
};
|
|
234
|
+
exports.onEscapeCallback = onEscapeCallback;
|
|
235
|
+
var onClickAwayCallback = function onClickAwayCallback(state, dispatch) {
|
|
236
|
+
if (dispatch) {
|
|
237
|
+
hideLinkToolbar()(state, dispatch);
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
return false;
|
|
241
|
+
};
|
|
242
|
+
exports.onClickAwayCallback = onClickAwayCallback;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "hyperlinkPlugin", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function get() {
|
|
9
|
+
return _plugin.hyperlinkPlugin;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _plugin = require("./plugin");
|