@lexical/table 0.1.13 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -38,26 +38,56 @@ class TableCellNode extends lexical.GridCellNode {
38
38
  }
39
39
 
40
40
  static clone(node) {
41
- return new TableCellNode(false, node.__colSpan, node.__key);
41
+ return new TableCellNode(new Set(node.__headerStyles), node.__colSpan, node.__key);
42
42
  }
43
43
 
44
- constructor(isHeader = false, colSpan = 1, key) {
44
+ constructor(headerStyles, colSpan = 1, key) {
45
45
  super(colSpan, key);
46
- this.__isHeader = isHeader;
47
- }
48
-
49
- getTag() {
50
- return this.__isHeader ? 'th' : 'td';
46
+ this.__headerStyles = headerStyles || new Set();
51
47
  }
52
48
 
53
49
  createDOM(config) {
54
50
  const element = document.createElement(this.getTag());
55
- addClassNamesToElement(element, config.theme.tableCell, this.__isHeader === true && config.theme.tableCellHeader);
51
+ addClassNamesToElement(element, config.theme.tableCell, this.hasHeader() && config.theme.TableCellHeaderStyles);
56
52
  return element;
57
53
  }
58
54
 
59
- updateDOM() {
60
- return false;
55
+ getTag() {
56
+ return this.hasHeader() ? 'th' : 'td';
57
+ }
58
+
59
+ setHeaderStyles(headerStyles) {
60
+ const self = this.getWritable();
61
+ self.__headerStyles = new Set(headerStyles);
62
+ return this.__headerStyles;
63
+ }
64
+
65
+ getHeaderStyles() {
66
+ return this.getLatest().__headerStyles;
67
+ }
68
+
69
+ toggleHeaderStyle(key) {
70
+ const self = this.getWritable();
71
+ const newHeaderValue = self.getHeaderStyles();
72
+
73
+ if (newHeaderValue.has(key)) {
74
+ newHeaderValue.delete(key);
75
+ } else {
76
+ newHeaderValue.add(key);
77
+ }
78
+
79
+ self.__headerStyles = new Set(newHeaderValue);
80
+ return self;
81
+ }
82
+
83
+ hasHeader() {
84
+ const headerStyles = this.getLatest().__headerStyles;
85
+
86
+ return headerStyles.size > 0;
87
+ }
88
+
89
+ updateDOM(prevNode) {
90
+ return prevNode.__headerStyles.size !== this.__headerStyles.size;
61
91
  }
62
92
 
63
93
  collapseAtStart() {
@@ -69,8 +99,8 @@ class TableCellNode extends lexical.GridCellNode {
69
99
  }
70
100
 
71
101
  }
72
- function $createTableCellNode(isHeader) {
73
- return new TableCellNode(isHeader);
102
+ function $createTableCellNode(headerStyles) {
103
+ return new TableCellNode(headerStyles);
74
104
  }
75
105
  function $isTableCellNode(node) {
76
106
  return node instanceof TableCellNode;
@@ -106,7 +136,8 @@ function $findMatchingParent(startingNode, findFn) {
106
136
  *
107
137
  *
108
138
  */
109
- const getSelection = window.getSelection;
139
+ const getSelection = () => window.getSelection();
140
+
110
141
  var getDOMSelection = getSelection;
111
142
 
112
143
  /**
@@ -496,10 +527,10 @@ function $applyCustomTableHandlers(tableNode, tableElement, editor) {
496
527
  const isForward = direction === 'forward';
497
528
 
498
529
  if (x !== (isForward ? grid.columns - 1 : 0)) {
499
- tableNode.getCellNodeFromCords(x + (isForward ? 1 : -1), y).select();
530
+ tableNode.getCellNodeFromCordsOrThrow(x + (isForward ? 1 : -1), y).select();
500
531
  } else {
501
532
  if (y !== (isForward ? grid.rows - 1 : 0)) {
502
- tableNode.getCellNodeFromCords(isForward ? 0 : grid.columns - 1, y + (isForward ? 1 : -1)).select();
533
+ tableNode.getCellNodeFromCordsOrThrow(isForward ? 0 : grid.columns - 1, y + (isForward ? 1 : -1)).select();
503
534
  } else if (!isForward) {
504
535
  tableNode.selectPrevious();
505
536
  } else {
@@ -513,7 +544,7 @@ function $applyCustomTableHandlers(tableNode, tableElement, editor) {
513
544
  case 'up':
514
545
  {
515
546
  if (y !== 0) {
516
- tableNode.getCellNodeFromCords(x, y - 1).select();
547
+ tableNode.getCellNodeFromCordsOrThrow(x, y - 1).select();
517
548
  } else {
518
549
  tableNode.selectPrevious();
519
550
  }
@@ -524,7 +555,7 @@ function $applyCustomTableHandlers(tableNode, tableElement, editor) {
524
555
  case 'down':
525
556
  {
526
557
  if (y !== grid.rows - 1) {
527
- tableNode.getCellNodeFromCords(x, y + 1).select();
558
+ tableNode.getCellNodeFromCordsOrThrow(x, y + 1).select();
528
559
  } else {
529
560
  tableNode.selectNext();
530
561
  }
@@ -604,10 +635,10 @@ class TableNode extends lexical.GridNode {
604
635
  static clone(node, selectionShape, grid) {
605
636
  // TODO: selectionShape and grid aren't being deeply cloned?
606
637
  // They shouldn't really be on the table node IMO.
607
- return new TableNode(node.__key, node.__selectionShape, node.__grid);
638
+ return new TableNode(node.__selectionShape, node.__grid, node.__key);
608
639
  }
609
640
 
610
- constructor(key, selectionShape, grid) {
641
+ constructor(selectionShape, grid, key) {
611
642
  super(key);
612
643
  this.__selectionShape = selectionShape;
613
644
  this.__grid = grid;
@@ -698,13 +729,13 @@ class TableNode extends lexical.GridNode {
698
729
  const row = cells[y];
699
730
 
700
731
  if (row == null) {
701
- throw new Error(`Table row x:"${y}" not found.`);
732
+ return null;
702
733
  }
703
734
 
704
735
  const cell = row[x];
705
736
 
706
737
  if (cell == null) {
707
- throw new Error(`Table cell y:"${x}" in row x:"${y}" not found.`);
738
+ return null;
708
739
  }
709
740
 
710
741
  const node = lexical.$getNearestNodeFromDOMNode(cell.elem);
@@ -713,7 +744,17 @@ class TableNode extends lexical.GridNode {
713
744
  return node;
714
745
  }
715
746
 
716
- throw new Error('Node at cords not TableCellNode.');
747
+ return null;
748
+ }
749
+
750
+ getCellNodeFromCordsOrThrow(x, y) {
751
+ const node = this.getCellNodeFromCords(x, y);
752
+
753
+ if (!node) {
754
+ throw new Error('Node at cords not TableCellNode.');
755
+ }
756
+
757
+ return node;
717
758
  }
718
759
 
719
760
  setGrid(grid) {
@@ -789,14 +830,21 @@ function $isTableRowNode(node) {
789
830
  *
790
831
  *
791
832
  */
792
- function $createTableNodeWithDimensions(rowCount, columnCount, includeHeader = true) {
833
+ function $createTableNodeWithDimensions(rowCount, columnCount, includeHeaders = true) {
793
834
  const tableNode = $createTableNode();
794
835
 
795
836
  for (let iRow = 0; iRow < rowCount; iRow++) {
796
837
  const tableRowNode = $createTableRowNode();
797
838
 
798
839
  for (let iColumn = 0; iColumn < columnCount; iColumn++) {
799
- const tableCellNode = $createTableCellNode(iRow === 0 && includeHeader);
840
+ const headerStyles = new Set();
841
+
842
+ if (includeHeaders) {
843
+ if (iRow === 0) headerStyles.add('row');
844
+ if (iColumn === 0) headerStyles.add('column');
845
+ }
846
+
847
+ const tableCellNode = $createTableCellNode(headerStyles);
800
848
  const paragraphNode = lexical.$createParagraphNode();
801
849
  paragraphNode.append(lexical.$createTextNode());
802
850
  tableCellNode.append(paragraphNode);
@@ -844,6 +892,19 @@ function $getTableColumnIndexFromTableCellNode(tableCellNode) {
844
892
  const tableRowNode = $getTableRowNodeFromTableCellNodeOrThrow(tableCellNode);
845
893
  return tableRowNode.getChildren().findIndex(n => n.is(tableCellNode));
846
894
  }
895
+ function $getTableCellSiblingsFromTableCellNode(tableCellNode) {
896
+ const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);
897
+ const {
898
+ x,
899
+ y
900
+ } = tableNode.getCordsFromCellNode(tableCellNode);
901
+ return {
902
+ above: tableNode.getCellNodeFromCords(x, y - 1),
903
+ below: tableNode.getCellNodeFromCords(x, y + 1),
904
+ left: tableNode.getCellNodeFromCords(x - 1, y),
905
+ right: tableNode.getCellNodeFromCords(x + 1, y)
906
+ };
907
+ }
847
908
  function $removeTableRowAtIndex(tableNode, indexToDelete) {
848
909
  const tableRows = tableNode.getChildren();
849
910
 
@@ -865,12 +926,29 @@ function $insertTableRow(tableNode, targetIndex, shouldInsertAfter = true, rowCo
865
926
  const targetRowNode = tableRows[targetIndex];
866
927
 
867
928
  if ($isTableRowNode(targetRowNode)) {
868
- for (let i = 0; i < rowCount; i++) {
869
- const tableColumnCount = targetRowNode.getChildren().length;
929
+ for (let r = 0; r < rowCount; r++) {
930
+ const tableRowCells = targetRowNode.getChildren();
931
+ const tableColumnCount = tableRowCells.length;
870
932
  const newTableRowNode = $createTableRowNode();
871
933
 
872
- for (let j = 0; j < tableColumnCount; j++) {
873
- const tableCellNode = $createTableCellNode(false);
934
+ for (let c = 0; c < tableColumnCount; c++) {
935
+ const tableCellFromTargetRow = tableRowCells[c];
936
+
937
+ if (!$isTableCellNode(tableCellFromTargetRow)) {
938
+ throw Error(`Expected table cell`);
939
+ }
940
+
941
+ const {
942
+ above,
943
+ below
944
+ } = $getTableCellSiblingsFromTableCellNode(tableCellFromTargetRow);
945
+ const headerStyles = new Set();
946
+
947
+ if (above && above.getHeaderStyles().has('column') || below && below.getHeaderStyles().has('column')) {
948
+ headerStyles.add('column');
949
+ }
950
+
951
+ const tableCellNode = $createTableCellNode(headerStyles);
874
952
  tableCellNode.append(lexical.$createParagraphNode());
875
953
  newTableRowNode.append(tableCellNode);
876
954
  }
@@ -890,12 +968,18 @@ function $insertTableRow(tableNode, targetIndex, shouldInsertAfter = true, rowCo
890
968
  function $insertTableColumn(tableNode, targetIndex, shouldInsertAfter = true, columnCount) {
891
969
  const tableRows = tableNode.getChildren();
892
970
 
893
- for (let i = 0; i < tableRows.length; i++) {
894
- const currentTableRowNode = tableRows[i];
971
+ for (let r = 0; r < tableRows.length; r++) {
972
+ const currentTableRowNode = tableRows[r];
895
973
 
896
974
  if ($isTableRowNode(currentTableRowNode)) {
897
- for (let j = 0; j < columnCount; j++) {
898
- const newTableCell = $createTableCellNode(i === 0);
975
+ for (let c = 0; c < columnCount; c++) {
976
+ const headerStyles = new Set();
977
+
978
+ if (r === 0) {
979
+ headerStyles.add('row');
980
+ }
981
+
982
+ const newTableCell = $createTableCellNode(headerStyles);
899
983
  newTableCell.append(lexical.$createParagraphNode());
900
984
  const tableRowChildren = currentTableRowNode.getChildren();
901
985
 
@@ -4,27 +4,30 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- var p=require("lexical");function z(a,...b){b.forEach(c=>{null!=c&&"string"===typeof c&&a.classList.add(...c.split(" "))})}
8
- class A extends p.GridCellNode{static getType(){return"tablecell"}static clone(a){return new A(!1,a.__colSpan,a.__key)}constructor(a=!1,b=1,c){super(b,c);this.__isHeader=a}getTag(){return this.__isHeader?"th":"td"}createDOM(a){const b=document.createElement(this.getTag());z(b,a.theme.tableCell,!0===this.__isHeader&&a.theme.tableCellHeader);return b}updateDOM(){return!1}collapseAtStart(){return!0}canBeEmpty(){return!1}}function B(a){return new A(a)}function C(a){return a instanceof A}
9
- function D(a,b){for(;a!==p.$getRoot()&&null!=a;){if(b(a))return a;a=a.getParent()}return null}var E=window.getSelection;const F=document.createElement("style");F.appendChild(document.createTextNode("::selection{background-color: transparent}"));function G(a){for(;null!=a;){const b=a.nodeName;if("TD"===b||"TH"===b){a=a._cell;if(void 0===a)break;return a}a=a.parentNode}return null}
10
- function J(a,b,c){const n=[],e={cells:n,columns:0,rows:0},q=()=>{var d=b.firstChild;let m=0,k=0;for(n.length=0;null!=d;){var g=d.nodeName;if("TD"===g||"TH"===g)g={elem:d,highlighted:!1,x:m,y:k},d._cell=g,void 0===n[k]&&(n[k]=[]),n[k][m]=g;else if(g=d.firstChild,null!=g){d=g;continue}g=d.nextSibling;if(null!=g)m++,d=g;else if(g=d.parentNode,null!=g){d=g.nextSibling;if(null==d)break;k++;m=0}}e.columns=m+1;e.rows=k+1;a.setGrid(e)};(new MutationObserver(d=>{c.update(()=>{let m=!1;for(let k=0;k<d.length;k++){const g=
11
- d[k].target.nodeName;if("TABLE"===g||"TR"===g){m=!0;break}}m&&q()})})).observe(b,{childList:!0,subtree:!0});q();return e}
12
- function K(a,b,c,n,e){const q=[];for(let d=0;d<e.length;d++){const m=e[d];for(let k=0;k<m.length;k++){const g=m[k],v=g.elem.style;k>=a&&k<=b&&d>=c&&d<=n?(g.highlighted||(g.highlighted=!0,v.setProperty("background-color","rgb(163, 187, 255)"),v.setProperty("caret-color","transparent")),q.push(g)):g.highlighted&&(g.highlighted=!1,v.removeProperty("background-color"),v.removeProperty("caret-color"),g.elem.getAttribute("style")||g.elem.removeAttribute("style"))}}return q}
13
- function L(a){throw Error(`Minified Lexical error #${a}; see codes.json for the full message or `+"use the non-minified dev environment for full errors and additional helpful warnings.");}
14
- class M extends p.GridNode{static getType(){return"table"}static clone(a){return new M(a.__key,a.__selectionShape,a.__grid)}constructor(a,b,c){super(a);this.__selectionShape=b;this.__grid=c}createDOM(a){const b=document.createElement("table");z(b,a.theme.table);return b}updateDOM(){return!1}canExtractContents(){return!1}canBeEmpty(){return!1}setSelectionState(a){this.getWritable().__selectionShape=a;const b=this.getGrid();return null==b?[]:a?K(a.fromX,a.toX,a.fromY,a.toY,b.cells):K(-1,-1,-1,-1,b.cells)}getSelectionState(){return this.getLatest().__selectionShape}getCordsFromCellNode(a){var b=
15
- this.getGrid();b||L(55);const {rows:c,cells:n}=b;for(b=0;b<c;b++){var e=n[b];if(null==e)throw Error(`Row not found at y:${b}`);e=e.findIndex(({elem:q})=>p.$getNearestNodeFromDOMNode(q)===a);if(-1!==e)return{x:e,y:b}}throw Error("Cell not found in table.");}getCellNodeFromCords(a,b){var c=this.getGrid();c||L(55);({cells:c}=c);c=c[b];if(null==c)throw Error(`Table row x:"${b}" not found.`);c=c[a];if(null==c)throw Error(`Table cell y:"${a}" in row x:"${b}" not found.`);a=p.$getNearestNodeFromDOMNode(c.elem);
16
- if(C(a))return a;throw Error("Node at cords not TableCellNode.");}setGrid(a){const b=this.getWritable();b.__grid=a;return b}getGrid(){return this.getLatest().__grid}canSelectBefore(){return!0}}function O(){return new M}function P(a){return a instanceof M}
17
- class Q extends p.GridRowNode{static getType(){return"tablerow"}static clone(a){return new Q(a.__key)}constructor(a){super(a)}createDOM(a){const b=document.createElement("tr");z(b,a.theme.tableRow);return b}updateDOM(){return!1}canBeEmpty(){return!1}}function R(){return new Q}function S(a){return a instanceof Q}function V(a){a=D(a,b=>S(b));if(S(a))return a;throw Error("Expected table cell to be inside of table row.");}
18
- function W(a){a=D(a,b=>P(b));if(P(a))return a;throw Error("Expected table cell to be inside of table.");}
19
- exports.$applyCustomTableHandlers=function(a,b,c){const n=c.getRootElement();if(null===n)throw Error("No root element.");J(a,b,c);const e=a.getGrid();let q=!1,d=!1,m=-1,k=-1,g=-1,v=-1,w=[];const H=new Set;let x=null;if(null==e)throw Error("Table grid not found.");b.addEventListener("mousemove",h=>{if(q){var f=G(h.target);if(null!==f){const l=f.x;f=f.y;if(!d&&(m!==l||k!==f)){h.preventDefault();h=E();const r=h.anchorNode;null!==r&&h.setBaseAndExtent(r,0,r,0);d=!0;document.body&&document.body.appendChild(F);
20
- null===x&&(x=c.addListener("command",(u,t)=>{if("deleteCharacter"===u){if(w.length===e.columns*e.rows)return a.selectPrevious(),a.remove(),I(),!0;w.forEach(({elem:y})=>{y=p.$getNearestNodeFromDOMNode(y);if(p.$isElementNode(y)){const N=p.$createParagraphNode(),X=p.$createTextNode();N.append(X);y.append(N);y.getChildren().forEach(T=>{T!==N&&T.remove()})}});a.setSelectionState(null);p.$setSelection(null);return!0}if("formatText"===u)return Y(t),!0;"insertText"===u&&I();return!1},1),H.add(x))}else if(l===
21
- g&&f===v)return;g=l;v=f;if(d){const r=Math.min(m,g),u=Math.max(m,g),t=Math.min(k,v),y=Math.max(k,v);c.update(()=>{w=a.setSelectionState({fromX:r,fromY:t,toX:u,toY:y})})}}}});const I=()=>{c.update(()=>{q=d=!1;v=g=k=m=-1;c.update(()=>{a.setSelectionState(null)});w=[];null!==x&&(x(),x=null,H.delete(x));const h=F.parentNode;null!=h&&h.removeChild(F)})};b.addEventListener("mouseleave",()=>{});const Y=h=>{let f=p.$getSelection();p.$isRangeSelection(f)||(f=p.$createRangeSelection());const l=f,r=l.anchor,
22
- u=l.focus;w.forEach(t=>{t=p.$getNearestNodeFromDOMNode(t.elem);p.$isElementNode(t)&&0!==t.getTextContentSize()&&(r.set(t.getKey(),0,"element"),u.set(t.getKey(),t.getChildrenSize(),"element"),l.formatText(h))});f.anchor.set(f.anchor.key,f.anchor.offset,f.anchor.type);f.focus.set(f.anchor.key,f.anchor.offset,f.anchor.type);p.$setSelection(f)};b.addEventListener("mousedown",h=>{q?d&&I():setTimeout(()=>{d&&I();const f=G(h.target);null!==f&&(q=!0,m=f.x,k=f.y,document.addEventListener("mouseup",()=>{q=
23
- !1},{capture:!0,once:!0}))},0)});window.addEventListener("click",h=>{0<w.length&&!b.contains(h.target)&&n.contains(h.target)&&c.update(()=>{a.setSelectionState(null)})});const U=(h,f,l)=>{switch(l){case "backward":case "forward":return l="forward"===l,h!==(l?e.columns-1:0)?a.getCellNodeFromCords(h+(l?1:-1),f).select():f!==(l?e.rows-1:0)?a.getCellNodeFromCords(l?0:e.columns-1,f+(l?1:-1)).select():l?a.selectNext():a.selectPrevious(),!0;case "up":return 0!==f?a.getCellNodeFromCords(h,f-1).select():a.selectPrevious(),
24
- !0;case "down":return f!==e.rows-1?a.getCellNodeFromCords(h,f+1).select():a.selectNext(),!0}return!1},Z=c.addListener("command",(h,f)=>{var l=p.$getSelection();if(!p.$isRangeSelection(l))return!1;var r=D(l.anchor.getNode(),u=>C(u));if(!C(r))return!1;if("deleteCharacter"===h&&0===w.length&&l.isCollapsed()&&0===l.anchor.offset&&0===l.anchor.getNode().getPreviousSiblings().length)return!0;if("keyTab"===h&&l.isCollapsed()&&0===w.length)return r=a.getCordsFromCellNode(r),f.preventDefault(),U(r.x,r.y,f.shiftKey||
25
- "keyTab"!==h?"backward":"forward"),!0;if(("keyArrowDown"===h||"keyArrowUp"===h)&&l.isCollapsed()&&0===w.length){const u=a.getCordsFromCellNode(r);l=D(l.anchor.getNode(),t=>p.$isElementNode(t));if("keyArrowUp"===h&&l===r.getFirstChild()||"keyArrowDown"===h&&l===r.getLastChild())return f.preventDefault(),f.stopImmediatePropagation(),U(u.x,u.y,"keyArrowUp"===h?"up":"down"),!0}return!1},4);H.add(Z);return()=>Array.from(H).forEach(h=>h?h():null)};exports.$createTableCellNode=B;
26
- exports.$createTableNode=O;exports.$createTableNodeWithDimensions=function(a,b,c=!0){const n=O();for(let e=0;e<a;e++){const q=R();for(let d=0;d<b;d++){const m=B(0===e&&c),k=p.$createParagraphNode();k.append(p.$createTextNode());m.append(k);q.append(m)}n.append(q)}return n};exports.$createTableRowNode=R;
27
- exports.$deleteTableColumn=function(a,b){const c=a.getChildren();for(let e=0;e<c.length;e++){var n=c[e];if(S(n)){n=n.getChildren();if(b>=n.length||0>b)throw Error("Table column target index out of range");n[b].remove()}}return a};exports.$getTableCellNodeFromLexicalNode=function(a){a=D(a,b=>C(b));return C(a)?a:null};exports.$getTableColumnIndexFromTableCellNode=function(a){return V(a).getChildren().findIndex(b=>b.is(a))};exports.$getTableNodeFromLexicalNodeOrThrow=W;
28
- exports.$getTableRowIndexFromTableCellNode=function(a){const b=V(a);return W(b).getChildren().findIndex(c=>c.is(b))};exports.$getTableRowNodeFromTableCellNodeOrThrow=V;exports.$insertTableColumn=function(a,b,c=!0,n){const e=a.getChildren();for(let d=0;d<e.length;d++){const m=e[d];if(S(m))for(let k=0;k<n;k++){const g=B(0===d);g.append(p.$createParagraphNode());var q=m.getChildren();if(b>=q.length||0>b)throw Error("Table column target index out of range");q=q[b];c?q.insertAfter(g):q.insertBefore(g)}}return a};
29
- exports.$insertTableRow=function(a,b,c=!0,n){var e=a.getChildren();if(b>=e.length||0>b)throw Error("Table row target index out of range");b=e[b];if(S(b))for(e=0;e<n;e++){const q=b.getChildren().length,d=R();for(let m=0;m<q;m++){const k=B(!1);k.append(p.$createParagraphNode());d.append(k)}c?b.insertAfter(d):b.insertBefore(d)}else throw Error("Row before insertion index does not exist.");return a};exports.$isTableCellNode=C;exports.$isTableNode=P;exports.$isTableRowNode=S;
30
- exports.$removeTableRowAtIndex=function(a,b){const c=a.getChildren();if(b>=c.length||0>b)throw Error("Expected table cell to be inside of table row.");c[b].remove();return a};exports.TableCellNode=A;exports.TableNode=M;exports.TableRowNode=Q;
7
+ var q=require("lexical");function z(a,...b){b.forEach(c=>{null!=c&&"string"===typeof c&&a.classList.add(...c.split(" "))})}
8
+ class C extends q.GridCellNode{static getType(){return"tablecell"}static clone(a){return new C(new Set(a.__headerStyles),a.__colSpan,a.__key)}constructor(a,b=1,c){super(b,c);this.__headerStyles=a||new Set}createDOM(a){const b=document.createElement(this.getTag());z(b,a.theme.tableCell,this.hasHeader()&&a.theme.TableCellHeaderStyles);return b}getTag(){return this.hasHeader()?"th":"td"}setHeaderStyles(a){this.getWritable().__headerStyles=new Set(a);return this.__headerStyles}getHeaderStyles(){return this.getLatest().__headerStyles}toggleHeaderStyle(a){const b=
9
+ this.getWritable(),c=b.getHeaderStyles();c.has(a)?c.delete(a):c.add(a);b.__headerStyles=new Set(c);return b}hasHeader(){return 0<this.getLatest().__headerStyles.size}updateDOM(a){return a.__headerStyles.size!==this.__headerStyles.size}collapseAtStart(){return!0}canBeEmpty(){return!1}}function D(a){return new C(a)}function E(a){return a instanceof C}function F(a,b){for(;a!==q.$getRoot()&&null!=a;){if(b(a))return a;a=a.getParent()}return null}const G=document.createElement("style");G.appendChild(document.createTextNode("::selection{background-color: transparent}"));
10
+ function H(a){for(;null!=a;){const b=a.nodeName;if("TD"===b||"TH"===b){a=a._cell;if(void 0===a)break;return a}a=a.parentNode}return null}
11
+ function I(a,b,c){const p=[],d={cells:p,columns:0,rows:0},h=()=>{var e=b.firstChild;let n=0,k=0;for(p.length=0;null!=e;){var f=e.nodeName;if("TD"===f||"TH"===f)f={elem:e,highlighted:!1,x:n,y:k},e._cell=f,void 0===p[k]&&(p[k]=[]),p[k][n]=f;else if(f=e.firstChild,null!=f){e=f;continue}f=e.nextSibling;if(null!=f)n++,e=f;else if(f=e.parentNode,null!=f){e=f.nextSibling;if(null==e)break;k++;n=0}}d.columns=n+1;d.rows=k+1;a.setGrid(d)};(new MutationObserver(e=>{c.update(()=>{let n=!1;for(let k=0;k<e.length;k++){const f=
12
+ e[k].target.nodeName;if("TABLE"===f||"TR"===f){n=!0;break}}n&&h()})})).observe(b,{childList:!0,subtree:!0});h();return d}
13
+ function J(a,b,c,p,d){const h=[];for(let e=0;e<d.length;e++){const n=d[e];for(let k=0;k<n.length;k++){const f=n[k],r=f.elem.style;k>=a&&k<=b&&e>=c&&e<=p?(f.highlighted||(f.highlighted=!0,r.setProperty("background-color","rgb(163, 187, 255)"),r.setProperty("caret-color","transparent")),h.push(f)):f.highlighted&&(f.highlighted=!1,r.removeProperty("background-color"),r.removeProperty("caret-color"),f.elem.getAttribute("style")||f.elem.removeAttribute("style"))}}return h}
14
+ function K(a){throw Error(`Minified Lexical error #${a}; see codes.json for the full message or `+"use the non-minified dev environment for full errors and additional helpful warnings.");}
15
+ class L extends q.GridNode{static getType(){return"table"}static clone(a){return new L(a.__selectionShape,a.__grid,a.__key)}constructor(a,b,c){super(c);this.__selectionShape=a;this.__grid=b}createDOM(a){const b=document.createElement("table");z(b,a.theme.table);return b}updateDOM(){return!1}canExtractContents(){return!1}canBeEmpty(){return!1}setSelectionState(a){this.getWritable().__selectionShape=a;const b=this.getGrid();return null==b?[]:a?J(a.fromX,a.toX,a.fromY,a.toY,b.cells):J(-1,-1,-1,-1,b.cells)}getSelectionState(){return this.getLatest().__selectionShape}getCordsFromCellNode(a){var b=
16
+ this.getGrid();b||K(55);const {rows:c,cells:p}=b;for(b=0;b<c;b++){var d=p[b];if(null==d)throw Error(`Row not found at y:${b}`);d=d.findIndex(({elem:h})=>q.$getNearestNodeFromDOMNode(h)===a);if(-1!==d)return{x:d,y:b}}throw Error("Cell not found in table.");}getCellNodeFromCords(a,b){var c=this.getGrid();c||K(55);({cells:c}=c);b=c[b];if(null==b)return null;a=b[a];if(null==a)return null;a=q.$getNearestNodeFromDOMNode(a.elem);return E(a)?a:null}getCellNodeFromCordsOrThrow(a,b){a=this.getCellNodeFromCords(a,
17
+ b);if(!a)throw Error("Node at cords not TableCellNode.");return a}setGrid(a){const b=this.getWritable();b.__grid=a;return b}getGrid(){return this.getLatest().__grid}canSelectBefore(){return!0}}function M(){return new L}function N(a){return a instanceof L}
18
+ class P extends q.GridRowNode{static getType(){return"tablerow"}static clone(a){return new P(a.__key)}constructor(a){super(a)}createDOM(a){const b=document.createElement("tr");z(b,a.theme.tableRow);return b}updateDOM(){return!1}canBeEmpty(){return!1}}function Q(){return new P}function R(a){return a instanceof P}function S(a){a=F(a,b=>R(b));if(R(a))return a;throw Error("Expected table cell to be inside of table row.");}
19
+ function V(a){a=F(a,b=>N(b));if(N(a))return a;throw Error("Expected table cell to be inside of table.");}
20
+ exports.$applyCustomTableHandlers=function(a,b,c){const p=c.getRootElement();if(null===p)throw Error("No root element.");I(a,b,c);const d=a.getGrid();let h=!1,e=!1,n=-1,k=-1,f=-1,r=-1,u=[];const y=new Set;let x=null;if(null==d)throw Error("Table grid not found.");b.addEventListener("mousemove",l=>{if(h){var g=H(l.target);if(null!==g){const m=g.x;g=g.y;if(!e&&(n!==m||k!==g)){l.preventDefault();l=window.getSelection();const t=l.anchorNode;null!==t&&l.setBaseAndExtent(t,0,t,0);e=!0;document.body&&document.body.appendChild(G);
21
+ null===x&&(x=c.addListener("command",(w,v)=>{if("deleteCharacter"===w){if(u.length===d.columns*d.rows)return a.selectPrevious(),a.remove(),A(),!0;u.forEach(({elem:B})=>{B=q.$getNearestNodeFromDOMNode(B);if(q.$isElementNode(B)){const O=q.$createParagraphNode(),W=q.$createTextNode();O.append(W);B.append(O);B.getChildren().forEach(T=>{T!==O&&T.remove()})}});a.setSelectionState(null);q.$setSelection(null);return!0}if("formatText"===w)return X(v),!0;"insertText"===w&&A();return!1},1),y.add(x))}else if(m===
22
+ f&&g===r)return;f=m;r=g;if(e){const t=Math.min(n,f),w=Math.max(n,f),v=Math.min(k,r),B=Math.max(k,r);c.update(()=>{u=a.setSelectionState({fromX:t,fromY:v,toX:w,toY:B})})}}}});const A=()=>{c.update(()=>{h=e=!1;r=f=k=n=-1;c.update(()=>{a.setSelectionState(null)});u=[];null!==x&&(x(),x=null,y.delete(x));const l=G.parentNode;null!=l&&l.removeChild(G)})};b.addEventListener("mouseleave",()=>{});const X=l=>{let g=q.$getSelection();q.$isRangeSelection(g)||(g=q.$createRangeSelection());const m=g,t=m.anchor,
23
+ w=m.focus;u.forEach(v=>{v=q.$getNearestNodeFromDOMNode(v.elem);q.$isElementNode(v)&&0!==v.getTextContentSize()&&(t.set(v.getKey(),0,"element"),w.set(v.getKey(),v.getChildrenSize(),"element"),m.formatText(l))});g.anchor.set(g.anchor.key,g.anchor.offset,g.anchor.type);g.focus.set(g.anchor.key,g.anchor.offset,g.anchor.type);q.$setSelection(g)};b.addEventListener("mousedown",l=>{h?e&&A():setTimeout(()=>{e&&A();const g=H(l.target);null!==g&&(h=!0,n=g.x,k=g.y,document.addEventListener("mouseup",()=>{h=
24
+ !1},{capture:!0,once:!0}))},0)});window.addEventListener("click",l=>{0<u.length&&!b.contains(l.target)&&p.contains(l.target)&&c.update(()=>{a.setSelectionState(null)})});const U=(l,g,m)=>{switch(m){case "backward":case "forward":return m="forward"===m,l!==(m?d.columns-1:0)?a.getCellNodeFromCordsOrThrow(l+(m?1:-1),g).select():g!==(m?d.rows-1:0)?a.getCellNodeFromCordsOrThrow(m?0:d.columns-1,g+(m?1:-1)).select():m?a.selectNext():a.selectPrevious(),!0;case "up":return 0!==g?a.getCellNodeFromCordsOrThrow(l,
25
+ g-1).select():a.selectPrevious(),!0;case "down":return g!==d.rows-1?a.getCellNodeFromCordsOrThrow(l,g+1).select():a.selectNext(),!0}return!1},Y=c.addListener("command",(l,g)=>{var m=q.$getSelection();if(!q.$isRangeSelection(m))return!1;var t=F(m.anchor.getNode(),w=>E(w));if(!E(t))return!1;if("deleteCharacter"===l&&0===u.length&&m.isCollapsed()&&0===m.anchor.offset&&0===m.anchor.getNode().getPreviousSiblings().length)return!0;if("keyTab"===l&&m.isCollapsed()&&0===u.length)return t=a.getCordsFromCellNode(t),
26
+ g.preventDefault(),U(t.x,t.y,g.shiftKey||"keyTab"!==l?"backward":"forward"),!0;if(("keyArrowDown"===l||"keyArrowUp"===l)&&m.isCollapsed()&&0===u.length){const w=a.getCordsFromCellNode(t);m=F(m.anchor.getNode(),v=>q.$isElementNode(v));if("keyArrowUp"===l&&m===t.getFirstChild()||"keyArrowDown"===l&&m===t.getLastChild())return g.preventDefault(),g.stopImmediatePropagation(),U(w.x,w.y,"keyArrowUp"===l?"up":"down"),!0}return!1},4);y.add(Y);return()=>Array.from(y).forEach(l=>l?l():null)};
27
+ exports.$createTableCellNode=D;exports.$createTableNode=M;exports.$createTableNodeWithDimensions=function(a,b,c=!0){const p=M();for(let h=0;h<a;h++){const e=Q();for(let n=0;n<b;n++){var d=new Set;c&&(0===h&&d.add("row"),0===n&&d.add("column"));d=D(d);const k=q.$createParagraphNode();k.append(q.$createTextNode());d.append(k);e.append(d)}p.append(e)}return p};exports.$createTableRowNode=Q;
28
+ exports.$deleteTableColumn=function(a,b){const c=a.getChildren();for(let d=0;d<c.length;d++){var p=c[d];if(R(p)){p=p.getChildren();if(b>=p.length||0>b)throw Error("Table column target index out of range");p[b].remove()}}return a};exports.$getTableCellNodeFromLexicalNode=function(a){a=F(a,b=>E(b));return E(a)?a:null};exports.$getTableColumnIndexFromTableCellNode=function(a){return S(a).getChildren().findIndex(b=>b.is(a))};exports.$getTableNodeFromLexicalNodeOrThrow=V;
29
+ exports.$getTableRowIndexFromTableCellNode=function(a){const b=S(a);return V(b).getChildren().findIndex(c=>c.is(b))};exports.$getTableRowNodeFromTableCellNodeOrThrow=S;
30
+ exports.$insertTableColumn=function(a,b,c=!0,p){const d=a.getChildren();for(let n=0;n<d.length;n++){const k=d[n];if(R(k))for(let f=0;f<p;f++){var h=new Set;0===n&&h.add("row");h=D(h);h.append(q.$createParagraphNode());var e=k.getChildren();if(b>=e.length||0>b)throw Error("Table column target index out of range");e=e[b];c?e.insertAfter(h):e.insertBefore(h)}}return a};
31
+ exports.$insertTableRow=function(a,b,c=!0,p){var d=a.getChildren();if(b>=d.length||0>b)throw Error("Table row target index out of range");b=d[b];if(R(b))for(d=0;d<p;d++){const e=b.getChildren(),n=e.length,k=Q();for(let f=0;f<n;f++){var h=e[f];if(!E(h))throw Error("Expected table cell");const r=V(h),{x:u,y}=r.getCordsFromCellNode(h);h={above:r.getCellNodeFromCords(u,y-1),below:r.getCellNodeFromCords(u,y+1),left:r.getCellNodeFromCords(u-1,y),right:r.getCellNodeFromCords(u+1,y)};const {above:x,below:A}=
32
+ h;h=new Set;(x&&x.getHeaderStyles().has("column")||A&&A.getHeaderStyles().has("column"))&&h.add("column");h=D(h);h.append(q.$createParagraphNode());k.append(h)}c?b.insertAfter(k):b.insertBefore(k)}else throw Error("Row before insertion index does not exist.");return a};exports.$isTableCellNode=E;exports.$isTableNode=N;exports.$isTableRowNode=R;
33
+ exports.$removeTableRowAtIndex=function(a,b){const c=a.getChildren();if(b>=c.length||0>b)throw Error("Expected table cell to be inside of table row.");c[b].remove();return a};exports.TableCellNode=C;exports.TableNode=L;exports.TableRowNode=P;
package/package.json CHANGED
@@ -12,10 +12,10 @@
12
12
  "table"
13
13
  ],
14
14
  "license": "MIT",
15
- "version": "0.1.13",
15
+ "version": "0.1.14",
16
16
  "main": "LexicalTable.js",
17
17
  "peerDependencies": {
18
- "lexical": "0.1.13"
18
+ "lexical": "0.1.14"
19
19
  },
20
20
  "repository": {
21
21
  "type": "git",