feat: Add date and time slash commands to block menu

This commit is contained in:
Tom Moor
2022-04-07 18:50:50 -07:00
parent 63ed015a86
commit 1f93027c97
5 changed files with 52 additions and 5 deletions

View File

@@ -1,11 +1,13 @@
import { InputRule } from "prosemirror-inputrules";
import { Schema } from "prosemirror-model";
import { EditorState } from "prosemirror-state";
import {
getCurrentDateAsString,
getCurrentDateTimeAsString,
getCurrentTimeAsString,
} from "../../utils/date";
import Extension from "../lib/Extension";
import { EventType } from "../types";
import { Dispatch, EventType } from "../types";
/**
* An editor extension that adds commands to insert the current date and time.
@@ -18,22 +20,41 @@ export default class DateTime extends Extension {
inputRules() {
return [
// Note: There is a space at the end of the pattern here otherwise the
// /datetime rule can never be matched.
// /datetime rule can never be matched.
// these extra input patterns are needed until the block menu matches
// in places other than the start of a line
new InputRule(/\/date\s$/, ({ tr }, _match, start, end) => {
tr.delete(start, end).insertText(getCurrentDateAsString() + " ");
this.editor.events.emit(EventType.blockMenuClose);
return tr;
}),
new InputRule(/\/time$/, ({ tr }, _match, start, end) => {
new InputRule(/\/time\s$/, ({ tr }, _match, start, end) => {
tr.delete(start, end).insertText(getCurrentTimeAsString() + " ");
this.editor.events.emit(EventType.blockMenuClose);
return tr;
}),
new InputRule(/\/datetime$/, ({ tr }, _match, start, end) => {
new InputRule(/\/datetime\s$/, ({ tr }, _match, start, end) => {
tr.delete(start, end).insertText(`${getCurrentDateTimeAsString()} `);
this.editor.events.emit(EventType.blockMenuClose);
return tr;
}),
];
}
commands(_options: { schema: Schema }) {
return {
date: () => (state: EditorState, dispatch: Dispatch) => {
dispatch(state.tr.insertText(getCurrentDateAsString() + " "));
return true;
},
time: () => (state: EditorState, dispatch: Dispatch) => {
dispatch(state.tr.insertText(getCurrentTimeAsString() + " "));
return true;
},
datetime: () => (state: EditorState, dispatch: Dispatch) => {
dispatch(state.tr.insertText(getCurrentDateTimeAsString() + " "));
return true;
},
};
}
}