UNPKG

@atlaskit/editor-plugin-date

Version:

Date plugin for @atlaskit/editor-core

107 lines (106 loc) 4.15 kB
import { ACTION, ACTION_SUBJECT, EVENT_TYPE, INPUT_METHOD } from '@atlaskit/editor-common/analytics'; import { getAnnotationMarksForPos, todayTimestampInUTC } 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 { isToday } from '../ui/DatePicker/utils/internal'; import { pluginKey } from './plugin-key'; export var createDate = function createDate(isQuickInsertAction) { return function (state) { var tr = state.tr; var annotationMarksForPos = getAnnotationMarksForPos(tr.selection.$head); var dateNode = state.schema.nodes.date.createChecked({ timestamp: todayTimestampInUTC() }, null, annotationMarksForPos); var fragment = Fragment.fromArray([dateNode, state.schema.text(' ', annotationMarksForPos)]); 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)); } var newPluginState = { isQuickInsertAction: isQuickInsertAction, showDatePickerAt: tr.selection.from, isNew: true, isDateEmpty: false, focusDateInput: false, isInitialised: true }; return tr.setMeta(pluginKey, newPluginState); }; }; /** Focus input */ export var focusDateInput = function focusDateInput() { return function (state, dispatch) { var pluginState = pluginKey.getState(state); if (!pluginState || pluginState.showDatePickerAt === null) { return false; } if (!dispatch) { return false; } var tr = state.tr.setMeta(pluginKey, { focusDateInput: true }); dispatch(tr); return true; }; }; export var setDatePickerAt = function setDatePickerAt(showDatePickerAt) { return function (state, dispatch) { dispatch(state.tr.setMeta(pluginKey, { showDatePickerAt: showDatePickerAt })); return true; }; }; export var closeDatePicker = function closeDatePicker() { return function (state, dispatch) { var _ref = pluginKey.getState(state) || {}, showDatePickerAt = _ref.showDatePickerAt; if (!dispatch) { return false; } var tr = showDatePickerAt ? state.tr.setMeta(pluginKey, { showDatePickerAt: null, isNew: false }).setSelection(Selection.near(state.tr.doc.resolve(showDatePickerAt + 2))) : state.tr.setMeta(pluginKey, { isNew: false }); dispatch(tr); return false; }; }; export var closeDatePickerWithAnalytics = function closeDatePickerWithAnalytics(_ref2) { var _pluginInjectionApi$a; var date = _ref2.date, pluginInjectionApi = _ref2.pluginInjectionApi; pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a === void 0 || (_pluginInjectionApi$a = _pluginInjectionApi$a.actions) === null || _pluginInjectionApi$a === void 0 || _pluginInjectionApi$a.attachAnalyticsEvent({ eventType: EVENT_TYPE.TRACK, action: ACTION.COMMITTED, actionSubject: ACTION_SUBJECT.DATE, attributes: { commitMethod: INPUT_METHOD.BLUR, isValid: date !== undefined, isToday: isToday(date) } }); return closeDatePicker(); }; export var openDatePicker = function openDatePicker() { return function (state, dispatch) { var $from = state.selection.$from; var node = state.doc.nodeAt($from.pos); if (node && node.type.name === state.schema.nodes.date.name) { var showDatePickerAt = $from.pos; if (dispatch) { dispatch(state.tr.setMeta(pluginKey, { showDatePickerAt: showDatePickerAt }).setSelection(NodeSelection.create(state.doc, showDatePickerAt))); } } return false; }; };