UNPKG

@atlaskit/editor-plugin-status

Version:

Status plugin for @atlaskit/editor-core

180 lines 7.61 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; 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) { _defineProperty(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; } import { uuid } from '@atlaskit/adf-schema'; import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE, INPUT_METHOD } from '@atlaskit/editor-common/analytics'; import { withAnalytics } from '@atlaskit/editor-common/editor-analytics'; import { getAnnotationMarksForPos } from '@atlaskit/editor-common/utils'; import { Fragment } from '@atlaskit/editor-prosemirror/model'; import { NodeSelection, Selection } from '@atlaskit/editor-prosemirror/state'; import { canInsert } from '@atlaskit/editor-prosemirror/utils'; import { fg } from '@atlaskit/platform-feature-flags'; import { pluginKey } from './plugin-key'; export var DEFAULT_STATUS = { text: '', color: 'neutral' }; export var DEFAULT_STATUS_NEW = { text: '', color: 'neutral', style: 'mixedCase' }; export var verifyAndInsertStatus = function verifyAndInsertStatus(statusNode, tr, annotationMarks) { var fragment = Fragment.fromArray([statusNode, tr.doc.type.schema.text(' ', annotationMarks)]); var insertable = canInsert(tr.selection.$from, fragment); if (!insertable) { var parentSelection = NodeSelection.create(tr.doc, tr.selection.from - tr.selection.$anchor.parentOffset - 1); tr.insert(parentSelection.to, fragment).setSelection(NodeSelection.create(tr.doc, parentSelection.to + 1)); } else { tr.insert(tr.selection.from, fragment).setSelection(NodeSelection.create(tr.doc, tr.selection.from - fragment.size)); } return tr.setMeta(pluginKey, { showStatusPickerAt: tr.selection.from, isNew: true }).scrollIntoView(); }; export var createStatus = function createStatus(tr) { var annotationMarksForPos = getAnnotationMarksForPos(tr.selection.$head); var statusNode = tr.doc.type.schema.nodes.status.createChecked(_objectSpread(_objectSpread({}, fg('platform-dst-lozenge-tag-badge-visual-uplifts') ? DEFAULT_STATUS_NEW : DEFAULT_STATUS), {}, { localId: uuid.generate() }), null, annotationMarksForPos); return verifyAndInsertStatus(statusNode, tr, annotationMarksForPos); }; export var insertStatus = function insertStatus(editorAnalyticsAPI) { return function () { var inputMethod = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : INPUT_METHOD.TOOLBAR; return function (_ref) { var tr = _ref.tr; var statusTr = createStatus(tr); editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({ action: ACTION.INSERTED, actionSubject: ACTION_SUBJECT.DOCUMENT, actionSubjectId: ACTION_SUBJECT_ID.STATUS, attributes: { inputMethod: inputMethod }, eventType: EVENT_TYPE.TRACK })(statusTr); return statusTr; }; }; }; export var updateStatus = function updateStatus(status) { return function (state, dispatch) { var schema = state.schema; var selectedStatus = status ? Object.assign(status, { text: status.text.trim(), localId: status.localId || uuid.generate() }) : status; var statusProps = _objectSpread(_objectSpread({}, fg('platform-dst-lozenge-tag-badge-visual-uplifts') ? DEFAULT_STATUS_NEW : DEFAULT_STATUS), selectedStatus); var tr = state.tr; var _ref2 = pluginKey.getState(state) || {}, showStatusPickerAt = _ref2.showStatusPickerAt; if (!showStatusPickerAt) { // Same behaviour as quick insert (used in createStatus) var statusNode = schema.nodes.status.createChecked(statusProps); tr = verifyAndInsertStatus(statusNode, state.tr); if (dispatch) { dispatch(tr); } return true; } if (state.doc.nodeAt(showStatusPickerAt)) { tr.setNodeMarkup(showStatusPickerAt, schema.nodes.status, statusProps).setSelection(NodeSelection.create(tr.doc, showStatusPickerAt)).setMeta(pluginKey, { showStatusPickerAt: showStatusPickerAt }).scrollIntoView(); if (dispatch) { dispatch(tr); } return true; } return false; }; }; export var updateStatusWithAnalytics = function updateStatusWithAnalytics(editorAnalyticsAPI) { return function (inputMethod, status) { return withAnalytics(editorAnalyticsAPI, { action: ACTION.INSERTED, actionSubject: ACTION_SUBJECT.DOCUMENT, actionSubjectId: ACTION_SUBJECT_ID.STATUS, attributes: { inputMethod: inputMethod }, eventType: EVENT_TYPE.TRACK })(updateStatus(status)); }; }; export var setStatusPickerAt = function setStatusPickerAt(showStatusPickerAt) { return function (state, dispatch) { dispatch(state.tr.setMeta(pluginKey, { showStatusPickerAt: showStatusPickerAt, isNew: false })); return true; }; }; export var removeStatus = function removeStatus(showStatusPickerAt) { return function (_ref3) { var tr = _ref3.tr; tr.replace(showStatusPickerAt, showStatusPickerAt + 1); return tr; }; }; export var setFocusOnStatusInput = function setFocusOnStatusInput() { return function (state, dispatch) { if (!dispatch) { return false; } var tr = state.tr.setMeta(pluginKey, { focusStatusInput: true }); dispatch(tr); return true; }; }; var handleClosingByArrows = function handleClosingByArrows(closingMethod, state, showStatusPickerAt, tr) { if (closingMethod === 'arrowLeft') { // put cursor right before status Lozenge tr = tr.setSelection(Selection.near(state.tr.doc.resolve(showStatusPickerAt), -1)); } else if (closingMethod === 'arrowRight') { // put cursor right after status Lozenge tr = tr.setSelection(Selection.near(state.tr.doc.resolve(showStatusPickerAt + 1))); } }; export var commitStatusPicker = function commitStatusPicker(closingPayload) { return function (editorView) { var state = editorView.state, dispatch = editorView.dispatch; var _ref4 = pluginKey.getState(state) || {}, showStatusPickerAt = _ref4.showStatusPickerAt; var _ref5 = closingPayload || {}, closingMethod = _ref5.closingMethod; if (!showStatusPickerAt) { return; } var statusNode = state.tr.doc.nodeAt(showStatusPickerAt); if (!statusNode) { return; } var tr = state.tr; tr = tr.setMeta(pluginKey, { showStatusPickerAt: null, focusStatusInput: false, isNew: false }); if (closingMethod) { handleClosingByArrows(closingMethod, state, showStatusPickerAt, tr); } else if (statusNode.attrs.text) { // still has content - keep content // move selection after status if selection did not change if (tr.selection.from === showStatusPickerAt) { tr = tr.setSelection(Selection.near(state.tr.doc.resolve(showStatusPickerAt + 2))); } } else { // no content - remove node tr = tr.delete(showStatusPickerAt, showStatusPickerAt + 1); } dispatch(tr); editorView.focus(); }; };