@lexical/table 0.1.11 → 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;
@@ -98,6 +128,18 @@ function $findMatchingParent(startingNode, findFn) {
98
128
  return null;
99
129
  }
100
130
 
131
+ /**
132
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
133
+ *
134
+ * This source code is licensed under the MIT license found in the
135
+ * LICENSE file in the root directory of this source tree.
136
+ *
137
+ *
138
+ */
139
+ const getSelection = () => window.getSelection();
140
+
141
+ var getDOMSelection = getSelection;
142
+
101
143
  /**
102
144
  * Copyright (c) Meta Platforms, Inc. and affiliates.
103
145
  *
@@ -298,9 +340,14 @@ function $applyCustomTableHandlers(tableNode, tableElement, editor) {
298
340
 
299
341
  if (!isHighlightingCells && (startX !== cellX || startY !== cellY)) {
300
342
  event.preventDefault();
301
- const windowSelection = window.getSelection(); // Collapse the selection
343
+ const domSelection = getDOMSelection();
344
+ const anchorNode = domSelection.anchorNode;
345
+
346
+ if (anchorNode !== null) {
347
+ // Collapse the selection
348
+ domSelection.setBaseAndExtent(anchorNode, 0, anchorNode, 0);
349
+ }
302
350
 
303
- windowSelection.setBaseAndExtent(windowSelection.anchorNode, 0, windowSelection.anchorNode, 0);
304
351
  isHighlightingCells = true;
305
352
 
306
353
  if (document.body) {
@@ -480,10 +527,10 @@ function $applyCustomTableHandlers(tableNode, tableElement, editor) {
480
527
  const isForward = direction === 'forward';
481
528
 
482
529
  if (x !== (isForward ? grid.columns - 1 : 0)) {
483
- tableNode.getCellNodeFromCords(x + (isForward ? 1 : -1), y).select();
530
+ tableNode.getCellNodeFromCordsOrThrow(x + (isForward ? 1 : -1), y).select();
484
531
  } else {
485
532
  if (y !== (isForward ? grid.rows - 1 : 0)) {
486
- 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();
487
534
  } else if (!isForward) {
488
535
  tableNode.selectPrevious();
489
536
  } else {
@@ -497,7 +544,7 @@ function $applyCustomTableHandlers(tableNode, tableElement, editor) {
497
544
  case 'up':
498
545
  {
499
546
  if (y !== 0) {
500
- tableNode.getCellNodeFromCords(x, y - 1).select();
547
+ tableNode.getCellNodeFromCordsOrThrow(x, y - 1).select();
501
548
  } else {
502
549
  tableNode.selectPrevious();
503
550
  }
@@ -508,7 +555,7 @@ function $applyCustomTableHandlers(tableNode, tableElement, editor) {
508
555
  case 'down':
509
556
  {
510
557
  if (y !== grid.rows - 1) {
511
- tableNode.getCellNodeFromCords(x, y + 1).select();
558
+ tableNode.getCellNodeFromCordsOrThrow(x, y + 1).select();
512
559
  } else {
513
560
  tableNode.selectNext();
514
561
  }
@@ -588,10 +635,10 @@ class TableNode extends lexical.GridNode {
588
635
  static clone(node, selectionShape, grid) {
589
636
  // TODO: selectionShape and grid aren't being deeply cloned?
590
637
  // They shouldn't really be on the table node IMO.
591
- return new TableNode(node.__key, node.__selectionShape, node.__grid);
638
+ return new TableNode(node.__selectionShape, node.__grid, node.__key);
592
639
  }
593
640
 
594
- constructor(key, selectionShape, grid) {
641
+ constructor(selectionShape, grid, key) {
595
642
  super(key);
596
643
  this.__selectionShape = selectionShape;
597
644
  this.__grid = grid;
@@ -682,13 +729,13 @@ class TableNode extends lexical.GridNode {
682
729
  const row = cells[y];
683
730
 
684
731
  if (row == null) {
685
- throw new Error(`Table row x:"${y}" not found.`);
732
+ return null;
686
733
  }
687
734
 
688
735
  const cell = row[x];
689
736
 
690
737
  if (cell == null) {
691
- throw new Error(`Table cell y:"${x}" in row x:"${y}" not found.`);
738
+ return null;
692
739
  }
693
740
 
694
741
  const node = lexical.$getNearestNodeFromDOMNode(cell.elem);
@@ -697,7 +744,17 @@ class TableNode extends lexical.GridNode {
697
744
  return node;
698
745
  }
699
746
 
700
- 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;
701
758
  }
702
759
 
703
760
  setGrid(grid) {
@@ -773,14 +830,21 @@ function $isTableRowNode(node) {
773
830
  *
774
831
  *
775
832
  */
776
- function $createTableNodeWithDimensions(rowCount, columnCount, includeHeader = true) {
833
+ function $createTableNodeWithDimensions(rowCount, columnCount, includeHeaders = true) {
777
834
  const tableNode = $createTableNode();
778
835
 
779
836
  for (let iRow = 0; iRow < rowCount; iRow++) {
780
837
  const tableRowNode = $createTableRowNode();
781
838
 
782
839
  for (let iColumn = 0; iColumn < columnCount; iColumn++) {
783
- 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);
784
848
  const paragraphNode = lexical.$createParagraphNode();
785
849
  paragraphNode.append(lexical.$createTextNode());
786
850
  tableCellNode.append(paragraphNode);
@@ -828,6 +892,19 @@ function $getTableColumnIndexFromTableCellNode(tableCellNode) {
828
892
  const tableRowNode = $getTableRowNodeFromTableCellNodeOrThrow(tableCellNode);
829
893
  return tableRowNode.getChildren().findIndex(n => n.is(tableCellNode));
830
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
+ }
831
908
  function $removeTableRowAtIndex(tableNode, indexToDelete) {
832
909
  const tableRows = tableNode.getChildren();
833
910
 
@@ -849,12 +926,29 @@ function $insertTableRow(tableNode, targetIndex, shouldInsertAfter = true, rowCo
849
926
  const targetRowNode = tableRows[targetIndex];
850
927
 
851
928
  if ($isTableRowNode(targetRowNode)) {
852
- for (let i = 0; i < rowCount; i++) {
853
- const tableColumnCount = targetRowNode.getChildren().length;
929
+ for (let r = 0; r < rowCount; r++) {
930
+ const tableRowCells = targetRowNode.getChildren();
931
+ const tableColumnCount = tableRowCells.length;
854
932
  const newTableRowNode = $createTableRowNode();
855
933
 
856
- for (let j = 0; j < tableColumnCount; j++) {
857
- 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);
858
952
  tableCellNode.append(lexical.$createParagraphNode());
859
953
  newTableRowNode.append(tableCellNode);
860
954
  }
@@ -874,12 +968,18 @@ function $insertTableRow(tableNode, targetIndex, shouldInsertAfter = true, rowCo
874
968
  function $insertTableColumn(tableNode, targetIndex, shouldInsertAfter = true, columnCount) {
875
969
  const tableRows = tableNode.getChildren();
876
970
 
877
- for (let i = 0; i < tableRows.length; i++) {
878
- const currentTableRowNode = tableRows[i];
971
+ for (let r = 0; r < tableRows.length; r++) {
972
+ const currentTableRowNode = tableRows[r];
879
973
 
880
974
  if ($isTableRowNode(currentTableRowNode)) {
881
- for (let j = 0; j < columnCount; j++) {
882
- 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);
883
983
  newTableCell.append(lexical.$createParagraphNode());
884
984
  const tableRowChildren = currentTableRowNode.getChildren();
885
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 y(a,...b){b.forEach(c=>{null!=c&&"string"===typeof c&&a.classList.add(...c.split(" "))})}
8
- class z extends p.GridCellNode{static getType(){return"tablecell"}static clone(a){return new z(!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());y(b,a.theme.tableCell,!0===this.__isHeader&&a.theme.tableCellHeader);return b}updateDOM(){return!1}collapseAtStart(){return!0}canBeEmpty(){return!1}}function A(a){return new z(a)}function C(a){return a instanceof z}
9
- function D(a,b){for(;a!==p.$getRoot()&&null!=a;){if(b(a))return a;a=a.getParent()}return null}const E=document.createElement("style");E.appendChild(document.createTextNode("::selection{background-color: transparent}"));function F(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 G(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 J(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],u=g.elem.style;k>=a&&k<=b&&d>=c&&d<=n?(g.highlighted||(g.highlighted=!0,u.setProperty("background-color","rgb(163, 187, 255)"),u.setProperty("caret-color","transparent")),q.push(g)):g.highlighted&&(g.highlighted=!1,u.removeProperty("background-color"),u.removeProperty("caret-color"),g.elem.getAttribute("style")||g.elem.removeAttribute("style"))}}return 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}
13
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.");}
14
- class L extends p.GridNode{static getType(){return"table"}static clone(a){return new L(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");y(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=
15
- this.getGrid();b||K(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||K(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 M(){return new L}function N(a){return a instanceof L}
17
- class O extends p.GridRowNode{static getType(){return"tablerow"}static clone(a){return new O(a.__key)}constructor(a){super(a)}createDOM(a){const b=document.createElement("tr");y(b,a.theme.tableRow);return b}updateDOM(){return!1}canBeEmpty(){return!1}}function P(){return new O}function Q(a){return a instanceof O}function R(a){a=D(a,b=>Q(b));if(Q(a))return a;throw Error("Expected table cell to be inside of table row.");}
18
- function U(a){a=D(a,b=>N(b));if(N(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.");G(a,b,c);const e=a.getGrid();let q=!1,d=!1,m=-1,k=-1,g=-1,u=-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=F(h.target);if(null!==f){const l=f.x;f=f.y;if(!d&&(m!==l||k!==f))h.preventDefault(),h=window.getSelection(),h.setBaseAndExtent(h.anchorNode,0,h.anchorNode,0),d=!0,document.body&&document.body.appendChild(E),
20
- null===x&&(x=c.addListener("command",(t,v)=>{if("deleteCharacter"===t){if(w.length===e.columns*e.rows)return a.selectPrevious(),a.remove(),I(),!0;w.forEach(({elem:r})=>{r=p.$getNearestNodeFromDOMNode(r);if(p.$isElementNode(r)){const B=p.$createParagraphNode(),V=p.$createTextNode();B.append(V);r.append(B);r.getChildren().forEach(S=>{S!==B&&S.remove()})}});a.setSelectionState(null);p.$setSelection(null);return!0}if("formatText"===t)return W(v),!0;"insertText"===t&&I();return!1},1),H.add(x));else if(l===
21
- g&&f===u)return;g=l;u=f;if(d){const t=Math.min(m,g),v=Math.max(m,g),r=Math.min(k,u),B=Math.max(k,u);c.update(()=>{w=a.setSelectionState({fromX:t,fromY:r,toX:v,toY:B})})}}}});const I=()=>{c.update(()=>{q=d=!1;u=g=k=m=-1;c.update(()=>{a.setSelectionState(null)});w=[];null!==x&&(x(),x=null,H.delete(x));const h=E.parentNode;null!=h&&h.removeChild(E)})};b.addEventListener("mouseleave",()=>{});const W=h=>{let f=p.$getSelection();p.$isRangeSelection(f)||(f=p.$createRangeSelection());const l=f,t=l.anchor,
22
- v=l.focus;w.forEach(r=>{r=p.$getNearestNodeFromDOMNode(r.elem);p.$isElementNode(r)&&0!==r.getTextContentSize()&&(t.set(r.getKey(),0,"element"),v.set(r.getKey(),r.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=F(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 T=(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},X=c.addListener("command",(h,f)=>{var l=p.$getSelection();if(!p.$isRangeSelection(l))return!1;var t=D(l.anchor.getNode(),v=>C(v));if(!C(t))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 t=a.getCordsFromCellNode(t),f.preventDefault(),T(t.x,t.y,f.shiftKey||
25
- "keyTab"!==h?"backward":"forward"),!0;if(("keyArrowDown"===h||"keyArrowUp"===h)&&l.isCollapsed()&&0===w.length){const v=a.getCordsFromCellNode(t);l=D(l.anchor.getNode(),r=>p.$isElementNode(r));if("keyArrowUp"===h&&l===t.getFirstChild()||"keyArrowDown"===h&&l===t.getLastChild())return f.preventDefault(),f.stopImmediatePropagation(),T(v.x,v.y,"keyArrowUp"===h?"up":"down"),!0}return!1},4);H.add(X);return()=>Array.from(H).forEach(h=>h?h():null)};exports.$createTableCellNode=A;
26
- exports.$createTableNode=M;exports.$createTableNodeWithDimensions=function(a,b,c=!0){const n=M();for(let e=0;e<a;e++){const q=P();for(let d=0;d<b;d++){const m=A(0===e&&c),k=p.$createParagraphNode();k.append(p.$createTextNode());m.append(k);q.append(m)}n.append(q)}return n};exports.$createTableRowNode=P;
27
- exports.$deleteTableColumn=function(a,b){const c=a.getChildren();for(let e=0;e<c.length;e++){var n=c[e];if(Q(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 R(a).getChildren().findIndex(b=>b.is(a))};exports.$getTableNodeFromLexicalNodeOrThrow=U;
28
- exports.$getTableRowIndexFromTableCellNode=function(a){const b=R(a);return U(b).getChildren().findIndex(c=>c.is(b))};exports.$getTableRowNodeFromTableCellNodeOrThrow=R;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(Q(m))for(let k=0;k<n;k++){const g=A(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(Q(b))for(e=0;e<n;e++){const q=b.getChildren().length,d=P();for(let m=0;m<q;m++){const k=A(!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=N;exports.$isTableRowNode=Q;
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=z;exports.TableNode=L;exports.TableRowNode=O;
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.11",
15
+ "version": "0.1.14",
16
16
  "main": "LexicalTable.js",
17
17
  "peerDependencies": {
18
- "lexical": "0.1.11"
18
+ "lexical": "0.1.14"
19
19
  },
20
20
  "repository": {
21
21
  "type": "git",