@atlaskit/editor-plugin-date
Version:
Date plugin for @atlaskit/editor-core
107 lines (106 loc) • 4.15 kB
JavaScript
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;
};
};