UNPKG

@atlaskit/editor-plugin-card

Version:

Card plugin for @atlaskit/editor-core

613 lines (601 loc) 26.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.updateCardViaDatasource = exports.updateCard = exports.setSelectedCardAppearance = exports.replaceQueuedUrlWithCard = exports.queueCardsFromChangedTr = exports.queueCardFromChangedTr = exports.insertDatasource = exports.handleFallbackWithAnalytics = exports.getLinkNodeType = exports.getAttrsForAppearance = exports.convertHyperlinkToSmartCard = exports.changeSelectedCardToText = exports.changeSelectedCardToLinkFallback = exports.changeSelectedCardToLink = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _isEqual = _interopRequireDefault(require("lodash/isEqual")); var _adfSchema = require("@atlaskit/adf-schema"); var _analytics = require("@atlaskit/editor-common/analytics"); var _card = require("@atlaskit/editor-common/card"); var _link = require("@atlaskit/editor-common/link"); var _utils = require("@atlaskit/editor-common/utils"); var _state = require("@atlaskit/editor-prosemirror/state"); var _prosemirrorHistory = require("@atlaskit/prosemirror-history"); var _experiments = require("@atlaskit/tmp-editor-statsig/experiments"); var _actions = require("./actions"); var _pluginKey = require("./plugin-key"); var _shouldReplaceLink = require("./shouldReplaceLink"); var _utils2 = require("./utils"); 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; } 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; } /** * Attempt to replace the link into the respective card. */ function replaceLinksToCards(tr, cardAdf, schema, request) { var inlineCard = schema.nodes.inlineCard; var url = request.url; if (!(0, _adfSchema.isSafeUrl)(url)) { return; } // replace all the outstanding links with their cards var pos = tr.mapping.map(request.pos); var $pos = tr.doc.resolve(pos); var $head = tr.selection.$head; var node = tr.doc.nodeAt(pos); if (!node || !node.type.isText) { return; } var replaceLink = request.shouldReplaceLink || (0, _shouldReplaceLink.shouldReplaceLink)(node, request.compareLinkText, url); if (!replaceLink) { return; } // ED-5638: add an extra space after inline cards to avoid re-rendering them var nodes = [cardAdf]; if (cardAdf.type === inlineCard) { nodes.push(schema.text(' ')); } tr.replaceWith(pos, pos + (node.text || url).length, nodes); var annotationMarksForPos = (0, _utils.getAnnotationMarksForPos)($head); if (annotationMarksForPos && annotationMarksForPos.length > 0) { annotationMarksForPos.forEach(function (annotationMark) { // Add the annotation mark on to the inlineCard node and the trailing space node. tr.addMark(pos, pos + nodes[0].nodeSize + nodes[1].nodeSize, annotationMark); }); } return $pos.node($pos.depth - 1).type.name; } var replaceQueuedUrlWithCard = exports.replaceQueuedUrlWithCard = function replaceQueuedUrlWithCard(url, cardData, analyticsAction, editorAnalyticsApi, createAnalyticsEvent, embedCardNodeTransformer) { return function (editorState, dispatch) { var state = _pluginKey.pluginKey.getState(editorState); if (!state) { return false; } // find the requests for this URL var requests = state.requests.filter(function (req) { return req.url === url; }); // try to transform response to ADF var schema = editorState.schema; var cardAdf = null; // If an embed card transformer is provided and the resolved card is an embedCard, // attempt to transform it into an alternative node representation first. if (cardData.type === 'embedCard' && embedCardNodeTransformer) { var _embedCardNodeTransfo; cardAdf = (_embedCardNodeTransfo = embedCardNodeTransformer(schema, cardData.attrs)) !== null && _embedCardNodeTransfo !== void 0 ? _embedCardNodeTransfo : null; } if (!cardAdf) { var _processRawValue; cardAdf = (_processRawValue = (0, _utils.processRawValue)(schema, cardData)) !== null && _processRawValue !== void 0 ? _processRawValue : null; } var tr = editorState.tr; if (cardAdf) { // Should prevent any other node than cards? [inlineCard, blockCard].includes(cardAdf.type) var nodeContexts = requests.map(function (request) { return replaceLinksToCards(tr, cardAdf, schema, request); }).filter(function (context) { return !!context; }); // context exist // Send analytics information if (nodeContexts.length) { var nodeContext = nodeContexts.every(function (context) { return context === nodeContexts[0]; }) ? nodeContexts[0] : 'mixed'; /** For block links v1, default to inline links */ var nodeType = 'inlineCard'; var _url$split = url.split('/'), _url$split2 = (0, _slicedToArray2.default)(_url$split, 3), domainName = _url$split2[2]; if (state.smartLinkEvents) { state.smartLinkEvents.insertSmartLink(domainName, 'inline', createAnalyticsEvent); } /** * TODO: * What if each request has a different source? * Unlikely, but need to define behaviour. * Ignore analytics event? take first? provide 'mixed' as well? */ var inputMethod = requests[0].source; var sourceEvent = requests[0].sourceEvent; editorAnalyticsApi === null || editorAnalyticsApi === void 0 || editorAnalyticsApi.attachAnalyticsEvent({ // eslint-disable-next-line @typescript-eslint/no-explicit-any action: analyticsAction || _analytics.ACTION.INSERTED, actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT, actionSubjectId: _analytics.ACTION_SUBJECT_ID.SMART_LINK, eventType: _analytics.EVENT_TYPE.TRACK, attributes: { inputMethod: inputMethod, nodeType: nodeType, nodeContext: nodeContext, fromCurrentDomain: (0, _utils.isFromCurrentDomain)(url) }, nonPrivacySafeAttributes: { domainName: domainName } })(tr); (0, _card.addLinkMetadata)(editorState.selection, tr, { action: analyticsAction, inputMethod: inputMethod, cardAction: 'RESOLVE', sourceEvent: sourceEvent }); } } if (dispatch) { dispatch((0, _actions.resolveCard)(url)((0, _prosemirrorHistory.closeHistory)(tr))); } return true; }; }; var handleFallbackWithAnalytics = exports.handleFallbackWithAnalytics = function handleFallbackWithAnalytics(request, editorAnalyticsApi) { return function (state, dispatch) { var cardState = _pluginKey.pluginKey.getState(state); if (!cardState) { return false; } var tr = state.tr; if (request.source !== _analytics.INPUT_METHOD.FLOATING_TB) { editorAnalyticsApi === null || editorAnalyticsApi === void 0 || editorAnalyticsApi.attachAnalyticsEvent((0, _utils.getLinkCreationAnalyticsEvent)(request.source, request.url))(tr); } (0, _card.addLinkMetadata)(state.selection, tr, { action: request.analyticsAction, inputMethod: request.source, sourceEvent: request.sourceEvent }); if (dispatch) { dispatch((0, _actions.resolveCard)(request.url)(tr)); } return true; }; }; var queueCardsFromChangedTr = exports.queueCardsFromChangedTr = function queueCardsFromChangedTr(state, tr, source, analyticsAction) { var normalizeLinkText = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; var sourceEvent = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined; var appearance = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 'inline'; var schema = state.schema; var link = schema.marks.link; var requests = []; (0, _utils.nodesBetweenChanged)(tr, function (node, pos) { if (!node.isText) { return true; } var linkMark = node.marks.find(function (mark) { return mark.type === link; }); if (linkMark) { if (!(0, _shouldReplaceLink.shouldReplaceLink)(node, normalizeLinkText)) { return false; } requests.push({ url: linkMark.attrs.href, pos: pos, appearance: appearance, compareLinkText: normalizeLinkText, source: source, analyticsAction: analyticsAction, sourceEvent: sourceEvent }); } return false; }); if (analyticsAction) { (0, _card.addLinkMetadata)(state.selection, tr, { action: analyticsAction }); } return (0, _actions.queueCards)(requests)(tr); }; var queueCardFromChangedTr = exports.queueCardFromChangedTr = function queueCardFromChangedTr(state, tr, source, analyticsAction) { var normalizeLinkText = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; var sourceEvent = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined; var previousAppearance = arguments.length > 6 ? arguments[6] : undefined; var schema = state.schema; var link = schema.marks.link; var requests = []; (0, _utils.nodesBetweenChanged)(tr, function (node, pos) { if (!node.isText) { return true; } var linkMark = node.marks.find(function (mark) { return mark.type === link; }); if (linkMark) { if (!(0, _shouldReplaceLink.shouldReplaceLink)(node, normalizeLinkText)) { return false; } requests.push({ url: linkMark.attrs.href, pos: pos, appearance: 'inline', previousAppearance: previousAppearance, compareLinkText: normalizeLinkText, source: source, analyticsAction: analyticsAction, sourceEvent: sourceEvent }); } return false; }); (0, _card.addLinkMetadata)(state.selection, tr, { action: analyticsAction }); return (0, _actions.queueCards)(requests)(tr); }; var convertHyperlinkToSmartCard = exports.convertHyperlinkToSmartCard = function convertHyperlinkToSmartCard(state, source, appearance) { var normalizeLinkText = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; var schema = state.schema; var link = schema.marks.link; var requests = []; var createRequest = function createRequest(linkMark, pos) { return { url: linkMark.attrs.href, pos: pos, appearance: appearance, previousAppearance: 'url', compareLinkText: normalizeLinkText, source: source, analyticsAction: _analytics.ACTION.CHANGED_TYPE, shouldReplaceLink: true }; }; if ((0, _experiments.editorExperiment)('platform_editor_controls', 'variant1')) { var activeLinkMark = (0, _link.getActiveLinkMark)(state); if (activeLinkMark) { var linkMark = activeLinkMark.node.marks.find(function (mark) { return mark.type === link; }); if (linkMark) { requests.push(createRequest(linkMark, activeLinkMark.pos)); } } } else { state.tr.doc.nodesBetween(state.selection.from, state.selection.to, function (node, pos) { var linkMark = node.marks.find(function (mark) { return mark.type === link; }); if (linkMark) { requests.push(createRequest(linkMark, pos)); } }); } (0, _card.addLinkMetadata)(state.selection, state.tr, { action: _analytics.ACTION.CHANGED_TYPE }); return (0, _actions.queueCards)(requests)(state.tr); }; var changeSelectedCardToLink = exports.changeSelectedCardToLink = function changeSelectedCardToLink(text, href, sendAnalytics, node, pos, editorAnalyticsApi) { return function (state, dispatch) { var selectedNode = state.selection instanceof _state.NodeSelection ? state.selection.node : undefined; var tr; if (node && pos) { tr = cardNodeToLinkWithTransaction(state, text, href, node, pos); } else { tr = cardToLinkWithTransaction(state, text, href); } updateDatasourceStash(tr, selectedNode); if (sendAnalytics) { if (selectedNode) { editorAnalyticsApi === null || editorAnalyticsApi === void 0 || editorAnalyticsApi.attachAnalyticsEvent({ action: _analytics.ACTION.CHANGED_TYPE, actionSubject: _analytics.ACTION_SUBJECT.SMART_LINK, eventType: _analytics.EVENT_TYPE.TRACK, attributes: { newType: _analytics.SMART_LINK_TYPE.URL, previousType: (0, _utils2.appearanceForNodeType)(selectedNode.type) } })(tr); } } if (dispatch) { dispatch(tr.scrollIntoView()); } return true; }; }; var changeSelectedCardToLinkFallback = exports.changeSelectedCardToLinkFallback = function changeSelectedCardToLinkFallback(text, href, sendAnalytics, node, pos, editorAnalyticsApi) { return function (state, dispatch) { var tr; if (node && pos) { tr = cardNodeToLinkWithTransaction(state, text, href, node, pos); } else { tr = cardToLinkWithTransaction(state, text, href); } if (sendAnalytics) { editorAnalyticsApi === null || editorAnalyticsApi === void 0 || editorAnalyticsApi.attachAnalyticsEvent({ action: _analytics.ACTION.ERRORED, actionSubject: _analytics.ACTION_SUBJECT.SMART_LINK, eventType: _analytics.EVENT_TYPE.OPERATIONAL, attributes: { error: 'Smart card falling back to link.' } })(tr); } if (dispatch) { dispatch(tr.setMeta('addToHistory', false)); } return true; }; }; var updateCard = exports.updateCard = function updateCard(href, sourceEvent) { return function (state, dispatch) { var selectedNode = state.selection instanceof _state.NodeSelection && state.selection.node; if (!selectedNode) { return false; } var cardAppearance = (0, _utils2.selectedCardAppearance)(state); var tr = cardToLinkWithTransaction(state, href, href); queueCardFromChangedTr(state, tr, _analytics.INPUT_METHOD.MANUAL, _analytics.ACTION.UPDATED, undefined, sourceEvent, cardAppearance); if (dispatch) { dispatch(tr.scrollIntoView()); } return true; }; }; function cardToLinkWithTransaction(state, text, href) { var selectedNode = state.selection instanceof _state.NodeSelection && state.selection.node; if (!selectedNode) { return state.tr; } var link = state.schema.marks.link; var url = selectedNode.attrs.url || selectedNode.attrs.data.url; var tr = state.tr.replaceSelectionWith(state.schema.text(text || url, [link.create({ href: href || url })]), false); return tr; } function cardNodeToLinkWithTransaction(state, text, href, node, pos) { var link = state.schema.marks.link; var url = node.attrs.url || node.attrs.data.url; return state.tr.replaceWith(pos, pos + node.nodeSize, state.schema.text(text || url, [link.create({ href: href || url })])); } var changeSelectedCardToText = exports.changeSelectedCardToText = function changeSelectedCardToText(text, editorAnalyticsApi) { return function (state, dispatch) { var selectedNode = state.selection instanceof _state.NodeSelection && state.selection.node; if (!selectedNode) { return false; } var tr = state.tr.replaceSelectionWith(state.schema.text(text), false); if (dispatch) { (0, _card.addLinkMetadata)(state.selection, tr, { action: _analytics.ACTION.UNLINK }); tr.scrollIntoView(); editorAnalyticsApi === null || editorAnalyticsApi === void 0 || editorAnalyticsApi.attachAnalyticsEvent((0, _analytics.unlinkPayload)(_analytics.ACTION_SUBJECT_ID.CARD_INLINE))(tr); dispatch(tr); } return true; }; }; var setSelectedCardAppearance = exports.setSelectedCardAppearance = function setSelectedCardAppearance(appearance, editorAnalyticsApi) { return function (state, dispatch) { var _selectedNode$attrs$d, _previousNode$type; var selectedNode = state.selection instanceof _state.NodeSelection ? state.selection.node : undefined; if (!selectedNode) { // When there is no selected node, we insert a new one // and replace the existing blue link var _tr = convertHyperlinkToSmartCard(state, _analytics.INPUT_METHOD.FLOATING_TB, appearance); if (dispatch) { (0, _card.addLinkMetadata)(state.selection, _tr, { action: _analytics.ACTION.CHANGED_TYPE }); dispatch(_tr.scrollIntoView()); } return false; } if ((0, _utils2.appearanceForNodeType)(selectedNode.type) === appearance && !selectedNode.attrs.datasource) { return false; } var attrs = (0, _experiments.editorExperiment)('platform_synced_block', true) ? getAttrsForAppearance(appearance, selectedNode, state.selection.$from.parent.type.name === 'bodiedSyncBlock') : getAttrsForAppearance(appearance, selectedNode); var _state$selection = state.selection, from = _state$selection.from, to = _state$selection.to; var nodeType = getLinkNodeType(appearance, state.schema.nodes); var tr = state.tr.setNodeMarkup(from, nodeType, attrs, selectedNode.marks); // If switching to embed appearance, attempt to use a registered transform command // to create an alternative node representation (e.g. a native embed). if (appearance === 'embed' && (selectedNode.attrs.url || (_selectedNode$attrs$d = selectedNode.attrs.data) !== null && _selectedNode$attrs$d !== void 0 && _selectedNode$attrs$d.url)) { var _cardState$embedCardT; var cardState = _pluginKey.pluginKey.getState(state); var createEmbedCardTransformCommand = cardState === null || cardState === void 0 || (_cardState$embedCardT = cardState.embedCardTransformers) === null || _cardState$embedCardT === void 0 ? void 0 : _cardState$embedCardT.createEmbedCardTransformCommand; if (createEmbedCardTransformCommand) { var transformCommand = createEmbedCardTransformCommand({ editorAnalyticsApi: editorAnalyticsApi, augmentTransaction: function augmentTransaction(augmentTr) { updateDatasourceStash(augmentTr, selectedNode); editorAnalyticsApi === null || editorAnalyticsApi === void 0 || editorAnalyticsApi.attachAnalyticsEvent({ action: _analytics.ACTION.CHANGED_TYPE, actionSubject: _analytics.ACTION_SUBJECT.SMART_LINK, eventType: _analytics.EVENT_TYPE.TRACK, attributes: { newType: appearance, previousType: (0, _utils2.appearanceForNodeType)(selectedNode.type) } })(augmentTr); (0, _card.addLinkMetadata)(state.selection, augmentTr, { action: _analytics.ACTION.CHANGED_TYPE }); } }); if (transformCommand(state, dispatch)) { return true; } } } updateDatasourceStash(tr, selectedNode); // When the selected card is the last element in the doc we add a new paragraph after it for consistent replacement if (tr.doc.nodeSize - 2 === to) { tr.insertText(' ', to); } tr.setSelection(_state.TextSelection.create(tr.doc, to + 1)); var previousNodePos = from - 1 > 0 ? from - 1 : 0; var previousNode = tr.doc.nodeAt(previousNodePos); if ((previousNode === null || previousNode === void 0 || (_previousNode$type = previousNode.type) === null || _previousNode$type === void 0 ? void 0 : _previousNode$type.name) === 'paragraph') { tr.delete(previousNodePos, from); } editorAnalyticsApi === null || editorAnalyticsApi === void 0 || editorAnalyticsApi.attachAnalyticsEvent({ action: _analytics.ACTION.CHANGED_TYPE, actionSubject: _analytics.ACTION_SUBJECT.SMART_LINK, eventType: _analytics.EVENT_TYPE.TRACK, attributes: { newType: appearance, previousType: (0, _utils2.appearanceForNodeType)(selectedNode.type) } })(tr); (0, _card.addLinkMetadata)(state.selection, tr, { action: _analytics.ACTION.CHANGED_TYPE }); if (dispatch) { dispatch(tr.scrollIntoView()); } return true; }; }; var getLinkNodeType = exports.getLinkNodeType = function getLinkNodeType(appearance, linkNodes) { switch (appearance) { case 'inline': return linkNodes.inlineCard; case 'block': return linkNodes.blockCard; case 'embed': return linkNodes.embedCard; } }; // Apply an update made from a datasource ui interaction var updateCardViaDatasource = exports.updateCardViaDatasource = function updateCardViaDatasource(args) { var state = args.state, node = args.node, newAdf = args.newAdf, view = args.view, sourceEvent = args.sourceEvent, isDeletingConfig = args.isDeletingConfig, inputMethod = args.inputMethod; var tr = state.tr, _state$selection2 = state.selection, from = _state$selection2.from, to = _state$selection2.to, schemaNodes = state.schema.nodes; if (newAdf.type === 'blockCard') { var _node$attrs, _newAdf$attrs; if ((_node$attrs = node.attrs) !== null && _node$attrs !== void 0 && _node$attrs.datasource && (_newAdf$attrs = newAdf.attrs) !== null && _newAdf$attrs !== void 0 && _newAdf$attrs.datasource) { var _ref3, _ref6, _oldViews$properties, _newViews$properties; var newAttrs = newAdf.attrs; var oldAttrs = node.attrs; var _ref = (_ref3 = newAttrs.datasource.views) !== null && _ref3 !== void 0 ? _ref3 : [], _ref2 = (0, _slicedToArray2.default)(_ref, 1), newViews = _ref2[0]; var _ref4 = (_ref6 = oldAttrs.datasource.views) !== null && _ref6 !== void 0 ? _ref6 : [], _ref5 = (0, _slicedToArray2.default)(_ref4, 1), oldViews = _ref5[0]; var isColumnChange = !(0, _isEqual.default)(oldViews === null || oldViews === void 0 || (_oldViews$properties = oldViews.properties) === null || _oldViews$properties === void 0 ? void 0 : _oldViews$properties.columns, newViews === null || newViews === void 0 || (_newViews$properties = newViews.properties) === null || _newViews$properties === void 0 ? void 0 : _newViews$properties.columns); var isUrlChange = newAttrs.url !== oldAttrs.url; if (isColumnChange || isUrlChange) { tr.setNodeMarkup(from, schemaNodes.blockCard, _objectSpread(_objectSpread({}, oldAttrs), newAdf.attrs)); } } else if (node.type.isText) { // url to datasource var link; state.doc.nodesBetween(from, to, function (node, pos) { // get the actual start position of a link within the node var linkMark = node.marks.find(function (mark) { return mark.type === state.schema.marks.link; }); if (linkMark) { link = { url: linkMark.attrs.href, text: node.text, pos: pos }; return false; } return true; }); if (link) { var newNode = schemaNodes.blockCard.createChecked(newAdf.attrs); tr.replaceWith(link.pos, link.pos + (link.text || link.url).length, [newNode]); } } else { // inline or blockCard to datasource tr.setNodeMarkup(from, schemaNodes.blockCard, newAdf.attrs); } } else if (newAdf.type === 'inlineCard') { // card type to inlineCard tr.setNodeMarkup(from, schemaNodes.inlineCard, newAdf.attrs); } (0, _card.addLinkMetadata)(state.selection, tr, { action: _analytics.ACTION.UPDATED, sourceEvent: sourceEvent, inputMethod: inputMethod }); if (isDeletingConfig) { if (typeof node.attrs.url === 'string') { (0, _actions.removeDatasourceStash)(tr, node.attrs.url); } } else { (0, _actions.hideDatasourceModal)(tr); } view.dispatch(tr.scrollIntoView()); }; var insertDatasource = exports.insertDatasource = function insertDatasource(state, adf, view, sourceEvent) { var tr = state.tr, from = state.selection.from, schemaNodes = state.schema.nodes; var attrs = adf.attrs, type = adf.type; var schemaNode = type === 'inlineCard' ? schemaNodes.inlineCard : schemaNodes.blockCard; var newNode = schemaNode.createChecked(attrs); // 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 // this will allow us to deal with insertions from multiple paths in a more consistent way newNode && tr.insert(from, newNode); (0, _actions.hideDatasourceModal)(tr); (0, _card.addLinkMetadata)(state.selection, tr, { action: _analytics.ACTION.INSERTED, sourceEvent: sourceEvent }); view.dispatch(tr.scrollIntoView()); }; /** * Get attributes for new Card Appearance */ var getAttrsForAppearance = exports.getAttrsForAppearance = function getAttrsForAppearance(appearance, selectedNode) { var isInsideBodiedSyncBlock = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; if (appearance === 'embed') { var _selectedNode$attrs$w; return _objectSpread(_objectSpread({}, selectedNode.attrs), {}, { layout: 'center' }, isInsideBodiedSyncBlock ? // When converting to embed, width attribute is set to null and when the document is published, the width attribute is set to 100 as per schema default // For editor, width is not required to render the embed card, but it's required in renderer // Because sync block has nested renderer in editor, we need width to be defined even in editor so embed in reference sync block can be rendered properly { width: (_selectedNode$attrs$w = selectedNode.attrs.width) !== null && _selectedNode$attrs$w !== void 0 ? _selectedNode$attrs$w : 100 } : {}); } if ((0, _utils2.isDatasourceNode)(selectedNode)) { return { url: selectedNode.attrs.url }; } return selectedNode.attrs; }; var updateDatasourceStash = function updateDatasourceStash(tr, selectedNode) { if ((0, _utils2.isDatasourceNode)(selectedNode) && !(0, _utils2.isDatasourceConfigEditable)(selectedNode.attrs.datasource.id) && selectedNode.attrs.url) { (0, _actions.setDatasourceStash)(tr, { url: selectedNode.attrs.url, views: selectedNode.attrs.datasource.views }); } };