You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							92 lines
						
					
					
						
							2.7 KiB
						
					
					
				
			
		
		
	
	
							92 lines
						
					
					
						
							2.7 KiB
						
					
					
				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/commands';
 | 
						|
import { tableEditing, columnResizing, tableNodes, fixTables } from './src';
 | 
						|
 | 
						|
let 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,
 | 
						|
});
 | 
						|
 | 
						|
let menu = buildMenuItems(schema).fullMenu;
 | 
						|
function item(label, cmd) {
 | 
						|
  return new MenuItem({ label, select: cmd, run: cmd });
 | 
						|
}
 | 
						|
let 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' })]);
 | 
						|
 | 
						|
let doc = DOMParser.fromSchema(schema).parse(
 | 
						|
  document.querySelector('#content'),
 | 
						|
);
 | 
						|
let state = EditorState.create({
 | 
						|
  doc,
 | 
						|
  plugins: [
 | 
						|
    columnResizing(),
 | 
						|
    tableEditing(),
 | 
						|
    keymap({
 | 
						|
      Tab: goToNextCell(1),
 | 
						|
      'Shift-Tab': goToNextCell(-1),
 | 
						|
    }),
 | 
						|
  ].concat(exampleSetup({ schema, menuContent: menu })),
 | 
						|
});
 | 
						|
let fix = fixTables(state);
 | 
						|
if (fix) state = state.apply(fix.setMeta('addToHistory', false));
 | 
						|
 | 
						|
window.view = new EditorView(document.querySelector('#editor'), { state });
 | 
						|
 | 
						|
document.execCommand('enableObjectResizing', false, false);
 | 
						|
document.execCommand('enableInlineTableEditing', false, false);
 |