@atlaskit/editor-plugin-card 16.10.3 → 16.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/cjs/cardPlugin.js +19 -2
- package/dist/cjs/pm-plugins/doc.js +2 -2
- package/dist/cjs/ui/PasteDisplayAsMenu.compiled.css +31 -0
- package/dist/cjs/ui/PasteDisplayAsMenu.js +368 -0
- package/dist/cjs/ui/currentPastedSmartLink.js +52 -0
- package/dist/cjs/ui/pasteDisplayAsUtils.js +30 -0
- package/dist/es2019/cardPlugin.js +17 -2
- package/dist/es2019/pm-plugins/doc.js +2 -2
- package/dist/es2019/ui/PasteDisplayAsMenu.compiled.css +31 -0
- package/dist/es2019/ui/PasteDisplayAsMenu.js +366 -0
- package/dist/es2019/ui/currentPastedSmartLink.js +46 -0
- package/dist/es2019/ui/pasteDisplayAsUtils.js +24 -0
- package/dist/esm/cardPlugin.js +19 -2
- package/dist/esm/pm-plugins/doc.js +2 -2
- package/dist/esm/ui/PasteDisplayAsMenu.compiled.css +31 -0
- package/dist/esm/ui/PasteDisplayAsMenu.js +359 -0
- package/dist/esm/ui/currentPastedSmartLink.js +46 -0
- package/dist/esm/ui/pasteDisplayAsUtils.js +24 -0
- package/dist/types/cardPluginType.d.ts +3 -1
- package/dist/types/types/index.d.ts +1 -0
- package/dist/types/ui/PasteDisplayAsMenu.d.ts +25 -0
- package/dist/types/ui/currentPastedSmartLink.d.ts +2 -0
- package/dist/types/ui/pasteDisplayAsUtils.d.ts +7 -0
- package/dist/types-ts4.5/cardPluginType.d.ts +3 -1
- package/dist/types-ts4.5/types/index.d.ts +1 -0
- package/dist/types-ts4.5/ui/PasteDisplayAsMenu.d.ts +25 -0
- package/dist/types-ts4.5/ui/currentPastedSmartLink.d.ts +2 -0
- package/dist/types-ts4.5/ui/pasteDisplayAsUtils.d.ts +12 -0
- package/package.json +9 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-card
|
|
2
2
|
|
|
3
|
+
## 16.11.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`d2be5b45b39b0`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/d2be5b45b39b0) -
|
|
8
|
+
Add Smart Link-aware paste actions for the paste actions menu V2 experiment.
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- Updated dependencies
|
|
13
|
+
|
|
3
14
|
## 16.10.3
|
|
4
15
|
|
|
5
16
|
### Patch Changes
|
package/dist/cjs/cardPlugin.js
CHANGED
|
@@ -15,6 +15,7 @@ var _quickInsert = require("@atlaskit/editor-common/quick-insert");
|
|
|
15
15
|
var _utils = require("@atlaskit/editor-common/utils");
|
|
16
16
|
var _linkDatasource = require("@atlaskit/link-datasource");
|
|
17
17
|
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
18
|
+
var _expVal = require("@atlaskit/tmp-editor-statsig/expVal");
|
|
18
19
|
var _blockCard = require("./nodeviews/toDOM-fixes/blockCard");
|
|
19
20
|
var _embedCard = require("./nodeviews/toDOM-fixes/embedCard");
|
|
20
21
|
var _inlineCard = require("./nodeviews/toDOM-fixes/inlineCard");
|
|
@@ -29,6 +30,7 @@ var _ModalWithState = _interopRequireDefault(require("./ui/DatasourceModal/Modal
|
|
|
29
30
|
var _EditorLinkingPlatformAnalytics = require("./ui/EditorLinkingPlatformAnalytics");
|
|
30
31
|
var _EditorSmartCardEvents = require("./ui/EditorSmartCardEvents");
|
|
31
32
|
var _LayoutButton = _interopRequireDefault(require("./ui/LayoutButton"));
|
|
33
|
+
var _PasteDisplayAsMenu = require("./ui/PasteDisplayAsMenu");
|
|
32
34
|
var _toolbar = require("./ui/toolbar");
|
|
33
35
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
34
36
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // Ignored via go/ees005
|
|
@@ -41,6 +43,20 @@ var cardPlugin = exports.cardPlugin = function cardPlugin(_ref) {
|
|
|
41
43
|
var previousCardProvider;
|
|
42
44
|
var cardPluginEvents = (0, _createEventsQueue.createEventsQueue)();
|
|
43
45
|
var instanceEmbedCardTransformers = options.embedCardTransformers;
|
|
46
|
+
var editorViewForPasteMenu;
|
|
47
|
+
var pasteMenuVariant = (0, _expVal.expValNoExposure)('platform_editor_paste_actions_menu_v2', 'variant', 'control');
|
|
48
|
+
var shouldRegisterPasteDisplayAsMenu = options.enablePasteDisplayAsMenu && ['hasSpellingAndGrammar', 'hasAltAiActions'].includes(pasteMenuVariant);
|
|
49
|
+
if (shouldRegisterPasteDisplayAsMenu) {
|
|
50
|
+
var _api$uiControlRegistr, _options$allowBlockCa;
|
|
51
|
+
api === null || api === void 0 || (_api$uiControlRegistr = api.uiControlRegistry) === null || _api$uiControlRegistr === void 0 || _api$uiControlRegistr.actions.register((0, _PasteDisplayAsMenu.getPasteDisplayAsMenuComponents)({
|
|
52
|
+
api: api,
|
|
53
|
+
allowBlockCards: options.onlyInlineCards ? false : (_options$allowBlockCa = options.allowBlockCards) !== null && _options$allowBlockCa !== void 0 ? _options$allowBlockCa : true,
|
|
54
|
+
allowEmbeds: options.onlyInlineCards ? false : options.allowEmbeds,
|
|
55
|
+
getEditorView: function getEditorView() {
|
|
56
|
+
return editorViewForPasteMenu;
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
44
60
|
api === null || api === void 0 || (_api$base = api.base) === null || _api$base === void 0 || _api$base.actions.registerMarks(function (_ref2) {
|
|
45
61
|
var tr = _ref2.tr,
|
|
46
62
|
node = _ref2.node,
|
|
@@ -86,10 +102,10 @@ var cardPlugin = exports.cardPlugin = function cardPlugin(_ref) {
|
|
|
86
102
|
return nodes;
|
|
87
103
|
},
|
|
88
104
|
pmPlugins: function pmPlugins() {
|
|
89
|
-
var _options$
|
|
105
|
+
var _options$allowBlockCa2, _options$allowResizin, _options$useAlternati, _options$allowWrappin, _options$allowAlignme, _options$allowDatasou, _options$showUpgradeD;
|
|
90
106
|
// onlyInlineCards forces block/embed off regardless of caller-passed flags,
|
|
91
107
|
// keeping the schema gate (in nodes()) and the runtime gate in sync.
|
|
92
|
-
var allowBlockCards = options.onlyInlineCards ? false : (_options$
|
|
108
|
+
var allowBlockCards = options.onlyInlineCards ? false : (_options$allowBlockCa2 = options.allowBlockCards) !== null && _options$allowBlockCa2 !== void 0 ? _options$allowBlockCa2 : true;
|
|
93
109
|
var allowEmbeds = options.onlyInlineCards ? false : options.allowEmbeds;
|
|
94
110
|
var allowResizing = (_options$allowResizin = options.allowResizing) !== null && _options$allowResizin !== void 0 ? _options$allowResizin : true;
|
|
95
111
|
var useAlternativePreloader = (_options$useAlternati = options.useAlternativePreloader) !== null && _options$useAlternati !== void 0 ? _options$useAlternati : true;
|
|
@@ -129,6 +145,7 @@ var cardPlugin = exports.cardPlugin = function cardPlugin(_ref) {
|
|
|
129
145
|
if (!editorView) {
|
|
130
146
|
return null;
|
|
131
147
|
}
|
|
148
|
+
editorViewForPasteMenu = editorView;
|
|
132
149
|
var breakoutEnabled = options.editorAppearance === 'full-page';
|
|
133
150
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_EditorSmartCardEvents.EditorSmartCardEvents, {
|
|
134
151
|
editorView: editorView
|
|
@@ -383,7 +383,7 @@ var changeSelectedCardToLink = exports.changeSelectedCardToLink = function chang
|
|
|
383
383
|
return function (state, dispatch) {
|
|
384
384
|
var selectedNode = state.selection instanceof _state.NodeSelection ? state.selection.node : undefined;
|
|
385
385
|
var tr;
|
|
386
|
-
if (node && pos) {
|
|
386
|
+
if (node && pos !== undefined) {
|
|
387
387
|
tr = cardNodeToLinkWithTransaction(state, text, href, node, pos);
|
|
388
388
|
} else {
|
|
389
389
|
tr = cardToLinkWithTransaction(state, text, href);
|
|
@@ -411,7 +411,7 @@ var changeSelectedCardToLink = exports.changeSelectedCardToLink = function chang
|
|
|
411
411
|
var changeSelectedCardToLinkFallback = exports.changeSelectedCardToLinkFallback = function changeSelectedCardToLinkFallback(text, href, sendAnalytics, node, pos, editorAnalyticsApi) {
|
|
412
412
|
return function (state, dispatch) {
|
|
413
413
|
var tr;
|
|
414
|
-
if (node && pos) {
|
|
414
|
+
if (node && pos !== undefined) {
|
|
415
415
|
tr = cardNodeToLinkWithTransaction(state, text, href, node, pos);
|
|
416
416
|
} else {
|
|
417
417
|
tr = cardToLinkWithTransaction(state, text, href);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
|
|
2
|
+
._2rko1qi0{border-radius:var(--ds-radius-medium,6px)}._189ee4h9{border-width:var(--ds-border-width,1px)}
|
|
3
|
+
._1dqonqa1{border-style:solid}
|
|
4
|
+
._1h6d1l7x{border-color:var(--ds-border,#0b120e24)}
|
|
5
|
+
._1h6dbk0g{border-color:var(--ds-border-disabled,#0515240f)}
|
|
6
|
+
._1h6dq98m{border-color:var(--ds-border-selected,#1868db)}
|
|
7
|
+
._18u0u2gc{margin-left:var(--ds-space-100,8px)}
|
|
8
|
+
._19bv1b66{padding-left:var(--ds-space-050,4px)}
|
|
9
|
+
._19pku2gc{margin-top:var(--ds-space-100,8px)}
|
|
10
|
+
._1bah1b1v{justify-content:space-around}
|
|
11
|
+
._1bah1h6o{justify-content:center}
|
|
12
|
+
._1bsb1osq{width:100%}
|
|
13
|
+
._1e0c1txw{display:flex}
|
|
14
|
+
._2hwxu2gc{margin-right:var(--ds-space-100,8px)}
|
|
15
|
+
._4cvr1h6o{align-items:center}
|
|
16
|
+
._4t3izwfg{height:2pc}
|
|
17
|
+
._bfhk15s3{background-color:var(--ds-background-selected,#e9f2fe)}
|
|
18
|
+
._bfhk187o{background-color:var(--ds-background-disabled,#0515240f)}
|
|
19
|
+
._bfhkhfxm{background-color:var(--ds-surface-sunken,#f8f8f8)}
|
|
20
|
+
._bfhksm61{background-color:var(--ds-background-neutral-subtle,#00000000)}
|
|
21
|
+
._bfhkvuon{background-color:var(--ds-surface,#fff)}
|
|
22
|
+
._ca0q1b66{padding-top:var(--ds-space-050,4px)}
|
|
23
|
+
._n3td1b66{padding-bottom:var(--ds-space-050,4px)}
|
|
24
|
+
._otyru2gc{margin-bottom:var(--ds-space-100,8px)}
|
|
25
|
+
._syaz1gmx{color:var(--ds-text-disabled,#080f214a)}
|
|
26
|
+
._syazi7uo{color:var(--ds-text,#292a2e)}
|
|
27
|
+
._u5f31b66{padding-right:var(--ds-space-050,4px)}
|
|
28
|
+
._irr31dpa:hover{background-color:var(--ds-background-neutral-subtle-hovered,#0515240f)}
|
|
29
|
+
._irr3ufnl:hover{background-color:var(--ds-background-selected-hovered,#cfe1fd)}
|
|
30
|
+
._1di6fcek:active{background-color:var(--ds-background-neutral-subtle-pressed,#0b120e24)}
|
|
31
|
+
._1di6nozp:active{background-color:var(--ds-background-selected-pressed,#8fb8f6)}
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/* PasteDisplayAsMenu.tsx generated by @compiled/babel-plugin v0.39.1 */
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
Object.defineProperty(exports, "__esModule", {
|
|
7
|
+
value: true
|
|
8
|
+
});
|
|
9
|
+
exports.setAppearanceSelection = exports.normalizeSelectionToLinkRangeForUrlAppearance = exports.getPasteDisplayAsMenuComponents = exports.getFirstLinkRangeInSelection = exports.SMART_LINK_DISPLAY_AS_PASTE_MENU_SECTION_KEY = void 0;
|
|
10
|
+
require("./PasteDisplayAsMenu.compiled.css");
|
|
11
|
+
var _runtime = require("@compiled/react/runtime");
|
|
12
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
13
|
+
var _reactIntl = require("react-intl");
|
|
14
|
+
var _css = require("@atlaskit/css");
|
|
15
|
+
var _card = require("@atlaskit/editor-common/card");
|
|
16
|
+
var _hooks = require("@atlaskit/editor-common/hooks");
|
|
17
|
+
var _link = require("@atlaskit/editor-common/link");
|
|
18
|
+
var _toolbar = require("@atlaskit/editor-common/toolbar");
|
|
19
|
+
var _utils = require("@atlaskit/editor-common/utils");
|
|
20
|
+
var _model = require("@atlaskit/editor-prosemirror/model");
|
|
21
|
+
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
22
|
+
var _editorToolbar = require("@atlaskit/editor-toolbar");
|
|
23
|
+
var _minus = _interopRequireDefault(require("@atlaskit/icon/core/minus"));
|
|
24
|
+
var _smartLinkCard = _interopRequireDefault(require("@atlaskit/icon/core/smart-link-card"));
|
|
25
|
+
var _smartLinkEmbed = _interopRequireDefault(require("@atlaskit/icon/core/smart-link-embed"));
|
|
26
|
+
var _smartLinkInline = _interopRequireDefault(require("@atlaskit/icon/core/smart-link-inline"));
|
|
27
|
+
var _linkProvider = require("@atlaskit/link-provider");
|
|
28
|
+
var _compiled = require("@atlaskit/primitives/compiled");
|
|
29
|
+
var _doc = require("../pm-plugins/doc");
|
|
30
|
+
var _currentPastedSmartLink = require("./currentPastedSmartLink");
|
|
31
|
+
var _pasteDisplayAsUtils = require("./pasteDisplayAsUtils");
|
|
32
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
33
|
+
var SMART_LINK_DISPLAY_AS_PASTE_MENU_SECTION_KEY = exports.SMART_LINK_DISPLAY_AS_PASTE_MENU_SECTION_KEY = 'smart-link-display-as-paste-menu-section';
|
|
34
|
+
|
|
35
|
+
// `pasteOptionsToolbarPlugin` is intentionally NOT declared in `CardPluginDependencies`
|
|
36
|
+
// because doing so introduces a runtime package cycle
|
|
37
|
+
// (editor-plugin-card -> editor-plugin-paste-options-toolbar -> editor-plugin-paste
|
|
38
|
+
// -> editor-plugin-card) AND a TS2719 "two different types with this name exist" error
|
|
39
|
+
// at downstream consumers (e.g. Jira's `EditorAfterBanner.tsx`). We instead augment the
|
|
40
|
+
// `api` shape locally at the call sites that need to read the plugin's shared state.
|
|
41
|
+
|
|
42
|
+
var styles = {
|
|
43
|
+
appearanceBox: "_2rko1qi0 _bfhkhfxm _19pku2gc _2hwxu2gc _otyru2gc _18u0u2gc _ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66",
|
|
44
|
+
iconWrapper: "_bfhkvuon _1e0c1txw _1bsb1osq _1bah1b1v",
|
|
45
|
+
iconButton: "_2rko1qi0 _1h6d1l7x _1dqonqa1 _189ee4h9 _4cvr1h6o _syazi7uo _1e0c1txw _4t3izwfg _1bah1h6o _1bsb1osq _bfhksm61 _irr31dpa _1di6fcek",
|
|
46
|
+
iconButtonSelected: "_2rko1qi0 _1h6dq98m _1dqonqa1 _189ee4h9 _4cvr1h6o _bfhk15s3 _syazi7uo _1e0c1txw _4t3izwfg _1bah1h6o _1bsb1osq _irr3ufnl _1di6nozp",
|
|
47
|
+
iconButtonDisabled: "_2rko1qi0 _1h6dbk0g _1dqonqa1 _189ee4h9 _4cvr1h6o _bfhk187o _syaz1gmx _1e0c1txw _4t3izwfg _1bah1h6o _1bsb1osq"
|
|
48
|
+
};
|
|
49
|
+
var AppearanceOptionIconButton = function AppearanceOptionIconButton(_ref) {
|
|
50
|
+
var appearance = _ref.appearance,
|
|
51
|
+
currentAppearance = _ref.currentAppearance,
|
|
52
|
+
isDisabled = _ref.isDisabled,
|
|
53
|
+
label = _ref.label,
|
|
54
|
+
Icon = _ref.Icon,
|
|
55
|
+
onClick = _ref.onClick;
|
|
56
|
+
return /*#__PURE__*/_react.default.createElement(_compiled.Box, {
|
|
57
|
+
xcss: styles.iconWrapper
|
|
58
|
+
}, /*#__PURE__*/_react.default.createElement(_compiled.Pressable, {
|
|
59
|
+
xcss: (0, _css.cx)(styles.iconButton, isDisabled && styles.iconButtonDisabled, !isDisabled && currentAppearance === appearance && styles.iconButtonSelected),
|
|
60
|
+
"aria-label": label,
|
|
61
|
+
"aria-pressed": currentAppearance === appearance,
|
|
62
|
+
isDisabled: isDisabled,
|
|
63
|
+
onClick: onClick
|
|
64
|
+
}, /*#__PURE__*/_react.default.createElement(Icon, {
|
|
65
|
+
label: label
|
|
66
|
+
})));
|
|
67
|
+
};
|
|
68
|
+
var InlineAppearanceIconButton = function InlineAppearanceIconButton(_ref2) {
|
|
69
|
+
var currentAppearance = _ref2.currentAppearance,
|
|
70
|
+
isDisabled = _ref2.isDisabled,
|
|
71
|
+
label = _ref2.label,
|
|
72
|
+
onClick = _ref2.onClick;
|
|
73
|
+
return /*#__PURE__*/_react.default.createElement(AppearanceOptionIconButton, {
|
|
74
|
+
appearance: "inline",
|
|
75
|
+
currentAppearance: currentAppearance,
|
|
76
|
+
isDisabled: isDisabled,
|
|
77
|
+
label: label,
|
|
78
|
+
Icon: _smartLinkInline.default,
|
|
79
|
+
onClick: onClick
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
var BlockAppearanceIconButton = function BlockAppearanceIconButton(_ref3) {
|
|
83
|
+
var currentAppearance = _ref3.currentAppearance,
|
|
84
|
+
isDisabled = _ref3.isDisabled,
|
|
85
|
+
label = _ref3.label,
|
|
86
|
+
onClick = _ref3.onClick;
|
|
87
|
+
return /*#__PURE__*/_react.default.createElement(AppearanceOptionIconButton, {
|
|
88
|
+
appearance: "block",
|
|
89
|
+
currentAppearance: currentAppearance,
|
|
90
|
+
isDisabled: isDisabled,
|
|
91
|
+
label: label,
|
|
92
|
+
Icon: _smartLinkCard.default,
|
|
93
|
+
onClick: onClick
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
var EmbedAppearanceIconButton = function EmbedAppearanceIconButton(_ref4) {
|
|
97
|
+
var currentAppearance = _ref4.currentAppearance,
|
|
98
|
+
isDisabled = _ref4.isDisabled,
|
|
99
|
+
label = _ref4.label,
|
|
100
|
+
onClick = _ref4.onClick;
|
|
101
|
+
return /*#__PURE__*/_react.default.createElement(AppearanceOptionIconButton, {
|
|
102
|
+
appearance: "embed",
|
|
103
|
+
currentAppearance: currentAppearance,
|
|
104
|
+
isDisabled: isDisabled,
|
|
105
|
+
label: label,
|
|
106
|
+
Icon: _smartLinkEmbed.default,
|
|
107
|
+
onClick: onClick
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
var getCurrentPastedSlice = function getCurrentPastedSlice(api) {
|
|
111
|
+
var _apiWithPaste$paste, _pasteState$lastConte;
|
|
112
|
+
var apiWithPaste = api;
|
|
113
|
+
var pasteState = apiWithPaste === null || apiWithPaste === void 0 || (_apiWithPaste$paste = apiWithPaste.paste) === null || _apiWithPaste$paste === void 0 ? void 0 : _apiWithPaste$paste.sharedState.currentState();
|
|
114
|
+
var slice = pasteState === null || pasteState === void 0 || (_pasteState$lastConte = pasteState.lastContentPasted) === null || _pasteState$lastConte === void 0 ? void 0 : _pasteState$lastConte.pastedSlice;
|
|
115
|
+
return slice;
|
|
116
|
+
};
|
|
117
|
+
var getCardUrlAtPasteRange = function getCardUrlAtPasteRange(_ref5) {
|
|
118
|
+
var _editorView$state$doc, _maybeAttrs$url, _maybeAttrs$data;
|
|
119
|
+
var editorView = _ref5.editorView,
|
|
120
|
+
pasteStartPos = _ref5.pasteStartPos,
|
|
121
|
+
pasteEndPos = _ref5.pasteEndPos;
|
|
122
|
+
var cardAtPasteRange = (0, _pasteDisplayAsUtils.getCardAtPasteRange)(editorView.state, pasteStartPos, pasteEndPos);
|
|
123
|
+
var maybeAttrs = cardAtPasteRange ? (_editorView$state$doc = editorView.state.doc.nodeAt(cardAtPasteRange.pos)) === null || _editorView$state$doc === void 0 ? void 0 : _editorView$state$doc.attrs : undefined;
|
|
124
|
+
var maybeUrl = (_maybeAttrs$url = maybeAttrs === null || maybeAttrs === void 0 ? void 0 : maybeAttrs.url) !== null && _maybeAttrs$url !== void 0 ? _maybeAttrs$url : maybeAttrs === null || maybeAttrs === void 0 || (_maybeAttrs$data = maybeAttrs.data) === null || _maybeAttrs$data === void 0 ? void 0 : _maybeAttrs$data.url;
|
|
125
|
+
return typeof maybeUrl === 'string' ? maybeUrl : undefined;
|
|
126
|
+
};
|
|
127
|
+
var setAppearanceSelection = exports.setAppearanceSelection = function setAppearanceSelection(_ref6) {
|
|
128
|
+
var editorView = _ref6.editorView,
|
|
129
|
+
pasteStartPos = _ref6.pasteStartPos,
|
|
130
|
+
pasteEndPos = _ref6.pasteEndPos,
|
|
131
|
+
targetPos = _ref6.targetPos;
|
|
132
|
+
var state = editorView.state,
|
|
133
|
+
dispatch = editorView.dispatch;
|
|
134
|
+
var maxPos = state.doc.content.size;
|
|
135
|
+
var clampedStart = Math.max(0, Math.min(pasteStartPos, maxPos));
|
|
136
|
+
var clampedEnd = Math.max(0, Math.min(pasteEndPos, maxPos));
|
|
137
|
+
var from = Math.min(clampedStart, clampedEnd);
|
|
138
|
+
var to = Math.max(clampedStart, clampedEnd);
|
|
139
|
+
var isTargetPosInBounds = targetPos !== undefined && targetPos >= 0 && targetPos <= state.doc.content.size;
|
|
140
|
+
try {
|
|
141
|
+
var nextSelection = isTargetPosInBounds && targetPos !== undefined ? _state.NodeSelection.create(state.doc, targetPos) : _state.TextSelection.create(state.doc, from, to);
|
|
142
|
+
var tr = state.tr.setSelection(nextSelection);
|
|
143
|
+
dispatch(tr);
|
|
144
|
+
return true;
|
|
145
|
+
} catch (_unused) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
var getFirstLinkRangeInSelection = exports.getFirstLinkRangeInSelection = function getFirstLinkRangeInSelection(editorView) {
|
|
150
|
+
var state = editorView.state;
|
|
151
|
+
var linkMarkType = state.schema.marks.link;
|
|
152
|
+
if (!linkMarkType) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
var firstLinkRange;
|
|
156
|
+
state.doc.nodesBetween(state.selection.from, state.selection.to, function (node, pos) {
|
|
157
|
+
if (firstLinkRange || !node.isText) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (linkMarkType.isInSet(node.marks)) {
|
|
161
|
+
firstLinkRange = {
|
|
162
|
+
from: pos,
|
|
163
|
+
to: pos + node.nodeSize
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
return firstLinkRange;
|
|
168
|
+
};
|
|
169
|
+
var normalizeSelectionToLinkRangeForUrlAppearance = exports.normalizeSelectionToLinkRangeForUrlAppearance = function normalizeSelectionToLinkRangeForUrlAppearance(_ref7) {
|
|
170
|
+
var editorView = _ref7.editorView,
|
|
171
|
+
targetPos = _ref7.targetPos;
|
|
172
|
+
if (targetPos !== undefined || (0, _link.getActiveLinkMark)(editorView.state)) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
var firstLinkRange = getFirstLinkRangeInSelection(editorView);
|
|
176
|
+
if (!firstLinkRange) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
var linkRangeSelectionTr = editorView.state.tr.setSelection(_state.TextSelection.create(editorView.state.doc, firstLinkRange.from, firstLinkRange.to));
|
|
180
|
+
editorView.dispatch(linkRangeSelectionTr);
|
|
181
|
+
};
|
|
182
|
+
var PasteDisplayAsMenuHorizontalView = function PasteDisplayAsMenuHorizontalView(_ref8) {
|
|
183
|
+
var _smartCardContext$val, _getCardAtPasteRange$, _getCardAtPasteRange, _smartCardContext$val2;
|
|
184
|
+
var api = _ref8.api,
|
|
185
|
+
allowBlockCards = _ref8.allowBlockCards,
|
|
186
|
+
allowEmbeds = _ref8.allowEmbeds;
|
|
187
|
+
var intl = (0, _reactIntl.useIntl)();
|
|
188
|
+
var _useEditorToolbar = (0, _toolbar.useEditorToolbar)(),
|
|
189
|
+
editorView = _useEditorToolbar.editorView;
|
|
190
|
+
var toolbarDropdownMenu = (0, _editorToolbar.useToolbarDropdownMenu)();
|
|
191
|
+
var smartCardContext = (0, _linkProvider.useSmartCardContext)();
|
|
192
|
+
var frameRef = (0, _react.useRef)(null);
|
|
193
|
+
var isApplyingRef = (0, _react.useRef)(false);
|
|
194
|
+
var apiWithPasteOptionsToolbar = api;
|
|
195
|
+
var pasteRange = (0, _hooks.useSharedPluginStateWithSelector)(apiWithPasteOptionsToolbar, ['pasteOptionsToolbarPlugin'], function (states) {
|
|
196
|
+
var pluginState = states.pasteOptionsToolbarPluginState;
|
|
197
|
+
return pluginState ? {
|
|
198
|
+
pasteEndPos: pluginState.pasteEndPos,
|
|
199
|
+
pasteStartPos: pluginState.pasteStartPos
|
|
200
|
+
} : undefined;
|
|
201
|
+
});
|
|
202
|
+
// Subscribe to card state so the menu re-renders when resolved card metadata updates.
|
|
203
|
+
(0, _hooks.useSharedPluginStateWithSelector)(api, ['card'], function (states) {
|
|
204
|
+
return states.cardState;
|
|
205
|
+
});
|
|
206
|
+
var pastedLinkUrlFromSlice = (0, _currentPastedSmartLink.getSingleSmartLinkUrlFromSlice)(getCurrentPastedSlice(api));
|
|
207
|
+
var pastedLinkUrlFromCard = editorView && pasteRange ? getCardUrlAtPasteRange({
|
|
208
|
+
editorView: editorView,
|
|
209
|
+
pasteStartPos: pasteRange.pasteStartPos,
|
|
210
|
+
pasteEndPos: pasteRange.pasteEndPos
|
|
211
|
+
}) : undefined;
|
|
212
|
+
var pastedLinkUrl = pastedLinkUrlFromSlice !== null && pastedLinkUrlFromSlice !== void 0 ? pastedLinkUrlFromSlice : pastedLinkUrlFromCard;
|
|
213
|
+
var pastedLinkUrlState = pastedLinkUrl ? (_smartCardContext$val = smartCardContext.value) === null || _smartCardContext$val === void 0 || (_smartCardContext$val = _smartCardContext$val.store) === null || _smartCardContext$val === void 0 || (_smartCardContext$val = _smartCardContext$val.getState()) === null || _smartCardContext$val === void 0 ? void 0 : _smartCardContext$val[pastedLinkUrl] : undefined;
|
|
214
|
+
var hasResolvedSmartLinkData = Boolean(pastedLinkUrlState === null || pastedLinkUrlState === void 0 ? void 0 : pastedLinkUrlState.details);
|
|
215
|
+
var currentAppearance = editorView && pasteRange ? (_getCardAtPasteRange$ = (_getCardAtPasteRange = (0, _pasteDisplayAsUtils.getCardAtPasteRange)(editorView.state, pasteRange.pasteStartPos, pasteRange.pasteEndPos)) === null || _getCardAtPasteRange === void 0 ? void 0 : _getCardAtPasteRange.appearance) !== null && _getCardAtPasteRange$ !== void 0 ? _getCardAtPasteRange$ : 'url' : undefined;
|
|
216
|
+
var handleClick = (0, _react.useCallback)(function (appearance) {
|
|
217
|
+
return function () {
|
|
218
|
+
if (!editorView || !pasteRange || !pastedLinkUrl || !currentAppearance || isApplyingRef.current) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
isApplyingRef.current = true;
|
|
222
|
+
var state = editorView.state,
|
|
223
|
+
dispatch = editorView.dispatch;
|
|
224
|
+
var pasteStartPos = pasteRange.pasteStartPos,
|
|
225
|
+
pasteEndPos = pasteRange.pasteEndPos;
|
|
226
|
+
var cardAtPasteRange = (0, _pasteDisplayAsUtils.getCardAtPasteRange)(state, pasteStartPos, pasteEndPos);
|
|
227
|
+
if (appearance === 'url') {
|
|
228
|
+
if (cardAtPasteRange) {
|
|
229
|
+
var _state$doc$nodeAt, _api$analytics;
|
|
230
|
+
(0, _doc.changeSelectedCardToLink)(pastedLinkUrl, pastedLinkUrl, true, (_state$doc$nodeAt = state.doc.nodeAt(cardAtPasteRange.pos)) !== null && _state$doc$nodeAt !== void 0 ? _state$doc$nodeAt : undefined, cardAtPasteRange.pos, api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions)(state, dispatch, editorView);
|
|
231
|
+
}
|
|
232
|
+
toolbarDropdownMenu === null || toolbarDropdownMenu === void 0 || toolbarDropdownMenu.closeMenu(null);
|
|
233
|
+
isApplyingRef.current = false;
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
var targetPos = cardAtPasteRange === null || cardAtPasteRange === void 0 ? void 0 : cardAtPasteRange.pos;
|
|
237
|
+
if (targetPos !== undefined && targetPos < pasteStartPos) {
|
|
238
|
+
isApplyingRef.current = false;
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
var didApplySelection = setAppearanceSelection({
|
|
242
|
+
editorView: editorView,
|
|
243
|
+
pasteStartPos: pasteStartPos,
|
|
244
|
+
pasteEndPos: pasteEndPos,
|
|
245
|
+
targetPos: targetPos
|
|
246
|
+
});
|
|
247
|
+
if (!didApplySelection) {
|
|
248
|
+
toolbarDropdownMenu === null || toolbarDropdownMenu === void 0 || toolbarDropdownMenu.closeMenu(null);
|
|
249
|
+
isApplyingRef.current = false;
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
normalizeSelectionToLinkRangeForUrlAppearance({
|
|
253
|
+
editorView: editorView,
|
|
254
|
+
targetPos: targetPos
|
|
255
|
+
});
|
|
256
|
+
frameRef.current = requestAnimationFrame(function () {
|
|
257
|
+
var _api$analytics2;
|
|
258
|
+
frameRef.current = null;
|
|
259
|
+
(0, _doc.setSelectedCardAppearance)(appearance, api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 ? void 0 : _api$analytics2.actions)(editorView.state, editorView.dispatch, editorView);
|
|
260
|
+
toolbarDropdownMenu === null || toolbarDropdownMenu === void 0 || toolbarDropdownMenu.closeMenu(null);
|
|
261
|
+
isApplyingRef.current = false;
|
|
262
|
+
});
|
|
263
|
+
};
|
|
264
|
+
}, [api, currentAppearance, editorView, pasteRange, pastedLinkUrl, toolbarDropdownMenu]);
|
|
265
|
+
(0, _react.useEffect)(function () {
|
|
266
|
+
return function () {
|
|
267
|
+
if (frameRef.current !== null) {
|
|
268
|
+
cancelAnimationFrame(frameRef.current);
|
|
269
|
+
}
|
|
270
|
+
isApplyingRef.current = false;
|
|
271
|
+
};
|
|
272
|
+
}, []);
|
|
273
|
+
if (!editorView || !pasteRange || !pastedLinkUrl || !currentAppearance) {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
var preview = allowEmbeds && pastedLinkUrl && ((_smartCardContext$val2 = smartCardContext.value) === null || _smartCardContext$val2 === void 0 ? void 0 : _smartCardContext$val2.extractors.getPreview(pastedLinkUrl, 'web'));
|
|
277
|
+
var blockCardNodeType = editorView.state.schema.nodes.blockCard;
|
|
278
|
+
var embedCardNodeType = editorView.state.schema.nodes.embedCard;
|
|
279
|
+
var isBlockSupportedFromAppearanceContext = allowBlockCards && blockCardNodeType && (0, _utils.isSupportedInParent)(editorView.state, _model.Fragment.from(blockCardNodeType.createChecked({})), currentAppearance === 'url' || currentAppearance === 'inline' ? undefined : currentAppearance);
|
|
280
|
+
var isEmbedSupportedFromAppearanceContext = allowEmbeds && preview && embedCardNodeType && (0, _utils.isSupportedInParent)(editorView.state, _model.Fragment.from(embedCardNodeType.createChecked({})), currentAppearance === 'url' || currentAppearance === 'inline' ? undefined : currentAppearance);
|
|
281
|
+
var isSmartLinkConvertible = hasResolvedSmartLinkData;
|
|
282
|
+
var isBlockSupportedFromSelection = allowBlockCards && blockCardNodeType && (0, _utils.isSupportedInParent)(editorView.state, _model.Fragment.from(blockCardNodeType.createChecked({})), undefined);
|
|
283
|
+
var isEmbedSupportedFromSelection = allowEmbeds && preview && embedCardNodeType && (0, _utils.isSupportedInParent)(editorView.state, _model.Fragment.from(embedCardNodeType.createChecked({})), undefined);
|
|
284
|
+
var isBlockSupported = Boolean(isBlockSupportedFromAppearanceContext || isBlockSupportedFromSelection);
|
|
285
|
+
var isEmbedSupported = Boolean(isEmbedSupportedFromAppearanceContext || isEmbedSupportedFromSelection);
|
|
286
|
+
return /*#__PURE__*/_react.default.createElement(_compiled.Flex, {
|
|
287
|
+
xcss: styles.appearanceBox,
|
|
288
|
+
gap: "space.050"
|
|
289
|
+
}, /*#__PURE__*/_react.default.createElement(AppearanceOptionIconButton, {
|
|
290
|
+
appearance: "url",
|
|
291
|
+
currentAppearance: currentAppearance,
|
|
292
|
+
isDisabled: false,
|
|
293
|
+
label: intl.formatMessage(_card.appearancePropsMap.url.title),
|
|
294
|
+
Icon: _minus.default,
|
|
295
|
+
onClick: handleClick('url')
|
|
296
|
+
}), /*#__PURE__*/_react.default.createElement(InlineAppearanceIconButton, {
|
|
297
|
+
currentAppearance: currentAppearance,
|
|
298
|
+
isDisabled: !isSmartLinkConvertible,
|
|
299
|
+
label: intl.formatMessage(_card.appearancePropsMap.inline.title),
|
|
300
|
+
onClick: handleClick('inline')
|
|
301
|
+
}), /*#__PURE__*/_react.default.createElement(BlockAppearanceIconButton, {
|
|
302
|
+
currentAppearance: currentAppearance,
|
|
303
|
+
isDisabled: !isSmartLinkConvertible || !isBlockSupported,
|
|
304
|
+
label: intl.formatMessage(_card.appearancePropsMap.block.title),
|
|
305
|
+
onClick: handleClick('block')
|
|
306
|
+
}), /*#__PURE__*/_react.default.createElement(EmbedAppearanceIconButton, {
|
|
307
|
+
currentAppearance: currentAppearance,
|
|
308
|
+
isDisabled: !isEmbedSupported,
|
|
309
|
+
label: intl.formatMessage(_card.appearancePropsMap.embed.title),
|
|
310
|
+
onClick: handleClick('embed')
|
|
311
|
+
}));
|
|
312
|
+
};
|
|
313
|
+
var PasteDisplayAsMenuSection = function PasteDisplayAsMenuSection(_ref9) {
|
|
314
|
+
var api = _ref9.api,
|
|
315
|
+
allowBlockCards = _ref9.allowBlockCards,
|
|
316
|
+
allowEmbeds = _ref9.allowEmbeds;
|
|
317
|
+
var intl = (0, _reactIntl.useIntl)();
|
|
318
|
+
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, {
|
|
319
|
+
title: intl.formatMessage({
|
|
320
|
+
defaultMessage: 'Display as',
|
|
321
|
+
description: 'Section title for Smart Link display options in the paste actions menu.',
|
|
322
|
+
id: 'fabric.editor.pasteDisplayAsMenu.displayAs'
|
|
323
|
+
})
|
|
324
|
+
}, /*#__PURE__*/_react.default.createElement(PasteDisplayAsMenuHorizontalView, {
|
|
325
|
+
api: api,
|
|
326
|
+
allowBlockCards: allowBlockCards,
|
|
327
|
+
allowEmbeds: allowEmbeds
|
|
328
|
+
}));
|
|
329
|
+
};
|
|
330
|
+
var getPasteDisplayAsMenuComponents = exports.getPasteDisplayAsMenuComponents = function getPasteDisplayAsMenuComponents(_ref0) {
|
|
331
|
+
var api = _ref0.api,
|
|
332
|
+
allowBlockCards = _ref0.allowBlockCards,
|
|
333
|
+
allowEmbeds = _ref0.allowEmbeds,
|
|
334
|
+
getEditorView = _ref0.getEditorView;
|
|
335
|
+
return [{
|
|
336
|
+
type: 'menu-section',
|
|
337
|
+
key: SMART_LINK_DISPLAY_AS_PASTE_MENU_SECTION_KEY,
|
|
338
|
+
parents: [{
|
|
339
|
+
type: _toolbar.PASTE_MENU.type,
|
|
340
|
+
key: _toolbar.PASTE_MENU.key,
|
|
341
|
+
rank: 60
|
|
342
|
+
}],
|
|
343
|
+
isHidden: function isHidden() {
|
|
344
|
+
var _apiWithPasteOptionsT;
|
|
345
|
+
var apiWithPasteOptionsToolbar = api;
|
|
346
|
+
var pasteRange = apiWithPasteOptionsToolbar === null || apiWithPasteOptionsToolbar === void 0 || (_apiWithPasteOptionsT = apiWithPasteOptionsToolbar.pasteOptionsToolbarPlugin) === null || _apiWithPasteOptionsT === void 0 ? void 0 : _apiWithPasteOptionsT.sharedState.currentState();
|
|
347
|
+
var editorView = getEditorView();
|
|
348
|
+
if (!editorView || !pasteRange) {
|
|
349
|
+
return true;
|
|
350
|
+
}
|
|
351
|
+
var pastedSlice = getCurrentPastedSlice(api);
|
|
352
|
+
var urlFromSlice = (0, _currentPastedSmartLink.getSingleSmartLinkUrlFromSlice)(pastedSlice);
|
|
353
|
+
var urlFromCard = getCardUrlAtPasteRange({
|
|
354
|
+
editorView: editorView,
|
|
355
|
+
pasteStartPos: pasteRange.pasteStartPos,
|
|
356
|
+
pasteEndPos: pasteRange.pasteEndPos
|
|
357
|
+
});
|
|
358
|
+
return !urlFromSlice && !urlFromCard;
|
|
359
|
+
},
|
|
360
|
+
component: function component() {
|
|
361
|
+
return /*#__PURE__*/_react.default.createElement(PasteDisplayAsMenuSection, {
|
|
362
|
+
api: api,
|
|
363
|
+
allowBlockCards: allowBlockCards,
|
|
364
|
+
allowEmbeds: allowEmbeds
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
}];
|
|
368
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getSingleSmartLinkUrlFromSlice = void 0;
|
|
7
|
+
var getUrlFromTextLinkNode = function getUrlFromTextLinkNode(node) {
|
|
8
|
+
var _node$marks$0$attrs;
|
|
9
|
+
if (!node.isText || node.marks.length !== 1 || node.marks[0].type.name !== 'link') {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
var href = (_node$marks$0$attrs = node.marks[0].attrs) === null || _node$marks$0$attrs === void 0 ? void 0 : _node$marks$0$attrs.href;
|
|
13
|
+
return typeof href === 'string' && node.text === href ? href : undefined;
|
|
14
|
+
};
|
|
15
|
+
var getUrlFromInlineCardNode = function getUrlFromInlineCardNode(node) {
|
|
16
|
+
var _node$attrs;
|
|
17
|
+
if (node.type.name !== 'inlineCard') {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
var url = (_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.url;
|
|
21
|
+
return typeof url === 'string' ? url : undefined;
|
|
22
|
+
};
|
|
23
|
+
var significantChildren = function significantChildren(fragment) {
|
|
24
|
+
var children = [];
|
|
25
|
+
fragment.forEach(function (child) {
|
|
26
|
+
var _child$text;
|
|
27
|
+
if (child.isText && ((_child$text = child.text) === null || _child$text === void 0 ? void 0 : _child$text.trim()) === '') {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
children.push(child);
|
|
31
|
+
});
|
|
32
|
+
return children;
|
|
33
|
+
};
|
|
34
|
+
var getSingleSmartLinkUrlFromSlice = exports.getSingleSmartLinkUrlFromSlice = function getSingleSmartLinkUrlFromSlice(slice) {
|
|
35
|
+
var _getUrlFromTextLinkNo, _getUrlFromTextLinkNo2;
|
|
36
|
+
if (!slice || slice.content.childCount !== 1) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
var topNode = slice.content.child(0);
|
|
40
|
+
var topNodeUrl = (_getUrlFromTextLinkNo = getUrlFromTextLinkNode(topNode)) !== null && _getUrlFromTextLinkNo !== void 0 ? _getUrlFromTextLinkNo : getUrlFromInlineCardNode(topNode);
|
|
41
|
+
if (topNodeUrl) {
|
|
42
|
+
return topNodeUrl;
|
|
43
|
+
}
|
|
44
|
+
if (topNode.type.name !== 'paragraph') {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
var children = significantChildren(topNode.content);
|
|
48
|
+
if (children.length !== 1) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return (_getUrlFromTextLinkNo2 = getUrlFromTextLinkNode(children[0])) !== null && _getUrlFromTextLinkNo2 !== void 0 ? _getUrlFromTextLinkNo2 : getUrlFromInlineCardNode(children[0]);
|
|
52
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getCardAtPasteRange = exports.DISPLAY_AS_OPTIONS = void 0;
|
|
7
|
+
var DISPLAY_AS_OPTIONS = exports.DISPLAY_AS_OPTIONS = ['url', 'inline', 'block', 'embed'];
|
|
8
|
+
var getCardAtPasteRange = exports.getCardAtPasteRange = function getCardAtPasteRange(state, pasteStartPos, pasteEndPos) {
|
|
9
|
+
var result;
|
|
10
|
+
var docContentSize = state.doc.content.size;
|
|
11
|
+
var clampedStart = Math.max(0, Math.min(pasteStartPos, docContentSize));
|
|
12
|
+
var clampedEnd = Math.max(0, Math.min(pasteEndPos, docContentSize));
|
|
13
|
+
var from = Math.min(clampedStart, clampedEnd);
|
|
14
|
+
var to = Math.max(clampedStart, clampedEnd);
|
|
15
|
+
try {
|
|
16
|
+
state.doc.nodesBetween(from, to, function (node, pos) {
|
|
17
|
+
if (node.type.name === 'inlineCard' || node.type.name === 'blockCard' || node.type.name === 'embedCard') {
|
|
18
|
+
result = {
|
|
19
|
+
appearance: node.type.name === 'inlineCard' ? 'inline' : node.type.name === 'blockCard' ? 'block' : 'embed',
|
|
20
|
+
pos: pos
|
|
21
|
+
};
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
});
|
|
26
|
+
} catch (_unused) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
};
|
|
@@ -4,6 +4,7 @@ import { IconDatasourceAssetsObjects, IconDatasourceConfluenceSearch, IconDataso
|
|
|
4
4
|
import { canRenderDatasource } from '@atlaskit/editor-common/utils';
|
|
5
5
|
import { ASSETS_LIST_OF_LINKS_DATASOURCE_ID, CONFLUENCE_SEARCH_DATASOURCE_ID } from '@atlaskit/link-datasource';
|
|
6
6
|
import { fg } from '@atlaskit/platform-feature-flags';
|
|
7
|
+
import { expValNoExposure } from '@atlaskit/tmp-editor-statsig/expVal';
|
|
7
8
|
import { blockCardSpecWithFixedToDOM } from './nodeviews/toDOM-fixes/blockCard';
|
|
8
9
|
import { embedCardSpecWithFixedToDOM } from './nodeviews/toDOM-fixes/embedCard';
|
|
9
10
|
import { inlineCardSpecWithFixedToDOM } from './nodeviews/toDOM-fixes/inlineCard';
|
|
@@ -20,6 +21,7 @@ import { EditorSmartCardEvents } from './ui/EditorSmartCardEvents';
|
|
|
20
21
|
// Ignored via go/ees005
|
|
21
22
|
// eslint-disable-next-line import/no-named-as-default
|
|
22
23
|
import LayoutButton from './ui/LayoutButton';
|
|
24
|
+
import { getPasteDisplayAsMenuComponents } from './ui/PasteDisplayAsMenu';
|
|
23
25
|
import { floatingToolbar, getEndingToolbarItems, getStartingToolbarItems } from './ui/toolbar';
|
|
24
26
|
export const cardPlugin = ({
|
|
25
27
|
config: options = {},
|
|
@@ -29,6 +31,18 @@ export const cardPlugin = ({
|
|
|
29
31
|
let previousCardProvider;
|
|
30
32
|
const cardPluginEvents = createEventsQueue();
|
|
31
33
|
let instanceEmbedCardTransformers = options.embedCardTransformers;
|
|
34
|
+
let editorViewForPasteMenu;
|
|
35
|
+
const pasteMenuVariant = expValNoExposure('platform_editor_paste_actions_menu_v2', 'variant', 'control');
|
|
36
|
+
const shouldRegisterPasteDisplayAsMenu = options.enablePasteDisplayAsMenu && ['hasSpellingAndGrammar', 'hasAltAiActions'].includes(pasteMenuVariant);
|
|
37
|
+
if (shouldRegisterPasteDisplayAsMenu) {
|
|
38
|
+
var _api$uiControlRegistr, _options$allowBlockCa;
|
|
39
|
+
api === null || api === void 0 ? void 0 : (_api$uiControlRegistr = api.uiControlRegistry) === null || _api$uiControlRegistr === void 0 ? void 0 : _api$uiControlRegistr.actions.register(getPasteDisplayAsMenuComponents({
|
|
40
|
+
api,
|
|
41
|
+
allowBlockCards: options.onlyInlineCards ? false : (_options$allowBlockCa = options.allowBlockCards) !== null && _options$allowBlockCa !== void 0 ? _options$allowBlockCa : true,
|
|
42
|
+
allowEmbeds: options.onlyInlineCards ? false : options.allowEmbeds,
|
|
43
|
+
getEditorView: () => editorViewForPasteMenu
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
32
46
|
api === null || api === void 0 ? void 0 : (_api$base = api.base) === null || _api$base === void 0 ? void 0 : _api$base.actions.registerMarks(({
|
|
33
47
|
tr,
|
|
34
48
|
node,
|
|
@@ -81,10 +95,10 @@ export const cardPlugin = ({
|
|
|
81
95
|
return nodes;
|
|
82
96
|
},
|
|
83
97
|
pmPlugins() {
|
|
84
|
-
var _options$
|
|
98
|
+
var _options$allowBlockCa2, _options$allowResizin, _options$useAlternati, _options$allowWrappin, _options$allowAlignme, _options$allowDatasou, _options$showUpgradeD;
|
|
85
99
|
// onlyInlineCards forces block/embed off regardless of caller-passed flags,
|
|
86
100
|
// keeping the schema gate (in nodes()) and the runtime gate in sync.
|
|
87
|
-
const allowBlockCards = options.onlyInlineCards ? false : (_options$
|
|
101
|
+
const allowBlockCards = options.onlyInlineCards ? false : (_options$allowBlockCa2 = options.allowBlockCards) !== null && _options$allowBlockCa2 !== void 0 ? _options$allowBlockCa2 : true;
|
|
88
102
|
const allowEmbeds = options.onlyInlineCards ? false : options.allowEmbeds;
|
|
89
103
|
const allowResizing = (_options$allowResizin = options.allowResizing) !== null && _options$allowResizin !== void 0 ? _options$allowResizin : true;
|
|
90
104
|
const useAlternativePreloader = (_options$useAlternati = options.useAlternativePreloader) !== null && _options$useAlternati !== void 0 ? _options$useAlternati : true;
|
|
@@ -127,6 +141,7 @@ export const cardPlugin = ({
|
|
|
127
141
|
if (!editorView) {
|
|
128
142
|
return null;
|
|
129
143
|
}
|
|
144
|
+
editorViewForPasteMenu = editorView;
|
|
130
145
|
const breakoutEnabled = options.editorAppearance === 'full-page';
|
|
131
146
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(EditorSmartCardEvents, {
|
|
132
147
|
editorView: editorView
|
|
@@ -351,7 +351,7 @@ export const convertHyperlinkToSmartCard = (state, source, appearance, normalize
|
|
|
351
351
|
export const changeSelectedCardToLink = (text, href, sendAnalytics, node, pos, editorAnalyticsApi) => (state, dispatch) => {
|
|
352
352
|
const selectedNode = state.selection instanceof NodeSelection ? state.selection.node : undefined;
|
|
353
353
|
let tr;
|
|
354
|
-
if (node && pos) {
|
|
354
|
+
if (node && pos !== undefined) {
|
|
355
355
|
tr = cardNodeToLinkWithTransaction(state, text, href, node, pos);
|
|
356
356
|
} else {
|
|
357
357
|
tr = cardToLinkWithTransaction(state, text, href);
|
|
@@ -377,7 +377,7 @@ export const changeSelectedCardToLink = (text, href, sendAnalytics, node, pos, e
|
|
|
377
377
|
};
|
|
378
378
|
export const changeSelectedCardToLinkFallback = (text, href, sendAnalytics, node, pos, editorAnalyticsApi) => (state, dispatch) => {
|
|
379
379
|
let tr;
|
|
380
|
-
if (node && pos) {
|
|
380
|
+
if (node && pos !== undefined) {
|
|
381
381
|
tr = cardNodeToLinkWithTransaction(state, text, href, node, pos);
|
|
382
382
|
} else {
|
|
383
383
|
tr = cardToLinkWithTransaction(state, text, href);
|