Files
outline/shared/editor/extensions/TrailingNode.ts
Tom Moor 75aea90972 chore: Editor 'plugin' -> 'extension'
They've always been called extensions, not sure why the folder was plugins. Part of ongoing spring cleaning
2023-04-09 17:27:09 -04:00

59 lines
1.6 KiB
TypeScript

import { NodeType } from "prosemirror-model";
import { Plugin, PluginKey } from "prosemirror-state";
import Extension from "../lib/Extension";
export default class TrailingNode extends Extension {
get name() {
return "trailing_node";
}
get defaultOptions() {
return {
node: "paragraph",
notAfter: ["paragraph", "heading"],
};
}
get plugins() {
const plugin = new PluginKey(this.name);
const disabledNodes = Object.entries(this.editor.schema.nodes)
.map(([, value]) => value)
.filter((node: NodeType) => this.options.notAfter.includes(node.name));
return [
new Plugin({
key: plugin,
view: () => ({
update: (view) => {
const { state } = view;
const insertNodeAtEnd = plugin.getState(state);
if (!insertNodeAtEnd) {
return;
}
const { doc, schema, tr } = state;
const type = schema.nodes[this.options.node];
const transaction = tr.insert(doc.content.size, type.create());
view.dispatch(transaction);
},
}),
state: {
init: (_, state) => {
const lastNode = state.tr.doc.lastChild;
return lastNode ? !disabledNodes.includes(lastNode.type) : false;
},
apply: (tr, value) => {
if (!tr.docChanged) {
return value;
}
const lastNode = tr.doc.lastChild;
return lastNode ? !disabledNodes.includes(lastNode.type) : false;
},
},
}),
];
}
}