v20240711131537 0.27.2
authorKilian Saffran <ksaffran@dks.lu>
Thu, 11 Jul 2024 11:18:22 +0000 (13:18 +0200)
committerKilian Saffran <ksaffran@dks.lu>
Thu, 11 Jul 2024 11:18:22 +0000 (13:18 +0200)
public_html/lib/version.php
public_html/vendor/tabulator/js/tabulator.js
public_html/vendor/tabulator/js/tabulator_esm.js

index 458dab0..dc2038b 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-$cfg["version"]="0.25.3";
+$cfg["version"]="0.27.2";
 if ($cfg["debug"] == "1"){
   $cfg["version"] =date('YmdHis');
 }
index 0461f40..2f28a5f 100644 (file)
                }
        }
 
-       var defaultAccessors = {
-               rownum:function(value, data, type, params, column, row){
-                       return row.getPosition();
-               }
+       var defaultAccessors = {\r
+               rownum:function(value, data, type, params, column, row){\r
+                       return row.getPosition();\r
+               }\r
        };
 
        class Accessor extends Module{
                },
        };
 
-       var bindings$2 = {
-               copyToClipboard:["ctrl + 67", "meta + 67"],
+       var bindings$2 = {\r
+               copyToClipboard:["ctrl + 67", "meta + 67"],\r
        };
 
-       var actions$2 = {
-               copyToClipboard:function(e){
-                       if(!this.table.modules.edit.currentCell){
-                               if(this.table.modExists("clipboard", true)){
-                                       this.table.modules.clipboard.copy(false, true);
-                               }
-                       }
-               },
+       var actions$2 = {\r
+               copyToClipboard:function(e){\r
+                       if(!this.table.modules.edit.currentCell){\r
+                               if(this.table.modExists("clipboard", true)){\r
+                                       this.table.modules.clipboard.copy(false, true);\r
+                               }\r
+                       }\r
+               },\r
        };
 
-       var extensions$4 = {
-               keybindings:{
-                       bindings:bindings$2,
-                       actions:actions$2
-               },
+       var extensions$4 = {\r
+               keybindings:{\r
+                       bindings:bindings$2,\r
+                       actions:actions$2\r
+               },\r
        };
 
        class Clipboard extends Module{
                }
        }
 
-       var columnLookups$1 = {
-
+       var columnLookups$1 = {\r
+\r
        };
 
-       var rowLookups$1 = {
-               visible:function(){
-                       return this.rowManager.getVisibleRows(false, true);
-               },
-               all:function(){
-                       return this.rowManager.rows;
-               },
-               selected:function(){
-                       return this.modules.selectRow.selectedRows;
-               },
-               active:function(){
-                       if(this.options.pagination){
-                               return this.rowManager.getDisplayRows(this.rowManager.displayRows.length - 2);
-                       }else {
-                               return this.rowManager.getDisplayRows();
-                       }
-               },
+       var rowLookups$1 = {\r
+               visible:function(){\r
+                       return this.rowManager.getVisibleRows(false, true);\r
+               },\r
+               all:function(){\r
+                       return this.rowManager.rows;\r
+               },\r
+               selected:function(){\r
+                       return this.modules.selectRow.selectedRows;\r
+               },\r
+               active:function(){\r
+                       if(this.options.pagination){\r
+                               return this.rowManager.getDisplayRows(this.rowManager.displayRows.length - 2);\r
+                       }else {\r
+                               return this.rowManager.getDisplayRows();\r
+                       }\r
+               },\r
        };
 
        class Export extends Module{
                },
        };
 
-       var bindings$1 = {
-               undo:["ctrl + 90", "meta + 90"],
-               redo:["ctrl + 89", "meta + 89"],
+       var bindings$1 = {\r
+               undo:["ctrl + 90", "meta + 90"],\r
+               redo:["ctrl + 89", "meta + 89"],\r
        };
 
-       var actions$1 = {
-               undo:function(e){
-                       var cell = false;
-                       if(this.table.options.history && this.table.modExists("history") && this.table.modExists("edit")){
-
-                               cell = this.table.modules.edit.currentCell;
-
-                               if(!cell){
-                                       e.preventDefault();
-                                       this.table.modules.history.undo();
-                               }
-                       }
-               },
-
-               redo:function(e){
-                       var cell = false;
-                       if(this.table.options.history && this.table.modExists("history") && this.table.modExists("edit")){
-
-                               cell = this.table.modules.edit.currentCell;
-
-                               if(!cell){
-                                       e.preventDefault();
-                                       this.table.modules.history.redo();
-                               }
-                       }
-               },
+       var actions$1 = {\r
+               undo:function(e){\r
+                       var cell = false;\r
+                       if(this.table.options.history && this.table.modExists("history") && this.table.modExists("edit")){\r
+\r
+                               cell = this.table.modules.edit.currentCell;\r
+\r
+                               if(!cell){\r
+                                       e.preventDefault();\r
+                                       this.table.modules.history.undo();\r
+                               }\r
+                       }\r
+               },\r
+\r
+               redo:function(e){\r
+                       var cell = false;\r
+                       if(this.table.options.history && this.table.modExists("history") && this.table.modExists("edit")){\r
+\r
+                               cell = this.table.modules.edit.currentCell;\r
+\r
+                               if(!cell){\r
+                                       e.preventDefault();\r
+                                       this.table.modules.history.redo();\r
+                               }\r
+                       }\r
+               },\r
        };
 
-       var extensions$3 = {
-               keybindings:{
-                       bindings:bindings$1,
-                       actions:actions$1
-               },
+       var extensions$3 = {\r
+               keybindings:{\r
+                       bindings:bindings$1,\r
+                       actions:actions$1\r
+               },\r
        };
 
        class History extends Module{
                }
        }
 
-       var defaultSenders = {
-               delete:function(fromRow, toRow, toTable){
-                       fromRow.delete();
-               }
+       var defaultSenders = {\r
+               delete:function(fromRow, toRow, toTable){\r
+                       fromRow.delete();\r
+               }\r
        };
 
-       var defaultReceivers = {
-               insert:function(fromRow, toRow, fromTable){
-                       this.table.addRow(fromRow.getData(), undefined, toRow);
-                       return true;
-               },
-
-               add:function(fromRow, toRow, fromTable){
-                       this.table.addRow(fromRow.getData());
-                       return true;
-               },
-
-               update:function(fromRow, toRow, fromTable){
-                       if(toRow){
-                               toRow.update(fromRow.getData());
-                               return true;
-                       }
-
-                       return false;
-               },
-
-               replace:function(fromRow, toRow, fromTable){
-                       if(toRow){
-                               this.table.addRow(fromRow.getData(), undefined, toRow);
-                               toRow.delete();
-                               return true;
-                       }
-
-                       return false;
-               },
+       var defaultReceivers = {\r
+               insert:function(fromRow, toRow, fromTable){\r
+                       this.table.addRow(fromRow.getData(), undefined, toRow);\r
+                       return true;\r
+               },\r
+\r
+               add:function(fromRow, toRow, fromTable){\r
+                       this.table.addRow(fromRow.getData());\r
+                       return true;\r
+               },\r
+\r
+               update:function(fromRow, toRow, fromTable){\r
+                       if(toRow){\r
+                               toRow.update(fromRow.getData());\r
+                               return true;\r
+                       }\r
+\r
+                       return false;\r
+               },\r
+\r
+               replace:function(fromRow, toRow, fromTable){\r
+                       if(toRow){\r
+                               this.table.addRow(fromRow.getData(), undefined, toRow);\r
+                               toRow.delete();\r
+                               return true;\r
+                       }\r
+\r
+                       return false;\r
+               },\r
        };
 
        class MoveRows extends Module{
                return el;
        }
 
-       var extensions$2 = {
-               format:{
-                       formatters:{
-                               responsiveCollapse:responsiveCollapse,
-                       }
-               }
+       var extensions$2 = {\r
+               format:{\r
+                       formatters:{\r
+                               responsiveCollapse:responsiveCollapse,\r
+                       }\r
+               }\r
        };
 
        class ResponsiveLayout extends Module{
                return checkbox;
        }
 
-       var extensions$1 = {
-               format:{
-                       formatters:{
-                               rowSelection:rowSelection,
-                       }
-               }
+       var extensions$1 = {\r
+               format:{\r
+                       formatters:{\r
+                               rowSelection:rowSelection,\r
+                       }\r
+               }\r
        };
 
        class SelectRow extends Module{
                }
        }
 
-       var bindings = {
-               rangeJumpUp:["ctrl + 38", "meta + 38"],
-               rangeJumpDown:["ctrl + 40", "meta + 40"],
-               rangeJumpLeft:["ctrl + 37", "meta + 37"],
-               rangeJumpRight:["ctrl + 39", "meta + 39"],
-               rangeExpandUp:"shift + 38",
-               rangeExpandDown:"shift + 40",
-               rangeExpandLeft:"shift + 37",
-               rangeExpandRight:"shift + 39",
-               rangeExpandJumpUp:["ctrl + shift + 38", "meta + shift + 38"],
-               rangeExpandJumpDown:["ctrl + shift + 40", "meta + shift + 40"],
-               rangeExpandJumpLeft:["ctrl + shift + 37", "meta + shift + 37"],
-               rangeExpandJumpRight:["ctrl + shift + 39", "meta + shift + 39"],
+       var bindings = {\r
+               rangeJumpUp:["ctrl + 38", "meta + 38"],\r
+               rangeJumpDown:["ctrl + 40", "meta + 40"],\r
+               rangeJumpLeft:["ctrl + 37", "meta + 37"],\r
+               rangeJumpRight:["ctrl + 39", "meta + 39"],\r
+               rangeExpandUp:"shift + 38",\r
+               rangeExpandDown:"shift + 40",\r
+               rangeExpandLeft:"shift + 37",\r
+               rangeExpandRight:"shift + 39",\r
+               rangeExpandJumpUp:["ctrl + shift + 38", "meta + shift + 38"],\r
+               rangeExpandJumpDown:["ctrl + shift + 40", "meta + shift + 40"],\r
+               rangeExpandJumpLeft:["ctrl + shift + 37", "meta + shift + 37"],\r
+               rangeExpandJumpRight:["ctrl + shift + 39", "meta + shift + 39"],\r
        };
 
-       var actions = {
-               rangeJumpLeft: function(e){
-                       this.dispatch("keybinding-nav-range", e, "left", true, false);
-               },
-               rangeJumpRight: function(e){
-                       this.dispatch("keybinding-nav-range", e, "right", true, false);
-               },
-               rangeJumpUp: function(e){
-                       this.dispatch("keybinding-nav-range", e, "up", true, false);
-               },
-               rangeJumpDown: function(e){
-                       this.dispatch("keybinding-nav-range", e, "down", true, false);
-               },
-               rangeExpandLeft: function(e){
-                       this.dispatch("keybinding-nav-range", e, "left", false, true);
-               },
-               rangeExpandRight: function(e){
-                       this.dispatch("keybinding-nav-range", e, "right", false, true);
-               },
-               rangeExpandUp: function(e){
-                       this.dispatch("keybinding-nav-range", e, "up", false, true);
-               },
-               rangeExpandDown: function(e){
-                       this.dispatch("keybinding-nav-range", e, "down", false, true);
-               },
-               rangeExpandJumpLeft: function(e){
-                       this.dispatch("keybinding-nav-range", e, "left", true, true);
-               },
-               rangeExpandJumpRight: function(e){
-                       this.dispatch("keybinding-nav-range", e, "right", true, true);
-               },
-               rangeExpandJumpUp: function(e){
-                       this.dispatch("keybinding-nav-range", e, "up", true, true);
-               },
-               rangeExpandJumpDown: function(e){
-                       this.dispatch("keybinding-nav-range", e, "down", true, true);
-               },
+       var actions = {\r
+               rangeJumpLeft: function(e){\r
+                       this.dispatch("keybinding-nav-range", e, "left", true, false);\r
+               },\r
+               rangeJumpRight: function(e){\r
+                       this.dispatch("keybinding-nav-range", e, "right", true, false);\r
+               },\r
+               rangeJumpUp: function(e){\r
+                       this.dispatch("keybinding-nav-range", e, "up", true, false);\r
+               },\r
+               rangeJumpDown: function(e){\r
+                       this.dispatch("keybinding-nav-range", e, "down", true, false);\r
+               },\r
+               rangeExpandLeft: function(e){\r
+                       this.dispatch("keybinding-nav-range", e, "left", false, true);\r
+               },\r
+               rangeExpandRight: function(e){\r
+                       this.dispatch("keybinding-nav-range", e, "right", false, true);\r
+               },\r
+               rangeExpandUp: function(e){\r
+                       this.dispatch("keybinding-nav-range", e, "up", false, true);\r
+               },\r
+               rangeExpandDown: function(e){\r
+                       this.dispatch("keybinding-nav-range", e, "down", false, true);\r
+               },\r
+               rangeExpandJumpLeft: function(e){\r
+                       this.dispatch("keybinding-nav-range", e, "left", true, true);\r
+               },\r
+               rangeExpandJumpRight: function(e){\r
+                       this.dispatch("keybinding-nav-range", e, "right", true, true);\r
+               },\r
+               rangeExpandJumpUp: function(e){\r
+                       this.dispatch("keybinding-nav-range", e, "up", true, true);\r
+               },\r
+               rangeExpandJumpDown: function(e){\r
+                       this.dispatch("keybinding-nav-range", e, "down", true, true);\r
+               },\r
        };
 
-       var pasteActions = {
-               range:function(data){
-                       var rows = [],
-                       range = this.table.modules.selectRange.activeRange,
-                       singleCell = false,
-                       bounds, startCell, startRow, rowWidth, dataLength;
-
-                       dataLength = data.length;
-                       
-                       if(range){
-                               bounds = range.getBounds();
-                               startCell = bounds.start;
-                               
-                               if(bounds.start === bounds.end){
-                                       singleCell = true;
-                               }
-                               
-                               if(startCell){
-                                       rows = this.table.rowManager.activeRows.slice();
-                                       startRow = rows.indexOf(startCell.row);
-
-                                       if(singleCell){
-                                               rowWidth = data.length;
-                                       }else {
-                                               rowWidth = (rows.indexOf(bounds.end.row) - startRow) + 1;
-                                       }
-                                       
-                                       
-                                       if(startRow >-1){
-                                               this.table.blockRedraw();
-                                               
-                                               rows = rows.slice(startRow, startRow + rowWidth);
-                                               
-                                               rows.forEach((row, i) => {
-                                                       row.updateData(data[i % dataLength]);
-                                               });
-                                               
-                                               this.table.restoreRedraw();
-                                       }
-                               }
-                       }
-                       
-                       return rows;
-               }
+       var pasteActions = {\r
+               range:function(data){\r
+                       var rows = [],\r
+                       range = this.table.modules.selectRange.activeRange,\r
+                       singleCell = false,\r
+                       bounds, startCell, startRow, rowWidth, dataLength;\r
+\r
+                       dataLength = data.length;\r
+                       \r
+                       if(range){\r
+                               bounds = range.getBounds();\r
+                               startCell = bounds.start;\r
+                               \r
+                               if(bounds.start === bounds.end){\r
+                                       singleCell = true;\r
+                               }\r
+                               \r
+                               if(startCell){\r
+                                       rows = this.table.rowManager.activeRows.slice();\r
+                                       startRow = rows.indexOf(startCell.row);\r
+\r
+                                       if(singleCell){\r
+                                               rowWidth = data.length;\r
+                                       }else {\r
+                                               rowWidth = (rows.indexOf(bounds.end.row) - startRow) + 1;\r
+                                       }\r
+                                       \r
+                                       \r
+                                       if(startRow >-1){\r
+                                               this.table.blockRedraw();\r
+                                               \r
+                                               rows = rows.slice(startRow, startRow + rowWidth);\r
+                                               \r
+                                               rows.forEach((row, i) => {\r
+                                                       row.updateData(data[i % dataLength]);\r
+                                               });\r
+                                               \r
+                                               this.table.restoreRedraw();\r
+                                       }\r
+                               }\r
+                       }\r
+                       \r
+                       return rows;\r
+               }\r
        };
 
-       var pasteParsers = {
-               range:function(clipboard){
-                       var data = [],
-                       rows = [],
-                       range = this.table.modules.selectRange.activeRange,
-                       singleCell = false,
-                       bounds, startCell, colWidth, columnMap, startCol;
-                       
-                       if(range){
-                               bounds = range.getBounds();
-                               startCell = bounds.start;
-
-                               if(bounds.start === bounds.end){
-                                       singleCell = true;
-                               }
-                               
-                               if(startCell){
-                                       //get data from clipboard into array of columns and rows.
-                                       clipboard = clipboard.split("\n");
-                                       
-                                       clipboard.forEach(function(row){
-                                               data.push(row.split("\t"));
-                                       });
-                                       
-                                       if(data.length){
-                                               columnMap = this.table.columnManager.getVisibleColumnsByIndex();
-                                               startCol = columnMap.indexOf(startCell.column);
-
-                                               if(startCol > -1){
-                                                       if(singleCell){
-                                                               colWidth = data[0].length;
-                                                       }else {
-                                                               colWidth = (columnMap.indexOf(bounds.end.column) - startCol) + 1;
-                                                       }
-
-                                                       columnMap = columnMap.slice(startCol, startCol + colWidth);
-
-                                                       data.forEach((item) => {
-                                                               var row = {};
-                                                               var itemLength = item.length;
-
-                                                               columnMap.forEach(function(col, i){
-                                                                       row[col.field] = item[i % itemLength];
-                                                               });
-                                                               
-                                                               rows.push(row); 
-                                                       });
-
-                                                       return rows;
-                                               }                               
-                                       }
-                               }
-                       }
-                       
-                       return false;
-               }
+       var pasteParsers = {\r
+               range:function(clipboard){\r
+                       var data = [],\r
+                       rows = [],\r
+                       range = this.table.modules.selectRange.activeRange,\r
+                       singleCell = false,\r
+                       bounds, startCell, colWidth, columnMap, startCol;\r
+                       \r
+                       if(range){\r
+                               bounds = range.getBounds();\r
+                               startCell = bounds.start;\r
+\r
+                               if(bounds.start === bounds.end){\r
+                                       singleCell = true;\r
+                               }\r
+                               \r
+                               if(startCell){\r
+                                       //get data from clipboard into array of columns and rows.\r
+                                       clipboard = clipboard.split("\n");\r
+                                       \r
+                                       clipboard.forEach(function(row){\r
+                                               data.push(row.split("\t"));\r
+                                       });\r
+                                       \r
+                                       if(data.length){\r
+                                               columnMap = this.table.columnManager.getVisibleColumnsByIndex();\r
+                                               startCol = columnMap.indexOf(startCell.column);\r
+\r
+                                               if(startCol > -1){\r
+                                                       if(singleCell){\r
+                                                               colWidth = data[0].length;\r
+                                                       }else {\r
+                                                               colWidth = (columnMap.indexOf(bounds.end.column) - startCol) + 1;\r
+                                                       }\r
+\r
+                                                       columnMap = columnMap.slice(startCol, startCol + colWidth);\r
+\r
+                                                       data.forEach((item) => {\r
+                                                               var row = {};\r
+                                                               var itemLength = item.length;\r
+\r
+                                                               columnMap.forEach(function(col, i){\r
+                                                                       row[col.field] = item[i % itemLength];\r
+                                                               });\r
+                                                               \r
+                                                               rows.push(row); \r
+                                                       });\r
+\r
+                                                       return rows;\r
+                                               }                               \r
+                                       }\r
+                               }\r
+                       }\r
+                       \r
+                       return false;\r
+               }\r
        };
 
-       var columnLookups = {
-               range:function(){
-                       var columns = this.modules.selectRange.selectedColumns();
-
-                       if(this.columnManager.rowHeader){
-                               columns.unshift(this.columnManager.rowHeader);
-                       }
-
-                       return columns;
-               },
+       var columnLookups = {\r
+               range:function(){\r
+                       var columns = this.modules.selectRange.selectedColumns();\r
+\r
+                       if(this.columnManager.rowHeader){\r
+                               columns.unshift(this.columnManager.rowHeader);\r
+                       }\r
+\r
+                       return columns;\r
+               },\r
        };
 
-       var rowLookups = {
-               range:function(){
-                       return this.modules.selectRange.selectedRows();
-               },
+       var rowLookups = {\r
+               range:function(){\r
+                       return this.modules.selectRange.selectedRows();\r
+               },\r
        };
 
-       var extensions = {
-               keybindings:{
-                       bindings:bindings,
-                       actions:actions
-               },
-               clipboard:{
-                       pasteActions:pasteActions,
-                       pasteParsers:pasteParsers
-               },
-               export:{
-                       columnLookups:columnLookups,
-                       rowLookups:rowLookups,
-               }
+       var extensions = {\r
+               keybindings:{\r
+                       bindings:bindings,\r
+                       actions:actions\r
+               },\r
+               clipboard:{\r
+                       pasteActions:pasteActions,\r
+                       pasteParsers:pasteParsers\r
+               },\r
+               export:{\r
+                       columnLookups:columnLookups,\r
+                       rowLookups:rowLookups,\r
+               }\r
        };
 
        class SelectRange extends Module {
                }
        }
 
-       class GridCalculator{
-               constructor(columns, rows){
-                       this.columnCount = columns;
-                       this.rowCount = rows;
-
-                       this.columnString = [];
-                       this.columns = [];
-                       this.rows = [];
-               }
-
-               genColumns(data){
-                       var colCount = Math.max(this.columnCount, Math.max(...data.map(item => item.length)));
-
-                       this.columnString = [];
-                       this.columns = [];
-
-                       for(let i = 1; i <= colCount; i++){
-                               this.incrementChar(this.columnString.length - 1);
-                               this.columns.push(this.columnString.join(""));
-                       }
-
-                       return this.columns;
-               }
-
-               genRows(data){
-                       var rowCount = Math.max(this.rowCount, data.length);
-
-                       this.rows = [];
-
-                       for(let i = 1; i <= rowCount; i++){
-                               this.rows.push(i);
-                       }
-                       
-                       return this.rows;
-               }
-
-               incrementChar(i){
-                       let char = this.columnString[i];
-
-                       if(char){
-                               if(char !== "Z"){
-                                       this.columnString[i] = String.fromCharCode(this.columnString[i].charCodeAt(0) + 1);
-                               }else {
-                                       this.columnString[i] = "A";
-                                       
-                                       if(i){
-                                               this.incrementChar(i-1);
-                                       }else {
-                                               this.columnString.push("A");
-                                       }
-                               }
-                       }else {
-                               this.columnString.push("A");
-                       }
-               }
-
-               setRowCount(count){
-                       this.rowCount = count;
-               }
-
-               setColumnCount(count){
-                       this.columnCount = count;
-               }
+       class GridCalculator{\r
+               constructor(columns, rows){\r
+                       this.columnCount = columns;\r
+                       this.rowCount = rows;\r
+\r
+                       this.columnString = [];\r
+                       this.columns = [];\r
+                       this.rows = [];\r
+               }\r
+\r
+               genColumns(data){\r
+                       var colCount = Math.max(this.columnCount, Math.max(...data.map(item => item.length)));\r
+\r
+                       this.columnString = [];\r
+                       this.columns = [];\r
+\r
+                       for(let i = 1; i <= colCount; i++){\r
+                               this.incrementChar(this.columnString.length - 1);\r
+                               this.columns.push(this.columnString.join(""));\r
+                       }\r
+\r
+                       return this.columns;\r
+               }\r
+\r
+               genRows(data){\r
+                       var rowCount = Math.max(this.rowCount, data.length);\r
+\r
+                       this.rows = [];\r
+\r
+                       for(let i = 1; i <= rowCount; i++){\r
+                               this.rows.push(i);\r
+                       }\r
+                       \r
+                       return this.rows;\r
+               }\r
+\r
+               incrementChar(i){\r
+                       let char = this.columnString[i];\r
+\r
+                       if(char){\r
+                               if(char !== "Z"){\r
+                                       this.columnString[i] = String.fromCharCode(this.columnString[i].charCodeAt(0) + 1);\r
+                               }else {\r
+                                       this.columnString[i] = "A";\r
+                                       \r
+                                       if(i){\r
+                                               this.incrementChar(i-1);\r
+                                       }else {\r
+                                               this.columnString.push("A");\r
+                                       }\r
+                               }\r
+                       }else {\r
+                               this.columnString.push("A");\r
+                       }\r
+               }\r
+\r
+               setRowCount(count){\r
+                       this.rowCount = count;\r
+               }\r
+\r
+               setColumnCount(count){\r
+                       this.columnCount = count;\r
+               }\r
        }
 
-       class SheetComponent {
-               constructor(sheet) {
-                       this._sheet = sheet;
-
-                       return new Proxy(this, {
-                               get: function (target, name, receiver) {
-                                       if (typeof target[name] !== "undefined") {
-                                               return target[name];
-                                       } else {
-                                               return target._sheet.table.componentFunctionBinder.handle("sheet", target._sheet, name);
-                                       }
-                               },
-                       });
-               }
-
-               getTitle(){
-                       return this._sheet.title;
-               }
-
-               getKey(){
-                       return this._sheet.key;
-               }
-
-               getDefinition(){
-                       return this._sheet.getDefinition();
-               }
-
-               getData() {
-                       return this._sheet.getData();
-               }
-
-               setData(data) {
-                       return this._sheet.setData(data);
-               }
-
-               clear(){
-                       return this._sheet.clear();
-               }
-
-               remove(){
-                       return this._sheet.remove();
-               }
-               
-               active(){
-                       return this._sheet.active();
-               }
-
-               setTitle(title){
-                       return this._sheet.setTitle(title);
-               }
-
-               setRows(rows){
-                       return this._sheet.setRows(rows);
-               }
-
-               setColumns(columns){
-                       return this._sheet.setColumns(columns);
-               }
+       class SheetComponent {\r
+               constructor(sheet) {\r
+                       this._sheet = sheet;\r
+\r
+                       return new Proxy(this, {\r
+                               get: function (target, name, receiver) {\r
+                                       if (typeof target[name] !== "undefined") {\r
+                                               return target[name];\r
+                                       } else {\r
+                                               return target._sheet.table.componentFunctionBinder.handle("sheet", target._sheet, name);\r
+                                       }\r
+                               },\r
+                       });\r
+               }\r
+\r
+               getTitle(){\r
+                       return this._sheet.title;\r
+               }\r
+\r
+               getKey(){\r
+                       return this._sheet.key;\r
+               }\r
+\r
+               getDefinition(){\r
+                       return this._sheet.getDefinition();\r
+               }\r
+\r
+               getData() {\r
+                       return this._sheet.getData();\r
+               }\r
+\r
+               setData(data) {\r
+                       return this._sheet.setData(data);\r
+               }\r
+\r
+               clear(){\r
+                       return this._sheet.clear();\r
+               }\r
+\r
+               remove(){\r
+                       return this._sheet.remove();\r
+               }\r
+               \r
+               active(){\r
+                       return this._sheet.active();\r
+               }\r
+\r
+               setTitle(title){\r
+                       return this._sheet.setTitle(title);\r
+               }\r
+\r
+               setRows(rows){\r
+                       return this._sheet.setRows(rows);\r
+               }\r
+\r
+               setColumns(columns){\r
+                       return this._sheet.setColumns(columns);\r
+               }\r
        }
 
-       class Sheet extends CoreFeature{
-               constructor(spreadsheetManager, definition) {
-                       super(spreadsheetManager.table);
-                       
-                       this.spreadsheetManager = spreadsheetManager;
-                       this.definition = definition;
-                       
-                       this.title = this.definition.title || "";
-                       this.key = this.definition.key || this.definition.title;
-                       this.rowCount = this.definition.rows;
-                       this.columnCount = this.definition.columns;
-                       this.data = this.definition.data || [];
-                       this.element = null;
-                       this.isActive = false;
-                       
-                       this.grid = new GridCalculator(this.columnCount, this.rowCount);
-                       
-                       this.defaultColumnDefinition = {width:100, headerHozAlign:"center", headerSort:false};
-                       this.columnDefinition = Object.assign(this.defaultColumnDefinition, this.options("spreadsheetColumnDefinition"));
-                       
-                       this.columnDefs = [];
-                       this.rowDefs = [];
-                       this.columnFields = [];
-                       this.columns = [];
-                       this.rows = [];
-                       
-                       this.scrollTop = null;
-                       this.scrollLeft = null;
-                       
-                       this.initialize();
-                       
-                       this.dispatchExternal("sheetAdded", this.getComponent());
-               }
-               
-               ///////////////////////////////////
-               ///////// Initialization //////////
-               ///////////////////////////////////
-               
-               initialize(){
-                       this.initializeElement();
-                       this.initializeColumns();
-                       this.initializeRows();
-               }
-               
-               reinitialize(){
-                       this.initializeColumns();
-                       this.initializeRows();
-               }
-               
-               initializeElement(){
-                       this.element = document.createElement("div");
-                       this.element.classList.add("tabulator-spreadsheet-tab");
-                       this.element.innerText = this.title;
-                       
-                       this.element.addEventListener("click", () => {
-                               this.spreadsheetManager.loadSheet(this);
-                       });
-               }
-               
-               initializeColumns(){
-                       this.grid.setColumnCount(this.columnCount);
-                       this.columnFields = this.grid.genColumns(this.data);
-                       
-                       this.columnDefs = [];
-                       
-                       this.columnFields.forEach((ref) => {
-                               var def = Object.assign({}, this.columnDefinition);
-                               def.field = ref;
-                               def.title = ref;
-                               
-                               this.columnDefs.push(def);
-                       });
-               }
-               
-               initializeRows(){
-                       var refs;
-                       
-                       this.grid.setRowCount(this.rowCount);
-                       
-                       refs = this.grid.genRows(this.data);
-                       
-                       this.rowDefs = [];
-                       
-                       refs.forEach((ref, i) => {
-                               var def = {"_id":ref};
-                               var data = this.data[i];
-                               
-                               if(data){
-                                       data.forEach((val, j) => {
-                                               var field = this.columnFields[j];
-                                               
-                                               if(field){
-                                                       def[field] = val;
-                                               }
-                                       });
-                               }
-                               
-                               this.rowDefs.push(def);
-                       });
-               }
-               
-               unload(){
-                       this.isActive = false;
-                       this.scrollTop = this.table.rowManager.scrollTop;
-                       this.scrollLeft = this.table.rowManager.scrollLeft;
-                       this.data = this.getData(true);
-                       this.element.classList.remove("tabulator-spreadsheet-tab-active");
-               }
-               
-               load(){
-                       
-                       var wasInactive = !this.isActive;
-                       
-                       this.isActive = true;
-                       this.table.blockRedraw();
-                       this.table.setData([]);
-                       this.table.setColumns(this.columnDefs);
-                       this.table.setData(this.rowDefs);
-                       this.table.restoreRedraw();
-                       
-                       if(wasInactive && this.scrollTop !== null){
-                               this.table.rowManager.element.scrollLeft = this.scrollLeft;
-                               this.table.rowManager.element.scrollTop = this.scrollTop;
-                       }
-                       
-                       this.element.classList.add("tabulator-spreadsheet-tab-active");
-                       
-                       this.dispatchExternal("sheetLoaded", this.getComponent());
-               }
-               
-               ///////////////////////////////////
-               //////// Helper Functions /////////
-               ///////////////////////////////////
-               
-               getComponent(){
-                       return new SheetComponent(this);
-               }
-               
-               getDefinition(){
-                       return {
-                               title:this.title,
-                               key:this.key,
-                               rows:this.rowCount,
-                               columns:this.columnCount,
-                               data:this.getData(),
-                       };
-               }
-               
-               getData(full){
-                       var output = [], 
-                       rowWidths,
-                       outputWidth, outputHeight;
-                       
-                       //map data to array format
-                       this.rowDefs.forEach((rowData) => {
-                               var row = [];
-                               
-                               this.columnFields.forEach((field) => {
-                                       row.push(rowData[field]);
-                               });
-                               
-                               output.push(row);
-                       });
-                       
-                       //trim output
-                       if(!full && !this.options("spreadsheetOutputFull")){
-                               
-                               //calculate used area of data
-                               rowWidths = output.map(row => row.findLastIndex(val => typeof val !== 'undefined') + 1);
-                               outputWidth = Math.max(...rowWidths);
-                               outputHeight = rowWidths.findLastIndex(width => width > 0) + 1;
-                               
-                               output = output.slice(0, outputHeight);
-                               output = output.map(row => row.slice(0, outputWidth));
-                       }
-                       
-                       return output;
-               }
-               
-               setData(data){
-                       this.data = data;
-                       this.reinitialize();
-                       
-                       this.dispatchExternal("sheetUpdated", this.getComponent());
-                       
-                       if(this.isActive){
-                               this.load();
-                       }
-               }
-               
-               clear(){
-                       this.setData([]);
-               }
-               
-               setTitle(title){
-                       this.title = title;
-                       this.element.innerText = title;
-                       
-                       this.dispatchExternal("sheetUpdated", this.getComponent());
-               }
-               
-               setRows(rows){
-                       this.rowCount = rows;
-                       this.initializeRows();
-                       
-                       this.dispatchExternal("sheetUpdated", this.getComponent());
-                       
-                       if(this.isActive){
-                               this.load();
-                       }
-               }
-               
-               setColumns(columns){
-                       this.columnCount = columns;
-                       this.reinitialize();
-                       
-                       this.dispatchExternal("sheetUpdated", this.getComponent());
-                       
-                       if(this.isActive){
-                               this.load();
-                       }
-               }
-               
-               remove(){
-                       this.spreadsheetManager.removeSheet(this);
-               }
-               
-               destroy(){
-                       if(this.element.parentNode){
-                               this.element.parentNode.removeChild(this.element);
-                       }
-                       
-                       this.dispatchExternal("sheetRemoved", this.getComponent());
-               }
-               
-               active(){
-                       this.spreadsheetManager.loadSheet(this);
-               }
+       class Sheet extends CoreFeature{\r
+               constructor(spreadsheetManager, definition) {\r
+                       super(spreadsheetManager.table);\r
+                       \r
+                       this.spreadsheetManager = spreadsheetManager;\r
+                       this.definition = definition;\r
+                       \r
+                       this.title = this.definition.title || "";\r
+                       this.key = this.definition.key || this.definition.title;\r
+                       this.rowCount = this.definition.rows;\r
+                       this.columnCount = this.definition.columns;\r
+                       this.data = this.definition.data || [];\r
+                       this.element = null;\r
+                       this.isActive = false;\r
+                       \r
+                       this.grid = new GridCalculator(this.columnCount, this.rowCount);\r
+                       \r
+                       this.defaultColumnDefinition = {width:100, headerHozAlign:"center", headerSort:false};\r
+                       this.columnDefinition = Object.assign(this.defaultColumnDefinition, this.options("spreadsheetColumnDefinition"));\r
+                       \r
+                       this.columnDefs = [];\r
+                       this.rowDefs = [];\r
+                       this.columnFields = [];\r
+                       this.columns = [];\r
+                       this.rows = [];\r
+                       \r
+                       this.scrollTop = null;\r
+                       this.scrollLeft = null;\r
+                       \r
+                       this.initialize();\r
+                       \r
+                       this.dispatchExternal("sheetAdded", this.getComponent());\r
+               }\r
+               \r
+               ///////////////////////////////////\r
+               ///////// Initialization //////////\r
+               ///////////////////////////////////\r
+               \r
+               initialize(){\r
+                       this.initializeElement();\r
+                       this.initializeColumns();\r
+                       this.initializeRows();\r
+               }\r
+               \r
+               reinitialize(){\r
+                       this.initializeColumns();\r
+                       this.initializeRows();\r
+               }\r
+               \r
+               initializeElement(){\r
+                       this.element = document.createElement("div");\r
+                       this.element.classList.add("tabulator-spreadsheet-tab");\r
+                       this.element.innerText = this.title;\r
+                       \r
+                       this.element.addEventListener("click", () => {\r
+                               this.spreadsheetManager.loadSheet(this);\r
+                       });\r
+               }\r
+               \r
+               initializeColumns(){\r
+                       this.grid.setColumnCount(this.columnCount);\r
+                       this.columnFields = this.grid.genColumns(this.data);\r
+                       \r
+                       this.columnDefs = [];\r
+                       \r
+                       this.columnFields.forEach((ref) => {\r
+                               var def = Object.assign({}, this.columnDefinition);\r
+                               def.field = ref;\r
+                               def.title = ref;\r
+                               \r
+                               this.columnDefs.push(def);\r
+                       });\r
+               }\r
+               \r
+               initializeRows(){\r
+                       var refs;\r
+                       \r
+                       this.grid.setRowCount(this.rowCount);\r
+                       \r
+                       refs = this.grid.genRows(this.data);\r
+                       \r
+                       this.rowDefs = [];\r
+                       \r
+                       refs.forEach((ref, i) => {\r
+                               var def = {"_id":ref};\r
+                               var data = this.data[i];\r
+                               \r
+                               if(data){\r
+                                       data.forEach((val, j) => {\r
+                                               var field = this.columnFields[j];\r
+                                               \r
+                                               if(field){\r
+                                                       def[field] = val;\r
+                                               }\r
+                                       });\r
+                               }\r
+                               \r
+                               this.rowDefs.push(def);\r
+                       });\r
+               }\r
+               \r
+               unload(){\r
+                       this.isActive = false;\r
+                       this.scrollTop = this.table.rowManager.scrollTop;\r
+                       this.scrollLeft = this.table.rowManager.scrollLeft;\r
+                       this.data = this.getData(true);\r
+                       this.element.classList.remove("tabulator-spreadsheet-tab-active");\r
+               }\r
+               \r
+               load(){\r
+                       \r
+                       var wasInactive = !this.isActive;\r
+                       \r
+                       this.isActive = true;\r
+                       this.table.blockRedraw();\r
+                       this.table.setData([]);\r
+                       this.table.setColumns(this.columnDefs);\r
+                       this.table.setData(this.rowDefs);\r
+                       this.table.restoreRedraw();\r
+                       \r
+                       if(wasInactive && this.scrollTop !== null){\r
+                               this.table.rowManager.element.scrollLeft = this.scrollLeft;\r
+                               this.table.rowManager.element.scrollTop = this.scrollTop;\r
+                       }\r
+                       \r
+                       this.element.classList.add("tabulator-spreadsheet-tab-active");\r
+                       \r
+                       this.dispatchExternal("sheetLoaded", this.getComponent());\r
+               }\r
+               \r
+               ///////////////////////////////////\r
+               //////// Helper Functions /////////\r
+               ///////////////////////////////////\r
+               \r
+               getComponent(){\r
+                       return new SheetComponent(this);\r
+               }\r
+               \r
+               getDefinition(){\r
+                       return {\r
+                               title:this.title,\r
+                               key:this.key,\r
+                               rows:this.rowCount,\r
+                               columns:this.columnCount,\r
+                               data:this.getData(),\r
+                       };\r
+               }\r
+               \r
+               getData(full){\r
+                       var output = [], \r
+                       rowWidths,\r
+                       outputWidth, outputHeight;\r
+                       \r
+                       //map data to array format\r
+                       this.rowDefs.forEach((rowData) => {\r
+                               var row = [];\r
+                               \r
+                               this.columnFields.forEach((field) => {\r
+                                       row.push(rowData[field]);\r
+                               });\r
+                               \r
+                               output.push(row);\r
+                       });\r
+                       \r
+                       //trim output\r
+                       if(!full && !this.options("spreadsheetOutputFull")){\r
+                               \r
+                               //calculate used area of data\r
+                               rowWidths = output.map(row => row.findLastIndex(val => typeof val !== 'undefined') + 1);\r
+                               outputWidth = Math.max(...rowWidths);\r
+                               outputHeight = rowWidths.findLastIndex(width => width > 0) + 1;\r
+                               \r
+                               output = output.slice(0, outputHeight);\r
+                               output = output.map(row => row.slice(0, outputWidth));\r
+                       }\r
+                       \r
+                       return output;\r
+               }\r
+               \r
+               setData(data){\r
+                       this.data = data;\r
+                       this.reinitialize();\r
+                       \r
+                       this.dispatchExternal("sheetUpdated", this.getComponent());\r
+                       \r
+                       if(this.isActive){\r
+                               this.load();\r
+                       }\r
+               }\r
+               \r
+               clear(){\r
+                       this.setData([]);\r
+               }\r
+               \r
+               setTitle(title){\r
+                       this.title = title;\r
+                       this.element.innerText = title;\r
+                       \r
+                       this.dispatchExternal("sheetUpdated", this.getComponent());\r
+               }\r
+               \r
+               setRows(rows){\r
+                       this.rowCount = rows;\r
+                       this.initializeRows();\r
+                       \r
+                       this.dispatchExternal("sheetUpdated", this.getComponent());\r
+                       \r
+                       if(this.isActive){\r
+                               this.load();\r
+                       }\r
+               }\r
+               \r
+               setColumns(columns){\r
+                       this.columnCount = columns;\r
+                       this.reinitialize();\r
+                       \r
+                       this.dispatchExternal("sheetUpdated", this.getComponent());\r
+                       \r
+                       if(this.isActive){\r
+                               this.load();\r
+                       }\r
+               }\r
+               \r
+               remove(){\r
+                       this.spreadsheetManager.removeSheet(this);\r
+               }\r
+               \r
+               destroy(){\r
+                       if(this.element.parentNode){\r
+                               this.element.parentNode.removeChild(this.element);\r
+                       }\r
+                       \r
+                       this.dispatchExternal("sheetRemoved", this.getComponent());\r
+               }\r
+               \r
+               active(){\r
+                       this.spreadsheetManager.loadSheet(this);\r
+               }\r
        }
 
-       class Spreadsheet extends Module{
-               
-               static moduleName = "spreadsheet";
-               
-               constructor(table){
-                       super(table);
-                       
-                       this.sheets = [];
-                       this.element = null;
-                       
-                       this.registerTableOption("spreadsheet", false); 
-                       this.registerTableOption("spreadsheetRows", 50); 
-                       this.registerTableOption("spreadsheetColumns", 50); 
-                       this.registerTableOption("spreadsheetColumnDefinition", {}); 
-                       this.registerTableOption("spreadsheetOutputFull", false); 
-                       this.registerTableOption("spreadsheetData", false); 
-                       this.registerTableOption("spreadsheetSheets", false); 
-                       this.registerTableOption("spreadsheetSheetTabs", false); 
-                       this.registerTableOption("spreadsheetSheetTabsElement", false); 
-                       
-                       this.registerTableFunction("setSheets", this.setSheets.bind(this));
-                       this.registerTableFunction("addSheet", this.addSheet.bind(this));
-                       this.registerTableFunction("getSheets", this.getSheets.bind(this));
-                       this.registerTableFunction("getSheetDefinitions", this.getSheetDefinitions.bind(this));
-                       this.registerTableFunction("setSheetData", this.setSheetData.bind(this));
-                       this.registerTableFunction("getSheet", this.getSheet.bind(this));
-                       this.registerTableFunction("getSheetData", this.getSheetData.bind(this));
-                       this.registerTableFunction("clearSheet", this.clearSheet.bind(this));
-                       this.registerTableFunction("removeSheet", this.removeSheetFunc.bind(this));
-                       this.registerTableFunction("activeSheet", this.activeSheetFunc.bind(this));
-               }
-               
-               ///////////////////////////////////
-               ////// Module Initialization //////
-               ///////////////////////////////////
-               
-               
-               initialize(){
-                       if(this.options("spreadsheet")){        
-                               this.subscribe("table-initialized", this.tableInitialized.bind(this));
-                               this.subscribe("data-loaded", this.loadRemoteData.bind(this));
-                               
-                               this.table.options.index = "_id";
-                               
-                               if(this.options("spreadsheetData") && this.options("spreadsheetSheets")){
-                                       console.warn("You cannot use spreadsheetData and spreadsheetSheets at the same time, ignoring spreadsheetData");
-                                       
-                                       this.table.options.spreadsheetData = false;
-                               }
-                               
-                               this.compatibilityCheck();
-                               
-                               if(this.options("spreadsheetSheetTabs")){
-                                       this.initializeTabset();
-                               }
-                       }
-               }
-               
-               compatibilityCheck(){
-                       if(this.options("data")){
-                               console.warn("Do not use the data option when working with spreadsheets, use either spreadsheetData or spreadsheetSheets to pass data into the table");
-                       }
-                       
-                       if(this.options("pagination")){
-                               console.warn("The spreadsheet module is not compatible with the pagination module");
-                       }
-                       
-                       if(this.options("groupBy")){
-                               console.warn("The spreadsheet module is not compatible with the row grouping module");
-                       }
-                       
-                       if(this.options("responsiveCollapse")){
-                               console.warn("The spreadsheet module is not compatible with the responsive collapse module");
-                       }
-               }
-               initializeTabset(){
-                       this.element = document.createElement("div");
-                       this.element.classList.add("tabulator-spreadsheet-tabs");
-                       var altContainer = this.options("spreadsheetSheetTabsElement");
-                       
-                       if(altContainer && !(altContainer instanceof HTMLElement)){
-                               altContainer = document.querySelector(altContainer);
-                               
-                               if(!altContainer){
-                                       console.warn("Unable to find element matching spreadsheetSheetTabsElement selector:", this.options("spreadsheetSheetTabsElement"));
-                               }
-                       }
-                       
-                       if(altContainer){
-                               altContainer.appendChild(this.element);
-                       }else {
-                               this.footerAppend(this.element);
-                       }
-               }
-               
-               tableInitialized(){
-                       if(this.sheets.length){
-                               this.loadSheet(this.sheets[0]);
-                       }else {
-                               
-                               if(this.options("spreadsheetSheets")){
-                                       this.loadSheets(this.options("spreadsheetSheets"));
-                               }else if(this.options("spreadsheetData")){
-                                       this.loadData(this.options("spreadsheetData"));
-                               }
-                       }
-               }
-
-               ///////////////////////////////////
-               /////////// Ajax Parsing //////////
-               ///////////////////////////////////
-
-               loadRemoteData(data, data1, data2){
-                       console.log("data", data, data1, data2);
-
-                       if(Array.isArray(data)){
-
-                               this.table.dataLoader.clearAlert();
-                               this.dispatchExternal("dataLoaded", data);
-
-                               if(!data.length || Array.isArray(data[0])){
-                                       this.loadData(data);
-                               }else {
-                                       this.loadSheets(data);
-                               }
-                       }else {
-                               console.error("Spreadsheet Loading Error - Unable to process remote data due to invalid data type \nExpecting: array \nReceived: ", typeof data, "\nData:     ", data);
-                       }
-
-                       return false;
-               }
-
-               ///////////////////////////////////
-               ///////// Sheet Management ////////
-               ///////////////////////////////////
-               
-               
-               loadData(data){
-                       var def = {
-                               data:data,
-                       };
-                       
-                       this.loadSheet(this.newSheet(def));
-               }
-               
-               destroySheets(){
-                       this.sheets.forEach((sheet) => {
-                               sheet.destroy();
-                       });
-                       
-                       this.sheets = [];
-                       this.activeSheet = null;
-               }
-               
-               loadSheets(sheets){     
-                       if(!Array.isArray(sheets)){
-                               sheets = [];
-                       }
-                       
-                       this.destroySheets();
-                       
-                       sheets.forEach((def) => {
-                               this.newSheet(def);
-                       });
-                       
-                       this.loadSheet(this.sheets[0]);
-               }
-               
-               loadSheet(sheet){
-                       if(this.activeSheet !== sheet){
-                               if(this.activeSheet){
-                                       this.activeSheet.unload();
-                               }
-                               
-                               this.activeSheet = sheet;
-                               
-                               sheet.load();
-                       }
-               }
-               
-               newSheet(definition = {}){
-                       var sheet;
-                       
-                       if(!definition.rows){
-                               definition.rows = this.options("spreadsheetRows");
-                       }
-                       
-                       if(!definition.columns){
-                               definition.columns = this.options("spreadsheetColumns");
-                       }
-                       
-                       sheet = new Sheet(this, definition);
-                       
-                       this.sheets.push(sheet);
-                       
-                       if(this.element){
-                               this.element.appendChild(sheet.element);
-                       }
-                       
-                       return sheet;
-               }
-               
-               removeSheet(sheet){
-                       var index = this.sheets.indexOf(sheet),
-                       prevSheet;
-                       
-                       if(this.sheets.length > 1){
-                               if(index > -1){
-                                       this.sheets.splice(index, 1);
-                                       sheet.destroy();
-                                       
-                                       if(this.activeSheet === sheet){
-                                               
-                                               prevSheet = this.sheets[index - 1] || this.sheets[0];
-                                               
-                                               if(prevSheet){
-                                                       this.loadSheet(prevSheet);
-                                               }else {
-                                                       this.activeSheet = null;
-                                               }
-                                       }
-                               }
-                       }else {
-                               console.warn("Unable to remove sheet, at least one sheet must be active");
-                       }
-               }
-               
-               lookupSheet(key){
-                       if(!key){
-                               return this.activeSheet;
-                       }else if(key instanceof Sheet){
-                               return key;
-                       }else if(key instanceof SheetComponent){
-                               return key._sheet;
-                       }else {
-                               return this.sheets.find(sheet => sheet.key === key) || false;
-                       }
-               }
-               
-               
-               ///////////////////////////////////
-               //////// Public Functions /////////
-               ///////////////////////////////////
-               
-               setSheets(sheets){
-                       this.loadSheets(sheets);
-
-                       return this.getSheets();
-               }
-
-               addSheet(sheet){
-                       return this.newSheet(sheet).getComponent();
-               }
-               
-               getSheetDefinitions(){
-                       return this.sheets.map(sheet => sheet.getDefinition());
-               }
-               
-               getSheets(){
-                       return this.sheets.map(sheet => sheet.getComponent());
-               }
-               
-               getSheet(key){
-                       var sheet = this.lookupSheet(key);
-                       
-                       return sheet ? sheet.getComponent() : false;
-               }
-               
-               setSheetData(key, data){
-                       if (key && !data){
-                               data = key;
-                               key = false;
-                       }
-                       
-                       var sheet = this.lookupSheet(key);
-                       
-                       return sheet ? sheet.setData(data) : false;     
-               }
-               
-               getSheetData(key){
-                       var sheet = this.lookupSheet(key);
-                       
-                       return sheet ? sheet.getData() : false; 
-               }
-               
-               clearSheet(key){
-                       var sheet = this.lookupSheet(key);
-                       
-                       return sheet ? sheet.clear() : false;
-               }
-               
-               removeSheetFunc(key){
-                       var sheet = this.lookupSheet(key);
-                       
-                       if(sheet){
-                               this.removeSheet(sheet);
-                       }
-               }
-               
-               activeSheetFunc(key){
-                       var sheet = this.lookupSheet(key);
-                       
-                       return sheet ? this.loadSheet(sheet) : false;
-               }
+       class Spreadsheet extends Module{\r
+               \r
+               static moduleName = "spreadsheet";\r
+               \r
+               constructor(table){\r
+                       super(table);\r
+                       \r
+                       this.sheets = [];\r
+                       this.element = null;\r
+                       \r
+                       this.registerTableOption("spreadsheet", false); \r
+                       this.registerTableOption("spreadsheetRows", 50); \r
+                       this.registerTableOption("spreadsheetColumns", 50); \r
+                       this.registerTableOption("spreadsheetColumnDefinition", {}); \r
+                       this.registerTableOption("spreadsheetOutputFull", false); \r
+                       this.registerTableOption("spreadsheetData", false); \r
+                       this.registerTableOption("spreadsheetSheets", false); \r
+                       this.registerTableOption("spreadsheetSheetTabs", false); \r
+                       this.registerTableOption("spreadsheetSheetTabsElement", false); \r
+                       \r
+                       this.registerTableFunction("setSheets", this.setSheets.bind(this));\r
+                       this.registerTableFunction("addSheet", this.addSheet.bind(this));\r
+                       this.registerTableFunction("getSheets", this.getSheets.bind(this));\r
+                       this.registerTableFunction("getSheetDefinitions", this.getSheetDefinitions.bind(this));\r
+                       this.registerTableFunction("setSheetData", this.setSheetData.bind(this));\r
+                       this.registerTableFunction("getSheet", this.getSheet.bind(this));\r
+                       this.registerTableFunction("getSheetData", this.getSheetData.bind(this));\r
+                       this.registerTableFunction("clearSheet", this.clearSheet.bind(this));\r
+                       this.registerTableFunction("removeSheet", this.removeSheetFunc.bind(this));\r
+                       this.registerTableFunction("activeSheet", this.activeSheetFunc.bind(this));\r
+               }\r
+               \r
+               ///////////////////////////////////\r
+               ////// Module Initialization //////\r
+               ///////////////////////////////////\r
+               \r
+               \r
+               initialize(){\r
+                       if(this.options("spreadsheet")){        \r
+                               this.subscribe("table-initialized", this.tableInitialized.bind(this));\r
+                               this.subscribe("data-loaded", this.loadRemoteData.bind(this));\r
+                               \r
+                               this.table.options.index = "_id";\r
+                               \r
+                               if(this.options("spreadsheetData") && this.options("spreadsheetSheets")){\r
+                                       console.warn("You cannot use spreadsheetData and spreadsheetSheets at the same time, ignoring spreadsheetData");\r
+                                       \r
+                                       this.table.options.spreadsheetData = false;\r
+                               }\r
+                               \r
+                               this.compatibilityCheck();\r
+                               \r
+                               if(this.options("spreadsheetSheetTabs")){\r
+                                       this.initializeTabset();\r
+                               }\r
+                       }\r
+               }\r
+               \r
+               compatibilityCheck(){\r
+                       if(this.options("data")){\r
+                               console.warn("Do not use the data option when working with spreadsheets, use either spreadsheetData or spreadsheetSheets to pass data into the table");\r
+                       }\r
+                       \r
+                       if(this.options("pagination")){\r
+                               console.warn("The spreadsheet module is not compatible with the pagination module");\r
+                       }\r
+                       \r
+                       if(this.options("groupBy")){\r
+                               console.warn("The spreadsheet module is not compatible with the row grouping module");\r
+                       }\r
+                       \r
+                       if(this.options("responsiveCollapse")){\r
+                               console.warn("The spreadsheet module is not compatible with the responsive collapse module");\r
+                       }\r
+               }\r
+               initializeTabset(){\r
+                       this.element = document.createElement("div");\r
+                       this.element.classList.add("tabulator-spreadsheet-tabs");\r
+                       var altContainer = this.options("spreadsheetSheetTabsElement");\r
+                       \r
+                       if(altContainer && !(altContainer instanceof HTMLElement)){\r
+                               altContainer = document.querySelector(altContainer);\r
+                               \r
+                               if(!altContainer){\r
+                                       console.warn("Unable to find element matching spreadsheetSheetTabsElement selector:", this.options("spreadsheetSheetTabsElement"));\r
+                               }\r
+                       }\r
+                       \r
+                       if(altContainer){\r
+                               altContainer.appendChild(this.element);\r
+                       }else {\r
+                               this.footerAppend(this.element);\r
+                       }\r
+               }\r
+               \r
+               tableInitialized(){\r
+                       if(this.sheets.length){\r
+                               this.loadSheet(this.sheets[0]);\r
+                       }else {\r
+                               \r
+                               if(this.options("spreadsheetSheets")){\r
+                                       this.loadSheets(this.options("spreadsheetSheets"));\r
+                               }else if(this.options("spreadsheetData")){\r
+                                       this.loadData(this.options("spreadsheetData"));\r
+                               }\r
+                       }\r
+               }\r
+\r
+               ///////////////////////////////////\r
+               /////////// Ajax Parsing //////////\r
+               ///////////////////////////////////\r
+\r
+               loadRemoteData(data, data1, data2){\r
+                       console.log("data", data, data1, data2);\r
+\r
+                       if(Array.isArray(data)){\r
+\r
+                               this.table.dataLoader.clearAlert();\r
+                               this.dispatchExternal("dataLoaded", data);\r
+\r
+                               if(!data.length || Array.isArray(data[0])){\r
+                                       this.loadData(data);\r
+                               }else {\r
+                                       this.loadSheets(data);\r
+                               }\r
+                       }else {\r
+                               console.error("Spreadsheet Loading Error - Unable to process remote data due to invalid data type \nExpecting: array \nReceived: ", typeof data, "\nData:     ", data);\r
+                       }\r
+\r
+                       return false;\r
+               }\r
+\r
+               ///////////////////////////////////\r
+               ///////// Sheet Management ////////\r
+               ///////////////////////////////////\r
+               \r
+               \r
+               loadData(data){\r
+                       var def = {\r
+                               data:data,\r
+                       };\r
+                       \r
+                       this.loadSheet(this.newSheet(def));\r
+               }\r
+               \r
+               destroySheets(){\r
+                       this.sheets.forEach((sheet) => {\r
+                               sheet.destroy();\r
+                       });\r
+                       \r
+                       this.sheets = [];\r
+                       this.activeSheet = null;\r
+               }\r
+               \r
+               loadSheets(sheets){     \r
+                       if(!Array.isArray(sheets)){\r
+                               sheets = [];\r
+                       }\r
+                       \r
+                       this.destroySheets();\r
+                       \r
+                       sheets.forEach((def) => {\r
+                               this.newSheet(def);\r
+                       });\r
+                       \r
+                       this.loadSheet(this.sheets[0]);\r
+               }\r
+               \r
+               loadSheet(sheet){\r
+                       if(this.activeSheet !== sheet){\r
+                               if(this.activeSheet){\r
+                                       this.activeSheet.unload();\r
+                               }\r
+                               \r
+                               this.activeSheet = sheet;\r
+                               \r
+                               sheet.load();\r
+                       }\r
+               }\r
+               \r
+               newSheet(definition = {}){\r
+                       var sheet;\r
+                       \r
+                       if(!definition.rows){\r
+                               definition.rows = this.options("spreadsheetRows");\r
+                       }\r
+                       \r
+                       if(!definition.columns){\r
+                               definition.columns = this.options("spreadsheetColumns");\r
+                       }\r
+                       \r
+                       sheet = new Sheet(this, definition);\r
+                       \r
+                       this.sheets.push(sheet);\r
+                       \r
+                       if(this.element){\r
+                               this.element.appendChild(sheet.element);\r
+                       }\r
+                       \r
+                       return sheet;\r
+               }\r
+               \r
+               removeSheet(sheet){\r
+                       var index = this.sheets.indexOf(sheet),\r
+                       prevSheet;\r
+                       \r
+                       if(this.sheets.length > 1){\r
+                               if(index > -1){\r
+                                       this.sheets.splice(index, 1);\r
+                                       sheet.destroy();\r
+                                       \r
+                                       if(this.activeSheet === sheet){\r
+                                               \r
+                                               prevSheet = this.sheets[index - 1] || this.sheets[0];\r
+                                               \r
+                                               if(prevSheet){\r
+                                                       this.loadSheet(prevSheet);\r
+                                               }else {\r
+                                                       this.activeSheet = null;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }else {\r
+                               console.warn("Unable to remove sheet, at least one sheet must be active");\r
+                       }\r
+               }\r
+               \r
+               lookupSheet(key){\r
+                       if(!key){\r
+                               return this.activeSheet;\r
+                       }else if(key instanceof Sheet){\r
+                               return key;\r
+                       }else if(key instanceof SheetComponent){\r
+                               return key._sheet;\r
+                       }else {\r
+                               return this.sheets.find(sheet => sheet.key === key) || false;\r
+                       }\r
+               }\r
+               \r
+               \r
+               ///////////////////////////////////\r
+               //////// Public Functions /////////\r
+               ///////////////////////////////////\r
+               \r
+               setSheets(sheets){\r
+                       this.loadSheets(sheets);\r
+\r
+                       return this.getSheets();\r
+               }\r
+\r
+               addSheet(sheet){\r
+                       return this.newSheet(sheet).getComponent();\r
+               }\r
+               \r
+               getSheetDefinitions(){\r
+                       return this.sheets.map(sheet => sheet.getDefinition());\r
+               }\r
+               \r
+               getSheets(){\r
+                       return this.sheets.map(sheet => sheet.getComponent());\r
+               }\r
+               \r
+               getSheet(key){\r
+                       var sheet = this.lookupSheet(key);\r
+                       \r
+                       return sheet ? sheet.getComponent() : false;\r
+               }\r
+               \r
+               setSheetData(key, data){\r
+                       if (key && !data){\r
+                               data = key;\r
+                               key = false;\r
+                       }\r
+                       \r
+                       var sheet = this.lookupSheet(key);\r
+                       \r
+                       return sheet ? sheet.setData(data) : false;     \r
+               }\r
+               \r
+               getSheetData(key){\r
+                       var sheet = this.lookupSheet(key);\r
+                       \r
+                       return sheet ? sheet.getData() : false; \r
+               }\r
+               \r
+               clearSheet(key){\r
+                       var sheet = this.lookupSheet(key);\r
+                       \r
+                       return sheet ? sheet.clear() : false;\r
+               }\r
+               \r
+               removeSheetFunc(key){\r
+                       var sheet = this.lookupSheet(key);\r
+                       \r
+                       if(sheet){\r
+                               this.removeSheet(sheet);\r
+                       }\r
+               }\r
+               \r
+               activeSheetFunc(key){\r
+                       var sheet = this.lookupSheet(key);\r
+                       \r
+                       return sheet ? this.loadSheet(sheet) : false;\r
+               }\r
        }
 
        class Tooltip extends Module{
index 2fe8771..6d9dbb6 100644 (file)
@@ -647,10 +647,10 @@ class Module extends CoreFeature{
        
 }
 
-var defaultAccessors = {
-       rownum:function(value, data, type, params, column, row){
-               return row.getPosition();
-       }
+var defaultAccessors = {\r
+       rownum:function(value, data, type, params, column, row){\r
+               return row.getPosition();\r
+       }\r
 };
 
 class Accessor extends Module{
@@ -1171,25 +1171,25 @@ var defaultPasteParsers = {
        },
 };
 
-var bindings$2 = {
-       copyToClipboard:["ctrl + 67", "meta + 67"],
+var bindings$2 = {\r
+       copyToClipboard:["ctrl + 67", "meta + 67"],\r
 };
 
-var actions$2 = {
-       copyToClipboard:function(e){
-               if(!this.table.modules.edit.currentCell){
-                       if(this.table.modExists("clipboard", true)){
-                               this.table.modules.clipboard.copy(false, true);
-                       }
-               }
-       },
+var actions$2 = {\r
+       copyToClipboard:function(e){\r
+               if(!this.table.modules.edit.currentCell){\r
+                       if(this.table.modExists("clipboard", true)){\r
+                               this.table.modules.clipboard.copy(false, true);\r
+                       }\r
+               }\r
+       },\r
 };
 
-var extensions$4 = {
-       keybindings:{
-               bindings:bindings$2,
-               actions:actions$2
-       },
+var extensions$4 = {\r
+       keybindings:{\r
+               bindings:bindings$2,\r
+               actions:actions$2\r
+       },\r
 };
 
 class Clipboard extends Module{
@@ -8490,27 +8490,27 @@ class ExportColumn{
        }
 }
 
-var columnLookups$1 = {
-
+var columnLookups$1 = {\r
+\r
 };
 
-var rowLookups$1 = {
-       visible:function(){
-               return this.rowManager.getVisibleRows(false, true);
-       },
-       all:function(){
-               return this.rowManager.rows;
-       },
-       selected:function(){
-               return this.modules.selectRow.selectedRows;
-       },
-       active:function(){
-               if(this.options.pagination){
-                       return this.rowManager.getDisplayRows(this.rowManager.displayRows.length - 2);
-               }else {
-                       return this.rowManager.getDisplayRows();
-               }
-       },
+var rowLookups$1 = {\r
+       visible:function(){\r
+               return this.rowManager.getVisibleRows(false, true);\r
+       },\r
+       all:function(){\r
+               return this.rowManager.rows;\r
+       },\r
+       selected:function(){\r
+               return this.modules.selectRow.selectedRows;\r
+       },\r
+       active:function(){\r
+               if(this.options.pagination){\r
+                       return this.rowManager.getDisplayRows(this.rowManager.displayRows.length - 2);\r
+               }else {\r
+                       return this.rowManager.getDisplayRows();\r
+               }\r
+       },\r
 };
 
 class Export extends Module{
@@ -12799,44 +12799,44 @@ var defaultRedoers = {
        },
 };
 
-var bindings$1 = {
-       undo:["ctrl + 90", "meta + 90"],
-       redo:["ctrl + 89", "meta + 89"],
+var bindings$1 = {\r
+       undo:["ctrl + 90", "meta + 90"],\r
+       redo:["ctrl + 89", "meta + 89"],\r
 };
 
-var actions$1 = {
-       undo:function(e){
-               var cell = false;
-               if(this.table.options.history && this.table.modExists("history") && this.table.modExists("edit")){
-
-                       cell = this.table.modules.edit.currentCell;
-
-                       if(!cell){
-                               e.preventDefault();
-                               this.table.modules.history.undo();
-                       }
-               }
-       },
-
-       redo:function(e){
-               var cell = false;
-               if(this.table.options.history && this.table.modExists("history") && this.table.modExists("edit")){
-
-                       cell = this.table.modules.edit.currentCell;
-
-                       if(!cell){
-                               e.preventDefault();
-                               this.table.modules.history.redo();
-                       }
-               }
-       },
+var actions$1 = {\r
+       undo:function(e){\r
+               var cell = false;\r
+               if(this.table.options.history && this.table.modExists("history") && this.table.modExists("edit")){\r
+\r
+                       cell = this.table.modules.edit.currentCell;\r
+\r
+                       if(!cell){\r
+                               e.preventDefault();\r
+                               this.table.modules.history.undo();\r
+                       }\r
+               }\r
+       },\r
+\r
+       redo:function(e){\r
+               var cell = false;\r
+               if(this.table.options.history && this.table.modExists("history") && this.table.modExists("edit")){\r
+\r
+                       cell = this.table.modules.edit.currentCell;\r
+\r
+                       if(!cell){\r
+                               e.preventDefault();\r
+                               this.table.modules.history.redo();\r
+                       }\r
+               }\r
+       },\r
 };
 
-var extensions$3 = {
-       keybindings:{
-               bindings:bindings$1,
-               actions:actions$1
-       },
+var extensions$3 = {\r
+       keybindings:{\r
+               bindings:bindings$1,\r
+               actions:actions$1\r
+       },\r
 };
 
 class History extends Module{
@@ -14656,41 +14656,41 @@ class MoveColumns extends Module{
        }
 }
 
-var defaultSenders = {
-       delete:function(fromRow, toRow, toTable){
-               fromRow.delete();
-       }
+var defaultSenders = {\r
+       delete:function(fromRow, toRow, toTable){\r
+               fromRow.delete();\r
+       }\r
 };
 
-var defaultReceivers = {
-       insert:function(fromRow, toRow, fromTable){
-               this.table.addRow(fromRow.getData(), undefined, toRow);
-               return true;
-       },
-
-       add:function(fromRow, toRow, fromTable){
-               this.table.addRow(fromRow.getData());
-               return true;
-       },
-
-       update:function(fromRow, toRow, fromTable){
-               if(toRow){
-                       toRow.update(fromRow.getData());
-                       return true;
-               }
-
-               return false;
-       },
-
-       replace:function(fromRow, toRow, fromTable){
-               if(toRow){
-                       this.table.addRow(fromRow.getData(), undefined, toRow);
-                       toRow.delete();
-                       return true;
-               }
-
-               return false;
-       },
+var defaultReceivers = {\r
+       insert:function(fromRow, toRow, fromTable){\r
+               this.table.addRow(fromRow.getData(), undefined, toRow);\r
+               return true;\r
+       },\r
+\r
+       add:function(fromRow, toRow, fromTable){\r
+               this.table.addRow(fromRow.getData());\r
+               return true;\r
+       },\r
+\r
+       update:function(fromRow, toRow, fromTable){\r
+               if(toRow){\r
+                       toRow.update(fromRow.getData());\r
+                       return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       replace:function(fromRow, toRow, fromTable){\r
+               if(toRow){\r
+                       this.table.addRow(fromRow.getData(), undefined, toRow);\r
+                       toRow.delete();\r
+                       return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
 };
 
 class MoveRows extends Module{
@@ -18375,12 +18375,12 @@ function responsiveCollapse(cell, formatterParams, onRendered){
        return el;
 }
 
-var extensions$2 = {
-       format:{
-               formatters:{
-                       responsiveCollapse:responsiveCollapse,
-               }
-       }
+var extensions$2 = {\r
+       format:{\r
+               formatters:{\r
+                       responsiveCollapse:responsiveCollapse,\r
+               }\r
+       }\r
 };
 
 class ResponsiveLayout extends Module{
@@ -18794,12 +18794,12 @@ function rowSelection(cell, formatterParams, onRendered){
        return checkbox;
 }
 
-var extensions$1 = {
-       format:{
-               formatters:{
-                       rowSelection:rowSelection,
-               }
-       }
+var extensions$1 = {\r
+       format:{\r
+               formatters:{\r
+                       rowSelection:rowSelection,\r
+               }\r
+       }\r
 };
 
 class SelectRow extends Module{
@@ -19751,195 +19751,195 @@ class Range extends CoreFeature{
        }
 }
 
-var bindings = {
-       rangeJumpUp:["ctrl + 38", "meta + 38"],
-       rangeJumpDown:["ctrl + 40", "meta + 40"],
-       rangeJumpLeft:["ctrl + 37", "meta + 37"],
-       rangeJumpRight:["ctrl + 39", "meta + 39"],
-       rangeExpandUp:"shift + 38",
-       rangeExpandDown:"shift + 40",
-       rangeExpandLeft:"shift + 37",
-       rangeExpandRight:"shift + 39",
-       rangeExpandJumpUp:["ctrl + shift + 38", "meta + shift + 38"],
-       rangeExpandJumpDown:["ctrl + shift + 40", "meta + shift + 40"],
-       rangeExpandJumpLeft:["ctrl + shift + 37", "meta + shift + 37"],
-       rangeExpandJumpRight:["ctrl + shift + 39", "meta + shift + 39"],
+var bindings = {\r
+       rangeJumpUp:["ctrl + 38", "meta + 38"],\r
+       rangeJumpDown:["ctrl + 40", "meta + 40"],\r
+       rangeJumpLeft:["ctrl + 37", "meta + 37"],\r
+       rangeJumpRight:["ctrl + 39", "meta + 39"],\r
+       rangeExpandUp:"shift + 38",\r
+       rangeExpandDown:"shift + 40",\r
+       rangeExpandLeft:"shift + 37",\r
+       rangeExpandRight:"shift + 39",\r
+       rangeExpandJumpUp:["ctrl + shift + 38", "meta + shift + 38"],\r
+       rangeExpandJumpDown:["ctrl + shift + 40", "meta + shift + 40"],\r
+       rangeExpandJumpLeft:["ctrl + shift + 37", "meta + shift + 37"],\r
+       rangeExpandJumpRight:["ctrl + shift + 39", "meta + shift + 39"],\r
 };
 
-var actions = {
-       rangeJumpLeft: function(e){
-               this.dispatch("keybinding-nav-range", e, "left", true, false);
-       },
-       rangeJumpRight: function(e){
-               this.dispatch("keybinding-nav-range", e, "right", true, false);
-       },
-       rangeJumpUp: function(e){
-               this.dispatch("keybinding-nav-range", e, "up", true, false);
-       },
-       rangeJumpDown: function(e){
-               this.dispatch("keybinding-nav-range", e, "down", true, false);
-       },
-       rangeExpandLeft: function(e){
-               this.dispatch("keybinding-nav-range", e, "left", false, true);
-       },
-       rangeExpandRight: function(e){
-               this.dispatch("keybinding-nav-range", e, "right", false, true);
-       },
-       rangeExpandUp: function(e){
-               this.dispatch("keybinding-nav-range", e, "up", false, true);
-       },
-       rangeExpandDown: function(e){
-               this.dispatch("keybinding-nav-range", e, "down", false, true);
-       },
-       rangeExpandJumpLeft: function(e){
-               this.dispatch("keybinding-nav-range", e, "left", true, true);
-       },
-       rangeExpandJumpRight: function(e){
-               this.dispatch("keybinding-nav-range", e, "right", true, true);
-       },
-       rangeExpandJumpUp: function(e){
-               this.dispatch("keybinding-nav-range", e, "up", true, true);
-       },
-       rangeExpandJumpDown: function(e){
-               this.dispatch("keybinding-nav-range", e, "down", true, true);
-       },
+var actions = {\r
+       rangeJumpLeft: function(e){\r
+               this.dispatch("keybinding-nav-range", e, "left", true, false);\r
+       },\r
+       rangeJumpRight: function(e){\r
+               this.dispatch("keybinding-nav-range", e, "right", true, false);\r
+       },\r
+       rangeJumpUp: function(e){\r
+               this.dispatch("keybinding-nav-range", e, "up", true, false);\r
+       },\r
+       rangeJumpDown: function(e){\r
+               this.dispatch("keybinding-nav-range", e, "down", true, false);\r
+       },\r
+       rangeExpandLeft: function(e){\r
+               this.dispatch("keybinding-nav-range", e, "left", false, true);\r
+       },\r
+       rangeExpandRight: function(e){\r
+               this.dispatch("keybinding-nav-range", e, "right", false, true);\r
+       },\r
+       rangeExpandUp: function(e){\r
+               this.dispatch("keybinding-nav-range", e, "up", false, true);\r
+       },\r
+       rangeExpandDown: function(e){\r
+               this.dispatch("keybinding-nav-range", e, "down", false, true);\r
+       },\r
+       rangeExpandJumpLeft: function(e){\r
+               this.dispatch("keybinding-nav-range", e, "left", true, true);\r
+       },\r
+       rangeExpandJumpRight: function(e){\r
+               this.dispatch("keybinding-nav-range", e, "right", true, true);\r
+       },\r
+       rangeExpandJumpUp: function(e){\r
+               this.dispatch("keybinding-nav-range", e, "up", true, true);\r
+       },\r
+       rangeExpandJumpDown: function(e){\r
+               this.dispatch("keybinding-nav-range", e, "down", true, true);\r
+       },\r
 };
 
-var pasteActions = {
-       range:function(data){
-               var rows = [],
-               range = this.table.modules.selectRange.activeRange,
-               singleCell = false,
-               bounds, startCell, startRow, rowWidth, dataLength;
-
-               dataLength = data.length;
-               
-               if(range){
-                       bounds = range.getBounds();
-                       startCell = bounds.start;
-                       
-                       if(bounds.start === bounds.end){
-                               singleCell = true;
-                       }
-                       
-                       if(startCell){
-                               rows = this.table.rowManager.activeRows.slice();
-                               startRow = rows.indexOf(startCell.row);
-
-                               if(singleCell){
-                                       rowWidth = data.length;
-                               }else {
-                                       rowWidth = (rows.indexOf(bounds.end.row) - startRow) + 1;
-                               }
-                               
-                               
-                               if(startRow >-1){
-                                       this.table.blockRedraw();
-                                       
-                                       rows = rows.slice(startRow, startRow + rowWidth);
-                                       
-                                       rows.forEach((row, i) => {
-                                               row.updateData(data[i % dataLength]);
-                                       });
-                                       
-                                       this.table.restoreRedraw();
-                               }
-                       }
-               }
-               
-               return rows;
-       }
+var pasteActions = {\r
+       range:function(data){\r
+               var rows = [],\r
+               range = this.table.modules.selectRange.activeRange,\r
+               singleCell = false,\r
+               bounds, startCell, startRow, rowWidth, dataLength;\r
+\r
+               dataLength = data.length;\r
+               \r
+               if(range){\r
+                       bounds = range.getBounds();\r
+                       startCell = bounds.start;\r
+                       \r
+                       if(bounds.start === bounds.end){\r
+                               singleCell = true;\r
+                       }\r
+                       \r
+                       if(startCell){\r
+                               rows = this.table.rowManager.activeRows.slice();\r
+                               startRow = rows.indexOf(startCell.row);\r
+\r
+                               if(singleCell){\r
+                                       rowWidth = data.length;\r
+                               }else {\r
+                                       rowWidth = (rows.indexOf(bounds.end.row) - startRow) + 1;\r
+                               }\r
+                               \r
+                               \r
+                               if(startRow >-1){\r
+                                       this.table.blockRedraw();\r
+                                       \r
+                                       rows = rows.slice(startRow, startRow + rowWidth);\r
+                                       \r
+                                       rows.forEach((row, i) => {\r
+                                               row.updateData(data[i % dataLength]);\r
+                                       });\r
+                                       \r
+                                       this.table.restoreRedraw();\r
+                               }\r
+                       }\r
+               }\r
+               \r
+               return rows;\r
+       }\r
 };
 
-var pasteParsers = {
-       range:function(clipboard){
-               var data = [],
-               rows = [],
-               range = this.table.modules.selectRange.activeRange,
-               singleCell = false,
-               bounds, startCell, colWidth, columnMap, startCol;
-               
-               if(range){
-                       bounds = range.getBounds();
-                       startCell = bounds.start;
-
-                       if(bounds.start === bounds.end){
-                               singleCell = true;
-                       }
-                       
-                       if(startCell){
-                               //get data from clipboard into array of columns and rows.
-                               clipboard = clipboard.split("\n");
-                               
-                               clipboard.forEach(function(row){
-                                       data.push(row.split("\t"));
-                               });
-                               
-                               if(data.length){
-                                       columnMap = this.table.columnManager.getVisibleColumnsByIndex();
-                                       startCol = columnMap.indexOf(startCell.column);
-
-                                       if(startCol > -1){
-                                               if(singleCell){
-                                                       colWidth = data[0].length;
-                                               }else {
-                                                       colWidth = (columnMap.indexOf(bounds.end.column) - startCol) + 1;
-                                               }
-
-                                               columnMap = columnMap.slice(startCol, startCol + colWidth);
-
-                                               data.forEach((item) => {
-                                                       var row = {};
-                                                       var itemLength = item.length;
-
-                                                       columnMap.forEach(function(col, i){
-                                                               row[col.field] = item[i % itemLength];
-                                                       });
-                                                       
-                                                       rows.push(row); 
-                                               });
-
-                                               return rows;
-                                       }                               
-                               }
-                       }
-               }
-               
-               return false;
-       }
+var pasteParsers = {\r
+       range:function(clipboard){\r
+               var data = [],\r
+               rows = [],\r
+               range = this.table.modules.selectRange.activeRange,\r
+               singleCell = false,\r
+               bounds, startCell, colWidth, columnMap, startCol;\r
+               \r
+               if(range){\r
+                       bounds = range.getBounds();\r
+                       startCell = bounds.start;\r
+\r
+                       if(bounds.start === bounds.end){\r
+                               singleCell = true;\r
+                       }\r
+                       \r
+                       if(startCell){\r
+                               //get data from clipboard into array of columns and rows.\r
+                               clipboard = clipboard.split("\n");\r
+                               \r
+                               clipboard.forEach(function(row){\r
+                                       data.push(row.split("\t"));\r
+                               });\r
+                               \r
+                               if(data.length){\r
+                                       columnMap = this.table.columnManager.getVisibleColumnsByIndex();\r
+                                       startCol = columnMap.indexOf(startCell.column);\r
+\r
+                                       if(startCol > -1){\r
+                                               if(singleCell){\r
+                                                       colWidth = data[0].length;\r
+                                               }else {\r
+                                                       colWidth = (columnMap.indexOf(bounds.end.column) - startCol) + 1;\r
+                                               }\r
+\r
+                                               columnMap = columnMap.slice(startCol, startCol + colWidth);\r
+\r
+                                               data.forEach((item) => {\r
+                                                       var row = {};\r
+                                                       var itemLength = item.length;\r
+\r
+                                                       columnMap.forEach(function(col, i){\r
+                                                               row[col.field] = item[i % itemLength];\r
+                                                       });\r
+                                                       \r
+                                                       rows.push(row); \r
+                                               });\r
+\r
+                                               return rows;\r
+                                       }                               \r
+                               }\r
+                       }\r
+               }\r
+               \r
+               return false;\r
+       }\r
 };
 
-var columnLookups = {
-       range:function(){
-               var columns = this.modules.selectRange.selectedColumns();
-
-               if(this.columnManager.rowHeader){
-                       columns.unshift(this.columnManager.rowHeader);
-               }
-
-               return columns;
-       },
+var columnLookups = {\r
+       range:function(){\r
+               var columns = this.modules.selectRange.selectedColumns();\r
+\r
+               if(this.columnManager.rowHeader){\r
+                       columns.unshift(this.columnManager.rowHeader);\r
+               }\r
+\r
+               return columns;\r
+       },\r
 };
 
-var rowLookups = {
-       range:function(){
-               return this.modules.selectRange.selectedRows();
-       },
+var rowLookups = {\r
+       range:function(){\r
+               return this.modules.selectRange.selectedRows();\r
+       },\r
 };
 
-var extensions = {
-       keybindings:{
-               bindings:bindings,
-               actions:actions
-       },
-       clipboard:{
-               pasteActions:pasteActions,
-               pasteParsers:pasteParsers
-       },
-       export:{
-               columnLookups:columnLookups,
-               rowLookups:rowLookups,
-       }
+var extensions = {\r
+       keybindings:{\r
+               bindings:bindings,\r
+               actions:actions\r
+       },\r
+       clipboard:{\r
+               pasteActions:pasteActions,\r
+               pasteParsers:pasteParsers\r
+       },\r
+       export:{\r
+               columnLookups:columnLookups,\r
+               rowLookups:rowLookups,\r
+       }\r
 };
 
 class SelectRange extends Module {
@@ -21578,675 +21578,675 @@ class Sort extends Module{
        }
 }
 
-class GridCalculator{
-       constructor(columns, rows){
-               this.columnCount = columns;
-               this.rowCount = rows;
-
-               this.columnString = [];
-               this.columns = [];
-               this.rows = [];
-       }
-
-       genColumns(data){
-               var colCount = Math.max(this.columnCount, Math.max(...data.map(item => item.length)));
-
-               this.columnString = [];
-               this.columns = [];
-
-               for(let i = 1; i <= colCount; i++){
-                       this.incrementChar(this.columnString.length - 1);
-                       this.columns.push(this.columnString.join(""));
-               }
-
-               return this.columns;
-       }
-
-       genRows(data){
-               var rowCount = Math.max(this.rowCount, data.length);
-
-               this.rows = [];
-
-               for(let i = 1; i <= rowCount; i++){
-                       this.rows.push(i);
-               }
-               
-               return this.rows;
-       }
-
-       incrementChar(i){
-               let char = this.columnString[i];
-
-               if(char){
-                       if(char !== "Z"){
-                               this.columnString[i] = String.fromCharCode(this.columnString[i].charCodeAt(0) + 1);
-                       }else {
-                               this.columnString[i] = "A";
-                               
-                               if(i){
-                                       this.incrementChar(i-1);
-                               }else {
-                                       this.columnString.push("A");
-                               }
-                       }
-               }else {
-                       this.columnString.push("A");
-               }
-       }
-
-       setRowCount(count){
-               this.rowCount = count;
-       }
-
-       setColumnCount(count){
-               this.columnCount = count;
-       }
+class GridCalculator{\r
+       constructor(columns, rows){\r
+               this.columnCount = columns;\r
+               this.rowCount = rows;\r
+\r
+               this.columnString = [];\r
+               this.columns = [];\r
+               this.rows = [];\r
+       }\r
+\r
+       genColumns(data){\r
+               var colCount = Math.max(this.columnCount, Math.max(...data.map(item => item.length)));\r
+\r
+               this.columnString = [];\r
+               this.columns = [];\r
+\r
+               for(let i = 1; i <= colCount; i++){\r
+                       this.incrementChar(this.columnString.length - 1);\r
+                       this.columns.push(this.columnString.join(""));\r
+               }\r
+\r
+               return this.columns;\r
+       }\r
+\r
+       genRows(data){\r
+               var rowCount = Math.max(this.rowCount, data.length);\r
+\r
+               this.rows = [];\r
+\r
+               for(let i = 1; i <= rowCount; i++){\r
+                       this.rows.push(i);\r
+               }\r
+               \r
+               return this.rows;\r
+       }\r
+\r
+       incrementChar(i){\r
+               let char = this.columnString[i];\r
+\r
+               if(char){\r
+                       if(char !== "Z"){\r
+                               this.columnString[i] = String.fromCharCode(this.columnString[i].charCodeAt(0) + 1);\r
+                       }else {\r
+                               this.columnString[i] = "A";\r
+                               \r
+                               if(i){\r
+                                       this.incrementChar(i-1);\r
+                               }else {\r
+                                       this.columnString.push("A");\r
+                               }\r
+                       }\r
+               }else {\r
+                       this.columnString.push("A");\r
+               }\r
+       }\r
+\r
+       setRowCount(count){\r
+               this.rowCount = count;\r
+       }\r
+\r
+       setColumnCount(count){\r
+               this.columnCount = count;\r
+       }\r
 }
 
-class SheetComponent {
-       constructor(sheet) {
-               this._sheet = sheet;
-
-               return new Proxy(this, {
-                       get: function (target, name, receiver) {
-                               if (typeof target[name] !== "undefined") {
-                                       return target[name];
-                               } else {
-                                       return target._sheet.table.componentFunctionBinder.handle("sheet", target._sheet, name);
-                               }
-                       },
-               });
-       }
-
-       getTitle(){
-               return this._sheet.title;
-       }
-
-       getKey(){
-               return this._sheet.key;
-       }
-
-       getDefinition(){
-               return this._sheet.getDefinition();
-       }
-
-       getData() {
-               return this._sheet.getData();
-       }
-
-       setData(data) {
-               return this._sheet.setData(data);
-       }
-
-       clear(){
-               return this._sheet.clear();
-       }
-
-       remove(){
-               return this._sheet.remove();
-       }
-       
-       active(){
-               return this._sheet.active();
-       }
-
-       setTitle(title){
-               return this._sheet.setTitle(title);
-       }
-
-       setRows(rows){
-               return this._sheet.setRows(rows);
-       }
-
-       setColumns(columns){
-               return this._sheet.setColumns(columns);
-       }
+class SheetComponent {\r
+       constructor(sheet) {\r
+               this._sheet = sheet;\r
+\r
+               return new Proxy(this, {\r
+                       get: function (target, name, receiver) {\r
+                               if (typeof target[name] !== "undefined") {\r
+                                       return target[name];\r
+                               } else {\r
+                                       return target._sheet.table.componentFunctionBinder.handle("sheet", target._sheet, name);\r
+                               }\r
+                       },\r
+               });\r
+       }\r
+\r
+       getTitle(){\r
+               return this._sheet.title;\r
+       }\r
+\r
+       getKey(){\r
+               return this._sheet.key;\r
+       }\r
+\r
+       getDefinition(){\r
+               return this._sheet.getDefinition();\r
+       }\r
+\r
+       getData() {\r
+               return this._sheet.getData();\r
+       }\r
+\r
+       setData(data) {\r
+               return this._sheet.setData(data);\r
+       }\r
+\r
+       clear(){\r
+               return this._sheet.clear();\r
+       }\r
+\r
+       remove(){\r
+               return this._sheet.remove();\r
+       }\r
+       \r
+       active(){\r
+               return this._sheet.active();\r
+       }\r
+\r
+       setTitle(title){\r
+               return this._sheet.setTitle(title);\r
+       }\r
+\r
+       setRows(rows){\r
+               return this._sheet.setRows(rows);\r
+       }\r
+\r
+       setColumns(columns){\r
+               return this._sheet.setColumns(columns);\r
+       }\r
 }
 
-class Sheet extends CoreFeature{
-       constructor(spreadsheetManager, definition) {
-               super(spreadsheetManager.table);
-               
-               this.spreadsheetManager = spreadsheetManager;
-               this.definition = definition;
-               
-               this.title = this.definition.title || "";
-               this.key = this.definition.key || this.definition.title;
-               this.rowCount = this.definition.rows;
-               this.columnCount = this.definition.columns;
-               this.data = this.definition.data || [];
-               this.element = null;
-               this.isActive = false;
-               
-               this.grid = new GridCalculator(this.columnCount, this.rowCount);
-               
-               this.defaultColumnDefinition = {width:100, headerHozAlign:"center", headerSort:false};
-               this.columnDefinition = Object.assign(this.defaultColumnDefinition, this.options("spreadsheetColumnDefinition"));
-               
-               this.columnDefs = [];
-               this.rowDefs = [];
-               this.columnFields = [];
-               this.columns = [];
-               this.rows = [];
-               
-               this.scrollTop = null;
-               this.scrollLeft = null;
-               
-               this.initialize();
-               
-               this.dispatchExternal("sheetAdded", this.getComponent());
-       }
-       
-       ///////////////////////////////////
-       ///////// Initialization //////////
-       ///////////////////////////////////
-       
-       initialize(){
-               this.initializeElement();
-               this.initializeColumns();
-               this.initializeRows();
-       }
-       
-       reinitialize(){
-               this.initializeColumns();
-               this.initializeRows();
-       }
-       
-       initializeElement(){
-               this.element = document.createElement("div");
-               this.element.classList.add("tabulator-spreadsheet-tab");
-               this.element.innerText = this.title;
-               
-               this.element.addEventListener("click", () => {
-                       this.spreadsheetManager.loadSheet(this);
-               });
-       }
-       
-       initializeColumns(){
-               this.grid.setColumnCount(this.columnCount);
-               this.columnFields = this.grid.genColumns(this.data);
-               
-               this.columnDefs = [];
-               
-               this.columnFields.forEach((ref) => {
-                       var def = Object.assign({}, this.columnDefinition);
-                       def.field = ref;
-                       def.title = ref;
-                       
-                       this.columnDefs.push(def);
-               });
-       }
-       
-       initializeRows(){
-               var refs;
-               
-               this.grid.setRowCount(this.rowCount);
-               
-               refs = this.grid.genRows(this.data);
-               
-               this.rowDefs = [];
-               
-               refs.forEach((ref, i) => {
-                       var def = {"_id":ref};
-                       var data = this.data[i];
-                       
-                       if(data){
-                               data.forEach((val, j) => {
-                                       var field = this.columnFields[j];
-                                       
-                                       if(field){
-                                               def[field] = val;
-                                       }
-                               });
-                       }
-                       
-                       this.rowDefs.push(def);
-               });
-       }
-       
-       unload(){
-               this.isActive = false;
-               this.scrollTop = this.table.rowManager.scrollTop;
-               this.scrollLeft = this.table.rowManager.scrollLeft;
-               this.data = this.getData(true);
-               this.element.classList.remove("tabulator-spreadsheet-tab-active");
-       }
-       
-       load(){
-               
-               var wasInactive = !this.isActive;
-               
-               this.isActive = true;
-               this.table.blockRedraw();
-               this.table.setData([]);
-               this.table.setColumns(this.columnDefs);
-               this.table.setData(this.rowDefs);
-               this.table.restoreRedraw();
-               
-               if(wasInactive && this.scrollTop !== null){
-                       this.table.rowManager.element.scrollLeft = this.scrollLeft;
-                       this.table.rowManager.element.scrollTop = this.scrollTop;
-               }
-               
-               this.element.classList.add("tabulator-spreadsheet-tab-active");
-               
-               this.dispatchExternal("sheetLoaded", this.getComponent());
-       }
-       
-       ///////////////////////////////////
-       //////// Helper Functions /////////
-       ///////////////////////////////////
-       
-       getComponent(){
-               return new SheetComponent(this);
-       }
-       
-       getDefinition(){
-               return {
-                       title:this.title,
-                       key:this.key,
-                       rows:this.rowCount,
-                       columns:this.columnCount,
-                       data:this.getData(),
-               };
-       }
-       
-       getData(full){
-               var output = [], 
-               rowWidths,
-               outputWidth, outputHeight;
-               
-               //map data to array format
-               this.rowDefs.forEach((rowData) => {
-                       var row = [];
-                       
-                       this.columnFields.forEach((field) => {
-                               row.push(rowData[field]);
-                       });
-                       
-                       output.push(row);
-               });
-               
-               //trim output
-               if(!full && !this.options("spreadsheetOutputFull")){
-                       
-                       //calculate used area of data
-                       rowWidths = output.map(row => row.findLastIndex(val => typeof val !== 'undefined') + 1);
-                       outputWidth = Math.max(...rowWidths);
-                       outputHeight = rowWidths.findLastIndex(width => width > 0) + 1;
-                       
-                       output = output.slice(0, outputHeight);
-                       output = output.map(row => row.slice(0, outputWidth));
-               }
-               
-               return output;
-       }
-       
-       setData(data){
-               this.data = data;
-               this.reinitialize();
-               
-               this.dispatchExternal("sheetUpdated", this.getComponent());
-               
-               if(this.isActive){
-                       this.load();
-               }
-       }
-       
-       clear(){
-               this.setData([]);
-       }
-       
-       setTitle(title){
-               this.title = title;
-               this.element.innerText = title;
-               
-               this.dispatchExternal("sheetUpdated", this.getComponent());
-       }
-       
-       setRows(rows){
-               this.rowCount = rows;
-               this.initializeRows();
-               
-               this.dispatchExternal("sheetUpdated", this.getComponent());
-               
-               if(this.isActive){
-                       this.load();
-               }
-       }
-       
-       setColumns(columns){
-               this.columnCount = columns;
-               this.reinitialize();
-               
-               this.dispatchExternal("sheetUpdated", this.getComponent());
-               
-               if(this.isActive){
-                       this.load();
-               }
-       }
-       
-       remove(){
-               this.spreadsheetManager.removeSheet(this);
-       }
-       
-       destroy(){
-               if(this.element.parentNode){
-                       this.element.parentNode.removeChild(this.element);
-               }
-               
-               this.dispatchExternal("sheetRemoved", this.getComponent());
-       }
-       
-       active(){
-               this.spreadsheetManager.loadSheet(this);
-       }
+class Sheet extends CoreFeature{\r
+       constructor(spreadsheetManager, definition) {\r
+               super(spreadsheetManager.table);\r
+               \r
+               this.spreadsheetManager = spreadsheetManager;\r
+               this.definition = definition;\r
+               \r
+               this.title = this.definition.title || "";\r
+               this.key = this.definition.key || this.definition.title;\r
+               this.rowCount = this.definition.rows;\r
+               this.columnCount = this.definition.columns;\r
+               this.data = this.definition.data || [];\r
+               this.element = null;\r
+               this.isActive = false;\r
+               \r
+               this.grid = new GridCalculator(this.columnCount, this.rowCount);\r
+               \r
+               this.defaultColumnDefinition = {width:100, headerHozAlign:"center", headerSort:false};\r
+               this.columnDefinition = Object.assign(this.defaultColumnDefinition, this.options("spreadsheetColumnDefinition"));\r
+               \r
+               this.columnDefs = [];\r
+               this.rowDefs = [];\r
+               this.columnFields = [];\r
+               this.columns = [];\r
+               this.rows = [];\r
+               \r
+               this.scrollTop = null;\r
+               this.scrollLeft = null;\r
+               \r
+               this.initialize();\r
+               \r
+               this.dispatchExternal("sheetAdded", this.getComponent());\r
+       }\r
+       \r
+       ///////////////////////////////////\r
+       ///////// Initialization //////////\r
+       ///////////////////////////////////\r
+       \r
+       initialize(){\r
+               this.initializeElement();\r
+               this.initializeColumns();\r
+               this.initializeRows();\r
+       }\r
+       \r
+       reinitialize(){\r
+               this.initializeColumns();\r
+               this.initializeRows();\r
+       }\r
+       \r
+       initializeElement(){\r
+               this.element = document.createElement("div");\r
+               this.element.classList.add("tabulator-spreadsheet-tab");\r
+               this.element.innerText = this.title;\r
+               \r
+               this.element.addEventListener("click", () => {\r
+                       this.spreadsheetManager.loadSheet(this);\r
+               });\r
+       }\r
+       \r
+       initializeColumns(){\r
+               this.grid.setColumnCount(this.columnCount);\r
+               this.columnFields = this.grid.genColumns(this.data);\r
+               \r
+               this.columnDefs = [];\r
+               \r
+               this.columnFields.forEach((ref) => {\r
+                       var def = Object.assign({}, this.columnDefinition);\r
+                       def.field = ref;\r
+                       def.title = ref;\r
+                       \r
+                       this.columnDefs.push(def);\r
+               });\r
+       }\r
+       \r
+       initializeRows(){\r
+               var refs;\r
+               \r
+               this.grid.setRowCount(this.rowCount);\r
+               \r
+               refs = this.grid.genRows(this.data);\r
+               \r
+               this.rowDefs = [];\r
+               \r
+               refs.forEach((ref, i) => {\r
+                       var def = {"_id":ref};\r
+                       var data = this.data[i];\r
+                       \r
+                       if(data){\r
+                               data.forEach((val, j) => {\r
+                                       var field = this.columnFields[j];\r
+                                       \r
+                                       if(field){\r
+                                               def[field] = val;\r
+                                       }\r
+                               });\r
+                       }\r
+                       \r
+                       this.rowDefs.push(def);\r
+               });\r
+       }\r
+       \r
+       unload(){\r
+               this.isActive = false;\r
+               this.scrollTop = this.table.rowManager.scrollTop;\r
+               this.scrollLeft = this.table.rowManager.scrollLeft;\r
+               this.data = this.getData(true);\r
+               this.element.classList.remove("tabulator-spreadsheet-tab-active");\r
+       }\r
+       \r
+       load(){\r
+               \r
+               var wasInactive = !this.isActive;\r
+               \r
+               this.isActive = true;\r
+               this.table.blockRedraw();\r
+               this.table.setData([]);\r
+               this.table.setColumns(this.columnDefs);\r
+               this.table.setData(this.rowDefs);\r
+               this.table.restoreRedraw();\r
+               \r
+               if(wasInactive && this.scrollTop !== null){\r
+                       this.table.rowManager.element.scrollLeft = this.scrollLeft;\r
+                       this.table.rowManager.element.scrollTop = this.scrollTop;\r
+               }\r
+               \r
+               this.element.classList.add("tabulator-spreadsheet-tab-active");\r
+               \r
+               this.dispatchExternal("sheetLoaded", this.getComponent());\r
+       }\r
+       \r
+       ///////////////////////////////////\r
+       //////// Helper Functions /////////\r
+       ///////////////////////////////////\r
+       \r
+       getComponent(){\r
+               return new SheetComponent(this);\r
+       }\r
+       \r
+       getDefinition(){\r
+               return {\r
+                       title:this.title,\r
+                       key:this.key,\r
+                       rows:this.rowCount,\r
+                       columns:this.columnCount,\r
+                       data:this.getData(),\r
+               };\r
+       }\r
+       \r
+       getData(full){\r
+               var output = [], \r
+               rowWidths,\r
+               outputWidth, outputHeight;\r
+               \r
+               //map data to array format\r
+               this.rowDefs.forEach((rowData) => {\r
+                       var row = [];\r
+                       \r
+                       this.columnFields.forEach((field) => {\r
+                               row.push(rowData[field]);\r
+                       });\r
+                       \r
+                       output.push(row);\r
+               });\r
+               \r
+               //trim output\r
+               if(!full && !this.options("spreadsheetOutputFull")){\r
+                       \r
+                       //calculate used area of data\r
+                       rowWidths = output.map(row => row.findLastIndex(val => typeof val !== 'undefined') + 1);\r
+                       outputWidth = Math.max(...rowWidths);\r
+                       outputHeight = rowWidths.findLastIndex(width => width > 0) + 1;\r
+                       \r
+                       output = output.slice(0, outputHeight);\r
+                       output = output.map(row => row.slice(0, outputWidth));\r
+               }\r
+               \r
+               return output;\r
+       }\r
+       \r
+       setData(data){\r
+               this.data = data;\r
+               this.reinitialize();\r
+               \r
+               this.dispatchExternal("sheetUpdated", this.getComponent());\r
+               \r
+               if(this.isActive){\r
+                       this.load();\r
+               }\r
+       }\r
+       \r
+       clear(){\r
+               this.setData([]);\r
+       }\r
+       \r
+       setTitle(title){\r
+               this.title = title;\r
+               this.element.innerText = title;\r
+               \r
+               this.dispatchExternal("sheetUpdated", this.getComponent());\r
+       }\r
+       \r
+       setRows(rows){\r
+               this.rowCount = rows;\r
+               this.initializeRows();\r
+               \r
+               this.dispatchExternal("sheetUpdated", this.getComponent());\r
+               \r
+               if(this.isActive){\r
+                       this.load();\r
+               }\r
+       }\r
+       \r
+       setColumns(columns){\r
+               this.columnCount = columns;\r
+               this.reinitialize();\r
+               \r
+               this.dispatchExternal("sheetUpdated", this.getComponent());\r
+               \r
+               if(this.isActive){\r
+                       this.load();\r
+               }\r
+       }\r
+       \r
+       remove(){\r
+               this.spreadsheetManager.removeSheet(this);\r
+       }\r
+       \r
+       destroy(){\r
+               if(this.element.parentNode){\r
+                       this.element.parentNode.removeChild(this.element);\r
+               }\r
+               \r
+               this.dispatchExternal("sheetRemoved", this.getComponent());\r
+       }\r
+       \r
+       active(){\r
+               this.spreadsheetManager.loadSheet(this);\r
+       }\r
 }
 
-class Spreadsheet extends Module{
-       
-       static moduleName = "spreadsheet";
-       
-       constructor(table){
-               super(table);
-               
-               this.sheets = [];
-               this.element = null;
-               
-               this.registerTableOption("spreadsheet", false); 
-               this.registerTableOption("spreadsheetRows", 50); 
-               this.registerTableOption("spreadsheetColumns", 50); 
-               this.registerTableOption("spreadsheetColumnDefinition", {}); 
-               this.registerTableOption("spreadsheetOutputFull", false); 
-               this.registerTableOption("spreadsheetData", false); 
-               this.registerTableOption("spreadsheetSheets", false); 
-               this.registerTableOption("spreadsheetSheetTabs", false); 
-               this.registerTableOption("spreadsheetSheetTabsElement", false); 
-               
-               this.registerTableFunction("setSheets", this.setSheets.bind(this));
-               this.registerTableFunction("addSheet", this.addSheet.bind(this));
-               this.registerTableFunction("getSheets", this.getSheets.bind(this));
-               this.registerTableFunction("getSheetDefinitions", this.getSheetDefinitions.bind(this));
-               this.registerTableFunction("setSheetData", this.setSheetData.bind(this));
-               this.registerTableFunction("getSheet", this.getSheet.bind(this));
-               this.registerTableFunction("getSheetData", this.getSheetData.bind(this));
-               this.registerTableFunction("clearSheet", this.clearSheet.bind(this));
-               this.registerTableFunction("removeSheet", this.removeSheetFunc.bind(this));
-               this.registerTableFunction("activeSheet", this.activeSheetFunc.bind(this));
-       }
-       
-       ///////////////////////////////////
-       ////// Module Initialization //////
-       ///////////////////////////////////
-       
-       
-       initialize(){
-               if(this.options("spreadsheet")){        
-                       this.subscribe("table-initialized", this.tableInitialized.bind(this));
-                       this.subscribe("data-loaded", this.loadRemoteData.bind(this));
-                       
-                       this.table.options.index = "_id";
-                       
-                       if(this.options("spreadsheetData") && this.options("spreadsheetSheets")){
-                               console.warn("You cannot use spreadsheetData and spreadsheetSheets at the same time, ignoring spreadsheetData");
-                               
-                               this.table.options.spreadsheetData = false;
-                       }
-                       
-                       this.compatibilityCheck();
-                       
-                       if(this.options("spreadsheetSheetTabs")){
-                               this.initializeTabset();
-                       }
-               }
-       }
-       
-       compatibilityCheck(){
-               if(this.options("data")){
-                       console.warn("Do not use the data option when working with spreadsheets, use either spreadsheetData or spreadsheetSheets to pass data into the table");
-               }
-               
-               if(this.options("pagination")){
-                       console.warn("The spreadsheet module is not compatible with the pagination module");
-               }
-               
-               if(this.options("groupBy")){
-                       console.warn("The spreadsheet module is not compatible with the row grouping module");
-               }
-               
-               if(this.options("responsiveCollapse")){
-                       console.warn("The spreadsheet module is not compatible with the responsive collapse module");
-               }
-       }
-       initializeTabset(){
-               this.element = document.createElement("div");
-               this.element.classList.add("tabulator-spreadsheet-tabs");
-               var altContainer = this.options("spreadsheetSheetTabsElement");
-               
-               if(altContainer && !(altContainer instanceof HTMLElement)){
-                       altContainer = document.querySelector(altContainer);
-                       
-                       if(!altContainer){
-                               console.warn("Unable to find element matching spreadsheetSheetTabsElement selector:", this.options("spreadsheetSheetTabsElement"));
-                       }
-               }
-               
-               if(altContainer){
-                       altContainer.appendChild(this.element);
-               }else {
-                       this.footerAppend(this.element);
-               }
-       }
-       
-       tableInitialized(){
-               if(this.sheets.length){
-                       this.loadSheet(this.sheets[0]);
-               }else {
-                       
-                       if(this.options("spreadsheetSheets")){
-                               this.loadSheets(this.options("spreadsheetSheets"));
-                       }else if(this.options("spreadsheetData")){
-                               this.loadData(this.options("spreadsheetData"));
-                       }
-               }
-       }
-
-       ///////////////////////////////////
-       /////////// Ajax Parsing //////////
-       ///////////////////////////////////
-
-       loadRemoteData(data, data1, data2){
-               console.log("data", data, data1, data2);
-
-               if(Array.isArray(data)){
-
-                       this.table.dataLoader.clearAlert();
-                       this.dispatchExternal("dataLoaded", data);
-
-                       if(!data.length || Array.isArray(data[0])){
-                               this.loadData(data);
-                       }else {
-                               this.loadSheets(data);
-                       }
-               }else {
-                       console.error("Spreadsheet Loading Error - Unable to process remote data due to invalid data type \nExpecting: array \nReceived: ", typeof data, "\nData:     ", data);
-               }
-
-               return false;
-       }
-
-       ///////////////////////////////////
-       ///////// Sheet Management ////////
-       ///////////////////////////////////
-       
-       
-       loadData(data){
-               var def = {
-                       data:data,
-               };
-               
-               this.loadSheet(this.newSheet(def));
-       }
-       
-       destroySheets(){
-               this.sheets.forEach((sheet) => {
-                       sheet.destroy();
-               });
-               
-               this.sheets = [];
-               this.activeSheet = null;
-       }
-       
-       loadSheets(sheets){     
-               if(!Array.isArray(sheets)){
-                       sheets = [];
-               }
-               
-               this.destroySheets();
-               
-               sheets.forEach((def) => {
-                       this.newSheet(def);
-               });
-               
-               this.loadSheet(this.sheets[0]);
-       }
-       
-       loadSheet(sheet){
-               if(this.activeSheet !== sheet){
-                       if(this.activeSheet){
-                               this.activeSheet.unload();
-                       }
-                       
-                       this.activeSheet = sheet;
-                       
-                       sheet.load();
-               }
-       }
-       
-       newSheet(definition = {}){
-               var sheet;
-               
-               if(!definition.rows){
-                       definition.rows = this.options("spreadsheetRows");
-               }
-               
-               if(!definition.columns){
-                       definition.columns = this.options("spreadsheetColumns");
-               }
-               
-               sheet = new Sheet(this, definition);
-               
-               this.sheets.push(sheet);
-               
-               if(this.element){
-                       this.element.appendChild(sheet.element);
-               }
-               
-               return sheet;
-       }
-       
-       removeSheet(sheet){
-               var index = this.sheets.indexOf(sheet),
-               prevSheet;
-               
-               if(this.sheets.length > 1){
-                       if(index > -1){
-                               this.sheets.splice(index, 1);
-                               sheet.destroy();
-                               
-                               if(this.activeSheet === sheet){
-                                       
-                                       prevSheet = this.sheets[index - 1] || this.sheets[0];
-                                       
-                                       if(prevSheet){
-                                               this.loadSheet(prevSheet);
-                                       }else {
-                                               this.activeSheet = null;
-                                       }
-                               }
-                       }
-               }else {
-                       console.warn("Unable to remove sheet, at least one sheet must be active");
-               }
-       }
-       
-       lookupSheet(key){
-               if(!key){
-                       return this.activeSheet;
-               }else if(key instanceof Sheet){
-                       return key;
-               }else if(key instanceof SheetComponent){
-                       return key._sheet;
-               }else {
-                       return this.sheets.find(sheet => sheet.key === key) || false;
-               }
-       }
-       
-       
-       ///////////////////////////////////
-       //////// Public Functions /////////
-       ///////////////////////////////////
-       
-       setSheets(sheets){
-               this.loadSheets(sheets);
-
-               return this.getSheets();
-       }
-
-       addSheet(sheet){
-               return this.newSheet(sheet).getComponent();
-       }
-       
-       getSheetDefinitions(){
-               return this.sheets.map(sheet => sheet.getDefinition());
-       }
-       
-       getSheets(){
-               return this.sheets.map(sheet => sheet.getComponent());
-       }
-       
-       getSheet(key){
-               var sheet = this.lookupSheet(key);
-               
-               return sheet ? sheet.getComponent() : false;
-       }
-       
-       setSheetData(key, data){
-               if (key && !data){
-                       data = key;
-                       key = false;
-               }
-               
-               var sheet = this.lookupSheet(key);
-               
-               return sheet ? sheet.setData(data) : false;     
-       }
-       
-       getSheetData(key){
-               var sheet = this.lookupSheet(key);
-               
-               return sheet ? sheet.getData() : false; 
-       }
-       
-       clearSheet(key){
-               var sheet = this.lookupSheet(key);
-               
-               return sheet ? sheet.clear() : false;
-       }
-       
-       removeSheetFunc(key){
-               var sheet = this.lookupSheet(key);
-               
-               if(sheet){
-                       this.removeSheet(sheet);
-               }
-       }
-       
-       activeSheetFunc(key){
-               var sheet = this.lookupSheet(key);
-               
-               return sheet ? this.loadSheet(sheet) : false;
-       }
+class Spreadsheet extends Module{\r
+       \r
+       static moduleName = "spreadsheet";\r
+       \r
+       constructor(table){\r
+               super(table);\r
+               \r
+               this.sheets = [];\r
+               this.element = null;\r
+               \r
+               this.registerTableOption("spreadsheet", false); \r
+               this.registerTableOption("spreadsheetRows", 50); \r
+               this.registerTableOption("spreadsheetColumns", 50); \r
+               this.registerTableOption("spreadsheetColumnDefinition", {}); \r
+               this.registerTableOption("spreadsheetOutputFull", false); \r
+               this.registerTableOption("spreadsheetData", false); \r
+               this.registerTableOption("spreadsheetSheets", false); \r
+               this.registerTableOption("spreadsheetSheetTabs", false); \r
+               this.registerTableOption("spreadsheetSheetTabsElement", false); \r
+               \r
+               this.registerTableFunction("setSheets", this.setSheets.bind(this));\r
+               this.registerTableFunction("addSheet", this.addSheet.bind(this));\r
+               this.registerTableFunction("getSheets", this.getSheets.bind(this));\r
+               this.registerTableFunction("getSheetDefinitions", this.getSheetDefinitions.bind(this));\r
+               this.registerTableFunction("setSheetData", this.setSheetData.bind(this));\r
+               this.registerTableFunction("getSheet", this.getSheet.bind(this));\r
+               this.registerTableFunction("getSheetData", this.getSheetData.bind(this));\r
+               this.registerTableFunction("clearSheet", this.clearSheet.bind(this));\r
+               this.registerTableFunction("removeSheet", this.removeSheetFunc.bind(this));\r
+               this.registerTableFunction("activeSheet", this.activeSheetFunc.bind(this));\r
+       }\r
+       \r
+       ///////////////////////////////////\r
+       ////// Module Initialization //////\r
+       ///////////////////////////////////\r
+       \r
+       \r
+       initialize(){\r
+               if(this.options("spreadsheet")){        \r
+                       this.subscribe("table-initialized", this.tableInitialized.bind(this));\r
+                       this.subscribe("data-loaded", this.loadRemoteData.bind(this));\r
+                       \r
+                       this.table.options.index = "_id";\r
+                       \r
+                       if(this.options("spreadsheetData") && this.options("spreadsheetSheets")){\r
+                               console.warn("You cannot use spreadsheetData and spreadsheetSheets at the same time, ignoring spreadsheetData");\r
+                               \r
+                               this.table.options.spreadsheetData = false;\r
+                       }\r
+                       \r
+                       this.compatibilityCheck();\r
+                       \r
+                       if(this.options("spreadsheetSheetTabs")){\r
+                               this.initializeTabset();\r
+                       }\r
+               }\r
+       }\r
+       \r
+       compatibilityCheck(){\r
+               if(this.options("data")){\r
+                       console.warn("Do not use the data option when working with spreadsheets, use either spreadsheetData or spreadsheetSheets to pass data into the table");\r
+               }\r
+               \r
+               if(this.options("pagination")){\r
+                       console.warn("The spreadsheet module is not compatible with the pagination module");\r
+               }\r
+               \r
+               if(this.options("groupBy")){\r
+                       console.warn("The spreadsheet module is not compatible with the row grouping module");\r
+               }\r
+               \r
+               if(this.options("responsiveCollapse")){\r
+                       console.warn("The spreadsheet module is not compatible with the responsive collapse module");\r
+               }\r
+       }\r
+       initializeTabset(){\r
+               this.element = document.createElement("div");\r
+               this.element.classList.add("tabulator-spreadsheet-tabs");\r
+               var altContainer = this.options("spreadsheetSheetTabsElement");\r
+               \r
+               if(altContainer && !(altContainer instanceof HTMLElement)){\r
+                       altContainer = document.querySelector(altContainer);\r
+                       \r
+                       if(!altContainer){\r
+                               console.warn("Unable to find element matching spreadsheetSheetTabsElement selector:", this.options("spreadsheetSheetTabsElement"));\r
+                       }\r
+               }\r
+               \r
+               if(altContainer){\r
+                       altContainer.appendChild(this.element);\r
+               }else {\r
+                       this.footerAppend(this.element);\r
+               }\r
+       }\r
+       \r
+       tableInitialized(){\r
+               if(this.sheets.length){\r
+                       this.loadSheet(this.sheets[0]);\r
+               }else {\r
+                       \r
+                       if(this.options("spreadsheetSheets")){\r
+                               this.loadSheets(this.options("spreadsheetSheets"));\r
+                       }else if(this.options("spreadsheetData")){\r
+                               this.loadData(this.options("spreadsheetData"));\r
+                       }\r
+               }\r
+       }\r
+\r
+       ///////////////////////////////////\r
+       /////////// Ajax Parsing //////////\r
+       ///////////////////////////////////\r
+\r
+       loadRemoteData(data, data1, data2){\r
+               console.log("data", data, data1, data2);\r
+\r
+               if(Array.isArray(data)){\r
+\r
+                       this.table.dataLoader.clearAlert();\r
+                       this.dispatchExternal("dataLoaded", data);\r
+\r
+                       if(!data.length || Array.isArray(data[0])){\r
+                               this.loadData(data);\r
+                       }else {\r
+                               this.loadSheets(data);\r
+                       }\r
+               }else {\r
+                       console.error("Spreadsheet Loading Error - Unable to process remote data due to invalid data type \nExpecting: array \nReceived: ", typeof data, "\nData:     ", data);\r
+               }\r
+\r
+               return false;\r
+       }\r
+\r
+       ///////////////////////////////////\r
+       ///////// Sheet Management ////////\r
+       ///////////////////////////////////\r
+       \r
+       \r
+       loadData(data){\r
+               var def = {\r
+                       data:data,\r
+               };\r
+               \r
+               this.loadSheet(this.newSheet(def));\r
+       }\r
+       \r
+       destroySheets(){\r
+               this.sheets.forEach((sheet) => {\r
+                       sheet.destroy();\r
+               });\r
+               \r
+               this.sheets = [];\r
+               this.activeSheet = null;\r
+       }\r
+       \r
+       loadSheets(sheets){     \r
+               if(!Array.isArray(sheets)){\r
+                       sheets = [];\r
+               }\r
+               \r
+               this.destroySheets();\r
+               \r
+               sheets.forEach((def) => {\r
+                       this.newSheet(def);\r
+               });\r
+               \r
+               this.loadSheet(this.sheets[0]);\r
+       }\r
+       \r
+       loadSheet(sheet){\r
+               if(this.activeSheet !== sheet){\r
+                       if(this.activeSheet){\r
+                               this.activeSheet.unload();\r
+                       }\r
+                       \r
+                       this.activeSheet = sheet;\r
+                       \r
+                       sheet.load();\r
+               }\r
+       }\r
+       \r
+       newSheet(definition = {}){\r
+               var sheet;\r
+               \r
+               if(!definition.rows){\r
+                       definition.rows = this.options("spreadsheetRows");\r
+               }\r
+               \r
+               if(!definition.columns){\r
+                       definition.columns = this.options("spreadsheetColumns");\r
+               }\r
+               \r
+               sheet = new Sheet(this, definition);\r
+               \r
+               this.sheets.push(sheet);\r
+               \r
+               if(this.element){\r
+                       this.element.appendChild(sheet.element);\r
+               }\r
+               \r
+               return sheet;\r
+       }\r
+       \r
+       removeSheet(sheet){\r
+               var index = this.sheets.indexOf(sheet),\r
+               prevSheet;\r
+               \r
+               if(this.sheets.length > 1){\r
+                       if(index > -1){\r
+                               this.sheets.splice(index, 1);\r
+                               sheet.destroy();\r
+                               \r
+                               if(this.activeSheet === sheet){\r
+                                       \r
+                                       prevSheet = this.sheets[index - 1] || this.sheets[0];\r
+                                       \r
+                                       if(prevSheet){\r
+                                               this.loadSheet(prevSheet);\r
+                                       }else {\r
+                                               this.activeSheet = null;\r
+                                       }\r
+                               }\r
+                       }\r
+               }else {\r
+                       console.warn("Unable to remove sheet, at least one sheet must be active");\r
+               }\r
+       }\r
+       \r
+       lookupSheet(key){\r
+               if(!key){\r
+                       return this.activeSheet;\r
+               }else if(key instanceof Sheet){\r
+                       return key;\r
+               }else if(key instanceof SheetComponent){\r
+                       return key._sheet;\r
+               }else {\r
+                       return this.sheets.find(sheet => sheet.key === key) || false;\r
+               }\r
+       }\r
+       \r
+       \r
+       ///////////////////////////////////\r
+       //////// Public Functions /////////\r
+       ///////////////////////////////////\r
+       \r
+       setSheets(sheets){\r
+               this.loadSheets(sheets);\r
+\r
+               return this.getSheets();\r
+       }\r
+\r
+       addSheet(sheet){\r
+               return this.newSheet(sheet).getComponent();\r
+       }\r
+       \r
+       getSheetDefinitions(){\r
+               return this.sheets.map(sheet => sheet.getDefinition());\r
+       }\r
+       \r
+       getSheets(){\r
+               return this.sheets.map(sheet => sheet.getComponent());\r
+       }\r
+       \r
+       getSheet(key){\r
+               var sheet = this.lookupSheet(key);\r
+               \r
+               return sheet ? sheet.getComponent() : false;\r
+       }\r
+       \r
+       setSheetData(key, data){\r
+               if (key && !data){\r
+                       data = key;\r
+                       key = false;\r
+               }\r
+               \r
+               var sheet = this.lookupSheet(key);\r
+               \r
+               return sheet ? sheet.setData(data) : false;     \r
+       }\r
+       \r
+       getSheetData(key){\r
+               var sheet = this.lookupSheet(key);\r
+               \r
+               return sheet ? sheet.getData() : false; \r
+       }\r
+       \r
+       clearSheet(key){\r
+               var sheet = this.lookupSheet(key);\r
+               \r
+               return sheet ? sheet.clear() : false;\r
+       }\r
+       \r
+       removeSheetFunc(key){\r
+               var sheet = this.lookupSheet(key);\r
+               \r
+               if(sheet){\r
+                       this.removeSheet(sheet);\r
+               }\r
+       }\r
+       \r
+       activeSheetFunc(key){\r
+               var sheet = this.lookupSheet(key);\r
+               \r
+               return sheet ? this.loadSheet(sheet) : false;\r
+       }\r
 }
 
 class Tooltip extends Module{