@atlaskit/editor-plugin-extension
Version:
editor-plugin-extension plugin for @atlaskit/editor-core
270 lines (267 loc) • 13.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getContextPanel = exports.duplicateSelection = void 0;
exports.onChangeAction = onChangeAction;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _react = _interopRequireDefault(require("react"));
var _extensions = require("@atlaskit/editor-common/extensions");
var _selection = require("@atlaskit/editor-common/selection");
var _state = require("@atlaskit/editor-prosemirror/state");
var _cellSelection = require("@atlaskit/editor-tables/cell-selection");
var _actions = require("../editor-actions/actions");
var _commands = require("../editor-commands/commands");
var _pluginFactory = require("../pm-plugins/plugin-factory");
var _utils = require("../pm-plugins/utils");
var _ConfigPanelLoader = _interopRequireDefault(require("./ConfigPanel/ConfigPanelLoader"));
var _SaveIndicator = require("./SaveIndicator/SaveIndicator");
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; }
var areParametersEqual = function areParametersEqual(firstParameters, secondParameters) {
if ((0, _typeof2.default)(firstParameters) === 'object' && (0, _typeof2.default)(secondParameters) === 'object' && firstParameters !== null && secondParameters !== null) {
var firstKeys = Object.keys(firstParameters);
var secondKeys = Object.keys(secondParameters);
return firstKeys.length === secondKeys.length && firstKeys.every(function (key) {
return firstParameters[key] === secondParameters[key];
});
}
return firstParameters === secondParameters;
};
var duplicateSelection = exports.duplicateSelection = function duplicateSelection(selectionToDuplicate, doc) {
if (selectionToDuplicate instanceof _state.NodeSelection) {
return _state.NodeSelection.create(doc, selectionToDuplicate.from);
} else if (selectionToDuplicate instanceof _state.TextSelection) {
return _state.TextSelection.create(doc, selectionToDuplicate.from, selectionToDuplicate.to);
} else if (selectionToDuplicate instanceof _selection.GapCursorSelection) {
return new _selection.GapCursorSelection(doc.resolve(selectionToDuplicate.from), selectionToDuplicate.side);
} else if (selectionToDuplicate instanceof _cellSelection.CellSelection) {
return new _cellSelection.CellSelection(doc.resolve(selectionToDuplicate.$anchorCell.pos), doc.resolve(selectionToDuplicate.$headCell.pos));
}
};
var getContextPanel = exports.getContextPanel = function getContextPanel(getEditorView) {
return function (api, featureFlags) {
return function (state) {
var _api$contextPanel;
var nodeWithPos = (0, _utils.getSelectedExtension)(state, true);
var applyChange = api === null || api === void 0 || (_api$contextPanel = api.contextPanel) === null || _api$contextPanel === void 0 ? void 0 : _api$contextPanel.actions.applyChange;
// Adding checks to bail out early
if (!nodeWithPos) {
return;
}
var extensionState = (0, _pluginFactory.getPluginState)(state);
var autoSaveResolve = extensionState.autoSaveResolve,
autoSaveReject = extensionState.autoSaveReject,
showContextPanel = extensionState.showContextPanel,
extensionProvider = extensionState.extensionProvider,
processParametersBefore = extensionState.processParametersBefore,
processParametersAfter = extensionState.processParametersAfter;
if (extensionState && showContextPanel && extensionProvider && processParametersAfter) {
var _nodeWithPos$node$att = nodeWithPos.node.attrs,
extensionType = _nodeWithPos$node$att.extensionType,
extensionKey = _nodeWithPos$node$att.extensionKey,
parameters = _nodeWithPos$node$att.parameters;
var _getExtensionKeyAndNo = (0, _extensions.getExtensionKeyAndNodeKey)(extensionKey, extensionType),
_getExtensionKeyAndNo2 = (0, _slicedToArray2.default)(_getExtensionKeyAndNo, 2),
extKey = _getExtensionKeyAndNo2[0],
nodeKey = _getExtensionKeyAndNo2[1];
var configParams = processParametersBefore ? processParametersBefore(parameters || {}) : parameters;
return /*#__PURE__*/_react.default.createElement(_SaveIndicator.SaveIndicator, {
duration: 5000,
visible: true
}, function (_ref) {
var onSaveStarted = _ref.onSaveStarted,
onSaveEnded = _ref.onSaveEnded;
var editorView = getEditorView === null || getEditorView === void 0 ? void 0 : getEditorView();
if (!editorView) {
return null;
}
return /*#__PURE__*/_react.default.createElement(_ConfigPanelLoader.default, {
api: api,
showHeader: true,
closeOnEsc: true,
extensionType: extensionType,
extensionKey: extKey,
nodeKey: nodeKey,
extensionParameters: parameters,
parameters: configParams,
extensionProvider: extensionProvider,
autoSaveTrigger: autoSaveResolve,
autoSaveReject: autoSaveReject
// eslint-disable-next-line @atlassian/perf-linting/no-unstable-inline-props -- Ignored via go/ees017 (to be fixed)
,
onChange: ( /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(updatedParameters) {
return _regenerator.default.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return onChangeAction(editorView, updatedParameters, parameters, nodeWithPos, onSaveStarted);
case 2:
onSaveEnded();
if (autoSaveResolve) {
autoSaveResolve();
}
case 4:
case "end":
return _context.stop();
}
}, _callee);
}));
return function (_x) {
return _ref2.apply(this, arguments);
};
}())
// eslint-disable-next-line @atlassian/perf-linting/no-unstable-inline-props -- Ignored via go/ees017 (to be fixed)
,
onCancel: /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
return _regenerator.default.wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
_context2.next = 3;
return new Promise(function (resolve, reject) {
(0, _commands.forceAutoSave)(applyChange)(resolve, reject)(editorView.state, editorView.dispatch);
});
case 3:
_context2.next = 8;
break;
case 5:
_context2.prev = 5;
_context2.t0 = _context2["catch"](0);
// Even if the save failed, we should proceed with closing the panel
// eslint-disable-next-line no-console
console.error("Autosave failed with error", _context2.t0);
case 8:
(0, _commands.clearEditingContext)(applyChange)(editorView.state, editorView.dispatch);
case 9:
case "end":
return _context2.stop();
}
}, _callee2, null, [[0, 5]]);
})),
featureFlags: featureFlags
});
});
}
};
};
};
// Added this interface to handle the macroParams on Parameters
function onChangeAction(_x2) {
return _onChangeAction.apply(this, arguments);
}
function _onChangeAction() {
_onChangeAction = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(editorView) {
var updatedParameters,
oldParameters,
nodeWithPos,
onSaving,
_ref4,
processParametersAfter,
processParametersBefore,
unwrappedOldParameters,
key,
_ref5,
previousPositions,
newParameters,
_ref6,
positions,
node,
newNode,
positionUpdated,
transaction,
prevSelection,
selection,
positionsLess,
_args3 = arguments;
return _regenerator.default.wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
updatedParameters = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : {};
oldParameters = _args3.length > 2 && _args3[2] !== undefined ? _args3[2] : {};
nodeWithPos = _args3.length > 3 ? _args3[3] : undefined;
onSaving = _args3.length > 4 ? _args3[4] : undefined;
// WARNING: editorView.state stales quickly, do not unpack
_ref4 = (0, _pluginFactory.getPluginState)(editorView.state), processParametersAfter = _ref4.processParametersAfter, processParametersBefore = _ref4.processParametersBefore;
if (processParametersAfter) {
_context3.next = 7;
break;
}
return _context3.abrupt("return");
case 7:
unwrappedOldParameters = processParametersBefore ? processParametersBefore(oldParameters) : oldParameters;
if (!areParametersEqual(unwrappedOldParameters, updatedParameters)) {
_context3.next = 10;
break;
}
return _context3.abrupt("return");
case 10:
if (onSaving) {
onSaving();
}
key = Date.now();
_ref5 = (0, _pluginFactory.getPluginState)(editorView.state), previousPositions = _ref5.positions;
_context3.next = 15;
return (0, _commands.updateState)({
positions: _objectSpread(_objectSpread({}, previousPositions), {}, (0, _defineProperty2.default)({}, key, nodeWithPos.pos))
})(editorView.state, editorView.dispatch);
case 15:
_context3.next = 17;
return processParametersAfter(updatedParameters);
case 17:
newParameters = _context3.sent;
_ref6 = (0, _pluginFactory.getPluginState)(editorView.state), positions = _ref6.positions;
if (positions) {
_context3.next = 21;
break;
}
return _context3.abrupt("return");
case 21:
if (key in positions) {
_context3.next = 23;
break;
}
return _context3.abrupt("return");
case 23:
node = nodeWithPos.node;
newNode = (0, _actions.buildExtensionNode)(nodeWithPos.node.toJSON().type, editorView.state.schema, _objectSpread(_objectSpread({}, node.attrs), {}, {
parameters: _objectSpread(_objectSpread({}, oldParameters), newParameters)
}), node.content, node.marks);
if (newNode) {
_context3.next = 27;
break;
}
return _context3.abrupt("return");
case 27:
positionUpdated = positions[key];
transaction = editorView.state.tr.replaceWith(positionUpdated, positionUpdated + newNode.nodeSize, newNode); // Ensure we preserve the selection, tr.replaceWith causes it to be lost in some cases
// when replacing the node
prevSelection = editorView.state.selection;
if (!prevSelection.eq(transaction.selection)) {
selection = duplicateSelection(prevSelection, transaction.doc);
if (selection) {
transaction.setSelection(selection);
}
}
positionsLess = _objectSpread({}, (0, _pluginFactory.getPluginState)(editorView.state).positions);
delete positionsLess[key];
_context3.next = 35;
return (0, _commands.updateState)({
positions: positionsLess
})(editorView.state, editorView.dispatch);
case 35:
editorView.dispatch(transaction);
case 36:
case "end":
return _context3.stop();
}
}, _callee3);
}));
return _onChangeAction.apply(this, arguments);
}