1 import crel from "crelt"
2 import {prefix} from "./menu-utils";
3 import {insertTable} from "../commands";
5 class TableCreatorGrid {
13 // :: (EditorView) → {dom: dom.Node, update: (EditorState) → bool}
14 // Renders the submenu.
17 for (let y = 0; y < this.size; y++) {
18 for (let x = 0; x < this.size; x++) {
19 const elem = crel("div", {class: prefix + "-table-creator-grid-item"});
20 this.gridItems.push(elem);
21 elem.addEventListener('mouseenter', event => this.updateGridItemActiveStatus(elem));
25 const gridWrap = crel("div", {
26 class: prefix + "-table-creator-grid",
27 style: `grid-template-columns: repeat(${this.size}, 14px);`,
30 gridWrap.addEventListener('mouseleave', event => {
31 this.updateGridItemActiveStatus(null);
33 gridWrap.addEventListener('click', event => {
34 if (event.target.classList.contains(prefix + "-table-creator-grid-item")) {
35 const {x, y} = this.getPositionOfGridItem(event.target);
36 insertTable(y + 1, x + 1)(view.state, view.dispatch);
40 const gridLabel = crel("div", {class: prefix + "-table-creator-grid-label"});
41 this.label = gridLabel;
42 const wrap = crel("div", {class: prefix + "-table-creator-grid-container"}, [gridWrap, gridLabel]);
44 function update(state) {
48 return {dom: wrap, update}
52 * @param {Element|null} newTarget
54 updateGridItemActiveStatus(newTarget) {
55 const {x: xPos, y: yPos} = this.getPositionOfGridItem(newTarget);
57 for (let y = 0; y < this.size; y++) {
58 for (let x = 0; x < this.size; x++) {
59 const active = x <= xPos && y <= yPos;
60 const index = (y * this.size) + x;
61 this.gridItems[index].classList.toggle(prefix + "-table-creator-grid-item-active", active);
65 this.label.textContent = (xPos + yPos < 0) ? '' : `${xPos + 1} x ${yPos + 1}`;
69 * @param {Element} gridItem
70 * @return {{x: number, y: number}}
72 getPositionOfGridItem(gridItem) {
73 const index = this.gridItems.indexOf(gridItem);
74 const y = Math.floor(index / this.size);
75 const x = index % this.size;
80 export default TableCreatorGrid;