diff --git a/dist/components/editor.d.ts b/dist/components/editor.d.ts index ff338a7..3a72363 100644 --- a/dist/components/editor.d.ts +++ b/dist/components/editor.d.ts @@ -5,7 +5,7 @@ export declare class Editor { root: Spreadsheet; constructor(root: Spreadsheet); hide(): void; - show(position: Position): void; + show(position: Position, initialString?: string): void; handleKeydown: (event: KeyboardEvent) => void; handleClickOutside: (event: MouseEvent) => void; } diff --git a/dist/main.cjs b/dist/main.cjs index 0147a3a..7b01818 100644 --- a/dist/main.cjs +++ b/dist/main.cjs @@ -1,5 +1,5 @@ -"use strict";var E=Object.defineProperty;var I=(r,e,t)=>e in r?E(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var o=(r,e,t)=>(I(r,typeof e!="symbol"?e+"":e,t),t);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});class w{constructor(e,t){o(this,"x");o(this,"y");o(this,"width");o(this,"height");this.x=this.getXCoord(t.column,e),this.y=this.getYCoord(t.row,e),this.width=e.columns[t.column].width,this.height=e.rows[t.row].height}getXCoord(e,t){let s=0;for(let l=0;l{const{key:t}=e;switch(t){case"Escape":{this.hide();break}case"Enter":this.root.changeCellValues(this.root.selection.selectedCell,{value:this.element.value,displayValue:this.element.value}),this.hide()}});o(this,"handleClickOutside",e=>{const t=e.target;this.element.contains(t)||this.hide()});this.root=e;const t=document.createElement("input");t.classList.add("editor"),this.element=t,this.hide()}hide(){this.element.style.display="none",this.element.classList.add("hide"),this.element.blur(),window.removeEventListener("click",this.handleClickOutside),this.element.removeEventListener("keydown",this.handleKeydown),this.root.focusTable()}show(e){const{height:t,width:s,x:l,y:n}=new w(this.root.config,e),i=this.root.getCell(e);this.element.classList.remove("hide"),this.element.style.top=n-this.root.viewport.top+"px",this.element.style.left=l-this.root.viewport.left+"px",this.element.style.width=s+"px",this.element.style.height=t+"px",this.element.style.display="block",window.addEventListener("click",this.handleClickOutside),this.element.addEventListener("keydown",this.handleKeydown),this.element.value=i.value,this.element.focus(),this.element.select()}}class A{constructor(e){o(this,"element");o(this,"root");this.root=e;const t=document.createElement("header");t.classList.add(),this.element=t}}class B{constructor(e){o(this,"element");o(this,"verticalScroller");o(this,"horizontalScroller");o(this,"root");o(this,"isSelecting",!1);o(this,"handleMouseMove",e=>{if(!this.isSelecting)return;const{offsetX:t,offsetY:s}=e,l=this.root.getCellByCoords(t,s);this.root.selection.selectedRange&&(this.root.selection.selectedRange.to=l),this.root.renderSheet()});o(this,"handleMouseUp",()=>{this.isSelecting=!1,this.root.selection.selectedRange&&this.root.selection.selectedRange.from.row===this.root.selection.selectedRange.to.row&&this.root.selection.selectedRange.from.column===this.root.selection.selectedRange.to.column&&(this.root.selection.selectedRange=null),this.root.renderSheet()});o(this,"handleDoubleClick",e=>{e.preventDefault();const t=this.root.getCellByCoords(e.offsetX,e.offsetY);this.root.showEditor(t)});o(this,"handleKeydown",e=>{if(console.log(e),["ArrowLeft","ArrowRight","ArrowUp","ArrowDown"].includes(e.key))switch(e.preventDefault(),this.root.selection.selectedRange=null,e.key){case"ArrowLeft":{this.root.selection.selectedCell&&this.root.selection.selectedCell.column>0&&(console.log("tick"),this.root.selection.selectedCell.column-=1,this.root.renderSheet());break}case"ArrowRight":{this.root.selection.selectedCell&&this.root.selection.selectedCell.column0&&(this.root.selection.selectedCell.row-=1,this.root.renderSheet());break}case"ArrowDown":{this.root.selection.selectedCell&&this.root.selection.selectedCell.row{if(e.button!==0)return;const{offsetX:t,offsetY:s}=e,l=this.root.getCellByCoords(t,s);this.isSelecting=!0,this.root.selection.selectedRange={from:l,to:l},this.root.selection.selectedCell=l,this.root.renderSheet()});o(this,"handleScroll",()=>{const e=this.getViewportBoundlingRect();this.root.viewport.updateValues(e),this.root.renderSheet()});this.root=e;const{horizontalScroller:t,scroller:s,verticalScroller:l}=this.buildComponent();this.element=s,this.verticalScroller=l,this.horizontalScroller=t,this.element.style.height=this.root.config.view.height+"px",this.element.style.width=this.root.config.view.width+"px",this.element.tabIndex=-1,this.updateScrollerSize(),this.element.addEventListener("scroll",this.handleScroll),this.element.addEventListener("mousedown",this.handleClick),this.element.addEventListener("mousemove",this.handleMouseMove),this.element.addEventListener("mouseup",this.handleMouseUp),this.element.addEventListener("dblclick",this.handleDoubleClick),this.element.addEventListener("keydown",this.handleKeydown)}getViewportBoundlingRect(){const{scrollTop:e,scrollLeft:t}=this.element,{height:s,width:l}=this.element.getBoundingClientRect(),n=e+s,i=t+l;return{top:e,left:t,bottom:n,right:i}}buildComponent(){const e=document.createElement("div"),t=document.createElement("div"),s=document.createElement("div"),l=document.createElement("div"),n=document.createElement("div");return t.style.width="0px",t.style.pointerEvents="none",s.style.pointerEvents="none",l.style.display="flex",n.appendChild(t),n.appendChild(s),l.appendChild(n),this.verticalScroller=t,this.horizontalScroller=s,e.appendChild(l),e.classList.add("scroller"),{scroller:e,verticalScroller:t,horizontalScroller:s}}getActualHeight(){return this.root.config.rows.reduce((e,t)=>(e+=t.height,e),0)}getActualWidth(){return this.root.config.columns.reduce((e,t)=>(e+=t.width,e),0)}updateScrollerSize(){const e=this.getActualHeight(),t=this.getActualWidth();this.setScrollerHeight(e),this.setScrollerWidth(t)}setScrollerHeight(e){this.verticalScroller.style.height=e+"px"}setScrollerWidth(e){this.horizontalScroller.style.width=e+"px"}}class p{constructor(e){o(this,"fontSize",16);o(this,"fontColor","black");o(this,"background","white");o(this,"borderColor","black");o(this,"selectedBackground","#4287f5");o(this,"selectedFontColor","#ffffff");e&&Object.assign(this,e)}}class y{constructor(e,t){o(this,"row");o(this,"column");this.row=e,this.column=t}}class S{constructor(e){o(this,"value");o(this,"displayValue");o(this,"resultValue");o(this,"position");o(this,"style");this.value=e.value,this.displayValue=e.displayValue,this.resultValue=e.resultValue,this.position=e.position,this.style=e.style}}class g{constructor(e){o(this,"value");o(this,"displayValue");o(this,"resultValue");o(this,"position");o(this,"style",new p);this.value=e.value,this.displayValue=e.displayValue,this.resultValue=e.resultValue,this.position=e.position}getSerializableCell(){return new S({displayValue:this.displayValue,position:this.position,resultValue:this.resultValue,style:this.style,value:this.value})}changeValues(e){Object.assign(this,e)}isCellInRange(e){const{column:t,row:s}=this.position,{selectedRange:l}=e.selection;if(!l)return!1;const n=s>=Math.min(l.from.row,l.to.row)&&s<=Math.max(l.to.row,l.from.row);return t>=Math.min(l.from.column,l.to.column)&&t<=Math.max(l.to.column,l.from.column)&&n}render(e){var a;let{height:t,width:s,x:l,y:n}=new w(e.config,this.position);const{ctx:i}=e,c=((a=e.selection.selectedCell)==null?void 0:a.row)===this.position.row&&e.selection.selectedCell.column===this.position.column,h=this.isCellInRange(e);n-=e.viewport.top,l-=e.viewport.left,i.clearRect(l,n,s,t),i.fillStyle=c||h?this.style.selectedBackground:this.style.background,i.strokeStyle="black",i.fillRect(l,n,s-1,t-1),i.strokeRect(l,n,s,t),i.fillStyle=c||h?this.style.selectedFontColor:this.style.fontColor,i.textAlign="left",i.font=`${this.style.fontSize}px Arial`,i.textBaseline="middle",i.fillText(this.displayValue,l+2,n+t/2)}}class D{constructor(e){o(this,"element");o(this,"ctx");o(this,"root");this.root=e;const t=document.createElement("canvas");t.classList.add("sheet"),t.height=this.root.config.view.height,t.width=this.root.config.view.width,t.style.width=this.root.config.view.width+"px",t.style.height=this.root.config.view.height+"px",this.element=t;const s=this.element.getContext("2d");if(!s)throw new Error("Enable hardware acceleration");this.ctx=s}getCellByCoords(e,t){let s=0,l=0;for(;l<=t&&(l+=this.root.config.rows[s].height,!(l>=t));)s++;let n=0,i=0;for(;i<=e&&(i+=this.root.config.columns[n].width,!(i>=e));)n++;return new y(s,n)}renderCell(e){const{column:t,row:s}=e;this.root.data[s][t].render(this.root)}renderSheet(){const e=this.root.viewport.firstRow,t=this.root.viewport.lastCol+3,s=this.root.viewport.lastRow+3,l=this.root.viewport.firstCol;for(let n=e;n<=s;n++)for(let i=l;i<=t&&!(!this.root.config.columns[i]||!this.root.config.rows[n]);i++)this.renderCell({column:i,row:n})}}class z{constructor(e){o(this,"element");o(this,"root");this.root=e;const t=document.createElement("div");t.classList.add("spreadsheet_container"),this.element=t,this.changeElementSizes(this.root.viewProps)}changeElementSizes(e){const{height:t,width:s}=e;this.element.style.width=s+"px",this.element.style.height=t+"px"}}class M{constructor(e){o(this,"element");o(this,"root");this.root=e;const t=document.createElement("div");t.classList.add("toolbar"),this.element=t}}class d{constructor(e){o(this,"rows");o(this,"columns");o(this,"view",{width:800,height:600});this.columns=e.columns,this.rows=e.rows,this.view=e.view}}class v{constructor(){o(this,"selectedCell",null);o(this,"selectedRange",null)}}class x{}class u{constructor(e,t){o(this,"root");o(this,"top");o(this,"left");o(this,"right");o(this,"bottom");o(this,"firstRow");o(this,"lastRow");o(this,"firstCol");o(this,"lastCol");this.root=e,this.top=t.top,this.left=t.left,this.right=t.right,this.bottom=t.bottom,this.firstRow=this.getFirstRow(),this.lastCol=this.getFirstRow();//!Temp +"use strict";var L=Object.defineProperty;var A=(r,e,t)=>e in r?L(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var s=(r,e,t)=>(A(r,typeof e!="symbol"?e+"":e,t),t);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});class g{constructor(e,t){s(this,"x");s(this,"y");s(this,"width");s(this,"height");this.x=this.getXCoord(t.column,e),this.y=this.getYCoord(t.row,e),this.width=e.columns[t.column].width,this.height=e.rows[t.row].height}getXCoord(e,t){let o=0;for(let l=0;l{const{key:t}=e;switch(t){case"Escape":{this.hide();break}case"Enter":this.root.changeCellValues(this.root.selection.selectedCell,{value:this.element.value,displayValue:this.element.value}),this.hide()}});s(this,"handleClickOutside",e=>{const t=e.target;this.element.contains(t)||this.hide()});this.root=e;const t=document.createElement("input");t.classList.add(d+"editor"),this.element=t,this.hide()}hide(){this.element.style.display="none",this.element.classList.add("hide"),this.element.blur(),window.removeEventListener("click",this.handleClickOutside),this.element.removeEventListener("keydown",this.handleKeydown),this.root.focusTable()}show(e,t){const{height:o,width:l,x:n,y:i}=new g(this.root.config,e),c=this.root.getCell(e);this.element.classList.remove("hide"),this.element.style.top=i-this.root.viewport.top+"px",this.element.style.left=n-this.root.viewport.left+"px",this.element.style.width=l+"px",this.element.style.height=o+"px",this.element.style.display="block",window.addEventListener("click",this.handleClickOutside),this.element.addEventListener("keydown",this.handleKeydown),this.element.value=t||c.value,this.element.focus(),t||this.element.select()}}class D{constructor(e){s(this,"element");s(this,"root");this.root=e;const t=document.createElement("header");t.classList.add(),this.element=t}}class z{constructor(e){s(this,"element");s(this,"verticalScroller");s(this,"horizontalScroller");s(this,"root");s(this,"isSelecting",!1);s(this,"handleMouseMove",e=>{if(!this.isSelecting)return;const{offsetX:t,offsetY:o}=e,l=this.root.getCellByCoords(t,o);this.root.selection.selectedRange&&(this.root.selection.selectedRange.to=l),this.root.renderSheet()});s(this,"handleMouseUp",()=>{this.isSelecting=!1,this.root.selection.selectedRange&&this.root.selection.selectedRange.from.row===this.root.selection.selectedRange.to.row&&this.root.selection.selectedRange.from.column===this.root.selection.selectedRange.to.column&&(this.root.selection.selectedRange=null),this.root.renderSheet()});s(this,"handleDoubleClick",e=>{e.preventDefault();const t=this.root.getCellByCoords(e.offsetX,e.offsetY);this.root.showEditor(t)});s(this,"handleKeydown",e=>{if(console.log(e),["ArrowLeft","ArrowRight","ArrowUp","ArrowDown"].includes(e.key))switch(e.preventDefault(),this.root.selection.selectedRange=null,e.key){case"ArrowLeft":{this.root.selection.selectedCell&&this.root.selection.selectedCell.column>0&&(console.log("tick"),this.root.selection.selectedCell.column-=1,this.root.renderSheet());break}case"ArrowRight":{this.root.selection.selectedCell&&this.root.selection.selectedCell.column0&&(this.root.selection.selectedCell.row-=1,this.root.renderSheet());break}case"ArrowDown":{this.root.selection.selectedCell&&this.root.selection.selectedCell.row{if(e.button!==0)return;const{offsetX:t,offsetY:o}=e,l=this.root.getCellByCoords(t,o);this.isSelecting=!0,this.root.selection.selectedRange={from:l,to:l},this.root.selection.selectedCell=l,this.root.renderSheet()});s(this,"handleScroll",()=>{const e=this.getViewportBoundlingRect();this.root.viewport.updateValues(e),this.root.renderSheet()});this.root=e;const{horizontalScroller:t,scroller:o,verticalScroller:l}=this.buildComponent();this.element=o,this.verticalScroller=l,this.horizontalScroller=t,this.element.style.height=this.root.config.view.height+"px",this.element.style.width=this.root.config.view.width+"px",this.element.tabIndex=-1,this.updateScrollerSize(),this.element.addEventListener("scroll",this.handleScroll),this.element.addEventListener("mousedown",this.handleClick),this.element.addEventListener("mousemove",this.handleMouseMove),this.element.addEventListener("mouseup",this.handleMouseUp),this.element.addEventListener("dblclick",this.handleDoubleClick),this.element.addEventListener("keydown",this.handleKeydown)}getViewportBoundlingRect(){const{scrollTop:e,scrollLeft:t}=this.element,{height:o,width:l}=this.element.getBoundingClientRect(),n=e+o,i=t+l;return{top:e,left:t,bottom:n,right:i}}buildComponent(){const e=document.createElement("div"),t=document.createElement("div"),o=document.createElement("div"),l=document.createElement("div"),n=document.createElement("div");return t.style.width="0px",t.style.pointerEvents="none",o.style.pointerEvents="none",l.style.display="flex",n.appendChild(t),n.appendChild(o),l.appendChild(n),this.verticalScroller=t,this.horizontalScroller=o,e.appendChild(l),e.classList.add(d+"scroller"),{scroller:e,verticalScroller:t,horizontalScroller:o}}getActualHeight(){return this.root.config.rows.reduce((e,t)=>(e+=t.height,e),0)}getActualWidth(){return this.root.config.columns.reduce((e,t)=>(e+=t.width,e),0)}updateScrollerSize(){const e=this.getActualHeight(),t=this.getActualWidth();this.setScrollerHeight(e),this.setScrollerWidth(t)}setScrollerHeight(e){this.verticalScroller.style.height=e+"px"}setScrollerWidth(e){this.horizontalScroller.style.width=e+"px"}}class S{constructor(e){s(this,"fontSize",16);s(this,"fontColor","black");s(this,"background","white");s(this,"borderColor","black");s(this,"selectedBackground","#4287f5");s(this,"selectedFontColor","#ffffff");e&&Object.assign(this,e)}}class v{constructor(e,t){s(this,"row");s(this,"column");this.row=e,this.column=t}}class R{constructor(e){s(this,"value");s(this,"displayValue");s(this,"resultValue");s(this,"position");s(this,"style");this.value=e.value,this.displayValue=e.displayValue,this.resultValue=e.resultValue,this.position=e.position,this.style=e.style}}class m{constructor(e){s(this,"value");s(this,"displayValue");s(this,"resultValue");s(this,"position");s(this,"style",null);this.value=e.value,this.displayValue=e.displayValue,this.resultValue=e.resultValue,this.position=e.position,this.style=e.style}getSerializableCell(){return new R({displayValue:this.displayValue,position:this.position,resultValue:this.resultValue,style:this.style,value:this.value})}changeStyles(e){this.style=e}changeValues(e){Object.assign(this,e)}isCellInRange(e){const{column:t,row:o}=this.position,{selectedRange:l}=e.selection;if(!l)return!1;const n=o>=Math.min(l.from.row,l.to.row)&&o<=Math.max(l.to.row,l.from.row);return t>=Math.min(l.from.column,l.to.column)&&t<=Math.max(l.to.column,l.from.column)&&n}render(e){var p;let{height:t,width:o,x:l,y:n}=new g(e.config,this.position);const{ctx:i}=e,c=((p=e.selection.selectedCell)==null?void 0:p.row)===this.position.row&&e.selection.selectedCell.column===this.position.column,h=this.isCellInRange(e);n-=e.viewport.top,l-=e.viewport.left;const a=this.style??e.styles.cells;i.clearRect(l,n,o,t),i.fillStyle=c||h?a.selectedBackground:a.background,i.strokeStyle="black",i.fillRect(l,n,o-1,t-1),i.strokeRect(l,n,o,t),i.fillStyle=c||h?a.selectedFontColor:a.fontColor,i.textAlign="left",i.font=`${a.fontSize}px Arial`,i.textBaseline="middle",i.fillText(this.displayValue,l+2,n+t/2)}}class M{constructor(e){s(this,"element");s(this,"ctx");s(this,"root");this.root=e;const t=document.createElement("canvas");t.classList.add(d+"sheet"),t.height=this.root.config.view.height,t.width=this.root.config.view.width,t.style.width=this.root.config.view.width+"px",t.style.height=this.root.config.view.height+"px",this.element=t;const o=this.element.getContext("2d");if(!o)throw new Error("Enable hardware acceleration");this.ctx=o}getCellByCoords(e,t){let o=0,l=0;for(;l<=t&&(l+=this.root.config.rows[o].height,!(l>=t));)o++;let n=0,i=0;for(;i<=e&&(i+=this.root.config.columns[n].width,!(i>=e));)n++;return new v(o,n)}renderCell(e){const{column:t,row:o}=e;this.root.data[o][t].render(this.root)}renderSheet(){const e=this.root.viewport.firstRow,t=this.root.viewport.lastCol+3,o=this.root.viewport.lastRow+3,l=this.root.viewport.firstCol;for(let n=e;n<=o;n++)for(let i=l;i<=t&&!(!this.root.config.columns[i]||!this.root.config.rows[n]);i++)this.renderCell({column:i,row:n})}}class P{constructor(e){s(this,"element");s(this,"root");this.root=e;const t=document.createElement("div");t.classList.add(d+"spreadsheet_container"),this.element=t,this.changeElementSizes(this.root.viewProps)}changeElementSizes(e){const{height:t,width:o}=e;this.element.style.width=o+"px",this.element.style.height=t+"px"}}class F{constructor(e){s(this,"element");s(this,"root");this.root=e;const t=document.createElement("div");t.classList.add(d+"toolbar"),this.element=t}}class u{constructor(e){s(this,"rows");s(this,"columns");s(this,"view",{width:800,height:600});this.columns=e.columns,this.rows=e.rows,this.view=e.view}}class x{constructor(){s(this,"selectedCell",null);s(this,"selectedRange",null)}}class b{constructor(){s(this,"cells");this.cells=new S}}class w{constructor(e,t){s(this,"root");s(this,"top");s(this,"left");s(this,"right");s(this,"bottom");s(this,"firstRow");s(this,"lastRow");s(this,"firstCol");s(this,"lastCol");this.root=e,this.top=t.top,this.left=t.left,this.right=t.right,this.bottom=t.bottom,this.firstRow=this.getFirstRow(),this.lastCol=this.getFirstRow();//!Temp this.firstCol=this.getFirstRow();//!Temp -this.lastRow=this.getLastRow(),this.updateValues({top:0,left:0,right:this.root.viewProps.width,bottom:this.root.viewProps.height})}updateValues(e){this.top=e.top,this.left=e.left,this.right=e.right,this.bottom=e.bottom,this.firstRow=this.getFirstRow(),this.lastRow=this.getLastRow(),this.firstCol=this.getFirstCol(),this.lastCol=this.getLastCol()}getFirstRow(){return this.root.cache.getRowByYCoord(this.top)}getLastRow(){return this.root.cache.getRowByYCoord(this.bottom)}getFirstCol(){return this.root.cache.getColumnByXCoord(this.left)}getLastCol(){return this.root.cache.getColumnByXCoord(this.right)}}class m{constructor(e){o(this,"width");o(this,"title");this.width=e.width,this.title=e.title}}class f{constructor(e){o(this,"height");o(this,"title");this.height=e.height,this.title=e.title}}function C(r,e,t=!1){const s=[];for(let l=0;l<=r;l++){const n=[];for(let i=0;i<=e;i++){const c=t?`${l}:${i}`:"",h=new g({displayValue:c,resultValue:c,value:c,position:{column:i,row:l}});n.push(h)}s.push(n)}return s}function R(r,e){const t=[];for(let n=0;n<=r;n++){const i=new f({height:40,title:String(n)});t.push(i)}const s=[];for(let n=0;n<=e;n++){const i=new m({title:String(n),width:150});s.push(i)}return new d({columns:s,rows:t,view:{height:600,width:800}})}function T(r,e){const t=C(r,e),s=R(r,e);return{data:t,config:s}}class b{constructor(e){o(this,"xPos");o(this,"colIdx");this.xPos=e.xPos,this.colIdx=e.colIdx}}class k{constructor(e){o(this,"yPos");o(this,"rowIdx");this.yPos=e.yPos,this.rowIdx=e.rowIdx}}class V{constructor(e){o(this,"columns");o(this,"rows");this.columns=e.columns,this.rows=e.rows}getRowByYCoord(e){let t=0;for(let s=0;s{this.changeCellValues(e.position,{displayValue:"",resultValue:"",value:""})});else{if(!this.selection.selectedCell)return;this.changeCellValues(this.selection.selectedCell,{displayValue:"",resultValue:"",value:""})}}showEditor(e){this.editor.show(e)}renderSheet(){this.sheet.renderSheet()}renderCell(e,t){this.data[e][t].render(this)}loadData(e){const t=e.length,s=e[0]?this.data[0].length:0;this.data=[];const l=[];for(let n=0;n{this.changeCellValues(e.position,{displayValue:"",resultValue:"",value:""})});else{if(!this.selection.selectedCell)return;this.changeCellValues(this.selection.selectedCell,{displayValue:"",resultValue:"",value:""})}}showEditor(e,t){this.editor.show(e,t)}renderSheet(){this.sheet.renderSheet()}renderCell(e,t){this.data[e][t].render(this)}loadData(e){const t=e.length,o=e[0]?this.data[0].length:0;this.data=[];const l=[];for(let n=0;n {\n const { key } = event;\n switch (key) {\n case 'Escape': {\n this.hide();\n break;\n }\n case 'Enter': {\n this.root.changeCellValues(this.root.selection.selectedCell, {\n value: this.element.value,\n displayValue: this.element.value\n });\n this.hide();\n }\n }\n };\n handleClickOutside = (event) => {\n const target = event.target;\n if (!this.element.contains(target)) {\n this.hide();\n }\n };\n}\n","export class Header {\n element;\n root;\n constructor(root) {\n this.root = root;\n const headerElement = document.createElement('header');\n headerElement.classList.add();\n this.element = headerElement;\n }\n}\n","export class Scroller {\n element;\n verticalScroller;\n horizontalScroller;\n root;\n isSelecting = false;\n constructor(root) {\n this.root = root;\n const { horizontalScroller, scroller, verticalScroller } = this.buildComponent();\n this.element = scroller;\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n this.element.style.height = this.root.config.view.height + 'px';\n this.element.style.width = this.root.config.view.width + 'px';\n this.element.tabIndex = -1;\n this.updateScrollerSize(); //* Init size set\n this.element.addEventListener('scroll', this.handleScroll);\n this.element.addEventListener('mousedown', this.handleClick);\n this.element.addEventListener('mousemove', this.handleMouseMove);\n this.element.addEventListener('mouseup', this.handleMouseUp);\n this.element.addEventListener('dblclick', this.handleDoubleClick);\n this.element.addEventListener('keydown', this.handleKeydown);\n }\n handleMouseMove = (event) => {\n if (!this.isSelecting)\n return;\n const { offsetX, offsetY } = event;\n const lastSelectedCell = this.root.getCellByCoords(offsetX, offsetY);\n if (this.root.selection.selectedRange) {\n this.root.selection.selectedRange.to = lastSelectedCell;\n }\n this.root.renderSheet();\n };\n handleMouseUp = () => {\n this.isSelecting = false;\n if (this.root.selection.selectedRange) {\n if ((this.root.selection.selectedRange.from.row === this.root.selection.selectedRange.to.row) &&\n (this.root.selection.selectedRange.from.column === this.root.selection.selectedRange.to.column)) {\n this.root.selection.selectedRange = null;\n }\n }\n this.root.renderSheet();\n };\n handleDoubleClick = (event) => {\n event.preventDefault();\n const position = this.root.getCellByCoords(event.offsetX, event.offsetY);\n this.root.showEditor(position);\n };\n handleKeydown = (event) => {\n console.log(event);\n //* Navigation\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(event.key)) {\n event.preventDefault();\n this.root.selection.selectedRange = null;\n switch (event.key) {\n case 'ArrowLeft': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.column > 0) {\n console.log('tick');\n this.root.selection.selectedCell.column -= 1;\n this.root.renderSheet();\n }\n break;\n }\n case 'ArrowRight': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.column < this.root.config.columns.length - 1) {\n this.root.selection.selectedCell.column += 1;\n this.root.renderSheet();\n }\n break;\n }\n case 'ArrowUp': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.row > 0) {\n this.root.selection.selectedCell.row -= 1;\n this.root.renderSheet();\n }\n break;\n }\n case 'ArrowDown': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.row < this.root.config.rows.length - 1) {\n this.root.selection.selectedCell.row += 1;\n this.root.renderSheet();\n }\n break;\n }\n }\n }\n if (!event.metaKey && !event.ctrlKey) { //* Prevent handle shortcutrs\n if (event.key === 'F2' || /^([a-z]|[а-я])$/.test(event.key.toLowerCase())) { //* English and Russian keyboard. Or F2 button\n event.preventDefault();\n if (!this.root.selection.selectedCell)\n return;\n this.root.showEditor(this.root.selection.selectedCell);\n }\n }\n if (event.key === 'Delete') {\n event.preventDefault();\n this.root.deleteSelectedCellsValues();\n this.root.renderSheet();\n }\n };\n handleClick = (event) => {\n if (event.button !== 0)\n return; // Left mouse button\n const { offsetX, offsetY } = event;\n const clickedCell = this.root.getCellByCoords(offsetX, offsetY);\n this.isSelecting = true;\n this.root.selection.selectedRange = {\n from: clickedCell,\n to: clickedCell\n };\n this.root.selection.selectedCell = clickedCell;\n this.root.renderSheet();\n };\n handleScroll = () => {\n const rect = this.getViewportBoundlingRect();\n this.root.viewport.updateValues(rect);\n this.root.renderSheet();\n };\n getViewportBoundlingRect() {\n const { scrollTop, scrollLeft } = this.element;\n const { height, width } = this.element.getBoundingClientRect();\n const bottom = scrollTop + height;\n const right = scrollLeft + width;\n return {\n top: scrollTop,\n left: scrollLeft,\n bottom,\n right\n };\n }\n buildComponent() {\n const scroller = document.createElement('div');\n const verticalScroller = document.createElement('div');\n const horizontalScroller = document.createElement('div');\n const groupScrollers = document.createElement('div');\n const stack = document.createElement('div');\n verticalScroller.style.width = '0px';\n verticalScroller.style.pointerEvents = 'none';\n horizontalScroller.style.pointerEvents = 'none';\n groupScrollers.style.display = 'flex';\n stack.appendChild(verticalScroller);\n stack.appendChild(horizontalScroller);\n groupScrollers.appendChild(stack);\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n scroller.appendChild(groupScrollers);\n scroller.classList.add('scroller');\n return { scroller, verticalScroller, horizontalScroller };\n }\n getActualHeight() {\n return this.root.config.rows.reduce((acc, curr) => {\n acc += curr.height;\n return acc;\n }, 0);\n }\n getActualWidth() {\n return this.root.config.columns.reduce((acc, curr) => {\n acc += curr.width;\n return acc;\n }, 0);\n }\n updateScrollerSize() {\n const totalHeight = this.getActualHeight();\n const totalWidth = this.getActualWidth();\n this.setScrollerHeight(totalHeight);\n this.setScrollerWidth(totalWidth);\n }\n setScrollerHeight(height) {\n this.verticalScroller.style.height = height + 'px';\n }\n setScrollerWidth(width) {\n this.horizontalScroller.style.width = width + 'px';\n }\n}\n","import { RenderBox } from \"./renderBox\";\nexport class CellStyles {\n fontSize = 16;\n fontColor = 'black';\n background = 'white';\n borderColor = 'black';\n selectedBackground = '#4287f5';\n selectedFontColor = '#ffffff';\n constructor(props) {\n if (props) {\n Object.assign(this, props); // Override default styles\n }\n }\n}\nexport class Position {\n row;\n column;\n constructor(row, column) {\n this.row = row;\n this.column = column;\n }\n}\nexport class SerializableCell {\n value;\n displayValue;\n resultValue;\n position;\n style;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n}\nexport class Cell {\n value;\n displayValue;\n /** This refers to the values ​​​​that were obtained by calculations, for example, after calculating the formula */\n resultValue;\n position;\n style = new CellStyles();\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n }\n getSerializableCell() {\n const cell = new SerializableCell({\n displayValue: this.displayValue,\n position: this.position,\n resultValue: this.resultValue,\n style: this.style,\n value: this.value\n });\n return cell;\n }\n changeValues(values) {\n Object.assign(this, values);\n }\n isCellInRange(root) {\n const { column, row } = this.position;\n const { selectedRange } = root.selection;\n if (!selectedRange)\n return false;\n const isCellInRow = row >= Math.min(selectedRange.from.row, selectedRange.to.row) && row <= Math.max(selectedRange.to.row, selectedRange.from.row);\n const isCellInCol = column >= Math.min(selectedRange.from.column, selectedRange.to.column) && column <= Math.max(selectedRange.to.column, selectedRange.from.column);\n return isCellInCol && isCellInRow;\n }\n render(root) {\n let { height, width, x, y } = new RenderBox(root.config, this.position);\n const { ctx } = root;\n const isCellSelected = (root.selection.selectedCell?.row === this.position.row && root.selection.selectedCell.column === this.position.column);\n const isCellInRange = this.isCellInRange(root);\n y -= root.viewport.top;\n x -= root.viewport.left;\n ctx.clearRect(x, y, width, height);\n ctx.fillStyle = isCellSelected || isCellInRange ? this.style.selectedBackground : this.style.background;\n ctx.strokeStyle = 'black';\n ctx.fillRect(x, y, width - 1, height - 1);\n ctx.strokeRect(x, y, width, height);\n ctx.fillStyle = isCellSelected || isCellInRange ? this.style.selectedFontColor : this.style.fontColor;\n ctx.textAlign = 'left';\n ctx.font = `${this.style.fontSize}px Arial`;\n ctx.textBaseline = 'middle';\n ctx.fillText(this.displayValue, x + 2, y + height / 2);\n }\n}\n","import { Position } from \"../modules/cell\";\n/**\n * Display (CANVAS) element where cells render\n */\nexport class Sheet {\n element;\n ctx;\n root;\n constructor(root) {\n this.root = root;\n const canvas = document.createElement('canvas');\n canvas.classList.add('sheet');\n //* Set up canvas sizes based on provided root config\n canvas.height = this.root.config.view.height;\n canvas.width = this.root.config.view.width;\n canvas.style.width = this.root.config.view.width + 'px';\n canvas.style.height = this.root.config.view.height + 'px';\n this.element = canvas;\n const ctx = this.element.getContext('2d');\n if (!ctx)\n throw new Error('Enable hardware acceleration');\n this.ctx = ctx;\n }\n getCellByCoords(x, y) {\n let row = 0;\n let height = 0;\n while (height <= y) {\n height += this.root.config.rows[row].height;\n if (height >= y)\n break;\n row++;\n }\n let col = 0;\n let width = 0;\n while (width <= x) {\n width += this.root.config.columns[col].width;\n if (width >= x)\n break;\n col++;\n }\n return new Position(row, col);\n }\n renderCell(position) {\n const { column, row } = position;\n this.root.data[row][column].render(this.root);\n }\n renderSheet() {\n const firstRowIdx = this.root.viewport.firstRow;\n const lastColIdx = this.root.viewport.lastCol + 3;\n const lastRowIdx = this.root.viewport.lastRow + 3;\n const firstColIdx = this.root.viewport.firstCol;\n for (let row = firstRowIdx; row <= lastRowIdx; row++) {\n for (let col = firstColIdx; col <= lastColIdx; col++) {\n if (!this.root.config.columns[col] || !this.root.config.rows[row])\n break; //* Prevent read undefined\n this.renderCell({ column: col, row });\n }\n }\n }\n}\n","/** Base (root) component */\nexport class Table {\n element;\n root;\n constructor(root) {\n this.root = root;\n const container = document.createElement('div');\n container.classList.add('spreadsheet_container');\n this.element = container;\n this.changeElementSizes(this.root.viewProps);\n }\n changeElementSizes(sizes) {\n const { height, width } = sizes;\n this.element.style.width = width + 'px';\n this.element.style.height = height + 'px';\n }\n}\n","export class Toolbar {\n element;\n root;\n constructor(root) {\n this.root = root;\n const toolbarElement = document.createElement('div');\n toolbarElement.classList.add('toolbar');\n this.element = toolbarElement;\n }\n}\n","export class Config {\n rows;\n columns;\n view = {\n width: 800,\n height: 600,\n };\n constructor(props) {\n this.columns = props.columns;\n this.rows = props.rows;\n this.view = props.view;\n }\n}\n","export class Selection {\n selectedCell = null;\n selectedRange = null;\n}\n","export class Styles {\n}\n","export class Viewport {\n root;\n top;\n left;\n right;\n bottom;\n firstRow;\n lastRow;\n firstCol;\n lastCol;\n constructor(root, props) {\n this.root = root;\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastCol = this.getFirstRow(); //!Temp\n this.firstCol = this.getFirstRow(); //!Temp\n this.lastRow = this.getLastRow();\n this.updateValues({\n top: 0,\n left: 0,\n right: this.root.viewProps.width,\n bottom: this.root.viewProps.height\n });\n }\n updateValues(props) {\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastRow = this.getLastRow();\n this.firstCol = this.getFirstCol();\n this.lastCol = this.getLastCol();\n }\n /** Get index of first row in viewport */\n getFirstRow() {\n let rowIdx = this.root.cache.getRowByYCoord(this.top);\n return rowIdx;\n }\n getLastRow() {\n let rowIdx = this.root.cache.getRowByYCoord(this.bottom);\n return rowIdx;\n }\n getFirstCol() {\n let colIdx = this.root.cache.getColumnByXCoord(this.left);\n return colIdx;\n }\n getLastCol() {\n let colIdx = this.root.cache.getColumnByXCoord(this.right);\n return colIdx;\n }\n}\n","export class Column {\n width;\n title;\n constructor(props) {\n this.width = props.width;\n this.title = props.title;\n }\n}\n","export class Row {\n height;\n title;\n constructor(props) {\n this.height = props.height;\n this.title = props.title;\n }\n}\n","import { Cell } from \"../modules/cell\";\nimport { Column } from \"../modules/column\";\nimport { Config } from \"../modules/config\";\nimport { Row } from \"../modules/row\";\nexport function createSampleData(rows, columns, fillCellsByCoords = false) {\n const data = [];\n for (let row = 0; row <= rows; row++) {\n const innerRow = [];\n for (let col = 0; col <= columns; col++) {\n const value = fillCellsByCoords ? `${row}:${col}` : '';\n const cell = new Cell({\n displayValue: value,\n resultValue: value,\n value,\n position: {\n column: col,\n row: row\n }\n });\n innerRow.push(cell);\n }\n data.push(innerRow);\n }\n return data;\n}\nexport function createSampleConfig(rows, columns) {\n const rowsArr = [];\n for (let i = 0; i <= rows; i++) {\n const rowItem = new Row({\n height: 40,\n title: String(i)\n });\n rowsArr.push(rowItem);\n }\n const colsArr = [];\n for (let i = 0; i <= columns; i++) {\n const colItem = new Column({\n title: String(i),\n width: 150\n });\n colsArr.push(colItem);\n }\n const config = new Config({\n columns: colsArr,\n rows: rowsArr,\n view: {\n height: 600,\n width: 800\n }\n });\n return config;\n}\nexport function makeSpreadsheetConfigAndData(rows, columns) {\n const data = createSampleData(rows, columns);\n const config = createSampleConfig(rows, columns);\n return { data, config };\n}\n","export class CachedColumn {\n xPos;\n colIdx;\n constructor(props) {\n this.xPos = props.xPos;\n this.colIdx = props.colIdx;\n }\n}\nexport class CachedRow {\n yPos;\n rowIdx;\n constructor(props) {\n this.yPos = props.yPos;\n this.rowIdx = props.rowIdx;\n }\n}\nexport class Cache {\n columns;\n rows;\n constructor(initial) {\n this.columns = initial.columns;\n this.rows = initial.rows;\n }\n getRowByYCoord(y) {\n let rowIdx = 0;\n for (let i = 0; i < this.rows.length; i++) {\n if (y <= this.rows[i].yPos) { //* Intersection detect\n rowIdx = i;\n break;\n }\n }\n return rowIdx;\n }\n getColumnByXCoord(x) {\n let colIdx = 0;\n for (let i = 0; i < this.columns.length; i++) {\n if (x <= this.columns[i].xPos) { //* Intersection detect\n colIdx = i;\n break;\n }\n }\n return colIdx;\n }\n}\n","import { Editor } from \"./components/editor\";\nimport { Header } from \"./components/header\";\nimport { Scroller } from \"./components/scroller\";\nimport { Sheet } from \"./components/sheet\";\nimport { Table } from \"./components/table\";\nimport { Toolbar } from \"./components/toolbar\";\nimport { Cell } from \"./modules/cell\";\nimport { Config } from \"./modules/config\";\nimport { Selection } from \"./modules/selection\";\nimport { Styles } from \"./modules/styles\";\nimport { Viewport } from \"./modules/viewport\";\nimport './scss/main.scss';\nimport { createSampleData } from \"./utils/createData\";\nimport { Cache, CachedColumn, CachedRow } from \"./modules/cache\";\nimport { Row } from \"./modules/row\";\nimport { Column } from \"./modules/column\";\nexport default class Spreadsheet {\n table;\n scroller;\n toolbar;\n header;\n sheet;\n editor;\n styles;\n config;\n data;\n viewport;\n selection;\n cache;\n constructor(target, props) {\n const data = createSampleData(40, 40);\n const config = this.makeConfigFromData(data, props?.view ?? { height: 600, width: 800 });\n if (props?.view) {\n config.view = props.view;\n }\n this.config = new Config(config);\n this.sheet = new Sheet(this);\n this.table = new Table(this);\n this.scroller = new Scroller(this);\n this.toolbar = new Toolbar(this);\n this.header = new Header(this);\n this.editor = new Editor(this);\n this.cache = this.getInitialCache();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.selection = new Selection();\n this.data = data;\n this.styles = new Styles();\n this.buildComponent();\n this.appendTableToTarget(target);\n this.renderSheet();\n }\n getInitialCache() {\n const cachedCols = [];\n let currentWidth = 0;\n for (let i = 0; i <= this.config.columns.length - 1; i++) {\n const col = this.config.columns[i];\n currentWidth += col.width;\n const cacheCol = new CachedColumn({\n xPos: currentWidth,\n colIdx: i\n });\n cachedCols.push(cacheCol);\n }\n const cachedRows = [];\n let currentHeight = 0;\n for (let i = 0; i <= this.config.rows.length - 1; i++) {\n const row = this.config.rows[i];\n currentHeight += row.height;\n const cacheRow = new CachedRow({\n yPos: currentHeight,\n rowIdx: i\n });\n cachedRows.push(cacheRow);\n }\n const cache = new Cache({\n columns: cachedCols,\n rows: cachedRows\n });\n console.log(\"CACHE: \", cache);\n console.log(\"CONFIG: \", this.config);\n return cache;\n }\n buildComponent() {\n const content = document.createElement('div'); //* Abstract\n content.appendChild(this.header.element);\n content.appendChild(this.sheet.element);\n content.classList.add('content');\n this.table.element.appendChild(this.toolbar.element);\n this.table.element.appendChild(content);\n this.table.element.appendChild(this.scroller.element);\n this.table.element.append(this.editor.element);\n }\n /**Destroy spreadsheet DOM element.\n *\n * May be usefull when need to rerender component.\n */\n destroy() {\n this.table.element.remove();\n }\n appendTableToTarget(target) {\n if (typeof target === 'string') {\n const element = document.querySelector(target);\n if (!element)\n throw new Error(`Element with selector ${target} is not finded in DOM.\\n Make sure it exists.`);\n element?.appendChild(this.table.element);\n }\n if (target instanceof HTMLElement) {\n target.append(this.table.element);\n }\n }\n /** Canvas rendering context 2D.\n *\n * Abble to draw on canvas with default CanvasAPI methods\n */\n get ctx() {\n return this.sheet.ctx;\n }\n get viewProps() {\n return this.config.view;\n }\n /** Focusing on interactive part of spreadsheet */\n focusTable() {\n this.scroller.element.focus();\n }\n getCellByCoords(x, y) {\n return this.sheet.getCellByCoords(x, y);\n }\n getCell(position) {\n const { column, row } = position;\n return this.data[row][column];\n }\n changeCellValues(position, values) {\n const { column, row } = position;\n this.data[row][column].changeValues(values);\n this.renderCell(row, column);\n }\n applyActionToRange(range, callback) {\n const fromRow = Math.min(range.from.row, range.to.row);\n const toRow = Math.max(range.from.row, range.to.row);\n const fromCol = Math.min(range.from.column, range.to.column);\n const toCol = Math.max(range.from.column, range.to.column);\n for (let row = fromRow; row <= toRow; row++) {\n for (let col = fromCol; col <= toCol; col++) {\n const cell = this.data[row][col];\n callback(cell);\n }\n }\n }\n deleteSelectedCellsValues() {\n if (this.selection.selectedRange !== null) {\n this.applyActionToRange(this.selection.selectedRange, cell => {\n this.changeCellValues(cell.position, {\n displayValue: '',\n resultValue: '',\n value: ''\n });\n });\n }\n else {\n if (!this.selection.selectedCell)\n return;\n this.changeCellValues(this.selection.selectedCell, {\n displayValue: '',\n resultValue: '',\n value: ''\n });\n }\n }\n showEditor(position) {\n this.editor.show(position);\n }\n renderSheet() {\n this.sheet.renderSheet();\n }\n renderCell(row, col) {\n this.data[row][col].render(this);\n }\n loadData(data) {\n const rowsLength = data.length;\n const colsLength = data[0] ? this.data[0].length : 0;\n this.data = [];\n const formattedData = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n const cell = data[row][col];\n innerRow.push(new Cell({\n displayValue: cell.displayValue,\n position: cell.position,\n resultValue: cell.resultValue,\n value: cell.value\n }));\n }\n formattedData.push(innerRow);\n }\n this.data = formattedData;\n this.selection.selectedCell = null;\n this.selection.selectedRange = null;\n this.config = this.makeConfigFromData(formattedData, this.config.view);\n this.cache = this.getInitialCache();\n this.scroller.updateScrollerSize();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.renderSheet();\n return this;\n }\n makeConfigFromData(data, view) {\n const lastRowIdx = data.length - 1;\n const lastColIdx = data[0] ? data[0].length : 0;\n const rows = [];\n for (let row = 0; row < lastRowIdx; row++) {\n rows.push(new Row({\n height: 40,\n title: String(row)\n }));\n }\n const columns = [];\n for (let col = 0; col < lastColIdx; col++) {\n columns.push(new Column({\n width: 150,\n title: String(col)\n }));\n }\n const config = new Config({\n view,\n rows,\n columns\n });\n return config;\n }\n serializeData() {\n const rowsLength = this.data.length;\n const colsLength = this.data[0] ? this.data[0].length : 0;\n const cellsArray = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n innerRow.push(this.data[row][col].getSerializableCell());\n }\n cellsArray.push(innerRow);\n }\n return cellsArray;\n }\n}\nexport * from './modules/cache';\nexport * from './modules/cell';\nexport * from './modules/column';\nexport * from './modules/config';\nexport * from './modules/renderBox';\nexport * from './modules/row';\nexport * from './modules/selection';\nexport * from './modules/styles';\nexport * from './modules/viewport';\nexport * from './utils/createData';\n"],"names":["RenderBox","config","cellPosition","__publicField","column","x","i","row","y","Editor","root","event","key","target","element","position","height","width","cell","Header","headerElement","Scroller","offsetX","offsetY","lastSelectedCell","clickedCell","rect","horizontalScroller","scroller","verticalScroller","scrollTop","scrollLeft","bottom","right","groupScrollers","stack","acc","curr","totalHeight","totalWidth","CellStyles","props","Position","SerializableCell","Cell","values","selectedRange","isCellInRow","ctx","isCellSelected","_a","isCellInRange","Sheet","canvas","col","firstRowIdx","lastColIdx","lastRowIdx","firstColIdx","Table","container","sizes","Toolbar","toolbarElement","Config","Selection","Styles","Viewport","Column","Row","createSampleData","rows","columns","fillCellsByCoords","data","innerRow","value","createSampleConfig","rowsArr","rowItem","colsArr","colItem","makeSpreadsheetConfigAndData","CachedColumn","CachedRow","Cache","initial","rowIdx","colIdx","Spreadsheet","cachedCols","currentWidth","cacheCol","cachedRows","currentHeight","cacheRow","cache","content","range","callback","fromRow","toRow","fromCol","toCol","rowsLength","colsLength","formattedData","view","cellsArray"],"mappings":"oRAAO,MAAMA,CAAU,CAKnB,YAAYC,EAAQC,EAAc,CAJlCC,EAAA,UACAA,EAAA,UACAA,EAAA,cACAA,EAAA,eAEI,KAAK,EAAI,KAAK,UAAUD,EAAa,OAAQD,CAAM,EACnD,KAAK,EAAI,KAAK,UAAUC,EAAa,IAAKD,CAAM,EAChD,KAAK,MAAQA,EAAO,QAAQC,EAAa,MAAM,EAAE,MACjD,KAAK,OAASD,EAAO,KAAKC,EAAa,GAAG,EAAE,MAChD,CACA,UAAUE,EAAQH,EAAQ,CACtB,IAAII,EAAI,EACR,QAASC,EAAI,EAAGA,EAAIF,EAAQE,IACnBD,GAAAJ,EAAO,QAAQK,CAAC,EAAE,MAEpB,OAAAD,CACX,CACA,UAAUE,EAAKN,EAAQ,CACnB,IAAIO,EAAI,EACR,QAASF,EAAI,EAAGA,EAAIC,EAAKD,IAChBE,GAAAP,EAAO,KAAKK,CAAC,EAAE,OAEjB,OAAAE,CACX,CACJ,CCxBO,MAAMC,CAAO,CAGhB,YAAYC,EAAM,CAFlBP,EAAA,gBACAA,EAAA,aA+BAA,EAAA,qBAAiBQ,GAAU,CACjB,KAAA,CAAE,IAAAC,CAAQ,EAAAD,EAChB,OAAQC,EAAK,CACT,IAAK,SAAU,CACX,KAAK,KAAK,EACV,KACJ,CACA,IAAK,QACD,KAAK,KAAK,iBAAiB,KAAK,KAAK,UAAU,aAAc,CACzD,MAAO,KAAK,QAAQ,MACpB,aAAc,KAAK,QAAQ,KAAA,CAC9B,EACD,KAAK,KAAK,CAElB,CAAA,GAEJT,EAAA,0BAAsBQ,GAAU,CAC5B,MAAME,EAASF,EAAM,OAChB,KAAK,QAAQ,SAASE,CAAM,GAC7B,KAAK,KAAK,CACd,GAjDA,KAAK,KAAOH,EACN,MAAAI,EAAU,SAAS,cAAc,OAAO,EACtCA,EAAA,UAAU,IAAI,QAAQ,EAC9B,KAAK,QAAUA,EACf,KAAK,KAAK,CACd,CACA,MAAO,CACE,KAAA,QAAQ,MAAM,QAAU,OACxB,KAAA,QAAQ,UAAU,IAAI,MAAM,EACjC,KAAK,QAAQ,OACN,OAAA,oBAAoB,QAAS,KAAK,kBAAkB,EAC3D,KAAK,QAAQ,oBAAoB,UAAW,KAAK,aAAa,EAC9D,KAAK,KAAK,YACd,CACA,KAAKC,EAAU,CACL,KAAA,CAAE,OAAAC,EAAQ,MAAAC,EAAO,EAAAZ,EAAG,EAAAG,CAAM,EAAA,IAAIR,EAAU,KAAK,KAAK,OAAQe,CAAQ,EAClEG,EAAO,KAAK,KAAK,QAAQH,CAAQ,EAClC,KAAA,QAAQ,UAAU,OAAO,MAAM,EACpC,KAAK,QAAQ,MAAM,IAAOP,EAAI,KAAK,KAAK,SAAS,IAAO,KACxD,KAAK,QAAQ,MAAM,KAAQH,EAAI,KAAK,KAAK,SAAS,KAAQ,KACrD,KAAA,QAAQ,MAAM,MAAQY,EAAQ,KAC9B,KAAA,QAAQ,MAAM,OAASD,EAAS,KAChC,KAAA,QAAQ,MAAM,QAAU,QACtB,OAAA,iBAAiB,QAAS,KAAK,kBAAkB,EACxD,KAAK,QAAQ,iBAAiB,UAAW,KAAK,aAAa,EACtD,KAAA,QAAQ,MAAQE,EAAK,MAC1B,KAAK,QAAQ,QACb,KAAK,QAAQ,QACjB,CAuBJ,CCxDO,MAAMC,CAAO,CAGhB,YAAYT,EAAM,CAFlBP,EAAA,gBACAA,EAAA,aAEI,KAAK,KAAOO,EACN,MAAAU,EAAgB,SAAS,cAAc,QAAQ,EACrDA,EAAc,UAAU,MACxB,KAAK,QAAUA,CACnB,CACJ,CCTO,MAAMC,CAAS,CAMlB,YAAYX,EAAM,CALlBP,EAAA,gBACAA,EAAA,yBACAA,EAAA,2BACAA,EAAA,aACAA,EAAA,mBAAc,IAkBdA,EAAA,uBAAmBQ,GAAU,CACzB,GAAI,CAAC,KAAK,YACN,OACE,KAAA,CAAE,QAAAW,EAAS,QAAAC,CAAY,EAAAZ,EACvBa,EAAmB,KAAK,KAAK,gBAAgBF,EAASC,CAAO,EAC/D,KAAK,KAAK,UAAU,gBACf,KAAA,KAAK,UAAU,cAAc,GAAKC,GAE3C,KAAK,KAAK,aAAY,GAE1BrB,EAAA,qBAAgB,IAAM,CAClB,KAAK,YAAc,GACf,KAAK,KAAK,UAAU,eACf,KAAK,KAAK,UAAU,cAAc,KAAK,MAAQ,KAAK,KAAK,UAAU,cAAc,GAAG,KACpF,KAAK,KAAK,UAAU,cAAc,KAAK,SAAW,KAAK,KAAK,UAAU,cAAc,GAAG,SACnF,KAAA,KAAK,UAAU,cAAgB,MAG5C,KAAK,KAAK,aAAY,GAE1BA,EAAA,yBAAqBQ,GAAU,CAC3BA,EAAM,eAAe,EACrB,MAAMI,EAAW,KAAK,KAAK,gBAAgBJ,EAAM,QAASA,EAAM,OAAO,EAClE,KAAA,KAAK,WAAWI,CAAQ,CAAA,GAEjCZ,EAAA,qBAAiBQ,GAAU,CAGnB,GAFJ,QAAQ,IAAIA,CAAK,EAEb,CAAC,YAAa,aAAc,UAAW,WAAW,EAAE,SAASA,EAAM,GAAG,EAGtE,OAFAA,EAAM,eAAe,EAChB,KAAA,KAAK,UAAU,cAAgB,KAC5BA,EAAM,IAAK,CACf,IAAK,YAAa,CACV,KAAK,KAAK,UAAU,cAAgB,KAAK,KAAK,UAAU,aAAa,OAAS,IAC9E,QAAQ,IAAI,MAAM,EACb,KAAA,KAAK,UAAU,aAAa,QAAU,EAC3C,KAAK,KAAK,eAEd,KACJ,CACA,IAAK,aAAc,CACX,KAAK,KAAK,UAAU,cAAgB,KAAK,KAAK,UAAU,aAAa,OAAS,KAAK,KAAK,OAAO,QAAQ,OAAS,IAC3G,KAAA,KAAK,UAAU,aAAa,QAAU,EAC3C,KAAK,KAAK,eAEd,KACJ,CACA,IAAK,UAAW,CACR,KAAK,KAAK,UAAU,cAAgB,KAAK,KAAK,UAAU,aAAa,IAAM,IACtE,KAAA,KAAK,UAAU,aAAa,KAAO,EACxC,KAAK,KAAK,eAEd,KACJ,CACA,IAAK,YAAa,CACV,KAAK,KAAK,UAAU,cAAgB,KAAK,KAAK,UAAU,aAAa,IAAM,KAAK,KAAK,OAAO,KAAK,OAAS,IACrG,KAAA,KAAK,UAAU,aAAa,KAAO,EACxC,KAAK,KAAK,eAEd,KACJ,CACJ,CAEJ,GAAI,CAACA,EAAM,SAAW,CAACA,EAAM,UACrBA,EAAM,MAAQ,MAAQ,kBAAkB,KAAKA,EAAM,IAAI,YAAY,CAAC,GAAG,CAEnE,GADJA,EAAM,eAAe,EACjB,CAAC,KAAK,KAAK,UAAU,aACrB,OACJ,KAAK,KAAK,WAAW,KAAK,KAAK,UAAU,YAAY,CACzD,CAEAA,EAAM,MAAQ,WACdA,EAAM,eAAe,EACrB,KAAK,KAAK,4BACV,KAAK,KAAK,cACd,GAEJR,EAAA,mBAAeQ,GAAU,CACrB,GAAIA,EAAM,SAAW,EACjB,OACE,KAAA,CAAE,QAAAW,EAAS,QAAAC,CAAY,EAAAZ,EACvBc,EAAc,KAAK,KAAK,gBAAgBH,EAASC,CAAO,EAC9D,KAAK,YAAc,GACd,KAAA,KAAK,UAAU,cAAgB,CAChC,KAAME,EACN,GAAIA,CAAA,EAEH,KAAA,KAAK,UAAU,aAAeA,EACnC,KAAK,KAAK,aAAY,GAE1BtB,EAAA,oBAAe,IAAM,CACX,MAAAuB,EAAO,KAAK,2BACb,KAAA,KAAK,SAAS,aAAaA,CAAI,EACpC,KAAK,KAAK,aAAY,GA7GtB,KAAK,KAAOhB,EACZ,KAAM,CAAE,mBAAAiB,EAAoB,SAAAC,EAAU,iBAAAC,CAAiB,EAAI,KAAK,iBAChE,KAAK,QAAUD,EACf,KAAK,iBAAmBC,EACxB,KAAK,mBAAqBF,EAC1B,KAAK,QAAQ,MAAM,OAAS,KAAK,KAAK,OAAO,KAAK,OAAS,KAC3D,KAAK,QAAQ,MAAM,MAAQ,KAAK,KAAK,OAAO,KAAK,MAAQ,KACzD,KAAK,QAAQ,SAAW,GACxB,KAAK,mBAAmB,EACxB,KAAK,QAAQ,iBAAiB,SAAU,KAAK,YAAY,EACzD,KAAK,QAAQ,iBAAiB,YAAa,KAAK,WAAW,EAC3D,KAAK,QAAQ,iBAAiB,YAAa,KAAK,eAAe,EAC/D,KAAK,QAAQ,iBAAiB,UAAW,KAAK,aAAa,EAC3D,KAAK,QAAQ,iBAAiB,WAAY,KAAK,iBAAiB,EAChE,KAAK,QAAQ,iBAAiB,UAAW,KAAK,aAAa,CAC/D,CAgGA,0BAA2B,CACvB,KAAM,CAAE,UAAAG,EAAW,WAAAC,GAAe,KAAK,QACjC,CAAE,OAAAf,EAAQ,MAAAC,CAAA,EAAU,KAAK,QAAQ,wBACjCe,EAASF,EAAYd,EACrBiB,EAAQF,EAAad,EACpB,MAAA,CACH,IAAKa,EACL,KAAMC,EACN,OAAAC,EACA,MAAAC,CAAA,CAER,CACA,gBAAiB,CACP,MAAAL,EAAW,SAAS,cAAc,KAAK,EACvCC,EAAmB,SAAS,cAAc,KAAK,EAC/CF,EAAqB,SAAS,cAAc,KAAK,EACjDO,EAAiB,SAAS,cAAc,KAAK,EAC7CC,EAAQ,SAAS,cAAc,KAAK,EAC1C,OAAAN,EAAiB,MAAM,MAAQ,MAC/BA,EAAiB,MAAM,cAAgB,OACvCF,EAAmB,MAAM,cAAgB,OACzCO,EAAe,MAAM,QAAU,OAC/BC,EAAM,YAAYN,CAAgB,EAClCM,EAAM,YAAYR,CAAkB,EACpCO,EAAe,YAAYC,CAAK,EAChC,KAAK,iBAAmBN,EACxB,KAAK,mBAAqBF,EAC1BC,EAAS,YAAYM,CAAc,EAC1BN,EAAA,UAAU,IAAI,UAAU,EAC1B,CAAE,SAAAA,EAAU,iBAAAC,EAAkB,mBAAAF,EACzC,CACA,iBAAkB,CACd,OAAO,KAAK,KAAK,OAAO,KAAK,OAAO,CAACS,EAAKC,KACtCD,GAAOC,EAAK,OACLD,GACR,CAAC,CACR,CACA,gBAAiB,CACb,OAAO,KAAK,KAAK,OAAO,QAAQ,OAAO,CAACA,EAAKC,KACzCD,GAAOC,EAAK,MACLD,GACR,CAAC,CACR,CACA,oBAAqB,CACX,MAAAE,EAAc,KAAK,kBACnBC,EAAa,KAAK,iBACxB,KAAK,kBAAkBD,CAAW,EAClC,KAAK,iBAAiBC,CAAU,CACpC,CACA,kBAAkBvB,EAAQ,CACjB,KAAA,iBAAiB,MAAM,OAASA,EAAS,IAClD,CACA,iBAAiBC,EAAO,CACf,KAAA,mBAAmB,MAAM,MAAQA,EAAQ,IAClD,CACJ,CC5KO,MAAMuB,CAAW,CAOpB,YAAYC,EAAO,CANnBtC,EAAA,gBAAW,IACXA,EAAA,iBAAY,SACZA,EAAA,kBAAa,SACbA,EAAA,mBAAc,SACdA,EAAA,0BAAqB,WACrBA,EAAA,yBAAoB,WAEZsC,GACO,OAAA,OAAO,KAAMA,CAAK,CAEjC,CACJ,CACO,MAAMC,CAAS,CAGlB,YAAYnC,EAAKH,EAAQ,CAFzBD,EAAA,YACAA,EAAA,eAEI,KAAK,IAAMI,EACX,KAAK,OAASH,CAClB,CACJ,CACO,MAAMuC,CAAiB,CAM1B,YAAYF,EAAO,CALnBtC,EAAA,cACAA,EAAA,qBACAA,EAAA,oBACAA,EAAA,iBACAA,EAAA,cAEI,KAAK,MAAQsC,EAAM,MACnB,KAAK,aAAeA,EAAM,aAC1B,KAAK,YAAcA,EAAM,YACzB,KAAK,SAAWA,EAAM,SACtB,KAAK,MAAQA,EAAM,KACvB,CACJ,CACO,MAAMG,CAAK,CAOd,YAAYH,EAAO,CANnBtC,EAAA,cACAA,EAAA,qBAEAA,EAAA,oBACAA,EAAA,iBACAA,EAAA,aAAQ,IAAIqC,GAER,KAAK,MAAQC,EAAM,MACnB,KAAK,aAAeA,EAAM,aAC1B,KAAK,YAAcA,EAAM,YACzB,KAAK,SAAWA,EAAM,QAC1B,CACA,qBAAsB,CAQX,OAPM,IAAIE,EAAiB,CAC9B,aAAc,KAAK,aACnB,SAAU,KAAK,SACf,YAAa,KAAK,YAClB,MAAO,KAAK,MACZ,MAAO,KAAK,KAAA,CACf,CAEL,CACA,aAAaE,EAAQ,CACV,OAAA,OAAO,KAAMA,CAAM,CAC9B,CACA,cAAcnC,EAAM,CAChB,KAAM,CAAE,OAAAN,EAAQ,IAAAG,GAAQ,KAAK,SACvB,CAAE,cAAAuC,CAAc,EAAIpC,EAAK,UAC/B,GAAI,CAACoC,EACM,MAAA,GACX,MAAMC,EAAcxC,GAAO,KAAK,IAAIuC,EAAc,KAAK,IAAKA,EAAc,GAAG,GAAG,GAAKvC,GAAO,KAAK,IAAIuC,EAAc,GAAG,IAAKA,EAAc,KAAK,GAAG,EAEjJ,OADoB1C,GAAU,KAAK,IAAI0C,EAAc,KAAK,OAAQA,EAAc,GAAG,MAAM,GAAK1C,GAAU,KAAK,IAAI0C,EAAc,GAAG,OAAQA,EAAc,KAAK,MAAM,GAC7IC,CAC1B,CACA,OAAOrC,EAAM,OACL,GAAA,CAAE,OAAAM,EAAQ,MAAAC,EAAO,EAAAZ,EAAG,EAAAG,CAAM,EAAA,IAAIR,EAAUU,EAAK,OAAQ,KAAK,QAAQ,EAChE,KAAA,CAAE,IAAAsC,CAAQ,EAAAtC,EACVuC,IAAkBC,EAAAxC,EAAK,UAAU,eAAf,YAAAwC,EAA6B,OAAQ,KAAK,SAAS,KAAOxC,EAAK,UAAU,aAAa,SAAW,KAAK,SAAS,OACjIyC,EAAgB,KAAK,cAAczC,CAAI,EAC7CF,GAAKE,EAAK,SAAS,IACnBL,GAAKK,EAAK,SAAS,KACnBsC,EAAI,UAAU3C,EAAGG,EAAGS,EAAOD,CAAM,EACjCgC,EAAI,UAAYC,GAAkBE,EAAgB,KAAK,MAAM,mBAAqB,KAAK,MAAM,WAC7FH,EAAI,YAAc,QAClBA,EAAI,SAAS3C,EAAGG,EAAGS,EAAQ,EAAGD,EAAS,CAAC,EACxCgC,EAAI,WAAW3C,EAAGG,EAAGS,EAAOD,CAAM,EAClCgC,EAAI,UAAYC,GAAkBE,EAAgB,KAAK,MAAM,kBAAoB,KAAK,MAAM,UAC5FH,EAAI,UAAY,OAChBA,EAAI,KAAO,GAAG,KAAK,MAAM,QAAQ,WACjCA,EAAI,aAAe,SACnBA,EAAI,SAAS,KAAK,aAAc3C,EAAI,EAAGG,EAAIQ,EAAS,CAAC,CACzD,CACJ,CCrFO,MAAMoC,CAAM,CAIf,YAAY1C,EAAM,CAHlBP,EAAA,gBACAA,EAAA,YACAA,EAAA,aAEI,KAAK,KAAOO,EACN,MAAA2C,EAAS,SAAS,cAAc,QAAQ,EACvCA,EAAA,UAAU,IAAI,OAAO,EAE5BA,EAAO,OAAS,KAAK,KAAK,OAAO,KAAK,OACtCA,EAAO,MAAQ,KAAK,KAAK,OAAO,KAAK,MACrCA,EAAO,MAAM,MAAQ,KAAK,KAAK,OAAO,KAAK,MAAQ,KACnDA,EAAO,MAAM,OAAS,KAAK,KAAK,OAAO,KAAK,OAAS,KACrD,KAAK,QAAUA,EACf,MAAML,EAAM,KAAK,QAAQ,WAAW,IAAI,EACxC,GAAI,CAACA,EACK,MAAA,IAAI,MAAM,8BAA8B,EAClD,KAAK,IAAMA,CACf,CACA,gBAAgB3C,EAAGG,EAAG,CAClB,IAAID,EAAM,EACNS,EAAS,EACb,KAAOA,GAAUR,IACbQ,GAAU,KAAK,KAAK,OAAO,KAAKT,CAAG,EAAE,OACjC,EAAAS,GAAUR,KAEdD,IAEJ,IAAI+C,EAAM,EACNrC,EAAQ,EACZ,KAAOA,GAASZ,IACZY,GAAS,KAAK,KAAK,OAAO,QAAQqC,CAAG,EAAE,MACnC,EAAArC,GAASZ,KAEbiD,IAEG,OAAA,IAAIZ,EAASnC,EAAK+C,CAAG,CAChC,CACA,WAAWvC,EAAU,CACX,KAAA,CAAE,OAAAX,EAAQ,IAAAG,CAAQ,EAAAQ,EACnB,KAAA,KAAK,KAAKR,CAAG,EAAEH,CAAM,EAAE,OAAO,KAAK,IAAI,CAChD,CACA,aAAc,CACJ,MAAAmD,EAAc,KAAK,KAAK,SAAS,SACjCC,EAAa,KAAK,KAAK,SAAS,QAAU,EAC1CC,EAAa,KAAK,KAAK,SAAS,QAAU,EAC1CC,EAAc,KAAK,KAAK,SAAS,SACvC,QAASnD,EAAMgD,EAAahD,GAAOkD,EAAYlD,IAC3C,QAAS+C,EAAMI,EAAaJ,GAAOE,GAC3B,GAAC,KAAK,KAAK,OAAO,QAAQF,CAAG,GAAK,CAAC,KAAK,KAAK,OAAO,KAAK/C,CAAG,GADrB+C,IAG3C,KAAK,WAAW,CAAE,OAAQA,EAAK,IAAA/C,CAAK,CAAA,CAGhD,CACJ,CC1DO,MAAMoD,CAAM,CAGf,YAAYjD,EAAM,CAFlBP,EAAA,gBACAA,EAAA,aAEI,KAAK,KAAOO,EACN,MAAAkD,EAAY,SAAS,cAAc,KAAK,EACpCA,EAAA,UAAU,IAAI,uBAAuB,EAC/C,KAAK,QAAUA,EACV,KAAA,mBAAmB,KAAK,KAAK,SAAS,CAC/C,CACA,mBAAmBC,EAAO,CAChB,KAAA,CAAE,OAAA7C,EAAQ,MAAAC,CAAU,EAAA4C,EACrB,KAAA,QAAQ,MAAM,MAAQ5C,EAAQ,KAC9B,KAAA,QAAQ,MAAM,OAASD,EAAS,IACzC,CACJ,CChBO,MAAM8C,CAAQ,CAGjB,YAAYpD,EAAM,CAFlBP,EAAA,gBACAA,EAAA,aAEI,KAAK,KAAOO,EACN,MAAAqD,EAAiB,SAAS,cAAc,KAAK,EACpCA,EAAA,UAAU,IAAI,SAAS,EACtC,KAAK,QAAUA,CACnB,CACJ,CCTO,MAAMC,CAAO,CAOhB,YAAYvB,EAAO,CANnBtC,EAAA,aACAA,EAAA,gBACAA,EAAA,YAAO,CACH,MAAO,IACP,OAAQ,GAAA,GAGR,KAAK,QAAUsC,EAAM,QACrB,KAAK,KAAOA,EAAM,KAClB,KAAK,KAAOA,EAAM,IACtB,CACJ,CCZO,MAAMwB,CAAU,CAAhB,cACH9D,EAAA,oBAAe,MACfA,EAAA,qBAAgB,MACpB,CCHO,MAAM+D,CAAO,CACpB,CCDO,MAAMC,CAAS,CAUlB,YAAYzD,EAAM+B,EAAO,CATzBtC,EAAA,aACAA,EAAA,YACAA,EAAA,aACAA,EAAA,cACAA,EAAA,eACAA,EAAA,iBACAA,EAAA,gBACAA,EAAA,iBACAA,EAAA,gBAEI,KAAK,KAAOO,EACZ,KAAK,IAAM+B,EAAM,IACjB,KAAK,KAAOA,EAAM,KAClB,KAAK,MAAQA,EAAM,MACnB,KAAK,OAASA,EAAM,OACf,KAAA,SAAW,KAAK,cAChB,KAAA,QAAU,KAAK,cAAY;AAC3B,KAAA,SAAW,KAAK,cAAY;AAC5B,KAAA,QAAU,KAAK,aACpB,KAAK,aAAa,CACd,IAAK,EACL,KAAM,EACN,MAAO,KAAK,KAAK,UAAU,MAC3B,OAAQ,KAAK,KAAK,UAAU,MAAA,CAC/B,CACL,CACA,aAAaA,EAAO,CAChB,KAAK,IAAMA,EAAM,IACjB,KAAK,KAAOA,EAAM,KAClB,KAAK,MAAQA,EAAM,MACnB,KAAK,OAASA,EAAM,OACf,KAAA,SAAW,KAAK,cAChB,KAAA,QAAU,KAAK,aACf,KAAA,SAAW,KAAK,cAChB,KAAA,QAAU,KAAK,YACxB,CAEA,aAAc,CAEH,OADM,KAAK,KAAK,MAAM,eAAe,KAAK,GAAG,CAExD,CACA,YAAa,CAEF,OADM,KAAK,KAAK,MAAM,eAAe,KAAK,MAAM,CAE3D,CACA,aAAc,CAEH,OADM,KAAK,KAAK,MAAM,kBAAkB,KAAK,IAAI,CAE5D,CACA,YAAa,CAEF,OADM,KAAK,KAAK,MAAM,kBAAkB,KAAK,KAAK,CAE7D,CACJ,CCtDO,MAAM2B,CAAO,CAGhB,YAAY3B,EAAO,CAFnBtC,EAAA,cACAA,EAAA,cAEI,KAAK,MAAQsC,EAAM,MACnB,KAAK,MAAQA,EAAM,KACvB,CACJ,CCPO,MAAM4B,CAAI,CAGb,YAAY5B,EAAO,CAFnBtC,EAAA,eACAA,EAAA,cAEI,KAAK,OAASsC,EAAM,OACpB,KAAK,MAAQA,EAAM,KACvB,CACJ,CCHO,SAAS6B,EAAiBC,EAAMC,EAASC,EAAoB,GAAO,CACvE,MAAMC,EAAO,CAAA,EACb,QAASnE,EAAM,EAAGA,GAAOgE,EAAMhE,IAAO,CAClC,MAAMoE,EAAW,CAAA,EACjB,QAASrB,EAAM,EAAGA,GAAOkB,EAASlB,IAAO,CACrC,MAAMsB,EAAQH,EAAoB,GAAGlE,CAAG,IAAI+C,CAAG,GAAK,GAC9CpC,EAAO,IAAI0B,EAAK,CAClB,aAAcgC,EACd,YAAaA,EACb,MAAAA,EACA,SAAU,CACN,OAAQtB,EACR,IAAA/C,CACJ,CAAA,CACH,EACDoE,EAAS,KAAKzD,CAAI,CACtB,CACAwD,EAAK,KAAKC,CAAQ,CACtB,CACO,OAAAD,CACX,CACgB,SAAAG,EAAmBN,EAAMC,EAAS,CAC9C,MAAMM,EAAU,CAAA,EAChB,QAASxE,EAAI,EAAGA,GAAKiE,EAAMjE,IAAK,CACtB,MAAAyE,EAAU,IAAIV,EAAI,CACpB,OAAQ,GACR,MAAO,OAAO/D,CAAC,CAAA,CAClB,EACDwE,EAAQ,KAAKC,CAAO,CACxB,CACA,MAAMC,EAAU,CAAA,EAChB,QAAS1E,EAAI,EAAGA,GAAKkE,EAASlE,IAAK,CACzB,MAAA2E,EAAU,IAAIb,EAAO,CACvB,MAAO,OAAO9D,CAAC,EACf,MAAO,GAAA,CACV,EACD0E,EAAQ,KAAKC,CAAO,CACxB,CASO,OARQ,IAAIjB,EAAO,CACtB,QAASgB,EACT,KAAMF,EACN,KAAM,CACF,OAAQ,IACR,MAAO,GACX,CAAA,CACH,CAEL,CACgB,SAAAI,EAA6BX,EAAMC,EAAS,CAClD,MAAAE,EAAOJ,EAAiBC,EAAMC,CAAO,EACrCvE,EAAS4E,EAAmBN,EAAMC,CAAO,EACxC,MAAA,CAAE,KAAAE,EAAM,OAAAzE,EACnB,CCxDO,MAAMkF,CAAa,CAGtB,YAAY1C,EAAO,CAFnBtC,EAAA,aACAA,EAAA,eAEI,KAAK,KAAOsC,EAAM,KAClB,KAAK,OAASA,EAAM,MACxB,CACJ,CACO,MAAM2C,CAAU,CAGnB,YAAY3C,EAAO,CAFnBtC,EAAA,aACAA,EAAA,eAEI,KAAK,KAAOsC,EAAM,KAClB,KAAK,OAASA,EAAM,MACxB,CACJ,CACO,MAAM4C,CAAM,CAGf,YAAYC,EAAS,CAFrBnF,EAAA,gBACAA,EAAA,aAEI,KAAK,QAAUmF,EAAQ,QACvB,KAAK,KAAOA,EAAQ,IACxB,CACA,eAAe9E,EAAG,CACd,IAAI+E,EAAS,EACb,QAASjF,EAAI,EAAGA,EAAI,KAAK,KAAK,OAAQA,IAClC,GAAIE,GAAK,KAAK,KAAKF,CAAC,EAAE,KAAM,CACfiF,EAAAjF,EACT,KACJ,CAEG,OAAAiF,CACX,CACA,kBAAkBlF,EAAG,CACjB,IAAImF,EAAS,EACb,QAASlF,EAAI,EAAGA,EAAI,KAAK,QAAQ,OAAQA,IACrC,GAAID,GAAK,KAAK,QAAQC,CAAC,EAAE,KAAM,CAClBkF,EAAAlF,EACT,KACJ,CAEG,OAAAkF,CACX,CACJ,CC3BA,MAAqBC,CAAY,CAa7B,YAAY5E,EAAQ4B,EAAO,CAZ3BtC,EAAA,cACAA,EAAA,iBACAA,EAAA,gBACAA,EAAA,eACAA,EAAA,cACAA,EAAA,eACAA,EAAA,eACAA,EAAA,eACAA,EAAA,aACAA,EAAA,iBACAA,EAAA,kBACAA,EAAA,cAEU,MAAAuE,EAAOJ,EAAiB,GAAI,EAAE,EAC9BrE,EAAS,KAAK,mBAAmByE,GAAMjC,GAAA,YAAAA,EAAO,OAAQ,CAAE,OAAQ,IAAK,MAAO,GAAK,CAAA,EACnFA,GAAA,MAAAA,EAAO,OACPxC,EAAO,KAAOwC,EAAM,MAEnB,KAAA,OAAS,IAAIuB,EAAO/D,CAAM,EAC1B,KAAA,MAAQ,IAAImD,EAAM,IAAI,EACtB,KAAA,MAAQ,IAAIO,EAAM,IAAI,EACtB,KAAA,SAAW,IAAItC,EAAS,IAAI,EAC5B,KAAA,QAAU,IAAIyC,EAAQ,IAAI,EAC1B,KAAA,OAAS,IAAI3C,EAAO,IAAI,EACxB,KAAA,OAAS,IAAIV,EAAO,IAAI,EACxB,KAAA,MAAQ,KAAK,kBAClB,KAAK,SAAW,IAAI0D,EAAS,KAAM,KAAK,SAAS,0BAA0B,EACtE,KAAA,UAAY,IAAIF,EACrB,KAAK,KAAOS,EACP,KAAA,OAAS,IAAIR,EAClB,KAAK,eAAe,EACpB,KAAK,oBAAoBrD,CAAM,EAC/B,KAAK,YAAY,CACrB,CACA,iBAAkB,CACd,MAAM6E,EAAa,CAAA,EACnB,IAAIC,EAAe,EACV,QAAA,EAAI,EAAG,GAAK,KAAK,OAAO,QAAQ,OAAS,EAAG,IAAK,CACtD,MAAMrC,EAAM,KAAK,OAAO,QAAQ,CAAC,EACjCqC,GAAgBrC,EAAI,MACd,MAAAsC,EAAW,IAAIT,EAAa,CAC9B,KAAMQ,EACN,OAAQ,CAAA,CACX,EACDD,EAAW,KAAKE,CAAQ,CAC5B,CACA,MAAMC,EAAa,CAAA,EACnB,IAAIC,EAAgB,EACX,QAAA,EAAI,EAAG,GAAK,KAAK,OAAO,KAAK,OAAS,EAAG,IAAK,CACnD,MAAMvF,EAAM,KAAK,OAAO,KAAK,CAAC,EAC9BuF,GAAiBvF,EAAI,OACf,MAAAwF,EAAW,IAAIX,EAAU,CAC3B,KAAMU,EACN,OAAQ,CAAA,CACX,EACDD,EAAW,KAAKE,CAAQ,CAC5B,CACM,MAAAC,EAAQ,IAAIX,EAAM,CACpB,QAASK,EACT,KAAMG,CAAA,CACT,EACO,eAAA,IAAI,UAAWG,CAAK,EACpB,QAAA,IAAI,WAAY,KAAK,MAAM,EAC5BA,CACX,CACA,gBAAiB,CACP,MAAAC,EAAU,SAAS,cAAc,KAAK,EACpCA,EAAA,YAAY,KAAK,OAAO,OAAO,EAC/BA,EAAA,YAAY,KAAK,MAAM,OAAO,EAC9BA,EAAA,UAAU,IAAI,SAAS,EAC/B,KAAK,MAAM,QAAQ,YAAY,KAAK,QAAQ,OAAO,EAC9C,KAAA,MAAM,QAAQ,YAAYA,CAAO,EACtC,KAAK,MAAM,QAAQ,YAAY,KAAK,SAAS,OAAO,EACpD,KAAK,MAAM,QAAQ,OAAO,KAAK,OAAO,OAAO,CACjD,CAKA,SAAU,CACD,KAAA,MAAM,QAAQ,QACvB,CACA,oBAAoBpF,EAAQ,CACpB,GAAA,OAAOA,GAAW,SAAU,CACtB,MAAAC,EAAU,SAAS,cAAcD,CAAM,EAC7C,GAAI,CAACC,EACK,MAAA,IAAI,MAAM,yBAAyBD,CAAM;AAAA,sBAA+C,EACzFC,GAAA,MAAAA,EAAA,YAAY,KAAK,MAAM,QACpC,CACID,aAAkB,aACXA,EAAA,OAAO,KAAK,MAAM,OAAO,CAExC,CAKA,IAAI,KAAM,CACN,OAAO,KAAK,MAAM,GACtB,CACA,IAAI,WAAY,CACZ,OAAO,KAAK,OAAO,IACvB,CAEA,YAAa,CACJ,KAAA,SAAS,QAAQ,OAC1B,CACA,gBAAgBR,EAAGG,EAAG,CAClB,OAAO,KAAK,MAAM,gBAAgBH,EAAGG,CAAC,CAC1C,CACA,QAAQO,EAAU,CACR,KAAA,CAAE,OAAAX,EAAQ,IAAAG,CAAQ,EAAAQ,EACxB,OAAO,KAAK,KAAKR,CAAG,EAAEH,CAAM,CAChC,CACA,iBAAiBW,EAAU8B,EAAQ,CACzB,KAAA,CAAE,OAAAzC,EAAQ,IAAAG,CAAQ,EAAAQ,EACxB,KAAK,KAAKR,CAAG,EAAEH,CAAM,EAAE,aAAayC,CAAM,EACrC,KAAA,WAAWtC,EAAKH,CAAM,CAC/B,CACA,mBAAmB8F,EAAOC,EAAU,CAC1B,MAAAC,EAAU,KAAK,IAAIF,EAAM,KAAK,IAAKA,EAAM,GAAG,GAAG,EAC/CG,EAAQ,KAAK,IAAIH,EAAM,KAAK,IAAKA,EAAM,GAAG,GAAG,EAC7CI,EAAU,KAAK,IAAIJ,EAAM,KAAK,OAAQA,EAAM,GAAG,MAAM,EACrDK,EAAQ,KAAK,IAAIL,EAAM,KAAK,OAAQA,EAAM,GAAG,MAAM,EACzD,QAAS3F,EAAM6F,EAAS7F,GAAO8F,EAAO9F,IAClC,QAAS+C,EAAMgD,EAAShD,GAAOiD,EAAOjD,IAAO,CACzC,MAAMpC,EAAO,KAAK,KAAKX,CAAG,EAAE+C,CAAG,EAC/B6C,EAASjF,CAAI,CACjB,CAER,CACA,2BAA4B,CACpB,GAAA,KAAK,UAAU,gBAAkB,KACjC,KAAK,mBAAmB,KAAK,UAAU,cAAuBA,GAAA,CACrD,KAAA,iBAAiBA,EAAK,SAAU,CACjC,aAAc,GACd,YAAa,GACb,MAAO,EAAA,CACV,CAAA,CACJ,MAEA,CACG,GAAA,CAAC,KAAK,UAAU,aAChB,OACC,KAAA,iBAAiB,KAAK,UAAU,aAAc,CAC/C,aAAc,GACd,YAAa,GACb,MAAO,EAAA,CACV,CACL,CACJ,CACA,WAAWH,EAAU,CACZ,KAAA,OAAO,KAAKA,CAAQ,CAC7B,CACA,aAAc,CACV,KAAK,MAAM,aACf,CACA,WAAWR,EAAK+C,EAAK,CACjB,KAAK,KAAK/C,CAAG,EAAE+C,CAAG,EAAE,OAAO,IAAI,CACnC,CACA,SAASoB,EAAM,CACX,MAAM8B,EAAa9B,EAAK,OAClB+B,EAAa/B,EAAK,CAAC,EAAI,KAAK,KAAK,CAAC,EAAE,OAAS,EACnD,KAAK,KAAO,GACZ,MAAMgC,EAAgB,CAAA,EACtB,QAASnG,EAAM,EAAGA,EAAMiG,EAAYjG,IAAO,CACvC,MAAMoE,EAAW,CAAA,EACjB,QAASrB,EAAM,EAAGA,EAAMmD,EAAYnD,IAAO,CACvC,MAAMpC,EAAOwD,EAAKnE,CAAG,EAAE+C,CAAG,EACjBqB,EAAA,KAAK,IAAI/B,EAAK,CACnB,aAAc1B,EAAK,aACnB,SAAUA,EAAK,SACf,YAAaA,EAAK,YAClB,MAAOA,EAAK,KACf,CAAA,CAAC,CACN,CACAwF,EAAc,KAAK/B,CAAQ,CAC/B,CACA,YAAK,KAAO+B,EACZ,KAAK,UAAU,aAAe,KAC9B,KAAK,UAAU,cAAgB,KAC/B,KAAK,OAAS,KAAK,mBAAmBA,EAAe,KAAK,OAAO,IAAI,EAChE,KAAA,MAAQ,KAAK,kBAClB,KAAK,SAAS,qBACd,KAAK,SAAW,IAAIvC,EAAS,KAAM,KAAK,SAAS,0BAA0B,EAC3E,KAAK,YAAY,EACV,IACX,CACA,mBAAmBO,EAAMiC,EAAM,CACrB,MAAAlD,EAAaiB,EAAK,OAAS,EAC3BlB,EAAakB,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAE,OAAS,EACxCH,EAAO,CAAA,EACb,QAAShE,EAAM,EAAGA,EAAMkD,EAAYlD,IAC3BgE,EAAA,KAAK,IAAIF,EAAI,CACd,OAAQ,GACR,MAAO,OAAO9D,CAAG,CACpB,CAAA,CAAC,EAEN,MAAMiE,EAAU,CAAA,EAChB,QAASlB,EAAM,EAAGA,EAAME,EAAYF,IACxBkB,EAAA,KAAK,IAAIJ,EAAO,CACpB,MAAO,IACP,MAAO,OAAOd,CAAG,CACpB,CAAA,CAAC,EAOC,OALQ,IAAIU,EAAO,CACtB,KAAA2C,EACA,KAAApC,EACA,QAAAC,CAAA,CACH,CAEL,CACA,eAAgB,CACN,MAAAgC,EAAa,KAAK,KAAK,OACvBC,EAAa,KAAK,KAAK,CAAC,EAAI,KAAK,KAAK,CAAC,EAAE,OAAS,EAClDG,EAAa,CAAA,EACnB,QAASrG,EAAM,EAAGA,EAAMiG,EAAYjG,IAAO,CACvC,MAAMoE,EAAW,CAAA,EACjB,QAASrB,EAAM,EAAGA,EAAMmD,EAAYnD,IACvBqB,EAAA,KAAK,KAAK,KAAKpE,CAAG,EAAE+C,CAAG,EAAE,qBAAqB,EAE3DsD,EAAW,KAAKjC,CAAQ,CAC5B,CACO,OAAAiC,CACX,CACJ"} \ No newline at end of file +{"version":3,"file":"main.cjs","sources":["../src/modules/renderBox.ts","../src/components/editor.ts","../src/components/header.ts","../src/components/scroller.ts","../src/modules/cell.ts","../src/components/sheet.ts","../src/components/table.ts","../src/components/toolbar.ts","../src/modules/config.ts","../src/modules/selection.ts","../src/modules/styles.ts","../src/modules/viewport.ts","../src/modules/column.ts","../src/modules/row.ts","../src/utils/createData.ts","../src/modules/cache.ts","../src/main.ts"],"sourcesContent":["export class RenderBox {\n x;\n y;\n width;\n height;\n constructor(config, cellPosition) {\n this.x = this.getXCoord(cellPosition.column, config);\n this.y = this.getYCoord(cellPosition.row, config);\n this.width = config.columns[cellPosition.column].width;\n this.height = config.rows[cellPosition.row].height;\n }\n getXCoord(column, config) {\n let x = 0;\n for (let i = 0; i < column; i++) {\n x += config.columns[i].width;\n }\n return x;\n }\n getYCoord(row, config) {\n let y = 0;\n for (let i = 0; i < row; i++) {\n y += config.rows[i].height;\n }\n return y;\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { RenderBox } from \"../modules/renderBox\";\nexport class Editor {\n element;\n root;\n constructor(root) {\n this.root = root;\n const element = document.createElement('input');\n element.classList.add(CSS_PREFIX + 'editor');\n this.element = element;\n this.hide();\n }\n hide() {\n this.element.style.display = 'none';\n this.element.classList.add('hide');\n this.element.blur();\n window.removeEventListener('click', this.handleClickOutside);\n this.element.removeEventListener('keydown', this.handleKeydown);\n this.root.focusTable();\n }\n show(position, initialString) {\n const { height, width, x, y } = new RenderBox(this.root.config, position);\n const cell = this.root.getCell(position);\n this.element.classList.remove('hide');\n this.element.style.top = (y - this.root.viewport.top) + 'px';\n this.element.style.left = (x - this.root.viewport.left) + 'px';\n this.element.style.width = width + 'px';\n this.element.style.height = height + 'px';\n this.element.style.display = 'block';\n window.addEventListener('click', this.handleClickOutside);\n this.element.addEventListener('keydown', this.handleKeydown);\n this.element.value = initialString ? initialString : cell.value;\n this.element.focus();\n if (!initialString)\n this.element.select();\n }\n handleKeydown = (event) => {\n const { key } = event;\n switch (key) {\n case 'Escape': {\n this.hide();\n break;\n }\n case 'Enter': {\n this.root.changeCellValues(this.root.selection.selectedCell, {\n value: this.element.value,\n displayValue: this.element.value\n });\n this.hide();\n }\n }\n };\n handleClickOutside = (event) => {\n const target = event.target;\n if (!this.element.contains(target)) {\n this.hide();\n }\n };\n}\n","export class Header {\n element;\n root;\n constructor(root) {\n this.root = root;\n const headerElement = document.createElement('header');\n headerElement.classList.add();\n this.element = headerElement;\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nexport class Scroller {\n element;\n verticalScroller;\n horizontalScroller;\n root;\n isSelecting = false;\n constructor(root) {\n this.root = root;\n const { horizontalScroller, scroller, verticalScroller } = this.buildComponent();\n this.element = scroller;\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n this.element.style.height = this.root.config.view.height + 'px';\n this.element.style.width = this.root.config.view.width + 'px';\n this.element.tabIndex = -1;\n this.updateScrollerSize(); //* Init size set\n this.element.addEventListener('scroll', this.handleScroll);\n this.element.addEventListener('mousedown', this.handleClick);\n this.element.addEventListener('mousemove', this.handleMouseMove);\n this.element.addEventListener('mouseup', this.handleMouseUp);\n this.element.addEventListener('dblclick', this.handleDoubleClick);\n this.element.addEventListener('keydown', this.handleKeydown);\n }\n handleMouseMove = (event) => {\n if (!this.isSelecting)\n return;\n const { offsetX, offsetY } = event;\n const lastSelectedCell = this.root.getCellByCoords(offsetX, offsetY);\n if (this.root.selection.selectedRange) {\n this.root.selection.selectedRange.to = lastSelectedCell;\n }\n this.root.renderSheet();\n };\n handleMouseUp = () => {\n this.isSelecting = false;\n if (this.root.selection.selectedRange) {\n if ((this.root.selection.selectedRange.from.row === this.root.selection.selectedRange.to.row) &&\n (this.root.selection.selectedRange.from.column === this.root.selection.selectedRange.to.column)) {\n this.root.selection.selectedRange = null;\n }\n }\n this.root.renderSheet();\n };\n handleDoubleClick = (event) => {\n event.preventDefault();\n const position = this.root.getCellByCoords(event.offsetX, event.offsetY);\n this.root.showEditor(position);\n };\n handleKeydown = (event) => {\n console.log(event);\n //* Navigation\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(event.key)) {\n event.preventDefault();\n this.root.selection.selectedRange = null;\n switch (event.key) {\n case 'ArrowLeft': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.column > 0) {\n console.log('tick');\n this.root.selection.selectedCell.column -= 1;\n this.root.renderSheet();\n }\n break;\n }\n case 'ArrowRight': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.column < this.root.config.columns.length - 1) {\n this.root.selection.selectedCell.column += 1;\n this.root.renderSheet();\n }\n break;\n }\n case 'ArrowUp': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.row > 0) {\n this.root.selection.selectedCell.row -= 1;\n this.root.renderSheet();\n }\n break;\n }\n case 'ArrowDown': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.row < this.root.config.rows.length - 1) {\n this.root.selection.selectedCell.row += 1;\n this.root.renderSheet();\n }\n break;\n }\n }\n }\n const keysRegex = /^([a-z]|[а-я])$/;\n if (!event.metaKey && !event.ctrlKey) { //* Prevent handle shortcutrs\n const isPressedLetterKey = keysRegex.test(event.key.toLowerCase());\n if (event.key === 'F2' || isPressedLetterKey) { //* English and Russian keyboard. Or F2 button\n event.preventDefault();\n if (!this.root.selection.selectedCell)\n return;\n this.root.showEditor(this.root.selection.selectedCell, isPressedLetterKey ? event.key : undefined);\n }\n }\n if (event.key === 'Delete') {\n event.preventDefault();\n this.root.deleteSelectedCellsValues();\n this.root.renderSheet();\n }\n };\n handleClick = (event) => {\n if (event.button !== 0)\n return; // Left mouse button\n const { offsetX, offsetY } = event;\n const clickedCell = this.root.getCellByCoords(offsetX, offsetY);\n this.isSelecting = true;\n this.root.selection.selectedRange = {\n from: clickedCell,\n to: clickedCell\n };\n this.root.selection.selectedCell = clickedCell;\n this.root.renderSheet();\n };\n handleScroll = () => {\n const rect = this.getViewportBoundlingRect();\n this.root.viewport.updateValues(rect);\n this.root.renderSheet();\n };\n getViewportBoundlingRect() {\n const { scrollTop, scrollLeft } = this.element;\n const { height, width } = this.element.getBoundingClientRect();\n const bottom = scrollTop + height;\n const right = scrollLeft + width;\n return {\n top: scrollTop,\n left: scrollLeft,\n bottom,\n right\n };\n }\n buildComponent() {\n const scroller = document.createElement('div');\n const verticalScroller = document.createElement('div');\n const horizontalScroller = document.createElement('div');\n const groupScrollers = document.createElement('div');\n const stack = document.createElement('div');\n verticalScroller.style.width = '0px';\n verticalScroller.style.pointerEvents = 'none';\n horizontalScroller.style.pointerEvents = 'none';\n groupScrollers.style.display = 'flex';\n stack.appendChild(verticalScroller);\n stack.appendChild(horizontalScroller);\n groupScrollers.appendChild(stack);\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n scroller.appendChild(groupScrollers);\n scroller.classList.add(CSS_PREFIX + 'scroller');\n return { scroller, verticalScroller, horizontalScroller };\n }\n getActualHeight() {\n return this.root.config.rows.reduce((acc, curr) => {\n acc += curr.height;\n return acc;\n }, 0);\n }\n getActualWidth() {\n return this.root.config.columns.reduce((acc, curr) => {\n acc += curr.width;\n return acc;\n }, 0);\n }\n updateScrollerSize() {\n const totalHeight = this.getActualHeight();\n const totalWidth = this.getActualWidth();\n this.setScrollerHeight(totalHeight);\n this.setScrollerWidth(totalWidth);\n }\n setScrollerHeight(height) {\n this.verticalScroller.style.height = height + 'px';\n }\n setScrollerWidth(width) {\n this.horizontalScroller.style.width = width + 'px';\n }\n}\n","import { RenderBox } from \"./renderBox\";\nexport class CellStyles {\n fontSize = 16;\n fontColor = 'black';\n background = 'white';\n borderColor = 'black';\n selectedBackground = '#4287f5';\n selectedFontColor = '#ffffff';\n constructor(props) {\n if (props) {\n Object.assign(this, props); // Override default styles\n }\n }\n}\nexport class Position {\n row;\n column;\n constructor(row, column) {\n this.row = row;\n this.column = column;\n }\n}\nexport class SerializableCell {\n value;\n displayValue;\n resultValue;\n position;\n style;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n}\nexport class Cell {\n /** True value (data) */\n value;\n /** Value to render */\n displayValue;\n /** This refers to the values ​​​​that were obtained by calculations, for example, after calculating the formula */\n resultValue;\n position;\n style = null;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n getSerializableCell() {\n const cell = new SerializableCell({\n displayValue: this.displayValue,\n position: this.position,\n resultValue: this.resultValue,\n style: this.style,\n value: this.value\n });\n return cell;\n }\n changeStyles(styles) {\n this.style = styles;\n }\n changeValues(values) {\n Object.assign(this, values);\n }\n isCellInRange(root) {\n const { column, row } = this.position;\n const { selectedRange } = root.selection;\n if (!selectedRange)\n return false;\n const isCellInRow = row >= Math.min(selectedRange.from.row, selectedRange.to.row) && row <= Math.max(selectedRange.to.row, selectedRange.from.row);\n const isCellInCol = column >= Math.min(selectedRange.from.column, selectedRange.to.column) && column <= Math.max(selectedRange.to.column, selectedRange.from.column);\n return isCellInCol && isCellInRow;\n }\n render(root) {\n let { height, width, x, y } = new RenderBox(root.config, this.position);\n const { ctx } = root;\n const isCellSelected = (root.selection.selectedCell?.row === this.position.row && root.selection.selectedCell.column === this.position.column);\n const isCellInRange = this.isCellInRange(root);\n y -= root.viewport.top;\n x -= root.viewport.left;\n const styles = this.style ?? root.styles.cells;\n ctx.clearRect(x, y, width, height);\n ctx.fillStyle = isCellSelected || isCellInRange ? styles.selectedBackground : styles.background;\n ctx.strokeStyle = 'black';\n ctx.fillRect(x, y, width - 1, height - 1);\n ctx.strokeRect(x, y, width, height);\n ctx.fillStyle = isCellSelected || isCellInRange ? styles.selectedFontColor : styles.fontColor;\n ctx.textAlign = 'left';\n ctx.font = `${styles.fontSize}px Arial`;\n ctx.textBaseline = 'middle';\n ctx.fillText(this.displayValue, x + 2, y + height / 2);\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { Position } from \"../modules/cell\";\n/**\n * Display (CANVAS) element where cells render\n */\nexport class Sheet {\n element;\n ctx;\n root;\n constructor(root) {\n this.root = root;\n const canvas = document.createElement('canvas');\n canvas.classList.add(CSS_PREFIX + 'sheet');\n //* Set up canvas sizes based on provided root config\n canvas.height = this.root.config.view.height;\n canvas.width = this.root.config.view.width;\n canvas.style.width = this.root.config.view.width + 'px';\n canvas.style.height = this.root.config.view.height + 'px';\n this.element = canvas;\n const ctx = this.element.getContext('2d');\n if (!ctx)\n throw new Error('Enable hardware acceleration');\n this.ctx = ctx;\n }\n getCellByCoords(x, y) {\n let row = 0;\n let height = 0;\n while (height <= y) {\n height += this.root.config.rows[row].height;\n if (height >= y)\n break;\n row++;\n }\n let col = 0;\n let width = 0;\n while (width <= x) {\n width += this.root.config.columns[col].width;\n if (width >= x)\n break;\n col++;\n }\n return new Position(row, col);\n }\n renderCell(position) {\n const { column, row } = position;\n this.root.data[row][column].render(this.root);\n }\n renderSheet() {\n const firstRowIdx = this.root.viewport.firstRow;\n const lastColIdx = this.root.viewport.lastCol + 3;\n const lastRowIdx = this.root.viewport.lastRow + 3;\n const firstColIdx = this.root.viewport.firstCol;\n for (let row = firstRowIdx; row <= lastRowIdx; row++) {\n for (let col = firstColIdx; col <= lastColIdx; col++) {\n if (!this.root.config.columns[col] || !this.root.config.rows[row])\n break; //* Prevent read undefined\n this.renderCell({ column: col, row });\n }\n }\n }\n}\n","import { CSS_PREFIX } from \"../main\";\n/** Base (root) component */\nexport class Table {\n element;\n root;\n constructor(root) {\n this.root = root;\n const container = document.createElement('div');\n container.classList.add(CSS_PREFIX + 'spreadsheet_container');\n this.element = container;\n this.changeElementSizes(this.root.viewProps);\n }\n changeElementSizes(sizes) {\n const { height, width } = sizes;\n this.element.style.width = width + 'px';\n this.element.style.height = height + 'px';\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nexport class Toolbar {\n element;\n root;\n constructor(root) {\n this.root = root;\n const toolbarElement = document.createElement('div');\n toolbarElement.classList.add(CSS_PREFIX + 'toolbar');\n this.element = toolbarElement;\n }\n}\n","export class Config {\n rows;\n columns;\n view = {\n width: 800,\n height: 600,\n };\n constructor(props) {\n this.columns = props.columns;\n this.rows = props.rows;\n this.view = props.view;\n }\n}\n","export class Selection {\n selectedCell = null;\n selectedRange = null;\n}\n","import { CellStyles } from \"./cell\";\nexport class Styles {\n cells;\n constructor() {\n this.cells = new CellStyles();\n }\n}\n","export class Viewport {\n root;\n top;\n left;\n right;\n bottom;\n firstRow;\n lastRow;\n firstCol;\n lastCol;\n constructor(root, props) {\n this.root = root;\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastCol = this.getFirstRow(); //!Temp\n this.firstCol = this.getFirstRow(); //!Temp\n this.lastRow = this.getLastRow();\n this.updateValues({\n top: 0,\n left: 0,\n right: this.root.viewProps.width,\n bottom: this.root.viewProps.height\n });\n }\n updateValues(props) {\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastRow = this.getLastRow();\n this.firstCol = this.getFirstCol();\n this.lastCol = this.getLastCol();\n }\n /** Get index of first row in viewport */\n getFirstRow() {\n let rowIdx = this.root.cache.getRowByYCoord(this.top);\n return rowIdx;\n }\n getLastRow() {\n let rowIdx = this.root.cache.getRowByYCoord(this.bottom);\n return rowIdx;\n }\n getFirstCol() {\n let colIdx = this.root.cache.getColumnByXCoord(this.left);\n return colIdx;\n }\n getLastCol() {\n let colIdx = this.root.cache.getColumnByXCoord(this.right);\n return colIdx;\n }\n}\n","export class Column {\n width;\n title;\n constructor(props) {\n this.width = props.width;\n this.title = props.title;\n }\n}\n","export class Row {\n height;\n title;\n constructor(props) {\n this.height = props.height;\n this.title = props.title;\n }\n}\n","import { Cell } from \"../modules/cell\";\nimport { Column } from \"../modules/column\";\nimport { Config } from \"../modules/config\";\nimport { Row } from \"../modules/row\";\nexport function createSampleData(rows, columns, fillCellsByCoords = false) {\n const data = [];\n for (let row = 0; row <= rows; row++) {\n const innerRow = [];\n for (let col = 0; col <= columns; col++) {\n const value = fillCellsByCoords ? `${row}:${col}` : '';\n const cell = new Cell({\n displayValue: value,\n resultValue: value,\n value,\n position: {\n column: col,\n row: row\n },\n style: null\n });\n innerRow.push(cell);\n }\n data.push(innerRow);\n }\n return data;\n}\nexport function createSampleConfig(rows, columns) {\n const rowsArr = [];\n for (let i = 0; i <= rows; i++) {\n const rowItem = new Row({\n height: 40,\n title: String(i)\n });\n rowsArr.push(rowItem);\n }\n const colsArr = [];\n for (let i = 0; i <= columns; i++) {\n const colItem = new Column({\n title: String(i),\n width: 150\n });\n colsArr.push(colItem);\n }\n const config = new Config({\n columns: colsArr,\n rows: rowsArr,\n view: {\n height: 600,\n width: 800\n }\n });\n return config;\n}\nexport function makeSpreadsheetConfigAndData(rows, columns) {\n const data = createSampleData(rows, columns);\n const config = createSampleConfig(rows, columns);\n return { data, config };\n}\n","export class CachedColumn {\n xPos;\n colIdx;\n constructor(props) {\n this.xPos = props.xPos;\n this.colIdx = props.colIdx;\n }\n}\nexport class CachedRow {\n yPos;\n rowIdx;\n constructor(props) {\n this.yPos = props.yPos;\n this.rowIdx = props.rowIdx;\n }\n}\nexport class Cache {\n columns;\n rows;\n constructor(initial) {\n this.columns = initial.columns;\n this.rows = initial.rows;\n }\n getRowByYCoord(y) {\n let rowIdx = 0;\n for (let i = 0; i < this.rows.length; i++) {\n if (y <= this.rows[i].yPos) { //* Intersection detect\n rowIdx = i;\n break;\n }\n }\n return rowIdx;\n }\n getColumnByXCoord(x) {\n let colIdx = 0;\n for (let i = 0; i < this.columns.length; i++) {\n if (x <= this.columns[i].xPos) { //* Intersection detect\n colIdx = i;\n break;\n }\n }\n return colIdx;\n }\n}\n","import { Editor } from \"./components/editor\";\nimport { Header } from \"./components/header\";\nimport { Scroller } from \"./components/scroller\";\nimport { Sheet } from \"./components/sheet\";\nimport { Table } from \"./components/table\";\nimport { Toolbar } from \"./components/toolbar\";\nimport { Cell } from \"./modules/cell\";\nimport { Config } from \"./modules/config\";\nimport { Selection } from \"./modules/selection\";\nimport { Styles } from \"./modules/styles\";\nimport { Viewport } from \"./modules/viewport\";\nimport './scss/main.scss';\nimport { createSampleData } from \"./utils/createData\";\nimport { Cache, CachedColumn, CachedRow } from \"./modules/cache\";\nimport { Row } from \"./modules/row\";\nimport { Column } from \"./modules/column\";\nexport const CSS_PREFIX = \"modern_sc_\";\nexport default class Spreadsheet {\n table;\n scroller;\n toolbar;\n header;\n sheet;\n editor;\n styles;\n config;\n data;\n viewport;\n selection;\n cache;\n constructor(target, props) {\n const data = createSampleData(40, 40);\n const config = this.makeConfigFromData(data, props?.view ?? { height: 600, width: 800 });\n if (props?.view) {\n config.view = props.view;\n }\n this.config = new Config(config);\n this.sheet = new Sheet(this);\n this.table = new Table(this);\n this.scroller = new Scroller(this);\n this.toolbar = new Toolbar(this);\n this.header = new Header(this);\n this.editor = new Editor(this);\n this.cache = this.getInitialCache();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.selection = new Selection();\n this.data = data;\n this.styles = new Styles();\n this.buildComponent();\n this.appendTableToTarget(target);\n this.renderSheet();\n }\n getInitialCache() {\n const cachedCols = [];\n let currentWidth = 0;\n for (let i = 0; i <= this.config.columns.length - 1; i++) {\n const col = this.config.columns[i];\n currentWidth += col.width;\n const cacheCol = new CachedColumn({\n xPos: currentWidth,\n colIdx: i\n });\n cachedCols.push(cacheCol);\n }\n const cachedRows = [];\n let currentHeight = 0;\n for (let i = 0; i <= this.config.rows.length - 1; i++) {\n const row = this.config.rows[i];\n currentHeight += row.height;\n const cacheRow = new CachedRow({\n yPos: currentHeight,\n rowIdx: i\n });\n cachedRows.push(cacheRow);\n }\n const cache = new Cache({\n columns: cachedCols,\n rows: cachedRows\n });\n console.log(\"CACHE: \", cache);\n console.log(\"CONFIG: \", this.config);\n return cache;\n }\n buildComponent() {\n const content = document.createElement('div'); //* Abstract\n content.appendChild(this.header.element);\n content.appendChild(this.sheet.element);\n content.classList.add(CSS_PREFIX + 'content');\n this.table.element.appendChild(this.toolbar.element);\n this.table.element.appendChild(content);\n this.table.element.appendChild(this.scroller.element);\n this.table.element.append(this.editor.element);\n }\n /**Destroy spreadsheet DOM element.\n *\n * May be usefull when need to rerender component.\n */\n destroy() {\n this.table.element.remove();\n }\n appendTableToTarget(target) {\n if (typeof target === 'string') {\n const element = document.querySelector(target);\n if (!element)\n throw new Error(`Element with selector ${target} is not finded in DOM.\\n Make sure it exists.`);\n element?.appendChild(this.table.element);\n }\n if (target instanceof HTMLElement) {\n target.append(this.table.element);\n }\n }\n /** Canvas rendering context 2D.\n *\n * Abble to draw on canvas with default CanvasAPI methods\n */\n get ctx() {\n return this.sheet.ctx;\n }\n get viewProps() {\n return this.config.view;\n }\n /** Focusing on interactive part of spreadsheet */\n focusTable() {\n this.scroller.element.focus();\n }\n getCellByCoords(x, y) {\n return this.sheet.getCellByCoords(x, y);\n }\n getCell(position) {\n const { column, row } = position;\n return this.data[row][column];\n }\n changeCellValues(position, values) {\n const { column, row } = position;\n this.data[row][column].changeValues(values);\n this.renderCell(row, column);\n }\n changeCellStyles(position, styles) {\n const { column, row } = position;\n this.data[row][column].changeStyles(styles);\n this.renderCell(row, column);\n }\n applyActionToRange(range, callback) {\n const fromRow = Math.min(range.from.row, range.to.row);\n const toRow = Math.max(range.from.row, range.to.row);\n const fromCol = Math.min(range.from.column, range.to.column);\n const toCol = Math.max(range.from.column, range.to.column);\n for (let row = fromRow; row <= toRow; row++) {\n for (let col = fromCol; col <= toCol; col++) {\n const cell = this.data[row][col];\n callback(cell);\n }\n }\n }\n deleteSelectedCellsValues() {\n if (this.selection.selectedRange !== null) {\n this.applyActionToRange(this.selection.selectedRange, cell => {\n this.changeCellValues(cell.position, {\n displayValue: '',\n resultValue: '',\n value: ''\n });\n });\n }\n else {\n if (!this.selection.selectedCell)\n return;\n this.changeCellValues(this.selection.selectedCell, {\n displayValue: '',\n resultValue: '',\n value: ''\n });\n }\n }\n showEditor(position, initialString) {\n this.editor.show(position, initialString);\n }\n renderSheet() {\n this.sheet.renderSheet();\n }\n renderCell(row, col) {\n this.data[row][col].render(this);\n }\n loadData(data) {\n const rowsLength = data.length;\n const colsLength = data[0] ? this.data[0].length : 0;\n this.data = [];\n const formattedData = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n const cell = data[row][col];\n innerRow.push(new Cell({\n displayValue: cell.displayValue,\n position: cell.position,\n resultValue: cell.resultValue,\n value: cell.value,\n style: cell.style\n }));\n }\n formattedData.push(innerRow);\n }\n this.data = formattedData;\n this.selection.selectedCell = null;\n this.selection.selectedRange = null;\n this.config = this.makeConfigFromData(formattedData, this.config.view);\n this.cache = this.getInitialCache();\n this.scroller.updateScrollerSize();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.renderSheet();\n return this;\n }\n makeConfigFromData(data, view) {\n const lastRowIdx = data.length - 1;\n const lastColIdx = data[0] ? data[0].length : 0;\n const rows = [];\n for (let row = 0; row < lastRowIdx; row++) {\n rows.push(new Row({\n height: 40,\n title: String(row)\n }));\n }\n const columns = [];\n for (let col = 0; col < lastColIdx; col++) {\n columns.push(new Column({\n width: 150,\n title: String(col)\n }));\n }\n const config = new Config({\n view,\n rows,\n columns\n });\n return config;\n }\n serializeData() {\n const rowsLength = this.data.length;\n const colsLength = this.data[0] ? this.data[0].length : 0;\n const cellsArray = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n innerRow.push(this.data[row][col].getSerializableCell());\n }\n cellsArray.push(innerRow);\n }\n return cellsArray;\n }\n}\nexport * from './modules/cache';\nexport * from './modules/cell';\nexport * from './modules/column';\nexport * from './modules/config';\nexport * from './modules/renderBox';\nexport * from './modules/row';\nexport * from './modules/selection';\nexport * from './modules/styles';\nexport * from './modules/viewport';\nexport * from './utils/createData';\n"],"names":["RenderBox","config","cellPosition","__publicField","column","x","i","row","y","Editor","root","event","key","target","element","CSS_PREFIX","position","initialString","height","width","cell","Header","headerElement","Scroller","offsetX","offsetY","lastSelectedCell","keysRegex","isPressedLetterKey","clickedCell","rect","horizontalScroller","scroller","verticalScroller","scrollTop","scrollLeft","bottom","right","groupScrollers","stack","acc","curr","totalHeight","totalWidth","CellStyles","props","Position","SerializableCell","Cell","styles","values","selectedRange","isCellInRow","ctx","isCellSelected","_a","isCellInRange","Sheet","canvas","col","firstRowIdx","lastColIdx","lastRowIdx","firstColIdx","Table","container","sizes","Toolbar","toolbarElement","Config","Selection","Styles","Viewport","Column","Row","createSampleData","rows","columns","fillCellsByCoords","data","innerRow","value","createSampleConfig","rowsArr","rowItem","colsArr","colItem","makeSpreadsheetConfigAndData","CachedColumn","CachedRow","Cache","initial","rowIdx","colIdx","Spreadsheet","cachedCols","currentWidth","cacheCol","cachedRows","currentHeight","cacheRow","cache","content","range","callback","fromRow","toRow","fromCol","toCol","rowsLength","colsLength","formattedData","view","cellsArray"],"mappings":"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"} \ No newline at end of file diff --git a/dist/main.d.ts b/dist/main.d.ts index e487cfb..20199fd 100644 --- a/dist/main.d.ts +++ b/dist/main.d.ts @@ -1,4 +1,4 @@ -import { Cell, CellConstructorProps, Position, SerializableCell } from "./modules/cell"; +import { Cell, CellConstructorProps, CellStyles, Position, SerializableCell } from "./modules/cell"; import { Config, ViewProperties } from "./modules/config"; import { RangeSelectionType, Selection } from "./modules/selection"; import { Styles } from "./modules/styles"; @@ -9,6 +9,7 @@ interface SpreadsheetConstructorProperties { config?: Omit; view?: ViewProperties; } +export declare const CSS_PREFIX = "modern_sc_"; export default class Spreadsheet { private table; private scroller; @@ -42,9 +43,10 @@ export default class Spreadsheet { getCellByCoords(x: number, y: number): Position; getCell(position: Position): Cell; changeCellValues(position: Position, values: Partial>): void; + changeCellStyles(position: Position, styles: CellStyles): void; applyActionToRange(range: RangeSelectionType, callback: (cell: Cell) => any): void; deleteSelectedCellsValues(): void; - showEditor(position: Position): void; + showEditor(position: Position, initialString?: string): void; renderSheet(): void; renderCell(row: number, col: number): void; loadData(data: Cell[][] | SerializableCell[][]): Spreadsheet; diff --git a/dist/main.js b/dist/main.js index a1ddeb8..521eda3 100644 --- a/dist/main.js +++ b/dist/main.js @@ -1,32 +1,32 @@ -var y = Object.defineProperty; -var p = (r, t, e) => t in r ? y(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e; -var o = (r, t, e) => (p(r, typeof t != "symbol" ? t + "" : t, e), e); -class w { +var v = Object.defineProperty; +var S = (r, t, e) => t in r ? v(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e; +var s = (r, t, e) => (S(r, typeof t != "symbol" ? t + "" : t, e), e); +class m { constructor(t, e) { - o(this, "x"); - o(this, "y"); - o(this, "width"); - o(this, "height"); + s(this, "x"); + s(this, "y"); + s(this, "width"); + s(this, "height"); this.x = this.getXCoord(e.column, t), this.y = this.getYCoord(e.row, t), this.width = t.columns[e.column].width, this.height = t.rows[e.row].height; } getXCoord(t, e) { - let s = 0; + let o = 0; for (let l = 0; l < t; l++) - s += e.columns[l].width; - return s; + o += e.columns[l].width; + return o; } getYCoord(t, e) { - let s = 0; + let o = 0; for (let l = 0; l < t; l++) - s += e.rows[l].height; - return s; + o += e.rows[l].height; + return o; } } -class v { +class x { constructor(t) { - o(this, "element"); - o(this, "root"); - o(this, "handleKeydown", (t) => { + s(this, "element"); + s(this, "root"); + s(this, "handleKeydown", (t) => { const { key: e } = t; switch (e) { case "Escape": { @@ -40,53 +40,53 @@ class v { }), this.hide(); } }); - o(this, "handleClickOutside", (t) => { + s(this, "handleClickOutside", (t) => { const e = t.target; this.element.contains(e) || this.hide(); }); this.root = t; const e = document.createElement("input"); - e.classList.add("editor"), this.element = e, this.hide(); + e.classList.add(d + "editor"), this.element = e, this.hide(); } hide() { this.element.style.display = "none", this.element.classList.add("hide"), this.element.blur(), window.removeEventListener("click", this.handleClickOutside), this.element.removeEventListener("keydown", this.handleKeydown), this.root.focusTable(); } - show(t) { - const { height: e, width: s, x: l, y: n } = new w(this.root.config, t), i = this.root.getCell(t); - this.element.classList.remove("hide"), this.element.style.top = n - this.root.viewport.top + "px", this.element.style.left = l - this.root.viewport.left + "px", this.element.style.width = s + "px", this.element.style.height = e + "px", this.element.style.display = "block", window.addEventListener("click", this.handleClickOutside), this.element.addEventListener("keydown", this.handleKeydown), this.element.value = i.value, this.element.focus(), this.element.select(); + show(t, e) { + const { height: o, width: l, x: n, y: i } = new m(this.root.config, t), c = this.root.getCell(t); + this.element.classList.remove("hide"), this.element.style.top = i - this.root.viewport.top + "px", this.element.style.left = n - this.root.viewport.left + "px", this.element.style.width = l + "px", this.element.style.height = o + "px", this.element.style.display = "block", window.addEventListener("click", this.handleClickOutside), this.element.addEventListener("keydown", this.handleKeydown), this.element.value = e || c.value, this.element.focus(), e || this.element.select(); } } -class S { +class R { constructor(t) { - o(this, "element"); - o(this, "root"); + s(this, "element"); + s(this, "root"); this.root = t; const e = document.createElement("header"); e.classList.add(), this.element = e; } } -class x { +class b { constructor(t) { - o(this, "element"); - o(this, "verticalScroller"); - o(this, "horizontalScroller"); - o(this, "root"); - o(this, "isSelecting", !1); - o(this, "handleMouseMove", (t) => { + s(this, "element"); + s(this, "verticalScroller"); + s(this, "horizontalScroller"); + s(this, "root"); + s(this, "isSelecting", !1); + s(this, "handleMouseMove", (t) => { if (!this.isSelecting) return; - const { offsetX: e, offsetY: s } = t, l = this.root.getCellByCoords(e, s); + const { offsetX: e, offsetY: o } = t, l = this.root.getCellByCoords(e, o); this.root.selection.selectedRange && (this.root.selection.selectedRange.to = l), this.root.renderSheet(); }); - o(this, "handleMouseUp", () => { + s(this, "handleMouseUp", () => { this.isSelecting = !1, this.root.selection.selectedRange && this.root.selection.selectedRange.from.row === this.root.selection.selectedRange.to.row && this.root.selection.selectedRange.from.column === this.root.selection.selectedRange.to.column && (this.root.selection.selectedRange = null), this.root.renderSheet(); }); - o(this, "handleDoubleClick", (t) => { + s(this, "handleDoubleClick", (t) => { t.preventDefault(); const e = this.root.getCellByCoords(t.offsetX, t.offsetY); this.root.showEditor(e); }); - o(this, "handleKeydown", (t) => { + s(this, "handleKeydown", (t) => { if (console.log(t), ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"].includes(t.key)) switch (t.preventDefault(), this.root.selection.selectedRange = null, t.key) { case "ArrowLeft": { @@ -106,32 +106,36 @@ class x { break; } } - if (!t.metaKey && !t.ctrlKey && (t.key === "F2" || /^([a-z]|[а-я])$/.test(t.key.toLowerCase()))) { - if (t.preventDefault(), !this.root.selection.selectedCell) - return; - this.root.showEditor(this.root.selection.selectedCell); + const e = /^([a-z]|[а-я])$/; + if (!t.metaKey && !t.ctrlKey) { + const o = e.test(t.key.toLowerCase()); + if (t.key === "F2" || o) { + if (t.preventDefault(), !this.root.selection.selectedCell) + return; + this.root.showEditor(this.root.selection.selectedCell, o ? t.key : void 0); + } } t.key === "Delete" && (t.preventDefault(), this.root.deleteSelectedCellsValues(), this.root.renderSheet()); }); - o(this, "handleClick", (t) => { + s(this, "handleClick", (t) => { if (t.button !== 0) return; - const { offsetX: e, offsetY: s } = t, l = this.root.getCellByCoords(e, s); + const { offsetX: e, offsetY: o } = t, l = this.root.getCellByCoords(e, o); this.isSelecting = !0, this.root.selection.selectedRange = { from: l, to: l }, this.root.selection.selectedCell = l, this.root.renderSheet(); }); - o(this, "handleScroll", () => { + s(this, "handleScroll", () => { const t = this.getViewportBoundlingRect(); this.root.viewport.updateValues(t), this.root.renderSheet(); }); this.root = t; - const { horizontalScroller: e, scroller: s, verticalScroller: l } = this.buildComponent(); - this.element = s, this.verticalScroller = l, this.horizontalScroller = e, this.element.style.height = this.root.config.view.height + "px", this.element.style.width = this.root.config.view.width + "px", this.element.tabIndex = -1, this.updateScrollerSize(), this.element.addEventListener("scroll", this.handleScroll), this.element.addEventListener("mousedown", this.handleClick), this.element.addEventListener("mousemove", this.handleMouseMove), this.element.addEventListener("mouseup", this.handleMouseUp), this.element.addEventListener("dblclick", this.handleDoubleClick), this.element.addEventListener("keydown", this.handleKeydown); + const { horizontalScroller: e, scroller: o, verticalScroller: l } = this.buildComponent(); + this.element = o, this.verticalScroller = l, this.horizontalScroller = e, this.element.style.height = this.root.config.view.height + "px", this.element.style.width = this.root.config.view.width + "px", this.element.tabIndex = -1, this.updateScrollerSize(), this.element.addEventListener("scroll", this.handleScroll), this.element.addEventListener("mousedown", this.handleClick), this.element.addEventListener("mousemove", this.handleMouseMove), this.element.addEventListener("mouseup", this.handleMouseUp), this.element.addEventListener("dblclick", this.handleDoubleClick), this.element.addEventListener("keydown", this.handleKeydown); } getViewportBoundlingRect() { - const { scrollTop: t, scrollLeft: e } = this.element, { height: s, width: l } = this.element.getBoundingClientRect(), n = t + s, i = e + l; + const { scrollTop: t, scrollLeft: e } = this.element, { height: o, width: l } = this.element.getBoundingClientRect(), n = t + o, i = e + l; return { top: t, left: e, @@ -140,8 +144,8 @@ class x { }; } buildComponent() { - const t = document.createElement("div"), e = document.createElement("div"), s = document.createElement("div"), l = document.createElement("div"), n = document.createElement("div"); - return e.style.width = "0px", e.style.pointerEvents = "none", s.style.pointerEvents = "none", l.style.display = "flex", n.appendChild(e), n.appendChild(s), l.appendChild(n), this.verticalScroller = e, this.horizontalScroller = s, t.appendChild(l), t.classList.add("scroller"), { scroller: t, verticalScroller: e, horizontalScroller: s }; + const t = document.createElement("div"), e = document.createElement("div"), o = document.createElement("div"), l = document.createElement("div"), n = document.createElement("div"); + return e.style.width = "0px", e.style.pointerEvents = "none", o.style.pointerEvents = "none", l.style.display = "flex", n.appendChild(e), n.appendChild(o), l.appendChild(n), this.verticalScroller = e, this.horizontalScroller = o, t.appendChild(l), t.classList.add(d + "scroller"), { scroller: t, verticalScroller: e, horizontalScroller: o }; } getActualHeight() { return this.root.config.rows.reduce((t, e) => (t += e.height, t), 0); @@ -160,46 +164,48 @@ class x { this.horizontalScroller.style.width = t + "px"; } } -class R { +class k { constructor(t) { - o(this, "fontSize", 16); - o(this, "fontColor", "black"); - o(this, "background", "white"); - o(this, "borderColor", "black"); - o(this, "selectedBackground", "#4287f5"); - o(this, "selectedFontColor", "#ffffff"); + s(this, "fontSize", 16); + s(this, "fontColor", "black"); + s(this, "background", "white"); + s(this, "borderColor", "black"); + s(this, "selectedBackground", "#4287f5"); + s(this, "selectedFontColor", "#ffffff"); t && Object.assign(this, t); } } -class b { +class V { constructor(t, e) { - o(this, "row"); - o(this, "column"); + s(this, "row"); + s(this, "column"); this.row = t, this.column = e; } } -class k { +class E { constructor(t) { - o(this, "value"); - o(this, "displayValue"); - o(this, "resultValue"); - o(this, "position"); - o(this, "style"); + s(this, "value"); + s(this, "displayValue"); + s(this, "resultValue"); + s(this, "position"); + s(this, "style"); this.value = t.value, this.displayValue = t.displayValue, this.resultValue = t.resultValue, this.position = t.position, this.style = t.style; } } -class g { +class f { constructor(t) { - o(this, "value"); - o(this, "displayValue"); + /** True value (data) */ + s(this, "value"); + /** Value to render */ + s(this, "displayValue"); /** This refers to the values ​​​​that were obtained by calculations, for example, after calculating the formula */ - o(this, "resultValue"); - o(this, "position"); - o(this, "style", new R()); - this.value = t.value, this.displayValue = t.displayValue, this.resultValue = t.resultValue, this.position = t.position; + s(this, "resultValue"); + s(this, "position"); + s(this, "style", null); + this.value = t.value, this.displayValue = t.displayValue, this.resultValue = t.resultValue, this.position = t.position, this.style = t.style; } getSerializableCell() { - return new k({ + return new E({ displayValue: this.displayValue, position: this.position, resultValue: this.resultValue, @@ -207,108 +213,117 @@ class g { value: this.value }); } + changeStyles(t) { + this.style = t; + } changeValues(t) { Object.assign(this, t); } isCellInRange(t) { - const { column: e, row: s } = this.position, { selectedRange: l } = t.selection; + const { column: e, row: o } = this.position, { selectedRange: l } = t.selection; if (!l) return !1; - const n = s >= Math.min(l.from.row, l.to.row) && s <= Math.max(l.to.row, l.from.row); + const n = o >= Math.min(l.from.row, l.to.row) && o <= Math.max(l.to.row, l.from.row); return e >= Math.min(l.from.column, l.to.column) && e <= Math.max(l.to.column, l.from.column) && n; } render(t) { - var a; - let { height: e, width: s, x: l, y: n } = new w(t.config, this.position); - const { ctx: i } = t, c = ((a = t.selection.selectedCell) == null ? void 0 : a.row) === this.position.row && t.selection.selectedCell.column === this.position.column, h = this.isCellInRange(t); - n -= t.viewport.top, l -= t.viewport.left, i.clearRect(l, n, s, e), i.fillStyle = c || h ? this.style.selectedBackground : this.style.background, i.strokeStyle = "black", i.fillRect(l, n, s - 1, e - 1), i.strokeRect(l, n, s, e), i.fillStyle = c || h ? this.style.selectedFontColor : this.style.fontColor, i.textAlign = "left", i.font = `${this.style.fontSize}px Arial`, i.textBaseline = "middle", i.fillText(this.displayValue, l + 2, n + e / 2); - } -} -class V { - constructor(t) { - o(this, "element"); - o(this, "ctx"); - o(this, "root"); - this.root = t; - const e = document.createElement("canvas"); - e.classList.add("sheet"), e.height = this.root.config.view.height, e.width = this.root.config.view.width, e.style.width = this.root.config.view.width + "px", e.style.height = this.root.config.view.height + "px", this.element = e; - const s = this.element.getContext("2d"); - if (!s) - throw new Error("Enable hardware acceleration"); - this.ctx = s; - } - getCellByCoords(t, e) { - let s = 0, l = 0; - for (; l <= e && (l += this.root.config.rows[s].height, !(l >= e)); ) - s++; - let n = 0, i = 0; - for (; i <= t && (i += this.root.config.columns[n].width, !(i >= t)); ) - n++; - return new b(s, n); - } - renderCell(t) { - const { column: e, row: s } = t; - this.root.data[s][e].render(this.root); - } - renderSheet() { - const t = this.root.viewport.firstRow, e = this.root.viewport.lastCol + 3, s = this.root.viewport.lastRow + 3, l = this.root.viewport.firstCol; - for (let n = t; n <= s; n++) - for (let i = l; i <= e && !(!this.root.config.columns[i] || !this.root.config.rows[n]); i++) - this.renderCell({ column: i, row: n }); - } -} -class E { - constructor(t) { - o(this, "element"); - o(this, "root"); - this.root = t; - const e = document.createElement("div"); - e.classList.add("spreadsheet_container"), this.element = e, this.changeElementSizes(this.root.viewProps); - } - changeElementSizes(t) { - const { height: e, width: s } = t; - this.element.style.width = s + "px", this.element.style.height = e + "px"; + var w; + let { height: e, width: o, x: l, y: n } = new m(t.config, this.position); + const { ctx: i } = t, c = ((w = t.selection.selectedCell) == null ? void 0 : w.row) === this.position.row && t.selection.selectedCell.column === this.position.column, h = this.isCellInRange(t); + n -= t.viewport.top, l -= t.viewport.left; + const a = this.style ?? t.styles.cells; + i.clearRect(l, n, o, e), i.fillStyle = c || h ? a.selectedBackground : a.background, i.strokeStyle = "black", i.fillRect(l, n, o - 1, e - 1), i.strokeRect(l, n, o, e), i.fillStyle = c || h ? a.selectedFontColor : a.fontColor, i.textAlign = "left", i.font = `${a.fontSize}px Arial`, i.textBaseline = "middle", i.fillText(this.displayValue, l + 2, n + e / 2); } } class I { constructor(t) { - o(this, "element"); - o(this, "root"); + s(this, "element"); + s(this, "ctx"); + s(this, "root"); this.root = t; - const e = document.createElement("div"); - e.classList.add("toolbar"), this.element = e; + const e = document.createElement("canvas"); + e.classList.add(d + "sheet"), e.height = this.root.config.view.height, e.width = this.root.config.view.width, e.style.width = this.root.config.view.width + "px", e.style.height = this.root.config.view.height + "px", this.element = e; + const o = this.element.getContext("2d"); + if (!o) + throw new Error("Enable hardware acceleration"); + this.ctx = o; + } + getCellByCoords(t, e) { + let o = 0, l = 0; + for (; l <= e && (l += this.root.config.rows[o].height, !(l >= e)); ) + o++; + let n = 0, i = 0; + for (; i <= t && (i += this.root.config.columns[n].width, !(i >= t)); ) + n++; + return new V(o, n); + } + renderCell(t) { + const { column: e, row: o } = t; + this.root.data[o][e].render(this.root); + } + renderSheet() { + const t = this.root.viewport.firstRow, e = this.root.viewport.lastCol + 3, o = this.root.viewport.lastRow + 3, l = this.root.viewport.firstCol; + for (let n = t; n <= o; n++) + for (let i = l; i <= e && !(!this.root.config.columns[i] || !this.root.config.rows[n]); i++) + this.renderCell({ column: i, row: n }); } } -class d { +class L { constructor(t) { - o(this, "rows"); - o(this, "columns"); - o(this, "view", { + s(this, "element"); + s(this, "root"); + this.root = t; + const e = document.createElement("div"); + e.classList.add(d + "spreadsheet_container"), this.element = e, this.changeElementSizes(this.root.viewProps); + } + changeElementSizes(t) { + const { height: e, width: o } = t; + this.element.style.width = o + "px", this.element.style.height = e + "px"; + } +} +class A { + constructor(t) { + s(this, "element"); + s(this, "root"); + this.root = t; + const e = document.createElement("div"); + e.classList.add(d + "toolbar"), this.element = e; + } +} +class u { + constructor(t) { + s(this, "rows"); + s(this, "columns"); + s(this, "view", { width: 800, height: 600 }); this.columns = t.columns, this.rows = t.rows, this.view = t.view; } } -class L { +class B { constructor() { - o(this, "selectedCell", null); - o(this, "selectedRange", null); + s(this, "selectedCell", null); + s(this, "selectedRange", null); } } -class A { +class z { + constructor() { + s(this, "cells"); + this.cells = new k(); + } } -class u { +class g { constructor(t, e) { - o(this, "root"); - o(this, "top"); - o(this, "left"); - o(this, "right"); - o(this, "bottom"); - o(this, "firstRow"); - o(this, "lastRow"); - o(this, "firstCol"); - o(this, "lastCol"); + s(this, "root"); + s(this, "top"); + s(this, "left"); + s(this, "right"); + s(this, "bottom"); + s(this, "firstRow"); + s(this, "lastRow"); + s(this, "firstCol"); + s(this, "lastCol"); this.root = t, this.top = e.top, this.left = e.left, this.right = e.right, this.bottom = e.bottom, this.firstRow = this.getFirstRow(), this.lastCol = this.getFirstRow(); //!Temp this.firstCol = this.getFirstRow(); @@ -337,59 +352,60 @@ class u { return this.root.cache.getColumnByXCoord(this.right); } } -class m { +class C { constructor(t) { - o(this, "width"); - o(this, "title"); + s(this, "width"); + s(this, "title"); this.width = t.width, this.title = t.title; } } -class f { +class y { constructor(t) { - o(this, "height"); - o(this, "title"); + s(this, "height"); + s(this, "title"); this.height = t.height, this.title = t.title; } } -function C(r, t, e = !1) { - const s = []; +function p(r, t, e = !1) { + const o = []; for (let l = 0; l <= r; l++) { const n = []; for (let i = 0; i <= t; i++) { - const c = e ? `${l}:${i}` : "", h = new g({ + const c = e ? `${l}:${i}` : "", h = new f({ displayValue: c, resultValue: c, value: c, position: { column: i, row: l - } + }, + style: null }); n.push(h); } - s.push(n); + o.push(n); } - return s; + return o; } -function B(r, t) { +function D(r, t) { const e = []; for (let n = 0; n <= r; n++) { - const i = new f({ + const i = new y({ height: 40, title: String(n) }); e.push(i); } - const s = []; + const o = []; for (let n = 0; n <= t; n++) { - const i = new m({ + const i = new C({ title: String(n), width: 150 }); - s.push(i); + o.push(i); } - return new d({ - columns: s, + return new u({ + columns: o, rows: e, view: { height: 600, @@ -397,65 +413,66 @@ function B(r, t) { } }); } -function F(r, t) { - const e = C(r, t), s = B(r, t); - return { data: e, config: s }; -} -class z { - constructor(t) { - o(this, "xPos"); - o(this, "colIdx"); - this.xPos = t.xPos, this.colIdx = t.colIdx; - } -} -class D { - constructor(t) { - o(this, "yPos"); - o(this, "rowIdx"); - this.yPos = t.yPos, this.rowIdx = t.rowIdx; - } +function H(r, t) { + const e = p(r, t), o = D(r, t); + return { data: e, config: o }; } class M { constructor(t) { - o(this, "columns"); - o(this, "rows"); + s(this, "xPos"); + s(this, "colIdx"); + this.xPos = t.xPos, this.colIdx = t.colIdx; + } +} +class F { + constructor(t) { + s(this, "yPos"); + s(this, "rowIdx"); + this.yPos = t.yPos, this.rowIdx = t.rowIdx; + } +} +class T { + constructor(t) { + s(this, "columns"); + s(this, "rows"); this.columns = t.columns, this.rows = t.rows; } getRowByYCoord(t) { let e = 0; - for (let s = 0; s < this.rows.length; s++) - if (t <= this.rows[s].yPos) { - e = s; + for (let o = 0; o < this.rows.length; o++) + if (t <= this.rows[o].yPos) { + e = o; break; } return e; } getColumnByXCoord(t) { let e = 0; - for (let s = 0; s < this.columns.length; s++) - if (t <= this.columns[s].xPos) { - e = s; + for (let o = 0; o < this.columns.length; o++) + if (t <= this.columns[o].xPos) { + e = o; break; } return e; } } -class P { +const d = "modern_sc_"; +class X { constructor(t, e) { - o(this, "table"); - o(this, "scroller"); - o(this, "toolbar"); - o(this, "header"); - o(this, "sheet"); - o(this, "editor"); - o(this, "styles"); - o(this, "config"); - o(this, "data"); - o(this, "viewport"); - o(this, "selection"); - o(this, "cache"); - const s = C(40, 40), l = this.makeConfigFromData(s, (e == null ? void 0 : e.view) ?? { height: 600, width: 800 }); - e != null && e.view && (l.view = e.view), this.config = new d(l), this.sheet = new V(this), this.table = new E(this), this.scroller = new x(this), this.toolbar = new I(this), this.header = new S(this), this.editor = new v(this), this.cache = this.getInitialCache(), this.viewport = new u(this, this.scroller.getViewportBoundlingRect()), this.selection = new L(), this.data = s, this.styles = new A(), this.buildComponent(), this.appendTableToTarget(t), this.renderSheet(); + s(this, "table"); + s(this, "scroller"); + s(this, "toolbar"); + s(this, "header"); + s(this, "sheet"); + s(this, "editor"); + s(this, "styles"); + s(this, "config"); + s(this, "data"); + s(this, "viewport"); + s(this, "selection"); + s(this, "cache"); + const o = p(40, 40), l = this.makeConfigFromData(o, (e == null ? void 0 : e.view) ?? { height: 600, width: 800 }); + e != null && e.view && (l.view = e.view), this.config = new u(l), this.sheet = new I(this), this.table = new L(this), this.scroller = new b(this), this.toolbar = new A(this), this.header = new R(this), this.editor = new x(this), this.cache = this.getInitialCache(), this.viewport = new g(this, this.scroller.getViewportBoundlingRect()), this.selection = new B(), this.data = o, this.styles = new z(), this.buildComponent(), this.appendTableToTarget(t), this.renderSheet(); } getInitialCache() { const t = []; @@ -463,32 +480,32 @@ class P { for (let i = 0; i <= this.config.columns.length - 1; i++) { const c = this.config.columns[i]; e += c.width; - const h = new z({ + const h = new M({ xPos: e, colIdx: i }); t.push(h); } - const s = []; + const o = []; let l = 0; for (let i = 0; i <= this.config.rows.length - 1; i++) { const c = this.config.rows[i]; l += c.height; - const h = new D({ + const h = new F({ yPos: l, rowIdx: i }); - s.push(h); + o.push(h); } - const n = new M({ + const n = new T({ columns: t, - rows: s + rows: o }); return console.log("CACHE: ", n), console.log("CONFIG: ", this.config), n; } buildComponent() { const t = document.createElement("div"); - t.appendChild(this.header.element), t.appendChild(this.sheet.element), t.classList.add("content"), this.table.element.appendChild(this.toolbar.element), this.table.element.appendChild(t), this.table.element.appendChild(this.scroller.element), this.table.element.append(this.editor.element); + t.appendChild(this.header.element), t.appendChild(this.sheet.element), t.classList.add(d + "content"), this.table.element.appendChild(this.toolbar.element), this.table.element.appendChild(t), this.table.element.appendChild(this.scroller.element), this.table.element.append(this.editor.element); } /**Destroy spreadsheet DOM element. * @@ -525,16 +542,20 @@ class P { return this.sheet.getCellByCoords(t, e); } getCell(t) { - const { column: e, row: s } = t; - return this.data[s][e]; + const { column: e, row: o } = t; + return this.data[o][e]; } changeCellValues(t, e) { - const { column: s, row: l } = t; - this.data[l][s].changeValues(e), this.renderCell(l, s); + const { column: o, row: l } = t; + this.data[l][o].changeValues(e), this.renderCell(l, o); + } + changeCellStyles(t, e) { + const { column: o, row: l } = t; + this.data[l][o].changeStyles(e), this.renderCell(l, o); } applyActionToRange(t, e) { - const s = Math.min(t.from.row, t.to.row), l = Math.max(t.from.row, t.to.row), n = Math.min(t.from.column, t.to.column), i = Math.max(t.from.column, t.to.column); - for (let c = s; c <= l; c++) + const o = Math.min(t.from.row, t.to.row), l = Math.max(t.from.row, t.to.row), n = Math.min(t.from.column, t.to.column), i = Math.max(t.from.column, t.to.column); + for (let c = o; c <= l; c++) for (let h = n; h <= i; h++) { const a = this.data[c][h]; e(a); @@ -559,8 +580,8 @@ class P { }); } } - showEditor(t) { - this.editor.show(t); + showEditor(t, e) { + this.editor.show(t, e); } renderSheet() { this.sheet.renderSheet(); @@ -569,72 +590,74 @@ class P { this.data[t][e].render(this); } loadData(t) { - const e = t.length, s = t[0] ? this.data[0].length : 0; + const e = t.length, o = t[0] ? this.data[0].length : 0; this.data = []; const l = []; for (let n = 0; n < e; n++) { const i = []; - for (let c = 0; c < s; c++) { + for (let c = 0; c < o; c++) { const h = t[n][c]; - i.push(new g({ + i.push(new f({ displayValue: h.displayValue, position: h.position, resultValue: h.resultValue, - value: h.value + value: h.value, + style: h.style })); } l.push(i); } - return this.data = l, this.selection.selectedCell = null, this.selection.selectedRange = null, this.config = this.makeConfigFromData(l, this.config.view), this.cache = this.getInitialCache(), this.scroller.updateScrollerSize(), this.viewport = new u(this, this.scroller.getViewportBoundlingRect()), this.renderSheet(), this; + return this.data = l, this.selection.selectedCell = null, this.selection.selectedRange = null, this.config = this.makeConfigFromData(l, this.config.view), this.cache = this.getInitialCache(), this.scroller.updateScrollerSize(), this.viewport = new g(this, this.scroller.getViewportBoundlingRect()), this.renderSheet(), this; } makeConfigFromData(t, e) { - const s = t.length - 1, l = t[0] ? t[0].length : 0, n = []; - for (let h = 0; h < s; h++) - n.push(new f({ + const o = t.length - 1, l = t[0] ? t[0].length : 0, n = []; + for (let h = 0; h < o; h++) + n.push(new y({ height: 40, title: String(h) })); const i = []; for (let h = 0; h < l; h++) - i.push(new m({ + i.push(new C({ width: 150, title: String(h) })); - return new d({ + return new u({ view: e, rows: n, columns: i }); } serializeData() { - const t = this.data.length, e = this.data[0] ? this.data[0].length : 0, s = []; + const t = this.data.length, e = this.data[0] ? this.data[0].length : 0, o = []; for (let l = 0; l < t; l++) { const n = []; for (let i = 0; i < e; i++) n.push(this.data[l][i].getSerializableCell()); - s.push(n); + o.push(n); } - return s; + return o; } } export { - M as Cache, - z as CachedColumn, - D as CachedRow, - g as Cell, - R as CellStyles, - m as Column, - d as Config, - b as Position, - w as RenderBox, - f as Row, - L as Selection, - k as SerializableCell, - A as Styles, - u as Viewport, - B as createSampleConfig, - C as createSampleData, - P as default, - F as makeSpreadsheetConfigAndData + d as CSS_PREFIX, + T as Cache, + M as CachedColumn, + F as CachedRow, + f as Cell, + k as CellStyles, + C as Column, + u as Config, + V as Position, + m as RenderBox, + y as Row, + B as Selection, + E as SerializableCell, + z as Styles, + g as Viewport, + D as createSampleConfig, + p as createSampleData, + X as default, + H as makeSpreadsheetConfigAndData }; //# sourceMappingURL=main.js.map diff --git a/dist/main.js.map b/dist/main.js.map index b36ea78..5325be5 100644 --- a/dist/main.js.map +++ b/dist/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sources":["../src/modules/renderBox.ts","../src/components/editor.ts","../src/components/header.ts","../src/components/scroller.ts","../src/modules/cell.ts","../src/components/sheet.ts","../src/components/table.ts","../src/components/toolbar.ts","../src/modules/config.ts","../src/modules/selection.ts","../src/modules/styles.ts","../src/modules/viewport.ts","../src/modules/column.ts","../src/modules/row.ts","../src/utils/createData.ts","../src/modules/cache.ts","../src/main.ts"],"sourcesContent":["export class RenderBox {\n x;\n y;\n width;\n height;\n constructor(config, cellPosition) {\n this.x = this.getXCoord(cellPosition.column, config);\n this.y = this.getYCoord(cellPosition.row, config);\n this.width = config.columns[cellPosition.column].width;\n this.height = config.rows[cellPosition.row].height;\n }\n getXCoord(column, config) {\n let x = 0;\n for (let i = 0; i < column; i++) {\n x += config.columns[i].width;\n }\n return x;\n }\n getYCoord(row, config) {\n let y = 0;\n for (let i = 0; i < row; i++) {\n y += config.rows[i].height;\n }\n return y;\n }\n}\n","import { RenderBox } from \"../modules/renderBox\";\nexport class Editor {\n element;\n root;\n constructor(root) {\n this.root = root;\n const element = document.createElement('input');\n element.classList.add('editor');\n this.element = element;\n this.hide();\n }\n hide() {\n this.element.style.display = 'none';\n this.element.classList.add('hide');\n this.element.blur();\n window.removeEventListener('click', this.handleClickOutside);\n this.element.removeEventListener('keydown', this.handleKeydown);\n this.root.focusTable();\n }\n show(position) {\n const { height, width, x, y } = new RenderBox(this.root.config, position);\n const cell = this.root.getCell(position);\n this.element.classList.remove('hide');\n this.element.style.top = (y - this.root.viewport.top) + 'px';\n this.element.style.left = (x - this.root.viewport.left) + 'px';\n this.element.style.width = width + 'px';\n this.element.style.height = height + 'px';\n this.element.style.display = 'block';\n window.addEventListener('click', this.handleClickOutside);\n this.element.addEventListener('keydown', this.handleKeydown);\n this.element.value = cell.value;\n this.element.focus();\n this.element.select();\n }\n handleKeydown = (event) => {\n const { key } = event;\n switch (key) {\n case 'Escape': {\n this.hide();\n break;\n }\n case 'Enter': {\n this.root.changeCellValues(this.root.selection.selectedCell, {\n value: this.element.value,\n displayValue: this.element.value\n });\n this.hide();\n }\n }\n };\n handleClickOutside = (event) => {\n const target = event.target;\n if (!this.element.contains(target)) {\n this.hide();\n }\n };\n}\n","export class Header {\n element;\n root;\n constructor(root) {\n this.root = root;\n const headerElement = document.createElement('header');\n headerElement.classList.add();\n this.element = headerElement;\n }\n}\n","export class Scroller {\n element;\n verticalScroller;\n horizontalScroller;\n root;\n isSelecting = false;\n constructor(root) {\n this.root = root;\n const { horizontalScroller, scroller, verticalScroller } = this.buildComponent();\n this.element = scroller;\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n this.element.style.height = this.root.config.view.height + 'px';\n this.element.style.width = this.root.config.view.width + 'px';\n this.element.tabIndex = -1;\n this.updateScrollerSize(); //* Init size set\n this.element.addEventListener('scroll', this.handleScroll);\n this.element.addEventListener('mousedown', this.handleClick);\n this.element.addEventListener('mousemove', this.handleMouseMove);\n this.element.addEventListener('mouseup', this.handleMouseUp);\n this.element.addEventListener('dblclick', this.handleDoubleClick);\n this.element.addEventListener('keydown', this.handleKeydown);\n }\n handleMouseMove = (event) => {\n if (!this.isSelecting)\n return;\n const { offsetX, offsetY } = event;\n const lastSelectedCell = this.root.getCellByCoords(offsetX, offsetY);\n if (this.root.selection.selectedRange) {\n this.root.selection.selectedRange.to = lastSelectedCell;\n }\n this.root.renderSheet();\n };\n handleMouseUp = () => {\n this.isSelecting = false;\n if (this.root.selection.selectedRange) {\n if ((this.root.selection.selectedRange.from.row === this.root.selection.selectedRange.to.row) &&\n (this.root.selection.selectedRange.from.column === this.root.selection.selectedRange.to.column)) {\n this.root.selection.selectedRange = null;\n }\n }\n this.root.renderSheet();\n };\n handleDoubleClick = (event) => {\n event.preventDefault();\n const position = this.root.getCellByCoords(event.offsetX, event.offsetY);\n this.root.showEditor(position);\n };\n handleKeydown = (event) => {\n console.log(event);\n //* Navigation\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(event.key)) {\n event.preventDefault();\n this.root.selection.selectedRange = null;\n switch (event.key) {\n case 'ArrowLeft': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.column > 0) {\n console.log('tick');\n this.root.selection.selectedCell.column -= 1;\n this.root.renderSheet();\n }\n break;\n }\n case 'ArrowRight': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.column < this.root.config.columns.length - 1) {\n this.root.selection.selectedCell.column += 1;\n this.root.renderSheet();\n }\n break;\n }\n case 'ArrowUp': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.row > 0) {\n this.root.selection.selectedCell.row -= 1;\n this.root.renderSheet();\n }\n break;\n }\n case 'ArrowDown': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.row < this.root.config.rows.length - 1) {\n this.root.selection.selectedCell.row += 1;\n this.root.renderSheet();\n }\n break;\n }\n }\n }\n if (!event.metaKey && !event.ctrlKey) { //* Prevent handle shortcutrs\n if (event.key === 'F2' || /^([a-z]|[а-я])$/.test(event.key.toLowerCase())) { //* English and Russian keyboard. Or F2 button\n event.preventDefault();\n if (!this.root.selection.selectedCell)\n return;\n this.root.showEditor(this.root.selection.selectedCell);\n }\n }\n if (event.key === 'Delete') {\n event.preventDefault();\n this.root.deleteSelectedCellsValues();\n this.root.renderSheet();\n }\n };\n handleClick = (event) => {\n if (event.button !== 0)\n return; // Left mouse button\n const { offsetX, offsetY } = event;\n const clickedCell = this.root.getCellByCoords(offsetX, offsetY);\n this.isSelecting = true;\n this.root.selection.selectedRange = {\n from: clickedCell,\n to: clickedCell\n };\n this.root.selection.selectedCell = clickedCell;\n this.root.renderSheet();\n };\n handleScroll = () => {\n const rect = this.getViewportBoundlingRect();\n this.root.viewport.updateValues(rect);\n this.root.renderSheet();\n };\n getViewportBoundlingRect() {\n const { scrollTop, scrollLeft } = this.element;\n const { height, width } = this.element.getBoundingClientRect();\n const bottom = scrollTop + height;\n const right = scrollLeft + width;\n return {\n top: scrollTop,\n left: scrollLeft,\n bottom,\n right\n };\n }\n buildComponent() {\n const scroller = document.createElement('div');\n const verticalScroller = document.createElement('div');\n const horizontalScroller = document.createElement('div');\n const groupScrollers = document.createElement('div');\n const stack = document.createElement('div');\n verticalScroller.style.width = '0px';\n verticalScroller.style.pointerEvents = 'none';\n horizontalScroller.style.pointerEvents = 'none';\n groupScrollers.style.display = 'flex';\n stack.appendChild(verticalScroller);\n stack.appendChild(horizontalScroller);\n groupScrollers.appendChild(stack);\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n scroller.appendChild(groupScrollers);\n scroller.classList.add('scroller');\n return { scroller, verticalScroller, horizontalScroller };\n }\n getActualHeight() {\n return this.root.config.rows.reduce((acc, curr) => {\n acc += curr.height;\n return acc;\n }, 0);\n }\n getActualWidth() {\n return this.root.config.columns.reduce((acc, curr) => {\n acc += curr.width;\n return acc;\n }, 0);\n }\n updateScrollerSize() {\n const totalHeight = this.getActualHeight();\n const totalWidth = this.getActualWidth();\n this.setScrollerHeight(totalHeight);\n this.setScrollerWidth(totalWidth);\n }\n setScrollerHeight(height) {\n this.verticalScroller.style.height = height + 'px';\n }\n setScrollerWidth(width) {\n this.horizontalScroller.style.width = width + 'px';\n }\n}\n","import { RenderBox } from \"./renderBox\";\nexport class CellStyles {\n fontSize = 16;\n fontColor = 'black';\n background = 'white';\n borderColor = 'black';\n selectedBackground = '#4287f5';\n selectedFontColor = '#ffffff';\n constructor(props) {\n if (props) {\n Object.assign(this, props); // Override default styles\n }\n }\n}\nexport class Position {\n row;\n column;\n constructor(row, column) {\n this.row = row;\n this.column = column;\n }\n}\nexport class SerializableCell {\n value;\n displayValue;\n resultValue;\n position;\n style;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n}\nexport class Cell {\n value;\n displayValue;\n /** This refers to the values ​​​​that were obtained by calculations, for example, after calculating the formula */\n resultValue;\n position;\n style = new CellStyles();\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n }\n getSerializableCell() {\n const cell = new SerializableCell({\n displayValue: this.displayValue,\n position: this.position,\n resultValue: this.resultValue,\n style: this.style,\n value: this.value\n });\n return cell;\n }\n changeValues(values) {\n Object.assign(this, values);\n }\n isCellInRange(root) {\n const { column, row } = this.position;\n const { selectedRange } = root.selection;\n if (!selectedRange)\n return false;\n const isCellInRow = row >= Math.min(selectedRange.from.row, selectedRange.to.row) && row <= Math.max(selectedRange.to.row, selectedRange.from.row);\n const isCellInCol = column >= Math.min(selectedRange.from.column, selectedRange.to.column) && column <= Math.max(selectedRange.to.column, selectedRange.from.column);\n return isCellInCol && isCellInRow;\n }\n render(root) {\n let { height, width, x, y } = new RenderBox(root.config, this.position);\n const { ctx } = root;\n const isCellSelected = (root.selection.selectedCell?.row === this.position.row && root.selection.selectedCell.column === this.position.column);\n const isCellInRange = this.isCellInRange(root);\n y -= root.viewport.top;\n x -= root.viewport.left;\n ctx.clearRect(x, y, width, height);\n ctx.fillStyle = isCellSelected || isCellInRange ? this.style.selectedBackground : this.style.background;\n ctx.strokeStyle = 'black';\n ctx.fillRect(x, y, width - 1, height - 1);\n ctx.strokeRect(x, y, width, height);\n ctx.fillStyle = isCellSelected || isCellInRange ? this.style.selectedFontColor : this.style.fontColor;\n ctx.textAlign = 'left';\n ctx.font = `${this.style.fontSize}px Arial`;\n ctx.textBaseline = 'middle';\n ctx.fillText(this.displayValue, x + 2, y + height / 2);\n }\n}\n","import { Position } from \"../modules/cell\";\n/**\n * Display (CANVAS) element where cells render\n */\nexport class Sheet {\n element;\n ctx;\n root;\n constructor(root) {\n this.root = root;\n const canvas = document.createElement('canvas');\n canvas.classList.add('sheet');\n //* Set up canvas sizes based on provided root config\n canvas.height = this.root.config.view.height;\n canvas.width = this.root.config.view.width;\n canvas.style.width = this.root.config.view.width + 'px';\n canvas.style.height = this.root.config.view.height + 'px';\n this.element = canvas;\n const ctx = this.element.getContext('2d');\n if (!ctx)\n throw new Error('Enable hardware acceleration');\n this.ctx = ctx;\n }\n getCellByCoords(x, y) {\n let row = 0;\n let height = 0;\n while (height <= y) {\n height += this.root.config.rows[row].height;\n if (height >= y)\n break;\n row++;\n }\n let col = 0;\n let width = 0;\n while (width <= x) {\n width += this.root.config.columns[col].width;\n if (width >= x)\n break;\n col++;\n }\n return new Position(row, col);\n }\n renderCell(position) {\n const { column, row } = position;\n this.root.data[row][column].render(this.root);\n }\n renderSheet() {\n const firstRowIdx = this.root.viewport.firstRow;\n const lastColIdx = this.root.viewport.lastCol + 3;\n const lastRowIdx = this.root.viewport.lastRow + 3;\n const firstColIdx = this.root.viewport.firstCol;\n for (let row = firstRowIdx; row <= lastRowIdx; row++) {\n for (let col = firstColIdx; col <= lastColIdx; col++) {\n if (!this.root.config.columns[col] || !this.root.config.rows[row])\n break; //* Prevent read undefined\n this.renderCell({ column: col, row });\n }\n }\n }\n}\n","/** Base (root) component */\nexport class Table {\n element;\n root;\n constructor(root) {\n this.root = root;\n const container = document.createElement('div');\n container.classList.add('spreadsheet_container');\n this.element = container;\n this.changeElementSizes(this.root.viewProps);\n }\n changeElementSizes(sizes) {\n const { height, width } = sizes;\n this.element.style.width = width + 'px';\n this.element.style.height = height + 'px';\n }\n}\n","export class Toolbar {\n element;\n root;\n constructor(root) {\n this.root = root;\n const toolbarElement = document.createElement('div');\n toolbarElement.classList.add('toolbar');\n this.element = toolbarElement;\n }\n}\n","export class Config {\n rows;\n columns;\n view = {\n width: 800,\n height: 600,\n };\n constructor(props) {\n this.columns = props.columns;\n this.rows = props.rows;\n this.view = props.view;\n }\n}\n","export class Selection {\n selectedCell = null;\n selectedRange = null;\n}\n","export class Styles {\n}\n","export class Viewport {\n root;\n top;\n left;\n right;\n bottom;\n firstRow;\n lastRow;\n firstCol;\n lastCol;\n constructor(root, props) {\n this.root = root;\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastCol = this.getFirstRow(); //!Temp\n this.firstCol = this.getFirstRow(); //!Temp\n this.lastRow = this.getLastRow();\n this.updateValues({\n top: 0,\n left: 0,\n right: this.root.viewProps.width,\n bottom: this.root.viewProps.height\n });\n }\n updateValues(props) {\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastRow = this.getLastRow();\n this.firstCol = this.getFirstCol();\n this.lastCol = this.getLastCol();\n }\n /** Get index of first row in viewport */\n getFirstRow() {\n let rowIdx = this.root.cache.getRowByYCoord(this.top);\n return rowIdx;\n }\n getLastRow() {\n let rowIdx = this.root.cache.getRowByYCoord(this.bottom);\n return rowIdx;\n }\n getFirstCol() {\n let colIdx = this.root.cache.getColumnByXCoord(this.left);\n return colIdx;\n }\n getLastCol() {\n let colIdx = this.root.cache.getColumnByXCoord(this.right);\n return colIdx;\n }\n}\n","export class Column {\n width;\n title;\n constructor(props) {\n this.width = props.width;\n this.title = props.title;\n }\n}\n","export class Row {\n height;\n title;\n constructor(props) {\n this.height = props.height;\n this.title = props.title;\n }\n}\n","import { Cell } from \"../modules/cell\";\nimport { Column } from \"../modules/column\";\nimport { Config } from \"../modules/config\";\nimport { Row } from \"../modules/row\";\nexport function createSampleData(rows, columns, fillCellsByCoords = false) {\n const data = [];\n for (let row = 0; row <= rows; row++) {\n const innerRow = [];\n for (let col = 0; col <= columns; col++) {\n const value = fillCellsByCoords ? `${row}:${col}` : '';\n const cell = new Cell({\n displayValue: value,\n resultValue: value,\n value,\n position: {\n column: col,\n row: row\n }\n });\n innerRow.push(cell);\n }\n data.push(innerRow);\n }\n return data;\n}\nexport function createSampleConfig(rows, columns) {\n const rowsArr = [];\n for (let i = 0; i <= rows; i++) {\n const rowItem = new Row({\n height: 40,\n title: String(i)\n });\n rowsArr.push(rowItem);\n }\n const colsArr = [];\n for (let i = 0; i <= columns; i++) {\n const colItem = new Column({\n title: String(i),\n width: 150\n });\n colsArr.push(colItem);\n }\n const config = new Config({\n columns: colsArr,\n rows: rowsArr,\n view: {\n height: 600,\n width: 800\n }\n });\n return config;\n}\nexport function makeSpreadsheetConfigAndData(rows, columns) {\n const data = createSampleData(rows, columns);\n const config = createSampleConfig(rows, columns);\n return { data, config };\n}\n","export class CachedColumn {\n xPos;\n colIdx;\n constructor(props) {\n this.xPos = props.xPos;\n this.colIdx = props.colIdx;\n }\n}\nexport class CachedRow {\n yPos;\n rowIdx;\n constructor(props) {\n this.yPos = props.yPos;\n this.rowIdx = props.rowIdx;\n }\n}\nexport class Cache {\n columns;\n rows;\n constructor(initial) {\n this.columns = initial.columns;\n this.rows = initial.rows;\n }\n getRowByYCoord(y) {\n let rowIdx = 0;\n for (let i = 0; i < this.rows.length; i++) {\n if (y <= this.rows[i].yPos) { //* Intersection detect\n rowIdx = i;\n break;\n }\n }\n return rowIdx;\n }\n getColumnByXCoord(x) {\n let colIdx = 0;\n for (let i = 0; i < this.columns.length; i++) {\n if (x <= this.columns[i].xPos) { //* Intersection detect\n colIdx = i;\n break;\n }\n }\n return colIdx;\n }\n}\n","import { Editor } from \"./components/editor\";\nimport { Header } from \"./components/header\";\nimport { Scroller } from \"./components/scroller\";\nimport { Sheet } from \"./components/sheet\";\nimport { Table } from \"./components/table\";\nimport { Toolbar } from \"./components/toolbar\";\nimport { Cell } from \"./modules/cell\";\nimport { Config } from \"./modules/config\";\nimport { Selection } from \"./modules/selection\";\nimport { Styles } from \"./modules/styles\";\nimport { Viewport } from \"./modules/viewport\";\nimport './scss/main.scss';\nimport { createSampleData } from \"./utils/createData\";\nimport { Cache, CachedColumn, CachedRow } from \"./modules/cache\";\nimport { Row } from \"./modules/row\";\nimport { Column } from \"./modules/column\";\nexport default class Spreadsheet {\n table;\n scroller;\n toolbar;\n header;\n sheet;\n editor;\n styles;\n config;\n data;\n viewport;\n selection;\n cache;\n constructor(target, props) {\n const data = createSampleData(40, 40);\n const config = this.makeConfigFromData(data, props?.view ?? { height: 600, width: 800 });\n if (props?.view) {\n config.view = props.view;\n }\n this.config = new Config(config);\n this.sheet = new Sheet(this);\n this.table = new Table(this);\n this.scroller = new Scroller(this);\n this.toolbar = new Toolbar(this);\n this.header = new Header(this);\n this.editor = new Editor(this);\n this.cache = this.getInitialCache();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.selection = new Selection();\n this.data = data;\n this.styles = new Styles();\n this.buildComponent();\n this.appendTableToTarget(target);\n this.renderSheet();\n }\n getInitialCache() {\n const cachedCols = [];\n let currentWidth = 0;\n for (let i = 0; i <= this.config.columns.length - 1; i++) {\n const col = this.config.columns[i];\n currentWidth += col.width;\n const cacheCol = new CachedColumn({\n xPos: currentWidth,\n colIdx: i\n });\n cachedCols.push(cacheCol);\n }\n const cachedRows = [];\n let currentHeight = 0;\n for (let i = 0; i <= this.config.rows.length - 1; i++) {\n const row = this.config.rows[i];\n currentHeight += row.height;\n const cacheRow = new CachedRow({\n yPos: currentHeight,\n rowIdx: i\n });\n cachedRows.push(cacheRow);\n }\n const cache = new Cache({\n columns: cachedCols,\n rows: cachedRows\n });\n console.log(\"CACHE: \", cache);\n console.log(\"CONFIG: \", this.config);\n return cache;\n }\n buildComponent() {\n const content = document.createElement('div'); //* Abstract\n content.appendChild(this.header.element);\n content.appendChild(this.sheet.element);\n content.classList.add('content');\n this.table.element.appendChild(this.toolbar.element);\n this.table.element.appendChild(content);\n this.table.element.appendChild(this.scroller.element);\n this.table.element.append(this.editor.element);\n }\n /**Destroy spreadsheet DOM element.\n *\n * May be usefull when need to rerender component.\n */\n destroy() {\n this.table.element.remove();\n }\n appendTableToTarget(target) {\n if (typeof target === 'string') {\n const element = document.querySelector(target);\n if (!element)\n throw new Error(`Element with selector ${target} is not finded in DOM.\\n Make sure it exists.`);\n element?.appendChild(this.table.element);\n }\n if (target instanceof HTMLElement) {\n target.append(this.table.element);\n }\n }\n /** Canvas rendering context 2D.\n *\n * Abble to draw on canvas with default CanvasAPI methods\n */\n get ctx() {\n return this.sheet.ctx;\n }\n get viewProps() {\n return this.config.view;\n }\n /** Focusing on interactive part of spreadsheet */\n focusTable() {\n this.scroller.element.focus();\n }\n getCellByCoords(x, y) {\n return this.sheet.getCellByCoords(x, y);\n }\n getCell(position) {\n const { column, row } = position;\n return this.data[row][column];\n }\n changeCellValues(position, values) {\n const { column, row } = position;\n this.data[row][column].changeValues(values);\n this.renderCell(row, column);\n }\n applyActionToRange(range, callback) {\n const fromRow = Math.min(range.from.row, range.to.row);\n const toRow = Math.max(range.from.row, range.to.row);\n const fromCol = Math.min(range.from.column, range.to.column);\n const toCol = Math.max(range.from.column, range.to.column);\n for (let row = fromRow; row <= toRow; row++) {\n for (let col = fromCol; col <= toCol; col++) {\n const cell = this.data[row][col];\n callback(cell);\n }\n }\n }\n deleteSelectedCellsValues() {\n if (this.selection.selectedRange !== null) {\n this.applyActionToRange(this.selection.selectedRange, cell => {\n this.changeCellValues(cell.position, {\n displayValue: '',\n resultValue: '',\n value: ''\n });\n });\n }\n else {\n if (!this.selection.selectedCell)\n return;\n this.changeCellValues(this.selection.selectedCell, {\n displayValue: '',\n resultValue: '',\n value: ''\n });\n }\n }\n showEditor(position) {\n this.editor.show(position);\n }\n renderSheet() {\n this.sheet.renderSheet();\n }\n renderCell(row, col) {\n this.data[row][col].render(this);\n }\n loadData(data) {\n const rowsLength = data.length;\n const colsLength = data[0] ? this.data[0].length : 0;\n this.data = [];\n const formattedData = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n const cell = data[row][col];\n innerRow.push(new Cell({\n displayValue: cell.displayValue,\n position: cell.position,\n resultValue: cell.resultValue,\n value: cell.value\n }));\n }\n formattedData.push(innerRow);\n }\n this.data = formattedData;\n this.selection.selectedCell = null;\n this.selection.selectedRange = null;\n this.config = this.makeConfigFromData(formattedData, this.config.view);\n this.cache = this.getInitialCache();\n this.scroller.updateScrollerSize();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.renderSheet();\n return this;\n }\n makeConfigFromData(data, view) {\n const lastRowIdx = data.length - 1;\n const lastColIdx = data[0] ? data[0].length : 0;\n const rows = [];\n for (let row = 0; row < lastRowIdx; row++) {\n rows.push(new Row({\n height: 40,\n title: String(row)\n }));\n }\n const columns = [];\n for (let col = 0; col < lastColIdx; col++) {\n columns.push(new Column({\n width: 150,\n title: String(col)\n }));\n }\n const config = new Config({\n view,\n rows,\n columns\n });\n return config;\n }\n serializeData() {\n const rowsLength = this.data.length;\n const colsLength = this.data[0] ? this.data[0].length : 0;\n const cellsArray = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n innerRow.push(this.data[row][col].getSerializableCell());\n }\n cellsArray.push(innerRow);\n }\n return cellsArray;\n }\n}\nexport * from './modules/cache';\nexport * from './modules/cell';\nexport * from './modules/column';\nexport * from './modules/config';\nexport * from './modules/renderBox';\nexport * from './modules/row';\nexport * from './modules/selection';\nexport * from './modules/styles';\nexport * from './modules/viewport';\nexport * from './utils/createData';\n"],"names":["RenderBox","config","cellPosition","__publicField","column","x","i","row","y","Editor","root","event","key","target","element","position","height","width","cell","Header","headerElement","Scroller","offsetX","offsetY","lastSelectedCell","clickedCell","rect","horizontalScroller","scroller","verticalScroller","scrollTop","scrollLeft","bottom","right","groupScrollers","stack","acc","curr","totalHeight","totalWidth","CellStyles","props","Position","SerializableCell","Cell","values","selectedRange","isCellInRow","_a","ctx","isCellSelected","isCellInRange","Sheet","canvas","col","firstRowIdx","lastColIdx","lastRowIdx","firstColIdx","Table","container","sizes","Toolbar","toolbarElement","Config","Selection","Styles","Viewport","Column","Row","createSampleData","rows","columns","fillCellsByCoords","data","innerRow","value","createSampleConfig","rowsArr","rowItem","colsArr","colItem","makeSpreadsheetConfigAndData","CachedColumn","CachedRow","Cache","initial","rowIdx","colIdx","Spreadsheet","cachedCols","currentWidth","cacheCol","cachedRows","currentHeight","cacheRow","cache","content","range","callback","fromRow","toRow","fromCol","toCol","rowsLength","colsLength","formattedData","view","cellsArray"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"main.js","sources":["../src/modules/renderBox.ts","../src/components/editor.ts","../src/components/header.ts","../src/components/scroller.ts","../src/modules/cell.ts","../src/components/sheet.ts","../src/components/table.ts","../src/components/toolbar.ts","../src/modules/config.ts","../src/modules/selection.ts","../src/modules/styles.ts","../src/modules/viewport.ts","../src/modules/column.ts","../src/modules/row.ts","../src/utils/createData.ts","../src/modules/cache.ts","../src/main.ts"],"sourcesContent":["export class RenderBox {\n x;\n y;\n width;\n height;\n constructor(config, cellPosition) {\n this.x = this.getXCoord(cellPosition.column, config);\n this.y = this.getYCoord(cellPosition.row, config);\n this.width = config.columns[cellPosition.column].width;\n this.height = config.rows[cellPosition.row].height;\n }\n getXCoord(column, config) {\n let x = 0;\n for (let i = 0; i < column; i++) {\n x += config.columns[i].width;\n }\n return x;\n }\n getYCoord(row, config) {\n let y = 0;\n for (let i = 0; i < row; i++) {\n y += config.rows[i].height;\n }\n return y;\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { RenderBox } from \"../modules/renderBox\";\nexport class Editor {\n element;\n root;\n constructor(root) {\n this.root = root;\n const element = document.createElement('input');\n element.classList.add(CSS_PREFIX + 'editor');\n this.element = element;\n this.hide();\n }\n hide() {\n this.element.style.display = 'none';\n this.element.classList.add('hide');\n this.element.blur();\n window.removeEventListener('click', this.handleClickOutside);\n this.element.removeEventListener('keydown', this.handleKeydown);\n this.root.focusTable();\n }\n show(position, initialString) {\n const { height, width, x, y } = new RenderBox(this.root.config, position);\n const cell = this.root.getCell(position);\n this.element.classList.remove('hide');\n this.element.style.top = (y - this.root.viewport.top) + 'px';\n this.element.style.left = (x - this.root.viewport.left) + 'px';\n this.element.style.width = width + 'px';\n this.element.style.height = height + 'px';\n this.element.style.display = 'block';\n window.addEventListener('click', this.handleClickOutside);\n this.element.addEventListener('keydown', this.handleKeydown);\n this.element.value = initialString ? initialString : cell.value;\n this.element.focus();\n if (!initialString)\n this.element.select();\n }\n handleKeydown = (event) => {\n const { key } = event;\n switch (key) {\n case 'Escape': {\n this.hide();\n break;\n }\n case 'Enter': {\n this.root.changeCellValues(this.root.selection.selectedCell, {\n value: this.element.value,\n displayValue: this.element.value\n });\n this.hide();\n }\n }\n };\n handleClickOutside = (event) => {\n const target = event.target;\n if (!this.element.contains(target)) {\n this.hide();\n }\n };\n}\n","export class Header {\n element;\n root;\n constructor(root) {\n this.root = root;\n const headerElement = document.createElement('header');\n headerElement.classList.add();\n this.element = headerElement;\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nexport class Scroller {\n element;\n verticalScroller;\n horizontalScroller;\n root;\n isSelecting = false;\n constructor(root) {\n this.root = root;\n const { horizontalScroller, scroller, verticalScroller } = this.buildComponent();\n this.element = scroller;\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n this.element.style.height = this.root.config.view.height + 'px';\n this.element.style.width = this.root.config.view.width + 'px';\n this.element.tabIndex = -1;\n this.updateScrollerSize(); //* Init size set\n this.element.addEventListener('scroll', this.handleScroll);\n this.element.addEventListener('mousedown', this.handleClick);\n this.element.addEventListener('mousemove', this.handleMouseMove);\n this.element.addEventListener('mouseup', this.handleMouseUp);\n this.element.addEventListener('dblclick', this.handleDoubleClick);\n this.element.addEventListener('keydown', this.handleKeydown);\n }\n handleMouseMove = (event) => {\n if (!this.isSelecting)\n return;\n const { offsetX, offsetY } = event;\n const lastSelectedCell = this.root.getCellByCoords(offsetX, offsetY);\n if (this.root.selection.selectedRange) {\n this.root.selection.selectedRange.to = lastSelectedCell;\n }\n this.root.renderSheet();\n };\n handleMouseUp = () => {\n this.isSelecting = false;\n if (this.root.selection.selectedRange) {\n if ((this.root.selection.selectedRange.from.row === this.root.selection.selectedRange.to.row) &&\n (this.root.selection.selectedRange.from.column === this.root.selection.selectedRange.to.column)) {\n this.root.selection.selectedRange = null;\n }\n }\n this.root.renderSheet();\n };\n handleDoubleClick = (event) => {\n event.preventDefault();\n const position = this.root.getCellByCoords(event.offsetX, event.offsetY);\n this.root.showEditor(position);\n };\n handleKeydown = (event) => {\n console.log(event);\n //* Navigation\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(event.key)) {\n event.preventDefault();\n this.root.selection.selectedRange = null;\n switch (event.key) {\n case 'ArrowLeft': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.column > 0) {\n console.log('tick');\n this.root.selection.selectedCell.column -= 1;\n this.root.renderSheet();\n }\n break;\n }\n case 'ArrowRight': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.column < this.root.config.columns.length - 1) {\n this.root.selection.selectedCell.column += 1;\n this.root.renderSheet();\n }\n break;\n }\n case 'ArrowUp': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.row > 0) {\n this.root.selection.selectedCell.row -= 1;\n this.root.renderSheet();\n }\n break;\n }\n case 'ArrowDown': {\n if (this.root.selection.selectedCell && this.root.selection.selectedCell.row < this.root.config.rows.length - 1) {\n this.root.selection.selectedCell.row += 1;\n this.root.renderSheet();\n }\n break;\n }\n }\n }\n const keysRegex = /^([a-z]|[а-я])$/;\n if (!event.metaKey && !event.ctrlKey) { //* Prevent handle shortcutrs\n const isPressedLetterKey = keysRegex.test(event.key.toLowerCase());\n if (event.key === 'F2' || isPressedLetterKey) { //* English and Russian keyboard. Or F2 button\n event.preventDefault();\n if (!this.root.selection.selectedCell)\n return;\n this.root.showEditor(this.root.selection.selectedCell, isPressedLetterKey ? event.key : undefined);\n }\n }\n if (event.key === 'Delete') {\n event.preventDefault();\n this.root.deleteSelectedCellsValues();\n this.root.renderSheet();\n }\n };\n handleClick = (event) => {\n if (event.button !== 0)\n return; // Left mouse button\n const { offsetX, offsetY } = event;\n const clickedCell = this.root.getCellByCoords(offsetX, offsetY);\n this.isSelecting = true;\n this.root.selection.selectedRange = {\n from: clickedCell,\n to: clickedCell\n };\n this.root.selection.selectedCell = clickedCell;\n this.root.renderSheet();\n };\n handleScroll = () => {\n const rect = this.getViewportBoundlingRect();\n this.root.viewport.updateValues(rect);\n this.root.renderSheet();\n };\n getViewportBoundlingRect() {\n const { scrollTop, scrollLeft } = this.element;\n const { height, width } = this.element.getBoundingClientRect();\n const bottom = scrollTop + height;\n const right = scrollLeft + width;\n return {\n top: scrollTop,\n left: scrollLeft,\n bottom,\n right\n };\n }\n buildComponent() {\n const scroller = document.createElement('div');\n const verticalScroller = document.createElement('div');\n const horizontalScroller = document.createElement('div');\n const groupScrollers = document.createElement('div');\n const stack = document.createElement('div');\n verticalScroller.style.width = '0px';\n verticalScroller.style.pointerEvents = 'none';\n horizontalScroller.style.pointerEvents = 'none';\n groupScrollers.style.display = 'flex';\n stack.appendChild(verticalScroller);\n stack.appendChild(horizontalScroller);\n groupScrollers.appendChild(stack);\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n scroller.appendChild(groupScrollers);\n scroller.classList.add(CSS_PREFIX + 'scroller');\n return { scroller, verticalScroller, horizontalScroller };\n }\n getActualHeight() {\n return this.root.config.rows.reduce((acc, curr) => {\n acc += curr.height;\n return acc;\n }, 0);\n }\n getActualWidth() {\n return this.root.config.columns.reduce((acc, curr) => {\n acc += curr.width;\n return acc;\n }, 0);\n }\n updateScrollerSize() {\n const totalHeight = this.getActualHeight();\n const totalWidth = this.getActualWidth();\n this.setScrollerHeight(totalHeight);\n this.setScrollerWidth(totalWidth);\n }\n setScrollerHeight(height) {\n this.verticalScroller.style.height = height + 'px';\n }\n setScrollerWidth(width) {\n this.horizontalScroller.style.width = width + 'px';\n }\n}\n","import { RenderBox } from \"./renderBox\";\nexport class CellStyles {\n fontSize = 16;\n fontColor = 'black';\n background = 'white';\n borderColor = 'black';\n selectedBackground = '#4287f5';\n selectedFontColor = '#ffffff';\n constructor(props) {\n if (props) {\n Object.assign(this, props); // Override default styles\n }\n }\n}\nexport class Position {\n row;\n column;\n constructor(row, column) {\n this.row = row;\n this.column = column;\n }\n}\nexport class SerializableCell {\n value;\n displayValue;\n resultValue;\n position;\n style;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n}\nexport class Cell {\n /** True value (data) */\n value;\n /** Value to render */\n displayValue;\n /** This refers to the values ​​​​that were obtained by calculations, for example, after calculating the formula */\n resultValue;\n position;\n style = null;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n getSerializableCell() {\n const cell = new SerializableCell({\n displayValue: this.displayValue,\n position: this.position,\n resultValue: this.resultValue,\n style: this.style,\n value: this.value\n });\n return cell;\n }\n changeStyles(styles) {\n this.style = styles;\n }\n changeValues(values) {\n Object.assign(this, values);\n }\n isCellInRange(root) {\n const { column, row } = this.position;\n const { selectedRange } = root.selection;\n if (!selectedRange)\n return false;\n const isCellInRow = row >= Math.min(selectedRange.from.row, selectedRange.to.row) && row <= Math.max(selectedRange.to.row, selectedRange.from.row);\n const isCellInCol = column >= Math.min(selectedRange.from.column, selectedRange.to.column) && column <= Math.max(selectedRange.to.column, selectedRange.from.column);\n return isCellInCol && isCellInRow;\n }\n render(root) {\n let { height, width, x, y } = new RenderBox(root.config, this.position);\n const { ctx } = root;\n const isCellSelected = (root.selection.selectedCell?.row === this.position.row && root.selection.selectedCell.column === this.position.column);\n const isCellInRange = this.isCellInRange(root);\n y -= root.viewport.top;\n x -= root.viewport.left;\n const styles = this.style ?? root.styles.cells;\n ctx.clearRect(x, y, width, height);\n ctx.fillStyle = isCellSelected || isCellInRange ? styles.selectedBackground : styles.background;\n ctx.strokeStyle = 'black';\n ctx.fillRect(x, y, width - 1, height - 1);\n ctx.strokeRect(x, y, width, height);\n ctx.fillStyle = isCellSelected || isCellInRange ? styles.selectedFontColor : styles.fontColor;\n ctx.textAlign = 'left';\n ctx.font = `${styles.fontSize}px Arial`;\n ctx.textBaseline = 'middle';\n ctx.fillText(this.displayValue, x + 2, y + height / 2);\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { Position } from \"../modules/cell\";\n/**\n * Display (CANVAS) element where cells render\n */\nexport class Sheet {\n element;\n ctx;\n root;\n constructor(root) {\n this.root = root;\n const canvas = document.createElement('canvas');\n canvas.classList.add(CSS_PREFIX + 'sheet');\n //* Set up canvas sizes based on provided root config\n canvas.height = this.root.config.view.height;\n canvas.width = this.root.config.view.width;\n canvas.style.width = this.root.config.view.width + 'px';\n canvas.style.height = this.root.config.view.height + 'px';\n this.element = canvas;\n const ctx = this.element.getContext('2d');\n if (!ctx)\n throw new Error('Enable hardware acceleration');\n this.ctx = ctx;\n }\n getCellByCoords(x, y) {\n let row = 0;\n let height = 0;\n while (height <= y) {\n height += this.root.config.rows[row].height;\n if (height >= y)\n break;\n row++;\n }\n let col = 0;\n let width = 0;\n while (width <= x) {\n width += this.root.config.columns[col].width;\n if (width >= x)\n break;\n col++;\n }\n return new Position(row, col);\n }\n renderCell(position) {\n const { column, row } = position;\n this.root.data[row][column].render(this.root);\n }\n renderSheet() {\n const firstRowIdx = this.root.viewport.firstRow;\n const lastColIdx = this.root.viewport.lastCol + 3;\n const lastRowIdx = this.root.viewport.lastRow + 3;\n const firstColIdx = this.root.viewport.firstCol;\n for (let row = firstRowIdx; row <= lastRowIdx; row++) {\n for (let col = firstColIdx; col <= lastColIdx; col++) {\n if (!this.root.config.columns[col] || !this.root.config.rows[row])\n break; //* Prevent read undefined\n this.renderCell({ column: col, row });\n }\n }\n }\n}\n","import { CSS_PREFIX } from \"../main\";\n/** Base (root) component */\nexport class Table {\n element;\n root;\n constructor(root) {\n this.root = root;\n const container = document.createElement('div');\n container.classList.add(CSS_PREFIX + 'spreadsheet_container');\n this.element = container;\n this.changeElementSizes(this.root.viewProps);\n }\n changeElementSizes(sizes) {\n const { height, width } = sizes;\n this.element.style.width = width + 'px';\n this.element.style.height = height + 'px';\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nexport class Toolbar {\n element;\n root;\n constructor(root) {\n this.root = root;\n const toolbarElement = document.createElement('div');\n toolbarElement.classList.add(CSS_PREFIX + 'toolbar');\n this.element = toolbarElement;\n }\n}\n","export class Config {\n rows;\n columns;\n view = {\n width: 800,\n height: 600,\n };\n constructor(props) {\n this.columns = props.columns;\n this.rows = props.rows;\n this.view = props.view;\n }\n}\n","export class Selection {\n selectedCell = null;\n selectedRange = null;\n}\n","import { CellStyles } from \"./cell\";\nexport class Styles {\n cells;\n constructor() {\n this.cells = new CellStyles();\n }\n}\n","export class Viewport {\n root;\n top;\n left;\n right;\n bottom;\n firstRow;\n lastRow;\n firstCol;\n lastCol;\n constructor(root, props) {\n this.root = root;\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastCol = this.getFirstRow(); //!Temp\n this.firstCol = this.getFirstRow(); //!Temp\n this.lastRow = this.getLastRow();\n this.updateValues({\n top: 0,\n left: 0,\n right: this.root.viewProps.width,\n bottom: this.root.viewProps.height\n });\n }\n updateValues(props) {\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastRow = this.getLastRow();\n this.firstCol = this.getFirstCol();\n this.lastCol = this.getLastCol();\n }\n /** Get index of first row in viewport */\n getFirstRow() {\n let rowIdx = this.root.cache.getRowByYCoord(this.top);\n return rowIdx;\n }\n getLastRow() {\n let rowIdx = this.root.cache.getRowByYCoord(this.bottom);\n return rowIdx;\n }\n getFirstCol() {\n let colIdx = this.root.cache.getColumnByXCoord(this.left);\n return colIdx;\n }\n getLastCol() {\n let colIdx = this.root.cache.getColumnByXCoord(this.right);\n return colIdx;\n }\n}\n","export class Column {\n width;\n title;\n constructor(props) {\n this.width = props.width;\n this.title = props.title;\n }\n}\n","export class Row {\n height;\n title;\n constructor(props) {\n this.height = props.height;\n this.title = props.title;\n }\n}\n","import { Cell } from \"../modules/cell\";\nimport { Column } from \"../modules/column\";\nimport { Config } from \"../modules/config\";\nimport { Row } from \"../modules/row\";\nexport function createSampleData(rows, columns, fillCellsByCoords = false) {\n const data = [];\n for (let row = 0; row <= rows; row++) {\n const innerRow = [];\n for (let col = 0; col <= columns; col++) {\n const value = fillCellsByCoords ? `${row}:${col}` : '';\n const cell = new Cell({\n displayValue: value,\n resultValue: value,\n value,\n position: {\n column: col,\n row: row\n },\n style: null\n });\n innerRow.push(cell);\n }\n data.push(innerRow);\n }\n return data;\n}\nexport function createSampleConfig(rows, columns) {\n const rowsArr = [];\n for (let i = 0; i <= rows; i++) {\n const rowItem = new Row({\n height: 40,\n title: String(i)\n });\n rowsArr.push(rowItem);\n }\n const colsArr = [];\n for (let i = 0; i <= columns; i++) {\n const colItem = new Column({\n title: String(i),\n width: 150\n });\n colsArr.push(colItem);\n }\n const config = new Config({\n columns: colsArr,\n rows: rowsArr,\n view: {\n height: 600,\n width: 800\n }\n });\n return config;\n}\nexport function makeSpreadsheetConfigAndData(rows, columns) {\n const data = createSampleData(rows, columns);\n const config = createSampleConfig(rows, columns);\n return { data, config };\n}\n","export class CachedColumn {\n xPos;\n colIdx;\n constructor(props) {\n this.xPos = props.xPos;\n this.colIdx = props.colIdx;\n }\n}\nexport class CachedRow {\n yPos;\n rowIdx;\n constructor(props) {\n this.yPos = props.yPos;\n this.rowIdx = props.rowIdx;\n }\n}\nexport class Cache {\n columns;\n rows;\n constructor(initial) {\n this.columns = initial.columns;\n this.rows = initial.rows;\n }\n getRowByYCoord(y) {\n let rowIdx = 0;\n for (let i = 0; i < this.rows.length; i++) {\n if (y <= this.rows[i].yPos) { //* Intersection detect\n rowIdx = i;\n break;\n }\n }\n return rowIdx;\n }\n getColumnByXCoord(x) {\n let colIdx = 0;\n for (let i = 0; i < this.columns.length; i++) {\n if (x <= this.columns[i].xPos) { //* Intersection detect\n colIdx = i;\n break;\n }\n }\n return colIdx;\n }\n}\n","import { Editor } from \"./components/editor\";\nimport { Header } from \"./components/header\";\nimport { Scroller } from \"./components/scroller\";\nimport { Sheet } from \"./components/sheet\";\nimport { Table } from \"./components/table\";\nimport { Toolbar } from \"./components/toolbar\";\nimport { Cell } from \"./modules/cell\";\nimport { Config } from \"./modules/config\";\nimport { Selection } from \"./modules/selection\";\nimport { Styles } from \"./modules/styles\";\nimport { Viewport } from \"./modules/viewport\";\nimport './scss/main.scss';\nimport { createSampleData } from \"./utils/createData\";\nimport { Cache, CachedColumn, CachedRow } from \"./modules/cache\";\nimport { Row } from \"./modules/row\";\nimport { Column } from \"./modules/column\";\nexport const CSS_PREFIX = \"modern_sc_\";\nexport default class Spreadsheet {\n table;\n scroller;\n toolbar;\n header;\n sheet;\n editor;\n styles;\n config;\n data;\n viewport;\n selection;\n cache;\n constructor(target, props) {\n const data = createSampleData(40, 40);\n const config = this.makeConfigFromData(data, props?.view ?? { height: 600, width: 800 });\n if (props?.view) {\n config.view = props.view;\n }\n this.config = new Config(config);\n this.sheet = new Sheet(this);\n this.table = new Table(this);\n this.scroller = new Scroller(this);\n this.toolbar = new Toolbar(this);\n this.header = new Header(this);\n this.editor = new Editor(this);\n this.cache = this.getInitialCache();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.selection = new Selection();\n this.data = data;\n this.styles = new Styles();\n this.buildComponent();\n this.appendTableToTarget(target);\n this.renderSheet();\n }\n getInitialCache() {\n const cachedCols = [];\n let currentWidth = 0;\n for (let i = 0; i <= this.config.columns.length - 1; i++) {\n const col = this.config.columns[i];\n currentWidth += col.width;\n const cacheCol = new CachedColumn({\n xPos: currentWidth,\n colIdx: i\n });\n cachedCols.push(cacheCol);\n }\n const cachedRows = [];\n let currentHeight = 0;\n for (let i = 0; i <= this.config.rows.length - 1; i++) {\n const row = this.config.rows[i];\n currentHeight += row.height;\n const cacheRow = new CachedRow({\n yPos: currentHeight,\n rowIdx: i\n });\n cachedRows.push(cacheRow);\n }\n const cache = new Cache({\n columns: cachedCols,\n rows: cachedRows\n });\n console.log(\"CACHE: \", cache);\n console.log(\"CONFIG: \", this.config);\n return cache;\n }\n buildComponent() {\n const content = document.createElement('div'); //* Abstract\n content.appendChild(this.header.element);\n content.appendChild(this.sheet.element);\n content.classList.add(CSS_PREFIX + 'content');\n this.table.element.appendChild(this.toolbar.element);\n this.table.element.appendChild(content);\n this.table.element.appendChild(this.scroller.element);\n this.table.element.append(this.editor.element);\n }\n /**Destroy spreadsheet DOM element.\n *\n * May be usefull when need to rerender component.\n */\n destroy() {\n this.table.element.remove();\n }\n appendTableToTarget(target) {\n if (typeof target === 'string') {\n const element = document.querySelector(target);\n if (!element)\n throw new Error(`Element with selector ${target} is not finded in DOM.\\n Make sure it exists.`);\n element?.appendChild(this.table.element);\n }\n if (target instanceof HTMLElement) {\n target.append(this.table.element);\n }\n }\n /** Canvas rendering context 2D.\n *\n * Abble to draw on canvas with default CanvasAPI methods\n */\n get ctx() {\n return this.sheet.ctx;\n }\n get viewProps() {\n return this.config.view;\n }\n /** Focusing on interactive part of spreadsheet */\n focusTable() {\n this.scroller.element.focus();\n }\n getCellByCoords(x, y) {\n return this.sheet.getCellByCoords(x, y);\n }\n getCell(position) {\n const { column, row } = position;\n return this.data[row][column];\n }\n changeCellValues(position, values) {\n const { column, row } = position;\n this.data[row][column].changeValues(values);\n this.renderCell(row, column);\n }\n changeCellStyles(position, styles) {\n const { column, row } = position;\n this.data[row][column].changeStyles(styles);\n this.renderCell(row, column);\n }\n applyActionToRange(range, callback) {\n const fromRow = Math.min(range.from.row, range.to.row);\n const toRow = Math.max(range.from.row, range.to.row);\n const fromCol = Math.min(range.from.column, range.to.column);\n const toCol = Math.max(range.from.column, range.to.column);\n for (let row = fromRow; row <= toRow; row++) {\n for (let col = fromCol; col <= toCol; col++) {\n const cell = this.data[row][col];\n callback(cell);\n }\n }\n }\n deleteSelectedCellsValues() {\n if (this.selection.selectedRange !== null) {\n this.applyActionToRange(this.selection.selectedRange, cell => {\n this.changeCellValues(cell.position, {\n displayValue: '',\n resultValue: '',\n value: ''\n });\n });\n }\n else {\n if (!this.selection.selectedCell)\n return;\n this.changeCellValues(this.selection.selectedCell, {\n displayValue: '',\n resultValue: '',\n value: ''\n });\n }\n }\n showEditor(position, initialString) {\n this.editor.show(position, initialString);\n }\n renderSheet() {\n this.sheet.renderSheet();\n }\n renderCell(row, col) {\n this.data[row][col].render(this);\n }\n loadData(data) {\n const rowsLength = data.length;\n const colsLength = data[0] ? this.data[0].length : 0;\n this.data = [];\n const formattedData = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n const cell = data[row][col];\n innerRow.push(new Cell({\n displayValue: cell.displayValue,\n position: cell.position,\n resultValue: cell.resultValue,\n value: cell.value,\n style: cell.style\n }));\n }\n formattedData.push(innerRow);\n }\n this.data = formattedData;\n this.selection.selectedCell = null;\n this.selection.selectedRange = null;\n this.config = this.makeConfigFromData(formattedData, this.config.view);\n this.cache = this.getInitialCache();\n this.scroller.updateScrollerSize();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.renderSheet();\n return this;\n }\n makeConfigFromData(data, view) {\n const lastRowIdx = data.length - 1;\n const lastColIdx = data[0] ? data[0].length : 0;\n const rows = [];\n for (let row = 0; row < lastRowIdx; row++) {\n rows.push(new Row({\n height: 40,\n title: String(row)\n }));\n }\n const columns = [];\n for (let col = 0; col < lastColIdx; col++) {\n columns.push(new Column({\n width: 150,\n title: String(col)\n }));\n }\n const config = new Config({\n view,\n rows,\n columns\n });\n return config;\n }\n serializeData() {\n const rowsLength = this.data.length;\n const colsLength = this.data[0] ? this.data[0].length : 0;\n const cellsArray = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n innerRow.push(this.data[row][col].getSerializableCell());\n }\n cellsArray.push(innerRow);\n }\n return cellsArray;\n }\n}\nexport * from './modules/cache';\nexport * from './modules/cell';\nexport * from './modules/column';\nexport * from './modules/config';\nexport * from './modules/renderBox';\nexport * from './modules/row';\nexport * from './modules/selection';\nexport * from './modules/styles';\nexport * from './modules/viewport';\nexport * from './utils/createData';\n"],"names":["RenderBox","config","cellPosition","__publicField","column","x","i","row","y","Editor","root","event","key","target","element","CSS_PREFIX","position","initialString","height","width","cell","Header","headerElement","Scroller","offsetX","offsetY","lastSelectedCell","keysRegex","isPressedLetterKey","clickedCell","rect","horizontalScroller","scroller","verticalScroller","scrollTop","scrollLeft","bottom","right","groupScrollers","stack","acc","curr","totalHeight","totalWidth","CellStyles","props","Position","SerializableCell","Cell","styles","values","selectedRange","isCellInRow","_a","ctx","isCellSelected","isCellInRange","Sheet","canvas","col","firstRowIdx","lastColIdx","lastRowIdx","firstColIdx","Table","container","sizes","Toolbar","toolbarElement","Config","Selection","Styles","Viewport","Column","Row","createSampleData","rows","columns","fillCellsByCoords","data","innerRow","value","createSampleConfig","rowsArr","rowItem","colsArr","colItem","makeSpreadsheetConfigAndData","CachedColumn","CachedRow","Cache","initial","rowIdx","colIdx","Spreadsheet","cachedCols","currentWidth","cacheCol","cachedRows","currentHeight","cacheRow","cache","content","range","callback","fromRow","toRow","fromCol","toCol","rowsLength","colsLength","formattedData","view","cellsArray"],"mappings":"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"} \ No newline at end of file diff --git a/dist/modules/cell.d.ts b/dist/modules/cell.d.ts index 94e64bc..53f227d 100644 --- a/dist/modules/cell.d.ts +++ b/dist/modules/cell.d.ts @@ -4,6 +4,7 @@ export type CellConstructorProps = { displayValue: string; resultValue: string; position: Position; + style: CellStyles | null; }; interface CellStylesConstructorProps { fontSize: number; @@ -32,18 +33,21 @@ export declare class SerializableCell { displayValue: string; resultValue: string; position: Position; - style: CellStyles; + style: CellStyles | null; constructor(props: SerializableCell | SerializableCell); } export declare class Cell { + /** True value (data) */ value: string; + /** Value to render */ displayValue: string; /** This refers to the values ​​​​that were obtained by calculations, for example, after calculating the formula */ resultValue: string; position: Position; - style: CellStyles; + style: CellStyles | null; constructor(props: CellConstructorProps); getSerializableCell(): SerializableCell; + changeStyles(styles: CellStyles): void; changeValues(values: Partial>): void; private isCellInRange; render(root: Spreadsheet): void; diff --git a/dist/modules/styles.d.ts b/dist/modules/styles.d.ts index 5fdd30e..297f7b6 100644 --- a/dist/modules/styles.d.ts +++ b/dist/modules/styles.d.ts @@ -1,2 +1,5 @@ +import { CellStyles } from "./cell"; export declare class Styles { + cells: CellStyles; + constructor(); } diff --git a/dist/style.css b/dist/style.css index 0ad91bb..e00e7ed 100644 --- a/dist/style.css +++ b/dist/style.css @@ -1 +1 @@ -body{padding:0;margin:0}.content{position:absolute;top:0;left:0}.spreadsheet_container{position:relative;isolation:isolate;border:2px solid black}.sheet{display:block;contain:strict}.scroller{overflow:scroll;box-sizing:border-box;transform:translateZ(0)}.scroller:focus{outline:none}.editor{position:absolute;box-sizing:border-box;font-size:16px;font-family:Arial,Helvetica,sans-serif}.hide{visibility:hidden} +body{padding:0;margin:0}.modern_sc_content{position:absolute;top:0;left:0}.modern_sc_spreadsheet_container{position:relative;isolation:isolate;border:2px solid black}.modern_sc_sheet{display:block;contain:strict}.modern_sc_scroller{overflow:scroll;box-sizing:border-box;transform:translateZ(0)}.modern_sc_scroller:focus{outline:none}.modern_sc_editor{position:absolute;box-sizing:border-box;font-size:16px;font-family:Arial,Helvetica,sans-serif}.modern_sc_hide{visibility:hidden} diff --git a/src/utils/createData.ts b/src/utils/createData.ts index 6430396..1c87ca6 100644 --- a/src/utils/createData.ts +++ b/src/utils/createData.ts @@ -18,7 +18,8 @@ export function createSampleData(rows: number, columns: number, fillCellsByCoord position: { column: col, row: row - } + }, + style: null }) innerRow.push(cell)