123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- import 'prosemirror-view/style/prosemirror.css';
- import 'prosemirror-menu/style/menu.css';
- import 'prosemirror-example-setup/style/style.css';
- import 'prosemirror-gapcursor/style/gapcursor.css';
- import '../style/tables.css';
- import { EditorView } from 'prosemirror-view';
- import { EditorState } from 'prosemirror-state';
- import { DOMParser, Schema } from 'prosemirror-model';
- import { schema as baseSchema } from 'prosemirror-schema-basic';
- import { keymap } from 'prosemirror-keymap';
- import { exampleSetup, buildMenuItems } from 'prosemirror-example-setup';
- import { MenuItem, Dropdown } from 'prosemirror-menu';
- import {
- addColumnAfter,
- addColumnBefore,
- deleteColumn,
- addRowAfter,
- addRowBefore,
- deleteRow,
- mergeCells,
- splitCell,
- setCellAttr,
- toggleHeaderRow,
- toggleHeaderColumn,
- toggleHeaderCell,
- goToNextCell,
- deleteTable,
- } from '../src';
- import { tableEditing, columnResizing, tableNodes, fixTables } from '../src';
- const schema = new Schema({
- nodes: baseSchema.spec.nodes.append(
- tableNodes({
- tableGroup: 'block',
- cellContent: 'block+',
- cellAttributes: {
- background: {
- default: null,
- getFromDOM(dom) {
- return dom.style.backgroundColor || null;
- },
- setDOMAttr(value, attrs) {
- if (value)
- attrs.style = (attrs.style || '') + `background-color: ${value};`;
- },
- },
- },
- }),
- ),
- marks: baseSchema.spec.marks,
- });
- const menu = buildMenuItems(schema).fullMenu;
- function item(label: string, cmd: (state: EditorState) => boolean) {
- return new MenuItem({ label, select: cmd, run: cmd });
- }
- const tableMenu = [
- item('Insert column before', addColumnBefore),
- item('Insert column after', addColumnAfter),
- item('Delete column', deleteColumn),
- item('Insert row before', addRowBefore),
- item('Insert row after', addRowAfter),
- item('Delete row', deleteRow),
- item('Delete table', deleteTable),
- item('Merge cells', mergeCells),
- item('Split cell', splitCell),
- item('Toggle header column', toggleHeaderColumn),
- item('Toggle header row', toggleHeaderRow),
- item('Toggle header cells', toggleHeaderCell),
- item('Make cell green', setCellAttr('background', '#dfd')),
- item('Make cell not-green', setCellAttr('background', null)),
- ];
- menu.splice(2, 0, [new Dropdown(tableMenu, { label: 'Table' })]);
- const contentElement = document.querySelector('#content');
- if (!contentElement) {
- throw new Error('Failed to find #content');
- }
- const doc = DOMParser.fromSchema(schema).parse(contentElement);
- let state = EditorState.create({
- doc,
- plugins: [
- columnResizing(),
- tableEditing(),
- keymap({
- Tab: goToNextCell(1),
- 'Shift-Tab': goToNextCell(-1),
- }),
- ].concat(
- exampleSetup({
- schema,
- // @ts-expect-error: prosemirror-example-setup exports wrong types here.
- menuContent: menu,
- }),
- ),
- });
- const fix = fixTables(state);
- if (fix) state = state.apply(fix.setMeta('addToHistory', false));
- (window as any).view = new EditorView(document.querySelector('#editor'), {
- state,
- });
- document.execCommand('enableObjectResizing', false, 'false');
- document.execCommand('enableInlineTableEditing', false, 'false');
|